From d134a9fd18a4f14feba4966b8d48360ea8cbd038 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Wed, 4 Dec 2024 17:43:00 -0500 Subject: [PATCH 01/54] Remove zk --- spartan_parallel/src/nizk/mod.rs | 9 ++-- spartan_parallel/src/r1csproof.rs | 30 ++++++------- spartan_parallel/src/sumcheck.rs | 74 +++++-------------------------- 3 files changed, 26 insertions(+), 87 deletions(-) diff --git a/spartan_parallel/src/nizk/mod.rs b/spartan_parallel/src/nizk/mod.rs index a57b1d94..50249f07 100644 --- a/spartan_parallel/src/nizk/mod.rs +++ b/spartan_parallel/src/nizk/mod.rs @@ -76,7 +76,6 @@ impl EqualityProof { _v1: &S, s1: &S, _v2: &S, - s2: &S, ) -> EqualityProof { >::append_protocol_name( transcript, @@ -86,7 +85,7 @@ impl EqualityProof { // produce a random Scalar let r = random_tape.random_scalar(b"r"); let c: S = transcript.challenge_scalar(b"c"); - let z = c * (*s1 - *s2) + r; + let z = c * *s1 + r; EqualityProof { z } } @@ -193,10 +192,8 @@ impl DotProductProof { transcript: &mut Transcript, random_tape: &mut RandomTape, x_vec: &[S], - blind_x: &S, a_vec: &[S], _y: &S, - blind_y: &S, ) -> DotProductProof { >::append_protocol_name( transcript, @@ -220,8 +217,8 @@ impl DotProductProof { .map(|i| c * x_vec[i] + d_vec[i]) .collect::>(); - let z_delta = c * *blind_x + r_delta; - let z_beta = c * *blind_y + r_beta; + let z_delta = c + r_delta; + let z_beta = c + r_beta; DotProductProof { z, z_delta, z_beta } } diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 1188c0c9..30de2542 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -6,7 +6,7 @@ use super::math::Math; use super::nizk::{EqualityProof, KnowledgeProof, ProductProof}; use super::r1csinstance::R1CSInstance; use super::random::RandomTape; -use super::sumcheck::ZKSumcheckInstanceProof; +use super::sumcheck::R1CSSumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; use crate::scalar::SpartanExtensionField; @@ -17,8 +17,8 @@ use std::cmp::min; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { - sc_proof_phase1: ZKSumcheckInstanceProof, - sc_proof_phase2: ZKSumcheckInstanceProof, + sc_proof_phase1: R1CSSumcheckInstanceProof, + sc_proof_phase2: R1CSSumcheckInstanceProof, pok_claims_phase2: (KnowledgeProof, ProductProof), proof_eq_sc_phase1: EqualityProof, proof_eq_sc_phase2: EqualityProof, @@ -41,15 +41,14 @@ impl R1CSProof { evals_Cz: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (ZKSumcheckInstanceProof, Vec, Vec, S) { + ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S, poly_D_comp: &S| -> S { *poly_A_comp * (*poly_B_comp * *poly_C_comp - *poly_D_comp) }; - let (sc_proof_phase_one, r, claims, blind_claim_postsc) = - ZKSumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( + let (sc_proof_phase_one, r, claims) = + R1CSSumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( &S::field_zero(), // claim is zero - &S::field_zero(), // blind for claim is also zero num_rounds, num_rounds_x_max, num_rounds_q_max, @@ -67,7 +66,7 @@ impl R1CSProof { random_tape, ); - (sc_proof_phase_one, r, claims, blind_claim_postsc) + (sc_proof_phase_one, r, claims) } fn prove_phase_two( @@ -85,14 +84,13 @@ impl R1CSProof { evals_z: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (ZKSumcheckInstanceProof, Vec, Vec, S) { + ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { *poly_A_comp * *poly_B_comp * *poly_C_comp }; - let (sc_proof_phase_two, r, claims, blind_claim_postsc) = - ZKSumcheckInstanceProof::::prove_cubic_disjoint_rounds( + let (sc_proof_phase_two, r, claims) = + R1CSSumcheckInstanceProof::::prove_cubic_disjoint_rounds( claim, - blind_claim, num_rounds, num_rounds_y_max, num_rounds_w, @@ -108,7 +106,7 @@ impl R1CSProof { random_tape, ); - (sc_proof_phase_two, r, claims, blind_claim_postsc) + (sc_proof_phase_two, r, claims) } fn protocol_name() -> &'static [u8] { @@ -235,7 +233,7 @@ impl R1CSProof { // Sumcheck 1: (Az * Bz - Cz) * eq(x, q, p) = 0 let timer_tmp = Timer::new("prove_sum_check"); - let (sc_proof_phase1, rx, _claims_phase1, blind_claim_postsc1) = R1CSProof::prove_phase_one( + let (sc_proof_phase1, rx, _claims_phase1) = R1CSProof::prove_phase_one( num_rounds_x + num_rounds_q + num_rounds_p, num_rounds_x, num_rounds_q, @@ -303,7 +301,6 @@ impl R1CSProof { &claim_post_phase1, &blind_expected_claim_postsc1, &claim_post_phase1, - &blind_claim_postsc1, ); // Separate the result rx into rp, rq, and rx @@ -380,7 +377,7 @@ impl R1CSProof { let mut eq_p_rp_poly = DensePolynomial::new(EqPolynomial::new(rp).evals()); // Sumcheck 2: (rA + rB + rC) * Z * eq(p) = e - let (sc_proof_phase2, ry, claims_phase2, blind_claim_postsc2) = R1CSProof::prove_phase_two( + let (sc_proof_phase2, ry, claims_phase2) = R1CSProof::prove_phase_two( num_rounds_y + num_rounds_w + num_rounds_p, num_rounds_y, num_rounds_w, @@ -553,7 +550,6 @@ impl R1CSProof { &claim_post_phase2, &blind_expected_claim_postsc2, &claim_post_phase2, - &blind_claim_postsc2, ); timer_prove.stop(); diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index 249b1abd..a3b891a9 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -71,13 +71,13 @@ impl SumcheckInstanceProof { } #[derive(Serialize, Deserialize, Debug)] -pub struct ZKSumcheckInstanceProof { +pub struct R1CSSumcheckInstanceProof { proofs: Vec>, } -impl ZKSumcheckInstanceProof { +impl R1CSSumcheckInstanceProof { pub fn new(proofs: Vec>) -> Self { - ZKSumcheckInstanceProof { proofs } + R1CSSumcheckInstanceProof { proofs } } pub fn verify( @@ -381,10 +381,9 @@ impl SumcheckInstanceProof { } } -impl ZKSumcheckInstanceProof { +impl R1CSSumcheckInstanceProof { pub fn prove_cubic_disjoint_rounds( claim: &S, - blind_claim: &S, num_rounds: usize, num_rounds_y_max: usize, num_rounds_w: usize, @@ -398,7 +397,7 @@ impl ZKSumcheckInstanceProof { comb_func: F, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (Self, Vec, Vec, S) + ) -> (Self, Vec, Vec) where F: Fn(&S, &S, &S) -> S, { @@ -408,11 +407,6 @@ impl ZKSumcheckInstanceProof { // poly_A is the EQ polynomial of size P * W * Y_max assert_eq!(num_rounds, num_rounds_y_max + num_rounds_w + num_rounds_p); - let (blinds_poly, blinds_evals) = ( - random_tape.random_vector(b"blinds_poly", num_rounds), - random_tape.random_vector(b"blinds_evals", num_rounds), - ); - let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); @@ -577,18 +571,6 @@ impl ZKSumcheckInstanceProof { // compute a weighted sum of the RHS let target = w[0] * claim_per_round + w[1] * eval; - let blind = { - let blind_sc = if j == 0 { - blind_claim - } else { - &blinds_evals[j - 1] - }; - - let blind_eval = &blinds_evals[j]; - - w[0] * *blind_sc + w[1] * *blind_eval - }; - let a = { // the vector to use to decommit for sum-check test let a_sc = { @@ -613,15 +595,7 @@ impl ZKSumcheckInstanceProof { .collect::>() }; - let proof = DotProductProof::prove( - transcript, - random_tape, - &poly.as_vec(), - &blinds_poly[j], - &a, - &target, - &blind, - ); + let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); (proof, eval) }; @@ -632,20 +606,18 @@ impl ZKSumcheckInstanceProof { } ( - ZKSumcheckInstanceProof::new(proofs), + R1CSSumcheckInstanceProof::new(proofs), r, vec![ poly_A[0], poly_B.index(0, 0, 0, 0), poly_C.index(0, 0, 0, 0), ], - blinds_evals[num_rounds - 1], ) } pub fn prove_cubic_with_additive_term_disjoint_rounds( claim: &S, - blind_claim: &S, num_rounds: usize, num_rounds_x_max: usize, num_rounds_q_max: usize, @@ -661,7 +633,7 @@ impl ZKSumcheckInstanceProof { comb_func: F, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (Self, Vec, Vec, S) + ) -> (Self, Vec, Vec) where F: Fn(&S, &S, &S, &S) -> S, { @@ -678,11 +650,6 @@ impl ZKSumcheckInstanceProof { assert_eq!(poly_C.num_witness_secs, 1); assert_eq!(poly_D.num_witness_secs, 1); - let (blinds_poly, blinds_evals) = ( - random_tape.random_vector(b"blinds_poly", num_rounds), - random_tape.random_vector(b"blinds_evals", num_rounds), - ); - let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); @@ -864,18 +831,6 @@ impl ZKSumcheckInstanceProof { // compute a weighted sum of the RHS let target = w[0] * claim_per_round + w[1] * eval; - let blind = { - let blind_sc = if j == 0 { - blind_claim - } else { - &blinds_evals[j - 1] - }; - - let blind_eval = &blinds_evals[j]; - - w[0] * *blind_sc + w[1] * *blind_eval - }; - let a = { // the vector to use to decommit for sum-check test let a_sc = { @@ -900,15 +855,7 @@ impl ZKSumcheckInstanceProof { .collect::>() }; - let proof = DotProductProof::prove( - transcript, - random_tape, - &poly.as_vec(), - &blinds_poly[j], - &a, - &target, - &blind, - ); + let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); (proof, eval) }; @@ -919,7 +866,7 @@ impl ZKSumcheckInstanceProof { } ( - ZKSumcheckInstanceProof::new(proofs), + R1CSSumcheckInstanceProof::new(proofs), r, vec![ poly_Ap[0] * poly_Aq[0] * poly_Ax[0], @@ -927,7 +874,6 @@ impl ZKSumcheckInstanceProof { poly_C.index(0, 0, 0, 0), poly_D.index(0, 0, 0, 0), ], - blinds_evals[num_rounds - 1], ) } } From d4e022b7fb08d9f9f4b705fe082e5f77bfc6a9fc Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Wed, 4 Dec 2024 17:47:52 -0500 Subject: [PATCH 02/54] Remove blinds --- spartan_parallel/src/r1csproof.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 30de2542..5cd1e650 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -78,7 +78,6 @@ impl R1CSProof { num_witness_secs: usize, num_inputs: Vec, claim: &S, - blind_claim: &S, evals_eq: &mut DensePolynomial, evals_ABC: &mut DensePolynomialPqx, evals_z: &mut DensePolynomialPqx, @@ -321,7 +320,6 @@ impl R1CSProof { let r_C: S = transcript.challenge_scalar(b"challenge_Cz"); let claim_phase2 = r_A * *Az_claim + r_B * *Bz_claim + r_C * *Cz_claim; - let blind_claim_phase2 = r_A * Az_blind + r_B * Bz_blind + r_C * Cz_blind; let timer_tmp = Timer::new("prove_abc_gen"); let evals_ABC = { @@ -386,7 +384,6 @@ impl R1CSProof { num_witness_secs, num_inputs.clone(), &claim_phase2, - &blind_claim_phase2, &mut eq_p_rp_poly, &mut ABC_poly, &mut Z_poly, From acbc979f796efb4d72a547783f77e079f7d405f5 Mon Sep 17 00:00:00 2001 From: kunxian xia Date: Thu, 5 Dec 2024 15:38:02 +0800 Subject: [PATCH 03/54] remove nizk --- spartan_parallel/src/lib.rs | 1 - spartan_parallel/src/nizk/bullet.rs | 159 ------------- spartan_parallel/src/nizk/mod.rs | 343 ---------------------------- 3 files changed, 503 deletions(-) delete mode 100644 spartan_parallel/src/nizk/bullet.rs delete mode 100644 spartan_parallel/src/nizk/mod.rs diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 67d56c6f..d1eb04d5 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -25,7 +25,6 @@ mod errors; /// R1CS instance used by libspartan pub mod instance; mod math; -mod nizk; mod product_tree; mod r1csinstance; mod r1csproof; diff --git a/spartan_parallel/src/nizk/bullet.rs b/spartan_parallel/src/nizk/bullet.rs deleted file mode 100644 index 549c924d..00000000 --- a/spartan_parallel/src/nizk/bullet.rs +++ /dev/null @@ -1,159 +0,0 @@ -//! This module is an adaptation of code from the bulletproofs crate. -//! See NOTICE.md for more details -#![allow(non_snake_case)] -#![allow(clippy::type_complexity)] -#![allow(clippy::too_many_arguments)] -use super::super::errors::ProofVerifyError; -use super::super::scalar::SpartanExtensionField; -use super::super::transcript::ProofTranscript; -use merlin::Transcript; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct BulletReductionProof { - _phantom: S, -} - -impl BulletReductionProof { - /// Create an inner-product proof. - /// - /// The proof is created with respect to the bases \\(G\\). - /// - /// The `transcript` is passed in as a parameter so that the - /// challenges depend on the *entire* transcript (including parent - /// protocols). - /// - /// The lengths of the vectors must all be the same, and must all be - /// either 0 or a power of 2. - pub fn prove( - transcript: &mut Transcript, - a_vec: &[S], - b_vec: &[S], - blind: &S, - blinds_vec: &[(S, S)], - ) -> (S, S, S) { - // Create slices G, H, a, b backed by their respective - // vectors. This lets us reslice as we compress the lengths - // of the vectors in the main loop below. - let mut a: &mut [S] = &mut a_vec.to_owned()[..]; - let mut b: &mut [S] = &mut b_vec.to_owned()[..]; - - let mut blinds_iter = blinds_vec.iter(); - let mut blind_fin: S = *blind; - - let mut n = a.len(); - assert_eq!(a.len(), n); - assert_eq!(b.len(), n); - - while n != 1 { - n /= 2; - let (a_L, a_R) = a.split_at_mut(n); - let (b_L, b_R) = b.split_at_mut(n); - - let _c_L = inner_product(a_L, b_R); - let _c_R = inner_product(a_R, b_L); - - let (blind_L, blind_R) = blinds_iter.next().unwrap(); - - let u: S = transcript.challenge_scalar(b"u"); - - let u_inv = u.invert().unwrap(); - - for i in 0..n { - a_L[i] = a_L[i] * u + u_inv * a_R[i]; - b_L[i] = b_L[i] * u_inv + u * b_R[i]; - } - - blind_fin = blind_fin + *blind_L * u * u + *blind_R * u_inv * u_inv; - - a = a_L; - b = b_L; - } - - (a[0], b[0], blind_fin) - } - - /// Computes three vectors of verification scalars \\([u\_{i}^{2}]\\), \\([u\_{i}^{-2}]\\) and \\([s\_{i}]\\) for combined multiscalar multiplication - /// in a parent protocol. See [inner product protocol notes](index.html#verification-equation) for details. - /// The verifier must provide the input length \\(n\\) explicitly to avoid unbounded allocation within the inner product proof. - fn verification_scalars( - &self, - n: usize, - transcript: &mut Transcript, - ) -> Result<(Vec, Vec, Vec), ProofVerifyError> { - let mut lg_n = 0usize; - assert!(n > 0, "n must not be 0"); - - let mut value = n; - while value > 1 { - value >>= 1; // Divide value by 2 - lg_n += 1; - } - - // 1. Recompute x_k,...,x_1 based on the proof transcript - let mut challenges = Vec::with_capacity(lg_n); - for _i in 0..lg_n { - challenges.push(transcript.challenge_scalar(b"u")); - } - - // 2. Compute 1/(u_k...u_1) and 1/u_k, ..., 1/u_1 - let mut challenges_inv = challenges.clone(); - let allinv = S::batch_invert(&mut challenges_inv); - - // 3. Compute u_i^2 and (1/u_i)^2 - for i in 0..lg_n { - challenges[i] = challenges[i].square(); - challenges_inv[i] = challenges_inv[i].square(); - } - let challenges_sq = challenges; - let challenges_inv_sq = challenges_inv; - - // 4. Compute s values inductively. - let mut s = Vec::with_capacity(n); - s.push(allinv); - for i in 1..n { - let lg_i = (32 - 1 - (i as u32).leading_zeros()) as usize; - let k = 1 << lg_i; - // The challenges are stored in "creation order" as [u_k,...,u_1], - // so u_{lg(i)+1} = is indexed by (lg_n-1) - lg_i - let u_lg_i_sq = challenges_sq[(lg_n - 1) - lg_i]; - s.push(s[i - k] * u_lg_i_sq); - } - - Ok((challenges_sq, challenges_inv_sq, s)) - } - - /// This method is for testing that proof generation work, - /// but for efficiency the actual protocols would use `verification_scalars` - /// method to combine inner product verification with other checks - /// in a single multiscalar multiplication. - pub fn verify( - &self, - n: usize, - a: &[S], - transcript: &mut Transcript, - ) -> Result { - let (_u_sq, _u_inv_sq, s) = self.verification_scalars(n, transcript)?; - - let a_hat = inner_product(a, &s); - - Ok(a_hat) - } -} - -/// Computes an inner product of two vectors -/// \\[ -/// {\langle {\mathbf{a}}, {\mathbf{b}} \rangle} = \sum\_{i=0}^{n-1} a\_i \cdot b\_i. -/// \\] -/// Panics if the lengths of \\(\mathbf{a}\\) and \\(\mathbf{b}\\) are not equal. -pub fn inner_product(a: &[S], b: &[S]) -> S { - assert!( - a.len() == b.len(), - "inner_product(a,b): lengths of vectors do not match" - ); - let mut out = S::field_zero(); - for i in 0..a.len() { - out = out + a[i] * b[i]; - } - out -} diff --git a/spartan_parallel/src/nizk/mod.rs b/spartan_parallel/src/nizk/mod.rs deleted file mode 100644 index 50249f07..00000000 --- a/spartan_parallel/src/nizk/mod.rs +++ /dev/null @@ -1,343 +0,0 @@ -#![allow(clippy::too_many_arguments)] -use crate::scalar::SpartanExtensionField; - -use super::errors::ProofVerifyError; -use super::math::Math; -use super::random::RandomTape; -use super::transcript::ProofTranscript; -use merlin::Transcript; -use serde::{Deserialize, Serialize}; -mod bullet; -use bullet::BulletReductionProof; - -#[derive(Serialize, Deserialize, Debug)] -pub struct KnowledgeProof { - z1: S, - z2: S, -} - -impl KnowledgeProof { - fn protocol_name() -> &'static [u8] { - b"knowledge proof" - } - - pub fn prove( - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x: &S, - r: &S, - ) -> KnowledgeProof { - >::append_protocol_name( - transcript, - KnowledgeProof::::protocol_name(), - ); - - // produce two random Scalars - let t1 = random_tape.random_scalar(b"t1"); - let t2 = random_tape.random_scalar(b"t2"); - - let c: S = transcript.challenge_scalar(b"c"); - - let z1 = *x * c + t1; - let z2 = *r * c + t2; - - KnowledgeProof { z1, z2 } - } - - pub fn verify(&self, transcript: &mut Transcript) -> Result<(), ProofVerifyError> { - // Transcript operations to preserve consistency for the verify function - { - >::append_protocol_name( - transcript, - KnowledgeProof::::protocol_name(), - ); - - let _c: S = transcript.challenge_scalar(b"c"); - } - - // TODO: Alternative PCS Verification - Ok(()) - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct EqualityProof { - z: S, -} - -impl EqualityProof { - fn protocol_name() -> &'static [u8] { - b"equality proof" - } - - pub fn prove( - transcript: &mut Transcript, - random_tape: &mut RandomTape, - _v1: &S, - s1: &S, - _v2: &S, - ) -> EqualityProof { - >::append_protocol_name( - transcript, - EqualityProof::::protocol_name(), - ); - - // produce a random Scalar - let r = random_tape.random_scalar(b"r"); - let c: S = transcript.challenge_scalar(b"c"); - let z = c * *s1 + r; - - EqualityProof { z } - } - - pub fn verify(&self, transcript: &mut Transcript) -> Result<(), ProofVerifyError> { - // Transcript operations to preserve consistency for the verify function - { - >::append_protocol_name( - transcript, - EqualityProof::::protocol_name(), - ); - - let _c: S = transcript.challenge_scalar(b"c"); - } - - // TODO: Alternative PCS Verification - Ok(()) - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct ProductProof { - z: [S; 5], -} - -impl ProductProof { - fn protocol_name() -> &'static [u8] { - b"product proof" - } - - pub fn prove( - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x: &S, - rX: &S, - y: &S, - rY: &S, - _z: &S, - rZ: &S, - ) -> ProductProof { - >::append_protocol_name( - transcript, - ProductProof::::protocol_name(), - ); - - // produce five random Scalar - let b1 = random_tape.random_scalar(b"b1"); - let b2 = random_tape.random_scalar(b"b2"); - let b3 = random_tape.random_scalar(b"b3"); - let b4 = random_tape.random_scalar(b"b4"); - let b5 = random_tape.random_scalar(b"b5"); - - let c: S = transcript.challenge_scalar(b"c"); - - let z1 = b1 + c * *x; - let z2 = b2 + c * *rX; - let z3 = b3 + c * *y; - let z4 = b4 + c * *rY; - let z5 = b5 + c * (*rZ - *rX * *y); - let z = [z1, z2, z3, z4, z5]; - - ProductProof { z } - } - - fn _check_equality(_c: &S, _z1: &S, _z2: &S) -> bool { - // TODO: Alternative PCS Verification - true - } - - pub fn verify(&self, transcript: &mut Transcript) -> Result<(), ProofVerifyError> { - // Transcript operations to preserve consistency for the verify function - { - >::append_protocol_name( - transcript, - ProductProof::::protocol_name(), - ); - - let _c: S = transcript.challenge_scalar(b"c"); - } - - // TODO: Alternative PCS Verification - Ok(()) - } -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct DotProductProof { - z: Vec, - z_delta: S, - z_beta: S, -} - -impl DotProductProof { - fn protocol_name() -> &'static [u8] { - b"dot product proof" - } - - pub fn compute_dotproduct(a: &[S], b: &[S]) -> S { - assert_eq!(a.len(), b.len()); - (0..a.len()).map(|i| a[i] * b[i]).sum() - } - - pub fn prove( - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x_vec: &[S], - a_vec: &[S], - _y: &S, - ) -> DotProductProof { - >::append_protocol_name( - transcript, - DotProductProof::::protocol_name(), - ); - - let n = x_vec.len(); - assert_eq!(x_vec.len(), a_vec.len()); - - // produce randomness for the proofs - let d_vec = random_tape.random_vector(b"d_vec", n); - let r_delta = random_tape.random_scalar(b"r_delta"); - let r_beta = random_tape.random_scalar(b"r_beta"); - - let _dotproduct_a_d = DotProductProof::compute_dotproduct(a_vec, &d_vec); - - S::append_field_vector_to_transcript(b"a", transcript, a_vec); - let c: S = transcript.challenge_scalar(b"c"); - - let z = (0..d_vec.len()) - .map(|i| c * x_vec[i] + d_vec[i]) - .collect::>(); - - let z_delta = c + r_delta; - let z_beta = c + r_beta; - - DotProductProof { z, z_delta, z_beta } - } - - pub fn verify(&self, transcript: &mut Transcript, a: &[S]) -> Result<(), ProofVerifyError> { - // Transcript operations to preserve consistency for the verify function - { - >::append_protocol_name( - transcript, - DotProductProof::::protocol_name(), - ); - S::append_field_vector_to_transcript(b"a", transcript, a); - let _c: S = transcript.challenge_scalar(b"c"); - } - - let _dotproduct_z_a = DotProductProof::compute_dotproduct(&self.z, a); - - // TODO: Alternative PCS Verification - Ok(()) - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DotProductProofLog { - z1: S, - z2: S, -} - -impl DotProductProofLog { - fn protocol_name() -> &'static [u8] { - b"dot product proof (log)" - } - - pub fn compute_dotproduct(a: &[S], b: &[S]) -> S { - assert_eq!(a.len(), b.len()); - (0..a.len()).map(|i| a[i] * b[i]).sum() - } - - pub fn prove( - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x_vec: &[S], - blind_x: &S, - a_vec: &[S], - _y: &S, - blind_y: &S, - ) -> DotProductProofLog { - >::append_protocol_name( - transcript, - DotProductProofLog::::protocol_name(), - ); - - let n = x_vec.len(); - assert_eq!(x_vec.len(), a_vec.len()); - - // produce randomness for generating a proof - let d = random_tape.random_scalar(b"d"); - let r_delta = random_tape.random_scalar(b"r_delta"); - let r_beta = random_tape.random_scalar(b"r_delta"); - let blinds_vec = { - let v1 = random_tape.random_vector(b"blinds_vec_1", 2 * n.log_2()); - let v2 = random_tape.random_vector(b"blinds_vec_2", 2 * n.log_2()); - (0..v1.len()) - .map(|i| (v1[i], v2[i])) - .collect::>() - }; - S::append_field_vector_to_transcript(b"a", transcript, a_vec); - - // sample a random base and scale the generator used for - // the output of the inner product - let r: S = transcript.challenge_scalar(b"r"); - - let blind_Gamma: S = *blind_x + r * *blind_y; - let (x_hat, a_hat, rhat_Gamma) = - BulletReductionProof::prove(transcript, x_vec, a_vec, &blind_Gamma, &blinds_vec); - - let y_hat = x_hat * a_hat; - - let c: S = transcript.challenge_scalar(b"c"); - - let z1 = d + c * y_hat; - let z2 = a_hat * (c * rhat_Gamma + r_beta) + r_delta; - - DotProductProofLog { z1, z2 } - } - - pub fn verify( - &self, - n: usize, - transcript: &mut Transcript, - a: &[S], - ) -> Result<(), ProofVerifyError> { - assert_eq!(a.len(), n); - - // Transcript operations to preserve consistency for the verify function - { - >::append_protocol_name( - transcript, - DotProductProofLog::::protocol_name(), - ); - - S::append_field_vector_to_transcript(b"a", transcript, a); - - // sample a random base and scale the generator used for - // the output of the inner product - let _r: S = transcript.challenge_scalar(b"r"); - - // BulletReductionProof - verification_scalars - let mut m = a.len(); - while m != 1 { - m /= 2; - - let _u: S = transcript.challenge_scalar(b"u"); - } - - let _c: S = transcript.challenge_scalar(b"c"); - } - - // TODO: Alternative PCS Verification - Ok(()) - } -} From 4b160ca9693daaf0c57acbc7d571301d7cb1203f Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 5 Dec 2024 03:11:24 -0500 Subject: [PATCH 04/54] Adapt proving methods onto SumcheckInstanceProof. Remove ZK proof struct. --- spartan_parallel/src/dense_mlpoly.rs | 6 +- spartan_parallel/src/r1csproof.rs | 16 +-- spartan_parallel/src/sumcheck.rs | 188 +++------------------------ 3 files changed, 27 insertions(+), 183 deletions(-) diff --git a/spartan_parallel/src/dense_mlpoly.rs b/spartan_parallel/src/dense_mlpoly.rs index 9ef128b2..c2253269 100644 --- a/spartan_parallel/src/dense_mlpoly.rs +++ b/spartan_parallel/src/dense_mlpoly.rs @@ -3,9 +3,9 @@ use crate::scalar::SpartanExtensionField; use super::errors::ProofVerifyError; use super::math::Math; -use super::nizk::DotProductProofLog; use super::random::RandomTape; use super::transcript::ProofTranscript; +use super::unipoly::CompressedUniPoly; use core::ops::Index; use merlin::Transcript; use serde::{Deserialize, Serialize}; @@ -309,9 +309,9 @@ impl Index for DensePolynomial { } } -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct PolyEvalProof { - proof: DotProductProofLog, + polys: Vec>, } impl PolyEvalProof { diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 5cd1e650..50bff1e0 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -3,10 +3,9 @@ use super::custom_dense_mlpoly::DensePolynomialPqx; use super::dense_mlpoly::{DensePolynomial, EqPolynomial, PolyEvalProof}; use super::errors::ProofVerifyError; use super::math::Math; -use super::nizk::{EqualityProof, KnowledgeProof, ProductProof}; use super::r1csinstance::R1CSInstance; use super::random::RandomTape; -use super::sumcheck::R1CSSumcheckInstanceProof; +use super::sumcheck::SumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; use crate::scalar::SpartanExtensionField; @@ -17,8 +16,8 @@ use std::cmp::min; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { - sc_proof_phase1: R1CSSumcheckInstanceProof, - sc_proof_phase2: R1CSSumcheckInstanceProof, + sc_proof_phase1: SumcheckInstanceProof, + sc_proof_phase2: SumcheckInstanceProof, pok_claims_phase2: (KnowledgeProof, ProductProof), proof_eq_sc_phase1: EqualityProof, proof_eq_sc_phase2: EqualityProof, @@ -41,13 +40,13 @@ impl R1CSProof { evals_Cz: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { + ) -> (SumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S, poly_D_comp: &S| -> S { *poly_A_comp * (*poly_B_comp * *poly_C_comp - *poly_D_comp) }; let (sc_proof_phase_one, r, claims) = - R1CSSumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( + SumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( &S::field_zero(), // claim is zero num_rounds, num_rounds_x_max, @@ -83,12 +82,12 @@ impl R1CSProof { evals_z: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { + ) -> (SumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { *poly_A_comp * *poly_B_comp * *poly_C_comp }; let (sc_proof_phase_two, r, claims) = - R1CSSumcheckInstanceProof::::prove_cubic_disjoint_rounds( + SumcheckInstanceProof::::prove_cubic_disjoint_rounds( claim, num_rounds, num_rounds_y_max, @@ -102,7 +101,6 @@ impl R1CSProof { evals_z, comb_func, transcript, - random_tape, ); (sc_proof_phase_two, r, claims) diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index a3b891a9..36295c27 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -6,7 +6,6 @@ use crate::scalar::SpartanExtensionField; use super::dense_mlpoly::DensePolynomial; use super::errors::ProofVerifyError; -use super::nizk::DotProductProof; use super::random::RandomTape; use super::transcript::{AppendToTranscript, ProofTranscript}; use super::unipoly::{CompressedUniPoly, UniPoly}; @@ -70,67 +69,6 @@ impl SumcheckInstanceProof { } } -#[derive(Serialize, Deserialize, Debug)] -pub struct R1CSSumcheckInstanceProof { - proofs: Vec>, -} - -impl R1CSSumcheckInstanceProof { - pub fn new(proofs: Vec>) -> Self { - R1CSSumcheckInstanceProof { proofs } - } - - pub fn verify( - &self, - num_rounds: usize, - degree_bound: usize, - transcript: &mut Transcript, - ) -> Result, ProofVerifyError> { - let mut r: Vec = Vec::new(); - - for i in 0..num_rounds { - // derive the verifier's challenge for the next round - let r_i = transcript.challenge_scalar(b"challenge_nextround"); - - // verify the proof of sum-check and evals - let _res = { - // produce two weights - let w: Vec = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![S::field_one(); degree_bound + 1]; - a[0] = a[0] + S::field_one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![S::field_one(); degree_bound + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_i; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - self.proofs[i].verify(transcript, &a).is_ok() - }; - - r.push(r_i); - } - - Ok(r) - } -} - impl SumcheckInstanceProof { pub fn prove_cubic( claim: &S, @@ -379,9 +317,7 @@ impl SumcheckInstanceProof { claims_dotp, ) } -} -impl R1CSSumcheckInstanceProof { pub fn prove_cubic_disjoint_rounds( claim: &S, num_rounds: usize, @@ -396,7 +332,6 @@ impl R1CSSumcheckInstanceProof { poly_C: &mut DensePolynomialPqx, comb_func: F, transcript: &mut Transcript, - random_tape: &mut RandomTape, ) -> (Self, Vec, Vec) where F: Fn(&S, &S, &S) -> S, @@ -410,7 +345,7 @@ impl R1CSSumcheckInstanceProof { let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); - let mut proofs: Vec> = Vec::new(); + let mut cubic_polys: Vec> = Vec::new(); let mut inputs_len = num_rounds_y_max.pow2(); let mut witness_secs_len = num_rounds_w.pow2(); @@ -540,8 +475,12 @@ impl R1CSSumcheckInstanceProof { poly }; + // append the prover's message to the transcript + poly.append_to_transcript(b"poly", transcript); + //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + r.push(r_j); // bound all tables to the verifier's challenege if mode == MODE_P { @@ -552,61 +491,12 @@ impl R1CSSumcheckInstanceProof { } poly_C.bound_poly(&r_j, mode); - // produce a proof of sum-check and of evaluation - let (proof, claim_next_round) = { - let eval = poly.evaluate(&r_j); - - // we need to prove the following under homomorphic commitments: - // (1) poly(0) + poly(1) = claim_per_round - // (2) poly(r_j) = eval - - // Our technique is to leverage dot product proofs: - // (1) we can prove: = claim_per_round - // (2) we can prove: = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - // compute a weighted sum of the RHS - let target = w[0] * claim_per_round + w[1] * eval; - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - a[0] = a[0] + S::field_one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_j; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); - - (proof, eval) - }; - - proofs.push(proof); - claim_per_round = claim_next_round; - r.push(r_j); + claim_per_round = poly.evaluate(&r_j); + cubic_polys.push(poly.compress()); } ( - R1CSSumcheckInstanceProof::new(proofs), + SumcheckInstanceProof::new(cubic_polys), r, vec![ poly_A[0], @@ -653,7 +543,7 @@ impl R1CSSumcheckInstanceProof { let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); - let mut proofs: Vec> = Vec::new(); + let mut cubic_polys: Vec> = Vec::new(); let mut cons_len = num_rounds_x_max.pow2(); let mut proof_len = num_rounds_q_max.pow2(); @@ -798,8 +688,12 @@ impl R1CSSumcheckInstanceProof { poly }; + // append the prover's message to the transcript + poly.append_to_transcript(b"poly", transcript); + //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + r.push(r_j); // bound all tables to the verifier's challenege if mode == 1 { @@ -813,60 +707,12 @@ impl R1CSSumcheckInstanceProof { poly_C.bound_poly(&r_j, mode); poly_D.bound_poly(&r_j, mode); - let (proof, claim_next_round) = { - let eval = poly.evaluate(&r_j); - - // we need to prove the following under homomorphic commitments: - // (1) poly(0) + poly(1) = claim_per_round - // (2) poly(r_j) = eval - - // Our technique is to leverage dot product proofs: - // (1) we can prove: = claim_per_round - // (2) we can prove: = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - // compute a weighted sum of the RHS - let target = w[0] * claim_per_round + w[1] * eval; - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - a[0] = a[0] + S::field_one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_j; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); - - (proof, eval) - }; - - proofs.push(proof); - claim_per_round = claim_next_round; - r.push(r_j); + claim_per_round = poly.evaluate(&r_j); + cubic_polys.push(poly.compress()); } ( - R1CSSumcheckInstanceProof::new(proofs), + SumcheckInstanceProof::new(cubic_polys), r, vec![ poly_Ap[0] * poly_Aq[0] * poly_Ax[0], @@ -876,4 +722,4 @@ impl R1CSSumcheckInstanceProof { ], ) } -} +} \ No newline at end of file From d1bfaca7d874e4693d75b2dab83d329af74a4f96 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 5 Dec 2024 18:59:47 -0500 Subject: [PATCH 05/54] Revert "Adapt proving methods onto SumcheckInstanceProof. Remove ZK proof struct." This reverts commit 4b160ca9693daaf0c57acbc7d571301d7cb1203f. --- spartan_parallel/src/dense_mlpoly.rs | 6 +- spartan_parallel/src/r1csproof.rs | 16 ++- spartan_parallel/src/sumcheck.rs | 188 ++++++++++++++++++++++++--- 3 files changed, 183 insertions(+), 27 deletions(-) diff --git a/spartan_parallel/src/dense_mlpoly.rs b/spartan_parallel/src/dense_mlpoly.rs index c2253269..9ef128b2 100644 --- a/spartan_parallel/src/dense_mlpoly.rs +++ b/spartan_parallel/src/dense_mlpoly.rs @@ -3,9 +3,9 @@ use crate::scalar::SpartanExtensionField; use super::errors::ProofVerifyError; use super::math::Math; +use super::nizk::DotProductProofLog; use super::random::RandomTape; use super::transcript::ProofTranscript; -use super::unipoly::CompressedUniPoly; use core::ops::Index; use merlin::Transcript; use serde::{Deserialize, Serialize}; @@ -309,9 +309,9 @@ impl Index for DensePolynomial { } } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct PolyEvalProof { - polys: Vec>, + proof: DotProductProofLog, } impl PolyEvalProof { diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 50bff1e0..5cd1e650 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -3,9 +3,10 @@ use super::custom_dense_mlpoly::DensePolynomialPqx; use super::dense_mlpoly::{DensePolynomial, EqPolynomial, PolyEvalProof}; use super::errors::ProofVerifyError; use super::math::Math; +use super::nizk::{EqualityProof, KnowledgeProof, ProductProof}; use super::r1csinstance::R1CSInstance; use super::random::RandomTape; -use super::sumcheck::SumcheckInstanceProof; +use super::sumcheck::R1CSSumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; use crate::scalar::SpartanExtensionField; @@ -16,8 +17,8 @@ use std::cmp::min; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { - sc_proof_phase1: SumcheckInstanceProof, - sc_proof_phase2: SumcheckInstanceProof, + sc_proof_phase1: R1CSSumcheckInstanceProof, + sc_proof_phase2: R1CSSumcheckInstanceProof, pok_claims_phase2: (KnowledgeProof, ProductProof), proof_eq_sc_phase1: EqualityProof, proof_eq_sc_phase2: EqualityProof, @@ -40,13 +41,13 @@ impl R1CSProof { evals_Cz: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (SumcheckInstanceProof, Vec, Vec) { + ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S, poly_D_comp: &S| -> S { *poly_A_comp * (*poly_B_comp * *poly_C_comp - *poly_D_comp) }; let (sc_proof_phase_one, r, claims) = - SumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( + R1CSSumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( &S::field_zero(), // claim is zero num_rounds, num_rounds_x_max, @@ -82,12 +83,12 @@ impl R1CSProof { evals_z: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (SumcheckInstanceProof, Vec, Vec) { + ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { *poly_A_comp * *poly_B_comp * *poly_C_comp }; let (sc_proof_phase_two, r, claims) = - SumcheckInstanceProof::::prove_cubic_disjoint_rounds( + R1CSSumcheckInstanceProof::::prove_cubic_disjoint_rounds( claim, num_rounds, num_rounds_y_max, @@ -101,6 +102,7 @@ impl R1CSProof { evals_z, comb_func, transcript, + random_tape, ); (sc_proof_phase_two, r, claims) diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index 36295c27..a3b891a9 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -6,6 +6,7 @@ use crate::scalar::SpartanExtensionField; use super::dense_mlpoly::DensePolynomial; use super::errors::ProofVerifyError; +use super::nizk::DotProductProof; use super::random::RandomTape; use super::transcript::{AppendToTranscript, ProofTranscript}; use super::unipoly::{CompressedUniPoly, UniPoly}; @@ -69,6 +70,67 @@ impl SumcheckInstanceProof { } } +#[derive(Serialize, Deserialize, Debug)] +pub struct R1CSSumcheckInstanceProof { + proofs: Vec>, +} + +impl R1CSSumcheckInstanceProof { + pub fn new(proofs: Vec>) -> Self { + R1CSSumcheckInstanceProof { proofs } + } + + pub fn verify( + &self, + num_rounds: usize, + degree_bound: usize, + transcript: &mut Transcript, + ) -> Result, ProofVerifyError> { + let mut r: Vec = Vec::new(); + + for i in 0..num_rounds { + // derive the verifier's challenge for the next round + let r_i = transcript.challenge_scalar(b"challenge_nextround"); + + // verify the proof of sum-check and evals + let _res = { + // produce two weights + let w: Vec = transcript.challenge_vector(b"combine_two_claims_to_one", 2); + + let a = { + // the vector to use to decommit for sum-check test + let a_sc = { + let mut a = vec![S::field_one(); degree_bound + 1]; + a[0] = a[0] + S::field_one(); + a + }; + + // the vector to use to decommit for evaluation + let a_eval = { + let mut a = vec![S::field_one(); degree_bound + 1]; + for j in 1..a.len() { + a[j] = a[j - 1] * r_i; + } + a + }; + + // take weighted sum of the two vectors using w + assert_eq!(a_sc.len(), a_eval.len()); + (0..a_sc.len()) + .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) + .collect::>() + }; + + self.proofs[i].verify(transcript, &a).is_ok() + }; + + r.push(r_i); + } + + Ok(r) + } +} + impl SumcheckInstanceProof { pub fn prove_cubic( claim: &S, @@ -317,7 +379,9 @@ impl SumcheckInstanceProof { claims_dotp, ) } +} +impl R1CSSumcheckInstanceProof { pub fn prove_cubic_disjoint_rounds( claim: &S, num_rounds: usize, @@ -332,6 +396,7 @@ impl SumcheckInstanceProof { poly_C: &mut DensePolynomialPqx, comb_func: F, transcript: &mut Transcript, + random_tape: &mut RandomTape, ) -> (Self, Vec, Vec) where F: Fn(&S, &S, &S) -> S, @@ -345,7 +410,7 @@ impl SumcheckInstanceProof { let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); - let mut cubic_polys: Vec> = Vec::new(); + let mut proofs: Vec> = Vec::new(); let mut inputs_len = num_rounds_y_max.pow2(); let mut witness_secs_len = num_rounds_w.pow2(); @@ -475,12 +540,8 @@ impl SumcheckInstanceProof { poly }; - // append the prover's message to the transcript - poly.append_to_transcript(b"poly", transcript); - //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); - r.push(r_j); // bound all tables to the verifier's challenege if mode == MODE_P { @@ -491,12 +552,61 @@ impl SumcheckInstanceProof { } poly_C.bound_poly(&r_j, mode); - claim_per_round = poly.evaluate(&r_j); - cubic_polys.push(poly.compress()); + // produce a proof of sum-check and of evaluation + let (proof, claim_next_round) = { + let eval = poly.evaluate(&r_j); + + // we need to prove the following under homomorphic commitments: + // (1) poly(0) + poly(1) = claim_per_round + // (2) poly(r_j) = eval + + // Our technique is to leverage dot product proofs: + // (1) we can prove: = claim_per_round + // (2) we can prove: = transcript.challenge_vector(b"combine_two_claims_to_one", 2); + + // compute a weighted sum of the RHS + let target = w[0] * claim_per_round + w[1] * eval; + + let a = { + // the vector to use to decommit for sum-check test + let a_sc = { + let mut a = vec![S::field_one(); poly.degree() + 1]; + a[0] = a[0] + S::field_one(); + a + }; + + // the vector to use to decommit for evaluation + let a_eval = { + let mut a = vec![S::field_one(); poly.degree() + 1]; + for j in 1..a.len() { + a[j] = a[j - 1] * r_j; + } + a + }; + + // take weighted sum of the two vectors using w + assert_eq!(a_sc.len(), a_eval.len()); + (0..a_sc.len()) + .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) + .collect::>() + }; + + let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); + + (proof, eval) + }; + + proofs.push(proof); + claim_per_round = claim_next_round; + r.push(r_j); } ( - SumcheckInstanceProof::new(cubic_polys), + R1CSSumcheckInstanceProof::new(proofs), r, vec![ poly_A[0], @@ -543,7 +653,7 @@ impl SumcheckInstanceProof { let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); - let mut cubic_polys: Vec> = Vec::new(); + let mut proofs: Vec> = Vec::new(); let mut cons_len = num_rounds_x_max.pow2(); let mut proof_len = num_rounds_q_max.pow2(); @@ -688,12 +798,8 @@ impl SumcheckInstanceProof { poly }; - // append the prover's message to the transcript - poly.append_to_transcript(b"poly", transcript); - //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); - r.push(r_j); // bound all tables to the verifier's challenege if mode == 1 { @@ -707,12 +813,60 @@ impl SumcheckInstanceProof { poly_C.bound_poly(&r_j, mode); poly_D.bound_poly(&r_j, mode); - claim_per_round = poly.evaluate(&r_j); - cubic_polys.push(poly.compress()); + let (proof, claim_next_round) = { + let eval = poly.evaluate(&r_j); + + // we need to prove the following under homomorphic commitments: + // (1) poly(0) + poly(1) = claim_per_round + // (2) poly(r_j) = eval + + // Our technique is to leverage dot product proofs: + // (1) we can prove: = claim_per_round + // (2) we can prove: = transcript.challenge_vector(b"combine_two_claims_to_one", 2); + + // compute a weighted sum of the RHS + let target = w[0] * claim_per_round + w[1] * eval; + + let a = { + // the vector to use to decommit for sum-check test + let a_sc = { + let mut a = vec![S::field_one(); poly.degree() + 1]; + a[0] = a[0] + S::field_one(); + a + }; + + // the vector to use to decommit for evaluation + let a_eval = { + let mut a = vec![S::field_one(); poly.degree() + 1]; + for j in 1..a.len() { + a[j] = a[j - 1] * r_j; + } + a + }; + + // take weighted sum of the two vectors using w + assert_eq!(a_sc.len(), a_eval.len()); + (0..a_sc.len()) + .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) + .collect::>() + }; + + let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); + + (proof, eval) + }; + + proofs.push(proof); + claim_per_round = claim_next_round; + r.push(r_j); } ( - SumcheckInstanceProof::new(cubic_polys), + R1CSSumcheckInstanceProof::new(proofs), r, vec![ poly_Ap[0] * poly_Aq[0] * poly_Ax[0], @@ -722,4 +876,4 @@ impl SumcheckInstanceProof { ], ) } -} \ No newline at end of file +} From 6b398537b933f95ab1e1a62efec1e37c05295731 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 5 Dec 2024 20:06:35 -0500 Subject: [PATCH 06/54] Resolve compilation issues --- spartan_parallel/src/dense_mlpoly.rs | 165 ++++------------------- spartan_parallel/src/lib.rs | 4 - spartan_parallel/src/r1csproof.rs | 129 ++++++++++-------- spartan_parallel/src/sparse_mlpoly.rs | 6 - spartan_parallel/src/sumcheck.rs | 187 +++----------------------- 5 files changed, 115 insertions(+), 376 deletions(-) diff --git a/spartan_parallel/src/dense_mlpoly.rs b/spartan_parallel/src/dense_mlpoly.rs index 9ef128b2..0d0a09f8 100644 --- a/spartan_parallel/src/dense_mlpoly.rs +++ b/spartan_parallel/src/dense_mlpoly.rs @@ -3,7 +3,6 @@ use crate::scalar::SpartanExtensionField; use super::errors::ProofVerifyError; use super::math::Math; -use super::nizk::DotProductProofLog; use super::random::RandomTape; use super::transcript::ProofTranscript; use core::ops::Index; @@ -21,10 +20,6 @@ pub struct DensePolynomial { Z: Vec, // evaluations of the polynomial in all the 2^num_vars Boolean inputs } -pub struct PolyCommitmentBlinds { - pub(crate) blinds: Vec, -} - pub struct EqPolynomial { r: Vec, } @@ -258,7 +253,12 @@ impl DensePolynomial { assert_eq!(r.len(), self.get_num_vars()); let chis = EqPolynomial::new(r.to_vec()).evals(); assert_eq!(chis.len(), self.Z.len()); - DotProductProofLog::compute_dotproduct(&self.Z, &chis) + Self::compute_dotproduct(&self.Z, &chis) + } + + fn compute_dotproduct(a: &[S], b: &[S]) -> S { + assert_eq!(a.len(), b.len()); + (0..a.len()).map(|i| a[i] * b[i]).sum() } fn vec(&self) -> &Vec { @@ -311,7 +311,7 @@ impl Index for DensePolynomial { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct PolyEvalProof { - proof: DotProductProofLog, + v: Vec, } impl PolyEvalProof { @@ -321,12 +321,10 @@ impl PolyEvalProof { pub fn prove( poly: &DensePolynomial, - blinds_opt: Option<&PolyCommitmentBlinds>, r: &[S], // point at which the polynomial is evaluated - Zr: &S, // evaluation of \widetilde{Z}(r) - blind_Zr_opt: Option<&S>, // specifies a blind for Zr + _Zr: &S, // evaluation of \widetilde{Z}(r) transcript: &mut Transcript, - random_tape: &mut RandomTape, + _random_tape: &mut RandomTape, ) -> PolyEvalProof { >::append_protocol_name( transcript, @@ -340,32 +338,16 @@ impl PolyEvalProof { let L_size = left_num_vars.pow2(); let R_size = right_num_vars.pow2(); - let default_blinds = PolyCommitmentBlinds { - blinds: vec![S::field_zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - - assert_eq!(blinds.blinds.len(), L_size); - - let zero = S::field_zero(); - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - // compute the L and R vectors let eq = EqPolynomial::new(r.to_vec()); let (L, R) = eq.compute_factored_evals(); assert_eq!(L.len(), L_size); assert_eq!(R.len(), R_size); - // compute the vector underneath L*Z and the L*blinds // compute vector-matrix product between L and Z viewed as a matrix let LZ = poly.bound(&L); - let LZ_blind: S = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let proof = - DotProductProofLog::prove(transcript, random_tape, &LZ, &LZ_blind, &R, Zr, blind_Zr); - PolyEvalProof { proof } + PolyEvalProof { v: LZ } } pub fn verify( @@ -380,9 +362,7 @@ impl PolyEvalProof { // compute L and R let eq = EqPolynomial::new(r.to_vec()); - let (L, R) = eq.compute_factored_evals(); - - let _ = self.proof.verify(R.len(), transcript, &R); + let (_L, _R) = eq.compute_factored_evals(); // TODO: Alternative PCS Verification Ok(()) @@ -403,12 +383,10 @@ impl PolyEvalProof { // Evaluation of multiple points on the same instance pub fn prove_batched_points( poly: &DensePolynomial, - blinds_opt: Option<&PolyCommitmentBlinds>, r_list: Vec>, // point at which the polynomial is evaluated Zr_list: Vec, // evaluation of \widetilde{Z}(r) on each point - blind_Zr_opt: Option<&S>, // specifies a blind for Zr transcript: &mut Transcript, - random_tape: &mut RandomTape, + _random_tape: &mut RandomTape, ) -> Vec> { >::append_protocol_name( transcript, @@ -425,16 +403,6 @@ impl PolyEvalProof { let L_size = left_num_vars.pow2(); let R_size = right_num_vars.pow2(); - let default_blinds = PolyCommitmentBlinds { - blinds: vec![S::field_zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - - assert_eq!(blinds.blinds.len(), L_size); - - let zero = S::field_zero(); - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - // compute the L and R vectors // We can perform batched opening if L is the same, so we regroup the proofs by L vector // Map from the left half of the r to index in L_list @@ -468,31 +436,14 @@ impl PolyEvalProof { let mut proof_list = Vec::new(); for i in 0..L_list.len() { let L = &L_list[i]; - let R = &R_list[i]; - // compute the vector underneath L*Z and the L*blinds + let _R = &R_list[i]; // compute vector-matrix product between L and Z viewed as a matrix let LZ = poly.bound(L); - let LZ_blind: S = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let proof = DotProductProofLog::prove( - transcript, - random_tape, - &LZ, - &LZ_blind, - R, - &Zc_list[i], - blind_Zr, - ); - proof_list.push(proof); + + proof_list.push(PolyEvalProof{ v: LZ }); } proof_list - .iter() - .map(|proof| PolyEvalProof { - proof: proof.clone(), - }) - .collect() } pub fn verify_plain_batched_points( @@ -546,12 +497,10 @@ impl PolyEvalProof { // Size of each instance might be different, but all are larger than the evaluation point pub fn prove_batched_instances( poly_list: &Vec>, // list of instances - blinds_opt: Option<&PolyCommitmentBlinds>, r_list: Vec<&Vec>, // point at which the polynomial is evaluated Zr_list: &Vec, // evaluation of \widetilde{Z}(r) on each instance - blind_Zr_opt: Option<&S>, // specifies a blind for Zr transcript: &mut Transcript, - random_tape: &mut RandomTape, + _random_tape: &mut RandomTape, ) -> Vec> { >::append_protocol_name( transcript, @@ -611,31 +560,10 @@ impl PolyEvalProof { } let mut proof_list = Vec::new(); - for i in 0..LZ_list.len() { - let L = &L_list[i]; - let L_size = L.len(); - - let default_blinds = PolyCommitmentBlinds { - blinds: vec![S::field_zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - assert_eq!(blinds.blinds.len(), L_size); - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - let LZ_blind: S = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let proof = DotProductProofLog::prove( - transcript, - random_tape, - &LZ_list[i], - &LZ_blind, - &R_list[i], - &Zc_list[i], - blind_Zr, - ); - proof_list.push(PolyEvalProof { proof }); + for v in LZ_list.into_iter() { + proof_list.push(PolyEvalProof { v }); } - + proof_list } @@ -700,13 +628,11 @@ impl PolyEvalProof { poly_list: &Vec<&DensePolynomial>, num_proofs_list: &Vec, num_inputs_list: &Vec, - blinds_opt: Option<&PolyCommitmentBlinds>, rq: &[S], ry: &[S], Zr_list: &Vec, - blind_Zr_opt: Option<&S>, transcript: &mut Transcript, - random_tape: &mut RandomTape, + _random_tape: &mut RandomTape, ) -> Vec> { >::append_protocol_name( transcript, @@ -771,32 +697,8 @@ impl PolyEvalProof { } let mut proof_list = Vec::new(); - - for i in 0..LZ_list.len() { - let L = &L_list[i]; - let L_size = L.len(); - let default_blinds = PolyCommitmentBlinds { - blinds: vec![S::field_zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - - assert_eq!(blinds.blinds.len(), L_size); - - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - let LZ_blind: S = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let proof = DotProductProofLog::prove( - transcript, - random_tape, - &LZ_list[i], - &LZ_blind, - &R_list[i], - &Zc_list[i], - blind_Zr, - ); - - proof_list.push(PolyEvalProof { proof }); + for v in LZ_list.into_iter() { + proof_list.push(PolyEvalProof{ v }); } proof_list @@ -871,7 +773,7 @@ impl PolyEvalProof { for i in 0..LZ_list.len() { let R = &R_list[i]; - proof_list[i].proof.verify(R.len(), transcript, R)?; + proof_list[i].verify(transcript, R)?; } Ok(()) @@ -883,7 +785,7 @@ impl PolyEvalProof { r: &S, // point at which the polynomial is evaluated Zr: &Vec, // evaluation of \widetilde{Z}(r) transcript: &mut Transcript, - random_tape: &mut RandomTape, + _random_tape: &mut RandomTape, ) -> PolyEvalProof { >::append_protocol_name( transcript, @@ -904,7 +806,7 @@ impl PolyEvalProof { let R_size = right_num_vars.pow2(); // compute R = <1, r, r^2, ...> - let R = { + let _R = { let mut r_base = S::field_one(); let mut R = Vec::new(); for _ in 0..R_size { @@ -951,18 +853,7 @@ impl PolyEvalProof { c = c * c_base; } - // a dot product proof of size R_size - let proof = DotProductProofLog::prove( - transcript, - random_tape, - &LZ_comb, - &zero, - &R, - &Zr_comb, - &zero, - ); - - PolyEvalProof { proof } + PolyEvalProof { v: LZ_comb } } pub fn verify_uni_batched_instances( @@ -1021,7 +912,7 @@ impl PolyEvalProof { c = c * c_base; } - self.proof.verify(R.len(), transcript, &R) + self.verify(transcript, &R) } } @@ -1049,7 +940,7 @@ mod tests { .collect::>(); // compute dot product between LZ and R - DotProductProofLog::compute_dotproduct(&LZ, &R) + DensePolynomial::compute_dotproduct(&LZ, &R) } #[test] diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index d1eb04d5..eb4b747c 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -204,7 +204,6 @@ impl IOProofs { // batch prove all proofs let proofs = PolyEvalProof::prove_batched_points( exec_poly_inputs, - None, [ vec![ 0, // input valid @@ -230,7 +229,6 @@ impl IOProofs { live_input, ] .concat(), - None, transcript, random_tape, ); @@ -2199,10 +2197,8 @@ impl SNARK { .collect(); let proof_eval_perm_poly_prod_list = PolyEvalProof::prove_batched_instances( &perm_poly_w3_prover.poly_w, - None, r_list, &perm_poly_poly_list, - None, transcript, &mut random_tape, ); diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 5cd1e650..866f1642 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -3,10 +3,9 @@ use super::custom_dense_mlpoly::DensePolynomialPqx; use super::dense_mlpoly::{DensePolynomial, EqPolynomial, PolyEvalProof}; use super::errors::ProofVerifyError; use super::math::Math; -use super::nizk::{EqualityProof, KnowledgeProof, ProductProof}; use super::r1csinstance::R1CSInstance; use super::random::RandomTape; -use super::sumcheck::R1CSSumcheckInstanceProof; +use super::sumcheck::SumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; use crate::scalar::SpartanExtensionField; @@ -17,11 +16,13 @@ use std::cmp::min; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { - sc_proof_phase1: R1CSSumcheckInstanceProof, - sc_proof_phase2: R1CSSumcheckInstanceProof, - pok_claims_phase2: (KnowledgeProof, ProductProof), - proof_eq_sc_phase1: EqualityProof, - proof_eq_sc_phase2: EqualityProof, + sc_proof_phase1: SumcheckInstanceProof, + sc_proof_phase2: SumcheckInstanceProof, + claims_phase2: (S, S, S), + // debug_zk + // pok_claims_phase2: (KnowledgeProof, ProductProof), + // proof_eq_sc_phase1: EqualityProof, + // proof_eq_sc_phase2: EqualityProof, proof_eval_vars_at_ry_list: Vec>, } @@ -41,13 +42,13 @@ impl R1CSProof { evals_Cz: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { + ) -> (SumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S, poly_D_comp: &S| -> S { *poly_A_comp * (*poly_B_comp * *poly_C_comp - *poly_D_comp) }; let (sc_proof_phase_one, r, claims) = - R1CSSumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( + SumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( &S::field_zero(), // claim is zero num_rounds, num_rounds_x_max, @@ -83,12 +84,12 @@ impl R1CSProof { evals_z: &mut DensePolynomialPqx, transcript: &mut Transcript, random_tape: &mut RandomTape, - ) -> (R1CSSumcheckInstanceProof, Vec, Vec) { + ) -> (SumcheckInstanceProof, Vec, Vec) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { *poly_A_comp * *poly_B_comp * *poly_C_comp }; let (sc_proof_phase_two, r, claims) = - R1CSSumcheckInstanceProof::::prove_cubic_disjoint_rounds( + SumcheckInstanceProof::::prove_cubic_disjoint_rounds( claim, num_rounds, num_rounds_y_max, @@ -272,21 +273,23 @@ impl R1CSProof { random_tape.random_scalar(b"prod_Az_Bz_blind"), ); - let pok_Cz_claim = { KnowledgeProof::prove(transcript, random_tape, Cz_claim, &Cz_blind) }; - - let proof_prod = { - let prod = *Az_claim * *Bz_claim; - ProductProof::prove( - transcript, - random_tape, - Az_claim, - &Az_blind, - Bz_claim, - &Bz_blind, - &prod, - &prod_Az_Bz_blind, - ) - }; + // debug_zk + // let pok_Cz_claim = { KnowledgeProof::prove(transcript, random_tape, Cz_claim, &Cz_blind) }; + + // debug_zk + // let proof_prod = { + // let prod = *Az_claim * *Bz_claim; + // ProductProof::prove( + // transcript, + // random_tape, + // Az_claim, + // &Az_blind, + // Bz_claim, + // &Bz_blind, + // &prod, + // &prod_Az_Bz_blind, + // ) + // }; // prove the final step of sum-check #1 let taus_bound_rx = tau_claim; @@ -294,13 +297,14 @@ impl R1CSProof { let blind_expected_claim_postsc1 = *taus_bound_rx * (prod_Az_Bz_blind - Cz_blind); let claim_post_phase1 = (*Az_claim * *Bz_claim - *Cz_claim) * *taus_bound_rx; - let proof_eq_sc_phase1 = EqualityProof::prove( - transcript, - random_tape, - &claim_post_phase1, - &blind_expected_claim_postsc1, - &claim_post_phase1, - ); + // debug_zk + // let proof_eq_sc_phase1 = EqualityProof::prove( + // transcript, + // random_tape, + // &claim_post_phase1, + // &blind_expected_claim_postsc1, + // &claim_post_phase1, + // ); // Separate the result rx into rp, rq, and rx let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); @@ -464,11 +468,9 @@ impl R1CSProof { &poly_list, &num_proofs_list, &num_inputs_list, - None, &rq, &ry, &Zr_list, - None, transcript, random_tape, ); @@ -541,25 +543,29 @@ impl R1CSProof { let blind_expected_claim_postsc2 = S::field_zero(); let claim_post_phase2 = claims_phase2[0] * claims_phase2[1] * claims_phase2[2]; - let proof_eq_sc_phase2 = EqualityProof::prove( - transcript, - random_tape, - &claim_post_phase2, - &blind_expected_claim_postsc2, - &claim_post_phase2, - ); + // debug_zk + // let proof_eq_sc_phase2 = EqualityProof::prove( + // transcript, + // random_tape, + // &claim_post_phase2, + // &blind_expected_claim_postsc2, + // &claim_post_phase2, + // ); timer_prove.stop(); - let pok_claims_phase2 = (pok_Cz_claim, proof_prod); + // debug_zk + // let pok_claims_phase2 = (pok_Cz_claim, proof_prod); ( R1CSProof { sc_proof_phase1, sc_proof_phase2, - pok_claims_phase2, - proof_eq_sc_phase1, - proof_eq_sc_phase2, + claims_phase2: (*Az_claim, *Bz_claim, *Cz_claim), + // debug_zk + // pok_claims_phase2, + // proof_eq_sc_phase1, + // proof_eq_sc_phase2, proof_eval_vars_at_ry_list, }, [rp, rq_rev, rx, [rw, ry].concat()], @@ -612,16 +618,18 @@ impl R1CSProof { let tau_q = transcript.challenge_vector(b"challenge_tau_q", num_rounds_q); let tau_x = transcript.challenge_vector(b"challenge_tau_x", num_rounds_x); - let rx = + let (_, rx) = self .sc_proof_phase1 - .verify(num_rounds_x + num_rounds_q + num_rounds_p, 3, transcript)?; + .verify(S::field_zero(), num_rounds_x + num_rounds_q + num_rounds_p, 3, transcript)?; + // debug_zk // perform the intermediate sum-check test with claimed Az, Bz, and Cz - let (pok_Cz_claim, proof_prod) = &self.pok_claims_phase2; + // let (pok_Cz_claim, proof_prod) = &self.pok_claims_phase2; - pok_Cz_claim.verify(transcript)?; - proof_prod.verify(transcript)?; + // debug_zk + // pok_Cz_claim.verify(transcript)?; + // proof_prod.verify(transcript)?; // Separate the result rx into rp_round1, rq, and rx let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); @@ -645,19 +653,23 @@ impl R1CSProof { .product(); let _taus_bound_rx = taus_bound_rp * taus_bound_rq * taus_bound_rx; + // debug_zk // verify proof that expected_claim_post_phase1 == claim_post_phase1 - self.proof_eq_sc_phase1.verify(transcript)?; + // self.proof_eq_sc_phase1.verify(transcript)?; // derive three public challenges and then derive a joint claim - let _r_A: S = transcript.challenge_scalar(b"challenge_Az"); - let _r_B: S = transcript.challenge_scalar(b"challenge_Bz"); - let _r_C: S = transcript.challenge_scalar(b"challenge_Cz"); + let r_A: S = transcript.challenge_scalar(b"challenge_Az"); + let r_B: S = transcript.challenge_scalar(b"challenge_Bz"); + let r_C: S = transcript.challenge_scalar(b"challenge_Cz"); + + let (Az_claim, Bz_claim, Cz_claim) = self.claims_phase2; + let claim_phase2 = r_A * Az_claim + r_B * Bz_claim + r_C * Cz_claim; // verify the joint claim with a sum-check protocol - let ry = + let (_, ry) = self .sc_proof_phase2 - .verify(num_rounds_y + num_rounds_w + num_rounds_p, 3, transcript)?; + .verify(claim_phase2, num_rounds_y + num_rounds_w + num_rounds_p, 3, transcript)?; // Separate ry into rp, rw, and ry let (ry_rev, rw) = ry.split_at(num_rounds_y); @@ -747,8 +759,9 @@ impl R1CSProof { timer_commit_opening.stop(); + // debug_zk // verify proof that expected_claim_post_phase2 == claim_post_phase2 - self.proof_eq_sc_phase2.verify(transcript)?; + // self.proof_eq_sc_phase2.verify(transcript)?; Ok([rp, rq_rev, rx, [rw, ry].concat()]) } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index cff1f6c6..1f181685 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -106,10 +106,8 @@ impl DerefsEvalProof { let proof_derefs = PolyEvalProof::prove( joint_poly, - None, &r_joint, &eval_joint, - None, transcript, random_tape, ); @@ -764,10 +762,8 @@ impl HashLayerProof { let proof_ops = PolyEvalProof::prove( &dense.comb_ops, - None, &r_joint_ops, &joint_claim_eval_ops, - None, transcript, random_tape, ); @@ -791,10 +787,8 @@ impl HashLayerProof { let proof_mem = PolyEvalProof::prove( &dense.comb_mem, - None, &r_joint_mem, &joint_claim_eval_mem, - None, transcript, random_tape, ); diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index a3b891a9..cff58b7f 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -6,7 +6,6 @@ use crate::scalar::SpartanExtensionField; use super::dense_mlpoly::DensePolynomial; use super::errors::ProofVerifyError; -use super::nizk::DotProductProof; use super::random::RandomTape; use super::transcript::{AppendToTranscript, ProofTranscript}; use super::unipoly::{CompressedUniPoly, UniPoly}; @@ -70,67 +69,6 @@ impl SumcheckInstanceProof { } } -#[derive(Serialize, Deserialize, Debug)] -pub struct R1CSSumcheckInstanceProof { - proofs: Vec>, -} - -impl R1CSSumcheckInstanceProof { - pub fn new(proofs: Vec>) -> Self { - R1CSSumcheckInstanceProof { proofs } - } - - pub fn verify( - &self, - num_rounds: usize, - degree_bound: usize, - transcript: &mut Transcript, - ) -> Result, ProofVerifyError> { - let mut r: Vec = Vec::new(); - - for i in 0..num_rounds { - // derive the verifier's challenge for the next round - let r_i = transcript.challenge_scalar(b"challenge_nextround"); - - // verify the proof of sum-check and evals - let _res = { - // produce two weights - let w: Vec = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![S::field_one(); degree_bound + 1]; - a[0] = a[0] + S::field_one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![S::field_one(); degree_bound + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_i; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - self.proofs[i].verify(transcript, &a).is_ok() - }; - - r.push(r_i); - } - - Ok(r) - } -} - impl SumcheckInstanceProof { pub fn prove_cubic( claim: &S, @@ -379,9 +317,7 @@ impl SumcheckInstanceProof { claims_dotp, ) } -} -impl R1CSSumcheckInstanceProof { pub fn prove_cubic_disjoint_rounds( claim: &S, num_rounds: usize, @@ -410,7 +346,7 @@ impl R1CSSumcheckInstanceProof { let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); - let mut proofs: Vec> = Vec::new(); + let mut polys: Vec> = Vec::new(); let mut inputs_len = num_rounds_y_max.pow2(); let mut witness_secs_len = num_rounds_w.pow2(); @@ -540,8 +476,12 @@ impl R1CSSumcheckInstanceProof { poly }; + // append the prover's message to the transcript + poly.append_to_transcript(b"poly", transcript); + //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + r.push(r_j); // bound all tables to the verifier's challenege if mode == MODE_P { @@ -551,62 +491,12 @@ impl R1CSSumcheckInstanceProof { poly_B.bound_poly(&r_j, mode); } poly_C.bound_poly(&r_j, mode); - - // produce a proof of sum-check and of evaluation - let (proof, claim_next_round) = { - let eval = poly.evaluate(&r_j); - - // we need to prove the following under homomorphic commitments: - // (1) poly(0) + poly(1) = claim_per_round - // (2) poly(r_j) = eval - - // Our technique is to leverage dot product proofs: - // (1) we can prove: = claim_per_round - // (2) we can prove: = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - // compute a weighted sum of the RHS - let target = w[0] * claim_per_round + w[1] * eval; - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - a[0] = a[0] + S::field_one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_j; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); - - (proof, eval) - }; - - proofs.push(proof); - claim_per_round = claim_next_round; - r.push(r_j); + claim_per_round = poly.evaluate(&r_j); + polys.push(poly.compress()); } ( - R1CSSumcheckInstanceProof::new(proofs), + SumcheckInstanceProof::new(polys), r, vec![ poly_A[0], @@ -653,7 +543,7 @@ impl R1CSSumcheckInstanceProof { let mut claim_per_round = *claim; let mut r: Vec = Vec::new(); - let mut proofs: Vec> = Vec::new(); + let mut polys: Vec> = Vec::new(); let mut cons_len = num_rounds_x_max.pow2(); let mut proof_len = num_rounds_q_max.pow2(); @@ -798,8 +688,12 @@ impl R1CSSumcheckInstanceProof { poly }; + // append the prover's message to the transcript + poly.append_to_transcript(b"poly", transcript); + //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + r.push(r_j); // bound all tables to the verifier's challenege if mode == 1 { @@ -812,61 +706,12 @@ impl R1CSSumcheckInstanceProof { poly_B.bound_poly(&r_j, mode); poly_C.bound_poly(&r_j, mode); poly_D.bound_poly(&r_j, mode); - - let (proof, claim_next_round) = { - let eval = poly.evaluate(&r_j); - - // we need to prove the following under homomorphic commitments: - // (1) poly(0) + poly(1) = claim_per_round - // (2) poly(r_j) = eval - - // Our technique is to leverage dot product proofs: - // (1) we can prove: = claim_per_round - // (2) we can prove: = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - // compute a weighted sum of the RHS - let target = w[0] * claim_per_round + w[1] * eval; - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - a[0] = a[0] + S::field_one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![S::field_one(); poly.degree() + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_j; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - let proof = DotProductProof::prove(transcript, random_tape, &poly.as_vec(), &a, &target); - - (proof, eval) - }; - - proofs.push(proof); - claim_per_round = claim_next_round; - r.push(r_j); + claim_per_round = poly.evaluate(&r_j); + polys.push(poly.compress()); } ( - R1CSSumcheckInstanceProof::new(proofs), + SumcheckInstanceProof::new(polys), r, vec![ poly_Ap[0] * poly_Aq[0] * poly_Ax[0], From a8ba63f53b58532d088cb732a362562cac80ec39 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 6 Dec 2024 11:44:58 -0500 Subject: [PATCH 07/54] Remove additional commitment proofs --- spartan_parallel/src/lib.rs | 8 ++++++-- spartan_parallel/src/r1csproof.rs | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index eb4b747c..7d75e430 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -610,7 +610,7 @@ pub struct SNARK { perm_poly_poly_list: Vec, proof_eval_perm_poly_prod_list: Vec>, - shift_proof: ShiftProofs, + // shift_proof: ShiftProofs, io_proof: IOProofs, } @@ -2260,6 +2260,7 @@ impl SNARK { shifted_polys.push(&vir_mem_addr_w3_shifted_prover.poly_w[0]); header_len_list.push(6); } + /* let shift_proof = ShiftProofs::prove( orig_polys, shifted_polys, @@ -2268,6 +2269,7 @@ impl SNARK { &mut random_tape, ); shift_proof + */ }; timer_proof.stop(); @@ -2314,7 +2316,7 @@ impl SNARK { perm_poly_poly_list, proof_eval_perm_poly_prod_list, - shift_proof, + // shift_proof, io_proof, } } @@ -3256,9 +3258,11 @@ impl SNARK { header_len_list.push(6); } + /* self .shift_proof .verify(poly_size_list, shift_size_list, header_len_list, transcript)?; + */ } timer_proof.stop(); diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 866f1642..c0a07f5b 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -23,7 +23,7 @@ pub struct R1CSProof { // pok_claims_phase2: (KnowledgeProof, ProductProof), // proof_eq_sc_phase1: EqualityProof, // proof_eq_sc_phase2: EqualityProof, - proof_eval_vars_at_ry_list: Vec>, + // proof_eval_vars_at_ry_list: Vec>, } impl R1CSProof { @@ -464,6 +464,7 @@ impl R1CSProof { } } + /* let proof_eval_vars_at_ry_list = PolyEvalProof::prove_batched_instances_disjoint_rounds( &poly_list, &num_proofs_list, @@ -474,6 +475,7 @@ impl R1CSProof { transcript, random_tape, ); + */ // Bind the resulting witness list to rp // poly_vars stores the result of each witness matrix bounded to (rq_short ++ ry) @@ -566,7 +568,7 @@ impl R1CSProof { // pok_claims_phase2, // proof_eq_sc_phase1, // proof_eq_sc_phase2, - proof_eval_vars_at_ry_list, + // proof_eval_vars_at_ry_list, }, [rp, rq_rev, rx, [rw, ry].concat()], ) @@ -706,6 +708,7 @@ impl R1CSProof { } } + /* PolyEvalProof::verify_batched_instances_disjoint_rounds( &self.proof_eval_vars_at_ry_list, &num_proofs_list, @@ -714,6 +717,7 @@ impl R1CSProof { &rq, &ry, )?; + */ // Then on rp for p in 0..num_instances { From ffa6d7c81907e7328b5c5fd6c08e41efe4795428 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 6 Dec 2024 12:33:55 -0500 Subject: [PATCH 08/54] Added poseidon tests --- .../poseidon_test/poseidon_array.zok | 1647 ++++++++++++++++ .../poseidon_test/poseidon_struct.zok | 1686 +++++++++++++++++ 2 files changed, 3333 insertions(+) create mode 100644 zok_tests/benchmarks/poseidon_test/poseidon_array.zok create mode 100644 zok_tests/benchmarks/poseidon_test/poseidon_struct.zok diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_array.zok b/zok_tests/benchmarks/poseidon_test/poseidon_array.zok new file mode 100644 index 00000000..84b09b03 --- /dev/null +++ b/zok_tests/benchmarks/poseidon_test/poseidon_array.zok @@ -0,0 +1,1647 @@ +struct Digest { + field[4] elements +} + +def poseidon(field[12] input) -> field[12]: + field state0 = input[0] + field state1 = input[1] + field state2 = input[2] + field state3 = input[3] + field state4 = input[4] + field state5 = input[5] + field state6 = input[6] + field state7 = input[7] + field state8 = input[8] + field state9 = input[9] + field state10 = input[10] + field state11 = input[11] + + field c0 = 13080132714287612933 + field c1 = 8594738767457295063 + field c2 = 12896916465481390516 + field c3 = 1109962092811921367 + field c4 = 16216730422861946898 + field c5 = 10137062673499593713 + field c6 = 15292064466732465823 + field c7 = 17255573294985989181 + field c8 = 14827154241873003558 + field c9 = 2846171647972703231 + field c10 = 16246264663680317601 + field c11 = 14214208087951879286 + field c12 = 9667108687426275457 + field c13 = 6470857420712283733 + field c14 = 14103331940138337652 + field c15 = 11854816473550292865 + field c16 = 3498097497301325516 + field c17 = 7947235692523864220 + field c18 = 11110078701231901946 + field c19 = 16384314112672821048 + field c20 = 15404405912655775739 + field c21 = 14077880830714445579 + field c22 = 9555554662709218279 + field c23 = 13859595358210603949 + field c24 = 16859897325061800066 + field c25 = 17685474420222222349 + field c26 = 17858764734618734949 + field c27 = 9410011022665866671 + field c28 = 12495243629579414666 + field c29 = 12416945298171515742 + field c30 = 5776666812364270983 + field c31 = 6314421662864060481 + field c32 = 7402742471423223171 + field c33 = 982536713192432718 + field c34 = 17321168865775127905 + field c35 = 2934354895005980211 + field c36 = 10567510598607410195 + field c37 = 8135543733717919110 + field c38 = 116353493081713692 + field c39 = 8029688163494945618 + field c40 = 9003846637224807585 + field c41 = 7052445132467233849 + field c42 = 9645665432288852853 + field c43 = 5446430061030868787 + field c44 = 16770910634346036823 + field c45 = 17708360571433944729 + field c46 = 4661556288322237631 + field c47 = 11977051899316327985 + field c48 = 4378616569090929672 + field c49 = 3334807502817538491 + field c50 = 8019184735943344966 + field c51 = 2395043908812246395 + field c52 = 6558421058331732611 + field c53 = 11735894060727326369 + field c54 = 8143540538889204488 + field c55 = 5991753489563751169 + field c56 = 12235918791502088007 + field c57 = 2880312033702687139 + field c58 = 18224748115308382355 + field c59 = 18070411013125314165 + field c60 = 8156487614120951180 + field c61 = 10615269510047010719 + field c62 = 12489426404754222075 + field c63 = 5055279340069995710 + field c64 = 7231927319780248664 + field c65 = 2602078848106763799 + field c66 = 12445944369334781425 + field c67 = 3978905923892496205 + field c68 = 16711272944329818038 + field c69 = 10439032361227108922 + field c70 = 15110119871725214866 + field c71 = 821141790655890946 + field c72 = 11073536380651186235 + field c73 = 4866839313097607757 + field c74 = 13118391689513956636 + field c75 = 14527674973762312380 + field c76 = 7612751959265567999 + field c77 = 6808090907814178161 + field c78 = 6899703779492644997 + field c79 = 3664666286336986826 + field c80 = 783179505424462608 + field c81 = 8990689241814097697 + field c82 = 9646603555412825679 + field c83 = 7351246026167205041 + field c84 = 16970959813722173256 + field c85 = 15735726858241466429 + field c86 = 10347018221892268419 + field c87 = 12195545878449322889 + field c88 = 7423314197114049891 + field c89 = 14908016116973904153 + field c90 = 5840340122527363265 + field c91 = 17740311462440614128 + field c92 = 815306421953744623 + field c93 = 17456357368219253949 + field c94 = 6982651076559329072 + field c95 = 11970987324614963868 + field c96 = 8167785008538063246 + field c97 = 9483259819397403968 + field c98 = 954550221664291548 + field c99 = 10339565171024313256 + field c100 = 8651171084286500102 + field c101 = 16974445528003515956 + field c102 = 15104530047940621190 + field c103 = 103271880867179718 + field c104 = 14654666245504492663 + field c105 = 12445769555936887967 + field c106 = 11250582358051997490 + field c107 = 6730977207490590241 + field c108 = 15919951556166196935 + field c109 = 4423540216573360915 + field c110 = 16317664700341473511 + field c111 = 4723997214951767765 + field c112 = 10098756619006575500 + field c113 = 3223149401237667964 + field c114 = 6870494874300767682 + field c115 = 2902095711130291898 + field c116 = 7159372652788439733 + field c117 = 11500508372997952671 + field c118 = 13348148181479462670 + field c119 = 12729401155983882093 + field c120 = 15021242795466053388 + field c121 = 3802990509227527157 + field c122 = 4665459515680145682 + field c123 = 13165553315407675603 + field c124 = 6496364397926233172 + field c125 = 12800832566287577810 + field c126 = 9737592377590267426 + field c127 = 8687131091302514939 + field c128 = 1488200421755445892 + field c129 = 11004377668730991641 + field c130 = 13516338734600228410 + field c131 = 2953581820660217936 + field c132 = 3505040783153922951 + field c133 = 3710332827435113697 + field c134 = 15414874040873320221 + field c135 = 8602547649919482301 + field c136 = 13971349938398812007 + field c137 = 187239246702636066 + field c138 = 12886019973971254144 + field c139 = 4512274763990493707 + field c140 = 2986635507805503192 + field c141 = 2315252455709119454 + field c142 = 12537995864054210246 + field c143 = 2039491936479859267 + field c144 = 1558644089185031256 + field c145 = 4074089203264759305 + field c146 = 2522268501749395707 + field c147 = 3414760436185256196 + field c148 = 17420887529146466921 + field c149 = 2817020417938125001 + field c150 = 16538346563888261485 + field c151 = 5592270336833998770 + field c152 = 16876602064684906232 + field c153 = 1793025614521516343 + field c154 = 2178510518148748532 + field c155 = 2726440714374752509 + field c156 = 6502946837278398021 + field c157 = 15816362857667988792 + field c158 = 12997958454165692924 + field c159 = 5314892854495903792 + field c160 = 15533907063555687782 + field c161 = 12312015675698548715 + field c162 = 14140016464013350248 + field c163 = 16325589062962838690 + field c164 = 6796145646370327654 + field c165 = 1168753512742361735 + field c166 = 4100789820704709368 + field c167 = 15947554381540469177 + field c168 = 8597377839806076919 + field c169 = 9704018824195918000 + field c170 = 12763288618765762688 + field c171 = 17249257732622847695 + field c172 = 1998710993415069759 + field c173 = 923759906393011543 + field c174 = 1271051229666811593 + field c175 = 17822362132088738077 + field c176 = 11797234543722669271 + field c177 = 5864538787265942447 + field c178 = 15975583211110506970 + field c179 = 7258516085733671960 + field c180 = 17999926471875633100 + field c181 = 635992114476018166 + field c182 = 17205047318256576347 + field c183 = 17384900867876315312 + field c184 = 16484825562915784226 + field c185 = 16694130609036138894 + field c186 = 10575069350371260875 + field c187 = 8330575162062887277 + field c188 = 6212375704691932880 + field c189 = 15965138197626618226 + field c190 = 14285453069600046939 + field c191 = 10005163510208402517 + field c192 = 885298637936952595 + field c193 = 541790758138118921 + field c194 = 5985203084790372993 + field c195 = 4685030219775483721 + field c196 = 1411106851304815020 + field c197 = 11290732479954096478 + field c198 = 208280581124868513 + field c199 = 10979018648467968495 + field c200 = 8600643745023338215 + field c201 = 3477453626867126061 + field c202 = 6428436309340258604 + field c203 = 5695415667275657934 + field c204 = 15952065508715623490 + field c205 = 15571300830419767248 + field c206 = 17259785660502616862 + field c207 = 4298425495274316083 + field c208 = 9023601070579319352 + field c209 = 7353589709321807492 + field c210 = 2988848909076209475 + field c211 = 10439527789422046135 + field c212 = 6097734044161429459 + field c213 = 1113429873817861476 + field c214 = 1639063372386966591 + field c215 = 7863102812716788759 + field c216 = 216040220732135364 + field c217 = 14252611488623712688 + field c218 = 9543395466794536974 + field c219 = 2714461051639810934 + field c220 = 2588317208781407279 + field c221 = 15458529123534594916 + field c222 = 15748417817551040856 + field c223 = 16414455697114422951 + field c224 = 13378164466674639511 + field c225 = 13894319928411294675 + field c226 = 5032680892090751540 + field c227 = 17201338494743078916 + field c228 = 4397422800601932505 + field c229 = 11285062031581972327 + field c230 = 7309354640676468207 + field c231 = 10457152817239331848 + field c232 = 8855911538863247046 + field c233 = 4301853449821814398 + field c234 = 13001502396339103326 + field c235 = 10218424535115580246 + field c236 = 8628244713920681895 + field c237 = 17410423622514037261 + field c238 = 14080683768439215375 + field c239 = 11453161143447188100 + field c240 = 16761509772042181939 + field c241 = 6688821660695954082 + field c242 = 12083434295263160416 + field c243 = 8540021431714616589 + field c244 = 6891616215679974226 + field c245 = 10229217098454812721 + field c246 = 3292165387203778711 + field c247 = 6090113424998243490 + field c248 = 13431780521962358660 + field c249 = 6061081364215809883 + field c250 = 16792066504222214142 + field c251 = 16134314044798124799 + field c252 = 17070233710126619765 + field c253 = 6915716851370550800 + field c254 = 9505009849073026581 + field c255 = 6422700465081897153 + field c256 = 17977653991560529185 + field c257 = 5800870252836247255 + field c258 = 12096124733159345520 + field c259 = 7679273623392321940 + field c260 = 17835783910585744964 + field c261 = 2478664878205754377 + field c262 = 1720314468413114967 + field c263 = 10376757819003248056 + field c264 = 10376377187857634245 + field c265 = 13344930747504284997 + field c266 = 11579281865160153596 + field c267 = 10300256980048736962 + field c268 = 378765236515040565 + field c269 = 11412420941557253424 + field c270 = 12931662470734252786 + field c271 = 43018908376346374 + field c272 = 3589810689190160071 + field c273 = 4688229274750659741 + field c274 = 13688957436484306091 + field c275 = 11424740943016984272 + field c276 = 16001900718237913960 + field c277 = 5548469743008097574 + field c278 = 14584404916672178680 + field c279 = 3396622135873576824 + field c280 = 7861729246871155992 + field c281 = 16112271126908045545 + field c282 = 16988163966860016012 + field c283 = 273641680619529493 + field c284 = 15222677154027327363 + field c285 = 4070328078309830604 + field c286 = 13520458500363296391 + field c287 = 8235111705801363015 + field c288 = 5575990058472514138 + field c289 = 2751301609188252989 + field c290 = 6478598528223547074 + field c291 = 386565553848556638 + field c292 = 9417729078939938713 + field c293 = 15204315939835727483 + field c294 = 14942015033780606261 + field c295 = 18369423901636582012 + field c296 = 4715338437538604447 + field c297 = 6840590980607806319 + field c298 = 5535471161490539014 + field c299 = 5341328005359029952 + field c300 = 1475161295215894444 + field c301 = 7999197814297036636 + field c302 = 2984233088665867938 + field c303 = 3097746028144832229 + field c304 = 8849530863480031517 + field c305 = 7464920943249009773 + field c306 = 3802996844641460514 + field c307 = 6284458522545927646 + field c308 = 2307388003445002779 + field c309 = 4461479354745457623 + field c310 = 1649739722664588460 + field c311 = 3008391274160432867 + field c312 = 5142217010456550622 + field c313 = 1775580461722730120 + field c314 = 161694268822794344 + field c315 = 1518963253808031703 + field c316 = 16475258091652710137 + field c317 = 119575899007375159 + field c318 = 1275863735937973999 + field c319 = 16539412514520642374 + field c320 = 2303365191438051950 + field c321 = 6435126839960916075 + field c322 = 17794599201026020053 + field c323 = 13847097589277840330 + field c324 = 16645869274577729720 + field c325 = 8039205965509554440 + field c326 = 4788586935019371140 + field c327 = 15129007200040077746 + field c328 = 2055561615223771341 + field c329 = 4149731103701412892 + field c330 = 10268130195734144189 + field c331 = 13406631635880074708 + field c332 = 11429218277824986203 + field c333 = 15773968030812198565 + field c334 = 16050275277550506872 + field c335 = 11858586752031736643 + field c336 = 8927746344866569756 + field c337 = 11802068403177695792 + field c338 = 157833420806751556 + field c339 = 4698875910749767878 + field c340 = 1616722774788291698 + field c341 = 3990951895163748090 + field c342 = 16758609224720795472 + field c343 = 3045571693290741477 + field c344 = 9281634245289836419 + field c345 = 13517688176723875370 + field c346 = 7961395585333219380 + field c347 = 1606574359105691080 + field c348 = 17564372683613562171 + field c349 = 4664015225343144418 + field c350 = 6133721340680280128 + field c351 = 2667022304383014929 + field c352 = 12316557761857340230 + field c353 = 10375614850625292317 + field c354 = 8141542666379135068 + field c355 = 9185476451083834432 + field c356 = 4991072365274649547 + field c357 = 17398204971778820365 + field c358 = 16127888338958422584 + field c359 = 13586792051317758204 + + field mc0 = 17 + field mc1 = 15 + field mc2 = 41 + field mc3 = 16 + field mc4 = 2 + field mc5 = 28 + field mc6 = 13 + field mc7 = 13 + field mc8 = 39 + field mc9 = 18 + field mc10 = 34 + field mc11 = 20 + field md0 = 8 + field md1 = 0 + field md2 = 0 + field md3 = 0 + field md4 = 0 + field md5 = 0 + field md6 = 0 + field md7 = 0 + field md8 = 0 + field md9 = 0 + field md10 = 0 + field md11 = 0 + + // -- + // r = 0 + // ark + state0 = state0 + c0 + state1 = state1 + c1 + state2 = state2 + c2 + state3 = state3 + c3 + state4 = state4 + c4 + state5 = state5 + c5 + state6 = state6 + c6 + state7 = state7 + c7 + state8 = state8 + c8 + state9 = state9 + c9 + state10 = state10 + c10 + state11 = state11 + c11 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 1 + // ark + state0 = state0 + c12 + state1 = state1 + c13 + state2 = state2 + c14 + state3 = state3 + c15 + state4 = state4 + c16 + state5 = state5 + c17 + state6 = state6 + c18 + state7 = state7 + c19 + state8 = state8 + c20 + state9 = state9 + c21 + state10 = state10 + c22 + state11 = state11 + c23 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 2 + // ark + state0 = state0 + c24 + state1 = state1 + c25 + state2 = state2 + c26 + state3 = state3 + c27 + state4 = state4 + c28 + state5 = state5 + c29 + state6 = state6 + c30 + state7 = state7 + c31 + state8 = state8 + c32 + state9 = state9 + c33 + state10 = state10 + c34 + state11 = state11 + c35 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 3 + // ark + state0 = state0 + c36 + state1 = state1 + c37 + state2 = state2 + c38 + state3 = state3 + c39 + state4 = state4 + c40 + state5 = state5 + c41 + state6 = state6 + c42 + state7 = state7 + c43 + state8 = state8 + c44 + state9 = state9 + c45 + state10 = state10 + c46 + state11 = state11 + c47 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 4 + // ark + state0 = state0 + c48 + state1 = state1 + c49 + state2 = state2 + c50 + state3 = state3 + c51 + state4 = state4 + c52 + state5 = state5 + c53 + state6 = state6 + c54 + state7 = state7 + c55 + state8 = state8 + c56 + state9 = state9 + c57 + state10 = state10 + c58 + state11 = state11 + c59 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 5 + // ark + state0 = state0 + c60 + state1 = state1 + c61 + state2 = state2 + c62 + state3 = state3 + c63 + state4 = state4 + c64 + state5 = state5 + c65 + state6 = state6 + c66 + state7 = state7 + c67 + state8 = state8 + c68 + state9 = state9 + c69 + state10 = state10 + c70 + state11 = state11 + c71 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 6 + // ark + state0 = state0 + c72 + state1 = state1 + c73 + state2 = state2 + c74 + state3 = state3 + c75 + state4 = state4 + c76 + state5 = state5 + c77 + state6 = state6 + c78 + state7 = state7 + c79 + state8 = state8 + c80 + state9 = state9 + c81 + state10 = state10 + c82 + state11 = state11 + c83 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 7 + // ark + state0 = state0 + c84 + state1 = state1 + c85 + state2 = state2 + c86 + state3 = state3 + c87 + state4 = state4 + c88 + state5 = state5 + c89 + state6 = state6 + c90 + state7 = state7 + c91 + state8 = state8 + c92 + state9 = state9 + c93 + state10 = state10 + c94 + state11 = state11 + c95 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 8 + // ark + state0 = state0 + c96 + state1 = state1 + c97 + state2 = state2 + c98 + state3 = state3 + c99 + state4 = state4 + c100 + state5 = state5 + c101 + state6 = state6 + c102 + state7 = state7 + c103 + state8 = state8 + c104 + state9 = state9 + c105 + state10 = state10 + c106 + state11 = state11 + c107 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 9 + // ark + state0 = state0 + c108 + state1 = state1 + c109 + state2 = state2 + c110 + state3 = state3 + c111 + state4 = state4 + c112 + state5 = state5 + c113 + state6 = state6 + c114 + state7 = state7 + c115 + state8 = state8 + c116 + state9 = state9 + c117 + state10 = state10 + c118 + state11 = state11 + c119 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 10 + // ark + state0 = state0 + c120 + state1 = state1 + c121 + state2 = state2 + c122 + state3 = state3 + c123 + state4 = state4 + c124 + state5 = state5 + c125 + state6 = state6 + c126 + state7 = state7 + c127 + state8 = state8 + c128 + state9 = state9 + c129 + state10 = state10 + c130 + state11 = state11 + c131 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 11 + // ark + state0 = state0 + c132 + state1 = state1 + c133 + state2 = state2 + c134 + state3 = state3 + c135 + state4 = state4 + c136 + state5 = state5 + c137 + state6 = state6 + c138 + state7 = state7 + c139 + state8 = state8 + c140 + state9 = state9 + c141 + state10 = state10 + c142 + state11 = state11 + c143 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 12 + // ark + state0 = state0 + c144 + state1 = state1 + c145 + state2 = state2 + c146 + state3 = state3 + c147 + state4 = state4 + c148 + state5 = state5 + c149 + state6 = state6 + c150 + state7 = state7 + c151 + state8 = state8 + c152 + state9 = state9 + c153 + state10 = state10 + c154 + state11 = state11 + c155 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 13 + // ark + state0 = state0 + c156 + state1 = state1 + c157 + state2 = state2 + c158 + state3 = state3 + c159 + state4 = state4 + c160 + state5 = state5 + c161 + state6 = state6 + c162 + state7 = state7 + c163 + state8 = state8 + c164 + state9 = state9 + c165 + state10 = state10 + c166 + state11 = state11 + c167 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 14 + // ark + state0 = state0 + c168 + state1 = state1 + c169 + state2 = state2 + c170 + state3 = state3 + c171 + state4 = state4 + c172 + state5 = state5 + c173 + state6 = state6 + c174 + state7 = state7 + c175 + state8 = state8 + c176 + state9 = state9 + c177 + state10 = state10 + c178 + state11 = state11 + c179 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 15 + // ark + state0 = state0 + c180 + state1 = state1 + c181 + state2 = state2 + c182 + state3 = state3 + c183 + state4 = state4 + c184 + state5 = state5 + c185 + state6 = state6 + c186 + state7 = state7 + c187 + state8 = state8 + c188 + state9 = state9 + c189 + state10 = state10 + c190 + state11 = state11 + c191 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 16 + // ark + state0 = state0 + c192 + state1 = state1 + c193 + state2 = state2 + c194 + state3 = state3 + c195 + state4 = state4 + c196 + state5 = state5 + c197 + state6 = state6 + c198 + state7 = state7 + c199 + state8 = state8 + c200 + state9 = state9 + c201 + state10 = state10 + c202 + state11 = state11 + c203 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 17 + // ark + state0 = state0 + c204 + state1 = state1 + c205 + state2 = state2 + c206 + state3 = state3 + c207 + state4 = state4 + c208 + state5 = state5 + c209 + state6 = state6 + c210 + state7 = state7 + c211 + state8 = state8 + c212 + state9 = state9 + c213 + state10 = state10 + c214 + state11 = state11 + c215 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 18 + // ark + state0 = state0 + c216 + state1 = state1 + c217 + state2 = state2 + c218 + state3 = state3 + c219 + state4 = state4 + c220 + state5 = state5 + c221 + state6 = state6 + c222 + state7 = state7 + c223 + state8 = state8 + c224 + state9 = state9 + c225 + state10 = state10 + c226 + state11 = state11 + c227 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 19 + // ark + state0 = state0 + c228 + state1 = state1 + c229 + state2 = state2 + c230 + state3 = state3 + c231 + state4 = state4 + c232 + state5 = state5 + c233 + state6 = state6 + c234 + state7 = state7 + c235 + state8 = state8 + c236 + state9 = state9 + c237 + state10 = state10 + c238 + state11 = state11 + c239 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 20 + // ark + state0 = state0 + c240 + state1 = state1 + c241 + state2 = state2 + c242 + state3 = state3 + c243 + state4 = state4 + c244 + state5 = state5 + c245 + state6 = state6 + c246 + state7 = state7 + c247 + state8 = state8 + c248 + state9 = state9 + c249 + state10 = state10 + c250 + state11 = state11 + c251 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 21 + // ark + state0 = state0 + c252 + state1 = state1 + c253 + state2 = state2 + c254 + state3 = state3 + c255 + state4 = state4 + c256 + state5 = state5 + c257 + state6 = state6 + c258 + state7 = state7 + c259 + state8 = state8 + c260 + state9 = state9 + c261 + state10 = state10 + c262 + state11 = state11 + c263 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 22 + // ark + state0 = state0 + c264 + state1 = state1 + c265 + state2 = state2 + c266 + state3 = state3 + c267 + state4 = state4 + c268 + state5 = state5 + c269 + state6 = state6 + c270 + state7 = state7 + c271 + state8 = state8 + c272 + state9 = state9 + c273 + state10 = state10 + c274 + state11 = state11 + c275 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 23 + // ark + state0 = state0 + c276 + state1 = state1 + c277 + state2 = state2 + c278 + state3 = state3 + c279 + state4 = state4 + c280 + state5 = state5 + c281 + state6 = state6 + c282 + state7 = state7 + c283 + state8 = state8 + c284 + state9 = state9 + c285 + state10 = state10 + c286 + state11 = state11 + c287 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 24 + // ark + state0 = state0 + c288 + state1 = state1 + c289 + state2 = state2 + c290 + state3 = state3 + c291 + state4 = state4 + c292 + state5 = state5 + c293 + state6 = state6 + c294 + state7 = state7 + c295 + state8 = state8 + c296 + state9 = state9 + c297 + state10 = state10 + c298 + state11 = state11 + c299 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 25 + // ark + state0 = state0 + c300 + state1 = state1 + c301 + state2 = state2 + c302 + state3 = state3 + c303 + state4 = state4 + c304 + state5 = state5 + c305 + state6 = state6 + c306 + state7 = state7 + c307 + state8 = state8 + c308 + state9 = state9 + c309 + state10 = state10 + c310 + state11 = state11 + c311 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 26 + // ark + state0 = state0 + c312 + state1 = state1 + c313 + state2 = state2 + c314 + state3 = state3 + c315 + state4 = state4 + c316 + state5 = state5 + c317 + state6 = state6 + c318 + state7 = state7 + c319 + state8 = state8 + c320 + state9 = state9 + c321 + state10 = state10 + c322 + state11 = state11 + c323 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 27 + // ark + state0 = state0 + c324 + state1 = state1 + c325 + state2 = state2 + c326 + state3 = state3 + c327 + state4 = state4 + c328 + state5 = state5 + c329 + state6 = state6 + c330 + state7 = state7 + c331 + state8 = state8 + c332 + state9 = state9 + c333 + state10 = state10 + c334 + state11 = state11 + c335 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 28 + // ark + state0 = state0 + c336 + state1 = state1 + c337 + state2 = state2 + c338 + state3 = state3 + c339 + state4 = state4 + c340 + state5 = state5 + c341 + state6 = state6 + c342 + state7 = state7 + c343 + state8 = state8 + c344 + state9 = state9 + c345 + state10 = state10 + c346 + state11 = state11 + c347 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 29 + // ark + state0 = state0 + c348 + state1 = state1 + c349 + state2 = state2 + c350 + state3 = state3 + c351 + state4 = state4 + c352 + state5 = state5 + c353 + state6 = state6 + c354 + state7 = state7 + c355 + state8 = state8 + c356 + state9 = state9 + c357 + state10 = state10 + c358 + state11 = state11 + c359 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + return [state0, state1, state2, state3, state4, state5, state6, state7, state8, state9, state10, state11] + +def main() -> field: + field[12] inputs = [1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0] + field cumulated_hash = 0 + for u32 i in 0..1000000 do + field[12] hashes = poseidon(inputs) + for u32 j in 0..12 do + cumulated_hash = cumulated_hash + hashes[j] + endfor + endfor + + return cumulated_hash diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok new file mode 100644 index 00000000..8f0c9642 --- /dev/null +++ b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok @@ -0,0 +1,1686 @@ +struct Digest { + field[4] elements +} + +struct PoseidonState { + field state0 + field state1 + field state2 + field state3 + field state4 + field state5 + field state6 + field state7 + field state8 + field state9 + field state10 + field state11 +} + +def poseidon(PoseidonState input) -> PoseidonState: + field state0 = input.state0 + field state1 = input.state1 + field state2 = input.state2 + field state3 = input.state3 + field state4 = input.state4 + field state5 = input.state5 + field state6 = input.state6 + field state7 = input.state7 + field state8 = input.state8 + field state9 = input.state9 + field state10 = input.state10 + field state11 = input.state11 + + field c0 = 13080132714287612933 + field c1 = 8594738767457295063 + field c2 = 12896916465481390516 + field c3 = 1109962092811921367 + field c4 = 16216730422861946898 + field c5 = 10137062673499593713 + field c6 = 15292064466732465823 + field c7 = 17255573294985989181 + field c8 = 14827154241873003558 + field c9 = 2846171647972703231 + field c10 = 16246264663680317601 + field c11 = 14214208087951879286 + field c12 = 9667108687426275457 + field c13 = 6470857420712283733 + field c14 = 14103331940138337652 + field c15 = 11854816473550292865 + field c16 = 3498097497301325516 + field c17 = 7947235692523864220 + field c18 = 11110078701231901946 + field c19 = 16384314112672821048 + field c20 = 15404405912655775739 + field c21 = 14077880830714445579 + field c22 = 9555554662709218279 + field c23 = 13859595358210603949 + field c24 = 16859897325061800066 + field c25 = 17685474420222222349 + field c26 = 17858764734618734949 + field c27 = 9410011022665866671 + field c28 = 12495243629579414666 + field c29 = 12416945298171515742 + field c30 = 5776666812364270983 + field c31 = 6314421662864060481 + field c32 = 7402742471423223171 + field c33 = 982536713192432718 + field c34 = 17321168865775127905 + field c35 = 2934354895005980211 + field c36 = 10567510598607410195 + field c37 = 8135543733717919110 + field c38 = 116353493081713692 + field c39 = 8029688163494945618 + field c40 = 9003846637224807585 + field c41 = 7052445132467233849 + field c42 = 9645665432288852853 + field c43 = 5446430061030868787 + field c44 = 16770910634346036823 + field c45 = 17708360571433944729 + field c46 = 4661556288322237631 + field c47 = 11977051899316327985 + field c48 = 4378616569090929672 + field c49 = 3334807502817538491 + field c50 = 8019184735943344966 + field c51 = 2395043908812246395 + field c52 = 6558421058331732611 + field c53 = 11735894060727326369 + field c54 = 8143540538889204488 + field c55 = 5991753489563751169 + field c56 = 12235918791502088007 + field c57 = 2880312033702687139 + field c58 = 18224748115308382355 + field c59 = 18070411013125314165 + field c60 = 8156487614120951180 + field c61 = 10615269510047010719 + field c62 = 12489426404754222075 + field c63 = 5055279340069995710 + field c64 = 7231927319780248664 + field c65 = 2602078848106763799 + field c66 = 12445944369334781425 + field c67 = 3978905923892496205 + field c68 = 16711272944329818038 + field c69 = 10439032361227108922 + field c70 = 15110119871725214866 + field c71 = 821141790655890946 + field c72 = 11073536380651186235 + field c73 = 4866839313097607757 + field c74 = 13118391689513956636 + field c75 = 14527674973762312380 + field c76 = 7612751959265567999 + field c77 = 6808090907814178161 + field c78 = 6899703779492644997 + field c79 = 3664666286336986826 + field c80 = 783179505424462608 + field c81 = 8990689241814097697 + field c82 = 9646603555412825679 + field c83 = 7351246026167205041 + field c84 = 16970959813722173256 + field c85 = 15735726858241466429 + field c86 = 10347018221892268419 + field c87 = 12195545878449322889 + field c88 = 7423314197114049891 + field c89 = 14908016116973904153 + field c90 = 5840340122527363265 + field c91 = 17740311462440614128 + field c92 = 815306421953744623 + field c93 = 17456357368219253949 + field c94 = 6982651076559329072 + field c95 = 11970987324614963868 + field c96 = 8167785008538063246 + field c97 = 9483259819397403968 + field c98 = 954550221664291548 + field c99 = 10339565171024313256 + field c100 = 8651171084286500102 + field c101 = 16974445528003515956 + field c102 = 15104530047940621190 + field c103 = 103271880867179718 + field c104 = 14654666245504492663 + field c105 = 12445769555936887967 + field c106 = 11250582358051997490 + field c107 = 6730977207490590241 + field c108 = 15919951556166196935 + field c109 = 4423540216573360915 + field c110 = 16317664700341473511 + field c111 = 4723997214951767765 + field c112 = 10098756619006575500 + field c113 = 3223149401237667964 + field c114 = 6870494874300767682 + field c115 = 2902095711130291898 + field c116 = 7159372652788439733 + field c117 = 11500508372997952671 + field c118 = 13348148181479462670 + field c119 = 12729401155983882093 + field c120 = 15021242795466053388 + field c121 = 3802990509227527157 + field c122 = 4665459515680145682 + field c123 = 13165553315407675603 + field c124 = 6496364397926233172 + field c125 = 12800832566287577810 + field c126 = 9737592377590267426 + field c127 = 8687131091302514939 + field c128 = 1488200421755445892 + field c129 = 11004377668730991641 + field c130 = 13516338734600228410 + field c131 = 2953581820660217936 + field c132 = 3505040783153922951 + field c133 = 3710332827435113697 + field c134 = 15414874040873320221 + field c135 = 8602547649919482301 + field c136 = 13971349938398812007 + field c137 = 187239246702636066 + field c138 = 12886019973971254144 + field c139 = 4512274763990493707 + field c140 = 2986635507805503192 + field c141 = 2315252455709119454 + field c142 = 12537995864054210246 + field c143 = 2039491936479859267 + field c144 = 1558644089185031256 + field c145 = 4074089203264759305 + field c146 = 2522268501749395707 + field c147 = 3414760436185256196 + field c148 = 17420887529146466921 + field c149 = 2817020417938125001 + field c150 = 16538346563888261485 + field c151 = 5592270336833998770 + field c152 = 16876602064684906232 + field c153 = 1793025614521516343 + field c154 = 2178510518148748532 + field c155 = 2726440714374752509 + field c156 = 6502946837278398021 + field c157 = 15816362857667988792 + field c158 = 12997958454165692924 + field c159 = 5314892854495903792 + field c160 = 15533907063555687782 + field c161 = 12312015675698548715 + field c162 = 14140016464013350248 + field c163 = 16325589062962838690 + field c164 = 6796145646370327654 + field c165 = 1168753512742361735 + field c166 = 4100789820704709368 + field c167 = 15947554381540469177 + field c168 = 8597377839806076919 + field c169 = 9704018824195918000 + field c170 = 12763288618765762688 + field c171 = 17249257732622847695 + field c172 = 1998710993415069759 + field c173 = 923759906393011543 + field c174 = 1271051229666811593 + field c175 = 17822362132088738077 + field c176 = 11797234543722669271 + field c177 = 5864538787265942447 + field c178 = 15975583211110506970 + field c179 = 7258516085733671960 + field c180 = 17999926471875633100 + field c181 = 635992114476018166 + field c182 = 17205047318256576347 + field c183 = 17384900867876315312 + field c184 = 16484825562915784226 + field c185 = 16694130609036138894 + field c186 = 10575069350371260875 + field c187 = 8330575162062887277 + field c188 = 6212375704691932880 + field c189 = 15965138197626618226 + field c190 = 14285453069600046939 + field c191 = 10005163510208402517 + field c192 = 885298637936952595 + field c193 = 541790758138118921 + field c194 = 5985203084790372993 + field c195 = 4685030219775483721 + field c196 = 1411106851304815020 + field c197 = 11290732479954096478 + field c198 = 208280581124868513 + field c199 = 10979018648467968495 + field c200 = 8600643745023338215 + field c201 = 3477453626867126061 + field c202 = 6428436309340258604 + field c203 = 5695415667275657934 + field c204 = 15952065508715623490 + field c205 = 15571300830419767248 + field c206 = 17259785660502616862 + field c207 = 4298425495274316083 + field c208 = 9023601070579319352 + field c209 = 7353589709321807492 + field c210 = 2988848909076209475 + field c211 = 10439527789422046135 + field c212 = 6097734044161429459 + field c213 = 1113429873817861476 + field c214 = 1639063372386966591 + field c215 = 7863102812716788759 + field c216 = 216040220732135364 + field c217 = 14252611488623712688 + field c218 = 9543395466794536974 + field c219 = 2714461051639810934 + field c220 = 2588317208781407279 + field c221 = 15458529123534594916 + field c222 = 15748417817551040856 + field c223 = 16414455697114422951 + field c224 = 13378164466674639511 + field c225 = 13894319928411294675 + field c226 = 5032680892090751540 + field c227 = 17201338494743078916 + field c228 = 4397422800601932505 + field c229 = 11285062031581972327 + field c230 = 7309354640676468207 + field c231 = 10457152817239331848 + field c232 = 8855911538863247046 + field c233 = 4301853449821814398 + field c234 = 13001502396339103326 + field c235 = 10218424535115580246 + field c236 = 8628244713920681895 + field c237 = 17410423622514037261 + field c238 = 14080683768439215375 + field c239 = 11453161143447188100 + field c240 = 16761509772042181939 + field c241 = 6688821660695954082 + field c242 = 12083434295263160416 + field c243 = 8540021431714616589 + field c244 = 6891616215679974226 + field c245 = 10229217098454812721 + field c246 = 3292165387203778711 + field c247 = 6090113424998243490 + field c248 = 13431780521962358660 + field c249 = 6061081364215809883 + field c250 = 16792066504222214142 + field c251 = 16134314044798124799 + field c252 = 17070233710126619765 + field c253 = 6915716851370550800 + field c254 = 9505009849073026581 + field c255 = 6422700465081897153 + field c256 = 17977653991560529185 + field c257 = 5800870252836247255 + field c258 = 12096124733159345520 + field c259 = 7679273623392321940 + field c260 = 17835783910585744964 + field c261 = 2478664878205754377 + field c262 = 1720314468413114967 + field c263 = 10376757819003248056 + field c264 = 10376377187857634245 + field c265 = 13344930747504284997 + field c266 = 11579281865160153596 + field c267 = 10300256980048736962 + field c268 = 378765236515040565 + field c269 = 11412420941557253424 + field c270 = 12931662470734252786 + field c271 = 43018908376346374 + field c272 = 3589810689190160071 + field c273 = 4688229274750659741 + field c274 = 13688957436484306091 + field c275 = 11424740943016984272 + field c276 = 16001900718237913960 + field c277 = 5548469743008097574 + field c278 = 14584404916672178680 + field c279 = 3396622135873576824 + field c280 = 7861729246871155992 + field c281 = 16112271126908045545 + field c282 = 16988163966860016012 + field c283 = 273641680619529493 + field c284 = 15222677154027327363 + field c285 = 4070328078309830604 + field c286 = 13520458500363296391 + field c287 = 8235111705801363015 + field c288 = 5575990058472514138 + field c289 = 2751301609188252989 + field c290 = 6478598528223547074 + field c291 = 386565553848556638 + field c292 = 9417729078939938713 + field c293 = 15204315939835727483 + field c294 = 14942015033780606261 + field c295 = 18369423901636582012 + field c296 = 4715338437538604447 + field c297 = 6840590980607806319 + field c298 = 5535471161490539014 + field c299 = 5341328005359029952 + field c300 = 1475161295215894444 + field c301 = 7999197814297036636 + field c302 = 2984233088665867938 + field c303 = 3097746028144832229 + field c304 = 8849530863480031517 + field c305 = 7464920943249009773 + field c306 = 3802996844641460514 + field c307 = 6284458522545927646 + field c308 = 2307388003445002779 + field c309 = 4461479354745457623 + field c310 = 1649739722664588460 + field c311 = 3008391274160432867 + field c312 = 5142217010456550622 + field c313 = 1775580461722730120 + field c314 = 161694268822794344 + field c315 = 1518963253808031703 + field c316 = 16475258091652710137 + field c317 = 119575899007375159 + field c318 = 1275863735937973999 + field c319 = 16539412514520642374 + field c320 = 2303365191438051950 + field c321 = 6435126839960916075 + field c322 = 17794599201026020053 + field c323 = 13847097589277840330 + field c324 = 16645869274577729720 + field c325 = 8039205965509554440 + field c326 = 4788586935019371140 + field c327 = 15129007200040077746 + field c328 = 2055561615223771341 + field c329 = 4149731103701412892 + field c330 = 10268130195734144189 + field c331 = 13406631635880074708 + field c332 = 11429218277824986203 + field c333 = 15773968030812198565 + field c334 = 16050275277550506872 + field c335 = 11858586752031736643 + field c336 = 8927746344866569756 + field c337 = 11802068403177695792 + field c338 = 157833420806751556 + field c339 = 4698875910749767878 + field c340 = 1616722774788291698 + field c341 = 3990951895163748090 + field c342 = 16758609224720795472 + field c343 = 3045571693290741477 + field c344 = 9281634245289836419 + field c345 = 13517688176723875370 + field c346 = 7961395585333219380 + field c347 = 1606574359105691080 + field c348 = 17564372683613562171 + field c349 = 4664015225343144418 + field c350 = 6133721340680280128 + field c351 = 2667022304383014929 + field c352 = 12316557761857340230 + field c353 = 10375614850625292317 + field c354 = 8141542666379135068 + field c355 = 9185476451083834432 + field c356 = 4991072365274649547 + field c357 = 17398204971778820365 + field c358 = 16127888338958422584 + field c359 = 13586792051317758204 + + field mc0 = 17 + field mc1 = 15 + field mc2 = 41 + field mc3 = 16 + field mc4 = 2 + field mc5 = 28 + field mc6 = 13 + field mc7 = 13 + field mc8 = 39 + field mc9 = 18 + field mc10 = 34 + field mc11 = 20 + field md0 = 8 + field md1 = 0 + field md2 = 0 + field md3 = 0 + field md4 = 0 + field md5 = 0 + field md6 = 0 + field md7 = 0 + field md8 = 0 + field md9 = 0 + field md10 = 0 + field md11 = 0 + + // -- + // r = 0 + // ark + state0 = state0 + c0 + state1 = state1 + c1 + state2 = state2 + c2 + state3 = state3 + c3 + state4 = state4 + c4 + state5 = state5 + c5 + state6 = state6 + c6 + state7 = state7 + c7 + state8 = state8 + c8 + state9 = state9 + c9 + state10 = state10 + c10 + state11 = state11 + c11 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 1 + // ark + state0 = state0 + c12 + state1 = state1 + c13 + state2 = state2 + c14 + state3 = state3 + c15 + state4 = state4 + c16 + state5 = state5 + c17 + state6 = state6 + c18 + state7 = state7 + c19 + state8 = state8 + c20 + state9 = state9 + c21 + state10 = state10 + c22 + state11 = state11 + c23 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 2 + // ark + state0 = state0 + c24 + state1 = state1 + c25 + state2 = state2 + c26 + state3 = state3 + c27 + state4 = state4 + c28 + state5 = state5 + c29 + state6 = state6 + c30 + state7 = state7 + c31 + state8 = state8 + c32 + state9 = state9 + c33 + state10 = state10 + c34 + state11 = state11 + c35 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 3 + // ark + state0 = state0 + c36 + state1 = state1 + c37 + state2 = state2 + c38 + state3 = state3 + c39 + state4 = state4 + c40 + state5 = state5 + c41 + state6 = state6 + c42 + state7 = state7 + c43 + state8 = state8 + c44 + state9 = state9 + c45 + state10 = state10 + c46 + state11 = state11 + c47 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 4 + // ark + state0 = state0 + c48 + state1 = state1 + c49 + state2 = state2 + c50 + state3 = state3 + c51 + state4 = state4 + c52 + state5 = state5 + c53 + state6 = state6 + c54 + state7 = state7 + c55 + state8 = state8 + c56 + state9 = state9 + c57 + state10 = state10 + c58 + state11 = state11 + c59 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 5 + // ark + state0 = state0 + c60 + state1 = state1 + c61 + state2 = state2 + c62 + state3 = state3 + c63 + state4 = state4 + c64 + state5 = state5 + c65 + state6 = state6 + c66 + state7 = state7 + c67 + state8 = state8 + c68 + state9 = state9 + c69 + state10 = state10 + c70 + state11 = state11 + c71 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 6 + // ark + state0 = state0 + c72 + state1 = state1 + c73 + state2 = state2 + c74 + state3 = state3 + c75 + state4 = state4 + c76 + state5 = state5 + c77 + state6 = state6 + c78 + state7 = state7 + c79 + state8 = state8 + c80 + state9 = state9 + c81 + state10 = state10 + c82 + state11 = state11 + c83 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 7 + // ark + state0 = state0 + c84 + state1 = state1 + c85 + state2 = state2 + c86 + state3 = state3 + c87 + state4 = state4 + c88 + state5 = state5 + c89 + state6 = state6 + c90 + state7 = state7 + c91 + state8 = state8 + c92 + state9 = state9 + c93 + state10 = state10 + c94 + state11 = state11 + c95 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 8 + // ark + state0 = state0 + c96 + state1 = state1 + c97 + state2 = state2 + c98 + state3 = state3 + c99 + state4 = state4 + c100 + state5 = state5 + c101 + state6 = state6 + c102 + state7 = state7 + c103 + state8 = state8 + c104 + state9 = state9 + c105 + state10 = state10 + c106 + state11 = state11 + c107 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 9 + // ark + state0 = state0 + c108 + state1 = state1 + c109 + state2 = state2 + c110 + state3 = state3 + c111 + state4 = state4 + c112 + state5 = state5 + c113 + state6 = state6 + c114 + state7 = state7 + c115 + state8 = state8 + c116 + state9 = state9 + c117 + state10 = state10 + c118 + state11 = state11 + c119 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 10 + // ark + state0 = state0 + c120 + state1 = state1 + c121 + state2 = state2 + c122 + state3 = state3 + c123 + state4 = state4 + c124 + state5 = state5 + c125 + state6 = state6 + c126 + state7 = state7 + c127 + state8 = state8 + c128 + state9 = state9 + c129 + state10 = state10 + c130 + state11 = state11 + c131 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 11 + // ark + state0 = state0 + c132 + state1 = state1 + c133 + state2 = state2 + c134 + state3 = state3 + c135 + state4 = state4 + c136 + state5 = state5 + c137 + state6 = state6 + c138 + state7 = state7 + c139 + state8 = state8 + c140 + state9 = state9 + c141 + state10 = state10 + c142 + state11 = state11 + c143 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 12 + // ark + state0 = state0 + c144 + state1 = state1 + c145 + state2 = state2 + c146 + state3 = state3 + c147 + state4 = state4 + c148 + state5 = state5 + c149 + state6 = state6 + c150 + state7 = state7 + c151 + state8 = state8 + c152 + state9 = state9 + c153 + state10 = state10 + c154 + state11 = state11 + c155 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 13 + // ark + state0 = state0 + c156 + state1 = state1 + c157 + state2 = state2 + c158 + state3 = state3 + c159 + state4 = state4 + c160 + state5 = state5 + c161 + state6 = state6 + c162 + state7 = state7 + c163 + state8 = state8 + c164 + state9 = state9 + c165 + state10 = state10 + c166 + state11 = state11 + c167 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 14 + // ark + state0 = state0 + c168 + state1 = state1 + c169 + state2 = state2 + c170 + state3 = state3 + c171 + state4 = state4 + c172 + state5 = state5 + c173 + state6 = state6 + c174 + state7 = state7 + c175 + state8 = state8 + c176 + state9 = state9 + c177 + state10 = state10 + c178 + state11 = state11 + c179 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 15 + // ark + state0 = state0 + c180 + state1 = state1 + c181 + state2 = state2 + c182 + state3 = state3 + c183 + state4 = state4 + c184 + state5 = state5 + c185 + state6 = state6 + c186 + state7 = state7 + c187 + state8 = state8 + c188 + state9 = state9 + c189 + state10 = state10 + c190 + state11 = state11 + c191 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 16 + // ark + state0 = state0 + c192 + state1 = state1 + c193 + state2 = state2 + c194 + state3 = state3 + c195 + state4 = state4 + c196 + state5 = state5 + c197 + state6 = state6 + c198 + state7 = state7 + c199 + state8 = state8 + c200 + state9 = state9 + c201 + state10 = state10 + c202 + state11 = state11 + c203 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 17 + // ark + state0 = state0 + c204 + state1 = state1 + c205 + state2 = state2 + c206 + state3 = state3 + c207 + state4 = state4 + c208 + state5 = state5 + c209 + state6 = state6 + c210 + state7 = state7 + c211 + state8 = state8 + c212 + state9 = state9 + c213 + state10 = state10 + c214 + state11 = state11 + c215 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 18 + // ark + state0 = state0 + c216 + state1 = state1 + c217 + state2 = state2 + c218 + state3 = state3 + c219 + state4 = state4 + c220 + state5 = state5 + c221 + state6 = state6 + c222 + state7 = state7 + c223 + state8 = state8 + c224 + state9 = state9 + c225 + state10 = state10 + c226 + state11 = state11 + c227 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 19 + // ark + state0 = state0 + c228 + state1 = state1 + c229 + state2 = state2 + c230 + state3 = state3 + c231 + state4 = state4 + c232 + state5 = state5 + c233 + state6 = state6 + c234 + state7 = state7 + c235 + state8 = state8 + c236 + state9 = state9 + c237 + state10 = state10 + c238 + state11 = state11 + c239 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 20 + // ark + state0 = state0 + c240 + state1 = state1 + c241 + state2 = state2 + c242 + state3 = state3 + c243 + state4 = state4 + c244 + state5 = state5 + c245 + state6 = state6 + c246 + state7 = state7 + c247 + state8 = state8 + c248 + state9 = state9 + c249 + state10 = state10 + c250 + state11 = state11 + c251 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 21 + // ark + state0 = state0 + c252 + state1 = state1 + c253 + state2 = state2 + c254 + state3 = state3 + c255 + state4 = state4 + c256 + state5 = state5 + c257 + state6 = state6 + c258 + state7 = state7 + c259 + state8 = state8 + c260 + state9 = state9 + c261 + state10 = state10 + c262 + state11 = state11 + c263 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 22 + // ark + state0 = state0 + c264 + state1 = state1 + c265 + state2 = state2 + c266 + state3 = state3 + c267 + state4 = state4 + c268 + state5 = state5 + c269 + state6 = state6 + c270 + state7 = state7 + c271 + state8 = state8 + c272 + state9 = state9 + c273 + state10 = state10 + c274 + state11 = state11 + c275 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 23 + // ark + state0 = state0 + c276 + state1 = state1 + c277 + state2 = state2 + c278 + state3 = state3 + c279 + state4 = state4 + c280 + state5 = state5 + c281 + state6 = state6 + c282 + state7 = state7 + c283 + state8 = state8 + c284 + state9 = state9 + c285 + state10 = state10 + c286 + state11 = state11 + c287 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 24 + // ark + state0 = state0 + c288 + state1 = state1 + c289 + state2 = state2 + c290 + state3 = state3 + c291 + state4 = state4 + c292 + state5 = state5 + c293 + state6 = state6 + c294 + state7 = state7 + c295 + state8 = state8 + c296 + state9 = state9 + c297 + state10 = state10 + c298 + state11 = state11 + c299 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 25 + // ark + state0 = state0 + c300 + state1 = state1 + c301 + state2 = state2 + c302 + state3 = state3 + c303 + state4 = state4 + c304 + state5 = state5 + c305 + state6 = state6 + c306 + state7 = state7 + c307 + state8 = state8 + c308 + state9 = state9 + c309 + state10 = state10 + c310 + state11 = state11 + c311 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + field new_state4 = state4 + field new_state5 = state5 + field new_state6 = state6 + field new_state7 = state7 + field new_state8 = state8 + field new_state9 = state9 + field new_state10 = state10 + field new_state11 = state11 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 26 + // ark + state0 = state0 + c312 + state1 = state1 + c313 + state2 = state2 + c314 + state3 = state3 + c315 + state4 = state4 + c316 + state5 = state5 + c317 + state6 = state6 + c318 + state7 = state7 + c319 + state8 = state8 + c320 + state9 = state9 + c321 + state10 = state10 + c322 + state11 = state11 + c323 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 27 + // ark + state0 = state0 + c324 + state1 = state1 + c325 + state2 = state2 + c326 + state3 = state3 + c327 + state4 = state4 + c328 + state5 = state5 + c329 + state6 = state6 + c330 + state7 = state7 + c331 + state8 = state8 + c332 + state9 = state9 + c333 + state10 = state10 + c334 + state11 = state11 + c335 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 28 + // ark + state0 = state0 + c336 + state1 = state1 + c337 + state2 = state2 + c338 + state3 = state3 + c339 + state4 = state4 + c340 + state5 = state5 + c341 + state6 = state6 + c342 + state7 = state7 + c343 + state8 = state8 + c344 + state9 = state9 + c345 + state10 = state10 + c346 + state11 = state11 + c347 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + // -- + // r = 29 + // ark + state0 = state0 + c348 + state1 = state1 + c349 + state2 = state2 + c350 + state3 = state3 + c351 + state4 = state4 + c352 + state5 = state5 + c353 + state6 = state6 + c354 + state7 = state7 + c355 + state8 = state8 + c356 + state9 = state9 + c357 + state10 = state10 + c358 + state11 = state11 + c359 + // sbox + field new_state0 = state0 ** 7 + field new_state1 = state1 ** 7 + field new_state2 = state2 ** 7 + field new_state3 = state3 ** 7 + field new_state4 = state4 ** 7 + field new_state5 = state5 ** 7 + field new_state6 = state6 ** 7 + field new_state7 = state7 ** 7 + field new_state8 = state8 ** 7 + field new_state9 = state9 ** 7 + field new_state10 = state10 ** 7 + field new_state11 = state11 ** 7 + // mix + state0 = new_state0 * md0+ new_state0 * mc0+ new_state1 * mc1+ new_state2 * mc2+ new_state3 * mc3+ new_state4 * mc4+ new_state5 * mc5+ new_state6 * mc6+ new_state7 * mc7+ new_state8 * mc8+ new_state9 * mc9+ new_state10 * mc10+ new_state11 * mc11 + state1 = new_state1 * md1+ new_state1 * mc0+ new_state2 * mc1+ new_state3 * mc2+ new_state4 * mc3+ new_state5 * mc4+ new_state6 * mc5+ new_state7 * mc6+ new_state8 * mc7+ new_state9 * mc8+ new_state10 * mc9+ new_state11 * mc10+ new_state0 * mc11 + state2 = new_state2 * md2+ new_state2 * mc0+ new_state3 * mc1+ new_state4 * mc2+ new_state5 * mc3+ new_state6 * mc4+ new_state7 * mc5+ new_state8 * mc6+ new_state9 * mc7+ new_state10 * mc8+ new_state11 * mc9+ new_state0 * mc10+ new_state1 * mc11 + state3 = new_state3 * md3+ new_state3 * mc0+ new_state4 * mc1+ new_state5 * mc2+ new_state6 * mc3+ new_state7 * mc4+ new_state8 * mc5+ new_state9 * mc6+ new_state10 * mc7+ new_state11 * mc8+ new_state0 * mc9+ new_state1 * mc10+ new_state2 * mc11 + state4 = new_state4 * md4+ new_state4 * mc0+ new_state5 * mc1+ new_state6 * mc2+ new_state7 * mc3+ new_state8 * mc4+ new_state9 * mc5+ new_state10 * mc6+ new_state11 * mc7+ new_state0 * mc8+ new_state1 * mc9+ new_state2 * mc10+ new_state3 * mc11 + state5 = new_state5 * md5+ new_state5 * mc0+ new_state6 * mc1+ new_state7 * mc2+ new_state8 * mc3+ new_state9 * mc4+ new_state10 * mc5+ new_state11 * mc6+ new_state0 * mc7+ new_state1 * mc8+ new_state2 * mc9+ new_state3 * mc10+ new_state4 * mc11 + state6 = new_state6 * md6+ new_state6 * mc0+ new_state7 * mc1+ new_state8 * mc2+ new_state9 * mc3+ new_state10 * mc4+ new_state11 * mc5+ new_state0 * mc6+ new_state1 * mc7+ new_state2 * mc8+ new_state3 * mc9+ new_state4 * mc10+ new_state5 * mc11 + state7 = new_state7 * md7+ new_state7 * mc0+ new_state8 * mc1+ new_state9 * mc2+ new_state10 * mc3+ new_state11 * mc4+ new_state0 * mc5+ new_state1 * mc6+ new_state2 * mc7+ new_state3 * mc8+ new_state4 * mc9+ new_state5 * mc10+ new_state6 * mc11 + state8 = new_state8 * md8+ new_state8 * mc0+ new_state9 * mc1+ new_state10 * mc2+ new_state11 * mc3+ new_state0 * mc4+ new_state1 * mc5+ new_state2 * mc6+ new_state3 * mc7+ new_state4 * mc8+ new_state5 * mc9+ new_state6 * mc10+ new_state7 * mc11 + state9 = new_state9 * md9+ new_state9 * mc0+ new_state10 * mc1+ new_state11 * mc2+ new_state0 * mc3+ new_state1 * mc4+ new_state2 * mc5+ new_state3 * mc6+ new_state4 * mc7+ new_state5 * mc8+ new_state6 * mc9+ new_state7 * mc10+ new_state8 * mc11 + state10 = new_state10 * md10+ new_state10 * mc0+ new_state11 * mc1+ new_state0 * mc2+ new_state1 * mc3+ new_state2 * mc4+ new_state3 * mc5+ new_state4 * mc6+ new_state5 * mc7+ new_state6 * mc8+ new_state7 * mc9+ new_state8 * mc10+ new_state9 * mc11 + state11 = new_state11 * md11+ new_state11 * mc0+ new_state0 * mc1+ new_state1 * mc2+ new_state2 * mc3+ new_state3 * mc4+ new_state4 * mc5+ new_state5 * mc6+ new_state6 * mc7+ new_state7 * mc8+ new_state8 * mc9+ new_state9 * mc10+ new_state10 * mc11 + return PoseidonState { + state0: state0, + state1: state1, + state2: state2, + state3: state3, + state4: state4, + state5: state5, + state6: state6, + state7: state7, + state8: state8, + state9: state9, + state10: state10, + state11: state11, + } + +def main() -> field: + PoseidonState inputs = PoseidonState { + state0: 1, + state1: 2, + state2: 3, + state3: 4, + state4: 5, + state5: 6, + state6: 7, + state7: 8, + state8: 0, + state9: 0, + state10: 0, + state11: 0 + } + field cumulated_hash = 0 + for u32 i in 0..10000 do + PoseidonState hashes = poseidon(inputs) + cumulated_hash = cumulated_hash + hashes.state0 + hashes.state1 + hashes.state2 + hashes.state3 + hashes.state4 + hashes.state5 + hashes.state6 + hashes.state7 + hashes.state8 + hashes.state9 + hashes.state10 + hashes.state11 + endfor + + return cumulated_hash From ed996d3499d926917dbaba7e61be1bc1f9d637a6 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 6 Dec 2024 15:15:06 -0500 Subject: [PATCH 09/54] Add basic size calculation --- spartan_parallel/src/lib.rs | 109 +++++++++++++++--- .../poseidon_test/poseidon_struct.zok | 2 +- 2 files changed, 96 insertions(+), 15 deletions(-) diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 7d75e430..e0c34a36 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -648,6 +648,66 @@ impl SNARK { b"Spartan SNARK proof" } + // Computes proof size by commitment / non-commitment + fn compute_size(&self) -> (usize, usize, usize) { + /* + let commit_size = bincode::serialize(&self.block_comm_vars_list).unwrap().len() + + bincode::serialize(&self.exec_comm_inputs).unwrap().len() + + bincode::serialize(&self.addr_comm_phy_mems).unwrap().len() + + bincode::serialize(&self.addr_comm_phy_mems_shifted).unwrap().len() + + bincode::serialize(&self.addr_comm_vir_mems).unwrap().len() + + bincode::serialize(&self.addr_comm_vir_mems_shifted).unwrap().len() + + bincode::serialize(&self.addr_comm_ts_bits).unwrap().len() + + + bincode::serialize(&self.perm_exec_comm_w2_list).unwrap().len() + + bincode::serialize(&self.perm_exec_comm_w3_list).unwrap().len() + + bincode::serialize(&self.perm_exec_comm_w3_shifted).unwrap().len() + + + bincode::serialize(&self.block_comm_w2_list).unwrap().len() + + bincode::serialize(&self.block_comm_w3_list).unwrap().len() + + bincode::serialize(&self.block_comm_w3_list_shifted).unwrap().len() + + + bincode::serialize(&self.init_phy_mem_comm_w2).unwrap().len() + + bincode::serialize(&self.init_phy_mem_comm_w3).unwrap().len() + + bincode::serialize(&self.init_phy_mem_comm_w3_shifted).unwrap().len() + + + bincode::serialize(&self.init_vir_mem_comm_w2).unwrap().len() + + bincode::serialize(&self.init_vir_mem_comm_w3).unwrap().len() + + bincode::serialize(&self.init_vir_mem_comm_w3_shifted).unwrap().len() + + + bincode::serialize(&self.phy_mem_addr_comm_w2).unwrap().len() + + bincode::serialize(&self.phy_mem_addr_comm_w3).unwrap().len() + + bincode::serialize(&self.phy_mem_addr_comm_w3_shifted).unwrap().len() + + + bincode::serialize(&self.vir_mem_addr_comm_w2).unwrap().len() + + bincode::serialize(&self.vir_mem_addr_comm_w3).unwrap().len() + + bincode::serialize(&self.vir_mem_addr_comm_w3_shifted).unwrap().len(); + */ + let dense_commit_size = 0; + + let sparse_commit_size = bincode::serialize(&self.block_r1cs_eval_proof_list).unwrap().len() + + bincode::serialize(&self.pairwise_check_r1cs_eval_proof).unwrap().len() + + bincode::serialize(&self.perm_root_r1cs_eval_proof).unwrap().len() + + bincode::serialize(&self.proof_eval_perm_poly_prod_list).unwrap().len(); + + let noncommit_size = bincode::serialize(&self.block_r1cs_sat_proof).unwrap().len() + + bincode::serialize(&self.block_inst_evals_bound_rp).unwrap().len() + + bincode::serialize(&self.block_inst_evals_list).unwrap().len() + + + bincode::serialize(&self.pairwise_check_r1cs_sat_proof).unwrap().len() + + bincode::serialize(&self.pairwise_check_inst_evals_bound_rp).unwrap().len() + + bincode::serialize(&self.pairwise_check_inst_evals_list).unwrap().len() + + + bincode::serialize(&self.perm_root_r1cs_sat_proof).unwrap().len() + + bincode::serialize(&self.perm_root_inst_evals).unwrap().len() + + + bincode::serialize(&self.perm_poly_poly_list).unwrap().len() + + // + bincode::serialize(&self.shift_proof).unwrap().len() + + bincode::serialize(&self.io_proof).unwrap().len(); + (dense_commit_size, sparse_commit_size, noncommit_size) + } + /// A public computation to create a commitment to a list of R1CS instances pub fn multi_encode( inst: &Instance, @@ -1831,6 +1891,35 @@ impl SNARK { }; timer_commit.stop(); + // Record total size of witnesses: + let block_witness_sizes: Vec = [ + block_vars_prover.poly_w.iter().map(|i| i.len()).collect::>(), + block_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), + block_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), + block_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>() + ].concat(); + let exec_witness_sizes: Vec = [ + exec_inputs_prover.poly_w.iter().map(|i| i.len()).collect::>(), + perm_exec_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), + perm_exec_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), + perm_exec_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>(), + ].concat(); + let mem_witness_sizes: Vec = [ + addr_phy_mems_prover.poly_w.iter().map(|i| i.len()).collect::>(), + phy_mem_addr_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), + phy_mem_addr_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), + phy_mem_addr_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>(), + addr_vir_mems_prover.poly_w.iter().map(|i| i.len()).collect::>(), + addr_ts_bits_prover.poly_w.iter().map(|i| i.len()).collect::>(), + vir_mem_addr_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), + vir_mem_addr_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), + vir_mem_addr_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>(), + ].concat(); + + println!("BLOCK WITNESSES: {:?} Goldilocks", block_witness_sizes); + println!("EXEC WITNESSES: {:?} Goldilocks", exec_witness_sizes); + println!("MEM WITNESSES: {:?} Goldilocks", mem_witness_sizes); + // -- // BLOCK_CORRECTNESS_EXTRACT // -- @@ -2368,14 +2457,8 @@ impl SNARK { transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - let proof_size = bincode::serialize(&self).unwrap().len(); - let commit_size = bincode::serialize(&block_comm_list).unwrap().len() + - // bincode::serialize(&block_gens).unwrap().len() + - bincode::serialize(&pairwise_check_comm).unwrap().len() + - // bincode::serialize(&pairwise_check_gens).unwrap().len() + - bincode::serialize(&perm_root_comm).unwrap().len(); - // bincode::serialize(&perm_root_gens).unwrap().len(); - let meta_size = + let (_, _, sumcheck_size) = self.compute_size(); + let meta_size = // usize 19 * std::mem::size_of::() + // Vec or Vec> @@ -2387,8 +2470,8 @@ impl SNARK { // Other vectors bincode::serialize(input).unwrap().len() + bincode::serialize(output).unwrap().len(); - // Everything else - // bincode::serialize(vars_gens).unwrap().len(); + // Everything else + // bincode::serialize(vars_gens).unwrap().len(); let timer_verify = Timer::new("SNARK::verify"); >::append_protocol_name( @@ -3288,10 +3371,8 @@ impl SNARK { timer_verify.stop(); - println!("PROOF SIZE: {}", proof_size); - println!("COMMIT SIZE: {}", commit_size); - println!("META SIZE: {}", meta_size); - println!("Total Proof Size: {}", proof_size + commit_size + meta_size); + println!("SUMCHECK SIZE: {} bytes", sumcheck_size); + println!("META SIZE: {} bytes", meta_size); Ok(()) } diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok index 8f0c9642..c84f7e85 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok @@ -1683,4 +1683,4 @@ def main() -> field: cumulated_hash = cumulated_hash + hashes.state0 + hashes.state1 + hashes.state2 + hashes.state3 + hashes.state4 + hashes.state5 + hashes.state6 + hashes.state7 + hashes.state8 + hashes.state9 + hashes.state10 + hashes.state11 endfor - return cumulated_hash + return cumulated_hash \ No newline at end of file From 8d3679c19edd3890c62597af70cb7836f495781c Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 9 Dec 2024 15:55:08 -0500 Subject: [PATCH 10/54] Update zxc --- circ_blocks/aaa | 5222 +++++++++++++++++ circ_blocks/bbb | 5180 ++++++++++++++++ circ_blocks/examples/zxc.rs | 4 +- .../poseidon_test/poseidon_struct.zok | 2 +- 4 files changed, 10405 insertions(+), 3 deletions(-) create mode 100644 circ_blocks/aaa create mode 100644 circ_blocks/bbb diff --git a/circ_blocks/aaa b/circ_blocks/aaa new file mode 100644 index 00000000..9f1aaff0 --- /dev/null +++ b/circ_blocks/aaa @@ -0,0 +1,5222 @@ +Options { path: "poseidon_test/poseidon_struct", skip_linred: false, circ: CircOpt { r1cs: R1csOpt { verified: false, profile: false, div_by_zero: Incomplete, lc_elim_thresh: 50 }, field: FieldOpt { builtin: Goldilocks, custom_modulus: "" }, ir: IrOpt { field_to_bv: Wrap, frequent_gc: false }, ram: RamOpt { enabled: false, range: Sort, index: Uniqueness, permutation: Msh, rom: Haboeck }, fmt: FmtOpt { use_default_field: true, hide_field: false }, zsharp: ZsharpOpt { isolate_asserts: true }, datalog: DatalogOpt { rec_limit: 5, lint_prim_rec: false }, c: COpt { sv_functions: false, assert_no_ub: false } }, action: Count, quiet: false, no_opt: false } +Generating Compiler Time Data... +Entry block: 0 + +Block 0: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field %BP = 0 + field %TS = 0 +Transition: -> 1 + +Block 1: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 2 + +Block 2: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field struct^0^state0.main.0.0 = 1 + field struct^0^state1.main.0.0 = 2 + field struct^0^state2.main.0.0 = 3 + field struct^0^state3.main.0.0 = 4 + field struct^0^state4.main.0.0 = 5 + field struct^0^state5.main.0.0 = 6 + field struct^0^state6.main.0.0 = 7 + field struct^0^state7.main.0.0 = 8 + field struct^0^state8.main.0.0 = 0 + field struct^0^state9.main.0.0 = 0 + field struct^0^state10.main.0.0 = 0 + field struct^0^state11.main.0.0 = 0 + field inputs^state0.main.0.0 = struct^0^state0.main.0.0 + field inputs^state1.main.0.0 = struct^0^state1.main.0.0 + field inputs^state10.main.0.0 = struct^0^state10.main.0.0 + field inputs^state11.main.0.0 = struct^0^state11.main.0.0 + field inputs^state2.main.0.0 = struct^0^state2.main.0.0 + field inputs^state3.main.0.0 = struct^0^state3.main.0.0 + field inputs^state4.main.0.0 = struct^0^state4.main.0.0 + field inputs^state5.main.0.0 = struct^0^state5.main.0.0 + field inputs^state6.main.0.0 = struct^0^state6.main.0.0 + field inputs^state7.main.0.0 = struct^0^state7.main.0.0 + field inputs^state8.main.0.0 = struct^0^state8.main.0.0 + field inputs^state9.main.0.0 = struct^0^state9.main.0.0 + field cumulated_hash.main.0.0 = 0 +Transition: -> 3 + +Block 3: +Func: main, Scope: 1 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + u32 i.main.0.0 = 0 +Transition: + i.main.0.0 != 1000000 ? -> 4 : -> 8 + +Block 4: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 5 + +Block 5: +Func: main, Scope: 3 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field input^state0.poseidon.0.0 = inputs^state0.main.0.0 + field input^state1.poseidon.0.0 = inputs^state1.main.0.0 + field input^state10.poseidon.0.0 = inputs^state10.main.0.0 + field input^state11.poseidon.0.0 = inputs^state11.main.0.0 + field input^state2.poseidon.0.0 = inputs^state2.main.0.0 + field input^state3.poseidon.0.0 = inputs^state3.main.0.0 + field input^state4.poseidon.0.0 = inputs^state4.main.0.0 + field input^state5.poseidon.0.0 = inputs^state5.main.0.0 + field input^state6.poseidon.0.0 = inputs^state6.main.0.0 + field input^state7.poseidon.0.0 = inputs^state7.main.0.0 + field input^state8.poseidon.0.0 = inputs^state8.main.0.0 + field input^state9.poseidon.0.0 = inputs^state9.main.0.0 + field rp@.poseidon = 6 +Transition: -> 11 + +Block 6: +Func: main, Scope: 3 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field ret^0^state0.main.0.0 = %RET^state0.poseidon + field ret^0^state1.main.0.0 = %RET^state1.poseidon + field ret^0^state10.main.0.0 = %RET^state10.poseidon + field ret^0^state11.main.0.0 = %RET^state11.poseidon + field ret^0^state2.main.0.0 = %RET^state2.poseidon + field ret^0^state3.main.0.0 = %RET^state3.poseidon + field ret^0^state4.main.0.0 = %RET^state4.poseidon + field ret^0^state5.main.0.0 = %RET^state5.poseidon + field ret^0^state6.main.0.0 = %RET^state6.poseidon + field ret^0^state7.main.0.0 = %RET^state7.poseidon + field ret^0^state8.main.0.0 = %RET^state8.poseidon + field ret^0^state9.main.0.0 = %RET^state9.poseidon + field hashes^state0.main.0.0 = ret^0^state0.main.0.0 + field hashes^state1.main.0.0 = ret^0^state1.main.0.0 + field hashes^state10.main.0.0 = ret^0^state10.main.0.0 + field hashes^state11.main.0.0 = ret^0^state11.main.0.0 + field hashes^state2.main.0.0 = ret^0^state2.main.0.0 + field hashes^state3.main.0.0 = ret^0^state3.main.0.0 + field hashes^state4.main.0.0 = ret^0^state4.main.0.0 + field hashes^state5.main.0.0 = ret^0^state5.main.0.0 + field hashes^state6.main.0.0 = ret^0^state6.main.0.0 + field hashes^state7.main.0.0 = ret^0^state7.main.0.0 + field hashes^state8.main.0.0 = ret^0^state8.main.0.0 + field hashes^state9.main.0.0 = ret^0^state9.main.0.0 + field cumulated_hash.main.0.0 = cumulated_hash.main.0.0 + hashes^state0.main.0.0 + hashes^state1.main.0.0 + hashes^state2.main.0.0 + hashes^state3.main.0.0 + hashes^state4.main.0.0 + hashes^state5.main.0.0 + hashes^state6.main.0.0 + hashes^state7.main.0.0 + hashes^state8.main.0.0 + hashes^state9.main.0.0 + hashes^state10.main.0.0 + hashes^state11.main.0.0 +Transition: -> 7 + +Block 7: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + i.main.0.0 = i.main.0.0 + 1 +Transition: + i.main.0.0 != 1000000 ? -> 4 : -> 8 + +Block 8: +Func: main, Scope: 1 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 9 + +Block 9: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field %RET.main = cumulated_hash.main.0.0 +Program terminates. + +Block 10: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Program terminates. + +Block 11: +Func: poseidon, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field state0.poseidon.0.0 = input^state0.poseidon.0.0 + field state1.poseidon.0.0 = input^state1.poseidon.0.0 + field state2.poseidon.0.0 = input^state2.poseidon.0.0 + field state3.poseidon.0.0 = input^state3.poseidon.0.0 + field state4.poseidon.0.0 = input^state4.poseidon.0.0 + field state5.poseidon.0.0 = input^state5.poseidon.0.0 + field state6.poseidon.0.0 = input^state6.poseidon.0.0 + field state7.poseidon.0.0 = input^state7.poseidon.0.0 + field state8.poseidon.0.0 = input^state8.poseidon.0.0 + field state9.poseidon.0.0 = input^state9.poseidon.0.0 + field state10.poseidon.0.0 = input^state10.poseidon.0.0 + field state11.poseidon.0.0 = input^state11.poseidon.0.0 + field c0.poseidon.0.0 = 13080132714287612933 + field c1.poseidon.0.0 = 8594738767457295063 + field c2.poseidon.0.0 = 12896916465481390516 + field c3.poseidon.0.0 = 1109962092811921367 + field c4.poseidon.0.0 = 16216730422861946898 + field c5.poseidon.0.0 = 10137062673499593713 + field c6.poseidon.0.0 = 15292064466732465823 + field c7.poseidon.0.0 = 17255573294985989181 + field c8.poseidon.0.0 = 14827154241873003558 + field c9.poseidon.0.0 = 2846171647972703231 + field c1.poseidon.0.0 = 16246264663680317601 + field c11.poseidon.0.0 = 14214208087951879286 + field c12.poseidon.0.0 = 9667108687426275457 + field c13.poseidon.0.0 = 6470857420712283733 + field c14.poseidon.0.0 = 14103331940138337652 + field c15.poseidon.0.0 = 11854816473550292865 + field c16.poseidon.0.0 = 3498097497301325516 + field c17.poseidon.0.0 = 7947235692523864220 + field c18.poseidon.0.0 = 11110078701231901946 + field c19.poseidon.0.0 = 16384314112672821048 + field c2.poseidon.0.0 = 15404405912655775739 + field c21.poseidon.0.0 = 14077880830714445579 + field c22.poseidon.0.0 = 9555554662709218279 + field c23.poseidon.0.0 = 13859595358210603949 + field c24.poseidon.0.0 = 16859897325061800066 + field c25.poseidon.0.0 = 17685474420222222349 + field c26.poseidon.0.0 = 17858764734618734949 + field c27.poseidon.0.0 = 9410011022665866671 + field c28.poseidon.0.0 = 12495243629579414666 + field c29.poseidon.0.0 = 12416945298171515742 + field c3.poseidon.0.0 = 5776666812364270983 + field c31.poseidon.0.0 = 6314421662864060481 + field c32.poseidon.0.0 = 7402742471423223171 + field c33.poseidon.0.0 = 982536713192432718 + field c34.poseidon.0.0 = 17321168865775127905 + field c35.poseidon.0.0 = 2934354895005980211 + field c36.poseidon.0.0 = 10567510598607410195 + field c37.poseidon.0.0 = 8135543733717919110 + field c38.poseidon.0.0 = 116353493081713692 + field c39.poseidon.0.0 = 8029688163494945618 + field c4.poseidon.0.0 = 9003846637224807585 + field c41.poseidon.0.0 = 7052445132467233849 + field c42.poseidon.0.0 = 9645665432288852853 + field c43.poseidon.0.0 = 5446430061030868787 + field c44.poseidon.0.0 = 16770910634346036823 + field c45.poseidon.0.0 = 17708360571433944729 + field c46.poseidon.0.0 = 4661556288322237631 + field c47.poseidon.0.0 = 11977051899316327985 + field c48.poseidon.0.0 = 4378616569090929672 + field c49.poseidon.0.0 = 3334807502817538491 + field c5.poseidon.0.0 = 8019184735943344966 + field c51.poseidon.0.0 = 2395043908812246395 + field c52.poseidon.0.0 = 6558421058331732611 + field c53.poseidon.0.0 = 11735894060727326369 + field c54.poseidon.0.0 = 8143540538889204488 + field c55.poseidon.0.0 = 5991753489563751169 + field c56.poseidon.0.0 = 12235918791502088007 + field c57.poseidon.0.0 = 2880312033702687139 + field c58.poseidon.0.0 = 18224748115308382355 + field c59.poseidon.0.0 = 18070411013125314165 + field c6.poseidon.0.0 = 8156487614120951180 + field c61.poseidon.0.0 = 10615269510047010719 + field c62.poseidon.0.0 = 12489426404754222075 + field c63.poseidon.0.0 = 5055279340069995710 + field c64.poseidon.0.0 = 7231927319780248664 + field c65.poseidon.0.0 = 2602078848106763799 + field c66.poseidon.0.0 = 12445944369334781425 + field c67.poseidon.0.0 = 3978905923892496205 + field c68.poseidon.0.0 = 16711272944329818038 + field c69.poseidon.0.0 = 10439032361227108922 + field c7.poseidon.0.0 = 15110119871725214866 + field c71.poseidon.0.0 = 821141790655890946 + field c72.poseidon.0.0 = 11073536380651186235 + field c73.poseidon.0.0 = 4866839313097607757 + field c74.poseidon.0.0 = 13118391689513956636 + field c75.poseidon.0.0 = 14527674973762312380 + field c76.poseidon.0.0 = 7612751959265567999 + field c77.poseidon.0.0 = 6808090907814178161 + field c78.poseidon.0.0 = 6899703779492644997 + field c79.poseidon.0.0 = 3664666286336986826 + field c8.poseidon.0.0 = 783179505424462608 + field c81.poseidon.0.0 = 8990689241814097697 + field c82.poseidon.0.0 = 9646603555412825679 + field c83.poseidon.0.0 = 7351246026167205041 + field c84.poseidon.0.0 = 16970959813722173256 + field c85.poseidon.0.0 = 15735726858241466429 + field c86.poseidon.0.0 = 10347018221892268419 + field c87.poseidon.0.0 = 12195545878449322889 + field c88.poseidon.0.0 = 7423314197114049891 + field c89.poseidon.0.0 = 14908016116973904153 + field c9.poseidon.0.0 = 5840340122527363265 + field c91.poseidon.0.0 = 17740311462440614128 + field c92.poseidon.0.0 = 815306421953744623 + field c93.poseidon.0.0 = 17456357368219253949 + field c94.poseidon.0.0 = 6982651076559329072 + field c95.poseidon.0.0 = 11970987324614963868 + field c96.poseidon.0.0 = 8167785008538063246 + field c97.poseidon.0.0 = 9483259819397403968 + field c98.poseidon.0.0 = 954550221664291548 + field c99.poseidon.0.0 = 10339565171024313256 + field c1.poseidon.0.0 = 8651171084286500102 + field c11.poseidon.0.0 = 16974445528003515956 + field c12.poseidon.0.0 = 15104530047940621190 + field c13.poseidon.0.0 = 103271880867179718 + field c14.poseidon.0.0 = 14654666245504492663 + field c15.poseidon.0.0 = 12445769555936887967 + field c16.poseidon.0.0 = 11250582358051997490 + field c17.poseidon.0.0 = 6730977207490590241 + field c18.poseidon.0.0 = 15919951556166196935 + field c19.poseidon.0.0 = 4423540216573360915 + field c110.poseidon.0.0 = 16317664700341473511 + field c111.poseidon.0.0 = 4723997214951767765 + field c112.poseidon.0.0 = 10098756619006575500 + field c113.poseidon.0.0 = 3223149401237667964 + field c114.poseidon.0.0 = 6870494874300767682 + field c115.poseidon.0.0 = 2902095711130291898 + field c116.poseidon.0.0 = 7159372652788439733 + field c117.poseidon.0.0 = 11500508372997952671 + field c118.poseidon.0.0 = 13348148181479462670 + field c119.poseidon.0.0 = 12729401155983882093 + field c120.poseidon.0.0 = 15021242795466053388 + field c121.poseidon.0.0 = 3802990509227527157 + field c122.poseidon.0.0 = 4665459515680145682 + field c123.poseidon.0.0 = 13165553315407675603 + field c124.poseidon.0.0 = 6496364397926233172 + field c125.poseidon.0.0 = 12800832566287577810 + field c126.poseidon.0.0 = 9737592377590267426 + field c127.poseidon.0.0 = 8687131091302514939 + field c128.poseidon.0.0 = 1488200421755445892 + field c129.poseidon.0.0 = 11004377668730991641 + field c130.poseidon.0.0 = 13516338734600228410 + field c131.poseidon.0.0 = 2953581820660217936 + field c132.poseidon.0.0 = 3505040783153922951 + field c133.poseidon.0.0 = 3710332827435113697 + field c134.poseidon.0.0 = 15414874040873320221 + field c135.poseidon.0.0 = 8602547649919482301 + field c136.poseidon.0.0 = 13971349938398812007 + field c137.poseidon.0.0 = 187239246702636066 + field c138.poseidon.0.0 = 12886019973971254144 + field c139.poseidon.0.0 = 4512274763990493707 + field c140.poseidon.0.0 = 2986635507805503192 + field c141.poseidon.0.0 = 2315252455709119454 + field c142.poseidon.0.0 = 12537995864054210246 + field c143.poseidon.0.0 = 2039491936479859267 + field c144.poseidon.0.0 = 1558644089185031256 + field c145.poseidon.0.0 = 4074089203264759305 + field c146.poseidon.0.0 = 2522268501749395707 + field c147.poseidon.0.0 = 3414760436185256196 + field c148.poseidon.0.0 = 17420887529146466921 + field c149.poseidon.0.0 = 2817020417938125001 + field c150.poseidon.0.0 = 16538346563888261485 + field c151.poseidon.0.0 = 5592270336833998770 + field c152.poseidon.0.0 = 16876602064684906232 + field c153.poseidon.0.0 = 1793025614521516343 + field c154.poseidon.0.0 = 2178510518148748532 + field c155.poseidon.0.0 = 2726440714374752509 + field c156.poseidon.0.0 = 6502946837278398021 + field c157.poseidon.0.0 = 15816362857667988792 + field c158.poseidon.0.0 = 12997958454165692924 + field c159.poseidon.0.0 = 5314892854495903792 + field c160.poseidon.0.0 = 15533907063555687782 + field c161.poseidon.0.0 = 12312015675698548715 + field c162.poseidon.0.0 = 14140016464013350248 + field c163.poseidon.0.0 = 16325589062962838690 + field c164.poseidon.0.0 = 6796145646370327654 + field c165.poseidon.0.0 = 1168753512742361735 + field c166.poseidon.0.0 = 4100789820704709368 + field c167.poseidon.0.0 = 15947554381540469177 + field c168.poseidon.0.0 = 8597377839806076919 + field c169.poseidon.0.0 = 9704018824195918000 + field c170.poseidon.0.0 = 12763288618765762688 + field c171.poseidon.0.0 = 17249257732622847695 + field c172.poseidon.0.0 = 1998710993415069759 + field c173.poseidon.0.0 = 923759906393011543 + field c174.poseidon.0.0 = 1271051229666811593 + field c175.poseidon.0.0 = 17822362132088738077 + field c176.poseidon.0.0 = 11797234543722669271 + field c177.poseidon.0.0 = 5864538787265942447 + field c178.poseidon.0.0 = 15975583211110506970 + field c179.poseidon.0.0 = 7258516085733671960 + field c180.poseidon.0.0 = 17999926471875633100 + field c181.poseidon.0.0 = 635992114476018166 + field c182.poseidon.0.0 = 17205047318256576347 + field c183.poseidon.0.0 = 17384900867876315312 + field c184.poseidon.0.0 = 16484825562915784226 + field c185.poseidon.0.0 = 16694130609036138894 + field c186.poseidon.0.0 = 10575069350371260875 + field c187.poseidon.0.0 = 8330575162062887277 + field c188.poseidon.0.0 = 6212375704691932880 + field c189.poseidon.0.0 = 15965138197626618226 + field c190.poseidon.0.0 = 14285453069600046939 + field c191.poseidon.0.0 = 10005163510208402517 + field c192.poseidon.0.0 = 885298637936952595 + field c193.poseidon.0.0 = 541790758138118921 + field c194.poseidon.0.0 = 5985203084790372993 + field c195.poseidon.0.0 = 4685030219775483721 + field c196.poseidon.0.0 = 1411106851304815020 + field c197.poseidon.0.0 = 11290732479954096478 + field c198.poseidon.0.0 = 208280581124868513 + field c199.poseidon.0.0 = 10979018648467968495 + field c2.poseidon.0.0 = 8600643745023338215 + field c21.poseidon.0.0 = 3477453626867126061 + field c22.poseidon.0.0 = 6428436309340258604 + field c23.poseidon.0.0 = 5695415667275657934 + field c24.poseidon.0.0 = 15952065508715623490 + field c25.poseidon.0.0 = 15571300830419767248 + field c26.poseidon.0.0 = 17259785660502616862 + field c27.poseidon.0.0 = 4298425495274316083 + field c28.poseidon.0.0 = 9023601070579319352 + field c29.poseidon.0.0 = 7353589709321807492 + field c210.poseidon.0.0 = 2988848909076209475 + field c211.poseidon.0.0 = 10439527789422046135 + field c212.poseidon.0.0 = 6097734044161429459 + field c213.poseidon.0.0 = 1113429873817861476 + field c214.poseidon.0.0 = 1639063372386966591 + field c215.poseidon.0.0 = 7863102812716788759 + field c216.poseidon.0.0 = 216040220732135364 + field c217.poseidon.0.0 = 14252611488623712688 + field c218.poseidon.0.0 = 9543395466794536974 + field c219.poseidon.0.0 = 2714461051639810934 + field c220.poseidon.0.0 = 2588317208781407279 + field c221.poseidon.0.0 = 15458529123534594916 + field c222.poseidon.0.0 = 15748417817551040856 + field c223.poseidon.0.0 = 16414455697114422951 + field c224.poseidon.0.0 = 13378164466674639511 + field c225.poseidon.0.0 = 13894319928411294675 + field c226.poseidon.0.0 = 5032680892090751540 + field c227.poseidon.0.0 = 17201338494743078916 + field c228.poseidon.0.0 = 4397422800601932505 + field c229.poseidon.0.0 = 11285062031581972327 + field c230.poseidon.0.0 = 7309354640676468207 + field c231.poseidon.0.0 = 10457152817239331848 + field c232.poseidon.0.0 = 8855911538863247046 + field c233.poseidon.0.0 = 4301853449821814398 + field c234.poseidon.0.0 = 13001502396339103326 + field c235.poseidon.0.0 = 10218424535115580246 + field c236.poseidon.0.0 = 8628244713920681895 + field c237.poseidon.0.0 = 17410423622514037261 + field c238.poseidon.0.0 = 14080683768439215375 + field c239.poseidon.0.0 = 11453161143447188100 + field c240.poseidon.0.0 = 16761509772042181939 + field c241.poseidon.0.0 = 6688821660695954082 + field c242.poseidon.0.0 = 12083434295263160416 + field c243.poseidon.0.0 = 8540021431714616589 + field c244.poseidon.0.0 = 6891616215679974226 + field c245.poseidon.0.0 = 10229217098454812721 + field c246.poseidon.0.0 = 3292165387203778711 + field c247.poseidon.0.0 = 6090113424998243490 + field c248.poseidon.0.0 = 13431780521962358660 + field c249.poseidon.0.0 = 6061081364215809883 + field c250.poseidon.0.0 = 16792066504222214142 + field c251.poseidon.0.0 = 16134314044798124799 + field c252.poseidon.0.0 = 17070233710126619765 + field c253.poseidon.0.0 = 6915716851370550800 + field c254.poseidon.0.0 = 9505009849073026581 + field c255.poseidon.0.0 = 6422700465081897153 + field c256.poseidon.0.0 = 17977653991560529185 + field c257.poseidon.0.0 = 5800870252836247255 + field c258.poseidon.0.0 = 12096124733159345520 + field c259.poseidon.0.0 = 7679273623392321940 + field c260.poseidon.0.0 = 17835783910585744964 + field c261.poseidon.0.0 = 2478664878205754377 + field c262.poseidon.0.0 = 1720314468413114967 + field c263.poseidon.0.0 = 10376757819003248056 + field c264.poseidon.0.0 = 10376377187857634245 + field c265.poseidon.0.0 = 13344930747504284997 + field c266.poseidon.0.0 = 11579281865160153596 + field c267.poseidon.0.0 = 10300256980048736962 + field c268.poseidon.0.0 = 378765236515040565 + field c269.poseidon.0.0 = 11412420941557253424 + field c270.poseidon.0.0 = 12931662470734252786 + field c271.poseidon.0.0 = 43018908376346374 + field c272.poseidon.0.0 = 3589810689190160071 + field c273.poseidon.0.0 = 4688229274750659741 + field c274.poseidon.0.0 = 13688957436484306091 + field c275.poseidon.0.0 = 11424740943016984272 + field c276.poseidon.0.0 = 16001900718237913960 + field c277.poseidon.0.0 = 5548469743008097574 + field c278.poseidon.0.0 = 14584404916672178680 + field c279.poseidon.0.0 = 3396622135873576824 + field c280.poseidon.0.0 = 7861729246871155992 + field c281.poseidon.0.0 = 16112271126908045545 + field c282.poseidon.0.0 = 16988163966860016012 + field c283.poseidon.0.0 = 273641680619529493 + field c284.poseidon.0.0 = 15222677154027327363 + field c285.poseidon.0.0 = 4070328078309830604 + field c286.poseidon.0.0 = 13520458500363296391 + field c287.poseidon.0.0 = 8235111705801363015 + field c288.poseidon.0.0 = 5575990058472514138 + field c289.poseidon.0.0 = 2751301609188252989 + field c290.poseidon.0.0 = 6478598528223547074 + field c291.poseidon.0.0 = 386565553848556638 + field c292.poseidon.0.0 = 9417729078939938713 + field c293.poseidon.0.0 = 15204315939835727483 + field c294.poseidon.0.0 = 14942015033780606261 + field c295.poseidon.0.0 = 18369423901636582012 + field c296.poseidon.0.0 = 4715338437538604447 + field c297.poseidon.0.0 = 6840590980607806319 + field c298.poseidon.0.0 = 5535471161490539014 + field c299.poseidon.0.0 = 5341328005359029952 + field c3.poseidon.0.0 = 1475161295215894444 + field c31.poseidon.0.0 = 7999197814297036636 + field c32.poseidon.0.0 = 2984233088665867938 + field c33.poseidon.0.0 = 3097746028144832229 + field c34.poseidon.0.0 = 8849530863480031517 + field c35.poseidon.0.0 = 7464920943249009773 + field c36.poseidon.0.0 = 3802996844641460514 + field c37.poseidon.0.0 = 6284458522545927646 + field c38.poseidon.0.0 = 2307388003445002779 + field c39.poseidon.0.0 = 4461479354745457623 + field c310.poseidon.0.0 = 1649739722664588460 + field c311.poseidon.0.0 = 3008391274160432867 + field c312.poseidon.0.0 = 5142217010456550622 + field c313.poseidon.0.0 = 1775580461722730120 + field c314.poseidon.0.0 = 161694268822794344 + field c315.poseidon.0.0 = 1518963253808031703 + field c316.poseidon.0.0 = 16475258091652710137 + field c317.poseidon.0.0 = 119575899007375159 + field c318.poseidon.0.0 = 1275863735937973999 + field c319.poseidon.0.0 = 16539412514520642374 + field c320.poseidon.0.0 = 2303365191438051950 + field c321.poseidon.0.0 = 6435126839960916075 + field c322.poseidon.0.0 = 17794599201026020053 + field c323.poseidon.0.0 = 13847097589277840330 + field c324.poseidon.0.0 = 16645869274577729720 + field c325.poseidon.0.0 = 8039205965509554440 + field c326.poseidon.0.0 = 4788586935019371140 + field c327.poseidon.0.0 = 15129007200040077746 + field c328.poseidon.0.0 = 2055561615223771341 + field c329.poseidon.0.0 = 4149731103701412892 + field c330.poseidon.0.0 = 10268130195734144189 + field c331.poseidon.0.0 = 13406631635880074708 + field c332.poseidon.0.0 = 11429218277824986203 + field c333.poseidon.0.0 = 15773968030812198565 + field c334.poseidon.0.0 = 16050275277550506872 + field c335.poseidon.0.0 = 11858586752031736643 + field c336.poseidon.0.0 = 8927746344866569756 + field c337.poseidon.0.0 = 11802068403177695792 + field c338.poseidon.0.0 = 157833420806751556 + field c339.poseidon.0.0 = 4698875910749767878 + field c340.poseidon.0.0 = 1616722774788291698 + field c341.poseidon.0.0 = 3990951895163748090 + field c342.poseidon.0.0 = 16758609224720795472 + field c343.poseidon.0.0 = 3045571693290741477 + field c344.poseidon.0.0 = 9281634245289836419 + field c345.poseidon.0.0 = 13517688176723875370 + field c346.poseidon.0.0 = 7961395585333219380 + field c347.poseidon.0.0 = 1606574359105691080 + field c348.poseidon.0.0 = 17564372683613562171 + field c349.poseidon.0.0 = 4664015225343144418 + field c350.poseidon.0.0 = 6133721340680280128 + field c351.poseidon.0.0 = 2667022304383014929 + field c352.poseidon.0.0 = 12316557761857340230 + field c353.poseidon.0.0 = 10375614850625292317 + field c354.poseidon.0.0 = 8141542666379135068 + field c355.poseidon.0.0 = 9185476451083834432 + field c356.poseidon.0.0 = 4991072365274649547 + field c357.poseidon.0.0 = 17398204971778820365 + field c358.poseidon.0.0 = 16127888338958422584 + field c359.poseidon.0.0 = 13586792051317758204 + field mc.poseidon.0.0 = 17 + field mc1.poseidon.0.0 = 15 + field mc2.poseidon.0.0 = 41 + field mc3.poseidon.0.0 = 16 + field mc4.poseidon.0.0 = 2 + field mc5.poseidon.0.0 = 28 + field mc6.poseidon.0.0 = 13 + field mc7.poseidon.0.0 = 13 + field mc8.poseidon.0.0 = 39 + field mc9.poseidon.0.0 = 18 + field mc10.poseidon.0.0 = 34 + field mc11.poseidon.0.0 = 20 + field md.poseidon.0.0 = 8 + field md1.poseidon.0.0 = 0 + field md2.poseidon.0.0 = 0 + field md3.poseidon.0.0 = 0 + field md4.poseidon.0.0 = 0 + field md5.poseidon.0.0 = 0 + field md6.poseidon.0.0 = 0 + field md7.poseidon.0.0 = 0 + field md8.poseidon.0.0 = 0 + field md9.poseidon.0.0 = 0 + field md10.poseidon.0.0 = 0 + field md11.poseidon.0.0 = 0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c0.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c1.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c2.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c3.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c4.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c5.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c6.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c7.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c8.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c9.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c1.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c11.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c12.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c13.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c14.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c15.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c16.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c17.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c18.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c19.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c2.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c21.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c22.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c23.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c24.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c25.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c26.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c27.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c28.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c29.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c3.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c31.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c32.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c33.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c34.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c35.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c36.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c37.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c38.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c39.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c4.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c41.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c42.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c43.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c44.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c45.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c46.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c47.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c48.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c49.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c5.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c51.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c52.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c53.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c54.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c55.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c56.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c57.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c58.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c59.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c6.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c61.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c62.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c63.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c64.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c65.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c66.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c67.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c68.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c69.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c7.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c71.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c72.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c73.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c74.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c75.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c76.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c77.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c78.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c79.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c8.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c81.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c82.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c83.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c84.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c85.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c86.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c87.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c88.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c89.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c9.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c91.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c92.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c93.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c94.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c95.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c96.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c97.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c98.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c99.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c1.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c11.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c12.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c13.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c14.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c15.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c16.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c17.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c18.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c19.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c110.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c111.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c112.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c113.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c114.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c115.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c116.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c117.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c118.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c119.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c120.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c121.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c122.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c123.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c124.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c125.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c126.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c127.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c128.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c129.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c130.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c131.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c132.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c133.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c134.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c135.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c136.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c137.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c138.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c139.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c140.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c141.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c142.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c143.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c144.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c145.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c146.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c147.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c148.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c149.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c150.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c151.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c152.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c153.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c154.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c155.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c156.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c157.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c158.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c159.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c160.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c161.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c162.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c163.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c164.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c165.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c166.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c167.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c168.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c169.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c170.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c171.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c172.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c173.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c174.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c175.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c176.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c177.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c178.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c179.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c180.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c181.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c182.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c183.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c184.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c185.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c186.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c187.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c188.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c189.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c190.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c191.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c192.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c193.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c194.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c195.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c196.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c197.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c198.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c199.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c2.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c21.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c22.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c23.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c24.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c25.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c26.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c27.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c28.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c29.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c210.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c211.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c212.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c213.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c214.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c215.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c216.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c217.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c218.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c219.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c220.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c221.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c222.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c223.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c224.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c225.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c226.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c227.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c228.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c229.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c230.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c231.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c232.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c233.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c234.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c235.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c236.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c237.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c238.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c239.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c240.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c241.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c242.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c243.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c244.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c245.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c246.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c247.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c248.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c249.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c250.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c251.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c252.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c253.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c254.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c255.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c256.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c257.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c258.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c259.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c260.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c261.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c262.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c263.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c264.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c265.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c266.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c267.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c268.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c269.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c270.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c271.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c272.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c273.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c274.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c275.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c276.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c277.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c278.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c279.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c280.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c281.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c282.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c283.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c284.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c285.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c286.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c287.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c288.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c289.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c290.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c291.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c292.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c293.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c294.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c295.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c296.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c297.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c298.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c299.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c3.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c31.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c32.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c33.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c34.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c35.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c36.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c37.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c38.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c39.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c310.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c311.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c312.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c313.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c314.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c315.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c316.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c317.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c318.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c319.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c320.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c321.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c322.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c323.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c324.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c325.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c326.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c327.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c328.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c329.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c330.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c331.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c332.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c333.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c334.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c335.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c336.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c337.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c338.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c339.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c340.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c341.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c342.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c343.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c344.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c345.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c346.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c347.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c348.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c349.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c350.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c351.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c352.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c353.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c354.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c355.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c356.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c357.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c358.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c359.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field struct^0^state0.poseidon.0.0 = state0.poseidon.0.0 + field struct^0^state1.poseidon.0.0 = state1.poseidon.0.0 + field struct^0^state2.poseidon.0.0 = state2.poseidon.0.0 + field struct^0^state3.poseidon.0.0 = state3.poseidon.0.0 + field struct^0^state4.poseidon.0.0 = state4.poseidon.0.0 + field struct^0^state5.poseidon.0.0 = state5.poseidon.0.0 + field struct^0^state6.poseidon.0.0 = state6.poseidon.0.0 + field struct^0^state7.poseidon.0.0 = state7.poseidon.0.0 + field struct^0^state8.poseidon.0.0 = state8.poseidon.0.0 + field struct^0^state9.poseidon.0.0 = state9.poseidon.0.0 + field struct^0^state10.poseidon.0.0 = state10.poseidon.0.0 + field struct^0^state11.poseidon.0.0 = state11.poseidon.0.0 + field %RET^state0.poseidon = struct^0^state0.poseidon.0.0 + field %RET^state1.poseidon = struct^0^state1.poseidon.0.0 + field %RET^state10.poseidon = struct^0^state10.poseidon.0.0 + field %RET^state11.poseidon = struct^0^state11.poseidon.0.0 + field %RET^state2.poseidon = struct^0^state2.poseidon.0.0 + field %RET^state3.poseidon = struct^0^state3.poseidon.0.0 + field %RET^state4.poseidon = struct^0^state4.poseidon.0.0 + field %RET^state5.poseidon = struct^0^state5.poseidon.0.0 + field %RET^state6.poseidon = struct^0^state6.poseidon.0.0 + field %RET^state7.poseidon = struct^0^state7.poseidon.0.0 + field %RET^state8.poseidon = struct^0^state8.poseidon.0.0 + field %RET^state9.poseidon = struct^0^state9.poseidon.0.0 +Transition: -> rp@.poseidon + +Block 12: +Func: poseidon, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> rp@.poseidon + + +-- +Optimization: + + +-- +Post-Processing: +Entry block: 0 + +Block 0: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 33 +Inputs: + %i1(BN): field +Outputs: + %o1(BN): field + %o7: field + %o8: u32 + %o9: field + %o10: field + %o11: field + %o12: field + %o13: field + %o14: field + %o15: field + %o16: field + %o17: field + %o18: field + %o19: field + %o20: field +Instructions: + assert %i1(BN) == 0 + field %w5 = 1 + field %w6 = 2 + field %w7 = 3 + field %w8 = 4 + field %w9 = 5 + field %w10 = 6 + field %w11 = 7 + field %w12 = 8 + field %w13 = 0 + field %w14 = 0 + field %w15 = 0 + field %w16 = 0 + field %w17 = %w5 + field %w18 = %w6 + field %w19 = %w15 + field %w20 = %w16 + field %w21 = %w7 + field %w22 = %w8 + field %w23 = %w9 + field %w24 = %w10 + field %w25 = %w11 + field %w26 = %w12 + field %w27 = %w13 + field %w28 = %w14 + field %w29 = 0 + u32 %w30 = 0 + assert %o7 == %w29 + assert %o8 == %w30 + assert %o9 == %w17 + assert %o10 == %w18 + assert %o11 == %w19 + assert %o12 == %w20 + assert %o13 == %w21 + assert %o14 == %w22 + assert %o15 == %w23 + assert %o16 == %w24 + assert %o17 == %w25 + assert %o18 == %w26 + assert %o19 == %w27 + assert %o20 == %w28 + assert %o1(BN) == %w30 != 1000000 ? 1 : 2 +Transition: + %w30 != 1000000 ? -> 1 : -> 2 + +Block 1: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 607 +Inputs: + %i1(BN): field + %i7: field + %i8: u32 + %i9: field + %i10: field + %i11: field + %i12: field + %i13: field + %i14: field + %i15: field + %i16: field + %i17: field + %i18: field + %i19: field + %i20: field +Outputs: + %o1(BN): field + %o7: field + %o8: u32 + %o9: field + %o10: field + %o11: field + %o12: field + %o13: field + %o14: field + %o15: field + %o16: field + %o17: field + %o18: field + %o19: field + %o20: field +Instructions: + assert %i1(BN) == 1 + field %w29 = %i7 + u32 %w30 = %i8 + field %w17 = %i9 + field %w18 = %i10 + field %w19 = %i11 + field %w20 = %i12 + field %w21 = %i13 + field %w22 = %i14 + field %w23 = %i15 + field %w24 = %i16 + field %w25 = %i17 + field %w26 = %i18 + field %w27 = %i19 + field %w28 = %i20 + field %w31 = %w17 + field %w32 = %w18 + field %w33 = %w19 + field %w34 = %w20 + field %w35 = %w21 + field %w36 = %w22 + field %w37 = %w23 + field %w38 = %w24 + field %w39 = %w25 + field %w40 = %w26 + field %w41 = %w27 + field %w42 = %w28 + field %w43 = %w31 + field %w44 = %w32 + field %w45 = %w35 + field %w46 = %w36 + field %w47 = %w37 + field %w48 = %w38 + field %w49 = %w39 + field %w50 = %w40 + field %w51 = %w41 + field %w52 = %w42 + field %w53 = %w33 + field %w54 = %w34 + field %w55 = 13080132714287612933 + field %w56 = 8594738767457295063 + field %w57 = 12896916465481390516 + field %w58 = 1109962092811921367 + field %w59 = 16216730422861946898 + field %w60 = 10137062673499593713 + field %w61 = 15292064466732465823 + field %w62 = 17255573294985989181 + field %w63 = 14827154241873003558 + field %w64 = 2846171647972703231 + field %w65 = 16246264663680317601 + field %w66 = 14214208087951879286 + field %w67 = 9667108687426275457 + field %w68 = 6470857420712283733 + field %w69 = 14103331940138337652 + field %w70 = 11854816473550292865 + field %w71 = 3498097497301325516 + field %w72 = 7947235692523864220 + field %w73 = 11110078701231901946 + field %w74 = 16384314112672821048 + field %w75 = 15404405912655775739 + field %w76 = 14077880830714445579 + field %w77 = 9555554662709218279 + field %w78 = 13859595358210603949 + field %w79 = 16859897325061800066 + field %w80 = 17685474420222222349 + field %w81 = 17858764734618734949 + field %w82 = 9410011022665866671 + field %w83 = 12495243629579414666 + field %w84 = 12416945298171515742 + field %w85 = 5776666812364270983 + field %w86 = 6314421662864060481 + field %w87 = 7402742471423223171 + field %w88 = 982536713192432718 + field %w89 = 17321168865775127905 + field %w90 = 2934354895005980211 + field %w91 = 10567510598607410195 + field %w92 = 8135543733717919110 + field %w93 = 116353493081713692 + field %w94 = 8029688163494945618 + field %w95 = 9003846637224807585 + field %w96 = 7052445132467233849 + field %w97 = 9645665432288852853 + field %w98 = 5446430061030868787 + field %w99 = 16770910634346036823 + field %w100 = 17708360571433944729 + field %w101 = 4661556288322237631 + field %w102 = 11977051899316327985 + field %w103 = 4378616569090929672 + field %w104 = 3334807502817538491 + field %w105 = 8019184735943344966 + field %w106 = 2395043908812246395 + field %w107 = 6558421058331732611 + field %w108 = 11735894060727326369 + field %w109 = 8143540538889204488 + field %w110 = 5991753489563751169 + field %w111 = 12235918791502088007 + field %w112 = 2880312033702687139 + field %w113 = 18224748115308382355 + field %w114 = 18070411013125314165 + field %w115 = 8156487614120951180 + field %w116 = 10615269510047010719 + field %w117 = 12489426404754222075 + field %w118 = 5055279340069995710 + field %w119 = 7231927319780248664 + field %w120 = 2602078848106763799 + field %w121 = 12445944369334781425 + field %w122 = 3978905923892496205 + field %w123 = 16711272944329818038 + field %w124 = 10439032361227108922 + field %w125 = 15110119871725214866 + field %w126 = 821141790655890946 + field %w127 = 11073536380651186235 + field %w128 = 4866839313097607757 + field %w129 = 13118391689513956636 + field %w130 = 14527674973762312380 + field %w131 = 7612751959265567999 + field %w132 = 6808090907814178161 + field %w133 = 6899703779492644997 + field %w134 = 3664666286336986826 + field %w135 = 783179505424462608 + field %w136 = 8990689241814097697 + field %w137 = 9646603555412825679 + field %w138 = 7351246026167205041 + field %w139 = 16970959813722173256 + field %w140 = 15735726858241466429 + field %w141 = 10347018221892268419 + field %w142 = 12195545878449322889 + field %w143 = 7423314197114049891 + field %w144 = 14908016116973904153 + field %w145 = 5840340122527363265 + field %w146 = 17740311462440614128 + field %w147 = 815306421953744623 + field %w148 = 17456357368219253949 + field %w149 = 6982651076559329072 + field %w150 = 11970987324614963868 + field %w151 = 8167785008538063246 + field %w152 = 9483259819397403968 + field %w153 = 954550221664291548 + field %w154 = 10339565171024313256 + field %w155 = 8651171084286500102 + field %w156 = 16974445528003515956 + field %w157 = 15104530047940621190 + field %w158 = 103271880867179718 + field %w159 = 14654666245504492663 + field %w160 = 12445769555936887967 + field %w161 = 11250582358051997490 + field %w162 = 6730977207490590241 + field %w163 = 15919951556166196935 + field %w164 = 4423540216573360915 + field %w165 = 16317664700341473511 + field %w166 = 4723997214951767765 + field %w167 = 10098756619006575500 + field %w168 = 3223149401237667964 + field %w169 = 6870494874300767682 + field %w170 = 2902095711130291898 + field %w171 = 7159372652788439733 + field %w172 = 11500508372997952671 + field %w173 = 13348148181479462670 + field %w174 = 12729401155983882093 + field %w175 = 15021242795466053388 + field %w176 = 3802990509227527157 + field %w177 = 4665459515680145682 + field %w178 = 13165553315407675603 + field %w179 = 6496364397926233172 + field %w180 = 12800832566287577810 + field %w181 = 9737592377590267426 + field %w182 = 8687131091302514939 + field %w183 = 1488200421755445892 + field %w184 = 11004377668730991641 + field %w185 = 13516338734600228410 + field %w186 = 2953581820660217936 + field %w187 = 3505040783153922951 + field %w188 = 3710332827435113697 + field %w189 = 15414874040873320221 + field %w190 = 8602547649919482301 + field %w191 = 13971349938398812007 + field %w192 = 187239246702636066 + field %w193 = 12886019973971254144 + field %w194 = 4512274763990493707 + field %w195 = 2986635507805503192 + field %w196 = 2315252455709119454 + field %w197 = 12537995864054210246 + field %w198 = 2039491936479859267 + field %w199 = 1558644089185031256 + field %w200 = 4074089203264759305 + field %w201 = 2522268501749395707 + field %w202 = 3414760436185256196 + field %w203 = 17420887529146466921 + field %w204 = 2817020417938125001 + field %w205 = 16538346563888261485 + field %w206 = 5592270336833998770 + field %w207 = 16876602064684906232 + field %w208 = 1793025614521516343 + field %w209 = 2178510518148748532 + field %w210 = 2726440714374752509 + field %w211 = 6502946837278398021 + field %w212 = 15816362857667988792 + field %w213 = 12997958454165692924 + field %w214 = 5314892854495903792 + field %w215 = 15533907063555687782 + field %w216 = 12312015675698548715 + field %w217 = 14140016464013350248 + field %w218 = 16325589062962838690 + field %w219 = 6796145646370327654 + field %w220 = 1168753512742361735 + field %w221 = 4100789820704709368 + field %w222 = 15947554381540469177 + field %w223 = 8597377839806076919 + field %w224 = 9704018824195918000 + field %w225 = 12763288618765762688 + field %w226 = 17249257732622847695 + field %w227 = 1998710993415069759 + field %w228 = 923759906393011543 + field %w229 = 1271051229666811593 + field %w230 = 17822362132088738077 + field %w231 = 11797234543722669271 + field %w232 = 5864538787265942447 + field %w233 = 15975583211110506970 + field %w234 = 7258516085733671960 + field %w235 = 17999926471875633100 + field %w236 = 635992114476018166 + field %w237 = 17205047318256576347 + field %w238 = 17384900867876315312 + field %w239 = 16484825562915784226 + field %w240 = 16694130609036138894 + field %w241 = 10575069350371260875 + field %w242 = 8330575162062887277 + field %w243 = 6212375704691932880 + field %w244 = 15965138197626618226 + field %w245 = 14285453069600046939 + field %w246 = 10005163510208402517 + field %w247 = 885298637936952595 + field %w248 = 541790758138118921 + field %w249 = 5985203084790372993 + field %w250 = 4685030219775483721 + field %w251 = 1411106851304815020 + field %w252 = 11290732479954096478 + field %w253 = 208280581124868513 + field %w254 = 10979018648467968495 + field %w255 = 8600643745023338215 + field %w256 = 3477453626867126061 + field %w257 = 6428436309340258604 + field %w258 = 5695415667275657934 + field %w259 = 15952065508715623490 + field %w260 = 15571300830419767248 + field %w261 = 17259785660502616862 + field %w262 = 4298425495274316083 + field %w263 = 9023601070579319352 + field %w264 = 7353589709321807492 + field %w265 = 2988848909076209475 + field %w266 = 10439527789422046135 + field %w267 = 6097734044161429459 + field %w268 = 1113429873817861476 + field %w269 = 1639063372386966591 + field %w270 = 7863102812716788759 + field %w271 = 216040220732135364 + field %w272 = 14252611488623712688 + field %w273 = 9543395466794536974 + field %w274 = 2714461051639810934 + field %w275 = 2588317208781407279 + field %w276 = 15458529123534594916 + field %w277 = 15748417817551040856 + field %w278 = 16414455697114422951 + field %w279 = 13378164466674639511 + field %w280 = 13894319928411294675 + field %w281 = 5032680892090751540 + field %w282 = 17201338494743078916 + field %w283 = 4397422800601932505 + field %w284 = 11285062031581972327 + field %w285 = 7309354640676468207 + field %w286 = 10457152817239331848 + field %w287 = 8855911538863247046 + field %w288 = 4301853449821814398 + field %w289 = 13001502396339103326 + field %w290 = 10218424535115580246 + field %w291 = 8628244713920681895 + field %w292 = 17410423622514037261 + field %w293 = 14080683768439215375 + field %w294 = 11453161143447188100 + field %w295 = 16761509772042181939 + field %w296 = 6688821660695954082 + field %w297 = 12083434295263160416 + field %w298 = 8540021431714616589 + field %w299 = 6891616215679974226 + field %w300 = 10229217098454812721 + field %w301 = 3292165387203778711 + field %w302 = 6090113424998243490 + field %w303 = 13431780521962358660 + field %w304 = 6061081364215809883 + field %w305 = 16792066504222214142 + field %w306 = 16134314044798124799 + field %w307 = 17070233710126619765 + field %w308 = 6915716851370550800 + field %w309 = 9505009849073026581 + field %w310 = 6422700465081897153 + field %w311 = 17977653991560529185 + field %w312 = 5800870252836247255 + field %w313 = 12096124733159345520 + field %w314 = 7679273623392321940 + field %w315 = 17835783910585744964 + field %w316 = 2478664878205754377 + field %w317 = 1720314468413114967 + field %w318 = 10376757819003248056 + field %w319 = 10376377187857634245 + field %w320 = 13344930747504284997 + field %w321 = 11579281865160153596 + field %w322 = 10300256980048736962 + field %w323 = 378765236515040565 + field %w324 = 11412420941557253424 + field %w325 = 12931662470734252786 + field %w326 = 43018908376346374 + field %w327 = 3589810689190160071 + field %w328 = 4688229274750659741 + field %w329 = 13688957436484306091 + field %w330 = 11424740943016984272 + field %w331 = 16001900718237913960 + field %w332 = 5548469743008097574 + field %w333 = 14584404916672178680 + field %w334 = 3396622135873576824 + field %w335 = 7861729246871155992 + field %w336 = 16112271126908045545 + field %w337 = 16988163966860016012 + field %w338 = 273641680619529493 + field %w339 = 15222677154027327363 + field %w340 = 4070328078309830604 + field %w341 = 13520458500363296391 + field %w342 = 8235111705801363015 + field %w343 = 5575990058472514138 + field %w344 = 2751301609188252989 + field %w345 = 6478598528223547074 + field %w346 = 386565553848556638 + field %w347 = 9417729078939938713 + field %w348 = 15204315939835727483 + field %w349 = 14942015033780606261 + field %w350 = 18369423901636582012 + field %w351 = 4715338437538604447 + field %w352 = 6840590980607806319 + field %w353 = 5535471161490539014 + field %w354 = 5341328005359029952 + field %w355 = 1475161295215894444 + field %w356 = 7999197814297036636 + field %w357 = 2984233088665867938 + field %w358 = 3097746028144832229 + field %w359 = 8849530863480031517 + field %w360 = 7464920943249009773 + field %w361 = 3802996844641460514 + field %w362 = 6284458522545927646 + field %w363 = 2307388003445002779 + field %w364 = 4461479354745457623 + field %w365 = 1649739722664588460 + field %w366 = 3008391274160432867 + field %w367 = 5142217010456550622 + field %w368 = 1775580461722730120 + field %w369 = 161694268822794344 + field %w370 = 1518963253808031703 + field %w371 = 16475258091652710137 + field %w372 = 119575899007375159 + field %w373 = 1275863735937973999 + field %w374 = 16539412514520642374 + field %w375 = 2303365191438051950 + field %w376 = 6435126839960916075 + field %w377 = 17794599201026020053 + field %w378 = 13847097589277840330 + field %w379 = 16645869274577729720 + field %w380 = 8039205965509554440 + field %w381 = 4788586935019371140 + field %w382 = 15129007200040077746 + field %w383 = 2055561615223771341 + field %w384 = 4149731103701412892 + field %w385 = 10268130195734144189 + field %w386 = 13406631635880074708 + field %w387 = 11429218277824986203 + field %w388 = 15773968030812198565 + field %w389 = 16050275277550506872 + field %w390 = 11858586752031736643 + field %w391 = 8927746344866569756 + field %w392 = 11802068403177695792 + field %w393 = 157833420806751556 + field %w394 = 4698875910749767878 + field %w395 = 1616722774788291698 + field %w396 = 3990951895163748090 + field %w397 = 16758609224720795472 + field %w398 = 3045571693290741477 + field %w399 = 9281634245289836419 + field %w400 = 13517688176723875370 + field %w401 = 7961395585333219380 + field %w402 = 1606574359105691080 + field %w403 = 17564372683613562171 + field %w404 = 4664015225343144418 + field %w405 = 6133721340680280128 + field %w406 = 2667022304383014929 + field %w407 = 12316557761857340230 + field %w408 = 10375614850625292317 + field %w409 = 8141542666379135068 + field %w410 = 9185476451083834432 + field %w411 = 4991072365274649547 + field %w412 = 17398204971778820365 + field %w413 = 16127888338958422584 + field %w414 = 13586792051317758204 + field %w415 = 17 + field %w416 = 15 + field %w417 = 41 + field %w418 = 16 + field %w419 = 2 + field %w420 = 28 + field %w421 = 13 + field %w422 = 13 + field %w423 = 39 + field %w424 = 18 + field %w425 = 34 + field %w426 = 20 + field %w427 = 8 + field %w428 = 0 + field %w429 = 0 + field %w430 = 0 + field %w431 = 0 + field %w432 = 0 + field %w433 = 0 + field %w434 = 0 + field %w435 = 0 + field %w436 = 0 + field %w437 = 0 + field %w438 = 0 + %w43 = %w43 + %w55 + %w44 = %w44 + %w56 + %w45 = %w45 + %w57 + %w46 = %w46 + %w58 + %w47 = %w47 + %w59 + %w48 = %w48 + %w60 + %w49 = %w49 + %w61 + %w50 = %w50 + %w62 + %w51 = %w51 + %w63 + %w52 = %w52 + %w64 + %w53 = %w53 + %w65 + %w54 = %w54 + %w66 + field %w439 = %w43 ** 7 + field %w440 = %w44 ** 7 + field %w441 = %w45 ** 7 + field %w442 = %w46 ** 7 + field %w443 = %w47 ** 7 + field %w444 = %w48 ** 7 + field %w445 = %w49 ** 7 + field %w446 = %w50 ** 7 + field %w447 = %w51 ** 7 + field %w448 = %w52 ** 7 + field %w449 = %w53 ** 7 + field %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w67 + %w44 = %w44 + %w68 + %w45 = %w45 + %w69 + %w46 = %w46 + %w70 + %w47 = %w47 + %w71 + %w48 = %w48 + %w72 + %w49 = %w49 + %w73 + %w50 = %w50 + %w74 + %w51 = %w51 + %w75 + %w52 = %w52 + %w76 + %w53 = %w53 + %w77 + %w54 = %w54 + %w78 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w79 + %w44 = %w44 + %w80 + %w45 = %w45 + %w81 + %w46 = %w46 + %w82 + %w47 = %w47 + %w83 + %w48 = %w48 + %w84 + %w49 = %w49 + %w85 + %w50 = %w50 + %w86 + %w51 = %w51 + %w87 + %w52 = %w52 + %w88 + %w53 = %w53 + %w89 + %w54 = %w54 + %w90 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w91 + %w44 = %w44 + %w92 + %w45 = %w45 + %w93 + %w46 = %w46 + %w94 + %w47 = %w47 + %w95 + %w48 = %w48 + %w96 + %w49 = %w49 + %w97 + %w50 = %w50 + %w98 + %w51 = %w51 + %w99 + %w52 = %w52 + %w100 + %w53 = %w53 + %w101 + %w54 = %w54 + %w102 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w103 + %w44 = %w44 + %w104 + %w45 = %w45 + %w105 + %w46 = %w46 + %w106 + %w47 = %w47 + %w107 + %w48 = %w48 + %w108 + %w49 = %w49 + %w109 + %w50 = %w50 + %w110 + %w51 = %w51 + %w111 + %w52 = %w52 + %w112 + %w53 = %w53 + %w113 + %w54 = %w54 + %w114 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w115 + %w44 = %w44 + %w116 + %w45 = %w45 + %w117 + %w46 = %w46 + %w118 + %w47 = %w47 + %w119 + %w48 = %w48 + %w120 + %w49 = %w49 + %w121 + %w50 = %w50 + %w122 + %w51 = %w51 + %w123 + %w52 = %w52 + %w124 + %w53 = %w53 + %w125 + %w54 = %w54 + %w126 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w127 + %w44 = %w44 + %w128 + %w45 = %w45 + %w129 + %w46 = %w46 + %w130 + %w47 = %w47 + %w131 + %w48 = %w48 + %w132 + %w49 = %w49 + %w133 + %w50 = %w50 + %w134 + %w51 = %w51 + %w135 + %w52 = %w52 + %w136 + %w53 = %w53 + %w137 + %w54 = %w54 + %w138 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w139 + %w44 = %w44 + %w140 + %w45 = %w45 + %w141 + %w46 = %w46 + %w142 + %w47 = %w47 + %w143 + %w48 = %w48 + %w144 + %w49 = %w49 + %w145 + %w50 = %w50 + %w146 + %w51 = %w51 + %w147 + %w52 = %w52 + %w148 + %w53 = %w53 + %w149 + %w54 = %w54 + %w150 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w151 + %w44 = %w44 + %w152 + %w45 = %w45 + %w153 + %w46 = %w46 + %w154 + %w47 = %w47 + %w155 + %w48 = %w48 + %w156 + %w49 = %w49 + %w157 + %w50 = %w50 + %w158 + %w51 = %w51 + %w159 + %w52 = %w52 + %w160 + %w53 = %w53 + %w161 + %w54 = %w54 + %w162 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w163 + %w44 = %w44 + %w164 + %w45 = %w45 + %w165 + %w46 = %w46 + %w166 + %w47 = %w47 + %w167 + %w48 = %w48 + %w168 + %w49 = %w49 + %w169 + %w50 = %w50 + %w170 + %w51 = %w51 + %w171 + %w52 = %w52 + %w172 + %w53 = %w53 + %w173 + %w54 = %w54 + %w174 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w175 + %w44 = %w44 + %w176 + %w45 = %w45 + %w177 + %w46 = %w46 + %w178 + %w47 = %w47 + %w179 + %w48 = %w48 + %w180 + %w49 = %w49 + %w181 + %w50 = %w50 + %w182 + %w51 = %w51 + %w183 + %w52 = %w52 + %w184 + %w53 = %w53 + %w185 + %w54 = %w54 + %w186 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w187 + %w44 = %w44 + %w188 + %w45 = %w45 + %w189 + %w46 = %w46 + %w190 + %w47 = %w47 + %w191 + %w48 = %w48 + %w192 + %w49 = %w49 + %w193 + %w50 = %w50 + %w194 + %w51 = %w51 + %w195 + %w52 = %w52 + %w196 + %w53 = %w53 + %w197 + %w54 = %w54 + %w198 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w199 + %w44 = %w44 + %w200 + %w45 = %w45 + %w201 + %w46 = %w46 + %w202 + %w47 = %w47 + %w203 + %w48 = %w48 + %w204 + %w49 = %w49 + %w205 + %w50 = %w50 + %w206 + %w51 = %w51 + %w207 + %w52 = %w52 + %w208 + %w53 = %w53 + %w209 + %w54 = %w54 + %w210 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w211 + %w44 = %w44 + %w212 + %w45 = %w45 + %w213 + %w46 = %w46 + %w214 + %w47 = %w47 + %w215 + %w48 = %w48 + %w216 + %w49 = %w49 + %w217 + %w50 = %w50 + %w218 + %w51 = %w51 + %w219 + %w52 = %w52 + %w220 + %w53 = %w53 + %w221 + %w54 = %w54 + %w222 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w223 + %w44 = %w44 + %w224 + %w45 = %w45 + %w225 + %w46 = %w46 + %w226 + %w47 = %w47 + %w227 + %w48 = %w48 + %w228 + %w49 = %w49 + %w229 + %w50 = %w50 + %w230 + %w51 = %w51 + %w231 + %w52 = %w52 + %w232 + %w53 = %w53 + %w233 + %w54 = %w54 + %w234 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w235 + %w44 = %w44 + %w236 + %w45 = %w45 + %w237 + %w46 = %w46 + %w238 + %w47 = %w47 + %w239 + %w48 = %w48 + %w240 + %w49 = %w49 + %w241 + %w50 = %w50 + %w242 + %w51 = %w51 + %w243 + %w52 = %w52 + %w244 + %w53 = %w53 + %w245 + %w54 = %w54 + %w246 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w247 + %w44 = %w44 + %w248 + %w45 = %w45 + %w249 + %w46 = %w46 + %w250 + %w47 = %w47 + %w251 + %w48 = %w48 + %w252 + %w49 = %w49 + %w253 + %w50 = %w50 + %w254 + %w51 = %w51 + %w255 + %w52 = %w52 + %w256 + %w53 = %w53 + %w257 + %w54 = %w54 + %w258 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w259 + %w44 = %w44 + %w260 + %w45 = %w45 + %w261 + %w46 = %w46 + %w262 + %w47 = %w47 + %w263 + %w48 = %w48 + %w264 + %w49 = %w49 + %w265 + %w50 = %w50 + %w266 + %w51 = %w51 + %w267 + %w52 = %w52 + %w268 + %w53 = %w53 + %w269 + %w54 = %w54 + %w270 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w271 + %w44 = %w44 + %w272 + %w45 = %w45 + %w273 + %w46 = %w46 + %w274 + %w47 = %w47 + %w275 + %w48 = %w48 + %w276 + %w49 = %w49 + %w277 + %w50 = %w50 + %w278 + %w51 = %w51 + %w279 + %w52 = %w52 + %w280 + %w53 = %w53 + %w281 + %w54 = %w54 + %w282 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w283 + %w44 = %w44 + %w284 + %w45 = %w45 + %w285 + %w46 = %w46 + %w286 + %w47 = %w47 + %w287 + %w48 = %w48 + %w288 + %w49 = %w49 + %w289 + %w50 = %w50 + %w290 + %w51 = %w51 + %w291 + %w52 = %w52 + %w292 + %w53 = %w53 + %w293 + %w54 = %w54 + %w294 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w295 + %w44 = %w44 + %w296 + %w45 = %w45 + %w297 + %w46 = %w46 + %w298 + %w47 = %w47 + %w299 + %w48 = %w48 + %w300 + %w49 = %w49 + %w301 + %w50 = %w50 + %w302 + %w51 = %w51 + %w303 + %w52 = %w52 + %w304 + %w53 = %w53 + %w305 + %w54 = %w54 + %w306 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w307 + %w44 = %w44 + %w308 + %w45 = %w45 + %w309 + %w46 = %w46 + %w310 + %w47 = %w47 + %w311 + %w48 = %w48 + %w312 + %w49 = %w49 + %w313 + %w50 = %w50 + %w314 + %w51 = %w51 + %w315 + %w52 = %w52 + %w316 + %w53 = %w53 + %w317 + %w54 = %w54 + %w318 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w319 + %w44 = %w44 + %w320 + %w45 = %w45 + %w321 + %w46 = %w46 + %w322 + %w47 = %w47 + %w323 + %w48 = %w48 + %w324 + %w49 = %w49 + %w325 + %w50 = %w50 + %w326 + %w51 = %w51 + %w327 + %w52 = %w52 + %w328 + %w53 = %w53 + %w329 + %w54 = %w54 + %w330 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w331 + %w44 = %w44 + %w332 + %w45 = %w45 + %w333 + %w46 = %w46 + %w334 + %w47 = %w47 + %w335 + %w48 = %w48 + %w336 + %w49 = %w49 + %w337 + %w50 = %w50 + %w338 + %w51 = %w51 + %w339 + %w52 = %w52 + %w340 + %w53 = %w53 + %w341 + %w54 = %w54 + %w342 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w343 + %w44 = %w44 + %w344 + %w45 = %w45 + %w345 + %w46 = %w46 + %w346 + %w47 = %w47 + %w347 + %w48 = %w48 + %w348 + %w49 = %w49 + %w349 + %w50 = %w50 + %w350 + %w51 = %w51 + %w351 + %w52 = %w52 + %w352 + %w53 = %w53 + %w353 + %w54 = %w54 + %w354 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w355 + %w44 = %w44 + %w356 + %w45 = %w45 + %w357 + %w46 = %w46 + %w358 + %w47 = %w47 + %w359 + %w48 = %w48 + %w360 + %w49 = %w49 + %w361 + %w50 = %w50 + %w362 + %w51 = %w51 + %w363 + %w52 = %w52 + %w364 + %w53 = %w53 + %w365 + %w54 = %w54 + %w366 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w367 + %w44 = %w44 + %w368 + %w45 = %w45 + %w369 + %w46 = %w46 + %w370 + %w47 = %w47 + %w371 + %w48 = %w48 + %w372 + %w49 = %w49 + %w373 + %w50 = %w50 + %w374 + %w51 = %w51 + %w375 + %w52 = %w52 + %w376 + %w53 = %w53 + %w377 + %w54 = %w54 + %w378 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w379 + %w44 = %w44 + %w380 + %w45 = %w45 + %w381 + %w46 = %w46 + %w382 + %w47 = %w47 + %w383 + %w48 = %w48 + %w384 + %w49 = %w49 + %w385 + %w50 = %w50 + %w386 + %w51 = %w51 + %w387 + %w52 = %w52 + %w388 + %w53 = %w53 + %w389 + %w54 = %w54 + %w390 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w391 + %w44 = %w44 + %w392 + %w45 = %w45 + %w393 + %w46 = %w46 + %w394 + %w47 = %w47 + %w395 + %w48 = %w48 + %w396 + %w49 = %w49 + %w397 + %w50 = %w50 + %w398 + %w51 = %w51 + %w399 + %w52 = %w52 + %w400 + %w53 = %w53 + %w401 + %w54 = %w54 + %w402 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w403 + %w44 = %w44 + %w404 + %w45 = %w45 + %w405 + %w46 = %w46 + %w406 + %w47 = %w47 + %w407 + %w48 = %w48 + %w408 + %w49 = %w49 + %w409 + %w50 = %w50 + %w410 + %w51 = %w51 + %w411 + %w52 = %w52 + %w412 + %w53 = %w53 + %w413 + %w54 = %w54 + %w414 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + field %w451 = %w43 + field %w452 = %w44 + field %w453 = %w45 + field %w454 = %w46 + field %w455 = %w47 + field %w456 = %w48 + field %w457 = %w49 + field %w458 = %w50 + field %w459 = %w51 + field %w460 = %w52 + field %w461 = %w53 + field %w462 = %w54 + field %w463 = %w451 + field %w464 = %w452 + field %w465 = %w461 + field %w466 = %w462 + field %w467 = %w453 + field %w468 = %w454 + field %w469 = %w455 + field %w470 = %w456 + field %w471 = %w457 + field %w472 = %w458 + field %w473 = %w459 + field %w474 = %w460 + field %w475 = %w463 + field %w476 = %w464 + field %w477 = %w465 + field %w478 = %w466 + field %w479 = %w467 + field %w480 = %w468 + field %w481 = %w469 + field %w482 = %w470 + field %w483 = %w471 + field %w484 = %w472 + field %w485 = %w473 + field %w486 = %w474 + field %w487 = %w475 + field %w488 = %w476 + field %w489 = %w477 + field %w490 = %w478 + field %w491 = %w479 + field %w492 = %w480 + field %w493 = %w481 + field %w494 = %w482 + field %w495 = %w483 + field %w496 = %w484 + field %w497 = %w485 + field %w498 = %w486 + %w29 = %w29 + %w487 + %w488 + %w491 + %w492 + %w493 + %w494 + %w495 + %w496 + %w497 + %w498 + %w489 + %w490 + %w30 = %w30 + 1 + assert %o7 == %w29 + assert %o8 == %w30 + assert %o9 == %w17 + assert %o10 == %w18 + assert %o11 == %w19 + assert %o12 == %w20 + assert %o13 == %w21 + assert %o14 == %w22 + assert %o15 == %w23 + assert %o16 == %w24 + assert %o17 == %w25 + assert %o18 == %w26 + assert %o19 == %w27 + assert %o20 == %w28 + assert %o1(BN) == %w30 != 1000000 ? 1 : 2 +Transition: + %w30 != 1000000 ? -> 1 : -> 2 + +Block 2: +Func: main, Scope: 1 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 4 +Inputs: + %i1(BN): field + %i7: field +Outputs: + %o1(BN): field + %o2(RET): field +Instructions: + assert %i1(BN) == 2 + field %w29 = %i7 + field %w499 = %w29 + assert %o2(RET) == %w499 + assert %o1(BN) == 3 +Program terminates. + + +-- +Circ IR: +Optimizing IR... +done. +INPUT: [0, 0] + + +-- +Optimization: + + +-- +Post-Processing: +Entry block: 0 + +Block 0: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 33 +Inputs: + %i1(BN): field +Outputs: + %o1(BN): field + %o7: field + %o8: u32 + %o9: field + %o10: field + %o11: field + %o12: field + %o13: field + %o14: field + %o15: field + %o16: field + %o17: field + %o18: field + %o19: field + %o20: field +Instructions: + assert %i1(BN) == 0 + field %w5 = 1 + field %w6 = 2 + field %w7 = 3 + field %w8 = 4 + field %w9 = 5 + field %w10 = 6 + field %w11 = 7 + field %w12 = 8 + field %w13 = 0 + field %w14 = 0 + field %w15 = 0 + field %w16 = 0 + field %w17 = %w5 + field %w18 = %w6 + field %w19 = %w15 + field %w20 = %w16 + field %w21 = %w7 + field %w22 = %w8 + field %w23 = %w9 + field %w24 = %w10 + field %w25 = %w11 + field %w26 = %w12 + field %w27 = %w13 + field %w28 = %w14 + field %w29 = 0 + u32 %w30 = 0 + field %o7 = %w29 + u32 %o8 = %w30 + field %o9 = %w17 + field %o10 = %w18 + field %o11 = %w19 + field %o12 = %w20 + field %o13 = %w21 + field %o14 = %w22 + field %o15 = %w23 + field %o16 = %w24 + field %o17 = %w25 + field %o18 = %w26 + field %o19 = %w27 + field %o20 = %w28 + field %o1(BN) = %w30 != 1000000 ? 1 : 2 +Transition: + %w30 != 1000000 ? -> 1 : -> 2 + +Block 1: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 607 +Inputs: + %i1(BN): field + %i7: field + %i8: u32 + %i9: field + %i10: field + %i11: field + %i12: field + %i13: field + %i14: field + %i15: field + %i16: field + %i17: field + %i18: field + %i19: field + %i20: field +Outputs: + %o1(BN): field + %o7: field + %o8: u32 + %o9: field + %o10: field + %o11: field + %o12: field + %o13: field + %o14: field + %o15: field + %o16: field + %o17: field + %o18: field + %o19: field + %o20: field +Instructions: + assert %i1(BN) == 1 + field %w29 = %i7 + u32 %w30 = %i8 + field %w17 = %i9 + field %w18 = %i10 + field %w19 = %i11 + field %w20 = %i12 + field %w21 = %i13 + field %w22 = %i14 + field %w23 = %i15 + field %w24 = %i16 + field %w25 = %i17 + field %w26 = %i18 + field %w27 = %i19 + field %w28 = %i20 + field %w31 = %w17 + field %w32 = %w18 + field %w33 = %w19 + field %w34 = %w20 + field %w35 = %w21 + field %w36 = %w22 + field %w37 = %w23 + field %w38 = %w24 + field %w39 = %w25 + field %w40 = %w26 + field %w41 = %w27 + field %w42 = %w28 + field %w43 = %w31 + field %w44 = %w32 + field %w45 = %w35 + field %w46 = %w36 + field %w47 = %w37 + field %w48 = %w38 + field %w49 = %w39 + field %w50 = %w40 + field %w51 = %w41 + field %w52 = %w42 + field %w53 = %w33 + field %w54 = %w34 + field %w55 = 13080132714287612933 + field %w56 = 8594738767457295063 + field %w57 = 12896916465481390516 + field %w58 = 1109962092811921367 + field %w59 = 16216730422861946898 + field %w60 = 10137062673499593713 + field %w61 = 15292064466732465823 + field %w62 = 17255573294985989181 + field %w63 = 14827154241873003558 + field %w64 = 2846171647972703231 + field %w65 = 16246264663680317601 + field %w66 = 14214208087951879286 + field %w67 = 9667108687426275457 + field %w68 = 6470857420712283733 + field %w69 = 14103331940138337652 + field %w70 = 11854816473550292865 + field %w71 = 3498097497301325516 + field %w72 = 7947235692523864220 + field %w73 = 11110078701231901946 + field %w74 = 16384314112672821048 + field %w75 = 15404405912655775739 + field %w76 = 14077880830714445579 + field %w77 = 9555554662709218279 + field %w78 = 13859595358210603949 + field %w79 = 16859897325061800066 + field %w80 = 17685474420222222349 + field %w81 = 17858764734618734949 + field %w82 = 9410011022665866671 + field %w83 = 12495243629579414666 + field %w84 = 12416945298171515742 + field %w85 = 5776666812364270983 + field %w86 = 6314421662864060481 + field %w87 = 7402742471423223171 + field %w88 = 982536713192432718 + field %w89 = 17321168865775127905 + field %w90 = 2934354895005980211 + field %w91 = 10567510598607410195 + field %w92 = 8135543733717919110 + field %w93 = 116353493081713692 + field %w94 = 8029688163494945618 + field %w95 = 9003846637224807585 + field %w96 = 7052445132467233849 + field %w97 = 9645665432288852853 + field %w98 = 5446430061030868787 + field %w99 = 16770910634346036823 + field %w100 = 17708360571433944729 + field %w101 = 4661556288322237631 + field %w102 = 11977051899316327985 + field %w103 = 4378616569090929672 + field %w104 = 3334807502817538491 + field %w105 = 8019184735943344966 + field %w106 = 2395043908812246395 + field %w107 = 6558421058331732611 + field %w108 = 11735894060727326369 + field %w109 = 8143540538889204488 + field %w110 = 5991753489563751169 + field %w111 = 12235918791502088007 + field %w112 = 2880312033702687139 + field %w113 = 18224748115308382355 + field %w114 = 18070411013125314165 + field %w115 = 8156487614120951180 + field %w116 = 10615269510047010719 + field %w117 = 12489426404754222075 + field %w118 = 5055279340069995710 + field %w119 = 7231927319780248664 + field %w120 = 2602078848106763799 + field %w121 = 12445944369334781425 + field %w122 = 3978905923892496205 + field %w123 = 16711272944329818038 + field %w124 = 10439032361227108922 + field %w125 = 15110119871725214866 + field %w126 = 821141790655890946 + field %w127 = 11073536380651186235 + field %w128 = 4866839313097607757 + field %w129 = 13118391689513956636 + field %w130 = 14527674973762312380 + field %w131 = 7612751959265567999 + field %w132 = 6808090907814178161 + field %w133 = 6899703779492644997 + field %w134 = 3664666286336986826 + field %w135 = 783179505424462608 + field %w136 = 8990689241814097697 + field %w137 = 9646603555412825679 + field %w138 = 7351246026167205041 + field %w139 = 16970959813722173256 + field %w140 = 15735726858241466429 + field %w141 = 10347018221892268419 + field %w142 = 12195545878449322889 + field %w143 = 7423314197114049891 + field %w144 = 14908016116973904153 + field %w145 = 5840340122527363265 + field %w146 = 17740311462440614128 + field %w147 = 815306421953744623 + field %w148 = 17456357368219253949 + field %w149 = 6982651076559329072 + field %w150 = 11970987324614963868 + field %w151 = 8167785008538063246 + field %w152 = 9483259819397403968 + field %w153 = 954550221664291548 + field %w154 = 10339565171024313256 + field %w155 = 8651171084286500102 + field %w156 = 16974445528003515956 + field %w157 = 15104530047940621190 + field %w158 = 103271880867179718 + field %w159 = 14654666245504492663 + field %w160 = 12445769555936887967 + field %w161 = 11250582358051997490 + field %w162 = 6730977207490590241 + field %w163 = 15919951556166196935 + field %w164 = 4423540216573360915 + field %w165 = 16317664700341473511 + field %w166 = 4723997214951767765 + field %w167 = 10098756619006575500 + field %w168 = 3223149401237667964 + field %w169 = 6870494874300767682 + field %w170 = 2902095711130291898 + field %w171 = 7159372652788439733 + field %w172 = 11500508372997952671 + field %w173 = 13348148181479462670 + field %w174 = 12729401155983882093 + field %w175 = 15021242795466053388 + field %w176 = 3802990509227527157 + field %w177 = 4665459515680145682 + field %w178 = 13165553315407675603 + field %w179 = 6496364397926233172 + field %w180 = 12800832566287577810 + field %w181 = 9737592377590267426 + field %w182 = 8687131091302514939 + field %w183 = 1488200421755445892 + field %w184 = 11004377668730991641 + field %w185 = 13516338734600228410 + field %w186 = 2953581820660217936 + field %w187 = 3505040783153922951 + field %w188 = 3710332827435113697 + field %w189 = 15414874040873320221 + field %w190 = 8602547649919482301 + field %w191 = 13971349938398812007 + field %w192 = 187239246702636066 + field %w193 = 12886019973971254144 + field %w194 = 4512274763990493707 + field %w195 = 2986635507805503192 + field %w196 = 2315252455709119454 + field %w197 = 12537995864054210246 + field %w198 = 2039491936479859267 + field %w199 = 1558644089185031256 + field %w200 = 4074089203264759305 + field %w201 = 2522268501749395707 + field %w202 = 3414760436185256196 + field %w203 = 17420887529146466921 + field %w204 = 2817020417938125001 + field %w205 = 16538346563888261485 + field %w206 = 5592270336833998770 + field %w207 = 16876602064684906232 + field %w208 = 1793025614521516343 + field %w209 = 2178510518148748532 + field %w210 = 2726440714374752509 + field %w211 = 6502946837278398021 + field %w212 = 15816362857667988792 + field %w213 = 12997958454165692924 + field %w214 = 5314892854495903792 + field %w215 = 15533907063555687782 + field %w216 = 12312015675698548715 + field %w217 = 14140016464013350248 + field %w218 = 16325589062962838690 + field %w219 = 6796145646370327654 + field %w220 = 1168753512742361735 + field %w221 = 4100789820704709368 + field %w222 = 15947554381540469177 + field %w223 = 8597377839806076919 + field %w224 = 9704018824195918000 + field %w225 = 12763288618765762688 + field %w226 = 17249257732622847695 + field %w227 = 1998710993415069759 + field %w228 = 923759906393011543 + field %w229 = 1271051229666811593 + field %w230 = 17822362132088738077 + field %w231 = 11797234543722669271 + field %w232 = 5864538787265942447 + field %w233 = 15975583211110506970 + field %w234 = 7258516085733671960 + field %w235 = 17999926471875633100 + field %w236 = 635992114476018166 + field %w237 = 17205047318256576347 + field %w238 = 17384900867876315312 + field %w239 = 16484825562915784226 + field %w240 = 16694130609036138894 + field %w241 = 10575069350371260875 + field %w242 = 8330575162062887277 + field %w243 = 6212375704691932880 + field %w244 = 15965138197626618226 + field %w245 = 14285453069600046939 + field %w246 = 10005163510208402517 + field %w247 = 885298637936952595 + field %w248 = 541790758138118921 + field %w249 = 5985203084790372993 + field %w250 = 4685030219775483721 + field %w251 = 1411106851304815020 + field %w252 = 11290732479954096478 + field %w253 = 208280581124868513 + field %w254 = 10979018648467968495 + field %w255 = 8600643745023338215 + field %w256 = 3477453626867126061 + field %w257 = 6428436309340258604 + field %w258 = 5695415667275657934 + field %w259 = 15952065508715623490 + field %w260 = 15571300830419767248 + field %w261 = 17259785660502616862 + field %w262 = 4298425495274316083 + field %w263 = 9023601070579319352 + field %w264 = 7353589709321807492 + field %w265 = 2988848909076209475 + field %w266 = 10439527789422046135 + field %w267 = 6097734044161429459 + field %w268 = 1113429873817861476 + field %w269 = 1639063372386966591 + field %w270 = 7863102812716788759 + field %w271 = 216040220732135364 + field %w272 = 14252611488623712688 + field %w273 = 9543395466794536974 + field %w274 = 2714461051639810934 + field %w275 = 2588317208781407279 + field %w276 = 15458529123534594916 + field %w277 = 15748417817551040856 + field %w278 = 16414455697114422951 + field %w279 = 13378164466674639511 + field %w280 = 13894319928411294675 + field %w281 = 5032680892090751540 + field %w282 = 17201338494743078916 + field %w283 = 4397422800601932505 + field %w284 = 11285062031581972327 + field %w285 = 7309354640676468207 + field %w286 = 10457152817239331848 + field %w287 = 8855911538863247046 + field %w288 = 4301853449821814398 + field %w289 = 13001502396339103326 + field %w290 = 10218424535115580246 + field %w291 = 8628244713920681895 + field %w292 = 17410423622514037261 + field %w293 = 14080683768439215375 + field %w294 = 11453161143447188100 + field %w295 = 16761509772042181939 + field %w296 = 6688821660695954082 + field %w297 = 12083434295263160416 + field %w298 = 8540021431714616589 + field %w299 = 6891616215679974226 + field %w300 = 10229217098454812721 + field %w301 = 3292165387203778711 + field %w302 = 6090113424998243490 + field %w303 = 13431780521962358660 + field %w304 = 6061081364215809883 + field %w305 = 16792066504222214142 + field %w306 = 16134314044798124799 + field %w307 = 17070233710126619765 + field %w308 = 6915716851370550800 + field %w309 = 9505009849073026581 + field %w310 = 6422700465081897153 + field %w311 = 17977653991560529185 + field %w312 = 5800870252836247255 + field %w313 = 12096124733159345520 + field %w314 = 7679273623392321940 + field %w315 = 17835783910585744964 + field %w316 = 2478664878205754377 + field %w317 = 1720314468413114967 + field %w318 = 10376757819003248056 + field %w319 = 10376377187857634245 + field %w320 = 13344930747504284997 + field %w321 = 11579281865160153596 + field %w322 = 10300256980048736962 + field %w323 = 378765236515040565 + field %w324 = 11412420941557253424 + field %w325 = 12931662470734252786 + field %w326 = 43018908376346374 + field %w327 = 3589810689190160071 + field %w328 = 4688229274750659741 + field %w329 = 13688957436484306091 + field %w330 = 11424740943016984272 + field %w331 = 16001900718237913960 + field %w332 = 5548469743008097574 + field %w333 = 14584404916672178680 + field %w334 = 3396622135873576824 + field %w335 = 7861729246871155992 + field %w336 = 16112271126908045545 + field %w337 = 16988163966860016012 + field %w338 = 273641680619529493 + field %w339 = 15222677154027327363 + field %w340 = 4070328078309830604 + field %w341 = 13520458500363296391 + field %w342 = 8235111705801363015 + field %w343 = 5575990058472514138 + field %w344 = 2751301609188252989 + field %w345 = 6478598528223547074 + field %w346 = 386565553848556638 + field %w347 = 9417729078939938713 + field %w348 = 15204315939835727483 + field %w349 = 14942015033780606261 + field %w350 = 18369423901636582012 + field %w351 = 4715338437538604447 + field %w352 = 6840590980607806319 + field %w353 = 5535471161490539014 + field %w354 = 5341328005359029952 + field %w355 = 1475161295215894444 + field %w356 = 7999197814297036636 + field %w357 = 2984233088665867938 + field %w358 = 3097746028144832229 + field %w359 = 8849530863480031517 + field %w360 = 7464920943249009773 + field %w361 = 3802996844641460514 + field %w362 = 6284458522545927646 + field %w363 = 2307388003445002779 + field %w364 = 4461479354745457623 + field %w365 = 1649739722664588460 + field %w366 = 3008391274160432867 + field %w367 = 5142217010456550622 + field %w368 = 1775580461722730120 + field %w369 = 161694268822794344 + field %w370 = 1518963253808031703 + field %w371 = 16475258091652710137 + field %w372 = 119575899007375159 + field %w373 = 1275863735937973999 + field %w374 = 16539412514520642374 + field %w375 = 2303365191438051950 + field %w376 = 6435126839960916075 + field %w377 = 17794599201026020053 + field %w378 = 13847097589277840330 + field %w379 = 16645869274577729720 + field %w380 = 8039205965509554440 + field %w381 = 4788586935019371140 + field %w382 = 15129007200040077746 + field %w383 = 2055561615223771341 + field %w384 = 4149731103701412892 + field %w385 = 10268130195734144189 + field %w386 = 13406631635880074708 + field %w387 = 11429218277824986203 + field %w388 = 15773968030812198565 + field %w389 = 16050275277550506872 + field %w390 = 11858586752031736643 + field %w391 = 8927746344866569756 + field %w392 = 11802068403177695792 + field %w393 = 157833420806751556 + field %w394 = 4698875910749767878 + field %w395 = 1616722774788291698 + field %w396 = 3990951895163748090 + field %w397 = 16758609224720795472 + field %w398 = 3045571693290741477 + field %w399 = 9281634245289836419 + field %w400 = 13517688176723875370 + field %w401 = 7961395585333219380 + field %w402 = 1606574359105691080 + field %w403 = 17564372683613562171 + field %w404 = 4664015225343144418 + field %w405 = 6133721340680280128 + field %w406 = 2667022304383014929 + field %w407 = 12316557761857340230 + field %w408 = 10375614850625292317 + field %w409 = 8141542666379135068 + field %w410 = 9185476451083834432 + field %w411 = 4991072365274649547 + field %w412 = 17398204971778820365 + field %w413 = 16127888338958422584 + field %w414 = 13586792051317758204 + field %w415 = 17 + field %w416 = 15 + field %w417 = 41 + field %w418 = 16 + field %w419 = 2 + field %w420 = 28 + field %w421 = 13 + field %w422 = 13 + field %w423 = 39 + field %w424 = 18 + field %w425 = 34 + field %w426 = 20 + field %w427 = 8 + field %w428 = 0 + field %w429 = 0 + field %w430 = 0 + field %w431 = 0 + field %w432 = 0 + field %w433 = 0 + field %w434 = 0 + field %w435 = 0 + field %w436 = 0 + field %w437 = 0 + field %w438 = 0 + %w43 = %w43 + %w55 + %w44 = %w44 + %w56 + %w45 = %w45 + %w57 + %w46 = %w46 + %w58 + %w47 = %w47 + %w59 + %w48 = %w48 + %w60 + %w49 = %w49 + %w61 + %w50 = %w50 + %w62 + %w51 = %w51 + %w63 + %w52 = %w52 + %w64 + %w53 = %w53 + %w65 + %w54 = %w54 + %w66 + field %w439 = %w43 ** 7 + field %w440 = %w44 ** 7 + field %w441 = %w45 ** 7 + field %w442 = %w46 ** 7 + field %w443 = %w47 ** 7 + field %w444 = %w48 ** 7 + field %w445 = %w49 ** 7 + field %w446 = %w50 ** 7 + field %w447 = %w51 ** 7 + field %w448 = %w52 ** 7 + field %w449 = %w53 ** 7 + field %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w67 + %w44 = %w44 + %w68 + %w45 = %w45 + %w69 + %w46 = %w46 + %w70 + %w47 = %w47 + %w71 + %w48 = %w48 + %w72 + %w49 = %w49 + %w73 + %w50 = %w50 + %w74 + %w51 = %w51 + %w75 + %w52 = %w52 + %w76 + %w53 = %w53 + %w77 + %w54 = %w54 + %w78 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w79 + %w44 = %w44 + %w80 + %w45 = %w45 + %w81 + %w46 = %w46 + %w82 + %w47 = %w47 + %w83 + %w48 = %w48 + %w84 + %w49 = %w49 + %w85 + %w50 = %w50 + %w86 + %w51 = %w51 + %w87 + %w52 = %w52 + %w88 + %w53 = %w53 + %w89 + %w54 = %w54 + %w90 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w91 + %w44 = %w44 + %w92 + %w45 = %w45 + %w93 + %w46 = %w46 + %w94 + %w47 = %w47 + %w95 + %w48 = %w48 + %w96 + %w49 = %w49 + %w97 + %w50 = %w50 + %w98 + %w51 = %w51 + %w99 + %w52 = %w52 + %w100 + %w53 = %w53 + %w101 + %w54 = %w54 + %w102 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w103 + %w44 = %w44 + %w104 + %w45 = %w45 + %w105 + %w46 = %w46 + %w106 + %w47 = %w47 + %w107 + %w48 = %w48 + %w108 + %w49 = %w49 + %w109 + %w50 = %w50 + %w110 + %w51 = %w51 + %w111 + %w52 = %w52 + %w112 + %w53 = %w53 + %w113 + %w54 = %w54 + %w114 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w115 + %w44 = %w44 + %w116 + %w45 = %w45 + %w117 + %w46 = %w46 + %w118 + %w47 = %w47 + %w119 + %w48 = %w48 + %w120 + %w49 = %w49 + %w121 + %w50 = %w50 + %w122 + %w51 = %w51 + %w123 + %w52 = %w52 + %w124 + %w53 = %w53 + %w125 + %w54 = %w54 + %w126 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w127 + %w44 = %w44 + %w128 + %w45 = %w45 + %w129 + %w46 = %w46 + %w130 + %w47 = %w47 + %w131 + %w48 = %w48 + %w132 + %w49 = %w49 + %w133 + %w50 = %w50 + %w134 + %w51 = %w51 + %w135 + %w52 = %w52 + %w136 + %w53 = %w53 + %w137 + %w54 = %w54 + %w138 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w139 + %w44 = %w44 + %w140 + %w45 = %w45 + %w141 + %w46 = %w46 + %w142 + %w47 = %w47 + %w143 + %w48 = %w48 + %w144 + %w49 = %w49 + %w145 + %w50 = %w50 + %w146 + %w51 = %w51 + %w147 + %w52 = %w52 + %w148 + %w53 = %w53 + %w149 + %w54 = %w54 + %w150 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w151 + %w44 = %w44 + %w152 + %w45 = %w45 + %w153 + %w46 = %w46 + %w154 + %w47 = %w47 + %w155 + %w48 = %w48 + %w156 + %w49 = %w49 + %w157 + %w50 = %w50 + %w158 + %w51 = %w51 + %w159 + %w52 = %w52 + %w160 + %w53 = %w53 + %w161 + %w54 = %w54 + %w162 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w163 + %w44 = %w44 + %w164 + %w45 = %w45 + %w165 + %w46 = %w46 + %w166 + %w47 = %w47 + %w167 + %w48 = %w48 + %w168 + %w49 = %w49 + %w169 + %w50 = %w50 + %w170 + %w51 = %w51 + %w171 + %w52 = %w52 + %w172 + %w53 = %w53 + %w173 + %w54 = %w54 + %w174 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w175 + %w44 = %w44 + %w176 + %w45 = %w45 + %w177 + %w46 = %w46 + %w178 + %w47 = %w47 + %w179 + %w48 = %w48 + %w180 + %w49 = %w49 + %w181 + %w50 = %w50 + %w182 + %w51 = %w51 + %w183 + %w52 = %w52 + %w184 + %w53 = %w53 + %w185 + %w54 = %w54 + %w186 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w187 + %w44 = %w44 + %w188 + %w45 = %w45 + %w189 + %w46 = %w46 + %w190 + %w47 = %w47 + %w191 + %w48 = %w48 + %w192 + %w49 = %w49 + %w193 + %w50 = %w50 + %w194 + %w51 = %w51 + %w195 + %w52 = %w52 + %w196 + %w53 = %w53 + %w197 + %w54 = %w54 + %w198 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w199 + %w44 = %w44 + %w200 + %w45 = %w45 + %w201 + %w46 = %w46 + %w202 + %w47 = %w47 + %w203 + %w48 = %w48 + %w204 + %w49 = %w49 + %w205 + %w50 = %w50 + %w206 + %w51 = %w51 + %w207 + %w52 = %w52 + %w208 + %w53 = %w53 + %w209 + %w54 = %w54 + %w210 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w211 + %w44 = %w44 + %w212 + %w45 = %w45 + %w213 + %w46 = %w46 + %w214 + %w47 = %w47 + %w215 + %w48 = %w48 + %w216 + %w49 = %w49 + %w217 + %w50 = %w50 + %w218 + %w51 = %w51 + %w219 + %w52 = %w52 + %w220 + %w53 = %w53 + %w221 + %w54 = %w54 + %w222 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w223 + %w44 = %w44 + %w224 + %w45 = %w45 + %w225 + %w46 = %w46 + %w226 + %w47 = %w47 + %w227 + %w48 = %w48 + %w228 + %w49 = %w49 + %w229 + %w50 = %w50 + %w230 + %w51 = %w51 + %w231 + %w52 = %w52 + %w232 + %w53 = %w53 + %w233 + %w54 = %w54 + %w234 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w235 + %w44 = %w44 + %w236 + %w45 = %w45 + %w237 + %w46 = %w46 + %w238 + %w47 = %w47 + %w239 + %w48 = %w48 + %w240 + %w49 = %w49 + %w241 + %w50 = %w50 + %w242 + %w51 = %w51 + %w243 + %w52 = %w52 + %w244 + %w53 = %w53 + %w245 + %w54 = %w54 + %w246 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w247 + %w44 = %w44 + %w248 + %w45 = %w45 + %w249 + %w46 = %w46 + %w250 + %w47 = %w47 + %w251 + %w48 = %w48 + %w252 + %w49 = %w49 + %w253 + %w50 = %w50 + %w254 + %w51 = %w51 + %w255 + %w52 = %w52 + %w256 + %w53 = %w53 + %w257 + %w54 = %w54 + %w258 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w259 + %w44 = %w44 + %w260 + %w45 = %w45 + %w261 + %w46 = %w46 + %w262 + %w47 = %w47 + %w263 + %w48 = %w48 + %w264 + %w49 = %w49 + %w265 + %w50 = %w50 + %w266 + %w51 = %w51 + %w267 + %w52 = %w52 + %w268 + %w53 = %w53 + %w269 + %w54 = %w54 + %w270 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w271 + %w44 = %w44 + %w272 + %w45 = %w45 + %w273 + %w46 = %w46 + %w274 + %w47 = %w47 + %w275 + %w48 = %w48 + %w276 + %w49 = %w49 + %w277 + %w50 = %w50 + %w278 + %w51 = %w51 + %w279 + %w52 = %w52 + %w280 + %w53 = %w53 + %w281 + %w54 = %w54 + %w282 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w283 + %w44 = %w44 + %w284 + %w45 = %w45 + %w285 + %w46 = %w46 + %w286 + %w47 = %w47 + %w287 + %w48 = %w48 + %w288 + %w49 = %w49 + %w289 + %w50 = %w50 + %w290 + %w51 = %w51 + %w291 + %w52 = %w52 + %w292 + %w53 = %w53 + %w293 + %w54 = %w54 + %w294 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w295 + %w44 = %w44 + %w296 + %w45 = %w45 + %w297 + %w46 = %w46 + %w298 + %w47 = %w47 + %w299 + %w48 = %w48 + %w300 + %w49 = %w49 + %w301 + %w50 = %w50 + %w302 + %w51 = %w51 + %w303 + %w52 = %w52 + %w304 + %w53 = %w53 + %w305 + %w54 = %w54 + %w306 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w307 + %w44 = %w44 + %w308 + %w45 = %w45 + %w309 + %w46 = %w46 + %w310 + %w47 = %w47 + %w311 + %w48 = %w48 + %w312 + %w49 = %w49 + %w313 + %w50 = %w50 + %w314 + %w51 = %w51 + %w315 + %w52 = %w52 + %w316 + %w53 = %w53 + %w317 + %w54 = %w54 + %w318 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w319 + %w44 = %w44 + %w320 + %w45 = %w45 + %w321 + %w46 = %w46 + %w322 + %w47 = %w47 + %w323 + %w48 = %w48 + %w324 + %w49 = %w49 + %w325 + %w50 = %w50 + %w326 + %w51 = %w51 + %w327 + %w52 = %w52 + %w328 + %w53 = %w53 + %w329 + %w54 = %w54 + %w330 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w331 + %w44 = %w44 + %w332 + %w45 = %w45 + %w333 + %w46 = %w46 + %w334 + %w47 = %w47 + %w335 + %w48 = %w48 + %w336 + %w49 = %w49 + %w337 + %w50 = %w50 + %w338 + %w51 = %w51 + %w339 + %w52 = %w52 + %w340 + %w53 = %w53 + %w341 + %w54 = %w54 + %w342 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w343 + %w44 = %w44 + %w344 + %w45 = %w45 + %w345 + %w46 = %w46 + %w346 + %w47 = %w47 + %w347 + %w48 = %w48 + %w348 + %w49 = %w49 + %w349 + %w50 = %w50 + %w350 + %w51 = %w51 + %w351 + %w52 = %w52 + %w352 + %w53 = %w53 + %w353 + %w54 = %w54 + %w354 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w355 + %w44 = %w44 + %w356 + %w45 = %w45 + %w357 + %w46 = %w46 + %w358 + %w47 = %w47 + %w359 + %w48 = %w48 + %w360 + %w49 = %w49 + %w361 + %w50 = %w50 + %w362 + %w51 = %w51 + %w363 + %w52 = %w52 + %w364 + %w53 = %w53 + %w365 + %w54 = %w54 + %w366 + %w439 = %w43 ** 7 + %w440 = %w44 + %w441 = %w45 + %w442 = %w46 + %w443 = %w47 + %w444 = %w48 + %w445 = %w49 + %w446 = %w50 + %w447 = %w51 + %w448 = %w52 + %w449 = %w53 + %w450 = %w54 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w367 + %w44 = %w44 + %w368 + %w45 = %w45 + %w369 + %w46 = %w46 + %w370 + %w47 = %w47 + %w371 + %w48 = %w48 + %w372 + %w49 = %w49 + %w373 + %w50 = %w50 + %w374 + %w51 = %w51 + %w375 + %w52 = %w52 + %w376 + %w53 = %w53 + %w377 + %w54 = %w54 + %w378 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w379 + %w44 = %w44 + %w380 + %w45 = %w45 + %w381 + %w46 = %w46 + %w382 + %w47 = %w47 + %w383 + %w48 = %w48 + %w384 + %w49 = %w49 + %w385 + %w50 = %w50 + %w386 + %w51 = %w51 + %w387 + %w52 = %w52 + %w388 + %w53 = %w53 + %w389 + %w54 = %w54 + %w390 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w391 + %w44 = %w44 + %w392 + %w45 = %w45 + %w393 + %w46 = %w46 + %w394 + %w47 = %w47 + %w395 + %w48 = %w48 + %w396 + %w49 = %w49 + %w397 + %w50 = %w50 + %w398 + %w51 = %w51 + %w399 + %w52 = %w52 + %w400 + %w53 = %w53 + %w401 + %w54 = %w54 + %w402 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + %w43 = %w43 + %w403 + %w44 = %w44 + %w404 + %w45 = %w45 + %w405 + %w46 = %w46 + %w406 + %w47 = %w47 + %w407 + %w48 = %w48 + %w408 + %w49 = %w49 + %w409 + %w50 = %w50 + %w410 + %w51 = %w51 + %w411 + %w52 = %w52 + %w412 + %w53 = %w53 + %w413 + %w54 = %w54 + %w414 + %w439 = %w43 ** 7 + %w440 = %w44 ** 7 + %w441 = %w45 ** 7 + %w442 = %w46 ** 7 + %w443 = %w47 ** 7 + %w444 = %w48 ** 7 + %w445 = %w49 ** 7 + %w446 = %w50 ** 7 + %w447 = %w51 ** 7 + %w448 = %w52 ** 7 + %w449 = %w53 ** 7 + %w450 = %w54 ** 7 + %w43 = %w439 * %w427 + %w439 * %w415 + %w440 * %w416 + %w441 * %w417 + %w442 * %w418 + %w443 * %w419 + %w444 * %w420 + %w445 * %w421 + %w446 * %w422 + %w447 * %w423 + %w448 * %w424 + %w449 * %w425 + %w450 * %w426 + %w44 = %w440 * %w428 + %w440 * %w415 + %w441 * %w416 + %w442 * %w417 + %w443 * %w418 + %w444 * %w419 + %w445 * %w420 + %w446 * %w421 + %w447 * %w422 + %w448 * %w423 + %w449 * %w424 + %w450 * %w425 + %w439 * %w426 + %w45 = %w441 * %w429 + %w441 * %w415 + %w442 * %w416 + %w443 * %w417 + %w444 * %w418 + %w445 * %w419 + %w446 * %w420 + %w447 * %w421 + %w448 * %w422 + %w449 * %w423 + %w450 * %w424 + %w439 * %w425 + %w440 * %w426 + %w46 = %w442 * %w430 + %w442 * %w415 + %w443 * %w416 + %w444 * %w417 + %w445 * %w418 + %w446 * %w419 + %w447 * %w420 + %w448 * %w421 + %w449 * %w422 + %w450 * %w423 + %w439 * %w424 + %w440 * %w425 + %w441 * %w426 + %w47 = %w443 * %w431 + %w443 * %w415 + %w444 * %w416 + %w445 * %w417 + %w446 * %w418 + %w447 * %w419 + %w448 * %w420 + %w449 * %w421 + %w450 * %w422 + %w439 * %w423 + %w440 * %w424 + %w441 * %w425 + %w442 * %w426 + %w48 = %w444 * %w432 + %w444 * %w415 + %w445 * %w416 + %w446 * %w417 + %w447 * %w418 + %w448 * %w419 + %w449 * %w420 + %w450 * %w421 + %w439 * %w422 + %w440 * %w423 + %w441 * %w424 + %w442 * %w425 + %w443 * %w426 + %w49 = %w445 * %w433 + %w445 * %w415 + %w446 * %w416 + %w447 * %w417 + %w448 * %w418 + %w449 * %w419 + %w450 * %w420 + %w439 * %w421 + %w440 * %w422 + %w441 * %w423 + %w442 * %w424 + %w443 * %w425 + %w444 * %w426 + %w50 = %w446 * %w434 + %w446 * %w415 + %w447 * %w416 + %w448 * %w417 + %w449 * %w418 + %w450 * %w419 + %w439 * %w420 + %w440 * %w421 + %w441 * %w422 + %w442 * %w423 + %w443 * %w424 + %w444 * %w425 + %w445 * %w426 + %w51 = %w447 * %w435 + %w447 * %w415 + %w448 * %w416 + %w449 * %w417 + %w450 * %w418 + %w439 * %w419 + %w440 * %w420 + %w441 * %w421 + %w442 * %w422 + %w443 * %w423 + %w444 * %w424 + %w445 * %w425 + %w446 * %w426 + %w52 = %w448 * %w436 + %w448 * %w415 + %w449 * %w416 + %w450 * %w417 + %w439 * %w418 + %w440 * %w419 + %w441 * %w420 + %w442 * %w421 + %w443 * %w422 + %w444 * %w423 + %w445 * %w424 + %w446 * %w425 + %w447 * %w426 + %w53 = %w449 * %w437 + %w449 * %w415 + %w450 * %w416 + %w439 * %w417 + %w440 * %w418 + %w441 * %w419 + %w442 * %w420 + %w443 * %w421 + %w444 * %w422 + %w445 * %w423 + %w446 * %w424 + %w447 * %w425 + %w448 * %w426 + %w54 = %w450 * %w438 + %w450 * %w415 + %w439 * %w416 + %w440 * %w417 + %w441 * %w418 + %w442 * %w419 + %w443 * %w420 + %w444 * %w421 + %w445 * %w422 + %w446 * %w423 + %w447 * %w424 + %w448 * %w425 + %w449 * %w426 + field %w451 = %w43 + field %w452 = %w44 + field %w453 = %w45 + field %w454 = %w46 + field %w455 = %w47 + field %w456 = %w48 + field %w457 = %w49 + field %w458 = %w50 + field %w459 = %w51 + field %w460 = %w52 + field %w461 = %w53 + field %w462 = %w54 + field %w463 = %w451 + field %w464 = %w452 + field %w465 = %w461 + field %w466 = %w462 + field %w467 = %w453 + field %w468 = %w454 + field %w469 = %w455 + field %w470 = %w456 + field %w471 = %w457 + field %w472 = %w458 + field %w473 = %w459 + field %w474 = %w460 + field %w475 = %w463 + field %w476 = %w464 + field %w477 = %w465 + field %w478 = %w466 + field %w479 = %w467 + field %w480 = %w468 + field %w481 = %w469 + field %w482 = %w470 + field %w483 = %w471 + field %w484 = %w472 + field %w485 = %w473 + field %w486 = %w474 + field %w487 = %w475 + field %w488 = %w476 + field %w489 = %w477 + field %w490 = %w478 + field %w491 = %w479 + field %w492 = %w480 + field %w493 = %w481 + field %w494 = %w482 + field %w495 = %w483 + field %w496 = %w484 + field %w497 = %w485 + field %w498 = %w486 + %w29 = %w29 + %w487 + %w488 + %w491 + %w492 + %w493 + %w494 + %w495 + %w496 + %w497 + %w498 + %w489 + %w490 + %w30 = %w30 + 1 + field %o7 = %w29 + u32 %o8 = %w30 + field %o9 = %w17 + field %o10 = %w18 + field %o11 = %w19 + field %o12 = %w20 + field %o13 = %w21 + field %o14 = %w22 + field %o15 = %w23 + field %o16 = %w24 + field %o17 = %w25 + field %o18 = %w26 + field %o19 = %w27 + field %o20 = %w28 + field %o1(BN) = %w30 != 1000000 ? 1 : 2 +Transition: + %w30 != 1000000 ? -> 1 : -> 2 + +Block 2: +Func: main, Scope: 1 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 4 +Inputs: + %i1(BN): field + %i7: field +Outputs: + %o1(BN): field + %o2(RET): field +Instructions: + assert %i1(BN) == 2 + field %w29 = %i7 + field %w499 = %w29 + field %o2(RET) = %w499 + field %o1(BN) = 3 +Program terminates. + + +-- +Interpretation: + +-- +FUNC + +I 0 0 +S +M +O 10140720376667396982 +Preprocessing instances... +Generating Circuits... + + +-- +BLOCK INSTS + con var nnz exec +Block 0 66 x 145 87 1 +Block 1 574 x 1105 5994 1000000 +Block 2 52 x 145 87 1 +Total Num of Blocks: 3 +Total Inst Commit Size: 6168 +Total Var Commit Size: 1105000290 +Total Cons Exec Size: 574000118 + * number_of_instances 3 + * number_of_constraints 1024 + * number_of_variables 8192 +Finished Block + + +-- +PAIRWISE INSTS + con var nnz exec +Cohere 1 x 16 2 1000002 +Phy Mem 4 x 16 8 0 +Vir Mem 28 x 64 45 0 +Total Num of Blocks: 1 +Total Inst Commit Size: 55 +Total Var Commit Size: 16000032 +Total Cons Exec Size: 1000002 + * number_of_instances 3 + * number_of_constraints 32 + * number_of_variables 128 +Finished Pairwise + + +-- +PERM INSTS + con var nnz exec +Perm Root 46 x 208 89 1000002 +Total Num of Blocks: 1 +Total Inst Commit Size: 89 +Total Var Commit Size: 0 +Total Cons Exec Size: 0 + * number_of_instances 1 + * number_of_constraints 64 + * number_of_variables 512 +Finished Perm +Comitting Circuits... + * SNARK::encode + * SNARK::encode 2.807791ms +Finished Block + * SNARK::encode + * SNARK::encode 239.75µs +Finished Pairwise + * SNARK::encode + * SNARK::encode 15.125µs +Finished Perm +Preprocess time: 29ms +Running the proof... + * SNARK::prove + * inst_commit + * inst_commit 14.167µs + * block_sort + * block_sort 64.936417ms + * witness_gen + * block_witness_gen + * block_witness_gen 10.082689708s + * init_phy_mem_witness_gen + * init_phy_mem_witness_gen 4.5µs + * init_vir_mem_witness_gen + * init_vir_mem_witness_gen 3.083µs + * phy_mem_addr_witness_gen + * phy_mem_addr_witness_gen 2.75µs + * vir_mem_addr_witness_gen + * vir_mem_addr_witness_gen 3µs + * witness_gen 10.082791084s + * input_commit + * input_commit 19.198601917s +BLOCK WITNESSES: [1073741824, 64, 64, 67108864, 64, 64, 8388608, 8, 8, 8388608, 8, 8] Goldilocks +EXEC WITNESSES: [67108864, 67108864, 8388608, 8388608] Goldilocks +MEM WITNESSES: [] Goldilocks + * Block Correctness Extract + * R1CSProof::prove + * prove_sc_phase_one + * prove_z_mat_gen + * prove_z_mat_gen 26.714254458s + * prove_vec_mult diff --git a/circ_blocks/bbb b/circ_blocks/bbb new file mode 100644 index 00000000..b4e497b8 --- /dev/null +++ b/circ_blocks/bbb @@ -0,0 +1,5180 @@ +Options { path: "poseidon_test/poseidon_array", skip_linred: false, circ: CircOpt { r1cs: R1csOpt { verified: false, profile: false, div_by_zero: Incomplete, lc_elim_thresh: 50 }, field: FieldOpt { builtin: Goldilocks, custom_modulus: "" }, ir: IrOpt { field_to_bv: Wrap, frequent_gc: false }, ram: RamOpt { enabled: false, range: Sort, index: Uniqueness, permutation: Msh, rom: Haboeck }, fmt: FmtOpt { use_default_field: true, hide_field: false }, zsharp: ZsharpOpt { isolate_asserts: true }, datalog: DatalogOpt { rec_limit: 5, lint_prim_rec: false }, c: COpt { sv_functions: false, assert_no_ub: false } }, action: Count, quiet: false, no_opt: false } +Generating Compiler Time Data... +Entry block: 0 + +Block 0: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field %BP = 0 + field %TS = 0 +Transition: -> 1 + +Block 1: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 2 + +Block 2: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 12 +Num Cons: - +Inputs: +Outputs: +Instructions: + field[12 ] array^0.main.0.0 + field init^0^0.main.0.0 = 1 + field init^0^1.main.0.0 = 2 + field init^0^2.main.0.0 = 3 + field init^0^3.main.0.0 = 4 + field init^0^4.main.0.0 = 5 + field init^0^5.main.0.0 = 6 + field init^0^6.main.0.0 = 7 + field init^0^7.main.0.0 = 8 + field init^0^8.main.0.0 = 0 + field init^0^9.main.0.0 = 0 + field init^0^10.main.0.0 = 0 + field init^0^11.main.0.0 = 0 + array^0.main.0.0[0 ] = init^0^0.main.0.0 , init + array^0.main.0.0[1 ] = init^0^1.main.0.0 , init + array^0.main.0.0[2 ] = init^0^2.main.0.0 , init + array^0.main.0.0[3 ] = init^0^3.main.0.0 , init + array^0.main.0.0[4 ] = init^0^4.main.0.0 , init + array^0.main.0.0[5 ] = init^0^5.main.0.0 , init + array^0.main.0.0[6 ] = init^0^6.main.0.0 , init + array^0.main.0.0[7 ] = init^0^7.main.0.0 , init + array^0.main.0.0[8 ] = init^0^8.main.0.0 , init + array^0.main.0.0[9 ] = init^0^9.main.0.0 , init + array^0.main.0.0[10 ] = init^0^10.main.0.0 , init + array^0.main.0.0[11 ] = init^0^11.main.0.0 , init + field inputs.main.0.0 = array^0.main.0.0 + field cumulated_hash.main.0.0 = 0 +Transition: -> 3 + +Block 3: +Func: main, Scope: 1 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + u32 i.main.0.0 = 0 +Transition: + i.main.0.0 != 1000000 ? -> 4 : -> 14 + +Block 4: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 5 + +Block 5: +Func: main, Scope: 3 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field input.poseidon.0.0 = inputs.main.0.0 + field rp@.poseidon = 6 +Transition: -> 17 + +Block 6: +Func: main, Scope: 3 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field ret^0.main.0.0 = %RET.poseidon + field hashes.main.0.0 = ret^0.main.0.0 +Transition: -> 7 + +Block 7: +Func: main, Scope: 4 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + u32 j.main.0.0 = 0 +Transition: + j.main.0.0 != 12 ? -> 8 : -> 11 + +Block 8: +Func: main, Scope: 5 +Exec Bound: 12000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 9 + +Block 9: +Func: main, Scope: 6 +Exec Bound: 12000000, While Loop: false +RO Ops: 0, VM Ops: 1 +Num Cons: - +Inputs: +Outputs: +Instructions: + field load^0.main.0.0 = hashes.main.0.0[j.main.0.0] + field cumulated_hash.main.0.0 = cumulated_hash.main.0.0 + load^0.main.0.0 +Transition: -> 10 + +Block 10: +Func: main, Scope: 5 +Exec Bound: 12000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + j.main.0.0 = j.main.0.0 + 1 +Transition: + j.main.0.0 != 12 ? -> 8 : -> 11 + +Block 11: +Func: main, Scope: 4 +Exec Bound: 12000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 12 + +Block 12: +Func: main, Scope: 3 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 13 + +Block 13: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + i.main.0.0 = i.main.0.0 + 1 +Transition: + i.main.0.0 != 1000000 ? -> 4 : -> 14 + +Block 14: +Func: main, Scope: 1 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> 15 + +Block 15: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: + field %RET.main = cumulated_hash.main.0.0 +Program terminates. + +Block 16: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Program terminates. + +Block 17: +Func: poseidon, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 24 +Num Cons: - +Inputs: +Outputs: +Instructions: + field load^0.poseidon.0.0 = input.poseidon.0.0[0 ] + field state0.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[1 ] + field state1.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[2 ] + field state2.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[3 ] + field state3.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[4 ] + field state4.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[5 ] + field state5.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[6 ] + field state6.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[7 ] + field state7.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[8 ] + field state8.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[9 ] + field state9.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[10 ] + field state10.poseidon.0.0 = load^0.poseidon.0.0 + field load^0.poseidon.0.0 = input.poseidon.0.0[11 ] + field state11.poseidon.0.0 = load^0.poseidon.0.0 + field c0.poseidon.0.0 = 13080132714287612933 + field c1.poseidon.0.0 = 8594738767457295063 + field c2.poseidon.0.0 = 12896916465481390516 + field c3.poseidon.0.0 = 1109962092811921367 + field c4.poseidon.0.0 = 16216730422861946898 + field c5.poseidon.0.0 = 10137062673499593713 + field c6.poseidon.0.0 = 15292064466732465823 + field c7.poseidon.0.0 = 17255573294985989181 + field c8.poseidon.0.0 = 14827154241873003558 + field c9.poseidon.0.0 = 2846171647972703231 + field c1.poseidon.0.0 = 16246264663680317601 + field c11.poseidon.0.0 = 14214208087951879286 + field c12.poseidon.0.0 = 9667108687426275457 + field c13.poseidon.0.0 = 6470857420712283733 + field c14.poseidon.0.0 = 14103331940138337652 + field c15.poseidon.0.0 = 11854816473550292865 + field c16.poseidon.0.0 = 3498097497301325516 + field c17.poseidon.0.0 = 7947235692523864220 + field c18.poseidon.0.0 = 11110078701231901946 + field c19.poseidon.0.0 = 16384314112672821048 + field c2.poseidon.0.0 = 15404405912655775739 + field c21.poseidon.0.0 = 14077880830714445579 + field c22.poseidon.0.0 = 9555554662709218279 + field c23.poseidon.0.0 = 13859595358210603949 + field c24.poseidon.0.0 = 16859897325061800066 + field c25.poseidon.0.0 = 17685474420222222349 + field c26.poseidon.0.0 = 17858764734618734949 + field c27.poseidon.0.0 = 9410011022665866671 + field c28.poseidon.0.0 = 12495243629579414666 + field c29.poseidon.0.0 = 12416945298171515742 + field c3.poseidon.0.0 = 5776666812364270983 + field c31.poseidon.0.0 = 6314421662864060481 + field c32.poseidon.0.0 = 7402742471423223171 + field c33.poseidon.0.0 = 982536713192432718 + field c34.poseidon.0.0 = 17321168865775127905 + field c35.poseidon.0.0 = 2934354895005980211 + field c36.poseidon.0.0 = 10567510598607410195 + field c37.poseidon.0.0 = 8135543733717919110 + field c38.poseidon.0.0 = 116353493081713692 + field c39.poseidon.0.0 = 8029688163494945618 + field c4.poseidon.0.0 = 9003846637224807585 + field c41.poseidon.0.0 = 7052445132467233849 + field c42.poseidon.0.0 = 9645665432288852853 + field c43.poseidon.0.0 = 5446430061030868787 + field c44.poseidon.0.0 = 16770910634346036823 + field c45.poseidon.0.0 = 17708360571433944729 + field c46.poseidon.0.0 = 4661556288322237631 + field c47.poseidon.0.0 = 11977051899316327985 + field c48.poseidon.0.0 = 4378616569090929672 + field c49.poseidon.0.0 = 3334807502817538491 + field c5.poseidon.0.0 = 8019184735943344966 + field c51.poseidon.0.0 = 2395043908812246395 + field c52.poseidon.0.0 = 6558421058331732611 + field c53.poseidon.0.0 = 11735894060727326369 + field c54.poseidon.0.0 = 8143540538889204488 + field c55.poseidon.0.0 = 5991753489563751169 + field c56.poseidon.0.0 = 12235918791502088007 + field c57.poseidon.0.0 = 2880312033702687139 + field c58.poseidon.0.0 = 18224748115308382355 + field c59.poseidon.0.0 = 18070411013125314165 + field c6.poseidon.0.0 = 8156487614120951180 + field c61.poseidon.0.0 = 10615269510047010719 + field c62.poseidon.0.0 = 12489426404754222075 + field c63.poseidon.0.0 = 5055279340069995710 + field c64.poseidon.0.0 = 7231927319780248664 + field c65.poseidon.0.0 = 2602078848106763799 + field c66.poseidon.0.0 = 12445944369334781425 + field c67.poseidon.0.0 = 3978905923892496205 + field c68.poseidon.0.0 = 16711272944329818038 + field c69.poseidon.0.0 = 10439032361227108922 + field c7.poseidon.0.0 = 15110119871725214866 + field c71.poseidon.0.0 = 821141790655890946 + field c72.poseidon.0.0 = 11073536380651186235 + field c73.poseidon.0.0 = 4866839313097607757 + field c74.poseidon.0.0 = 13118391689513956636 + field c75.poseidon.0.0 = 14527674973762312380 + field c76.poseidon.0.0 = 7612751959265567999 + field c77.poseidon.0.0 = 6808090907814178161 + field c78.poseidon.0.0 = 6899703779492644997 + field c79.poseidon.0.0 = 3664666286336986826 + field c8.poseidon.0.0 = 783179505424462608 + field c81.poseidon.0.0 = 8990689241814097697 + field c82.poseidon.0.0 = 9646603555412825679 + field c83.poseidon.0.0 = 7351246026167205041 + field c84.poseidon.0.0 = 16970959813722173256 + field c85.poseidon.0.0 = 15735726858241466429 + field c86.poseidon.0.0 = 10347018221892268419 + field c87.poseidon.0.0 = 12195545878449322889 + field c88.poseidon.0.0 = 7423314197114049891 + field c89.poseidon.0.0 = 14908016116973904153 + field c9.poseidon.0.0 = 5840340122527363265 + field c91.poseidon.0.0 = 17740311462440614128 + field c92.poseidon.0.0 = 815306421953744623 + field c93.poseidon.0.0 = 17456357368219253949 + field c94.poseidon.0.0 = 6982651076559329072 + field c95.poseidon.0.0 = 11970987324614963868 + field c96.poseidon.0.0 = 8167785008538063246 + field c97.poseidon.0.0 = 9483259819397403968 + field c98.poseidon.0.0 = 954550221664291548 + field c99.poseidon.0.0 = 10339565171024313256 + field c1.poseidon.0.0 = 8651171084286500102 + field c11.poseidon.0.0 = 16974445528003515956 + field c12.poseidon.0.0 = 15104530047940621190 + field c13.poseidon.0.0 = 103271880867179718 + field c14.poseidon.0.0 = 14654666245504492663 + field c15.poseidon.0.0 = 12445769555936887967 + field c16.poseidon.0.0 = 11250582358051997490 + field c17.poseidon.0.0 = 6730977207490590241 + field c18.poseidon.0.0 = 15919951556166196935 + field c19.poseidon.0.0 = 4423540216573360915 + field c110.poseidon.0.0 = 16317664700341473511 + field c111.poseidon.0.0 = 4723997214951767765 + field c112.poseidon.0.0 = 10098756619006575500 + field c113.poseidon.0.0 = 3223149401237667964 + field c114.poseidon.0.0 = 6870494874300767682 + field c115.poseidon.0.0 = 2902095711130291898 + field c116.poseidon.0.0 = 7159372652788439733 + field c117.poseidon.0.0 = 11500508372997952671 + field c118.poseidon.0.0 = 13348148181479462670 + field c119.poseidon.0.0 = 12729401155983882093 + field c120.poseidon.0.0 = 15021242795466053388 + field c121.poseidon.0.0 = 3802990509227527157 + field c122.poseidon.0.0 = 4665459515680145682 + field c123.poseidon.0.0 = 13165553315407675603 + field c124.poseidon.0.0 = 6496364397926233172 + field c125.poseidon.0.0 = 12800832566287577810 + field c126.poseidon.0.0 = 9737592377590267426 + field c127.poseidon.0.0 = 8687131091302514939 + field c128.poseidon.0.0 = 1488200421755445892 + field c129.poseidon.0.0 = 11004377668730991641 + field c130.poseidon.0.0 = 13516338734600228410 + field c131.poseidon.0.0 = 2953581820660217936 + field c132.poseidon.0.0 = 3505040783153922951 + field c133.poseidon.0.0 = 3710332827435113697 + field c134.poseidon.0.0 = 15414874040873320221 + field c135.poseidon.0.0 = 8602547649919482301 + field c136.poseidon.0.0 = 13971349938398812007 + field c137.poseidon.0.0 = 187239246702636066 + field c138.poseidon.0.0 = 12886019973971254144 + field c139.poseidon.0.0 = 4512274763990493707 + field c140.poseidon.0.0 = 2986635507805503192 + field c141.poseidon.0.0 = 2315252455709119454 + field c142.poseidon.0.0 = 12537995864054210246 + field c143.poseidon.0.0 = 2039491936479859267 + field c144.poseidon.0.0 = 1558644089185031256 + field c145.poseidon.0.0 = 4074089203264759305 + field c146.poseidon.0.0 = 2522268501749395707 + field c147.poseidon.0.0 = 3414760436185256196 + field c148.poseidon.0.0 = 17420887529146466921 + field c149.poseidon.0.0 = 2817020417938125001 + field c150.poseidon.0.0 = 16538346563888261485 + field c151.poseidon.0.0 = 5592270336833998770 + field c152.poseidon.0.0 = 16876602064684906232 + field c153.poseidon.0.0 = 1793025614521516343 + field c154.poseidon.0.0 = 2178510518148748532 + field c155.poseidon.0.0 = 2726440714374752509 + field c156.poseidon.0.0 = 6502946837278398021 + field c157.poseidon.0.0 = 15816362857667988792 + field c158.poseidon.0.0 = 12997958454165692924 + field c159.poseidon.0.0 = 5314892854495903792 + field c160.poseidon.0.0 = 15533907063555687782 + field c161.poseidon.0.0 = 12312015675698548715 + field c162.poseidon.0.0 = 14140016464013350248 + field c163.poseidon.0.0 = 16325589062962838690 + field c164.poseidon.0.0 = 6796145646370327654 + field c165.poseidon.0.0 = 1168753512742361735 + field c166.poseidon.0.0 = 4100789820704709368 + field c167.poseidon.0.0 = 15947554381540469177 + field c168.poseidon.0.0 = 8597377839806076919 + field c169.poseidon.0.0 = 9704018824195918000 + field c170.poseidon.0.0 = 12763288618765762688 + field c171.poseidon.0.0 = 17249257732622847695 + field c172.poseidon.0.0 = 1998710993415069759 + field c173.poseidon.0.0 = 923759906393011543 + field c174.poseidon.0.0 = 1271051229666811593 + field c175.poseidon.0.0 = 17822362132088738077 + field c176.poseidon.0.0 = 11797234543722669271 + field c177.poseidon.0.0 = 5864538787265942447 + field c178.poseidon.0.0 = 15975583211110506970 + field c179.poseidon.0.0 = 7258516085733671960 + field c180.poseidon.0.0 = 17999926471875633100 + field c181.poseidon.0.0 = 635992114476018166 + field c182.poseidon.0.0 = 17205047318256576347 + field c183.poseidon.0.0 = 17384900867876315312 + field c184.poseidon.0.0 = 16484825562915784226 + field c185.poseidon.0.0 = 16694130609036138894 + field c186.poseidon.0.0 = 10575069350371260875 + field c187.poseidon.0.0 = 8330575162062887277 + field c188.poseidon.0.0 = 6212375704691932880 + field c189.poseidon.0.0 = 15965138197626618226 + field c190.poseidon.0.0 = 14285453069600046939 + field c191.poseidon.0.0 = 10005163510208402517 + field c192.poseidon.0.0 = 885298637936952595 + field c193.poseidon.0.0 = 541790758138118921 + field c194.poseidon.0.0 = 5985203084790372993 + field c195.poseidon.0.0 = 4685030219775483721 + field c196.poseidon.0.0 = 1411106851304815020 + field c197.poseidon.0.0 = 11290732479954096478 + field c198.poseidon.0.0 = 208280581124868513 + field c199.poseidon.0.0 = 10979018648467968495 + field c2.poseidon.0.0 = 8600643745023338215 + field c21.poseidon.0.0 = 3477453626867126061 + field c22.poseidon.0.0 = 6428436309340258604 + field c23.poseidon.0.0 = 5695415667275657934 + field c24.poseidon.0.0 = 15952065508715623490 + field c25.poseidon.0.0 = 15571300830419767248 + field c26.poseidon.0.0 = 17259785660502616862 + field c27.poseidon.0.0 = 4298425495274316083 + field c28.poseidon.0.0 = 9023601070579319352 + field c29.poseidon.0.0 = 7353589709321807492 + field c210.poseidon.0.0 = 2988848909076209475 + field c211.poseidon.0.0 = 10439527789422046135 + field c212.poseidon.0.0 = 6097734044161429459 + field c213.poseidon.0.0 = 1113429873817861476 + field c214.poseidon.0.0 = 1639063372386966591 + field c215.poseidon.0.0 = 7863102812716788759 + field c216.poseidon.0.0 = 216040220732135364 + field c217.poseidon.0.0 = 14252611488623712688 + field c218.poseidon.0.0 = 9543395466794536974 + field c219.poseidon.0.0 = 2714461051639810934 + field c220.poseidon.0.0 = 2588317208781407279 + field c221.poseidon.0.0 = 15458529123534594916 + field c222.poseidon.0.0 = 15748417817551040856 + field c223.poseidon.0.0 = 16414455697114422951 + field c224.poseidon.0.0 = 13378164466674639511 + field c225.poseidon.0.0 = 13894319928411294675 + field c226.poseidon.0.0 = 5032680892090751540 + field c227.poseidon.0.0 = 17201338494743078916 + field c228.poseidon.0.0 = 4397422800601932505 + field c229.poseidon.0.0 = 11285062031581972327 + field c230.poseidon.0.0 = 7309354640676468207 + field c231.poseidon.0.0 = 10457152817239331848 + field c232.poseidon.0.0 = 8855911538863247046 + field c233.poseidon.0.0 = 4301853449821814398 + field c234.poseidon.0.0 = 13001502396339103326 + field c235.poseidon.0.0 = 10218424535115580246 + field c236.poseidon.0.0 = 8628244713920681895 + field c237.poseidon.0.0 = 17410423622514037261 + field c238.poseidon.0.0 = 14080683768439215375 + field c239.poseidon.0.0 = 11453161143447188100 + field c240.poseidon.0.0 = 16761509772042181939 + field c241.poseidon.0.0 = 6688821660695954082 + field c242.poseidon.0.0 = 12083434295263160416 + field c243.poseidon.0.0 = 8540021431714616589 + field c244.poseidon.0.0 = 6891616215679974226 + field c245.poseidon.0.0 = 10229217098454812721 + field c246.poseidon.0.0 = 3292165387203778711 + field c247.poseidon.0.0 = 6090113424998243490 + field c248.poseidon.0.0 = 13431780521962358660 + field c249.poseidon.0.0 = 6061081364215809883 + field c250.poseidon.0.0 = 16792066504222214142 + field c251.poseidon.0.0 = 16134314044798124799 + field c252.poseidon.0.0 = 17070233710126619765 + field c253.poseidon.0.0 = 6915716851370550800 + field c254.poseidon.0.0 = 9505009849073026581 + field c255.poseidon.0.0 = 6422700465081897153 + field c256.poseidon.0.0 = 17977653991560529185 + field c257.poseidon.0.0 = 5800870252836247255 + field c258.poseidon.0.0 = 12096124733159345520 + field c259.poseidon.0.0 = 7679273623392321940 + field c260.poseidon.0.0 = 17835783910585744964 + field c261.poseidon.0.0 = 2478664878205754377 + field c262.poseidon.0.0 = 1720314468413114967 + field c263.poseidon.0.0 = 10376757819003248056 + field c264.poseidon.0.0 = 10376377187857634245 + field c265.poseidon.0.0 = 13344930747504284997 + field c266.poseidon.0.0 = 11579281865160153596 + field c267.poseidon.0.0 = 10300256980048736962 + field c268.poseidon.0.0 = 378765236515040565 + field c269.poseidon.0.0 = 11412420941557253424 + field c270.poseidon.0.0 = 12931662470734252786 + field c271.poseidon.0.0 = 43018908376346374 + field c272.poseidon.0.0 = 3589810689190160071 + field c273.poseidon.0.0 = 4688229274750659741 + field c274.poseidon.0.0 = 13688957436484306091 + field c275.poseidon.0.0 = 11424740943016984272 + field c276.poseidon.0.0 = 16001900718237913960 + field c277.poseidon.0.0 = 5548469743008097574 + field c278.poseidon.0.0 = 14584404916672178680 + field c279.poseidon.0.0 = 3396622135873576824 + field c280.poseidon.0.0 = 7861729246871155992 + field c281.poseidon.0.0 = 16112271126908045545 + field c282.poseidon.0.0 = 16988163966860016012 + field c283.poseidon.0.0 = 273641680619529493 + field c284.poseidon.0.0 = 15222677154027327363 + field c285.poseidon.0.0 = 4070328078309830604 + field c286.poseidon.0.0 = 13520458500363296391 + field c287.poseidon.0.0 = 8235111705801363015 + field c288.poseidon.0.0 = 5575990058472514138 + field c289.poseidon.0.0 = 2751301609188252989 + field c290.poseidon.0.0 = 6478598528223547074 + field c291.poseidon.0.0 = 386565553848556638 + field c292.poseidon.0.0 = 9417729078939938713 + field c293.poseidon.0.0 = 15204315939835727483 + field c294.poseidon.0.0 = 14942015033780606261 + field c295.poseidon.0.0 = 18369423901636582012 + field c296.poseidon.0.0 = 4715338437538604447 + field c297.poseidon.0.0 = 6840590980607806319 + field c298.poseidon.0.0 = 5535471161490539014 + field c299.poseidon.0.0 = 5341328005359029952 + field c3.poseidon.0.0 = 1475161295215894444 + field c31.poseidon.0.0 = 7999197814297036636 + field c32.poseidon.0.0 = 2984233088665867938 + field c33.poseidon.0.0 = 3097746028144832229 + field c34.poseidon.0.0 = 8849530863480031517 + field c35.poseidon.0.0 = 7464920943249009773 + field c36.poseidon.0.0 = 3802996844641460514 + field c37.poseidon.0.0 = 6284458522545927646 + field c38.poseidon.0.0 = 2307388003445002779 + field c39.poseidon.0.0 = 4461479354745457623 + field c310.poseidon.0.0 = 1649739722664588460 + field c311.poseidon.0.0 = 3008391274160432867 + field c312.poseidon.0.0 = 5142217010456550622 + field c313.poseidon.0.0 = 1775580461722730120 + field c314.poseidon.0.0 = 161694268822794344 + field c315.poseidon.0.0 = 1518963253808031703 + field c316.poseidon.0.0 = 16475258091652710137 + field c317.poseidon.0.0 = 119575899007375159 + field c318.poseidon.0.0 = 1275863735937973999 + field c319.poseidon.0.0 = 16539412514520642374 + field c320.poseidon.0.0 = 2303365191438051950 + field c321.poseidon.0.0 = 6435126839960916075 + field c322.poseidon.0.0 = 17794599201026020053 + field c323.poseidon.0.0 = 13847097589277840330 + field c324.poseidon.0.0 = 16645869274577729720 + field c325.poseidon.0.0 = 8039205965509554440 + field c326.poseidon.0.0 = 4788586935019371140 + field c327.poseidon.0.0 = 15129007200040077746 + field c328.poseidon.0.0 = 2055561615223771341 + field c329.poseidon.0.0 = 4149731103701412892 + field c330.poseidon.0.0 = 10268130195734144189 + field c331.poseidon.0.0 = 13406631635880074708 + field c332.poseidon.0.0 = 11429218277824986203 + field c333.poseidon.0.0 = 15773968030812198565 + field c334.poseidon.0.0 = 16050275277550506872 + field c335.poseidon.0.0 = 11858586752031736643 + field c336.poseidon.0.0 = 8927746344866569756 + field c337.poseidon.0.0 = 11802068403177695792 + field c338.poseidon.0.0 = 157833420806751556 + field c339.poseidon.0.0 = 4698875910749767878 + field c340.poseidon.0.0 = 1616722774788291698 + field c341.poseidon.0.0 = 3990951895163748090 + field c342.poseidon.0.0 = 16758609224720795472 + field c343.poseidon.0.0 = 3045571693290741477 + field c344.poseidon.0.0 = 9281634245289836419 + field c345.poseidon.0.0 = 13517688176723875370 + field c346.poseidon.0.0 = 7961395585333219380 + field c347.poseidon.0.0 = 1606574359105691080 + field c348.poseidon.0.0 = 17564372683613562171 + field c349.poseidon.0.0 = 4664015225343144418 + field c350.poseidon.0.0 = 6133721340680280128 + field c351.poseidon.0.0 = 2667022304383014929 + field c352.poseidon.0.0 = 12316557761857340230 + field c353.poseidon.0.0 = 10375614850625292317 + field c354.poseidon.0.0 = 8141542666379135068 + field c355.poseidon.0.0 = 9185476451083834432 + field c356.poseidon.0.0 = 4991072365274649547 + field c357.poseidon.0.0 = 17398204971778820365 + field c358.poseidon.0.0 = 16127888338958422584 + field c359.poseidon.0.0 = 13586792051317758204 + field mc.poseidon.0.0 = 17 + field mc1.poseidon.0.0 = 15 + field mc2.poseidon.0.0 = 41 + field mc3.poseidon.0.0 = 16 + field mc4.poseidon.0.0 = 2 + field mc5.poseidon.0.0 = 28 + field mc6.poseidon.0.0 = 13 + field mc7.poseidon.0.0 = 13 + field mc8.poseidon.0.0 = 39 + field mc9.poseidon.0.0 = 18 + field mc10.poseidon.0.0 = 34 + field mc11.poseidon.0.0 = 20 + field md.poseidon.0.0 = 8 + field md1.poseidon.0.0 = 0 + field md2.poseidon.0.0 = 0 + field md3.poseidon.0.0 = 0 + field md4.poseidon.0.0 = 0 + field md5.poseidon.0.0 = 0 + field md6.poseidon.0.0 = 0 + field md7.poseidon.0.0 = 0 + field md8.poseidon.0.0 = 0 + field md9.poseidon.0.0 = 0 + field md10.poseidon.0.0 = 0 + field md11.poseidon.0.0 = 0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c0.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c1.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c2.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c3.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c4.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c5.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c6.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c7.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c8.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c9.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c1.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c11.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c12.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c13.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c14.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c15.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c16.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c17.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c18.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c19.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c2.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c21.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c22.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c23.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c24.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c25.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c26.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c27.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c28.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c29.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c3.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c31.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c32.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c33.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c34.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c35.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c36.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c37.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c38.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c39.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c4.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c41.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c42.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c43.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c44.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c45.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c46.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c47.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c48.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c49.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c5.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c51.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c52.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c53.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c54.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c55.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c56.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c57.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c58.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c59.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c6.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c61.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c62.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c63.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c64.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c65.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c66.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c67.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c68.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c69.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c7.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c71.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c72.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c73.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c74.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c75.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c76.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c77.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c78.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c79.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c8.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c81.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c82.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c83.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c84.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c85.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c86.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c87.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c88.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c89.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c9.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c91.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c92.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c93.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c94.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c95.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c96.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c97.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c98.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c99.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c1.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c11.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c12.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c13.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c14.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c15.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c16.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c17.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c18.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c19.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c110.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c111.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c112.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c113.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c114.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c115.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c116.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c117.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c118.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c119.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c120.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c121.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c122.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c123.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c124.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c125.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c126.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c127.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c128.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c129.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c130.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c131.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c132.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c133.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c134.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c135.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c136.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c137.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c138.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c139.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c140.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c141.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c142.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c143.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c144.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c145.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c146.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c147.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c148.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c149.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c150.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c151.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c152.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c153.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c154.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c155.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c156.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c157.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c158.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c159.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c160.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c161.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c162.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c163.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c164.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c165.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c166.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c167.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c168.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c169.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c170.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c171.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c172.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c173.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c174.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c175.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c176.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c177.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c178.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c179.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c180.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c181.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c182.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c183.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c184.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c185.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c186.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c187.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c188.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c189.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c190.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c191.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c192.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c193.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c194.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c195.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c196.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c197.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c198.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c199.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c2.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c21.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c22.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c23.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c24.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c25.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c26.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c27.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c28.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c29.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c210.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c211.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c212.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c213.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c214.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c215.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c216.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c217.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c218.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c219.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c220.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c221.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c222.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c223.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c224.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c225.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c226.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c227.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c228.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c229.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c230.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c231.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c232.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c233.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c234.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c235.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c236.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c237.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c238.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c239.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c240.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c241.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c242.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c243.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c244.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c245.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c246.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c247.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c248.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c249.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c250.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c251.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c252.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c253.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c254.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c255.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c256.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c257.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c258.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c259.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c260.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c261.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c262.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c263.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c264.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c265.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c266.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c267.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c268.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c269.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c270.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c271.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c272.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c273.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c274.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c275.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c276.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c277.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c278.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c279.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c280.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c281.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c282.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c283.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c284.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c285.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c286.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c287.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c288.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c289.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c290.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c291.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c292.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c293.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c294.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c295.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c296.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c297.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c298.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c299.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c3.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c31.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c32.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c33.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c34.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c35.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c36.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c37.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c38.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c39.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c310.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c311.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c312.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c313.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c314.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c315.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c316.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c317.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c318.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c319.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c320.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c321.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c322.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c323.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c324.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c325.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c326.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c327.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c328.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c329.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c330.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c331.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c332.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c333.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c334.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c335.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c336.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c337.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c338.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c339.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c340.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c341.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c342.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c343.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c344.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c345.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c346.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c347.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field state0.poseidon.0.0 = state0.poseidon.0.0 + c348.poseidon.0.0 + field state1.poseidon.0.0 = state1.poseidon.0.0 + c349.poseidon.0.0 + field state2.poseidon.0.0 = state2.poseidon.0.0 + c350.poseidon.0.0 + field state3.poseidon.0.0 = state3.poseidon.0.0 + c351.poseidon.0.0 + field state4.poseidon.0.0 = state4.poseidon.0.0 + c352.poseidon.0.0 + field state5.poseidon.0.0 = state5.poseidon.0.0 + c353.poseidon.0.0 + field state6.poseidon.0.0 = state6.poseidon.0.0 + c354.poseidon.0.0 + field state7.poseidon.0.0 = state7.poseidon.0.0 + c355.poseidon.0.0 + field state8.poseidon.0.0 = state8.poseidon.0.0 + c356.poseidon.0.0 + field state9.poseidon.0.0 = state9.poseidon.0.0 + c357.poseidon.0.0 + field state10.poseidon.0.0 = state10.poseidon.0.0 + c358.poseidon.0.0 + field state11.poseidon.0.0 = state11.poseidon.0.0 + c359.poseidon.0.0 + field new_state0.poseidon.0.0 = state0.poseidon.0.0 ** 7 + field new_state1.poseidon.0.0 = state1.poseidon.0.0 ** 7 + field new_state2.poseidon.0.0 = state2.poseidon.0.0 ** 7 + field new_state3.poseidon.0.0 = state3.poseidon.0.0 ** 7 + field new_state4.poseidon.0.0 = state4.poseidon.0.0 ** 7 + field new_state5.poseidon.0.0 = state5.poseidon.0.0 ** 7 + field new_state6.poseidon.0.0 = state6.poseidon.0.0 ** 7 + field new_state7.poseidon.0.0 = state7.poseidon.0.0 ** 7 + field new_state8.poseidon.0.0 = state8.poseidon.0.0 ** 7 + field new_state9.poseidon.0.0 = state9.poseidon.0.0 ** 7 + field new_state10.poseidon.0.0 = state10.poseidon.0.0 ** 7 + field new_state11.poseidon.0.0 = state11.poseidon.0.0 ** 7 + field state0.poseidon.0.0 = new_state0.poseidon.0.0 * md.poseidon.0.0 + new_state0.poseidon.0.0 * mc.poseidon.0.0 + new_state1.poseidon.0.0 * mc1.poseidon.0.0 + new_state2.poseidon.0.0 * mc2.poseidon.0.0 + new_state3.poseidon.0.0 * mc3.poseidon.0.0 + new_state4.poseidon.0.0 * mc4.poseidon.0.0 + new_state5.poseidon.0.0 * mc5.poseidon.0.0 + new_state6.poseidon.0.0 * mc6.poseidon.0.0 + new_state7.poseidon.0.0 * mc7.poseidon.0.0 + new_state8.poseidon.0.0 * mc8.poseidon.0.0 + new_state9.poseidon.0.0 * mc9.poseidon.0.0 + new_state10.poseidon.0.0 * mc10.poseidon.0.0 + new_state11.poseidon.0.0 * mc11.poseidon.0.0 + field state1.poseidon.0.0 = new_state1.poseidon.0.0 * md1.poseidon.0.0 + new_state1.poseidon.0.0 * mc.poseidon.0.0 + new_state2.poseidon.0.0 * mc1.poseidon.0.0 + new_state3.poseidon.0.0 * mc2.poseidon.0.0 + new_state4.poseidon.0.0 * mc3.poseidon.0.0 + new_state5.poseidon.0.0 * mc4.poseidon.0.0 + new_state6.poseidon.0.0 * mc5.poseidon.0.0 + new_state7.poseidon.0.0 * mc6.poseidon.0.0 + new_state8.poseidon.0.0 * mc7.poseidon.0.0 + new_state9.poseidon.0.0 * mc8.poseidon.0.0 + new_state10.poseidon.0.0 * mc9.poseidon.0.0 + new_state11.poseidon.0.0 * mc10.poseidon.0.0 + new_state0.poseidon.0.0 * mc11.poseidon.0.0 + field state2.poseidon.0.0 = new_state2.poseidon.0.0 * md2.poseidon.0.0 + new_state2.poseidon.0.0 * mc.poseidon.0.0 + new_state3.poseidon.0.0 * mc1.poseidon.0.0 + new_state4.poseidon.0.0 * mc2.poseidon.0.0 + new_state5.poseidon.0.0 * mc3.poseidon.0.0 + new_state6.poseidon.0.0 * mc4.poseidon.0.0 + new_state7.poseidon.0.0 * mc5.poseidon.0.0 + new_state8.poseidon.0.0 * mc6.poseidon.0.0 + new_state9.poseidon.0.0 * mc7.poseidon.0.0 + new_state10.poseidon.0.0 * mc8.poseidon.0.0 + new_state11.poseidon.0.0 * mc9.poseidon.0.0 + new_state0.poseidon.0.0 * mc10.poseidon.0.0 + new_state1.poseidon.0.0 * mc11.poseidon.0.0 + field state3.poseidon.0.0 = new_state3.poseidon.0.0 * md3.poseidon.0.0 + new_state3.poseidon.0.0 * mc.poseidon.0.0 + new_state4.poseidon.0.0 * mc1.poseidon.0.0 + new_state5.poseidon.0.0 * mc2.poseidon.0.0 + new_state6.poseidon.0.0 * mc3.poseidon.0.0 + new_state7.poseidon.0.0 * mc4.poseidon.0.0 + new_state8.poseidon.0.0 * mc5.poseidon.0.0 + new_state9.poseidon.0.0 * mc6.poseidon.0.0 + new_state10.poseidon.0.0 * mc7.poseidon.0.0 + new_state11.poseidon.0.0 * mc8.poseidon.0.0 + new_state0.poseidon.0.0 * mc9.poseidon.0.0 + new_state1.poseidon.0.0 * mc10.poseidon.0.0 + new_state2.poseidon.0.0 * mc11.poseidon.0.0 + field state4.poseidon.0.0 = new_state4.poseidon.0.0 * md4.poseidon.0.0 + new_state4.poseidon.0.0 * mc.poseidon.0.0 + new_state5.poseidon.0.0 * mc1.poseidon.0.0 + new_state6.poseidon.0.0 * mc2.poseidon.0.0 + new_state7.poseidon.0.0 * mc3.poseidon.0.0 + new_state8.poseidon.0.0 * mc4.poseidon.0.0 + new_state9.poseidon.0.0 * mc5.poseidon.0.0 + new_state10.poseidon.0.0 * mc6.poseidon.0.0 + new_state11.poseidon.0.0 * mc7.poseidon.0.0 + new_state0.poseidon.0.0 * mc8.poseidon.0.0 + new_state1.poseidon.0.0 * mc9.poseidon.0.0 + new_state2.poseidon.0.0 * mc10.poseidon.0.0 + new_state3.poseidon.0.0 * mc11.poseidon.0.0 + field state5.poseidon.0.0 = new_state5.poseidon.0.0 * md5.poseidon.0.0 + new_state5.poseidon.0.0 * mc.poseidon.0.0 + new_state6.poseidon.0.0 * mc1.poseidon.0.0 + new_state7.poseidon.0.0 * mc2.poseidon.0.0 + new_state8.poseidon.0.0 * mc3.poseidon.0.0 + new_state9.poseidon.0.0 * mc4.poseidon.0.0 + new_state10.poseidon.0.0 * mc5.poseidon.0.0 + new_state11.poseidon.0.0 * mc6.poseidon.0.0 + new_state0.poseidon.0.0 * mc7.poseidon.0.0 + new_state1.poseidon.0.0 * mc8.poseidon.0.0 + new_state2.poseidon.0.0 * mc9.poseidon.0.0 + new_state3.poseidon.0.0 * mc10.poseidon.0.0 + new_state4.poseidon.0.0 * mc11.poseidon.0.0 + field state6.poseidon.0.0 = new_state6.poseidon.0.0 * md6.poseidon.0.0 + new_state6.poseidon.0.0 * mc.poseidon.0.0 + new_state7.poseidon.0.0 * mc1.poseidon.0.0 + new_state8.poseidon.0.0 * mc2.poseidon.0.0 + new_state9.poseidon.0.0 * mc3.poseidon.0.0 + new_state10.poseidon.0.0 * mc4.poseidon.0.0 + new_state11.poseidon.0.0 * mc5.poseidon.0.0 + new_state0.poseidon.0.0 * mc6.poseidon.0.0 + new_state1.poseidon.0.0 * mc7.poseidon.0.0 + new_state2.poseidon.0.0 * mc8.poseidon.0.0 + new_state3.poseidon.0.0 * mc9.poseidon.0.0 + new_state4.poseidon.0.0 * mc10.poseidon.0.0 + new_state5.poseidon.0.0 * mc11.poseidon.0.0 + field state7.poseidon.0.0 = new_state7.poseidon.0.0 * md7.poseidon.0.0 + new_state7.poseidon.0.0 * mc.poseidon.0.0 + new_state8.poseidon.0.0 * mc1.poseidon.0.0 + new_state9.poseidon.0.0 * mc2.poseidon.0.0 + new_state10.poseidon.0.0 * mc3.poseidon.0.0 + new_state11.poseidon.0.0 * mc4.poseidon.0.0 + new_state0.poseidon.0.0 * mc5.poseidon.0.0 + new_state1.poseidon.0.0 * mc6.poseidon.0.0 + new_state2.poseidon.0.0 * mc7.poseidon.0.0 + new_state3.poseidon.0.0 * mc8.poseidon.0.0 + new_state4.poseidon.0.0 * mc9.poseidon.0.0 + new_state5.poseidon.0.0 * mc10.poseidon.0.0 + new_state6.poseidon.0.0 * mc11.poseidon.0.0 + field state8.poseidon.0.0 = new_state8.poseidon.0.0 * md8.poseidon.0.0 + new_state8.poseidon.0.0 * mc.poseidon.0.0 + new_state9.poseidon.0.0 * mc1.poseidon.0.0 + new_state10.poseidon.0.0 * mc2.poseidon.0.0 + new_state11.poseidon.0.0 * mc3.poseidon.0.0 + new_state0.poseidon.0.0 * mc4.poseidon.0.0 + new_state1.poseidon.0.0 * mc5.poseidon.0.0 + new_state2.poseidon.0.0 * mc6.poseidon.0.0 + new_state3.poseidon.0.0 * mc7.poseidon.0.0 + new_state4.poseidon.0.0 * mc8.poseidon.0.0 + new_state5.poseidon.0.0 * mc9.poseidon.0.0 + new_state6.poseidon.0.0 * mc10.poseidon.0.0 + new_state7.poseidon.0.0 * mc11.poseidon.0.0 + field state9.poseidon.0.0 = new_state9.poseidon.0.0 * md9.poseidon.0.0 + new_state9.poseidon.0.0 * mc.poseidon.0.0 + new_state10.poseidon.0.0 * mc1.poseidon.0.0 + new_state11.poseidon.0.0 * mc2.poseidon.0.0 + new_state0.poseidon.0.0 * mc3.poseidon.0.0 + new_state1.poseidon.0.0 * mc4.poseidon.0.0 + new_state2.poseidon.0.0 * mc5.poseidon.0.0 + new_state3.poseidon.0.0 * mc6.poseidon.0.0 + new_state4.poseidon.0.0 * mc7.poseidon.0.0 + new_state5.poseidon.0.0 * mc8.poseidon.0.0 + new_state6.poseidon.0.0 * mc9.poseidon.0.0 + new_state7.poseidon.0.0 * mc10.poseidon.0.0 + new_state8.poseidon.0.0 * mc11.poseidon.0.0 + field state10.poseidon.0.0 = new_state10.poseidon.0.0 * md10.poseidon.0.0 + new_state10.poseidon.0.0 * mc.poseidon.0.0 + new_state11.poseidon.0.0 * mc1.poseidon.0.0 + new_state0.poseidon.0.0 * mc2.poseidon.0.0 + new_state1.poseidon.0.0 * mc3.poseidon.0.0 + new_state2.poseidon.0.0 * mc4.poseidon.0.0 + new_state3.poseidon.0.0 * mc5.poseidon.0.0 + new_state4.poseidon.0.0 * mc6.poseidon.0.0 + new_state5.poseidon.0.0 * mc7.poseidon.0.0 + new_state6.poseidon.0.0 * mc8.poseidon.0.0 + new_state7.poseidon.0.0 * mc9.poseidon.0.0 + new_state8.poseidon.0.0 * mc10.poseidon.0.0 + new_state9.poseidon.0.0 * mc11.poseidon.0.0 + field state11.poseidon.0.0 = new_state11.poseidon.0.0 * md11.poseidon.0.0 + new_state11.poseidon.0.0 * mc.poseidon.0.0 + new_state0.poseidon.0.0 * mc1.poseidon.0.0 + new_state1.poseidon.0.0 * mc2.poseidon.0.0 + new_state2.poseidon.0.0 * mc3.poseidon.0.0 + new_state3.poseidon.0.0 * mc4.poseidon.0.0 + new_state4.poseidon.0.0 * mc5.poseidon.0.0 + new_state5.poseidon.0.0 * mc6.poseidon.0.0 + new_state6.poseidon.0.0 * mc7.poseidon.0.0 + new_state7.poseidon.0.0 * mc8.poseidon.0.0 + new_state8.poseidon.0.0 * mc9.poseidon.0.0 + new_state9.poseidon.0.0 * mc10.poseidon.0.0 + new_state10.poseidon.0.0 * mc11.poseidon.0.0 + field[12 ] array^0.poseidon.0.0 + field init^0^0.poseidon.0.0 = state0.poseidon.0.0 + field init^0^1.poseidon.0.0 = state1.poseidon.0.0 + field init^0^2.poseidon.0.0 = state2.poseidon.0.0 + field init^0^3.poseidon.0.0 = state3.poseidon.0.0 + field init^0^4.poseidon.0.0 = state4.poseidon.0.0 + field init^0^5.poseidon.0.0 = state5.poseidon.0.0 + field init^0^6.poseidon.0.0 = state6.poseidon.0.0 + field init^0^7.poseidon.0.0 = state7.poseidon.0.0 + field init^0^8.poseidon.0.0 = state8.poseidon.0.0 + field init^0^9.poseidon.0.0 = state9.poseidon.0.0 + field init^0^10.poseidon.0.0 = state10.poseidon.0.0 + field init^0^11.poseidon.0.0 = state11.poseidon.0.0 + array^0.poseidon.0.0[0 ] = init^0^0.poseidon.0.0 , init + array^0.poseidon.0.0[1 ] = init^0^1.poseidon.0.0 , init + array^0.poseidon.0.0[2 ] = init^0^2.poseidon.0.0 , init + array^0.poseidon.0.0[3 ] = init^0^3.poseidon.0.0 , init + array^0.poseidon.0.0[4 ] = init^0^4.poseidon.0.0 , init + array^0.poseidon.0.0[5 ] = init^0^5.poseidon.0.0 , init + array^0.poseidon.0.0[6 ] = init^0^6.poseidon.0.0 , init + array^0.poseidon.0.0[7 ] = init^0^7.poseidon.0.0 , init + array^0.poseidon.0.0[8 ] = init^0^8.poseidon.0.0 , init + array^0.poseidon.0.0[9 ] = init^0^9.poseidon.0.0 , init + array^0.poseidon.0.0[10 ] = init^0^10.poseidon.0.0 , init + array^0.poseidon.0.0[11 ] = init^0^11.poseidon.0.0 , init + field %RET.poseidon = array^0.poseidon.0.0 +Transition: -> rp@.poseidon + +Block 18: +Func: poseidon, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: - +Inputs: +Outputs: +Instructions: +Transition: -> rp@.poseidon + + +-- +Optimization: + + +-- +Post-Processing: +Entry block: 0 + +Block 0: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 12 +Num Cons: 19 +Inputs: + %i1(BN): field + %i4(AS): field +Outputs: + %o1(BN): field + %o4(AS): field + %o3(TS): field + %o7: field + %o8: u32 + %o9: field +Instructions: + assert %i1(BN) == 0 + field %w2(AS) = %i4(AS) + field %w1(TS) = 0 + field[12 ] %w5 + field %w6 = 1 + field %w7 = 2 + field %w8 = 3 + field %w9 = 4 + field %w10 = 5 + field %w11 = 6 + field %w12 = 7 + field %w13 = 8 + field %w14 = 0 + field %w15 = 0 + field %w16 = 0 + field %w17 = 0 + %w5[0 ] = %w6 , init + %w5[1 ] = %w7 , init + %w5[2 ] = %w8 , init + %w5[3 ] = %w9 , init + %w5[4 ] = %w10 , init + %w5[5 ] = %w11 , init + %w5[6 ] = %w12 , init + %w5[7 ] = %w13 , init + %w5[8 ] = %w14 , init + %w5[9 ] = %w15 , init + %w5[10 ] = %w16 , init + %w5[11 ] = %w17 , init + field %w18 = %w5 + field %w19 = 0 + u32 %w20 = 0 + assert %o4(AS) == %w2(AS) + assert %o3(TS) == %w1(TS) + assert %o7 == %w19 + assert %o8 == %w20 + assert %o9 == %w18 + assert %o1(BN) == %w20 != 1000000 ? 1 : 2 +Transition: + %w20 != 1000000 ? -> 1 : -> 2 + +Block 1: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 36 +Num Cons: 811 +Inputs: + %i1(BN): field + %i4(AS): field + %i3(TS): field + %i7: field + %i8: u32 + %i9: field +Outputs: + %o1(BN): field + %o4(AS): field + %o3(TS): field + %o7: field + %o8: u32 + %o9: field +Instructions: + assert %i1(BN) == 1 + field %w2(AS) = %i4(AS) + field %w1(TS) = %i3(TS) + field %w19 = %i7 + u32 %w20 = %i8 + field %w18 = %i9 + field %w21 = %w18 + field %w22 = %w21[0 ] + field %w23 = %w22 + field %w22 = %w21[1 ] + field %w24 = %w22 + field %w22 = %w21[2 ] + field %w25 = %w22 + field %w22 = %w21[3 ] + field %w26 = %w22 + field %w22 = %w21[4 ] + field %w27 = %w22 + field %w22 = %w21[5 ] + field %w28 = %w22 + field %w22 = %w21[6 ] + field %w29 = %w22 + field %w22 = %w21[7 ] + field %w30 = %w22 + field %w22 = %w21[8 ] + field %w31 = %w22 + field %w22 = %w21[9 ] + field %w32 = %w22 + field %w22 = %w21[10 ] + field %w33 = %w22 + field %w22 = %w21[11 ] + field %w34 = %w22 + field %w35 = 13080132714287612933 + field %w36 = 8594738767457295063 + field %w37 = 12896916465481390516 + field %w38 = 1109962092811921367 + field %w39 = 16216730422861946898 + field %w40 = 10137062673499593713 + field %w41 = 15292064466732465823 + field %w42 = 17255573294985989181 + field %w43 = 14827154241873003558 + field %w44 = 2846171647972703231 + field %w45 = 16246264663680317601 + field %w46 = 14214208087951879286 + field %w47 = 9667108687426275457 + field %w48 = 6470857420712283733 + field %w49 = 14103331940138337652 + field %w50 = 11854816473550292865 + field %w51 = 3498097497301325516 + field %w52 = 7947235692523864220 + field %w53 = 11110078701231901946 + field %w54 = 16384314112672821048 + field %w55 = 15404405912655775739 + field %w56 = 14077880830714445579 + field %w57 = 9555554662709218279 + field %w58 = 13859595358210603949 + field %w59 = 16859897325061800066 + field %w60 = 17685474420222222349 + field %w61 = 17858764734618734949 + field %w62 = 9410011022665866671 + field %w63 = 12495243629579414666 + field %w64 = 12416945298171515742 + field %w65 = 5776666812364270983 + field %w66 = 6314421662864060481 + field %w67 = 7402742471423223171 + field %w68 = 982536713192432718 + field %w69 = 17321168865775127905 + field %w70 = 2934354895005980211 + field %w71 = 10567510598607410195 + field %w72 = 8135543733717919110 + field %w73 = 116353493081713692 + field %w74 = 8029688163494945618 + field %w75 = 9003846637224807585 + field %w76 = 7052445132467233849 + field %w77 = 9645665432288852853 + field %w78 = 5446430061030868787 + field %w79 = 16770910634346036823 + field %w80 = 17708360571433944729 + field %w81 = 4661556288322237631 + field %w82 = 11977051899316327985 + field %w83 = 4378616569090929672 + field %w84 = 3334807502817538491 + field %w85 = 8019184735943344966 + field %w86 = 2395043908812246395 + field %w87 = 6558421058331732611 + field %w88 = 11735894060727326369 + field %w89 = 8143540538889204488 + field %w90 = 5991753489563751169 + field %w91 = 12235918791502088007 + field %w92 = 2880312033702687139 + field %w93 = 18224748115308382355 + field %w94 = 18070411013125314165 + field %w95 = 8156487614120951180 + field %w96 = 10615269510047010719 + field %w97 = 12489426404754222075 + field %w98 = 5055279340069995710 + field %w99 = 7231927319780248664 + field %w100 = 2602078848106763799 + field %w101 = 12445944369334781425 + field %w102 = 3978905923892496205 + field %w103 = 16711272944329818038 + field %w104 = 10439032361227108922 + field %w105 = 15110119871725214866 + field %w106 = 821141790655890946 + field %w107 = 11073536380651186235 + field %w108 = 4866839313097607757 + field %w109 = 13118391689513956636 + field %w110 = 14527674973762312380 + field %w111 = 7612751959265567999 + field %w112 = 6808090907814178161 + field %w113 = 6899703779492644997 + field %w114 = 3664666286336986826 + field %w115 = 783179505424462608 + field %w116 = 8990689241814097697 + field %w117 = 9646603555412825679 + field %w118 = 7351246026167205041 + field %w119 = 16970959813722173256 + field %w120 = 15735726858241466429 + field %w121 = 10347018221892268419 + field %w122 = 12195545878449322889 + field %w123 = 7423314197114049891 + field %w124 = 14908016116973904153 + field %w125 = 5840340122527363265 + field %w126 = 17740311462440614128 + field %w127 = 815306421953744623 + field %w128 = 17456357368219253949 + field %w129 = 6982651076559329072 + field %w130 = 11970987324614963868 + field %w131 = 8167785008538063246 + field %w132 = 9483259819397403968 + field %w133 = 954550221664291548 + field %w134 = 10339565171024313256 + field %w135 = 8651171084286500102 + field %w136 = 16974445528003515956 + field %w137 = 15104530047940621190 + field %w138 = 103271880867179718 + field %w139 = 14654666245504492663 + field %w140 = 12445769555936887967 + field %w141 = 11250582358051997490 + field %w142 = 6730977207490590241 + field %w143 = 15919951556166196935 + field %w144 = 4423540216573360915 + field %w145 = 16317664700341473511 + field %w146 = 4723997214951767765 + field %w147 = 10098756619006575500 + field %w148 = 3223149401237667964 + field %w149 = 6870494874300767682 + field %w150 = 2902095711130291898 + field %w151 = 7159372652788439733 + field %w152 = 11500508372997952671 + field %w153 = 13348148181479462670 + field %w154 = 12729401155983882093 + field %w155 = 15021242795466053388 + field %w156 = 3802990509227527157 + field %w157 = 4665459515680145682 + field %w158 = 13165553315407675603 + field %w159 = 6496364397926233172 + field %w160 = 12800832566287577810 + field %w161 = 9737592377590267426 + field %w162 = 8687131091302514939 + field %w163 = 1488200421755445892 + field %w164 = 11004377668730991641 + field %w165 = 13516338734600228410 + field %w166 = 2953581820660217936 + field %w167 = 3505040783153922951 + field %w168 = 3710332827435113697 + field %w169 = 15414874040873320221 + field %w170 = 8602547649919482301 + field %w171 = 13971349938398812007 + field %w172 = 187239246702636066 + field %w173 = 12886019973971254144 + field %w174 = 4512274763990493707 + field %w175 = 2986635507805503192 + field %w176 = 2315252455709119454 + field %w177 = 12537995864054210246 + field %w178 = 2039491936479859267 + field %w179 = 1558644089185031256 + field %w180 = 4074089203264759305 + field %w181 = 2522268501749395707 + field %w182 = 3414760436185256196 + field %w183 = 17420887529146466921 + field %w184 = 2817020417938125001 + field %w185 = 16538346563888261485 + field %w186 = 5592270336833998770 + field %w187 = 16876602064684906232 + field %w188 = 1793025614521516343 + field %w189 = 2178510518148748532 + field %w190 = 2726440714374752509 + field %w191 = 6502946837278398021 + field %w192 = 15816362857667988792 + field %w193 = 12997958454165692924 + field %w194 = 5314892854495903792 + field %w195 = 15533907063555687782 + field %w196 = 12312015675698548715 + field %w197 = 14140016464013350248 + field %w198 = 16325589062962838690 + field %w199 = 6796145646370327654 + field %w200 = 1168753512742361735 + field %w201 = 4100789820704709368 + field %w202 = 15947554381540469177 + field %w203 = 8597377839806076919 + field %w204 = 9704018824195918000 + field %w205 = 12763288618765762688 + field %w206 = 17249257732622847695 + field %w207 = 1998710993415069759 + field %w208 = 923759906393011543 + field %w209 = 1271051229666811593 + field %w210 = 17822362132088738077 + field %w211 = 11797234543722669271 + field %w212 = 5864538787265942447 + field %w213 = 15975583211110506970 + field %w214 = 7258516085733671960 + field %w215 = 17999926471875633100 + field %w216 = 635992114476018166 + field %w217 = 17205047318256576347 + field %w218 = 17384900867876315312 + field %w219 = 16484825562915784226 + field %w220 = 16694130609036138894 + field %w221 = 10575069350371260875 + field %w222 = 8330575162062887277 + field %w223 = 6212375704691932880 + field %w224 = 15965138197626618226 + field %w225 = 14285453069600046939 + field %w226 = 10005163510208402517 + field %w227 = 885298637936952595 + field %w228 = 541790758138118921 + field %w229 = 5985203084790372993 + field %w230 = 4685030219775483721 + field %w231 = 1411106851304815020 + field %w232 = 11290732479954096478 + field %w233 = 208280581124868513 + field %w234 = 10979018648467968495 + field %w235 = 8600643745023338215 + field %w236 = 3477453626867126061 + field %w237 = 6428436309340258604 + field %w238 = 5695415667275657934 + field %w239 = 15952065508715623490 + field %w240 = 15571300830419767248 + field %w241 = 17259785660502616862 + field %w242 = 4298425495274316083 + field %w243 = 9023601070579319352 + field %w244 = 7353589709321807492 + field %w245 = 2988848909076209475 + field %w246 = 10439527789422046135 + field %w247 = 6097734044161429459 + field %w248 = 1113429873817861476 + field %w249 = 1639063372386966591 + field %w250 = 7863102812716788759 + field %w251 = 216040220732135364 + field %w252 = 14252611488623712688 + field %w253 = 9543395466794536974 + field %w254 = 2714461051639810934 + field %w255 = 2588317208781407279 + field %w256 = 15458529123534594916 + field %w257 = 15748417817551040856 + field %w258 = 16414455697114422951 + field %w259 = 13378164466674639511 + field %w260 = 13894319928411294675 + field %w261 = 5032680892090751540 + field %w262 = 17201338494743078916 + field %w263 = 4397422800601932505 + field %w264 = 11285062031581972327 + field %w265 = 7309354640676468207 + field %w266 = 10457152817239331848 + field %w267 = 8855911538863247046 + field %w268 = 4301853449821814398 + field %w269 = 13001502396339103326 + field %w270 = 10218424535115580246 + field %w271 = 8628244713920681895 + field %w272 = 17410423622514037261 + field %w273 = 14080683768439215375 + field %w274 = 11453161143447188100 + field %w275 = 16761509772042181939 + field %w276 = 6688821660695954082 + field %w277 = 12083434295263160416 + field %w278 = 8540021431714616589 + field %w279 = 6891616215679974226 + field %w280 = 10229217098454812721 + field %w281 = 3292165387203778711 + field %w282 = 6090113424998243490 + field %w283 = 13431780521962358660 + field %w284 = 6061081364215809883 + field %w285 = 16792066504222214142 + field %w286 = 16134314044798124799 + field %w287 = 17070233710126619765 + field %w288 = 6915716851370550800 + field %w289 = 9505009849073026581 + field %w290 = 6422700465081897153 + field %w291 = 17977653991560529185 + field %w292 = 5800870252836247255 + field %w293 = 12096124733159345520 + field %w294 = 7679273623392321940 + field %w295 = 17835783910585744964 + field %w296 = 2478664878205754377 + field %w297 = 1720314468413114967 + field %w298 = 10376757819003248056 + field %w299 = 10376377187857634245 + field %w300 = 13344930747504284997 + field %w301 = 11579281865160153596 + field %w302 = 10300256980048736962 + field %w303 = 378765236515040565 + field %w304 = 11412420941557253424 + field %w305 = 12931662470734252786 + field %w306 = 43018908376346374 + field %w307 = 3589810689190160071 + field %w308 = 4688229274750659741 + field %w309 = 13688957436484306091 + field %w310 = 11424740943016984272 + field %w311 = 16001900718237913960 + field %w312 = 5548469743008097574 + field %w313 = 14584404916672178680 + field %w314 = 3396622135873576824 + field %w315 = 7861729246871155992 + field %w316 = 16112271126908045545 + field %w317 = 16988163966860016012 + field %w318 = 273641680619529493 + field %w319 = 15222677154027327363 + field %w320 = 4070328078309830604 + field %w321 = 13520458500363296391 + field %w322 = 8235111705801363015 + field %w323 = 5575990058472514138 + field %w324 = 2751301609188252989 + field %w325 = 6478598528223547074 + field %w326 = 386565553848556638 + field %w327 = 9417729078939938713 + field %w328 = 15204315939835727483 + field %w329 = 14942015033780606261 + field %w330 = 18369423901636582012 + field %w331 = 4715338437538604447 + field %w332 = 6840590980607806319 + field %w333 = 5535471161490539014 + field %w334 = 5341328005359029952 + field %w335 = 1475161295215894444 + field %w336 = 7999197814297036636 + field %w337 = 2984233088665867938 + field %w338 = 3097746028144832229 + field %w339 = 8849530863480031517 + field %w340 = 7464920943249009773 + field %w341 = 3802996844641460514 + field %w342 = 6284458522545927646 + field %w343 = 2307388003445002779 + field %w344 = 4461479354745457623 + field %w345 = 1649739722664588460 + field %w346 = 3008391274160432867 + field %w347 = 5142217010456550622 + field %w348 = 1775580461722730120 + field %w349 = 161694268822794344 + field %w350 = 1518963253808031703 + field %w351 = 16475258091652710137 + field %w352 = 119575899007375159 + field %w353 = 1275863735937973999 + field %w354 = 16539412514520642374 + field %w355 = 2303365191438051950 + field %w356 = 6435126839960916075 + field %w357 = 17794599201026020053 + field %w358 = 13847097589277840330 + field %w359 = 16645869274577729720 + field %w360 = 8039205965509554440 + field %w361 = 4788586935019371140 + field %w362 = 15129007200040077746 + field %w363 = 2055561615223771341 + field %w364 = 4149731103701412892 + field %w365 = 10268130195734144189 + field %w366 = 13406631635880074708 + field %w367 = 11429218277824986203 + field %w368 = 15773968030812198565 + field %w369 = 16050275277550506872 + field %w370 = 11858586752031736643 + field %w371 = 8927746344866569756 + field %w372 = 11802068403177695792 + field %w373 = 157833420806751556 + field %w374 = 4698875910749767878 + field %w375 = 1616722774788291698 + field %w376 = 3990951895163748090 + field %w377 = 16758609224720795472 + field %w378 = 3045571693290741477 + field %w379 = 9281634245289836419 + field %w380 = 13517688176723875370 + field %w381 = 7961395585333219380 + field %w382 = 1606574359105691080 + field %w383 = 17564372683613562171 + field %w384 = 4664015225343144418 + field %w385 = 6133721340680280128 + field %w386 = 2667022304383014929 + field %w387 = 12316557761857340230 + field %w388 = 10375614850625292317 + field %w389 = 8141542666379135068 + field %w390 = 9185476451083834432 + field %w391 = 4991072365274649547 + field %w392 = 17398204971778820365 + field %w393 = 16127888338958422584 + field %w394 = 13586792051317758204 + field %w395 = 17 + field %w396 = 15 + field %w397 = 41 + field %w398 = 16 + field %w399 = 2 + field %w400 = 28 + field %w401 = 13 + field %w402 = 13 + field %w403 = 39 + field %w404 = 18 + field %w405 = 34 + field %w406 = 20 + field %w407 = 8 + field %w408 = 0 + field %w409 = 0 + field %w410 = 0 + field %w411 = 0 + field %w412 = 0 + field %w413 = 0 + field %w414 = 0 + field %w415 = 0 + field %w416 = 0 + field %w417 = 0 + field %w418 = 0 + %w23 = %w23 + %w35 + %w24 = %w24 + %w36 + %w25 = %w25 + %w37 + %w26 = %w26 + %w38 + %w27 = %w27 + %w39 + %w28 = %w28 + %w40 + %w29 = %w29 + %w41 + %w30 = %w30 + %w42 + %w31 = %w31 + %w43 + %w32 = %w32 + %w44 + %w33 = %w33 + %w45 + %w34 = %w34 + %w46 + field %w419 = %w23 ** 7 + field %w420 = %w24 ** 7 + field %w421 = %w25 ** 7 + field %w422 = %w26 ** 7 + field %w423 = %w27 ** 7 + field %w424 = %w28 ** 7 + field %w425 = %w29 ** 7 + field %w426 = %w30 ** 7 + field %w427 = %w31 ** 7 + field %w428 = %w32 ** 7 + field %w429 = %w33 ** 7 + field %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w47 + %w24 = %w24 + %w48 + %w25 = %w25 + %w49 + %w26 = %w26 + %w50 + %w27 = %w27 + %w51 + %w28 = %w28 + %w52 + %w29 = %w29 + %w53 + %w30 = %w30 + %w54 + %w31 = %w31 + %w55 + %w32 = %w32 + %w56 + %w33 = %w33 + %w57 + %w34 = %w34 + %w58 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w59 + %w24 = %w24 + %w60 + %w25 = %w25 + %w61 + %w26 = %w26 + %w62 + %w27 = %w27 + %w63 + %w28 = %w28 + %w64 + %w29 = %w29 + %w65 + %w30 = %w30 + %w66 + %w31 = %w31 + %w67 + %w32 = %w32 + %w68 + %w33 = %w33 + %w69 + %w34 = %w34 + %w70 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w71 + %w24 = %w24 + %w72 + %w25 = %w25 + %w73 + %w26 = %w26 + %w74 + %w27 = %w27 + %w75 + %w28 = %w28 + %w76 + %w29 = %w29 + %w77 + %w30 = %w30 + %w78 + %w31 = %w31 + %w79 + %w32 = %w32 + %w80 + %w33 = %w33 + %w81 + %w34 = %w34 + %w82 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w83 + %w24 = %w24 + %w84 + %w25 = %w25 + %w85 + %w26 = %w26 + %w86 + %w27 = %w27 + %w87 + %w28 = %w28 + %w88 + %w29 = %w29 + %w89 + %w30 = %w30 + %w90 + %w31 = %w31 + %w91 + %w32 = %w32 + %w92 + %w33 = %w33 + %w93 + %w34 = %w34 + %w94 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w95 + %w24 = %w24 + %w96 + %w25 = %w25 + %w97 + %w26 = %w26 + %w98 + %w27 = %w27 + %w99 + %w28 = %w28 + %w100 + %w29 = %w29 + %w101 + %w30 = %w30 + %w102 + %w31 = %w31 + %w103 + %w32 = %w32 + %w104 + %w33 = %w33 + %w105 + %w34 = %w34 + %w106 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w107 + %w24 = %w24 + %w108 + %w25 = %w25 + %w109 + %w26 = %w26 + %w110 + %w27 = %w27 + %w111 + %w28 = %w28 + %w112 + %w29 = %w29 + %w113 + %w30 = %w30 + %w114 + %w31 = %w31 + %w115 + %w32 = %w32 + %w116 + %w33 = %w33 + %w117 + %w34 = %w34 + %w118 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w119 + %w24 = %w24 + %w120 + %w25 = %w25 + %w121 + %w26 = %w26 + %w122 + %w27 = %w27 + %w123 + %w28 = %w28 + %w124 + %w29 = %w29 + %w125 + %w30 = %w30 + %w126 + %w31 = %w31 + %w127 + %w32 = %w32 + %w128 + %w33 = %w33 + %w129 + %w34 = %w34 + %w130 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w131 + %w24 = %w24 + %w132 + %w25 = %w25 + %w133 + %w26 = %w26 + %w134 + %w27 = %w27 + %w135 + %w28 = %w28 + %w136 + %w29 = %w29 + %w137 + %w30 = %w30 + %w138 + %w31 = %w31 + %w139 + %w32 = %w32 + %w140 + %w33 = %w33 + %w141 + %w34 = %w34 + %w142 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w143 + %w24 = %w24 + %w144 + %w25 = %w25 + %w145 + %w26 = %w26 + %w146 + %w27 = %w27 + %w147 + %w28 = %w28 + %w148 + %w29 = %w29 + %w149 + %w30 = %w30 + %w150 + %w31 = %w31 + %w151 + %w32 = %w32 + %w152 + %w33 = %w33 + %w153 + %w34 = %w34 + %w154 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w155 + %w24 = %w24 + %w156 + %w25 = %w25 + %w157 + %w26 = %w26 + %w158 + %w27 = %w27 + %w159 + %w28 = %w28 + %w160 + %w29 = %w29 + %w161 + %w30 = %w30 + %w162 + %w31 = %w31 + %w163 + %w32 = %w32 + %w164 + %w33 = %w33 + %w165 + %w34 = %w34 + %w166 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w167 + %w24 = %w24 + %w168 + %w25 = %w25 + %w169 + %w26 = %w26 + %w170 + %w27 = %w27 + %w171 + %w28 = %w28 + %w172 + %w29 = %w29 + %w173 + %w30 = %w30 + %w174 + %w31 = %w31 + %w175 + %w32 = %w32 + %w176 + %w33 = %w33 + %w177 + %w34 = %w34 + %w178 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w179 + %w24 = %w24 + %w180 + %w25 = %w25 + %w181 + %w26 = %w26 + %w182 + %w27 = %w27 + %w183 + %w28 = %w28 + %w184 + %w29 = %w29 + %w185 + %w30 = %w30 + %w186 + %w31 = %w31 + %w187 + %w32 = %w32 + %w188 + %w33 = %w33 + %w189 + %w34 = %w34 + %w190 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w191 + %w24 = %w24 + %w192 + %w25 = %w25 + %w193 + %w26 = %w26 + %w194 + %w27 = %w27 + %w195 + %w28 = %w28 + %w196 + %w29 = %w29 + %w197 + %w30 = %w30 + %w198 + %w31 = %w31 + %w199 + %w32 = %w32 + %w200 + %w33 = %w33 + %w201 + %w34 = %w34 + %w202 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w203 + %w24 = %w24 + %w204 + %w25 = %w25 + %w205 + %w26 = %w26 + %w206 + %w27 = %w27 + %w207 + %w28 = %w28 + %w208 + %w29 = %w29 + %w209 + %w30 = %w30 + %w210 + %w31 = %w31 + %w211 + %w32 = %w32 + %w212 + %w33 = %w33 + %w213 + %w34 = %w34 + %w214 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w215 + %w24 = %w24 + %w216 + %w25 = %w25 + %w217 + %w26 = %w26 + %w218 + %w27 = %w27 + %w219 + %w28 = %w28 + %w220 + %w29 = %w29 + %w221 + %w30 = %w30 + %w222 + %w31 = %w31 + %w223 + %w32 = %w32 + %w224 + %w33 = %w33 + %w225 + %w34 = %w34 + %w226 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w227 + %w24 = %w24 + %w228 + %w25 = %w25 + %w229 + %w26 = %w26 + %w230 + %w27 = %w27 + %w231 + %w28 = %w28 + %w232 + %w29 = %w29 + %w233 + %w30 = %w30 + %w234 + %w31 = %w31 + %w235 + %w32 = %w32 + %w236 + %w33 = %w33 + %w237 + %w34 = %w34 + %w238 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w239 + %w24 = %w24 + %w240 + %w25 = %w25 + %w241 + %w26 = %w26 + %w242 + %w27 = %w27 + %w243 + %w28 = %w28 + %w244 + %w29 = %w29 + %w245 + %w30 = %w30 + %w246 + %w31 = %w31 + %w247 + %w32 = %w32 + %w248 + %w33 = %w33 + %w249 + %w34 = %w34 + %w250 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w251 + %w24 = %w24 + %w252 + %w25 = %w25 + %w253 + %w26 = %w26 + %w254 + %w27 = %w27 + %w255 + %w28 = %w28 + %w256 + %w29 = %w29 + %w257 + %w30 = %w30 + %w258 + %w31 = %w31 + %w259 + %w32 = %w32 + %w260 + %w33 = %w33 + %w261 + %w34 = %w34 + %w262 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w263 + %w24 = %w24 + %w264 + %w25 = %w25 + %w265 + %w26 = %w26 + %w266 + %w27 = %w27 + %w267 + %w28 = %w28 + %w268 + %w29 = %w29 + %w269 + %w30 = %w30 + %w270 + %w31 = %w31 + %w271 + %w32 = %w32 + %w272 + %w33 = %w33 + %w273 + %w34 = %w34 + %w274 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w275 + %w24 = %w24 + %w276 + %w25 = %w25 + %w277 + %w26 = %w26 + %w278 + %w27 = %w27 + %w279 + %w28 = %w28 + %w280 + %w29 = %w29 + %w281 + %w30 = %w30 + %w282 + %w31 = %w31 + %w283 + %w32 = %w32 + %w284 + %w33 = %w33 + %w285 + %w34 = %w34 + %w286 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w287 + %w24 = %w24 + %w288 + %w25 = %w25 + %w289 + %w26 = %w26 + %w290 + %w27 = %w27 + %w291 + %w28 = %w28 + %w292 + %w29 = %w29 + %w293 + %w30 = %w30 + %w294 + %w31 = %w31 + %w295 + %w32 = %w32 + %w296 + %w33 = %w33 + %w297 + %w34 = %w34 + %w298 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w299 + %w24 = %w24 + %w300 + %w25 = %w25 + %w301 + %w26 = %w26 + %w302 + %w27 = %w27 + %w303 + %w28 = %w28 + %w304 + %w29 = %w29 + %w305 + %w30 = %w30 + %w306 + %w31 = %w31 + %w307 + %w32 = %w32 + %w308 + %w33 = %w33 + %w309 + %w34 = %w34 + %w310 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w311 + %w24 = %w24 + %w312 + %w25 = %w25 + %w313 + %w26 = %w26 + %w314 + %w27 = %w27 + %w315 + %w28 = %w28 + %w316 + %w29 = %w29 + %w317 + %w30 = %w30 + %w318 + %w31 = %w31 + %w319 + %w32 = %w32 + %w320 + %w33 = %w33 + %w321 + %w34 = %w34 + %w322 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w323 + %w24 = %w24 + %w324 + %w25 = %w25 + %w325 + %w26 = %w26 + %w326 + %w27 = %w27 + %w327 + %w28 = %w28 + %w328 + %w29 = %w29 + %w329 + %w30 = %w30 + %w330 + %w31 = %w31 + %w331 + %w32 = %w32 + %w332 + %w33 = %w33 + %w333 + %w34 = %w34 + %w334 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w335 + %w24 = %w24 + %w336 + %w25 = %w25 + %w337 + %w26 = %w26 + %w338 + %w27 = %w27 + %w339 + %w28 = %w28 + %w340 + %w29 = %w29 + %w341 + %w30 = %w30 + %w342 + %w31 = %w31 + %w343 + %w32 = %w32 + %w344 + %w33 = %w33 + %w345 + %w34 = %w34 + %w346 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w347 + %w24 = %w24 + %w348 + %w25 = %w25 + %w349 + %w26 = %w26 + %w350 + %w27 = %w27 + %w351 + %w28 = %w28 + %w352 + %w29 = %w29 + %w353 + %w30 = %w30 + %w354 + %w31 = %w31 + %w355 + %w32 = %w32 + %w356 + %w33 = %w33 + %w357 + %w34 = %w34 + %w358 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w359 + %w24 = %w24 + %w360 + %w25 = %w25 + %w361 + %w26 = %w26 + %w362 + %w27 = %w27 + %w363 + %w28 = %w28 + %w364 + %w29 = %w29 + %w365 + %w30 = %w30 + %w366 + %w31 = %w31 + %w367 + %w32 = %w32 + %w368 + %w33 = %w33 + %w369 + %w34 = %w34 + %w370 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w371 + %w24 = %w24 + %w372 + %w25 = %w25 + %w373 + %w26 = %w26 + %w374 + %w27 = %w27 + %w375 + %w28 = %w28 + %w376 + %w29 = %w29 + %w377 + %w30 = %w30 + %w378 + %w31 = %w31 + %w379 + %w32 = %w32 + %w380 + %w33 = %w33 + %w381 + %w34 = %w34 + %w382 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w383 + %w24 = %w24 + %w384 + %w25 = %w25 + %w385 + %w26 = %w26 + %w386 + %w27 = %w27 + %w387 + %w28 = %w28 + %w388 + %w29 = %w29 + %w389 + %w30 = %w30 + %w390 + %w31 = %w31 + %w391 + %w32 = %w32 + %w392 + %w33 = %w33 + %w393 + %w34 = %w34 + %w394 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + field[12 ] %w431 + field %w432 = %w23 + field %w433 = %w24 + field %w434 = %w25 + field %w435 = %w26 + field %w436 = %w27 + field %w437 = %w28 + field %w438 = %w29 + field %w439 = %w30 + field %w440 = %w31 + field %w441 = %w32 + field %w442 = %w33 + field %w443 = %w34 + %w431[0 ] = %w432 , init + %w431[1 ] = %w433 , init + %w431[2 ] = %w434 , init + %w431[3 ] = %w435 , init + %w431[4 ] = %w436 , init + %w431[5 ] = %w437 , init + %w431[6 ] = %w438 , init + %w431[7 ] = %w439 , init + %w431[8 ] = %w440 , init + %w431[9 ] = %w441 , init + %w431[10 ] = %w442 , init + %w431[11 ] = %w443 , init + field %w444 = %w431 + field %w445 = %w444 + field %w446 = %w445 + u32 %w447 = 0 + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + else: + Dummy Load + %w20 = %w20 + 1 + assert %o4(AS) == %w2(AS) + assert %o3(TS) == %w1(TS) + assert %o7 == %w19 + assert %o8 == %w20 + assert %o9 == %w18 + assert %o1(BN) == %w20 != 1000000 ? 1 : 2 +Transition: + %w20 != 1000000 ? -> 1 : -> 2 + +Block 2: +Func: main, Scope: 1 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 4 +Inputs: + %i1(BN): field + %i7: field +Outputs: + %o1(BN): field + %o2(RET): field +Instructions: + assert %i1(BN) == 2 + field %w19 = %i7 + field %w444 = %w19 + assert %o2(RET) == %w444 + assert %o1(BN) == 3 +Program terminates. + + +-- +Circ IR: +Optimizing IR... +done. +INPUT: [0, 0] + + +-- +Optimization: + + +-- +Post-Processing: +Entry block: 0 + +Block 0: +Func: main, Scope: 0 +Exec Bound: 1, While Loop: false +RO Ops: 0, VM Ops: 12 +Num Cons: 19 +Inputs: + %i1(BN): field + %i4(AS): field +Outputs: + %o1(BN): field + %o4(AS): field + %o3(TS): field + %o7: field + %o8: u32 + %o9: field +Instructions: + assert %i1(BN) == 0 + field %w2(AS) = %i4(AS) + field %w1(TS) = 0 + field[12 ] %w5 + field %w6 = 1 + field %w7 = 2 + field %w8 = 3 + field %w9 = 4 + field %w10 = 5 + field %w11 = 6 + field %w12 = 7 + field %w13 = 8 + field %w14 = 0 + field %w15 = 0 + field %w16 = 0 + field %w17 = 0 + %w5[0 ] = %w6 , init + %w5[1 ] = %w7 , init + %w5[2 ] = %w8 , init + %w5[3 ] = %w9 , init + %w5[4 ] = %w10 , init + %w5[5 ] = %w11 , init + %w5[6 ] = %w12 , init + %w5[7 ] = %w13 , init + %w5[8 ] = %w14 , init + %w5[9 ] = %w15 , init + %w5[10 ] = %w16 , init + %w5[11 ] = %w17 , init + field %w18 = %w5 + field %w19 = 0 + u32 %w20 = 0 + field %o4(AS) = %w2(AS) + field %o3(TS) = %w1(TS) + field %o7 = %w19 + u32 %o8 = %w20 + field %o9 = %w18 + field %o1(BN) = %w20 != 1000000 ? 1 : 2 +Transition: + %w20 != 1000000 ? -> 1 : -> 2 + +Block 1: +Func: main, Scope: 2 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 36 +Num Cons: 811 +Inputs: + %i1(BN): field + %i4(AS): field + %i3(TS): field + %i7: field + %i8: u32 + %i9: field +Outputs: + %o1(BN): field + %o4(AS): field + %o3(TS): field + %o7: field + %o8: u32 + %o9: field +Instructions: + assert %i1(BN) == 1 + field %w2(AS) = %i4(AS) + field %w1(TS) = %i3(TS) + field %w19 = %i7 + u32 %w20 = %i8 + field %w18 = %i9 + field %w21 = %w18 + field %w22 = %w21[0 ] + field %w23 = %w22 + field %w22 = %w21[1 ] + field %w24 = %w22 + field %w22 = %w21[2 ] + field %w25 = %w22 + field %w22 = %w21[3 ] + field %w26 = %w22 + field %w22 = %w21[4 ] + field %w27 = %w22 + field %w22 = %w21[5 ] + field %w28 = %w22 + field %w22 = %w21[6 ] + field %w29 = %w22 + field %w22 = %w21[7 ] + field %w30 = %w22 + field %w22 = %w21[8 ] + field %w31 = %w22 + field %w22 = %w21[9 ] + field %w32 = %w22 + field %w22 = %w21[10 ] + field %w33 = %w22 + field %w22 = %w21[11 ] + field %w34 = %w22 + field %w35 = 13080132714287612933 + field %w36 = 8594738767457295063 + field %w37 = 12896916465481390516 + field %w38 = 1109962092811921367 + field %w39 = 16216730422861946898 + field %w40 = 10137062673499593713 + field %w41 = 15292064466732465823 + field %w42 = 17255573294985989181 + field %w43 = 14827154241873003558 + field %w44 = 2846171647972703231 + field %w45 = 16246264663680317601 + field %w46 = 14214208087951879286 + field %w47 = 9667108687426275457 + field %w48 = 6470857420712283733 + field %w49 = 14103331940138337652 + field %w50 = 11854816473550292865 + field %w51 = 3498097497301325516 + field %w52 = 7947235692523864220 + field %w53 = 11110078701231901946 + field %w54 = 16384314112672821048 + field %w55 = 15404405912655775739 + field %w56 = 14077880830714445579 + field %w57 = 9555554662709218279 + field %w58 = 13859595358210603949 + field %w59 = 16859897325061800066 + field %w60 = 17685474420222222349 + field %w61 = 17858764734618734949 + field %w62 = 9410011022665866671 + field %w63 = 12495243629579414666 + field %w64 = 12416945298171515742 + field %w65 = 5776666812364270983 + field %w66 = 6314421662864060481 + field %w67 = 7402742471423223171 + field %w68 = 982536713192432718 + field %w69 = 17321168865775127905 + field %w70 = 2934354895005980211 + field %w71 = 10567510598607410195 + field %w72 = 8135543733717919110 + field %w73 = 116353493081713692 + field %w74 = 8029688163494945618 + field %w75 = 9003846637224807585 + field %w76 = 7052445132467233849 + field %w77 = 9645665432288852853 + field %w78 = 5446430061030868787 + field %w79 = 16770910634346036823 + field %w80 = 17708360571433944729 + field %w81 = 4661556288322237631 + field %w82 = 11977051899316327985 + field %w83 = 4378616569090929672 + field %w84 = 3334807502817538491 + field %w85 = 8019184735943344966 + field %w86 = 2395043908812246395 + field %w87 = 6558421058331732611 + field %w88 = 11735894060727326369 + field %w89 = 8143540538889204488 + field %w90 = 5991753489563751169 + field %w91 = 12235918791502088007 + field %w92 = 2880312033702687139 + field %w93 = 18224748115308382355 + field %w94 = 18070411013125314165 + field %w95 = 8156487614120951180 + field %w96 = 10615269510047010719 + field %w97 = 12489426404754222075 + field %w98 = 5055279340069995710 + field %w99 = 7231927319780248664 + field %w100 = 2602078848106763799 + field %w101 = 12445944369334781425 + field %w102 = 3978905923892496205 + field %w103 = 16711272944329818038 + field %w104 = 10439032361227108922 + field %w105 = 15110119871725214866 + field %w106 = 821141790655890946 + field %w107 = 11073536380651186235 + field %w108 = 4866839313097607757 + field %w109 = 13118391689513956636 + field %w110 = 14527674973762312380 + field %w111 = 7612751959265567999 + field %w112 = 6808090907814178161 + field %w113 = 6899703779492644997 + field %w114 = 3664666286336986826 + field %w115 = 783179505424462608 + field %w116 = 8990689241814097697 + field %w117 = 9646603555412825679 + field %w118 = 7351246026167205041 + field %w119 = 16970959813722173256 + field %w120 = 15735726858241466429 + field %w121 = 10347018221892268419 + field %w122 = 12195545878449322889 + field %w123 = 7423314197114049891 + field %w124 = 14908016116973904153 + field %w125 = 5840340122527363265 + field %w126 = 17740311462440614128 + field %w127 = 815306421953744623 + field %w128 = 17456357368219253949 + field %w129 = 6982651076559329072 + field %w130 = 11970987324614963868 + field %w131 = 8167785008538063246 + field %w132 = 9483259819397403968 + field %w133 = 954550221664291548 + field %w134 = 10339565171024313256 + field %w135 = 8651171084286500102 + field %w136 = 16974445528003515956 + field %w137 = 15104530047940621190 + field %w138 = 103271880867179718 + field %w139 = 14654666245504492663 + field %w140 = 12445769555936887967 + field %w141 = 11250582358051997490 + field %w142 = 6730977207490590241 + field %w143 = 15919951556166196935 + field %w144 = 4423540216573360915 + field %w145 = 16317664700341473511 + field %w146 = 4723997214951767765 + field %w147 = 10098756619006575500 + field %w148 = 3223149401237667964 + field %w149 = 6870494874300767682 + field %w150 = 2902095711130291898 + field %w151 = 7159372652788439733 + field %w152 = 11500508372997952671 + field %w153 = 13348148181479462670 + field %w154 = 12729401155983882093 + field %w155 = 15021242795466053388 + field %w156 = 3802990509227527157 + field %w157 = 4665459515680145682 + field %w158 = 13165553315407675603 + field %w159 = 6496364397926233172 + field %w160 = 12800832566287577810 + field %w161 = 9737592377590267426 + field %w162 = 8687131091302514939 + field %w163 = 1488200421755445892 + field %w164 = 11004377668730991641 + field %w165 = 13516338734600228410 + field %w166 = 2953581820660217936 + field %w167 = 3505040783153922951 + field %w168 = 3710332827435113697 + field %w169 = 15414874040873320221 + field %w170 = 8602547649919482301 + field %w171 = 13971349938398812007 + field %w172 = 187239246702636066 + field %w173 = 12886019973971254144 + field %w174 = 4512274763990493707 + field %w175 = 2986635507805503192 + field %w176 = 2315252455709119454 + field %w177 = 12537995864054210246 + field %w178 = 2039491936479859267 + field %w179 = 1558644089185031256 + field %w180 = 4074089203264759305 + field %w181 = 2522268501749395707 + field %w182 = 3414760436185256196 + field %w183 = 17420887529146466921 + field %w184 = 2817020417938125001 + field %w185 = 16538346563888261485 + field %w186 = 5592270336833998770 + field %w187 = 16876602064684906232 + field %w188 = 1793025614521516343 + field %w189 = 2178510518148748532 + field %w190 = 2726440714374752509 + field %w191 = 6502946837278398021 + field %w192 = 15816362857667988792 + field %w193 = 12997958454165692924 + field %w194 = 5314892854495903792 + field %w195 = 15533907063555687782 + field %w196 = 12312015675698548715 + field %w197 = 14140016464013350248 + field %w198 = 16325589062962838690 + field %w199 = 6796145646370327654 + field %w200 = 1168753512742361735 + field %w201 = 4100789820704709368 + field %w202 = 15947554381540469177 + field %w203 = 8597377839806076919 + field %w204 = 9704018824195918000 + field %w205 = 12763288618765762688 + field %w206 = 17249257732622847695 + field %w207 = 1998710993415069759 + field %w208 = 923759906393011543 + field %w209 = 1271051229666811593 + field %w210 = 17822362132088738077 + field %w211 = 11797234543722669271 + field %w212 = 5864538787265942447 + field %w213 = 15975583211110506970 + field %w214 = 7258516085733671960 + field %w215 = 17999926471875633100 + field %w216 = 635992114476018166 + field %w217 = 17205047318256576347 + field %w218 = 17384900867876315312 + field %w219 = 16484825562915784226 + field %w220 = 16694130609036138894 + field %w221 = 10575069350371260875 + field %w222 = 8330575162062887277 + field %w223 = 6212375704691932880 + field %w224 = 15965138197626618226 + field %w225 = 14285453069600046939 + field %w226 = 10005163510208402517 + field %w227 = 885298637936952595 + field %w228 = 541790758138118921 + field %w229 = 5985203084790372993 + field %w230 = 4685030219775483721 + field %w231 = 1411106851304815020 + field %w232 = 11290732479954096478 + field %w233 = 208280581124868513 + field %w234 = 10979018648467968495 + field %w235 = 8600643745023338215 + field %w236 = 3477453626867126061 + field %w237 = 6428436309340258604 + field %w238 = 5695415667275657934 + field %w239 = 15952065508715623490 + field %w240 = 15571300830419767248 + field %w241 = 17259785660502616862 + field %w242 = 4298425495274316083 + field %w243 = 9023601070579319352 + field %w244 = 7353589709321807492 + field %w245 = 2988848909076209475 + field %w246 = 10439527789422046135 + field %w247 = 6097734044161429459 + field %w248 = 1113429873817861476 + field %w249 = 1639063372386966591 + field %w250 = 7863102812716788759 + field %w251 = 216040220732135364 + field %w252 = 14252611488623712688 + field %w253 = 9543395466794536974 + field %w254 = 2714461051639810934 + field %w255 = 2588317208781407279 + field %w256 = 15458529123534594916 + field %w257 = 15748417817551040856 + field %w258 = 16414455697114422951 + field %w259 = 13378164466674639511 + field %w260 = 13894319928411294675 + field %w261 = 5032680892090751540 + field %w262 = 17201338494743078916 + field %w263 = 4397422800601932505 + field %w264 = 11285062031581972327 + field %w265 = 7309354640676468207 + field %w266 = 10457152817239331848 + field %w267 = 8855911538863247046 + field %w268 = 4301853449821814398 + field %w269 = 13001502396339103326 + field %w270 = 10218424535115580246 + field %w271 = 8628244713920681895 + field %w272 = 17410423622514037261 + field %w273 = 14080683768439215375 + field %w274 = 11453161143447188100 + field %w275 = 16761509772042181939 + field %w276 = 6688821660695954082 + field %w277 = 12083434295263160416 + field %w278 = 8540021431714616589 + field %w279 = 6891616215679974226 + field %w280 = 10229217098454812721 + field %w281 = 3292165387203778711 + field %w282 = 6090113424998243490 + field %w283 = 13431780521962358660 + field %w284 = 6061081364215809883 + field %w285 = 16792066504222214142 + field %w286 = 16134314044798124799 + field %w287 = 17070233710126619765 + field %w288 = 6915716851370550800 + field %w289 = 9505009849073026581 + field %w290 = 6422700465081897153 + field %w291 = 17977653991560529185 + field %w292 = 5800870252836247255 + field %w293 = 12096124733159345520 + field %w294 = 7679273623392321940 + field %w295 = 17835783910585744964 + field %w296 = 2478664878205754377 + field %w297 = 1720314468413114967 + field %w298 = 10376757819003248056 + field %w299 = 10376377187857634245 + field %w300 = 13344930747504284997 + field %w301 = 11579281865160153596 + field %w302 = 10300256980048736962 + field %w303 = 378765236515040565 + field %w304 = 11412420941557253424 + field %w305 = 12931662470734252786 + field %w306 = 43018908376346374 + field %w307 = 3589810689190160071 + field %w308 = 4688229274750659741 + field %w309 = 13688957436484306091 + field %w310 = 11424740943016984272 + field %w311 = 16001900718237913960 + field %w312 = 5548469743008097574 + field %w313 = 14584404916672178680 + field %w314 = 3396622135873576824 + field %w315 = 7861729246871155992 + field %w316 = 16112271126908045545 + field %w317 = 16988163966860016012 + field %w318 = 273641680619529493 + field %w319 = 15222677154027327363 + field %w320 = 4070328078309830604 + field %w321 = 13520458500363296391 + field %w322 = 8235111705801363015 + field %w323 = 5575990058472514138 + field %w324 = 2751301609188252989 + field %w325 = 6478598528223547074 + field %w326 = 386565553848556638 + field %w327 = 9417729078939938713 + field %w328 = 15204315939835727483 + field %w329 = 14942015033780606261 + field %w330 = 18369423901636582012 + field %w331 = 4715338437538604447 + field %w332 = 6840590980607806319 + field %w333 = 5535471161490539014 + field %w334 = 5341328005359029952 + field %w335 = 1475161295215894444 + field %w336 = 7999197814297036636 + field %w337 = 2984233088665867938 + field %w338 = 3097746028144832229 + field %w339 = 8849530863480031517 + field %w340 = 7464920943249009773 + field %w341 = 3802996844641460514 + field %w342 = 6284458522545927646 + field %w343 = 2307388003445002779 + field %w344 = 4461479354745457623 + field %w345 = 1649739722664588460 + field %w346 = 3008391274160432867 + field %w347 = 5142217010456550622 + field %w348 = 1775580461722730120 + field %w349 = 161694268822794344 + field %w350 = 1518963253808031703 + field %w351 = 16475258091652710137 + field %w352 = 119575899007375159 + field %w353 = 1275863735937973999 + field %w354 = 16539412514520642374 + field %w355 = 2303365191438051950 + field %w356 = 6435126839960916075 + field %w357 = 17794599201026020053 + field %w358 = 13847097589277840330 + field %w359 = 16645869274577729720 + field %w360 = 8039205965509554440 + field %w361 = 4788586935019371140 + field %w362 = 15129007200040077746 + field %w363 = 2055561615223771341 + field %w364 = 4149731103701412892 + field %w365 = 10268130195734144189 + field %w366 = 13406631635880074708 + field %w367 = 11429218277824986203 + field %w368 = 15773968030812198565 + field %w369 = 16050275277550506872 + field %w370 = 11858586752031736643 + field %w371 = 8927746344866569756 + field %w372 = 11802068403177695792 + field %w373 = 157833420806751556 + field %w374 = 4698875910749767878 + field %w375 = 1616722774788291698 + field %w376 = 3990951895163748090 + field %w377 = 16758609224720795472 + field %w378 = 3045571693290741477 + field %w379 = 9281634245289836419 + field %w380 = 13517688176723875370 + field %w381 = 7961395585333219380 + field %w382 = 1606574359105691080 + field %w383 = 17564372683613562171 + field %w384 = 4664015225343144418 + field %w385 = 6133721340680280128 + field %w386 = 2667022304383014929 + field %w387 = 12316557761857340230 + field %w388 = 10375614850625292317 + field %w389 = 8141542666379135068 + field %w390 = 9185476451083834432 + field %w391 = 4991072365274649547 + field %w392 = 17398204971778820365 + field %w393 = 16127888338958422584 + field %w394 = 13586792051317758204 + field %w395 = 17 + field %w396 = 15 + field %w397 = 41 + field %w398 = 16 + field %w399 = 2 + field %w400 = 28 + field %w401 = 13 + field %w402 = 13 + field %w403 = 39 + field %w404 = 18 + field %w405 = 34 + field %w406 = 20 + field %w407 = 8 + field %w408 = 0 + field %w409 = 0 + field %w410 = 0 + field %w411 = 0 + field %w412 = 0 + field %w413 = 0 + field %w414 = 0 + field %w415 = 0 + field %w416 = 0 + field %w417 = 0 + field %w418 = 0 + %w23 = %w23 + %w35 + %w24 = %w24 + %w36 + %w25 = %w25 + %w37 + %w26 = %w26 + %w38 + %w27 = %w27 + %w39 + %w28 = %w28 + %w40 + %w29 = %w29 + %w41 + %w30 = %w30 + %w42 + %w31 = %w31 + %w43 + %w32 = %w32 + %w44 + %w33 = %w33 + %w45 + %w34 = %w34 + %w46 + field %w419 = %w23 ** 7 + field %w420 = %w24 ** 7 + field %w421 = %w25 ** 7 + field %w422 = %w26 ** 7 + field %w423 = %w27 ** 7 + field %w424 = %w28 ** 7 + field %w425 = %w29 ** 7 + field %w426 = %w30 ** 7 + field %w427 = %w31 ** 7 + field %w428 = %w32 ** 7 + field %w429 = %w33 ** 7 + field %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w47 + %w24 = %w24 + %w48 + %w25 = %w25 + %w49 + %w26 = %w26 + %w50 + %w27 = %w27 + %w51 + %w28 = %w28 + %w52 + %w29 = %w29 + %w53 + %w30 = %w30 + %w54 + %w31 = %w31 + %w55 + %w32 = %w32 + %w56 + %w33 = %w33 + %w57 + %w34 = %w34 + %w58 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w59 + %w24 = %w24 + %w60 + %w25 = %w25 + %w61 + %w26 = %w26 + %w62 + %w27 = %w27 + %w63 + %w28 = %w28 + %w64 + %w29 = %w29 + %w65 + %w30 = %w30 + %w66 + %w31 = %w31 + %w67 + %w32 = %w32 + %w68 + %w33 = %w33 + %w69 + %w34 = %w34 + %w70 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w71 + %w24 = %w24 + %w72 + %w25 = %w25 + %w73 + %w26 = %w26 + %w74 + %w27 = %w27 + %w75 + %w28 = %w28 + %w76 + %w29 = %w29 + %w77 + %w30 = %w30 + %w78 + %w31 = %w31 + %w79 + %w32 = %w32 + %w80 + %w33 = %w33 + %w81 + %w34 = %w34 + %w82 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w83 + %w24 = %w24 + %w84 + %w25 = %w25 + %w85 + %w26 = %w26 + %w86 + %w27 = %w27 + %w87 + %w28 = %w28 + %w88 + %w29 = %w29 + %w89 + %w30 = %w30 + %w90 + %w31 = %w31 + %w91 + %w32 = %w32 + %w92 + %w33 = %w33 + %w93 + %w34 = %w34 + %w94 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w95 + %w24 = %w24 + %w96 + %w25 = %w25 + %w97 + %w26 = %w26 + %w98 + %w27 = %w27 + %w99 + %w28 = %w28 + %w100 + %w29 = %w29 + %w101 + %w30 = %w30 + %w102 + %w31 = %w31 + %w103 + %w32 = %w32 + %w104 + %w33 = %w33 + %w105 + %w34 = %w34 + %w106 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w107 + %w24 = %w24 + %w108 + %w25 = %w25 + %w109 + %w26 = %w26 + %w110 + %w27 = %w27 + %w111 + %w28 = %w28 + %w112 + %w29 = %w29 + %w113 + %w30 = %w30 + %w114 + %w31 = %w31 + %w115 + %w32 = %w32 + %w116 + %w33 = %w33 + %w117 + %w34 = %w34 + %w118 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w119 + %w24 = %w24 + %w120 + %w25 = %w25 + %w121 + %w26 = %w26 + %w122 + %w27 = %w27 + %w123 + %w28 = %w28 + %w124 + %w29 = %w29 + %w125 + %w30 = %w30 + %w126 + %w31 = %w31 + %w127 + %w32 = %w32 + %w128 + %w33 = %w33 + %w129 + %w34 = %w34 + %w130 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w131 + %w24 = %w24 + %w132 + %w25 = %w25 + %w133 + %w26 = %w26 + %w134 + %w27 = %w27 + %w135 + %w28 = %w28 + %w136 + %w29 = %w29 + %w137 + %w30 = %w30 + %w138 + %w31 = %w31 + %w139 + %w32 = %w32 + %w140 + %w33 = %w33 + %w141 + %w34 = %w34 + %w142 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w143 + %w24 = %w24 + %w144 + %w25 = %w25 + %w145 + %w26 = %w26 + %w146 + %w27 = %w27 + %w147 + %w28 = %w28 + %w148 + %w29 = %w29 + %w149 + %w30 = %w30 + %w150 + %w31 = %w31 + %w151 + %w32 = %w32 + %w152 + %w33 = %w33 + %w153 + %w34 = %w34 + %w154 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w155 + %w24 = %w24 + %w156 + %w25 = %w25 + %w157 + %w26 = %w26 + %w158 + %w27 = %w27 + %w159 + %w28 = %w28 + %w160 + %w29 = %w29 + %w161 + %w30 = %w30 + %w162 + %w31 = %w31 + %w163 + %w32 = %w32 + %w164 + %w33 = %w33 + %w165 + %w34 = %w34 + %w166 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w167 + %w24 = %w24 + %w168 + %w25 = %w25 + %w169 + %w26 = %w26 + %w170 + %w27 = %w27 + %w171 + %w28 = %w28 + %w172 + %w29 = %w29 + %w173 + %w30 = %w30 + %w174 + %w31 = %w31 + %w175 + %w32 = %w32 + %w176 + %w33 = %w33 + %w177 + %w34 = %w34 + %w178 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w179 + %w24 = %w24 + %w180 + %w25 = %w25 + %w181 + %w26 = %w26 + %w182 + %w27 = %w27 + %w183 + %w28 = %w28 + %w184 + %w29 = %w29 + %w185 + %w30 = %w30 + %w186 + %w31 = %w31 + %w187 + %w32 = %w32 + %w188 + %w33 = %w33 + %w189 + %w34 = %w34 + %w190 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w191 + %w24 = %w24 + %w192 + %w25 = %w25 + %w193 + %w26 = %w26 + %w194 + %w27 = %w27 + %w195 + %w28 = %w28 + %w196 + %w29 = %w29 + %w197 + %w30 = %w30 + %w198 + %w31 = %w31 + %w199 + %w32 = %w32 + %w200 + %w33 = %w33 + %w201 + %w34 = %w34 + %w202 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w203 + %w24 = %w24 + %w204 + %w25 = %w25 + %w205 + %w26 = %w26 + %w206 + %w27 = %w27 + %w207 + %w28 = %w28 + %w208 + %w29 = %w29 + %w209 + %w30 = %w30 + %w210 + %w31 = %w31 + %w211 + %w32 = %w32 + %w212 + %w33 = %w33 + %w213 + %w34 = %w34 + %w214 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w215 + %w24 = %w24 + %w216 + %w25 = %w25 + %w217 + %w26 = %w26 + %w218 + %w27 = %w27 + %w219 + %w28 = %w28 + %w220 + %w29 = %w29 + %w221 + %w30 = %w30 + %w222 + %w31 = %w31 + %w223 + %w32 = %w32 + %w224 + %w33 = %w33 + %w225 + %w34 = %w34 + %w226 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w227 + %w24 = %w24 + %w228 + %w25 = %w25 + %w229 + %w26 = %w26 + %w230 + %w27 = %w27 + %w231 + %w28 = %w28 + %w232 + %w29 = %w29 + %w233 + %w30 = %w30 + %w234 + %w31 = %w31 + %w235 + %w32 = %w32 + %w236 + %w33 = %w33 + %w237 + %w34 = %w34 + %w238 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w239 + %w24 = %w24 + %w240 + %w25 = %w25 + %w241 + %w26 = %w26 + %w242 + %w27 = %w27 + %w243 + %w28 = %w28 + %w244 + %w29 = %w29 + %w245 + %w30 = %w30 + %w246 + %w31 = %w31 + %w247 + %w32 = %w32 + %w248 + %w33 = %w33 + %w249 + %w34 = %w34 + %w250 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w251 + %w24 = %w24 + %w252 + %w25 = %w25 + %w253 + %w26 = %w26 + %w254 + %w27 = %w27 + %w255 + %w28 = %w28 + %w256 + %w29 = %w29 + %w257 + %w30 = %w30 + %w258 + %w31 = %w31 + %w259 + %w32 = %w32 + %w260 + %w33 = %w33 + %w261 + %w34 = %w34 + %w262 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w263 + %w24 = %w24 + %w264 + %w25 = %w25 + %w265 + %w26 = %w26 + %w266 + %w27 = %w27 + %w267 + %w28 = %w28 + %w268 + %w29 = %w29 + %w269 + %w30 = %w30 + %w270 + %w31 = %w31 + %w271 + %w32 = %w32 + %w272 + %w33 = %w33 + %w273 + %w34 = %w34 + %w274 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w275 + %w24 = %w24 + %w276 + %w25 = %w25 + %w277 + %w26 = %w26 + %w278 + %w27 = %w27 + %w279 + %w28 = %w28 + %w280 + %w29 = %w29 + %w281 + %w30 = %w30 + %w282 + %w31 = %w31 + %w283 + %w32 = %w32 + %w284 + %w33 = %w33 + %w285 + %w34 = %w34 + %w286 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w287 + %w24 = %w24 + %w288 + %w25 = %w25 + %w289 + %w26 = %w26 + %w290 + %w27 = %w27 + %w291 + %w28 = %w28 + %w292 + %w29 = %w29 + %w293 + %w30 = %w30 + %w294 + %w31 = %w31 + %w295 + %w32 = %w32 + %w296 + %w33 = %w33 + %w297 + %w34 = %w34 + %w298 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w299 + %w24 = %w24 + %w300 + %w25 = %w25 + %w301 + %w26 = %w26 + %w302 + %w27 = %w27 + %w303 + %w28 = %w28 + %w304 + %w29 = %w29 + %w305 + %w30 = %w30 + %w306 + %w31 = %w31 + %w307 + %w32 = %w32 + %w308 + %w33 = %w33 + %w309 + %w34 = %w34 + %w310 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w311 + %w24 = %w24 + %w312 + %w25 = %w25 + %w313 + %w26 = %w26 + %w314 + %w27 = %w27 + %w315 + %w28 = %w28 + %w316 + %w29 = %w29 + %w317 + %w30 = %w30 + %w318 + %w31 = %w31 + %w319 + %w32 = %w32 + %w320 + %w33 = %w33 + %w321 + %w34 = %w34 + %w322 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w323 + %w24 = %w24 + %w324 + %w25 = %w25 + %w325 + %w26 = %w26 + %w326 + %w27 = %w27 + %w327 + %w28 = %w28 + %w328 + %w29 = %w29 + %w329 + %w30 = %w30 + %w330 + %w31 = %w31 + %w331 + %w32 = %w32 + %w332 + %w33 = %w33 + %w333 + %w34 = %w34 + %w334 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w335 + %w24 = %w24 + %w336 + %w25 = %w25 + %w337 + %w26 = %w26 + %w338 + %w27 = %w27 + %w339 + %w28 = %w28 + %w340 + %w29 = %w29 + %w341 + %w30 = %w30 + %w342 + %w31 = %w31 + %w343 + %w32 = %w32 + %w344 + %w33 = %w33 + %w345 + %w34 = %w34 + %w346 + %w419 = %w23 ** 7 + %w420 = %w24 + %w421 = %w25 + %w422 = %w26 + %w423 = %w27 + %w424 = %w28 + %w425 = %w29 + %w426 = %w30 + %w427 = %w31 + %w428 = %w32 + %w429 = %w33 + %w430 = %w34 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w347 + %w24 = %w24 + %w348 + %w25 = %w25 + %w349 + %w26 = %w26 + %w350 + %w27 = %w27 + %w351 + %w28 = %w28 + %w352 + %w29 = %w29 + %w353 + %w30 = %w30 + %w354 + %w31 = %w31 + %w355 + %w32 = %w32 + %w356 + %w33 = %w33 + %w357 + %w34 = %w34 + %w358 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w359 + %w24 = %w24 + %w360 + %w25 = %w25 + %w361 + %w26 = %w26 + %w362 + %w27 = %w27 + %w363 + %w28 = %w28 + %w364 + %w29 = %w29 + %w365 + %w30 = %w30 + %w366 + %w31 = %w31 + %w367 + %w32 = %w32 + %w368 + %w33 = %w33 + %w369 + %w34 = %w34 + %w370 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w371 + %w24 = %w24 + %w372 + %w25 = %w25 + %w373 + %w26 = %w26 + %w374 + %w27 = %w27 + %w375 + %w28 = %w28 + %w376 + %w29 = %w29 + %w377 + %w30 = %w30 + %w378 + %w31 = %w31 + %w379 + %w32 = %w32 + %w380 + %w33 = %w33 + %w381 + %w34 = %w34 + %w382 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + %w23 = %w23 + %w383 + %w24 = %w24 + %w384 + %w25 = %w25 + %w385 + %w26 = %w26 + %w386 + %w27 = %w27 + %w387 + %w28 = %w28 + %w388 + %w29 = %w29 + %w389 + %w30 = %w30 + %w390 + %w31 = %w31 + %w391 + %w32 = %w32 + %w392 + %w33 = %w33 + %w393 + %w34 = %w34 + %w394 + %w419 = %w23 ** 7 + %w420 = %w24 ** 7 + %w421 = %w25 ** 7 + %w422 = %w26 ** 7 + %w423 = %w27 ** 7 + %w424 = %w28 ** 7 + %w425 = %w29 ** 7 + %w426 = %w30 ** 7 + %w427 = %w31 ** 7 + %w428 = %w32 ** 7 + %w429 = %w33 ** 7 + %w430 = %w34 ** 7 + %w23 = %w419 * %w407 + %w419 * %w395 + %w420 * %w396 + %w421 * %w397 + %w422 * %w398 + %w423 * %w399 + %w424 * %w400 + %w425 * %w401 + %w426 * %w402 + %w427 * %w403 + %w428 * %w404 + %w429 * %w405 + %w430 * %w406 + %w24 = %w420 * %w408 + %w420 * %w395 + %w421 * %w396 + %w422 * %w397 + %w423 * %w398 + %w424 * %w399 + %w425 * %w400 + %w426 * %w401 + %w427 * %w402 + %w428 * %w403 + %w429 * %w404 + %w430 * %w405 + %w419 * %w406 + %w25 = %w421 * %w409 + %w421 * %w395 + %w422 * %w396 + %w423 * %w397 + %w424 * %w398 + %w425 * %w399 + %w426 * %w400 + %w427 * %w401 + %w428 * %w402 + %w429 * %w403 + %w430 * %w404 + %w419 * %w405 + %w420 * %w406 + %w26 = %w422 * %w410 + %w422 * %w395 + %w423 * %w396 + %w424 * %w397 + %w425 * %w398 + %w426 * %w399 + %w427 * %w400 + %w428 * %w401 + %w429 * %w402 + %w430 * %w403 + %w419 * %w404 + %w420 * %w405 + %w421 * %w406 + %w27 = %w423 * %w411 + %w423 * %w395 + %w424 * %w396 + %w425 * %w397 + %w426 * %w398 + %w427 * %w399 + %w428 * %w400 + %w429 * %w401 + %w430 * %w402 + %w419 * %w403 + %w420 * %w404 + %w421 * %w405 + %w422 * %w406 + %w28 = %w424 * %w412 + %w424 * %w395 + %w425 * %w396 + %w426 * %w397 + %w427 * %w398 + %w428 * %w399 + %w429 * %w400 + %w430 * %w401 + %w419 * %w402 + %w420 * %w403 + %w421 * %w404 + %w422 * %w405 + %w423 * %w406 + %w29 = %w425 * %w413 + %w425 * %w395 + %w426 * %w396 + %w427 * %w397 + %w428 * %w398 + %w429 * %w399 + %w430 * %w400 + %w419 * %w401 + %w420 * %w402 + %w421 * %w403 + %w422 * %w404 + %w423 * %w405 + %w424 * %w406 + %w30 = %w426 * %w414 + %w426 * %w395 + %w427 * %w396 + %w428 * %w397 + %w429 * %w398 + %w430 * %w399 + %w419 * %w400 + %w420 * %w401 + %w421 * %w402 + %w422 * %w403 + %w423 * %w404 + %w424 * %w405 + %w425 * %w406 + %w31 = %w427 * %w415 + %w427 * %w395 + %w428 * %w396 + %w429 * %w397 + %w430 * %w398 + %w419 * %w399 + %w420 * %w400 + %w421 * %w401 + %w422 * %w402 + %w423 * %w403 + %w424 * %w404 + %w425 * %w405 + %w426 * %w406 + %w32 = %w428 * %w416 + %w428 * %w395 + %w429 * %w396 + %w430 * %w397 + %w419 * %w398 + %w420 * %w399 + %w421 * %w400 + %w422 * %w401 + %w423 * %w402 + %w424 * %w403 + %w425 * %w404 + %w426 * %w405 + %w427 * %w406 + %w33 = %w429 * %w417 + %w429 * %w395 + %w430 * %w396 + %w419 * %w397 + %w420 * %w398 + %w421 * %w399 + %w422 * %w400 + %w423 * %w401 + %w424 * %w402 + %w425 * %w403 + %w426 * %w404 + %w427 * %w405 + %w428 * %w406 + %w34 = %w430 * %w418 + %w430 * %w395 + %w419 * %w396 + %w420 * %w397 + %w421 * %w398 + %w422 * %w399 + %w423 * %w400 + %w424 * %w401 + %w425 * %w402 + %w426 * %w403 + %w427 * %w404 + %w428 * %w405 + %w429 * %w406 + field[12 ] %w431 + field %w432 = %w23 + field %w433 = %w24 + field %w434 = %w25 + field %w435 = %w26 + field %w436 = %w27 + field %w437 = %w28 + field %w438 = %w29 + field %w439 = %w30 + field %w440 = %w31 + field %w441 = %w32 + field %w442 = %w33 + field %w443 = %w34 + %w431[0 ] = %w432 , init + %w431[1 ] = %w433 , init + %w431[2 ] = %w434 , init + %w431[3 ] = %w435 , init + %w431[4 ] = %w436 , init + %w431[5 ] = %w437 , init + %w431[6 ] = %w438 , init + %w431[7 ] = %w439 , init + %w431[8 ] = %w440 , init + %w431[9 ] = %w441 , init + %w431[10 ] = %w442 , init + %w431[11 ] = %w443 , init + field %w444 = %w431 + field %w445 = %w444 + field %w446 = %w445 + u32 %w447 = 0 + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + %w447 = %w447 + 1 + else: + Dummy Load + if %w447 != 12 : + field %w448 = %w446[%w447] + %w19 = %w19 + %w448 + else: + Dummy Load + %w20 = %w20 + 1 + field %o4(AS) = %w2(AS) + field %o3(TS) = %w1(TS) + field %o7 = %w19 + u32 %o8 = %w20 + field %o9 = %w18 + field %o1(BN) = %w20 != 1000000 ? 1 : 2 +Transition: + %w20 != 1000000 ? -> 1 : -> 2 + +Block 2: +Func: main, Scope: 1 +Exec Bound: 1000000, While Loop: false +RO Ops: 0, VM Ops: 0 +Num Cons: 4 +Inputs: + %i1(BN): field + %i7: field +Outputs: + %o1(BN): field + %o2(RET): field +Instructions: + assert %i1(BN) == 2 + field %w19 = %i7 + field %w444 = %w19 + field %o2(RET) = %w444 + field %o1(BN) = 3 +Program terminates. + + +-- +Interpretation: diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index c2627f31..488e9d66 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -1,8 +1,8 @@ // TODO: Might want to simplify Liveness Analysis & PMR now that scope changes are handled in optimization const PRINT_PROOF: bool = false; -const INLINE_SPARTAN_PROOF: bool = false; -const TOTAL_NUM_VARS_BOUND: usize = 100000000; +const INLINE_SPARTAN_PROOF: bool = true; +const TOTAL_NUM_VARS_BOUND: usize = 10000000000; use circ::front::zsharp::{self, ZSharpFE}; use circ::front::{FrontEnd, Mode}; diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok index c84f7e85..52da57d6 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok @@ -1678,7 +1678,7 @@ def main() -> field: state11: 0 } field cumulated_hash = 0 - for u32 i in 0..10000 do + for u32 i in 0..1000000 do PoseidonState hashes = poseidon(inputs) cumulated_hash = cumulated_hash + hashes.state0 + hashes.state1 + hashes.state2 + hashes.state3 + hashes.state4 + hashes.state5 + hashes.state6 + hashes.state7 + hashes.state8 + hashes.state9 + hashes.state10 + hashes.state11 endfor From 5a2a6c4db8d5f97c594a946536fe006188f6cf15 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 9 Dec 2024 22:29:20 -0500 Subject: [PATCH 11/54] Added automatic poseidon testing script --- circ_blocks/aaa | 96 ------------------- test_poseidon.sh | 4 + .../poseidon_test/poseidon_array.zok | 4 +- .../poseidon_test/poseidon_const.zok | 1 + .../poseidon_test/poseidon_struct.zok | 4 +- 5 files changed, 11 insertions(+), 98 deletions(-) create mode 100755 test_poseidon.sh create mode 100644 zok_tests/benchmarks/poseidon_test/poseidon_const.zok diff --git a/circ_blocks/aaa b/circ_blocks/aaa index 9f1aaff0..3a0bf0d7 100644 --- a/circ_blocks/aaa +++ b/circ_blocks/aaa @@ -5124,99 +5124,3 @@ Program terminates. -- Interpretation: - --- -FUNC - -I 0 0 -S -M -O 10140720376667396982 -Preprocessing instances... -Generating Circuits... - - --- -BLOCK INSTS - con var nnz exec -Block 0 66 x 145 87 1 -Block 1 574 x 1105 5994 1000000 -Block 2 52 x 145 87 1 -Total Num of Blocks: 3 -Total Inst Commit Size: 6168 -Total Var Commit Size: 1105000290 -Total Cons Exec Size: 574000118 - * number_of_instances 3 - * number_of_constraints 1024 - * number_of_variables 8192 -Finished Block - - --- -PAIRWISE INSTS - con var nnz exec -Cohere 1 x 16 2 1000002 -Phy Mem 4 x 16 8 0 -Vir Mem 28 x 64 45 0 -Total Num of Blocks: 1 -Total Inst Commit Size: 55 -Total Var Commit Size: 16000032 -Total Cons Exec Size: 1000002 - * number_of_instances 3 - * number_of_constraints 32 - * number_of_variables 128 -Finished Pairwise - - --- -PERM INSTS - con var nnz exec -Perm Root 46 x 208 89 1000002 -Total Num of Blocks: 1 -Total Inst Commit Size: 89 -Total Var Commit Size: 0 -Total Cons Exec Size: 0 - * number_of_instances 1 - * number_of_constraints 64 - * number_of_variables 512 -Finished Perm -Comitting Circuits... - * SNARK::encode - * SNARK::encode 2.807791ms -Finished Block - * SNARK::encode - * SNARK::encode 239.75µs -Finished Pairwise - * SNARK::encode - * SNARK::encode 15.125µs -Finished Perm -Preprocess time: 29ms -Running the proof... - * SNARK::prove - * inst_commit - * inst_commit 14.167µs - * block_sort - * block_sort 64.936417ms - * witness_gen - * block_witness_gen - * block_witness_gen 10.082689708s - * init_phy_mem_witness_gen - * init_phy_mem_witness_gen 4.5µs - * init_vir_mem_witness_gen - * init_vir_mem_witness_gen 3.083µs - * phy_mem_addr_witness_gen - * phy_mem_addr_witness_gen 2.75µs - * vir_mem_addr_witness_gen - * vir_mem_addr_witness_gen 3µs - * witness_gen 10.082791084s - * input_commit - * input_commit 19.198601917s -BLOCK WITNESSES: [1073741824, 64, 64, 67108864, 64, 64, 8388608, 8, 8, 8388608, 8, 8] Goldilocks -EXEC WITNESSES: [67108864, 67108864, 8388608, 8388608] Goldilocks -MEM WITNESSES: [] Goldilocks - * Block Correctness Extract - * R1CSProof::prove - * prove_sc_phase_one - * prove_z_mat_gen - * prove_z_mat_gen 26.714254458s - * prove_vec_mult diff --git a/test_poseidon.sh b/test_poseidon.sh new file mode 100755 index 00000000..84313fe2 --- /dev/null +++ b/test_poseidon.sh @@ -0,0 +1,4 @@ +#!/bin/bash +echo "const u32 REPETITION = $1" > zok_tests/benchmarks/poseidon_test/poseidon_const.zok && +cd circ_blocks && +target/release/examples/zxc poseidon_test/poseidon_struct \ No newline at end of file diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_array.zok b/zok_tests/benchmarks/poseidon_test/poseidon_array.zok index 84b09b03..a1f09307 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_array.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_array.zok @@ -1,3 +1,5 @@ +from "poseidon_const" import REPETITION + struct Digest { field[4] elements } @@ -1637,7 +1639,7 @@ def poseidon(field[12] input) -> field[12]: def main() -> field: field[12] inputs = [1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0] field cumulated_hash = 0 - for u32 i in 0..1000000 do + for u32 i in 0..REPETITION do field[12] hashes = poseidon(inputs) for u32 j in 0..12 do cumulated_hash = cumulated_hash + hashes[j] diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok new file mode 100644 index 00000000..71b82581 --- /dev/null +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -0,0 +1 @@ +const u32 REPETITION = 2000 diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok index 52da57d6..9e3cbe1f 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_struct.zok @@ -1,3 +1,5 @@ +from "poseidon_const" import REPETITION + struct Digest { field[4] elements } @@ -1678,7 +1680,7 @@ def main() -> field: state11: 0 } field cumulated_hash = 0 - for u32 i in 0..1000000 do + for u32 i in 0..REPETITION do PoseidonState hashes = poseidon(inputs) cumulated_hash = cumulated_hash + hashes.state0 + hashes.state1 + hashes.state2 + hashes.state3 + hashes.state4 + hashes.state5 + hashes.state6 + hashes.state7 + hashes.state8 + hashes.state9 + hashes.state10 + hashes.state11 endfor From 0044de9e833dcbc072bd9c40c71e303e22a7a91f Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Tue, 10 Dec 2024 11:01:06 -0500 Subject: [PATCH 12/54] Allow multi-file record for witness --- circ_blocks/examples/zxc.rs | 46 +++++++++++-------- spartan_parallel/examples/interface.rs | 26 ++++++++--- .../poseidon_test/poseidon_const.zok | 2 +- 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index 488e9d66..977d6d31 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -3,6 +3,7 @@ const PRINT_PROOF: bool = false; const INLINE_SPARTAN_PROOF: bool = true; const TOTAL_NUM_VARS_BOUND: usize = 10000000000; +const MAX_FILE_SIZE: usize = 1073741824; use circ::front::zsharp::{self, ZSharpFE}; use circ::front::{FrontEnd, Mode}; @@ -33,7 +34,6 @@ use libspartan::{ use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::time::*; -use std::time::*; // How many reserved variables (EXCLUDING V) are in front of the actual input / output? // %BN, %RET, %TS, %AS, %SP, %BP @@ -239,12 +239,17 @@ struct CompileTimeKnowledge { } impl CompileTimeKnowledge { - fn serialize_to_file(&self, benchmark_name: String) -> std::io::Result<()> { - let file_name = format!("../zok_tests/constraints/{benchmark_name}_bin.ctk"); - create_dir_all(Path::new(&file_name).parent().unwrap())?; - let mut f = File::create(file_name)?; + fn serialize_to_file(&self, benchmark_name: String, max_file_size: usize) -> std::io::Result<()> { let content = bincode::serialize(&self).unwrap(); - f.write(&content)?; + println!("CTK SIZE: {}", content.len()); + for i in 0..content.len().div_ceil(max_file_size) { + let file_name = format!("../zok_tests/constraints/{benchmark_name}_bin_{i}.ctk"); + create_dir_all(Path::new(&file_name).parent().unwrap())?; + let mut f = File::create(file_name)?; + let head = max_file_size * i; + let tail = min(max_file_size * (i + 1), content.len()); + f.write(&content[head..tail])?; + } Ok(()) } @@ -378,12 +383,17 @@ struct RunTimeKnowledge { } impl RunTimeKnowledge { - fn serialize_to_file(&self, benchmark_name: String) -> std::io::Result<()> { - let file_name = format!("../zok_tests/inputs/{benchmark_name}_bin.rtk"); - create_dir_all(Path::new(&file_name).parent().unwrap())?; - let mut f = File::create(file_name)?; + fn serialize_to_file(&self, benchmark_name: String, max_file_size: usize) -> std::io::Result<()> { let content = bincode::serialize(&self).unwrap(); - f.write(&content)?; + println!("RTK SIZE: {}", content.len()); + for i in 0..content.len().div_ceil(max_file_size) { + let file_name = format!("../zok_tests/inputs/{benchmark_name}_bin_{i}.rtk"); + create_dir_all(Path::new(&file_name).parent().unwrap())?; + let mut f = File::create(file_name)?; + let head = max_file_size * i; + let tail = min(max_file_size * (i + 1), content.len()); + f.write(&content[head..tail])?; + } Ok(()) } @@ -1589,13 +1599,13 @@ fn main() { ctk.write_to_file(benchmark_name.to_string()).unwrap(); rtk.write_to_file(benchmark_name.to_string()).unwrap(); } - if !INLINE_SPARTAN_PROOF { - // -- - // Write CTK, RTK to file - // -- - ctk.serialize_to_file(benchmark_name.to_string()).unwrap(); - rtk.serialize_to_file(benchmark_name.to_string()).unwrap(); - } else { + + // -- + // Write CTK, RTK to file + // -- + ctk.serialize_to_file(benchmark_name.to_string(), MAX_FILE_SIZE).unwrap(); + rtk.serialize_to_file(benchmark_name.to_string(), MAX_FILE_SIZE).unwrap(); + if INLINE_SPARTAN_PROOF { run_spartan_proof(ctk, rtk); } diff --git a/spartan_parallel/examples/interface.rs b/spartan_parallel/examples/interface.rs index dc1e26fc..4ba81798 100644 --- a/spartan_parallel/examples/interface.rs +++ b/spartan_parallel/examples/interface.rs @@ -42,10 +42,17 @@ struct CompileTimeKnowledge { impl CompileTimeKnowledge { fn deserialize_from_file(benchmark_name: String) -> CompileTimeKnowledge { - let file_name = format!("../zok_tests/constraints/{}_bin.ctk", benchmark_name); - let mut f = File::open(file_name).unwrap(); + // Input can be provided through multiple files, use i to determine the next file label + let mut i = 0; + let mut file_name = format!("../zok_tests/constraints/{benchmark_name}_bin_{i}.ctk"); let mut content: Vec = Vec::new(); - f.read_to_end(&mut content).unwrap(); + while let Ok(mut f) = File::open(file_name) { + let mut new_content: Vec = Vec::new(); + f.read_to_end(&mut new_content).unwrap(); + content.extend(new_content); + i += 1; + file_name = format!("../zok_tests/constraints/{benchmark_name}_bin_{i}.ctk"); + } bincode::deserialize(&content).unwrap() } } @@ -78,10 +85,17 @@ struct RunTimeKnowledge { impl serde::de::Deserialize<'de>> RunTimeKnowledge { fn deserialize_from_file(benchmark_name: String) -> RunTimeKnowledge { - let file_name = format!("../zok_tests/inputs/{}_bin.rtk", benchmark_name); - let mut f = File::open(file_name).unwrap(); + // Input can be provided through multiple files, use i to determine the next file label + let mut i = 0; + let mut file_name = format!("../zok_tests/inputs/{benchmark_name}_bin_{i}.rtk"); let mut content: Vec = Vec::new(); - f.read_to_end(&mut content).unwrap(); + while let Ok(mut f) = File::open(file_name) { + let mut new_content: Vec = Vec::new(); + f.read_to_end(&mut new_content).unwrap(); + content.extend(new_content); + i += 1; + file_name = format!("../zok_tests/inputs/{benchmark_name}_bin_{i}.rtk"); + } bincode::deserialize(&content).unwrap() } } diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index 71b82581..ac6bfc99 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 2000 +const u32 REPETITION = 10000 From 777b501b56ee63b7c2ef65137d57fc1d62744e4f Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Wed, 11 Dec 2024 13:56:41 -0500 Subject: [PATCH 13/54] Allow dynamic constraint size in sparse poly commit --- .gitignore | 1 + spartan_parallel/src/dense_mlpoly.rs | 6 +-- spartan_parallel/src/lib.rs | 52 ++++++++++--------- spartan_parallel/src/r1csinstance.rs | 45 +++++++++++++--- spartan_parallel/src/sparse_mlpoly.rs | 46 ++++++++++------ .../poseidon_test/poseidon_const.zok | 2 +- 6 files changed, 102 insertions(+), 50 deletions(-) diff --git a/.gitignore b/.gitignore index 3afab6ac..47f361b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store *.rtk *.ctk +zok_tests/benchmarks/poseidon_test/poseidon_const.zok # Generated by Cargo # will have compiled files and executables diff --git a/spartan_parallel/src/dense_mlpoly.rs b/spartan_parallel/src/dense_mlpoly.rs index 0d0a09f8..a03b0ea3 100644 --- a/spartan_parallel/src/dense_mlpoly.rs +++ b/spartan_parallel/src/dense_mlpoly.rs @@ -347,7 +347,7 @@ impl PolyEvalProof { // compute vector-matrix product between L and Z viewed as a matrix let LZ = poly.bound(&L); - PolyEvalProof { v: LZ } + PolyEvalProof { v: Vec::new() } } pub fn verify( @@ -440,7 +440,7 @@ impl PolyEvalProof { // compute vector-matrix product between L and Z viewed as a matrix let LZ = poly.bound(L); - proof_list.push(PolyEvalProof{ v: LZ }); + proof_list.push(PolyEvalProof{ v: Vec::new() }); } proof_list @@ -555,7 +555,7 @@ impl PolyEvalProof { let LZ = poly.bound(&L); L_list.push(L); R_list.push(R); - LZ_list.push(LZ); + LZ_list.push(Vec::new()); } } diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index e0c34a36..00943f77 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -607,11 +607,11 @@ pub struct SNARK { perm_root_r1cs_eval_proof: R1CSEvalProof, // Product proof for permutation - perm_poly_poly_list: Vec, - proof_eval_perm_poly_prod_list: Vec>, + // perm_poly_poly_list: Vec, + // proof_eval_perm_poly_prod_list: Vec>, // shift_proof: ShiftProofs, - io_proof: IOProofs, + // io_proof: IOProofs, } // Sort block_num_proofs and record where each entry is @@ -649,7 +649,7 @@ impl SNARK { } // Computes proof size by commitment / non-commitment - fn compute_size(&self) -> (usize, usize, usize) { + fn compute_size(&self) -> (usize, usize, usize, usize) { /* let commit_size = bincode::serialize(&self.block_comm_vars_list).unwrap().len() + bincode::serialize(&self.exec_comm_inputs).unwrap().len() @@ -683,29 +683,27 @@ impl SNARK { + bincode::serialize(&self.vir_mem_addr_comm_w3).unwrap().len() + bincode::serialize(&self.vir_mem_addr_comm_w3_shifted).unwrap().len(); */ - let dense_commit_size = 0; - - let sparse_commit_size = bincode::serialize(&self.block_r1cs_eval_proof_list).unwrap().len() - + bincode::serialize(&self.pairwise_check_r1cs_eval_proof).unwrap().len() - + bincode::serialize(&self.perm_root_r1cs_eval_proof).unwrap().len() - + bincode::serialize(&self.proof_eval_perm_poly_prod_list).unwrap().len(); - - let noncommit_size = bincode::serialize(&self.block_r1cs_sat_proof).unwrap().len() + let dense_commit_size = 0; + + let block_proof_size = bincode::serialize(&self.block_r1cs_sat_proof).unwrap().len() + bincode::serialize(&self.block_inst_evals_bound_rp).unwrap().len() + bincode::serialize(&self.block_inst_evals_list).unwrap().len() + + bincode::serialize(&self.block_r1cs_eval_proof_list).unwrap().len(); - + bincode::serialize(&self.pairwise_check_r1cs_sat_proof).unwrap().len() + let pairwise_proof_size = bincode::serialize(&self.pairwise_check_r1cs_sat_proof).unwrap().len() + bincode::serialize(&self.pairwise_check_inst_evals_bound_rp).unwrap().len() + bincode::serialize(&self.pairwise_check_inst_evals_list).unwrap().len() + + bincode::serialize(&self.pairwise_check_r1cs_eval_proof).unwrap().len(); - + bincode::serialize(&self.perm_root_r1cs_sat_proof).unwrap().len() + let perm_proof_size = bincode::serialize(&self.perm_root_r1cs_sat_proof).unwrap().len() + bincode::serialize(&self.perm_root_inst_evals).unwrap().len() - - + bincode::serialize(&self.perm_poly_poly_list).unwrap().len() + + bincode::serialize(&self.perm_root_r1cs_eval_proof).unwrap().len(); + // + bincode::serialize(&self.perm_poly_poly_list).unwrap().len() + // + bincode::serialize(&self.proof_eval_perm_poly_prod_list).unwrap().len(); // + bincode::serialize(&self.shift_proof).unwrap().len() - + bincode::serialize(&self.io_proof).unwrap().len(); - (dense_commit_size, sparse_commit_size, noncommit_size) + // let io_proof_size = bincode::serialize(&self.io_proof).unwrap().len(); + (dense_commit_size, block_proof_size, pairwise_proof_size, perm_proof_size) } /// A public computation to create a commitment to a list of R1CS instances @@ -2233,6 +2231,7 @@ impl SNARK { // -- // PERM_PRODUCT_PROOF // -- + /* let timer_proof = Timer::new("Perm Product"); // Record the prod of exec, blocks, mem_block, & mem_addr let (perm_poly_poly_list, proof_eval_perm_poly_prod_list) = { @@ -2349,7 +2348,6 @@ impl SNARK { shifted_polys.push(&vir_mem_addr_w3_shifted_prover.poly_w[0]); header_len_list.push(6); } - /* let shift_proof = ShiftProofs::prove( orig_polys, shifted_polys, @@ -2358,7 +2356,6 @@ impl SNARK { &mut random_tape, ); shift_proof - */ }; timer_proof.stop(); @@ -2384,6 +2381,7 @@ impl SNARK { &mut random_tape, ); timer_proof.stop(); + */ timer_prove.stop(); @@ -2402,11 +2400,11 @@ impl SNARK { perm_root_inst_evals, perm_root_r1cs_eval_proof, - perm_poly_poly_list, - proof_eval_perm_poly_prod_list, + // perm_poly_poly_list, + // proof_eval_perm_poly_prod_list, // shift_proof, - io_proof, + // io_proof, } } @@ -2457,7 +2455,7 @@ impl SNARK { transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - let (_, _, sumcheck_size) = self.compute_size(); + let (_, block_size, pairwise_size, perm_size) = self.compute_size(); let meta_size = // usize 19 * std::mem::size_of::() + @@ -3174,6 +3172,7 @@ impl SNARK { // -- // PERM_PRODUCT_PROOF // -- + /* { let timer_eval_opening = Timer::new("Perm Product"); // Verify prod of exec, blocks, mem_block, & mem_addr @@ -3368,10 +3367,13 @@ impl SNARK { transcript, )?; timer_proof.stop(); + */ timer_verify.stop(); - println!("SUMCHECK SIZE: {} bytes", sumcheck_size); + println!("BLOCK SUMCHECK SIZE: {} bytes", block_size); + println!("PAIRWISE SUMCHECK SIZE: {} bytes", pairwise_size); + println!("PERM SUMCHECK SIZE: {} bytes", perm_size); println!("META SIZE: {} bytes", meta_size); Ok(()) diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 7e280814..ada39022 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -1,3 +1,4 @@ +use std::cmp::{max, min}; use std::collections::HashMap; use crate::scalar::SpartanExtensionField; @@ -14,6 +15,7 @@ use super::sparse_mlpoly::{ }; use super::timer::Timer; use flate2::{write::ZlibEncoder, Compression}; +use std::iter::zip; use merlin::Transcript; use serde::{Deserialize, Serialize}; @@ -47,6 +49,8 @@ impl AppendToTranscript for R1CSCommitment { } pub struct R1CSDecommitment { + num_cons: usize, + num_vars: usize, dense: MultiSparseMatPolynomialAsDense, } @@ -455,6 +459,7 @@ impl R1CSInstance { let mut nnz_size: HashMap = HashMap::new(); let mut label_map: Vec> = Vec::new(); let mut sparse_polys_list: Vec>> = Vec::new(); + let mut max_num_cons_list: Vec = Vec::new(); for i in 0..self.num_instances { // A_list @@ -462,46 +467,58 @@ impl R1CSInstance { if let Some(index) = nnz_size.get(&A_len) { label_map[*index].push(3 * i); sparse_polys_list[*index].push(&self.A_list[i]); + max_num_cons_list[*index] = max(max_num_cons_list[*index], self.num_cons[i]); } else { let next_label = nnz_size.len(); nnz_size.insert(A_len, next_label); label_map.push(vec![3 * i]); sparse_polys_list.push(vec![&self.A_list[i]]); + max_num_cons_list.push(self.num_cons[i]); } // B_list let B_len = Self::next_power_of_eight(self.B_list[i].get_num_nz_entries()); if let Some(index) = nnz_size.get(&B_len) { label_map[*index].push(3 * i + 1); sparse_polys_list[*index].push(&self.B_list[i]); + max_num_cons_list[*index] = max(max_num_cons_list[*index], self.num_cons[i]); } else { let next_label = nnz_size.len(); nnz_size.insert(B_len, next_label); label_map.push(vec![3 * i + 1]); sparse_polys_list.push(vec![&self.B_list[i]]); + max_num_cons_list.push(self.num_cons[i]); } // C_list let C_len = Self::next_power_of_eight(self.C_list[i].get_num_nz_entries()); if let Some(index) = nnz_size.get(&C_len) { label_map[*index].push(3 * i + 2); sparse_polys_list[*index].push(&self.C_list[i]); + max_num_cons_list[*index] = max(max_num_cons_list[*index], self.num_cons[i]); } else { let next_label = nnz_size.len(); nnz_size.insert(C_len, next_label); label_map.push(vec![3 * i + 2]); sparse_polys_list.push(vec![&self.C_list[i]]); + max_num_cons_list.push(self.num_cons[i]); } } + println!("nnz_size: {:?}", nnz_size); let mut r1cs_comm_list = Vec::new(); let mut r1cs_decomm_list = Vec::new(); - for sparse_polys in sparse_polys_list { + println!("NUM_SP: {}", sparse_polys_list.len()); + for (sparse_polys, max_num_cons) in zip(sparse_polys_list, max_num_cons_list) { let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys); let r1cs_comm = R1CSCommitment { - num_cons: self.num_instances * self.max_num_cons, + num_cons: max_num_cons.next_power_of_two(), num_vars: self.num_vars, comm, }; - let r1cs_decomm = R1CSDecommitment { dense }; + let r1cs_decomm = R1CSDecommitment { + num_cons: max_num_cons.next_power_of_two(), + num_vars: self.num_vars, + dense + }; r1cs_comm_list.push(r1cs_comm); r1cs_decomm_list.push(r1cs_decomm); @@ -526,7 +543,11 @@ impl R1CSInstance { comm, }; - let r1cs_decomm = R1CSDecommitment { dense }; + let r1cs_decomm = R1CSDecommitment { + num_cons: self.num_instances * self.max_num_cons, + num_vars: self.num_vars, + dense + }; (r1cs_comm, r1cs_decomm) } @@ -547,8 +568,15 @@ impl R1CSEvalProof { random_tape: &mut RandomTape, ) -> R1CSEvalProof { let timer = Timer::new("R1CSEvalProof::prove"); + println!("RX_LEN: {}, RY_LEN: {}", rx.len(), ry.len()); + println!("NUM_CONS: {}, NUM_VARS: {}", decomm.num_cons, decomm.num_vars); + let rx_header = rx[..rx.len() - min(rx.len(), decomm.num_cons.log_2())].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let rx_short = &rx[rx.len() - min(rx.len(), decomm.num_cons.log_2())..]; + // let ry_short = &ry[..min(ry.len(), decomm.num_vars.log_2())]; let proof = - SparseMatPolyEvalProof::prove(&decomm.dense, rx, ry, evals, transcript, random_tape); + SparseMatPolyEvalProof::prove(&decomm.dense, rx_header, rx_short, ry, evals, transcript, random_tape); timer.stop(); R1CSEvalProof { proof } @@ -562,6 +590,11 @@ impl R1CSEvalProof { evals: &Vec, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - self.proof.verify(&comm.comm, rx, ry, evals, transcript) + let rx_header = rx[..rx.len() - min(rx.len(), comm.num_cons.log_2())].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let rx_short = &rx[rx.len() - min(rx.len(), comm.num_cons.log_2())..]; + // let ry_short = &ry[..min(ry.len(), comm.num_vars.log_2())]; + self.proof.verify(&comm.comm, rx_header, rx_short, ry, evals, transcript) } } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index 1f181685..e9662871 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -655,14 +655,14 @@ impl PolyEvalNetwork { } #[derive(Debug, Serialize, Deserialize)] -struct HashLayerProof { +pub struct HashLayerProof { eval_row: (Vec, Vec, S), eval_col: (Vec, Vec, S), eval_val: Vec, eval_derefs: (Vec, Vec), - proof_ops: PolyEvalProof, - proof_mem: PolyEvalProof, - proof_derefs: DerefsEvalProof, + pub proof_ops: PolyEvalProof, + pub proof_mem: PolyEvalProof, + pub proof_derefs: DerefsEvalProof, } impl HashLayerProof { @@ -980,12 +980,12 @@ impl HashLayerProof { } #[derive(Debug, Serialize, Deserialize)] -struct ProductLayerProof { +pub struct ProductLayerProof { eval_row: (S, Vec, Vec, S), eval_col: (S, Vec, Vec, S), eval_val: (Vec, Vec), - proof_mem: ProductCircuitEvalProofBatched, - proof_ops: ProductCircuitEvalProofBatched, + pub proof_mem: ProductCircuitEvalProofBatched, + pub proof_ops: ProductCircuitEvalProofBatched, } impl ProductLayerProof { @@ -998,6 +998,7 @@ impl ProductLayerProof { col_prod_layer: &mut ProductLayer, dense: &MultiSparseMatPolynomialAsDense, derefs: &Derefs, + r_header: S, eval: &[S], transcript: &mut Transcript, ) -> (Self, Vec, Vec) { @@ -1072,7 +1073,7 @@ impl ProductLayerProof { S::append_field_to_transcript(b"claim_eval_dotp_left", transcript, eval_dotp_left); S::append_field_to_transcript(b"claim_eval_dotp_right", transcript, eval_dotp_right); - assert_eq!(eval_dotp_left + eval_dotp_right, eval[i]); + assert_eq!(r_header * (eval_dotp_left + eval_dotp_right), eval[i]); eval_dotp_left_vec.push(eval_dotp_left); eval_dotp_right_vec.push(eval_dotp_right); @@ -1149,9 +1150,14 @@ impl ProductLayerProof { &self, num_ops: usize, num_cells: usize, + r_header: S, eval: &[S], transcript: &mut Transcript, ) -> Result<(Vec, Vec, Vec, Vec, Vec), ProofVerifyError> { + let proof_mem_len = bincode::serialize(&self.proof_mem).unwrap().len(); + let proof_ops_len = bincode::serialize(&self.proof_ops).unwrap().len(); + println!("PROOF_MEM: {}, PROOF_OPS: {}", proof_mem_len, proof_ops_len); + >::append_protocol_name( transcript, ProductLayerProof::::protocol_name(), @@ -1195,7 +1201,7 @@ impl ProductLayerProof { assert_eq!(eval_dotp_left.len(), num_instances); let mut claims_dotp_circuit: Vec = Vec::new(); for i in 0..num_instances { - assert_eq!(eval_dotp_left[i] + eval_dotp_right[i], eval[i]); + assert_eq!(r_header * (eval_dotp_left[i] + eval_dotp_right[i]), eval[i]); S::append_field_to_transcript(b"claim_eval_dotp_left", transcript, eval_dotp_left[i]); S::append_field_to_transcript(b"claim_eval_dotp_right", transcript, eval_dotp_right[i]); @@ -1235,9 +1241,9 @@ impl ProductLayerProof { } #[derive(Debug, Serialize, Deserialize)] -struct PolyEvalNetworkProof { - proof_prod_layer: ProductLayerProof, - proof_hash_layer: HashLayerProof, +pub struct PolyEvalNetworkProof { + pub proof_prod_layer: ProductLayerProof, + pub proof_hash_layer: HashLayerProof, } impl PolyEvalNetworkProof { @@ -1249,6 +1255,7 @@ impl PolyEvalNetworkProof { network: &mut PolyEvalNetwork, dense: &MultiSparseMatPolynomialAsDense, derefs: &Derefs, + r_header: S, evals: &[S], transcript: &mut Transcript, random_tape: &mut RandomTape, @@ -1263,6 +1270,7 @@ impl PolyEvalNetworkProof { &mut network.col_layers.prod_layer, dense, derefs, + r_header, evals, transcript, ); @@ -1285,6 +1293,7 @@ impl PolyEvalNetworkProof { pub fn verify( &self, comm: &SparseMatPolyCommitment, + r_header: S, evals: &[S], rx: &[S], ry: &[S], @@ -1307,7 +1316,7 @@ impl PolyEvalNetworkProof { let (claims_mem, rand_mem, mut claims_ops, claims_dotp, rand_ops) = self .proof_prod_layer - .verify(num_ops, num_cells, evals, transcript)?; + .verify(num_ops, num_cells, r_header, evals, transcript)?; assert_eq!(claims_mem.len(), 4); assert_eq!(claims_ops.len(), 4 * num_instances); assert_eq!(claims_dotp.len(), 3 * num_instances); @@ -1347,7 +1356,7 @@ impl PolyEvalNetworkProof { #[derive(Debug, Serialize, Deserialize)] pub struct SparseMatPolyEvalProof { - poly_eval_network_proof: PolyEvalNetworkProof, + pub poly_eval_network_proof: PolyEvalNetworkProof, } impl SparseMatPolyEvalProof { @@ -1375,12 +1384,17 @@ impl SparseMatPolyEvalProof { pub fn prove( dense: &MultiSparseMatPolynomialAsDense, + r_header: S, rx: &[S], // point at which the polynomial is evaluated ry: &[S], evals: &[S], // a vector evaluation of \widetilde{M}(r = (rx,ry)) for each M transcript: &mut Transcript, random_tape: &mut RandomTape, ) -> SparseMatPolyEvalProof { + println!("NNZ_LEN: {}", dense.val[0].len()); + println!("RX_LEN: {}", rx.len()); + println!("RY_LEN: {}", ry.len()); + println!("EVALS_LEN: {}", evals.len()); >::append_protocol_name( transcript, SparseMatPolyEvalProof::::protocol_name(), @@ -1421,7 +1435,7 @@ impl SparseMatPolyEvalProof { let timer_eval_network = Timer::new("evalproof_layered_network"); let poly_eval_network_proof = - PolyEvalNetworkProof::prove(&mut net, dense, &derefs, evals, transcript, random_tape); + PolyEvalNetworkProof::prove(&mut net, dense, &derefs, r_header, evals, transcript, random_tape); timer_eval_network.stop(); poly_eval_network_proof @@ -1435,6 +1449,7 @@ impl SparseMatPolyEvalProof { pub fn verify( &self, comm: &SparseMatPolyCommitment, + r_header: S, rx: &[S], // point at which the polynomial is evaluated ry: &[S], evals: &[S], // evaluation of \widetilde{M}(r = (rx,ry)) @@ -1456,6 +1471,7 @@ impl SparseMatPolyEvalProof { self.poly_eval_network_proof.verify( comm, + r_header, evals, &rx_ext, &ry_ext, diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index ac6bfc99..8cdc6cc0 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 10000 +const u32 REPETITION = 131072 From 1eb023e5b765458b29c66d2c070f0a2e424fffb4 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Wed, 11 Dec 2024 14:32:18 -0500 Subject: [PATCH 14/54] Group sparse commit by num_vars instead of num_nnz --- spartan_parallel/src/instance.rs | 40 ++++++++---- spartan_parallel/src/r1csinstance.rs | 90 +++++++++++++-------------- spartan_parallel/src/sparse_mlpoly.rs | 3 +- 3 files changed, 71 insertions(+), 62 deletions(-) diff --git a/spartan_parallel/src/instance.rs b/spartan_parallel/src/instance.rs index 91133400..f758842c 100644 --- a/spartan_parallel/src/instance.rs +++ b/spartan_parallel/src/instance.rs @@ -20,22 +20,32 @@ impl Instance { num_instances: usize, max_num_cons: usize, num_cons: Vec, - num_vars: usize, + max_num_vars: usize, + num_vars: Vec, A: &Vec>, B: &Vec>, C: &Vec>, ) -> Result, R1CSError> { - let (num_vars_padded, max_num_cons_padded, num_cons_padded) = { - let num_vars_padded = { - let mut num_vars_padded = num_vars; + let (max_num_vars_padded, num_vars_padded, max_num_cons_padded, num_cons_padded) = { + let max_num_vars_padded = { + let mut max_num_vars_padded = max_num_vars; // ensure that num_vars_padded a power of two - if num_vars_padded.next_power_of_two() != num_vars_padded { - num_vars_padded = num_vars_padded.next_power_of_two(); + if max_num_vars_padded.next_power_of_two() != max_num_vars_padded { + max_num_vars_padded = max_num_vars_padded.next_power_of_two(); } - num_vars_padded + max_num_vars_padded }; + let mut num_vars_padded = Vec::new(); + for i in 0..num_vars.len() { + if num_vars[i] == 0 || num_vars[i] == 1 { + num_vars_padded.push(2); + } else { + num_vars_padded.push(num_vars[i].next_power_of_two()); + } + } + let max_num_cons_padded = { let mut max_num_cons_padded = max_num_cons; @@ -60,7 +70,7 @@ impl Instance { } } - (num_vars_padded, max_num_cons_padded, num_cons_padded) + (max_num_vars_padded, num_vars_padded, max_num_cons_padded, num_cons_padded) }; let bytes_to_scalar = @@ -74,8 +84,8 @@ impl Instance { } // col must be smaller than num_vars - if col >= num_vars { - println!("COL: {}, NUM_VARS: {}", col, num_vars); + if col >= num_vars[b] { + println!("COL: {}, NUM_VARS: {}", col, num_vars[b]); return Err(R1CSError::InvalidIndex); } @@ -83,8 +93,8 @@ impl Instance { if val.is_some().unwrap_u8() == 1 { // if col >= num_vars, it means that it is referencing a 1 or input in the satisfying // assignment - if col >= num_vars { - mat.push((row, col + num_vars_padded - num_vars, val.unwrap())); + if col >= num_vars[b] { + mat.push((row, col + num_vars_padded[b] - num_vars[b], val.unwrap())); } else { mat.push((row, col, val.unwrap())); } @@ -97,7 +107,7 @@ impl Instance { // we do not need to pad otherwise because the dummy constraints are implicit in the sum-check protocol if num_cons[b] == 0 || num_cons[b] == 1 { for i in tups.len()..num_cons_padded[b] { - mat.push((i, num_vars, S::field_zero())); + mat.push((i, num_vars[b], S::field_zero())); } } @@ -132,6 +142,7 @@ impl Instance { num_instances, max_num_cons_padded, num_cons_padded, + max_num_vars_padded, num_vars_padded, &A_scalar_list, &B_scalar_list, @@ -674,6 +685,7 @@ impl Instance { block_max_num_cons, block_num_cons, block_num_vars, + vec![block_num_vars; num_instances], &A_list, &B_list, &C_list, @@ -1048,6 +1060,7 @@ impl Instance { pairwise_check_max_num_cons, pairwise_check_num_cons, 4 * pairwise_check_num_vars, + vec![4 * pairwise_check_num_vars; 3], &A_list, &B_list, &C_list, @@ -1299,6 +1312,7 @@ impl Instance { perm_root_num_cons, vec![perm_root_num_cons], 8 * num_vars, + vec![8 * num_vars], &A_list, &B_list, &C_list, diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index ada39022..e158de82 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -26,7 +26,8 @@ pub struct R1CSInstance { // num_cons and num_vars need to be power of 2 max_num_cons: usize, num_cons: Vec, - num_vars: usize, + max_num_vars: usize, + num_vars: Vec, // List of individual A, B, C for matrix multiplication A_list: Vec>, B_list: Vec>, @@ -69,14 +70,15 @@ impl R1CSInstance { num_instances: usize, max_num_cons: usize, num_cons: Vec, - num_vars: usize, + max_num_vars: usize, + num_vars: Vec, A_list: &Vec>, B_list: &Vec>, C_list: &Vec>, ) -> R1CSInstance { Timer::print(&format!("number_of_instances {num_instances}")); Timer::print(&format!("number_of_constraints {max_num_cons}")); - Timer::print(&format!("number_of_variables {num_vars}")); + Timer::print(&format!("number_of_variables {max_num_vars}")); // Timer::print(&format!("number_non-zero_entries_A {}", A.len())); // Timer::print(&format!("number_non-zero_entries_B {}", B.len())); // Timer::print(&format!("number_non-zero_entries_C {}", C.len())); @@ -89,7 +91,11 @@ impl R1CSInstance { } // check that num_vars is a power of 2 - assert_eq!(num_vars.next_power_of_two(), num_vars); + assert_eq!(max_num_vars.next_power_of_two(), max_num_vars); + for v in &num_vars { + assert_eq!(v.next_power_of_two(), *v); + assert!(*v <= max_num_vars); + } // check that length of A_list, B_list, C_list are the same assert_eq!(A_list.len(), B_list.len()); @@ -97,7 +103,7 @@ impl R1CSInstance { // no errors, so create polynomials let num_poly_vars_x = max_num_cons.log_2(); - let num_poly_vars_y = num_vars.log_2(); + let num_poly_vars_y = max_num_vars.log_2(); let mut poly_A_list = Vec::new(); let mut poly_B_list = Vec::new(); @@ -153,7 +159,8 @@ impl R1CSInstance { num_instances, max_num_cons, num_cons: num_cons.clone(), - num_vars, + max_num_vars, + num_vars: num_vars.clone(), A_list: poly_A_list, B_list: poly_B_list, C_list: poly_C_list, @@ -183,7 +190,11 @@ impl R1CSInstance { } pub fn get_num_vars(&self) -> usize { - self.num_vars + self.max_num_vars + } + + pub fn get_inst_num_vars(&self) -> &Vec { + &self.num_vars } pub fn get_num_cons(&self) -> usize { @@ -290,7 +301,7 @@ impl R1CSInstance { ) -> (Vec, Vec, Vec) { assert!(self.num_instances == 1 || self.num_instances == num_instances); assert_eq!(num_rows, self.max_num_cons); - assert_eq!(num_cols, self.num_vars); + assert_eq!(num_cols, self.max_num_vars); let mut evals_A_list = Vec::new(); let mut evals_B_list = Vec::new(); @@ -342,7 +353,7 @@ impl R1CSInstance { ) { assert!(self.num_instances == 1 || self.num_instances == num_instances); assert_eq!(num_rows, &self.num_cons); - assert_eq!(num_segs.next_power_of_two() * max_num_cols, self.num_vars); + assert_eq!(num_segs.next_power_of_two() * max_num_cols, self.max_num_vars); let mut evals_A_list = Vec::new(); let mut evals_B_list = Vec::new(); @@ -438,13 +449,12 @@ impl R1CSInstance { (evals[0], evals[1], evals[2]) } - // Group all instances with the similar NNZ (round to the next power of eight) together + // Group all instances with the similar num_vars (round to the next power of four) together // Output.0 records the label of instances included within each commitment - // Note that we do not group A, B, C together - pub fn next_power_of_eight(val: usize) -> usize { + pub fn next_power_of_four(val: usize) -> usize { let mut base = 1; while base < val { - base *= 8; + base *= 4; } return base; } @@ -456,67 +466,51 @@ impl R1CSInstance { Vec>, Vec>, ) { - let mut nnz_size: HashMap = HashMap::new(); + let mut vars_size: HashMap = HashMap::new(); let mut label_map: Vec> = Vec::new(); let mut sparse_polys_list: Vec>> = Vec::new(); let mut max_num_cons_list: Vec = Vec::new(); + let mut max_num_vars_list: Vec = Vec::new(); + // Group the instances based on number of variables, separated by orders of 2^256 for i in 0..self.num_instances { - // A_list - let A_len = Self::next_power_of_eight(self.A_list[i].get_num_nz_entries()); - if let Some(index) = nnz_size.get(&A_len) { + let var_len = Self::next_power_of_four(self.num_vars[i]); + // A_list, B_list, C_list + if let Some(index) = vars_size.get(&var_len) { label_map[*index].push(3 * i); sparse_polys_list[*index].push(&self.A_list[i]); - max_num_cons_list[*index] = max(max_num_cons_list[*index], self.num_cons[i]); - } else { - let next_label = nnz_size.len(); - nnz_size.insert(A_len, next_label); - label_map.push(vec![3 * i]); - sparse_polys_list.push(vec![&self.A_list[i]]); - max_num_cons_list.push(self.num_cons[i]); - } - // B_list - let B_len = Self::next_power_of_eight(self.B_list[i].get_num_nz_entries()); - if let Some(index) = nnz_size.get(&B_len) { label_map[*index].push(3 * i + 1); sparse_polys_list[*index].push(&self.B_list[i]); - max_num_cons_list[*index] = max(max_num_cons_list[*index], self.num_cons[i]); - } else { - let next_label = nnz_size.len(); - nnz_size.insert(B_len, next_label); - label_map.push(vec![3 * i + 1]); - sparse_polys_list.push(vec![&self.B_list[i]]); - max_num_cons_list.push(self.num_cons[i]); - } - // C_list - let C_len = Self::next_power_of_eight(self.C_list[i].get_num_nz_entries()); - if let Some(index) = nnz_size.get(&C_len) { label_map[*index].push(3 * i + 2); sparse_polys_list[*index].push(&self.C_list[i]); max_num_cons_list[*index] = max(max_num_cons_list[*index], self.num_cons[i]); + max_num_vars_list[*index] = max(max_num_vars_list[*index], self.num_vars[i]); } else { - let next_label = nnz_size.len(); - nnz_size.insert(C_len, next_label); + let next_label = vars_size.len(); + vars_size.insert(var_len, next_label); + label_map.push(vec![3 * i]); + sparse_polys_list.push(vec![&self.A_list[i]]); + label_map.push(vec![3 * i + 1]); + sparse_polys_list.push(vec![&self.B_list[i]]); label_map.push(vec![3 * i + 2]); sparse_polys_list.push(vec![&self.C_list[i]]); max_num_cons_list.push(self.num_cons[i]); + max_num_vars_list.push(self.num_vars[i]); } } - println!("nnz_size: {:?}", nnz_size); let mut r1cs_comm_list = Vec::new(); let mut r1cs_decomm_list = Vec::new(); - println!("NUM_SP: {}", sparse_polys_list.len()); - for (sparse_polys, max_num_cons) in zip(sparse_polys_list, max_num_cons_list) { + for ((sparse_polys, max_num_cons), max_num_vars) in zip(zip(sparse_polys_list, max_num_cons_list), max_num_vars_list) { let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys); let r1cs_comm = R1CSCommitment { num_cons: max_num_cons.next_power_of_two(), - num_vars: self.num_vars, + num_vars: max_num_vars, comm, }; let r1cs_decomm = R1CSDecommitment { num_cons: max_num_cons.next_power_of_two(), - num_vars: self.num_vars, + num_vars: max_num_vars, dense }; @@ -539,13 +533,13 @@ impl R1CSInstance { let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys); let r1cs_comm = R1CSCommitment { num_cons: self.num_instances * self.max_num_cons, - num_vars: self.num_vars, + num_vars: self.max_num_vars, comm, }; let r1cs_decomm = R1CSDecommitment { num_cons: self.num_instances * self.max_num_cons, - num_vars: self.num_vars, + num_vars: self.max_num_vars, dense }; diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index e9662871..2cf16951 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -1527,6 +1527,7 @@ mod tests { let mut prover_transcript = Transcript::new(b"example"); let proof = SparseMatPolyEvalProof::prove( &dense, + Scalar::one(), &rx, &ry, &evals, @@ -1536,7 +1537,7 @@ mod tests { let mut verifier_transcript = Transcript::new(b"example"); assert!(proof - .verify(&poly_comm, &rx, &ry, &evals, &mut verifier_transcript,) + .verify(&poly_comm, Scalar::one(), &rx, &ry, &evals, &mut verifier_transcript,) .is_ok()); } } From 7743f9a5ff04d74a9efefa1ed15ddfdc3199c664 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Wed, 11 Dec 2024 21:20:28 -0500 Subject: [PATCH 15/54] Decrease sparse commitment size --- circ_blocks/examples/zxc.rs | 33 +++-- spartan_parallel/examples/interface.rs | 17 ++- spartan_parallel/src/instance.rs | 179 ++++++++++++++++--------- spartan_parallel/src/lib.rs | 20 +-- spartan_parallel/src/r1csinstance.rs | 139 ++++++++++++++----- spartan_parallel/src/sparse_mlpoly.rs | 8 +- 6 files changed, 271 insertions(+), 125 deletions(-) diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index 977d6d31..880462ac 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -1308,16 +1308,29 @@ fn run_spartan_proof( println!("Generating Circuits..."); // -- // BLOCK INSTANCES + // block_inst is used by sumcheck. Every block has the same number of variables let (block_num_vars, block_num_cons, block_num_non_zero_entries, mut block_inst) = - Instance::gen_block_inst::( - block_num_instances_bound, - num_vars, - &ctk.args, - num_inputs_unpadded, - &block_num_phy_ops, - &block_num_vir_ops, - &ctk.num_vars_per_block, - &rtk.block_num_proofs, + Instance::gen_block_inst::( + block_num_instances_bound, + num_vars, + &ctk.args, + num_inputs_unpadded, + &block_num_phy_ops, + &block_num_vir_ops, + &ctk.num_vars_per_block, + &rtk.block_num_proofs, + ); + // block_inst is used by commitment. Every block has different number of variables + let (_, _, _, block_inst_for_commit) = + Instance::::gen_block_inst::( + block_num_instances_bound, + num_vars, + &ctk.args, + num_inputs_unpadded, + &block_num_phy_ops, + &block_num_vir_ops, + &ctk.num_vars_per_block, + &rtk.block_num_proofs, ); println!("Finished Block"); @@ -1355,7 +1368,7 @@ fn run_spartan_proof( println!("Comitting Circuits..."); // block_comm_map records the sparse_polys committed in each commitment // Note that A, B, C are committed separately, so sparse_poly[3*i+2] corresponds to poly C of instance i - let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst); + let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst_for_commit); println!("Finished Block"); let (pairwise_check_comm, pairwise_check_decomm) = SNARK::encode(&pairwise_check_inst); println!("Finished Pairwise"); diff --git a/spartan_parallel/examples/interface.rs b/spartan_parallel/examples/interface.rs index 4ba81798..44ee6e51 100644 --- a/spartan_parallel/examples/interface.rs +++ b/spartan_parallel/examples/interface.rs @@ -135,8 +135,21 @@ fn main() { println!("Generating Circuits..."); // -- // BLOCK INSTANCES + // block_inst is used by sumcheck. Every block has the same number of variables let (block_num_vars, block_num_cons, block_num_non_zero_entries, mut block_inst) = - Instance::gen_block_inst::( + Instance::gen_block_inst::( + block_num_instances_bound, + num_vars, + &ctk.args, + num_inputs_unpadded, + &block_num_phy_ops, + &block_num_vir_ops, + &ctk.num_vars_per_block, + &rtk.block_num_proofs, + ); + // block_inst is used by commitment. Every block has different number of variables + let (_, _, _, block_inst_for_commit) = + Instance::::gen_block_inst::( block_num_instances_bound, num_vars, &ctk.args, @@ -185,7 +198,7 @@ fn main() { println!("Comitting Circuits..."); // block_comm_map records the sparse_polys committed in each commitment // Note that A, B, C are committed separately, so sparse_poly[3*i+2] corresponds to poly C of instance i - let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst); + let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst_for_commit); println!("Finished Block"); let (pairwise_check_comm, pairwise_check_decomm) = SNARK::encode(&pairwise_check_inst); println!("Finished Pairwise"); diff --git a/spartan_parallel/src/instance.rs b/spartan_parallel/src/instance.rs index f758842c..9057dc81 100644 --- a/spartan_parallel/src/instance.rs +++ b/spartan_parallel/src/instance.rs @@ -1,10 +1,22 @@ use std::cmp::max; +use std::collections::HashMap; use crate::errors::R1CSError; use crate::math::Math; use crate::scalar::SpartanExtensionField; use crate::R1CSInstance; +const GROUP_POWER_SCALE: usize = 16; +// Group all instances with the similar num_vars (round to the next power of four) together +// Output.0 records the label of instances included within each commitment +fn next_group_size(val: usize) -> usize { + let mut base = 1; + while base < val { + base *= GROUP_POWER_SCALE; + } + return base; +} + /// `Instance` holds the description of R1CS matrices and a hash of the matrices #[derive(Clone)] pub struct Instance { @@ -254,7 +266,9 @@ impl Instance { /// - VMR3 = r^3 * VT /// - VMC = (1 or VMC[i-1]) * (tau - VA - VMR1 - VMR2 - VMR3) /// The final product is stored in X = MC[NV - 1] - pub fn gen_block_inst( + /// + /// If in COMMIT_MODE, commit instance by num_vars_per_block, rounded to the nearest power of four + pub fn gen_block_inst( num_instances: usize, num_vars: usize, args: &Vec< @@ -274,6 +288,24 @@ impl Instance { ) -> (usize, usize, usize, Instance) { assert_eq!(num_instances, args.len()); + let num_vars_padded_per_block = if COMMIT_MODE { + // If in commit mode, group all R1CS with num_vars within a power of 2^4 + // For every padded group size, mark the actual maximum num_vars of each group + let mut max_size_per_group: HashMap = HashMap::new(); + for num_vars in num_vars_per_block { + if let Some(val) = max_size_per_group.get(&next_group_size(*num_vars)) { + if num_vars.next_power_of_two() > *val { + max_size_per_group.insert(next_group_size(*num_vars), num_vars.next_power_of_two()); + } + } else { + max_size_per_group.insert(next_group_size(*num_vars), num_vars.next_power_of_two()); + } + } + num_vars_per_block.iter().map(|i| max_size_per_group.get(&next_group_size(*i)).unwrap().clone()).collect() + } else { + vec![num_vars; num_instances] + }; + if PRINT_SIZE { println!("\n\n--\nBLOCK INSTS"); println!( @@ -304,43 +336,43 @@ impl Instance { let V_VL = |b: usize, i: usize| io_width + 2 * num_phy_ops[b] + 4 * i + 2; let V_VT = |b: usize, i: usize| io_width + 2 * num_phy_ops[b] + 4 * i + 3; // in CHALLENGES, not used if !has_mem_op - let V_tau = num_vars; - let V_r = |i: usize| num_vars + i; + let V_tau = |b: usize| num_vars_padded_per_block[b]; + let V_r = |b: usize, i: usize| num_vars_padded_per_block[b] + i; // in BLOCK_W2 / INPUT_W2 - let V_input_dot_prod = |i: usize| { + let V_input_dot_prod = |b: usize, i: usize| { if i == 0 { V_input(0) } else { - 2 * num_vars + 2 + i + 2 * num_vars_padded_per_block[b] + 2 + i } }; - let V_output_dot_prod = |i: usize| 2 * num_vars + 2 + (num_inputs_unpadded - 1) + i; + let V_output_dot_prod = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 + (num_inputs_unpadded - 1) + i; // in BLOCK_W2 / PHY_W2 - let V_PMR = |i: usize| 2 * num_vars + 2 * num_inputs_unpadded + 2 * i; - let V_PMC = |i: usize| 2 * num_vars + 2 * num_inputs_unpadded + 2 * i + 1; + let V_PMR = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i; + let V_PMC = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i + 1; // in BLOCK_W2 / VIR_W2 let V_VMR1 = - |b: usize, i: usize| 2 * num_vars + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i; + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i; let V_VMR2 = - |b: usize, i: usize| 2 * num_vars + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 1; + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 1; let V_VMR3 = - |b: usize, i: usize| 2 * num_vars + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 2; + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 2; let V_VMC = - |b: usize, i: usize| 2 * num_vars + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 3; + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 3; // in BLOCK_W3 - let V_v = 3 * num_vars; - let V_x = 3 * num_vars + 1; - let V_pi = 3 * num_vars + 2; - let V_d = 3 * num_vars + 3; - let V_Pp = 3 * num_vars + 4; - let V_Pd = 3 * num_vars + 5; - let V_Vp = 3 * num_vars + 6; - let V_Vd = 3 * num_vars + 7; + let V_v = |b: usize| 3 * num_vars_padded_per_block[b]; + let V_x = |b: usize| 3 * num_vars_padded_per_block[b] + 1; + let V_pi = |b: usize| 3 * num_vars_padded_per_block[b] + 2; + let V_d = |b: usize| 3 * num_vars_padded_per_block[b] + 3; + let V_Pp = |b: usize| 3 * num_vars_padded_per_block[b] + 4; + let V_Pd = |b: usize| 3 * num_vars_padded_per_block[b] + 5; + let V_Vp = |b: usize| 3 * num_vars_padded_per_block[b] + 6; + let V_Vd = |b: usize| 3 * num_vars_padded_per_block[b] + 7; // in BLOCK_W3_SHIFTED - let V_sv = 4 * num_vars; - let V_spi = 4 * num_vars + 2; - let V_Psp = 4 * num_vars + 4; - let V_Vsp = 4 * num_vars + 6; + let V_sv = |b: usize| 4 * num_vars_padded_per_block[b]; + let V_spi = |b: usize| 4 * num_vars_padded_per_block[b] + 2; + let V_Psp = |b: usize| 4 * num_vars_padded_per_block[b] + 4; + let V_Vsp = |b: usize| 4 * num_vars_padded_per_block[b] + 6; // Variable used by printing let mut total_inst_commit_size = 0; @@ -385,8 +417,8 @@ impl Instance { C, counter, vec![(V_input(i), 1)], - vec![(V_r(i), 1)], - vec![(V_input_dot_prod(i), 1)], + vec![(V_r(b, i), 1)], + vec![(V_input_dot_prod(b, i), 1)], ); counter += 1; } @@ -398,8 +430,8 @@ impl Instance { C, counter, vec![(V_output(i), 1)], - vec![(V_r(i + num_inputs_unpadded - 1), 1)], - vec![(V_output_dot_prod(i), 1)], + vec![(V_r(b, i + num_inputs_unpadded - 1), 1)], + vec![(V_output_dot_prod(b, i), 1)], ); counter += 1; } @@ -411,7 +443,7 @@ impl Instance { counter, vec![], vec![], - vec![(V_valid, 1), (V_v, -1)], + vec![(V_valid, 1), (V_v(b), -1)], ); counter += 1; // x[k] @@ -421,14 +453,14 @@ impl Instance { C, counter, [ - vec![(V_tau, 1)], + vec![(V_tau(b), 1)], (0..2 * num_inputs_unpadded - 2) - .map(|i| (V_input_dot_prod(i), -1)) + .map(|i| (V_input_dot_prod(b, i), -1)) .collect(), ] .concat(), vec![(V_cnst, 1)], - vec![(V_x, 1)], + vec![(V_x(b), 1)], ); counter += 1; // D[k] = x[k] * (pi[k + 1] + (1 - v[k + 1])) @@ -437,9 +469,9 @@ impl Instance { B, C, counter, - vec![(V_x, 1)], - vec![(V_spi, 1), (V_cnst, 1), (V_sv, -1)], - vec![(V_d, 1)], + vec![(V_x(b), 1)], + vec![(V_spi(b), 1), (V_cnst, 1), (V_sv(b), -1)], + vec![(V_d(b), 1)], ); counter += 1; // pi[k] = v[k] * D[k] @@ -448,9 +480,9 @@ impl Instance { B, C, counter, - vec![(V_v, 1)], - vec![(V_d, 1)], - vec![(V_pi, 1)], + vec![(V_v(b), 1)], + vec![(V_d(b), 1)], + vec![(V_pi(b), 1)], ); counter += 1; @@ -469,9 +501,9 @@ impl Instance { B, C, counter, - vec![(V_r(1), 1)], + vec![(V_r(b, 1), 1)], vec![(V_PD(i), 1)], - vec![(V_PMR(i), 1)], + vec![(V_PMR(b, i), 1)], ); counter += 1; // PMC = (1 or PMC[i-1]) * (tau - PA - PMR) @@ -482,8 +514,8 @@ impl Instance { C, counter, vec![(V_cnst, 1)], - vec![(V_tau, 1), (V_PA(i), -1), (V_PMR(i), -1)], - vec![(V_PMC(i), 1)], + vec![(V_tau(b), 1), (V_PA(i), -1), (V_PMR(b, i), -1)], + vec![(V_PMC(b, i), 1)], ); } else { (A, B, C) = Instance::::gen_constr( @@ -491,9 +523,9 @@ impl Instance { B, C, counter, - vec![(V_PMC(i - 1), 1)], - vec![(V_tau, 1), (V_PA(i), -1), (V_PMR(i), -1)], - vec![(V_PMC(i), 1)], + vec![(V_PMC(b, i - 1), 1)], + vec![(V_tau(b), 1), (V_PA(i), -1), (V_PMR(b, i), -1)], + vec![(V_PMC(b, i), 1)], ); } counter += 1; @@ -509,10 +541,10 @@ impl Instance { vec![if num_phy_ops[b] == 0 { (V_cnst, 1) } else { - (V_PMC(num_phy_ops[b] - 1), 1) + (V_PMC(b, num_phy_ops[b] - 1), 1) }], - vec![(V_Psp, 1), (V_cnst, 1), (V_sv, -1)], - vec![(V_Pd, 1)], + vec![(V_Psp(b), 1), (V_cnst, 1), (V_sv(b), -1)], + vec![(V_Pd(b), 1)], ); counter += 1; // Pp @@ -521,9 +553,9 @@ impl Instance { B, C, counter, - vec![(V_v, 1)], - vec![(V_Pd, 1)], - vec![(V_Pp, 1)], + vec![(V_v(b), 1)], + vec![(V_Pd(b), 1)], + vec![(V_Pp(b), 1)], ); counter += 1; @@ -539,7 +571,7 @@ impl Instance { B, C, counter, - vec![(V_r(1), 1)], + vec![(V_r(b, 1), 1)], vec![(V_VD(b, i), 1)], vec![(V_VMR1(b, i), 1)], ); @@ -550,7 +582,7 @@ impl Instance { B, C, counter, - vec![(V_r(2), 1)], + vec![(V_r(b, 2), 1)], vec![(V_VL(b, i), 1)], vec![(V_VMR2(b, i), 1)], ); @@ -561,7 +593,7 @@ impl Instance { B, C, counter, - vec![(V_r(3), 1)], + vec![(V_r(b, 3), 1)], vec![(V_VT(b, i), 1)], vec![(V_VMR3(b, i), 1)], ); @@ -575,7 +607,7 @@ impl Instance { counter, vec![(V_cnst, 1)], vec![ - (V_tau, 1), + (V_tau(b), 1), (V_VA(b, i), -1), (V_VMR1(b, i), -1), (V_VMR2(b, i), -1), @@ -591,7 +623,7 @@ impl Instance { counter, vec![(V_VMC(b, i - 1), 1)], vec![ - (V_tau, 1), + (V_tau(b), 1), (V_VA(b, i), -1), (V_VMR1(b, i), -1), (V_VMR2(b, i), -1), @@ -615,8 +647,8 @@ impl Instance { } else { (V_VMC(b, num_vir_ops[b] - 1), 1) }], - vec![(V_Vsp, 1), (V_cnst, 1), (V_sv, -1)], - vec![(V_Vd, 1)], + vec![(V_Vsp(b), 1), (V_cnst, 1), (V_sv(b), -1)], + vec![(V_Vd(b), 1)], ); counter += 1; // Vp @@ -625,9 +657,9 @@ impl Instance { B, C, counter, - vec![(V_v, 1)], - vec![(V_Vd, 1)], - vec![(V_Vp, 1)], + vec![(V_v(b), 1)], + vec![(V_Vd(b), 1)], + vec![(V_Vp(b), 1)], ); counter += 1; @@ -679,13 +711,32 @@ impl Instance { println!("Total Cons Exec Size: {}", total_cons_exec_size); } + // Set num_cons of R1CS of the same num_vars to be the same + let num_cons_padded_per_block = { + if COMMIT_MODE { + let mut max_cons_per_group: HashMap = HashMap::new(); + for i in 0..num_instances { + if let Some(num_cons) = max_cons_per_group.get(&num_vars_padded_per_block[i]) { + if *num_cons < block_num_cons[i] { + max_cons_per_group.insert(num_vars_padded_per_block[i], block_num_cons[i]); + } + } else { + max_cons_per_group.insert(num_vars_padded_per_block[i], block_num_cons[i]); + } + } + num_vars_padded_per_block.iter().map(|i| max_cons_per_group.get(i).unwrap().clone()).collect() + } else { + block_num_cons + } + }; + let block_num_vars = 8 * num_vars; let block_inst = Instance::new( num_instances, block_max_num_cons, - block_num_cons, + num_cons_padded_per_block, block_num_vars, - vec![block_num_vars; num_instances], + num_vars_padded_per_block.into_iter().map(|i| 8 * i).collect(), &A_list, &B_list, &C_list, @@ -1058,7 +1109,7 @@ impl Instance { let pairwise_check_inst = Instance::new( 3, pairwise_check_max_num_cons, - pairwise_check_num_cons, + vec![pairwise_check_max_num_cons; 3], 4 * pairwise_check_num_vars, vec![4 * pairwise_check_num_vars; 3], &A_list, diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 00943f77..0c30eb89 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -1957,9 +1957,9 @@ impl SNARK { let timer_eval = Timer::new("eval_sparse_polys"); // Per instance evaluation is unsorted - let inst_evals_list = block_inst_unsorted.inst.multi_evaluate(&rx, &ry); + let inst_evals_list = block_inst_unsorted.inst.multi_evaluate::(&rx, &ry); // RP-bound evaluation is sorted - let (_, inst_evals_bound_rp) = block_inst.inst.multi_evaluate_bound_rp(&rp, &rx, &ry); + let (_, inst_evals_bound_rp) = block_inst.inst.multi_evaluate_bound_rp::(&rp, &rx, &ry); timer_eval.stop(); for r in &inst_evals_list { @@ -1975,7 +1975,7 @@ impl SNARK { let r1cs_eval_proof_list = { let mut r1cs_eval_proof_list = Vec::new(); for i in 0..block_comm_list.len() { - let proof = R1CSEvalProof::prove( + let proof = R1CSEvalProof::prove::( &block_decomm_list[i].decomm, &rx, &ry, @@ -2076,11 +2076,11 @@ impl SNARK { let timer_eval = Timer::new("eval_sparse_polys"); // Per instance evaluation is unsorted - let inst_evals_list = pairwise_check_inst_unsorted.inst.multi_evaluate(&rx, &ry); + let inst_evals_list = pairwise_check_inst_unsorted.inst.multi_evaluate::(&rx, &ry); // RP-bound evaluation is sorted let (_, inst_evals_bound_rp) = pairwise_check_inst .inst - .multi_evaluate_bound_rp(&rp, &rx, &ry); + .multi_evaluate_bound_rp::(&rp, &rx, &ry); timer_eval.stop(); for r in &inst_evals_list { @@ -2093,7 +2093,7 @@ impl SNARK { let _: S = transcript.challenge_scalar(b"challenge_c2"); let r1cs_eval_proof = { - let proof = R1CSEvalProof::prove( + let proof = R1CSEvalProof::prove::( &pairwise_check_decomm.decomm, &rx, &ry, @@ -2210,7 +2210,7 @@ impl SNARK { timer_eval.stop(); let r1cs_eval_proof = { - let proof = R1CSEvalProof::prove( + let proof = R1CSEvalProof::prove::( &perm_root_decomm.decomm, &rx, &ry, @@ -2979,7 +2979,7 @@ impl SNARK { .collect(); for i in 0..block_comm_list.len() { - self.block_r1cs_eval_proof_list[i].verify( + self.block_r1cs_eval_proof_list[i].verify::( &block_comm_list[i].comm, &rx, &ry, @@ -3072,7 +3072,7 @@ impl SNARK { }) .collect(); - self.pairwise_check_r1cs_eval_proof.verify( + self.pairwise_check_r1cs_eval_proof.verify::( &pairwise_check_comm.comm, &rx, &ry, @@ -3159,7 +3159,7 @@ impl SNARK { S::append_field_to_transcript(tag, transcript, *val); } let [_, _, rx, ry] = perm_block_root_challenges; - self.perm_root_r1cs_eval_proof.verify( + self.perm_root_r1cs_eval_proof.verify::( &perm_root_comm.comm, &rx, &ry, diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index e158de82..0abf3f46 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -102,9 +102,6 @@ impl R1CSInstance { assert_eq!(B_list.len(), C_list.len()); // no errors, so create polynomials - let num_poly_vars_x = max_num_cons.log_2(); - let num_poly_vars_y = max_num_vars.log_2(); - let mut poly_A_list = Vec::new(); let mut poly_B_list = Vec::new(); let mut poly_C_list = Vec::new(); @@ -114,6 +111,9 @@ impl R1CSInstance { let mut mat_C = Vec::new(); for inst in 0..A_list.len() { + let num_poly_vars_x = num_cons[inst].log_2(); + let num_poly_vars_y = num_vars[inst].log_2(); + let A = &A_list[inst]; let B = &B_list[inst]; let C = &C_list[inst]; @@ -389,21 +389,45 @@ impl R1CSInstance { (evals_A_list, evals_B_list, evals_C_list) } - pub fn multi_evaluate(&self, rx: &[S], ry: &[S]) -> Vec { + // If IS_BLOCK, ry is truncated starting at the third entry + pub fn multi_evaluate(&self, rx: &[S], ry: &[S]) -> Vec { let mut eval_list = Vec::new(); // Evaluate each individual poly on [rx, ry] for i in 0..self.num_instances { + let num_cons = self.num_cons[i]; + let num_vars = self.num_vars[i]; + let rx_header = rx[..rx.len() - min(rx.len(), num_cons.log_2())].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let rx_short = &rx[rx.len() - min(rx.len(), num_cons.log_2())..]; + let ry_skip_len = ry.len() - min(ry.len(), num_vars.log_2()); + let (ry_header, ry_short) = { + if IS_BLOCK { + let ry_header = ry[3..3 + ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); + (ry_header, ry_short) + } else { + let ry_header = ry[0..ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = ry[ry_skip_len..].to_vec(); + (ry_header, ry_short) + } + }; + let evals = SparseMatPolynomial::multi_evaluate( &[&self.A_list[i], &self.B_list[i], &self.C_list[i]], - rx, - ry, + rx_short, + &ry_short, ); - eval_list.extend(evals.clone()); + eval_list.extend(evals.into_iter().map(|i| rx_header * ry_header * i)); } eval_list } - pub fn multi_evaluate_bound_rp( + pub fn multi_evaluate_bound_rp( &self, rp: &[S], rx: &[S], @@ -418,11 +442,35 @@ impl R1CSInstance { let mut eval_list = Vec::new(); // Evaluate each individual poly on [rx, ry] for i in 0..self.num_instances { + let num_cons = self.num_cons[i]; + let num_vars = self.num_vars[i]; + let rx_header = rx[..rx.len() - min(rx.len(), num_cons.log_2())].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let rx_short = &rx[rx.len() - min(rx.len(), num_cons.log_2())..]; + let ry_skip_len = ry.len() - min(ry.len(), num_vars.log_2()); + let (ry_header, ry_short) = { + if IS_BLOCK { + let ry_header = ry[3..3 + ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); + (ry_header, ry_short) + } else { + let ry_header = ry[0..ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = ry[ry_skip_len..].to_vec(); + (ry_header, ry_short) + } + }; + let evals = SparseMatPolynomial::multi_evaluate( &[&self.A_list[i], &self.B_list[i], &self.C_list[i]], - rx, - ry, + rx_short, + &ry_short, ); + let evals: Vec = evals.into_iter().map(|i| rx_header * ry_header * i).collect(); eval_list.extend(evals.clone()); a_evals.push(evals[0]); b_evals.push(evals[1]); @@ -449,16 +497,6 @@ impl R1CSInstance { (evals[0], evals[1], evals[2]) } - // Group all instances with the similar num_vars (round to the next power of four) together - // Output.0 records the label of instances included within each commitment - pub fn next_power_of_four(val: usize) -> usize { - let mut base = 1; - while base < val { - base *= 4; - } - return base; - } - pub fn multi_commit( &self, ) -> ( @@ -472,9 +510,11 @@ impl R1CSInstance { let mut max_num_cons_list: Vec = Vec::new(); let mut max_num_vars_list: Vec = Vec::new(); - // Group the instances based on number of variables, separated by orders of 2^256 + // Group the instances based on number of variables, which are already orders of 2^4 for i in 0..self.num_instances { - let var_len = Self::next_power_of_four(self.num_vars[i]); + println!("I: {}, NUM_CONS: {}, NUM_VARS: {}", i, self.num_cons[i], self.num_vars[i]); + + let var_len = self.num_vars[i]; // A_list, B_list, C_list if let Some(index) = vars_size.get(&var_len) { label_map[*index].push(3 * i); @@ -488,12 +528,8 @@ impl R1CSInstance { } else { let next_label = vars_size.len(); vars_size.insert(var_len, next_label); - label_map.push(vec![3 * i]); - sparse_polys_list.push(vec![&self.A_list[i]]); - label_map.push(vec![3 * i + 1]); - sparse_polys_list.push(vec![&self.B_list[i]]); - label_map.push(vec![3 * i + 2]); - sparse_polys_list.push(vec![&self.C_list[i]]); + label_map.push(vec![3 * i, 3 * i + 1, 3 * i + 2]); + sparse_polys_list.push(vec![&self.A_list[i], &self.B_list[i], &self.C_list[i]]); max_num_cons_list.push(self.num_cons[i]); max_num_vars_list.push(self.num_vars[i]); } @@ -553,7 +589,8 @@ pub struct R1CSEvalProof { } impl R1CSEvalProof { - pub fn prove( + // If is BLOCK, separate the first 3 entries of ry out (corresponding to the 5 segments of witnesses) + pub fn prove( decomm: &R1CSDecommitment, rx: &[S], // point at which the polynomial is evaluated ry: &[S], @@ -564,19 +601,36 @@ impl R1CSEvalProof { let timer = Timer::new("R1CSEvalProof::prove"); println!("RX_LEN: {}, RY_LEN: {}", rx.len(), ry.len()); println!("NUM_CONS: {}, NUM_VARS: {}", decomm.num_cons, decomm.num_vars); - let rx_header = rx[..rx.len() - min(rx.len(), decomm.num_cons.log_2())].iter().fold( + let rx_skip_len = rx.len() - min(rx.len(), decomm.num_cons.log_2()); + let rx_header = rx[..rx_skip_len].iter().fold( S::field_one(), |c, i| c * (S::field_one() - i.clone()) ); - let rx_short = &rx[rx.len() - min(rx.len(), decomm.num_cons.log_2())..]; + let rx_short = &rx[rx_skip_len..]; + let ry_skip_len = ry.len() - min(ry.len(), decomm.num_vars.log_2()); + let (ry_header, ry_short) = { + if IS_BLOCK { + let ry_header = ry[3..3 + ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); + (ry_header, ry_short) + } else { + let ry_header = ry[0..ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = ry[ry_skip_len..].to_vec(); + (ry_header, ry_short) + } + }; // let ry_short = &ry[..min(ry.len(), decomm.num_vars.log_2())]; let proof = - SparseMatPolyEvalProof::prove(&decomm.dense, rx_header, rx_short, ry, evals, transcript, random_tape); + SparseMatPolyEvalProof::prove(&decomm.dense, rx_header * ry_header, rx_short, &ry_short, evals, transcript, random_tape); timer.stop(); R1CSEvalProof { proof } } - pub fn verify( + pub fn verify( &self, comm: &R1CSCommitment, rx: &[S], // point at which the R1CS matrix polynomials are evaluated @@ -588,7 +642,22 @@ impl R1CSEvalProof { S::field_one(), |c, i| c * (S::field_one() - i.clone()) ); let rx_short = &rx[rx.len() - min(rx.len(), comm.num_cons.log_2())..]; - // let ry_short = &ry[..min(ry.len(), comm.num_vars.log_2())]; - self.proof.verify(&comm.comm, rx_header, rx_short, ry, evals, transcript) + let ry_skip_len = ry.len() - min(ry.len(), comm.num_vars.log_2()); + let (ry_header, ry_short) = { + if IS_BLOCK { + let ry_header = ry[3..3 + ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); + (ry_header, ry_short) + } else { + let ry_header = ry[0..ry_skip_len].iter().fold( + S::field_one(), |c, i| c * (S::field_one() - i.clone()) + ); + let ry_short = ry[ry_skip_len..].to_vec(); + (ry_header, ry_short) + } + }; + self.proof.verify(&comm.comm, rx_header * ry_header, rx_short, &ry_short, evals, transcript) } } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index 2cf16951..fd75da64 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -30,9 +30,9 @@ impl SparseMatEntry { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct SparseMatPolynomial { - num_vars_x: usize, - num_vars_y: usize, - M: Vec>, + pub num_vars_x: usize, + pub num_vars_y: usize, + pub M: Vec>, } pub struct Derefs { @@ -748,7 +748,7 @@ impl HashLayerProof { S::append_field_vector_to_transcript(b"claim_evals_ops", transcript, &evals_ops); let challenges_ops = transcript.challenge_vector(b"challenge_combine_n_to_one", evals_ops.len().log_2()); - + let mut poly_evals_ops = DensePolynomial::new(evals_ops); for i in (0..challenges_ops.len()).rev() { poly_evals_ops.bound_poly_var_bot(&challenges_ops[i]); From b614b85cbfdf1b9764c59a904d71416cbca67d07 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 12 Dec 2024 16:08:28 -0500 Subject: [PATCH 16/54] Correct r1csproof --- spartan_parallel/src/r1csproof.rs | 84 ++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 05a52d94..e2c1d7ce 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -13,12 +13,17 @@ use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::cmp::min; +use std::iter::zip; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { sc_proof_phase1: SumcheckInstanceProof, sc_proof_phase2: SumcheckInstanceProof, claims_phase2: (S, S, S), + // Need to commit vars for short and long witnesses separately + // The long version must exist, the short version might not + eval_vars_at_ry_list: Vec>, + eval_vars_at_ry: S, // proof_eval_vars_at_ry_list: Vec>, } @@ -255,8 +260,9 @@ impl R1CSProof { &poly_Cz.index(0, 0, 0, 0), ); - // prove the final step of sum-check #1 - let _taus_bound_rx = tau_claim; + S::append_field_to_transcript(b"Az_claim", transcript, *Az_claim); + S::append_field_to_transcript(b"Bz_claim", transcript, *Bz_claim); + S::append_field_to_transcript(b"Cz_claim", transcript, *Cz_claim); // Separate the result rx into rp, rq, and rx let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); @@ -376,7 +382,7 @@ impl R1CSProof { let mut Zr_list = Vec::new(); // List of evaluations separated by witness_secs let mut eval_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; - + let mut raw_eval_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; // Does not multiply ry_factor for i in 0..num_witness_secs { let w = witness_secs[i]; let wit_sec_num_instance = w.w_mat.len(); @@ -409,9 +415,8 @@ impl R1CSProof { } else { eval_vars_at_ry_list[i] .push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); - eval_vars_at_ry_list[i] - .push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); } + raw_eval_vars_at_ry_list[i].push(eval_vars_at_ry); } } @@ -434,13 +439,6 @@ impl R1CSProof { // So we need to multiply each entry by (1 - rq0)(1 - rq1) let mut eval_vars_comb_list = Vec::new(); for p in 0..num_instances { - let _wit_sec_p = |i: usize| { - if witness_secs[i].w_mat.len() == 1 { - 0 - } else { - p - } - }; let wit_sec_p = |i: usize| { if witness_secs[i].w_mat.len() == 1 { 0 @@ -490,7 +488,7 @@ impl R1CSProof { timer_polyeval.stop(); let poly_vars = DensePolynomial::new(eval_vars_comb_list); - let _eval_vars_at_ry = poly_vars.evaluate(&rp); + let eval_vars_at_ry = poly_vars.evaluate(&rp); timer_prove.stop(); @@ -499,6 +497,8 @@ impl R1CSProof { sc_proof_phase1, sc_proof_phase2, claims_phase2: (*Az_claim, *Bz_claim, *Cz_claim), + eval_vars_at_ry_list: raw_eval_vars_at_ry_list, + eval_vars_at_ry, // proof_eval_vars_at_ry_list, }, [rp, rq_rev, rx, [rw, ry].concat()], @@ -509,7 +509,7 @@ impl R1CSProof { &self, num_instances: usize, max_num_proofs: usize, - _num_proofs: &Vec, + num_proofs: &Vec, max_num_inputs: usize, // NUM_WITNESS_SECS @@ -525,7 +525,7 @@ impl R1CSProof { witness_secs: Vec<&VerifierWitnessSecInfo>, num_cons: usize, - _evals: &[S; 3], + evals: &[S; 3], transcript: &mut Transcript, ) -> Result<[Vec; 4], ProofVerifyError> { >::append_protocol_name( @@ -551,7 +551,7 @@ impl R1CSProof { let tau_q = transcript.challenge_vector(b"challenge_tau_q", num_rounds_q); let tau_x = transcript.challenge_vector(b"challenge_tau_x", num_rounds_x); - let (_, rx) = self.sc_proof_phase1.verify( + let (claim_post_phase_1, rx) = self.sc_proof_phase1.verify( S::field_zero(), num_rounds_x + num_rounds_q + num_rounds_p, 3, @@ -563,7 +563,7 @@ impl R1CSProof { let (rq_rev, rp_round1) = rq_rev.split_at(num_rounds_q); let rx: Vec = rx_rev.iter().copied().rev().collect(); let rq_rev = rq_rev.to_vec(); - let _rq: Vec = rq_rev.iter().copied().rev().collect(); + let rq: Vec = rq_rev.iter().copied().rev().collect(); let rp_round1 = rp_round1.to_vec(); // taus_bound_rx is really taus_bound_rx_rq_rp @@ -578,7 +578,16 @@ impl R1CSProof { let taus_bound_rx: S = (0..rx_rev.len()) .map(|i| rx_rev[i] * tau_x[i] + (S::field_one() - rx_rev[i]) * (S::field_one() - tau_x[i])) .product(); - let _taus_bound_rx = taus_bound_rp * taus_bound_rq * taus_bound_rx; + let taus_bound_rx = taus_bound_rp * taus_bound_rq * taus_bound_rx; + + // perform the intermediate sum-check test with claimed Az, Bz, and Cz + let (Az_claim, Bz_claim, Cz_claim) = self.claims_phase2; + S::append_field_to_transcript(b"Az_claim", transcript, Az_claim); + S::append_field_to_transcript(b"Bz_claim", transcript, Bz_claim); + S::append_field_to_transcript(b"Cz_claim", transcript, Cz_claim); + + // debug_zk + // assert_eq!(taus_bound_rx * (Az_claim * Bz_claim - Cz_claim), claim_post_phase_1); // derive three public challenges and then derive a joint claim let r_A: S = transcript.challenge_scalar(b"challenge_Az"); @@ -589,7 +598,7 @@ impl R1CSProof { let claim_phase2 = r_A * Az_claim + r_B * Bz_claim + r_C * Cz_claim; // verify the joint claim with a sum-check protocol - let (_, ry) = self.sc_proof_phase2.verify( + let (claim_post_phase_2, ry) = self.sc_proof_phase2.verify( claim_phase2, num_rounds_y + num_rounds_w + num_rounds_p, 3, @@ -604,7 +613,7 @@ impl R1CSProof { let ry: Vec = ry_rev.iter().copied().rev().collect(); // An Eq function to match p with rp - let _p_rp_poly_bound_ry: S = (0..rp.len()) + let p_rp_poly_bound_ry: S = (0..rp.len()) .map(|i| rp[i] * rp_round1[i] + (S::field_one() - rp[i]) * (S::field_one() - rp_round1[i])) .product(); @@ -621,13 +630,14 @@ impl R1CSProof { let timer_commit_opening = Timer::new("verify_sc_commitment_opening"); let mut num_proofs_list = Vec::new(); let mut num_inputs_list = Vec::new(); - + let mut eval_Zr_list = Vec::new(); for i in 0..num_witness_secs { let w = witness_secs[i]; let wit_sec_num_instance = w.num_proofs.len(); for p in 0..wit_sec_num_instance { num_proofs_list.push(w.num_proofs[p]); num_inputs_list.push(w.num_inputs[p]); + eval_Zr_list.push(self.eval_vars_at_ry_list[i][p]); } } @@ -643,15 +653,22 @@ impl R1CSProof { */ // Then on rp + let mut expected_eval_vars_list = Vec::new(); for p in 0..num_instances { - let _wit_sec_p = |i: usize| { + let wit_sec_p = |i: usize| { if witness_secs[i].num_proofs.len() == 1 { 0 } else { p } }; - let _prefix_list = match num_witness_secs.next_power_of_two() { + let c = |i: usize| + if witness_secs[i].num_inputs[wit_sec_p(i)] >= max_num_inputs { + self.eval_vars_at_ry_list[i][wit_sec_p(i)] + } else { + self.eval_vars_at_ry_list[i][wit_sec_p(i)] * ry_factors[num_rounds_y - witness_secs[i].num_inputs[wit_sec_p(i)].log_2()] + }; + let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { vec![S::field_one()] } @@ -682,10 +699,31 @@ impl R1CSProof { panic!("Unsupported num_witness_secs: {}", num_witness_secs); } }; + let mut eval_vars_comb = (1..num_witness_secs).fold(prefix_list[0] * c(0), |s, i| s + prefix_list[i] * c(i)); + for q in 0..(num_rounds_q - num_proofs[p].log_2()) { + eval_vars_comb *= S::field_one() - rq[q]; + } + expected_eval_vars_list.push(eval_vars_comb); } + let EQ_p = &EqPolynomial::new(rp.clone()).evals()[..num_instances]; + let expected_eval_vars_at_ry = zip(EQ_p, expected_eval_vars_list).fold(S::field_zero(), |s, (a, b)| s + *a * b); + + assert_eq!(expected_eval_vars_at_ry, self.eval_vars_at_ry); + timer_commit_opening.stop(); + // compute commitment to eval_Z_at_ry = (ONE - ry[0]) * self.eval_vars_at_ry + ry[0] * poly_input_eval + let eval_Z_at_ry = &self.eval_vars_at_ry; + + // perform the final check in the second sum-check protocol + let [eval_A_r, eval_B_r, eval_C_r] = evals; + let expected_claim_post_phase2 = + (r_A * *eval_A_r + r_B * *eval_B_r + r_C * *eval_C_r) * *eval_Z_at_ry * p_rp_poly_bound_ry; + + // verify proof that expected_claim_post_phase2 == claim_post_phase2 + assert_eq!(claim_post_phase_2, expected_claim_post_phase2); + Ok([rp, rq_rev, rx, [rw, ry].concat()]) } } From edb32b6af353af2f948b653a8800a856dcfcf339 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 12 Dec 2024 16:08:40 -0500 Subject: [PATCH 17/54] fmt --- spartan_parallel/src/r1csproof.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index e2c1d7ce..a55a47dd 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -662,12 +662,14 @@ impl R1CSProof { p } }; - let c = |i: usize| + let c = |i: usize| { if witness_secs[i].num_inputs[wit_sec_p(i)] >= max_num_inputs { self.eval_vars_at_ry_list[i][wit_sec_p(i)] } else { - self.eval_vars_at_ry_list[i][wit_sec_p(i)] * ry_factors[num_rounds_y - witness_secs[i].num_inputs[wit_sec_p(i)].log_2()] - }; + self.eval_vars_at_ry_list[i][wit_sec_p(i)] + * ry_factors[num_rounds_y - witness_secs[i].num_inputs[wit_sec_p(i)].log_2()] + } + }; let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { vec![S::field_one()] @@ -699,7 +701,8 @@ impl R1CSProof { panic!("Unsupported num_witness_secs: {}", num_witness_secs); } }; - let mut eval_vars_comb = (1..num_witness_secs).fold(prefix_list[0] * c(0), |s, i| s + prefix_list[i] * c(i)); + let mut eval_vars_comb = + (1..num_witness_secs).fold(prefix_list[0] * c(0), |s, i| s + prefix_list[i] * c(i)); for q in 0..(num_rounds_q - num_proofs[p].log_2()) { eval_vars_comb *= S::field_one() - rq[q]; } @@ -707,8 +710,9 @@ impl R1CSProof { } let EQ_p = &EqPolynomial::new(rp.clone()).evals()[..num_instances]; - let expected_eval_vars_at_ry = zip(EQ_p, expected_eval_vars_list).fold(S::field_zero(), |s, (a, b)| s + *a * b); - + let expected_eval_vars_at_ry = + zip(EQ_p, expected_eval_vars_list).fold(S::field_zero(), |s, (a, b)| s + *a * b); + assert_eq!(expected_eval_vars_at_ry, self.eval_vars_at_ry); timer_commit_opening.stop(); From 2cfaf7c4a4d623b0bc4c7e940099973ae678a78a Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 13 Dec 2024 13:01:12 -0500 Subject: [PATCH 18/54] Remove debug messages --- spartan_parallel/src/r1csinstance.rs | 2 -- spartan_parallel/src/sparse_mlpoly.rs | 8 -------- zok_tests/benchmarks/poseidon_test/poseidon_const.zok | 2 +- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 0abf3f46..8ab16cbe 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -599,8 +599,6 @@ impl R1CSEvalProof { random_tape: &mut RandomTape, ) -> R1CSEvalProof { let timer = Timer::new("R1CSEvalProof::prove"); - println!("RX_LEN: {}, RY_LEN: {}", rx.len(), ry.len()); - println!("NUM_CONS: {}, NUM_VARS: {}", decomm.num_cons, decomm.num_vars); let rx_skip_len = rx.len() - min(rx.len(), decomm.num_cons.log_2()); let rx_header = rx[..rx_skip_len].iter().fold( S::field_one(), |c, i| c * (S::field_one() - i.clone()) diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index fd75da64..36374207 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -1154,10 +1154,6 @@ impl ProductLayerProof { eval: &[S], transcript: &mut Transcript, ) -> Result<(Vec, Vec, Vec, Vec, Vec), ProofVerifyError> { - let proof_mem_len = bincode::serialize(&self.proof_mem).unwrap().len(); - let proof_ops_len = bincode::serialize(&self.proof_ops).unwrap().len(); - println!("PROOF_MEM: {}, PROOF_OPS: {}", proof_mem_len, proof_ops_len); - >::append_protocol_name( transcript, ProductLayerProof::::protocol_name(), @@ -1391,10 +1387,6 @@ impl SparseMatPolyEvalProof { transcript: &mut Transcript, random_tape: &mut RandomTape, ) -> SparseMatPolyEvalProof { - println!("NNZ_LEN: {}", dense.val[0].len()); - println!("RX_LEN: {}", rx.len()); - println!("RY_LEN: {}", ry.len()); - println!("EVALS_LEN: {}", evals.len()); >::append_protocol_name( transcript, SparseMatPolyEvalProof::::protocol_name(), diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index 8cdc6cc0..ac6bfc99 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 131072 +const u32 REPETITION = 10000 From a84622210bbbaafecb6e8ac1dc018c9f146deceb Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 16 Dec 2024 15:06:13 -0500 Subject: [PATCH 19/54] Add multicore for vec mult --- circ_blocks/Cargo.toml | 5 +--- circ_blocks/examples/zxc.rs | 8 ++--- spartan_parallel/Cargo.toml | 5 ++-- spartan_parallel/src/instance.rs | 2 +- spartan_parallel/src/lib.rs | 2 +- spartan_parallel/src/r1csinstance.rs | 30 ++++++++++++++++++- spartan_parallel/src/r1csproof.rs | 2 +- spartan_parallel/src/scalar/fp.rs | 3 ++ spartan_parallel/src/scalar/fp2.rs | 3 ++ .../poseidon_test/poseidon_const.zok | 2 +- 10 files changed, 46 insertions(+), 16 deletions(-) diff --git a/circ_blocks/Cargo.toml b/circ_blocks/Cargo.toml index 7a97c52a..05aaf05a 100644 --- a/circ_blocks/Cargo.toml +++ b/circ_blocks/Cargo.toml @@ -51,10 +51,7 @@ from-pest = { version = "0.3", optional = true } itertools = "0.10" petgraph = { version = "0.6", optional = true } spartan = { version = "0.8", default-features = false, optional = true } -spartan_parallel = { path = "../spartan_parallel", default-features = false, features = [ - "multicore", - "profile", -] } +spartan_parallel = { path = "../spartan_parallel", default-features = false, features = ["profile"] } merlin = { version = "3.0.0" } curve25519-dalek = { version = "4", features = ["serde"], optional = true } # TODO: kill diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index 880462ac..bdee98ff 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -357,7 +357,7 @@ impl CompileTimeKnowledge { } #[derive(Serialize, Deserialize)] -struct RunTimeKnowledge { +struct RunTimeKnowledge { block_max_num_proofs: usize, block_num_proofs: Vec, consis_num_proofs: usize, @@ -382,7 +382,7 @@ struct RunTimeKnowledge { output_exec_num: usize, } -impl RunTimeKnowledge { +impl RunTimeKnowledge { fn serialize_to_file(&self, benchmark_name: String, max_file_size: usize) -> std::io::Result<()> { let content = bincode::serialize(&self).unwrap(); println!("RTK SIZE: {}", content.len()); @@ -842,7 +842,7 @@ fn get_compile_time_knowledge( // -- // Generate witnesses and others // -- -fn get_run_time_knowledge( +fn get_run_time_knowledge( path: PathBuf, options: &Options, entry_regs: Vec, @@ -1277,7 +1277,7 @@ fn get_run_time_knowledge( } } -fn run_spartan_proof( +fn run_spartan_proof( ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge, ) { diff --git a/spartan_parallel/Cargo.toml b/spartan_parallel/Cargo.toml index 2472d2d5..daa0d128 100644 --- a/spartan_parallel/Cargo.toml +++ b/spartan_parallel/Cargo.toml @@ -20,7 +20,7 @@ rand = { version = "0.8", features = ["getrandom"], default-features = false } digest = { version = "0.10", default-features = false } sha3 = { version = "0.10", default-features = false } byteorder = { version = "1", default-features = false } -rayon = { version = "1", optional = true } +rayon = { version = "1" } serde = { version = "1", features = ["derive"], default-features = false } bincode = { version = "1", default-features = false } subtle = { version = "2", features = ["i128"], default-features = false } @@ -52,9 +52,8 @@ std = [ "itertools/use_std", "flate2/rust_backend", ] -multicore = ["rayon"] profile = ["colored"] [[example]] name = "interface" -required-features = ["multicore", "profile"] +required-features = ["profile"] diff --git a/spartan_parallel/src/instance.rs b/spartan_parallel/src/instance.rs index 9057dc81..d6fa2ee7 100644 --- a/spartan_parallel/src/instance.rs +++ b/spartan_parallel/src/instance.rs @@ -26,7 +26,7 @@ pub struct Instance { pub digest: Vec, } -impl Instance { +impl Instance { /// Constructs a new `Instance` and an associated satisfying assignment pub fn new( num_instances: usize, diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 0c30eb89..62cd5400 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -643,7 +643,7 @@ impl PartialEq for InstanceSortHelper { } impl Eq for InstanceSortHelper {} -impl SNARK { +impl SNARK { fn protocol_name() -> &'static [u8] { b"Spartan SNARK proof" } diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 8ab16cbe..ddea1def 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -1,3 +1,5 @@ +use rayon::prelude::*; + use std::cmp::{max, min}; use std::collections::HashMap; @@ -65,7 +67,7 @@ impl R1CSCommitment { } } -impl R1CSInstance { +impl R1CSInstance { pub fn new( num_instances: usize, max_num_cons: usize, @@ -243,6 +245,31 @@ impl R1CSInstance { Az.push(Vec::new()); Bz.push(Vec::new()); Cz.push(Vec::new()); + Az[p] = (0..num_proofs[p]).into_par_iter().map(|q| + vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( + num_cons[p_inst].clone(), + max_num_inputs, + num_inputs[p], + &z_list[q], + )] + ).collect(); + Bz[p] = (0..num_proofs[p]).into_par_iter().map(|q| + vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( + num_cons[p_inst].clone(), + max_num_inputs, + num_inputs[p], + &z_list[q], + )] + ).collect(); + Cz[p] = (0..num_proofs[p]).into_par_iter().map(|q| + vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( + num_cons[p_inst].clone(), + max_num_inputs, + num_inputs[p], + &z_list[q], + )] + ).collect(); + /* for q in 0..num_proofs[p] { let z = &z_list[q]; @@ -265,6 +292,7 @@ impl R1CSInstance { z, )]); } + */ } ( diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index c0a07f5b..35bb5e6e 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -26,7 +26,7 @@ pub struct R1CSProof { // proof_eval_vars_at_ry_list: Vec>, } -impl R1CSProof { +impl R1CSProof { fn prove_phase_one( num_rounds: usize, num_rounds_x_max: usize, diff --git a/spartan_parallel/src/scalar/fp.rs b/spartan_parallel/src/scalar/fp.rs index d50b5358..f5a7b33e 100644 --- a/spartan_parallel/src/scalar/fp.rs +++ b/spartan_parallel/src/scalar/fp.rs @@ -15,6 +15,9 @@ use zeroize::Zeroize; #[derive(Clone, Copy, Eq, Serialize, Deserialize, Hash, Debug)] pub struct Scalar(Goldilocks); +unsafe impl Send for Scalar {} +unsafe impl Sync for Scalar {} + impl SpartanExtensionField for Scalar { type InnerType = Goldilocks; type BaseField = Goldilocks; diff --git a/spartan_parallel/src/scalar/fp2.rs b/spartan_parallel/src/scalar/fp2.rs index 1787b49c..0410e4af 100644 --- a/spartan_parallel/src/scalar/fp2.rs +++ b/spartan_parallel/src/scalar/fp2.rs @@ -14,6 +14,9 @@ use zeroize::Zeroize; #[derive(Clone, Copy, Eq, Serialize, Deserialize, Hash, Debug)] pub struct ScalarExt2(GoldilocksExt2); +unsafe impl Send for ScalarExt2 {} +unsafe impl Sync for ScalarExt2 {} + impl From for ScalarExt2 { fn from(g: GoldilocksExt2) -> Self { Self(g) diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index ac6bfc99..e7ae59fb 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 10000 +const u32 REPETITION = 1000 From dbfafe5952b56488b7bceb550ff0f42a23d3adf8 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 16 Dec 2024 16:27:12 -0500 Subject: [PATCH 20/54] Update setup --- setup.sh | 2 ++ spartan_parallel/src/custom_dense_mlpoly.rs | 4 ++-- zok_tests/benchmarks/poseidon_test/poseidon_const.zok | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/setup.sh b/setup.sh index 18ab66f8..25a743cc 100755 --- a/setup.sh +++ b/setup.sh @@ -4,4 +4,6 @@ set -euxo pipefail ( cd circ_blocks cargo build --release --example zxc --no-default-features --features r1cs,smt,zok + cd ../spartan_parallel + RUSTFLAGS="-C target_cpu=native" cargo build --release --features profile --example interface ) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 18489e98..e04185e4 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -41,7 +41,7 @@ pub fn rev_bits(q: usize, max_num_proofs: usize) -> usize { impl DensePolynomialPqx { // Assume z_mat is of form (p, q_rev, x), construct DensePoly pub fn new( - z_mat: &Vec>>>, + z_mat: Vec>>>, num_proofs: Vec, max_num_proofs: usize, num_inputs: Vec, @@ -56,7 +56,7 @@ impl DensePolynomialPqx { num_witness_secs, num_inputs, max_num_inputs, - Z: z_mat.clone(), + Z: z_mat, } } diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index e7ae59fb..ac6bfc99 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 1000 +const u32 REPETITION = 10000 From f0decf36bf3b162f85ceb1217c5be2c49af7a562 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 16 Dec 2024 16:28:37 -0500 Subject: [PATCH 21/54] Add parallelism --- circ_blocks/Cargo.toml | 1 - spartan_parallel/Cargo.toml | 5 ++-- spartan_parallel/src/r1csinstance.rs | 28 +++++++++++-------- spartan_parallel/src/scalar/mod.rs | 6 ++-- .../poseidon_test/poseidon_const.zok | 2 +- 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/circ_blocks/Cargo.toml b/circ_blocks/Cargo.toml index 7a97c52a..7a6e7d44 100644 --- a/circ_blocks/Cargo.toml +++ b/circ_blocks/Cargo.toml @@ -52,7 +52,6 @@ itertools = "0.10" petgraph = { version = "0.6", optional = true } spartan = { version = "0.8", default-features = false, optional = true } spartan_parallel = { path = "../spartan_parallel", default-features = false, features = [ - "multicore", "profile", ] } merlin = { version = "3.0.0" } diff --git a/spartan_parallel/Cargo.toml b/spartan_parallel/Cargo.toml index 2472d2d5..daa0d128 100644 --- a/spartan_parallel/Cargo.toml +++ b/spartan_parallel/Cargo.toml @@ -20,7 +20,7 @@ rand = { version = "0.8", features = ["getrandom"], default-features = false } digest = { version = "0.10", default-features = false } sha3 = { version = "0.10", default-features = false } byteorder = { version = "1", default-features = false } -rayon = { version = "1", optional = true } +rayon = { version = "1" } serde = { version = "1", features = ["derive"], default-features = false } bincode = { version = "1", default-features = false } subtle = { version = "2", features = ["i128"], default-features = false } @@ -52,9 +52,8 @@ std = [ "itertools/use_std", "flate2/rust_backend", ] -multicore = ["rayon"] profile = ["colored"] [[example]] name = "interface" -required-features = ["multicore", "profile"] +required-features = ["profile"] diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 8ab16cbe..08365b50 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -18,6 +18,7 @@ use flate2::{write::ZlibEncoder, Compression}; use std::iter::zip; use merlin::Transcript; use serde::{Deserialize, Serialize}; +use rayon::prelude::*; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct R1CSInstance { @@ -243,28 +244,31 @@ impl R1CSInstance { Az.push(Vec::new()); Bz.push(Vec::new()); Cz.push(Vec::new()); - for q in 0..num_proofs[p] { - let z = &z_list[q]; - Az[p].push(vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( + Az[p] = (0..num_proofs[p]).into_par_iter().map(|q| + vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], - z, - )]); - Bz[p].push(vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( + &z_list[q], + )] + ).collect(); + Bz[p] = (0..num_proofs[p]).into_par_iter().map(|q| + vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], - z, - )]); - Cz[p].push(vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( + &z_list[q], + )] + ).collect(); + Cz[p] = (0..num_proofs[p]).into_par_iter().map(|q| + vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], - z, - )]); - } + &z_list[q], + )] + ).collect(); } ( diff --git a/spartan_parallel/src/scalar/mod.rs b/spartan_parallel/src/scalar/mod.rs index 138a2259..110a4440 100644 --- a/spartan_parallel/src/scalar/mod.rs +++ b/spartan_parallel/src/scalar/mod.rs @@ -47,12 +47,14 @@ pub trait SpartanExtensionField: + fmt::Debug + Mul + MulAssign + + Send + + Sync { /// Inner Goldilocks extension field - type InnerType: ExtensionField + Field; + type InnerType: ExtensionField + Field + Send + Sync; /// Basefield for conserving computational resources - type BaseField: Field; + type BaseField: Field + Send + Sync; /// Return inner Goldilocks field element fn inner(&self) -> &Self::InnerType; diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index ac6bfc99..e7ae59fb 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 10000 +const u32 REPETITION = 1000 From 51968301896b95fe230b1efa8eaaa2b79d894254 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 16 Dec 2024 17:06:21 -0500 Subject: [PATCH 22/54] Add parallelism --- circ_blocks/examples/zxc.rs | 44 +-- spartan_parallel/examples/interface.rs | 24 +- spartan_parallel/src/instance.rs | 58 +++- spartan_parallel/src/lib.rs | 204 +++++++++---- spartan_parallel/src/r1csinstance.rs | 289 +++++++++++------- spartan_parallel/src/sparse_mlpoly.rs | 24 +- .../poseidon_test/poseidon_const.zok | 2 +- 7 files changed, 440 insertions(+), 205 deletions(-) diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index bdee98ff..af6ed5b9 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -239,7 +239,11 @@ struct CompileTimeKnowledge { } impl CompileTimeKnowledge { - fn serialize_to_file(&self, benchmark_name: String, max_file_size: usize) -> std::io::Result<()> { + fn serialize_to_file( + &self, + benchmark_name: String, + max_file_size: usize, + ) -> std::io::Result<()> { let content = bincode::serialize(&self).unwrap(); println!("CTK SIZE: {}", content.len()); for i in 0..content.len().div_ceil(max_file_size) { @@ -383,7 +387,11 @@ struct RunTimeKnowledge { } impl RunTimeKnowledge { - fn serialize_to_file(&self, benchmark_name: String, max_file_size: usize) -> std::io::Result<()> { + fn serialize_to_file( + &self, + benchmark_name: String, + max_file_size: usize, + ) -> std::io::Result<()> { let content = bincode::serialize(&self).unwrap(); println!("RTK SIZE: {}", content.len()); for i in 0..content.len().div_ceil(max_file_size) { @@ -1311,18 +1319,17 @@ fn run_spartan_proof( // block_inst is used by sumcheck. Every block has the same number of variables let (block_num_vars, block_num_cons, block_num_non_zero_entries, mut block_inst) = Instance::gen_block_inst::( - block_num_instances_bound, - num_vars, - &ctk.args, - num_inputs_unpadded, - &block_num_phy_ops, - &block_num_vir_ops, - &ctk.num_vars_per_block, - &rtk.block_num_proofs, + block_num_instances_bound, + num_vars, + &ctk.args, + num_inputs_unpadded, + &block_num_phy_ops, + &block_num_vir_ops, + &ctk.num_vars_per_block, + &rtk.block_num_proofs, ); // block_inst is used by commitment. Every block has different number of variables - let (_, _, _, block_inst_for_commit) = - Instance::::gen_block_inst::( + let (_, _, _, block_inst_for_commit) = Instance::::gen_block_inst::( block_num_instances_bound, num_vars, &ctk.args, @@ -1331,7 +1338,7 @@ fn run_spartan_proof( &block_num_vir_ops, &ctk.num_vars_per_block, &rtk.block_num_proofs, - ); + ); println!("Finished Block"); // Pairwise INSTANCES @@ -1368,7 +1375,8 @@ fn run_spartan_proof( println!("Comitting Circuits..."); // block_comm_map records the sparse_polys committed in each commitment // Note that A, B, C are committed separately, so sparse_poly[3*i+2] corresponds to poly C of instance i - let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst_for_commit); + let (block_comm_map, block_comm_list, block_decomm_list) = + SNARK::multi_encode(&block_inst_for_commit); println!("Finished Block"); let (pairwise_check_comm, pairwise_check_decomm) = SNARK::encode(&pairwise_check_inst); println!("Finished Pairwise"); @@ -1612,12 +1620,14 @@ fn main() { ctk.write_to_file(benchmark_name.to_string()).unwrap(); rtk.write_to_file(benchmark_name.to_string()).unwrap(); } - + // -- // Write CTK, RTK to file // -- - ctk.serialize_to_file(benchmark_name.to_string(), MAX_FILE_SIZE).unwrap(); - rtk.serialize_to_file(benchmark_name.to_string(), MAX_FILE_SIZE).unwrap(); + ctk.serialize_to_file(benchmark_name.to_string(), MAX_FILE_SIZE) + .unwrap(); + rtk.serialize_to_file(benchmark_name.to_string(), MAX_FILE_SIZE) + .unwrap(); if INLINE_SPARTAN_PROOF { run_spartan_proof(ctk, rtk); } diff --git a/spartan_parallel/examples/interface.rs b/spartan_parallel/examples/interface.rs index 44ee6e51..c27dc47a 100644 --- a/spartan_parallel/examples/interface.rs +++ b/spartan_parallel/examples/interface.rs @@ -148,17 +148,16 @@ fn main() { &rtk.block_num_proofs, ); // block_inst is used by commitment. Every block has different number of variables - let (_, _, _, block_inst_for_commit) = - Instance::::gen_block_inst::( - block_num_instances_bound, - num_vars, - &ctk.args, - num_inputs_unpadded, - &block_num_phy_ops, - &block_num_vir_ops, - &ctk.num_vars_per_block, - &rtk.block_num_proofs, - ); + let (_, _, _, block_inst_for_commit) = Instance::::gen_block_inst::( + block_num_instances_bound, + num_vars, + &ctk.args, + num_inputs_unpadded, + &block_num_phy_ops, + &block_num_vir_ops, + &ctk.num_vars_per_block, + &rtk.block_num_proofs, + ); println!("Finished Block"); // Pairwise INSTANCES @@ -198,7 +197,8 @@ fn main() { println!("Comitting Circuits..."); // block_comm_map records the sparse_polys committed in each commitment // Note that A, B, C are committed separately, so sparse_poly[3*i+2] corresponds to poly C of instance i - let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst_for_commit); + let (block_comm_map, block_comm_list, block_decomm_list) = + SNARK::multi_encode(&block_inst_for_commit); println!("Finished Block"); let (pairwise_check_comm, pairwise_check_decomm) = SNARK::encode(&pairwise_check_inst); println!("Finished Pairwise"); diff --git a/spartan_parallel/src/instance.rs b/spartan_parallel/src/instance.rs index d6fa2ee7..879d79e0 100644 --- a/spartan_parallel/src/instance.rs +++ b/spartan_parallel/src/instance.rs @@ -82,7 +82,12 @@ impl Instance { } } - (max_num_vars_padded, num_vars_padded, max_num_cons_padded, num_cons_padded) + ( + max_num_vars_padded, + num_vars_padded, + max_num_cons_padded, + num_cons_padded, + ) }; let bytes_to_scalar = @@ -266,7 +271,7 @@ impl Instance { /// - VMR3 = r^3 * VT /// - VMC = (1 or VMC[i-1]) * (tau - VA - VMR1 - VMR2 - VMR3) /// The final product is stored in X = MC[NV - 1] - /// + /// /// If in COMMIT_MODE, commit instance by num_vars_per_block, rounded to the nearest power of four pub fn gen_block_inst( num_instances: usize, @@ -301,7 +306,15 @@ impl Instance { max_size_per_group.insert(next_group_size(*num_vars), num_vars.next_power_of_two()); } } - num_vars_per_block.iter().map(|i| max_size_per_group.get(&next_group_size(*i)).unwrap().clone()).collect() + num_vars_per_block + .iter() + .map(|i| { + max_size_per_group + .get(&next_group_size(*i)) + .unwrap() + .clone() + }) + .collect() } else { vec![num_vars; num_instances] }; @@ -346,19 +359,26 @@ impl Instance { 2 * num_vars_padded_per_block[b] + 2 + i } }; - let V_output_dot_prod = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 + (num_inputs_unpadded - 1) + i; + let V_output_dot_prod = + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 + (num_inputs_unpadded - 1) + i; // in BLOCK_W2 / PHY_W2 - let V_PMR = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i; - let V_PMC = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i + 1; + let V_PMR = + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i; + let V_PMC = + |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i + 1; // in BLOCK_W2 / VIR_W2 - let V_VMR1 = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i; - let V_VMR2 = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 1; - let V_VMR3 = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 2; - let V_VMC = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 3; + let V_VMR1 = |b: usize, i: usize| { + 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + }; + let V_VMR2 = |b: usize, i: usize| { + 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 1 + }; + let V_VMR3 = |b: usize, i: usize| { + 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 2 + }; + let V_VMC = |b: usize, i: usize| { + 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 3 + }; // in BLOCK_W3 let V_v = |b: usize| 3 * num_vars_padded_per_block[b]; let V_x = |b: usize| 3 * num_vars_padded_per_block[b] + 1; @@ -724,7 +744,10 @@ impl Instance { max_cons_per_group.insert(num_vars_padded_per_block[i], block_num_cons[i]); } } - num_vars_padded_per_block.iter().map(|i| max_cons_per_group.get(i).unwrap().clone()).collect() + num_vars_padded_per_block + .iter() + .map(|i| max_cons_per_group.get(i).unwrap().clone()) + .collect() } else { block_num_cons } @@ -736,7 +759,10 @@ impl Instance { block_max_num_cons, num_cons_padded_per_block, block_num_vars, - num_vars_padded_per_block.into_iter().map(|i| 8 * i).collect(), + num_vars_padded_per_block + .into_iter() + .map(|i| 8 * i) + .collect(), &A_list, &B_list, &C_list, diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index d35510c5..04ab7040 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -605,7 +605,6 @@ pub struct SNARK { perm_root_r1cs_sat_proof: R1CSProof, perm_root_inst_evals: [S; 3], perm_root_r1cs_eval_proof: R1CSEvalProof, - // Product proof for permutation // perm_poly_poly_list: Vec, // proof_eval_perm_poly_prod_list: Vec>, @@ -658,52 +657,79 @@ impl SNARK { + bincode::serialize(&self.addr_comm_vir_mems).unwrap().len() + bincode::serialize(&self.addr_comm_vir_mems_shifted).unwrap().len() + bincode::serialize(&self.addr_comm_ts_bits).unwrap().len() - + + bincode::serialize(&self.perm_exec_comm_w2_list).unwrap().len() + bincode::serialize(&self.perm_exec_comm_w3_list).unwrap().len() + bincode::serialize(&self.perm_exec_comm_w3_shifted).unwrap().len() - + + bincode::serialize(&self.block_comm_w2_list).unwrap().len() + bincode::serialize(&self.block_comm_w3_list).unwrap().len() + bincode::serialize(&self.block_comm_w3_list_shifted).unwrap().len() - + + bincode::serialize(&self.init_phy_mem_comm_w2).unwrap().len() + bincode::serialize(&self.init_phy_mem_comm_w3).unwrap().len() + bincode::serialize(&self.init_phy_mem_comm_w3_shifted).unwrap().len() - + + bincode::serialize(&self.init_vir_mem_comm_w2).unwrap().len() + bincode::serialize(&self.init_vir_mem_comm_w3).unwrap().len() + bincode::serialize(&self.init_vir_mem_comm_w3_shifted).unwrap().len() - + + bincode::serialize(&self.phy_mem_addr_comm_w2).unwrap().len() + bincode::serialize(&self.phy_mem_addr_comm_w3).unwrap().len() + bincode::serialize(&self.phy_mem_addr_comm_w3_shifted).unwrap().len() - + + bincode::serialize(&self.vir_mem_addr_comm_w2).unwrap().len() + bincode::serialize(&self.vir_mem_addr_comm_w3).unwrap().len() + bincode::serialize(&self.vir_mem_addr_comm_w3_shifted).unwrap().len(); */ - let dense_commit_size = 0; - - let block_proof_size = bincode::serialize(&self.block_r1cs_sat_proof).unwrap().len() - + bincode::serialize(&self.block_inst_evals_bound_rp).unwrap().len() - + bincode::serialize(&self.block_inst_evals_list).unwrap().len() - + bincode::serialize(&self.block_r1cs_eval_proof_list).unwrap().len(); - - let pairwise_proof_size = bincode::serialize(&self.pairwise_check_r1cs_sat_proof).unwrap().len() - + bincode::serialize(&self.pairwise_check_inst_evals_bound_rp).unwrap().len() - + bincode::serialize(&self.pairwise_check_inst_evals_list).unwrap().len() - + bincode::serialize(&self.pairwise_check_r1cs_eval_proof).unwrap().len(); - - let perm_proof_size = bincode::serialize(&self.perm_root_r1cs_sat_proof).unwrap().len() - + bincode::serialize(&self.perm_root_inst_evals).unwrap().len() - + bincode::serialize(&self.perm_root_r1cs_eval_proof).unwrap().len(); - // + bincode::serialize(&self.perm_poly_poly_list).unwrap().len() - // + bincode::serialize(&self.proof_eval_perm_poly_prod_list).unwrap().len(); + let dense_commit_size = 0; - // + bincode::serialize(&self.shift_proof).unwrap().len() + let block_proof_size = bincode::serialize(&self.block_r1cs_sat_proof) + .unwrap() + .len() + + bincode::serialize(&self.block_inst_evals_bound_rp) + .unwrap() + .len() + + bincode::serialize(&self.block_inst_evals_list) + .unwrap() + .len() + + bincode::serialize(&self.block_r1cs_eval_proof_list) + .unwrap() + .len(); + + let pairwise_proof_size = bincode::serialize(&self.pairwise_check_r1cs_sat_proof) + .unwrap() + .len() + + bincode::serialize(&self.pairwise_check_inst_evals_bound_rp) + .unwrap() + .len() + + bincode::serialize(&self.pairwise_check_inst_evals_list) + .unwrap() + .len() + + bincode::serialize(&self.pairwise_check_r1cs_eval_proof) + .unwrap() + .len(); + + let perm_proof_size = bincode::serialize(&self.perm_root_r1cs_sat_proof) + .unwrap() + .len() + + bincode::serialize(&self.perm_root_inst_evals) + .unwrap() + .len() + + bincode::serialize(&self.perm_root_r1cs_eval_proof) + .unwrap() + .len(); + // + bincode::serialize(&self.perm_poly_poly_list).unwrap().len() + // + bincode::serialize(&self.proof_eval_perm_poly_prod_list).unwrap().len(); + + // + bincode::serialize(&self.shift_proof).unwrap().len() // let io_proof_size = bincode::serialize(&self.io_proof).unwrap().len(); - (dense_commit_size, block_proof_size, pairwise_proof_size, perm_proof_size) + ( + dense_commit_size, + block_proof_size, + pairwise_proof_size, + perm_proof_size, + ) } /// A public computation to create a commitment to a list of R1CS instances @@ -1891,28 +1917,99 @@ impl SNARK { // Record total size of witnesses: let block_witness_sizes: Vec = [ - block_vars_prover.poly_w.iter().map(|i| i.len()).collect::>(), - block_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), - block_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), - block_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>() - ].concat(); + block_vars_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + block_w2_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + block_w3_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + block_w3_shifted_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + ] + .concat(); let exec_witness_sizes: Vec = [ - exec_inputs_prover.poly_w.iter().map(|i| i.len()).collect::>(), - perm_exec_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), - perm_exec_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), - perm_exec_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>(), - ].concat(); + exec_inputs_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + perm_exec_w2_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + perm_exec_w3_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + perm_exec_w3_shifted_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + ] + .concat(); let mem_witness_sizes: Vec = [ - addr_phy_mems_prover.poly_w.iter().map(|i| i.len()).collect::>(), - phy_mem_addr_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), - phy_mem_addr_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), - phy_mem_addr_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>(), - addr_vir_mems_prover.poly_w.iter().map(|i| i.len()).collect::>(), - addr_ts_bits_prover.poly_w.iter().map(|i| i.len()).collect::>(), - vir_mem_addr_w2_prover.poly_w.iter().map(|i| i.len()).collect::>(), - vir_mem_addr_w3_prover.poly_w.iter().map(|i| i.len()).collect::>(), - vir_mem_addr_w3_shifted_prover.poly_w.iter().map(|i| i.len()).collect::>(), - ].concat(); + addr_phy_mems_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + phy_mem_addr_w2_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + phy_mem_addr_w3_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + phy_mem_addr_w3_shifted_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + addr_vir_mems_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + addr_ts_bits_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + vir_mem_addr_w2_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + vir_mem_addr_w3_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + vir_mem_addr_w3_shifted_prover + .poly_w + .iter() + .map(|i| i.len()) + .collect::>(), + ] + .concat(); println!("BLOCK WITNESSES: {:?} Goldilocks", block_witness_sizes); println!("EXEC WITNESSES: {:?} Goldilocks", exec_witness_sizes); @@ -1958,7 +2055,9 @@ impl SNARK { // Per instance evaluation is unsorted let inst_evals_list = block_inst_unsorted.inst.multi_evaluate::(&rx, &ry); // RP-bound evaluation is sorted - let (_, inst_evals_bound_rp) = block_inst.inst.multi_evaluate_bound_rp::(&rp, &rx, &ry); + let (_, inst_evals_bound_rp) = block_inst + .inst + .multi_evaluate_bound_rp::(&rp, &rx, &ry); timer_eval.stop(); for r in &inst_evals_list { @@ -2074,7 +2173,9 @@ impl SNARK { let timer_eval = Timer::new("eval_sparse_polys"); // Per instance evaluation is unsorted - let inst_evals_list = pairwise_check_inst_unsorted.inst.multi_evaluate::(&rx, &ry); + let inst_evals_list = pairwise_check_inst_unsorted + .inst + .multi_evaluate::(&rx, &ry); // RP-bound evaluation is sorted let (_, inst_evals_bound_rp) = pairwise_check_inst .inst @@ -2398,7 +2499,6 @@ impl SNARK { perm_root_r1cs_sat_proof, perm_root_inst_evals, perm_root_r1cs_eval_proof, - // perm_poly_poly_list, // proof_eval_perm_poly_prod_list, @@ -2455,7 +2555,7 @@ impl SNARK { transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { let (_, block_size, pairwise_size, perm_size) = self.compute_size(); - let meta_size = + let meta_size = // usize 19 * std::mem::size_of::() + // Vec or Vec> @@ -2467,8 +2567,8 @@ impl SNARK { // Other vectors bincode::serialize(input).unwrap().len() + bincode::serialize(output).unwrap().len(); - // Everything else - // bincode::serialize(vars_gens).unwrap().len(); + // Everything else + // bincode::serialize(vars_gens).unwrap().len(); let timer_verify = Timer::new("SNARK::verify"); >::append_protocol_name( diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index fa93ab8b..bb92c4d0 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -17,10 +17,11 @@ use super::sparse_mlpoly::{ }; use super::timer::Timer; use flate2::{write::ZlibEncoder, Compression}; -use std::iter::zip; use merlin::Transcript; -use serde::{Deserialize, Serialize}; use rayon::prelude::*; +use serde::{Deserialize, Serialize}; +use std::iter::zip; +use std::sync::{Arc, Mutex}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct R1CSInstance { @@ -247,30 +248,39 @@ impl R1CSInstance { Bz.push(Vec::new()); Cz.push(Vec::new()); - Az[p] = (0..num_proofs[p]).into_par_iter().map(|q| - vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( - num_cons[p_inst].clone(), - max_num_inputs, - num_inputs[p], - &z_list[q], - )] - ).collect(); - Bz[p] = (0..num_proofs[p]).into_par_iter().map(|q| - vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( - num_cons[p_inst].clone(), - max_num_inputs, - num_inputs[p], - &z_list[q], - )] - ).collect(); - Cz[p] = (0..num_proofs[p]).into_par_iter().map(|q| - vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( - num_cons[p_inst].clone(), - max_num_inputs, - num_inputs[p], - &z_list[q], - )] - ).collect(); + Az[p] = (0..num_proofs[p]) + .into_par_iter() + .map(|q| { + vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( + num_cons[p_inst].clone(), + max_num_inputs, + num_inputs[p], + &z_list[q], + )] + }) + .collect(); + Bz[p] = (0..num_proofs[p]) + .into_par_iter() + .map(|q| { + vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( + num_cons[p_inst].clone(), + max_num_inputs, + num_inputs[p], + &z_list[q], + )] + }) + .collect(); + Cz[p] = (0..num_proofs[p]) + .into_par_iter() + .map(|q| { + vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( + num_cons[p_inst].clone(), + max_num_inputs, + num_inputs[p], + &z_list[q], + )] + }) + .collect(); } ( @@ -359,40 +369,93 @@ impl R1CSInstance { ) { assert!(self.num_instances == 1 || self.num_instances == num_instances); assert_eq!(num_rows, &self.num_cons); - assert_eq!(num_segs.next_power_of_two() * max_num_cols, self.max_num_vars); + assert_eq!( + num_segs.next_power_of_two() * max_num_cols, + self.max_num_vars + ); - let mut evals_A_list = Vec::new(); - let mut evals_B_list = Vec::new(); - let mut evals_C_list = Vec::new(); - // Length of output follows self.num_instances NOT num_instances!!! - for p in 0..self.num_instances { - let evals_A = self.A_list[p].compute_eval_table_sparse_disjoint_rounds( - evals, - num_rows[p], - num_segs, - max_num_cols, - num_cols[p], - ); - let evals_B = self.B_list[p].compute_eval_table_sparse_disjoint_rounds( - evals, - num_rows[p], - num_segs, - max_num_cols, - num_cols[p], - ); - let evals_C = self.C_list[p].compute_eval_table_sparse_disjoint_rounds( - evals, - num_rows[p], - num_segs, - max_num_cols, - num_cols[p], - ); - evals_A_list.push(vec![evals_A]); - evals_B_list.push(vec![evals_B]); - evals_C_list.push(vec![evals_C]); - } + ( + (0..self.num_instances) + .into_par_iter() + .map(|p| { + let evals_A = self.A_list[p].compute_eval_table_sparse_disjoint_rounds( + evals, + num_rows[p], + num_segs, + max_num_cols, + num_cols[p], + ); + vec![evals_A] + }) + .collect(), + (0..self.num_instances) + .into_par_iter() + .map(|p| { + let evals_B = self.B_list[p].compute_eval_table_sparse_disjoint_rounds( + evals, + num_rows[p], + num_segs, + max_num_cols, + num_cols[p], + ); + vec![evals_B] + }) + .collect(), + (0..self.num_instances) + .into_par_iter() + .map(|p| { + let evals_C = self.C_list[p].compute_eval_table_sparse_disjoint_rounds( + evals, + num_rows[p], + num_segs, + max_num_cols, + num_cols[p], + ); + vec![evals_C] + }) + .collect(), + ) - (evals_A_list, evals_B_list, evals_C_list) + // let evals_A_list = (0..self.num_instances) + // .into_par_iter() + // .map(|p| { + // let evals_A = self.A_list[p].compute_eval_table_sparse_disjoint_rounds( + // evals, + // num_rows[p], + // num_segs, + // max_num_cols, + // num_cols[p], + // ); + // vec![evals_A] + // }).collect(); + + // let evals_B_list = (0..self.num_instances) + // .into_par_iter() + // .map(|p| { + // let evals_B = self.B_list[p].compute_eval_table_sparse_disjoint_rounds( + // evals, + // num_rows[p], + // num_segs, + // max_num_cols, + // num_cols[p], + // ); + // vec![evals_B] + // }).collect(); + + // let evals_C_list = (0..self.num_instances) + // .into_par_iter() + // .map(|p| { + // let evals_C = self.C_list[p].compute_eval_table_sparse_disjoint_rounds( + // evals, + // num_rows[p], + // num_segs, + // max_num_cols, + // num_cols[p], + // ); + // vec![evals_C] + // }).collect(); + + // (evals_A_list, evals_B_list, evals_C_list) } // If IS_BLOCK, ry is truncated starting at the third entry @@ -402,22 +465,22 @@ impl R1CSInstance { for i in 0..self.num_instances { let num_cons = self.num_cons[i]; let num_vars = self.num_vars[i]; - let rx_header = rx[..rx.len() - min(rx.len(), num_cons.log_2())].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let rx_header = rx[..rx.len() - min(rx.len(), num_cons.log_2())] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let rx_short = &rx[rx.len() - min(rx.len(), num_cons.log_2())..]; let ry_skip_len = ry.len() - min(ry.len(), num_vars.log_2()); let (ry_header, ry_short) = { if IS_BLOCK { - let ry_header = ry[3..3 + ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[3..3 + ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); (ry_header, ry_short) } else { - let ry_header = ry[0..ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[0..ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = ry[ry_skip_len..].to_vec(); (ry_header, ry_short) } @@ -450,22 +513,22 @@ impl R1CSInstance { for i in 0..self.num_instances { let num_cons = self.num_cons[i]; let num_vars = self.num_vars[i]; - let rx_header = rx[..rx.len() - min(rx.len(), num_cons.log_2())].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let rx_header = rx[..rx.len() - min(rx.len(), num_cons.log_2())] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let rx_short = &rx[rx.len() - min(rx.len(), num_cons.log_2())..]; let ry_skip_len = ry.len() - min(ry.len(), num_vars.log_2()); let (ry_header, ry_short) = { if IS_BLOCK { - let ry_header = ry[3..3 + ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[3..3 + ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); (ry_header, ry_short) } else { - let ry_header = ry[0..ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[0..ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = ry[ry_skip_len..].to_vec(); (ry_header, ry_short) } @@ -476,7 +539,10 @@ impl R1CSInstance { rx_short, &ry_short, ); - let evals: Vec = evals.into_iter().map(|i| rx_header * ry_header * i).collect(); + let evals: Vec = evals + .into_iter() + .map(|i| rx_header * ry_header * i) + .collect(); eval_list.extend(evals.clone()); a_evals.push(evals[0]); b_evals.push(evals[1]); @@ -518,7 +584,10 @@ impl R1CSInstance { // Group the instances based on number of variables, which are already orders of 2^4 for i in 0..self.num_instances { - println!("I: {}, NUM_CONS: {}, NUM_VARS: {}", i, self.num_cons[i], self.num_vars[i]); + println!( + "I: {}, NUM_CONS: {}, NUM_VARS: {}", + i, self.num_cons[i], self.num_vars[i] + ); let var_len = self.num_vars[i]; // A_list, B_list, C_list @@ -543,7 +612,9 @@ impl R1CSInstance { let mut r1cs_comm_list = Vec::new(); let mut r1cs_decomm_list = Vec::new(); - for ((sparse_polys, max_num_cons), max_num_vars) in zip(zip(sparse_polys_list, max_num_cons_list), max_num_vars_list) { + for ((sparse_polys, max_num_cons), max_num_vars) in + zip(zip(sparse_polys_list, max_num_cons_list), max_num_vars_list) + { let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys); let r1cs_comm = R1CSCommitment { num_cons: max_num_cons.next_power_of_two(), @@ -553,7 +624,7 @@ impl R1CSInstance { let r1cs_decomm = R1CSDecommitment { num_cons: max_num_cons.next_power_of_two(), num_vars: max_num_vars, - dense + dense, }; r1cs_comm_list.push(r1cs_comm); @@ -582,7 +653,7 @@ impl R1CSInstance { let r1cs_decomm = R1CSDecommitment { num_cons: self.num_instances * self.max_num_cons, num_vars: self.max_num_vars, - dense + dense, }; (r1cs_comm, r1cs_decomm) @@ -606,29 +677,36 @@ impl R1CSEvalProof { ) -> R1CSEvalProof { let timer = Timer::new("R1CSEvalProof::prove"); let rx_skip_len = rx.len() - min(rx.len(), decomm.num_cons.log_2()); - let rx_header = rx[..rx_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let rx_header = rx[..rx_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let rx_short = &rx[rx_skip_len..]; let ry_skip_len = ry.len() - min(ry.len(), decomm.num_vars.log_2()); let (ry_header, ry_short) = { if IS_BLOCK { - let ry_header = ry[3..3 + ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[3..3 + ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); (ry_header, ry_short) } else { - let ry_header = ry[0..ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[0..ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = ry[ry_skip_len..].to_vec(); (ry_header, ry_short) } }; // let ry_short = &ry[..min(ry.len(), decomm.num_vars.log_2())]; - let proof = - SparseMatPolyEvalProof::prove(&decomm.dense, rx_header * ry_header, rx_short, &ry_short, evals, transcript, random_tape); + let proof = SparseMatPolyEvalProof::prove( + &decomm.dense, + rx_header * ry_header, + rx_short, + &ry_short, + evals, + transcript, + random_tape, + ); timer.stop(); R1CSEvalProof { proof } @@ -642,26 +720,33 @@ impl R1CSEvalProof { evals: &Vec, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - let rx_header = rx[..rx.len() - min(rx.len(), comm.num_cons.log_2())].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let rx_header = rx[..rx.len() - min(rx.len(), comm.num_cons.log_2())] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let rx_short = &rx[rx.len() - min(rx.len(), comm.num_cons.log_2())..]; let ry_skip_len = ry.len() - min(ry.len(), comm.num_vars.log_2()); let (ry_header, ry_short) = { if IS_BLOCK { - let ry_header = ry[3..3 + ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[3..3 + ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = [ry[..3].to_vec(), ry[3 + ry_skip_len..].to_vec()].concat(); (ry_header, ry_short) } else { - let ry_header = ry[0..ry_skip_len].iter().fold( - S::field_one(), |c, i| c * (S::field_one() - i.clone()) - ); + let ry_header = ry[0..ry_skip_len] + .iter() + .fold(S::field_one(), |c, i| c * (S::field_one() - i.clone())); let ry_short = ry[ry_skip_len..].to_vec(); (ry_header, ry_short) } }; - self.proof.verify(&comm.comm, rx_header * ry_header, rx_short, &ry_short, evals, transcript) + self.proof.verify( + &comm.comm, + rx_header * ry_header, + rx_short, + &ry_short, + evals, + transcript, + ) } } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index a3e2f33c..d9a70f9a 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -743,7 +743,7 @@ impl HashLayerProof { S::append_field_vector_to_transcript(b"claim_evals_ops", transcript, &evals_ops); let challenges_ops = transcript.challenge_vector(b"challenge_combine_n_to_one", evals_ops.len().log_2()); - + let mut poly_evals_ops = DensePolynomial::new(evals_ops); for i in (0..challenges_ops.len()).rev() { poly_evals_ops.bound_poly_var_bot(&challenges_ops[i]); @@ -1421,8 +1421,15 @@ impl SparseMatPolyEvalProof { timer_build_network.stop(); let timer_eval_network = Timer::new("evalproof_layered_network"); - let poly_eval_network_proof = - PolyEvalNetworkProof::prove(&mut net, dense, &derefs, r_header, evals, transcript, random_tape); + let poly_eval_network_proof = PolyEvalNetworkProof::prove( + &mut net, + dense, + &derefs, + r_header, + evals, + transcript, + random_tape, + ); timer_eval_network.stop(); poly_eval_network_proof @@ -1458,7 +1465,7 @@ impl SparseMatPolyEvalProof { self.poly_eval_network_proof.verify( comm, - r_header, + r_header, evals, &rx_ext, &ry_ext, @@ -1524,7 +1531,14 @@ mod tests { let mut verifier_transcript = Transcript::new(b"example"); assert!(proof - .verify(&poly_comm, Scalar::one(), &rx, &ry, &evals, &mut verifier_transcript,) + .verify( + &poly_comm, + Scalar::one(), + &rx, + &ry, + &evals, + &mut verifier_transcript, + ) .is_ok()); } } diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index e7ae59fb..ac6bfc99 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 1000 +const u32 REPETITION = 10000 From abe05220099f801061a29ae4551ea8f33663ce47 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Tue, 17 Dec 2024 12:00:15 -0500 Subject: [PATCH 23/54] Arithmetic --- spartan_parallel/src/sparse_mlpoly.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index d9a70f9a..721e1d52 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -450,8 +450,7 @@ impl SparseMatPolynomial { for i in 0..self.M.len() { let entry = &self.M[i]; - M_evals[entry.col / max_num_cols][entry.col % max_num_cols] = - M_evals[entry.col / max_num_cols][entry.col % max_num_cols] + rx[entry.row] * entry.val; + M_evals[entry.col / max_num_cols][entry.col % max_num_cols] += rx[entry.row] * entry.val; } M_evals } From 6edc0b05f85d98afd3610febcf5f44a6e9fa259f Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Tue, 17 Dec 2024 15:33:06 -0500 Subject: [PATCH 24/54] Remove array copy for vector multiplication --- spartan_parallel/src/r1csinstance.rs | 34 ++++++++++++++++++++------- spartan_parallel/src/r1csproof.rs | 1 - spartan_parallel/src/sparse_mlpoly.rs | 23 +++++++++++------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index bb92c4d0..8002da29 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -3,6 +3,7 @@ use rayon::prelude::*; use std::cmp::{max, min}; use std::collections::HashMap; +use crate::custom_dense_mlpoly::rev_bits; use crate::scalar::SpartanExtensionField; use crate::transcript::AppendToTranscript; @@ -250,8 +251,13 @@ impl R1CSInstance { Az[p] = (0..num_proofs[p]) .into_par_iter() - .map(|q| { + .map(|q_rev| { + // Reverse the bits of q + let q_step = max_num_proofs / num_proofs[p]; + let q = rev_bits(q_rev * q_step, max_num_proofs); + vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( + max_num_cons, num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], @@ -261,8 +267,13 @@ impl R1CSInstance { .collect(); Bz[p] = (0..num_proofs[p]) .into_par_iter() - .map(|q| { + .map(|q_rev| { + // Reverse the bits of q + let q_step = max_num_proofs / num_proofs[p]; + let q = rev_bits(q_rev * q_step, max_num_proofs); + vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( + max_num_cons, num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], @@ -272,8 +283,13 @@ impl R1CSInstance { .collect(); Cz[p] = (0..num_proofs[p]) .into_par_iter() - .map(|q| { + .map(|q_rev| { + // Reverse the bits of q + let q_step = max_num_proofs / num_proofs[p]; + let q = rev_bits(q_rev * q_step, max_num_proofs); + vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( + max_num_cons, num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], @@ -284,22 +300,22 @@ impl R1CSInstance { } ( - DensePolynomialPqx::new_rev( - &Az, + DensePolynomialPqx::new( + Az, num_proofs.clone(), max_num_proofs, num_cons.clone(), max_num_cons, ), - DensePolynomialPqx::new_rev( - &Bz, + DensePolynomialPqx::new( + Bz, num_proofs.clone(), max_num_proofs, num_cons.clone(), max_num_cons, ), - DensePolynomialPqx::new_rev( - &Cz, + DensePolynomialPqx::new( + Cz, num_proofs, max_num_proofs, num_cons.clone(), diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index c834b69e..f243b9b6 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -4,7 +4,6 @@ use super::dense_mlpoly::{DensePolynomial, EqPolynomial}; use super::errors::ProofVerifyError; use super::math::Math; use super::r1csinstance::R1CSInstance; -use super::random::RandomTape; use super::sumcheck::SumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index 721e1d52..41ccb00b 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -1,6 +1,7 @@ #![allow(clippy::type_complexity)] #![allow(clippy::too_many_arguments)] #![allow(clippy::needless_range_loop)] +use crate::custom_dense_mlpoly::rev_bits; use crate::scalar::SpartanExtensionField; use super::dense_mlpoly::DensePolynomial; @@ -403,21 +404,27 @@ impl SparseMatPolynomial { // Z is consisted of vector segments // Z[i] contains entries i * max_num_cols ~ i * max_num_cols + num_cols pub fn multiply_vec_disjoint_rounds( - &self, - num_rows: usize, - max_num_cols: usize, - _num_cols: usize, - z: &Vec>, + &self, + max_num_rows: usize, + num_rows: usize, + max_num_cols: usize, + _num_cols: usize, + z: &Vec> ) -> Vec { + let step_r = max_num_rows / num_rows; (0..self.M.len()) .map(|i| { let row = self.M[i].row; let col = self.M[i].col; - let val = &self.M[i].val; - (row, *val * z[col / max_num_cols][col % max_num_cols]) + let val = self.M[i].val.clone(); + (row, val * z[col / max_num_cols][col % max_num_cols]) }) .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { - Mz[r] = Mz[r] + v; + // Reverse the bits of r. r_rev is a multiple of step_r + let r_rev = rev_bits(r, max_num_rows); + // Now r_rev is between 0 to num_inputs[p] + let r_rev = r_rev / step_r; + Mz[r_rev] += v; Mz }) } From 93e30d18ed9e3cdb081190108a119c96376336cc Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Tue, 17 Dec 2024 21:57:03 -0500 Subject: [PATCH 25/54] Avoid memory copy in z_mat --- spartan_parallel/src/custom_dense_mlpoly.rs | 2 +- spartan_parallel/src/r1csinstance.rs | 18 ++------- spartan_parallel/src/r1csproof.rs | 43 ++++++++++++--------- spartan_parallel/src/sparse_mlpoly.rs | 9 ++++- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index e04185e4..efb35c2c 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -39,7 +39,7 @@ pub fn rev_bits(q: usize, max_num_proofs: usize) -> usize { } impl DensePolynomialPqx { - // Assume z_mat is of form (p, q_rev, x), construct DensePoly + // Assume z_mat is of form (p, q_rev, x_rev), construct DensePoly pub fn new( z_mat: Vec>>>, num_proofs: Vec, diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 8002da29..322c455a 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -251,11 +251,7 @@ impl R1CSInstance { Az[p] = (0..num_proofs[p]) .into_par_iter() - .map(|q_rev| { - // Reverse the bits of q - let q_step = max_num_proofs / num_proofs[p]; - let q = rev_bits(q_rev * q_step, max_num_proofs); - + .map(|q| { vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( max_num_cons, num_cons[p_inst].clone(), @@ -267,11 +263,7 @@ impl R1CSInstance { .collect(); Bz[p] = (0..num_proofs[p]) .into_par_iter() - .map(|q_rev| { - // Reverse the bits of q - let q_step = max_num_proofs / num_proofs[p]; - let q = rev_bits(q_rev * q_step, max_num_proofs); - + .map(|q| { vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( max_num_cons, num_cons[p_inst].clone(), @@ -283,11 +275,7 @@ impl R1CSInstance { .collect(); Cz[p] = (0..num_proofs[p]) .into_par_iter() - .map(|q_rev| { - // Reverse the bits of q - let q_step = max_num_proofs / num_proofs[p]; - let q = rev_bits(q_rev * q_step, max_num_proofs); - + .map(|q| { vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( max_num_cons, num_cons[p_inst].clone(), diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index f243b9b6..953480bc 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -7,6 +7,7 @@ use super::r1csinstance::R1CSInstance; use super::sumcheck::SumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; +use crate::custom_dense_mlpoly::rev_bits; use crate::scalar::SpartanExtensionField; use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; use merlin::Transcript; @@ -178,22 +179,28 @@ impl R1CSProof { // append input to variables to create a single vector z let timer_tmp = Timer::new("prove_z_mat_gen"); - let mut z_mat: Vec>>> = Vec::new(); - for p in 0..num_instances { - z_mat.push(Vec::new()); - for q in 0..num_proofs[p] { - z_mat[p].push(vec![vec![S::field_zero(); num_inputs[p]]; num_witness_secs]); - for w in 0..witness_secs.len() { - let ws = witness_secs[w]; - let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; - let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; - // Only append the first num_inputs_entries of w_mat[p][q] - for i in 0..min(ws.num_inputs[p_w], num_inputs[p]) { - z_mat[p][q][w][i] = ws.w_mat[p_w][q_w][i]; + let z_mat_rev = { + let mut z_mat: Vec>>> = Vec::new(); + for p in 0..num_instances { + z_mat.push(vec![vec![vec![S::field_zero(); num_inputs[p]]; num_witness_secs]; num_proofs[p]]); + let q_step = max_num_proofs / num_proofs[p]; + for q in 0..num_proofs[p] { + let q_rev = rev_bits(q, max_num_proofs) / q_step; + for w in 0..witness_secs.len() { + let ws = witness_secs[w]; + let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; + let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; + let y_step = max_num_inputs / num_inputs[p]; + // Only append the first num_inputs_entries of w_mat[p][q] + for i in 0..min(ws.num_inputs[p_w], num_inputs[p]) { + let y_rev = rev_bits(i, max_num_inputs) / y_step; + z_mat[p][q_rev][w][y_rev] = ws.w_mat[p_w][q_w][i]; + } } } } - } + z_mat + }; timer_tmp.stop(); // derive the verifier's challenge \tau @@ -221,7 +228,7 @@ impl R1CSProof { max_num_inputs, num_cons, block_num_cons.clone(), - &z_mat, + &z_mat_rev, ); timer_tmp.stop(); @@ -252,7 +259,7 @@ impl R1CSProof { timer_tmp.stop(); timer_sc_proof_phase1.stop(); - let (tau_claim, Az_claim, Bz_claim, Cz_claim) = ( + let (_tau_claim, Az_claim, Bz_claim, Cz_claim) = ( &(poly_tau_p[0] * poly_tau_q[0] * poly_tau_x[0]), &poly_Az.index(0, 0, 0, 0), &poly_Bz.index(0, 0, 0, 0), @@ -320,8 +327,8 @@ impl R1CSProof { let timer_tmp = Timer::new("prove_z_gen"); // Construct a p * q * len(z) matrix Z and bound it to r_q - let mut Z_poly = DensePolynomialPqx::new_rev( - &z_mat, + let mut Z_poly = DensePolynomialPqx::new( + z_mat_rev, num_proofs.clone(), max_num_proofs, num_inputs.clone(), @@ -586,7 +593,7 @@ impl R1CSProof { S::append_field_to_transcript(b"Cz_claim", transcript, Cz_claim); // debug_zk - // assert_eq!(taus_bound_rx * (Az_claim * Bz_claim - Cz_claim), claim_post_phase_1); + assert_eq!(taus_bound_rx * (Az_claim * Bz_claim - Cz_claim), claim_post_phase_1); // derive three public challenges and then derive a joint claim let r_A: S = transcript.challenge_scalar(b"challenge_Az"); diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index 41ccb00b..ad1b1f67 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -408,7 +408,7 @@ impl SparseMatPolynomial { max_num_rows: usize, num_rows: usize, max_num_cols: usize, - _num_cols: usize, + num_cols: usize, z: &Vec> ) -> Vec { let step_r = max_num_rows / num_rows; @@ -417,7 +417,12 @@ impl SparseMatPolynomial { let row = self.M[i].row; let col = self.M[i].col; let val = self.M[i].val.clone(); - (row, val * z[col / max_num_cols][col % max_num_cols]) + let w = col / max_num_cols; + let y = col % max_num_cols; + // Z expresses y in reverse bits order, so have to find the correct y + let y_step = max_num_cols / num_cols; + let y_rev = rev_bits(y, max_num_cols) / y_step; + (row, val * z[w][y_rev]) }) .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { // Reverse the bits of r. r_rev is a multiple of step_r From 5f17d483cf3c8827ccfffa612983df8f95797f9d Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Tue, 17 Dec 2024 22:58:09 -0500 Subject: [PATCH 26/54] Add lookups for x_rev and q_rev --- spartan_parallel/src/r1csinstance.rs | 21 ++++++++++++++++----- spartan_parallel/src/r1csproof.rs | 9 ++++++--- spartan_parallel/src/sparse_mlpoly.rs | 19 ++++++------------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 322c455a..e426604a 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -19,10 +19,8 @@ use super::sparse_mlpoly::{ use super::timer::Timer; use flate2::{write::ZlibEncoder, Compression}; use merlin::Transcript; -use rayon::prelude::*; use serde::{Deserialize, Serialize}; use std::iter::zip; -use std::sync::{Arc, Mutex}; #[derive(Debug, Serialize, Deserialize, Clone)] pub struct R1CSInstance { @@ -249,15 +247,26 @@ impl R1CSInstance { Bz.push(Vec::new()); Cz.push(Vec::new()); + // Map x and y to x_rev and y_rev so we don't have to do it everytime + let x_step = max_num_cons / num_cons[p]; + let x_rev_map = (0..num_cons[p]).map(|x| + rev_bits(x, max_num_cons) / x_step + ).collect(); + let y_step = max_num_inputs / num_inputs[p]; + let y_rev_map = (0..num_inputs[p]).map(|y| + rev_bits(y, max_num_inputs) / y_step + ).collect(); + Az[p] = (0..num_proofs[p]) .into_par_iter() .map(|q| { vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( - max_num_cons, num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], &z_list[q], + &x_rev_map, + &y_rev_map, )] }) .collect(); @@ -265,11 +274,12 @@ impl R1CSInstance { .into_par_iter() .map(|q| { vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( - max_num_cons, num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], &z_list[q], + &x_rev_map, + &y_rev_map, )] }) .collect(); @@ -277,11 +287,12 @@ impl R1CSInstance { .into_par_iter() .map(|q| { vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( - max_num_cons, num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], &z_list[q], + &x_rev_map, + &y_rev_map, )] }) .collect(); diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 953480bc..bc0d9e2d 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -184,17 +184,20 @@ impl R1CSProof { for p in 0..num_instances { z_mat.push(vec![vec![vec![S::field_zero(); num_inputs[p]]; num_witness_secs]; num_proofs[p]]); let q_step = max_num_proofs / num_proofs[p]; + + let y_step = max_num_inputs / num_inputs[p]; + let y_rev_map: Vec = (0..num_inputs[p]).map(|y| + rev_bits(y, max_num_inputs) / y_step + ).collect(); for q in 0..num_proofs[p] { let q_rev = rev_bits(q, max_num_proofs) / q_step; for w in 0..witness_secs.len() { let ws = witness_secs[w]; let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; - let y_step = max_num_inputs / num_inputs[p]; // Only append the first num_inputs_entries of w_mat[p][q] for i in 0..min(ws.num_inputs[p_w], num_inputs[p]) { - let y_rev = rev_bits(i, max_num_inputs) / y_step; - z_mat[p][q_rev][w][y_rev] = ws.w_mat[p_w][q_w][i]; + z_mat[p][q_rev][w][y_rev_map[i]] = ws.w_mat[p_w][q_w][i]; } } } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index ad1b1f67..90f376eb 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -405,13 +405,13 @@ impl SparseMatPolynomial { // Z[i] contains entries i * max_num_cols ~ i * max_num_cols + num_cols pub fn multiply_vec_disjoint_rounds( &self, - max_num_rows: usize, num_rows: usize, max_num_cols: usize, - num_cols: usize, - z: &Vec> + _num_cols: usize, + z: &Vec>, + x_rev_map: &Vec, + y_rev_map: &Vec, ) -> Vec { - let step_r = max_num_rows / num_rows; (0..self.M.len()) .map(|i| { let row = self.M[i].row; @@ -419,17 +419,10 @@ impl SparseMatPolynomial { let val = self.M[i].val.clone(); let w = col / max_num_cols; let y = col % max_num_cols; - // Z expresses y in reverse bits order, so have to find the correct y - let y_step = max_num_cols / num_cols; - let y_rev = rev_bits(y, max_num_cols) / y_step; - (row, val * z[w][y_rev]) + (row, val * z[w][y_rev_map[y]]) }) .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { - // Reverse the bits of r. r_rev is a multiple of step_r - let r_rev = rev_bits(r, max_num_rows); - // Now r_rev is between 0 to num_inputs[p] - let r_rev = r_rev / step_r; - Mz[r_rev] += v; + Mz[x_rev_map[r]] += v; Mz }) } From 0da6d0795b4836bc95b28a1e1932c679762bae7e Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 23 Dec 2024 22:47:54 -0500 Subject: [PATCH 27/54] Drop bit-reverse --- spartan_parallel/src/custom_dense_mlpoly.rs | 341 ++++++++------------ spartan_parallel/src/r1csinstance.rs | 17 - spartan_parallel/src/r1csproof.rs | 179 +++++----- spartan_parallel/src/sparse_mlpoly.rs | 7 +- spartan_parallel/src/sumcheck.rs | 179 +++++----- 5 files changed, 292 insertions(+), 431 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index efb35c2c..d73fb2c7 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -4,8 +4,6 @@ use std::cmp::min; use crate::dense_mlpoly::DensePolynomial; use crate::scalar::SpartanExtensionField; -use super::math::Math; - const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; @@ -30,14 +28,6 @@ pub struct DensePolynomialPqx { // The same applies to X } -// Reverse the bits in q or x -pub fn rev_bits(q: usize, max_num_proofs: usize) -> usize { - (0..max_num_proofs.log_2()) - .rev() - .map(|i| q / (i.pow2()) % 2 * (max_num_proofs / i.pow2() / 2)) - .fold(0, |a, b| a + b) -} - impl DensePolynomialPqx { // Assume z_mat is of form (p, q_rev, x_rev), construct DensePoly pub fn new( @@ -60,57 +50,6 @@ impl DensePolynomialPqx { } } - // Assume z_mat is in its standard form of (p, q, x) - // Reverse q and x and convert it to (p, q_rev, x_rev) - pub fn new_rev( - z_mat: &Vec>>>, - num_proofs: Vec, - max_num_proofs: usize, - num_inputs: Vec, - max_num_inputs: usize, - ) -> Self { - let mut Z = Vec::new(); - let num_instances = z_mat.len(); - let num_witness_secs = z_mat[0][0].len(); - for p in 0..num_instances { - Z.push(vec![ - vec![ - vec![S::field_zero(); num_inputs[p]]; - num_witness_secs - ]; - num_proofs[p] - ]); - - let step_q = max_num_proofs / num_proofs[p]; - let step_x = max_num_inputs / num_inputs[p]; - for q in 0..num_proofs[p] { - // Reverse the bits of q. q_rev is a multiple of step_q - let q_rev = rev_bits(q, max_num_proofs); - // Now q_rev is between 0 to num_proofs[p] - let q_rev = q_rev / step_q; - - for x in 0..num_inputs[p] { - // Reverse the bits of x. x_rev is a multiple of step_x - let x_rev = rev_bits(x, max_num_inputs); - // Now x_rev is between 0 to num_inputs[p] - let x_rev = x_rev / step_x; - for w in 0..num_witness_secs { - Z[p][q_rev][w][x_rev] = z_mat[p][q][w][x]; - } - } - } - } - DensePolynomialPqx { - num_instances: num_instances.next_power_of_two(), - num_proofs, - max_num_proofs, - num_witness_secs: num_witness_secs.next_power_of_two(), - num_inputs, - max_num_inputs, - Z, - } - } - pub fn len(&self) -> usize { return self.num_instances * self.max_num_proofs * self.max_num_inputs; } @@ -128,228 +67,202 @@ impl DensePolynomialPqx { } } - // Given (p, q_rev, w, x_rev) and a mode, return Z[p*][q_rev*][w*][x_rev*] - // Mode = 1 ==> p* is p with first bit set to 1 - // Mode = 2 ==> q_rev* is q_rev with first bit set to 1 - // Mode = 3 ==> w* is w with first bit set to 1 - // Mode = 4 ==> x_rev* is x_rev with first bit set to 1 - // Assume that first bit of the corresponding index is 0, otherwise throw out of bound exception - pub fn index_high(&self, p: usize, q_rev: usize, w: usize, x_rev: usize, mode: usize) -> S { + // Given (p, q, w, x) and a mode, return Z[p*][q*][w*][x*] + // Mode = 1 ==> p* = 2p for low, 2p + 1 for high + // Mode = 2 ==> q* = 2q for low, 2q + 1 + // Mode = 3 ==> w* = 2w for low, 2w + 1 + // Mode = 4 ==> x* = 2x for low, 2x + 1 + // Assume p*, q*, w*, x*, within bound + pub fn index_low(&self, p: usize, q: usize, w: usize, x: usize, mode: usize) -> S { + let ZERO = S::field_zero(); match mode { - MODE_P => { - if p + self.num_instances / 2 < self.Z.len() { - return self.Z[p + self.num_instances / 2][q_rev][w][x_rev]; - } else { - return S::field_zero(); - } - } - MODE_Q => { - return if self.num_proofs[p] == 1 { - S::field_zero() - } else { - self.Z[p][q_rev + self.num_proofs[p] / 2][w][x_rev] - }; - } - MODE_W => { - if w + self.num_witness_secs / 2 < self.Z[p][q_rev].len() { - return self.Z[p][q_rev][w + self.num_witness_secs / 2][x_rev]; - } else { - return S::field_zero(); - } - } - MODE_X => { - return if self.num_inputs[p] == 1 { - S::field_zero() - } else { - self.Z[p][q_rev][w][x_rev + self.num_inputs[p] / 2] - }; - } - _ => { - panic!( - "DensePolynomialPqx bound failed: unrecognized mode {}!", - mode - ); - } + MODE_P => { if 2 * p >= self.Z.len() { ZERO } else { self.Z[2 * p][q][w][x] } } + MODE_Q => self.Z[p][2 * q][w][x], + MODE_W => { if 2 * w >= self.Z[p][q].len() { ZERO } else { self.Z[p][q][2 * w][x] } } + MODE_X => self.Z[p][q][w][2 * x], + _ => unreachable!() + } + } + + pub fn index_high(&self, p: usize, q: usize, w: usize, x: usize, mode: usize) -> S { + let ZERO = S::field_zero(); + match mode { + MODE_P => { if self.num_instances == 1 { self.Z[0][q][w][x] } else if 2 * p + 1 >= self.Z.len() { ZERO } else { self.Z[2 * p + 1][q][w][x] } } + MODE_Q => { if self.num_proofs[p] == 1 { ZERO } else { self.Z[p][2 * q + 1][w][x] } } + MODE_W => { if 2 * w + 1 >= self.Z[p][q].len() { ZERO } else { self.Z[p][q][2 * w + 1][x] } } + MODE_X => { if self.num_inputs[p] == 1 { ZERO } else { self.Z[p][q][w][2 * x + 1] } } + _ => unreachable!() } } // Bound a variable to r according to mode - // Mode = 1 ==> Bound first variable of "p" section to r - // Mode = 2 ==> Bound first variable of "q" section to r - // Mode = 3 ==> Bound first variable of "w" section to r - // Mode = 4 ==> Bound first variable of "x" section to r + // Mode = 1 ==> Bound last variable of "p" section to r + // Mode = 2 ==> Bound last variable of "q" section to r + // Mode = 3 ==> Bound last variable of "w" section to r + // Mode = 4 ==> Bound last variable of "x" section to r pub fn bound_poly(&mut self, r: &S, mode: usize) { - match mode { - MODE_P => { - self.bound_poly_p(r); - } - MODE_Q => { - self.bound_poly_q(r); + match mode { + MODE_P => { self.bound_poly_p(r); } + MODE_Q => { self.bound_poly_q(r); } + MODE_W => { self.bound_poly_w(r); } + MODE_X => { self.bound_poly_x(r); } + _ => { panic!("DensePolynomialPqx bound failed: unrecognized mode {}!", mode); } } - MODE_W => { - self.bound_poly_w(r); - } - MODE_X => { - self.bound_poly_x(r); - } - _ => { - panic!( - "DensePolynomialPqx bound failed: unrecognized mode {}!", - mode - ); - } - } } - // Bound the first variable of "p" section to r + // Bound the last variable of "p" section to r // We are only allowed to bound "p" if we have bounded the entire q and x section pub fn bound_poly_p(&mut self, r: &S) { - assert_eq!(self.max_num_proofs, 1); - assert_eq!(self.max_num_inputs, 1); - self.num_instances /= 2; - for p in 0..self.num_instances { - for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { - let Z_high = if p + self.num_instances < self.Z.len() { - self.Z[p + self.num_instances][0][w][0] - } else { - S::field_zero() - }; - self.Z[p][0][w][0] = self.Z[p][0][w][0] + *r * (Z_high - self.Z[p][0][w][0]); + let ZERO = S::field_zero(); + assert_eq!(self.max_num_proofs, 1); + assert_eq!(self.max_num_inputs, 1); + self.num_instances /= 2; + for p in 0..self.num_instances { + for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { + let Z_low = if 2 * p < self.Z.len() { self.Z[2 * p][0][w][0] } else { ZERO }; + let Z_high = if 2 * p + 1 < self.Z.len() { self.Z[2 * p + 1][0][w][0] } else { ZERO }; + self.Z[p][0][w][0] = Z_low + r.clone() * (Z_high - Z_low); + } } - } } - // Bound the first variable of "q" section to r + // Bound the last variable of "q" section to r pub fn bound_poly_q(&mut self, r: &S) { - self.max_num_proofs /= 2; + let ONE = S::field_one(); + self.max_num_proofs /= 2; - for p in 0..min(self.num_instances, self.Z.len()) { - if self.num_proofs[p] == 1 { - for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][0][w][x] = (S::field_one() - *r) * self.Z[p][0][w][x]; - } - } - } else { - self.num_proofs[p] /= 2; - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { + for p in 0..min(self.num_instances, self.Z.len()) { + if self.num_proofs[p] == 1 { + for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { for x in 0..self.num_inputs[p] { - self.Z[p][q][w][x] = self.Z[p][q][w][x] - + *r * (self.Z[p][q + self.num_proofs[p]][w][x] - self.Z[p][q][w][x]); + self.Z[p][0][w][x] *= ONE - r.clone(); + } + } + } else { + self.num_proofs[p] /= 2; + for q in 0..self.num_proofs[p] { + for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { + for x in 0..self.num_inputs[p] { + self.Z[p][q][w][x] = self.Z[p][2 * q][w][x] + r.clone() * (self.Z[p][2 * q + 1][w][x] - self.Z[p][2 * q][w][x]); + } } } } } - } } - // Bound the first variable of "w" section to r + // Bound the last variable of "w" section to r pub fn bound_poly_w(&mut self, r: &S) { + let ZERO = S::field_zero(); self.num_witness_secs /= 2; for p in 0..min(self.num_instances, self.Z.len()) { for q in 0..self.num_proofs[p] { for w in 0..self.num_witness_secs { for x in 0..self.num_inputs[p] { - let Z_high = if w + self.num_witness_secs < self.Z[p][q].len() { - self.Z[p][q][w + self.num_witness_secs][x] - } else { - S::field_zero() - }; - self.Z[p][q][w][x] = self.Z[p][q][w][x] + *r * (Z_high - self.Z[p][q][w][x]); + let Z_low = if 2 * w < self.Z[p][q].len() { self.Z[p][q][2 * w][x] } else { ZERO }; + let Z_high = if 2 * w + 1 < self.Z[p][q].len() { self.Z[p][q][2 * w + 1][x] } else { ZERO }; + self.Z[p][q][w][x] = Z_low + r.clone() * (Z_high - Z_low); } } } } - } +} - // Bound the first variable of "x" section to r + // Bound the last variable of "x" section to r pub fn bound_poly_x(&mut self, r: &S) { - self.max_num_inputs /= 2; + let ONE = S::field_one(); + self.max_num_inputs /= 2; - for p in 0..min(self.num_instances, self.Z.len()) { - if self.num_inputs[p] == 1 { - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - self.Z[p][q][w][0] = (S::field_one() - *r) * self.Z[p][q][w][0]; + for p in 0..min(self.num_instances, self.Z.len()) { + if self.num_inputs[p] == 1 { + for q in 0..self.num_proofs[p] { + for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { + self.Z[p][q][w][0] *= ONE - r.clone(); + } } - } - } else { - self.num_inputs[p] /= 2; - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][q][w][x] = self.Z[p][q][w][x] - + *r * (self.Z[p][q][w][x + self.num_inputs[p]] - self.Z[p][q][w][x]); + } else { + self.num_inputs[p] /= 2; + for q in 0..self.num_proofs[p] { + for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { + for x in 0..self.num_inputs[p] { + self.Z[p][q][w][x] = self.Z[p][q][w][2 * x] + r.clone() * (self.Z[p][q][w][2 * x + 1] - self.Z[p][q][w][2 * x]); + } } } } } - } } - // Bound the entire "p" section to r_p + // Bound the entire "p" section to r_p in reverse // Must occur after r_q's are bounded - pub fn bound_poly_vars_rp(&mut self, r_p: &Vec) { - for r in r_p { - self.bound_poly_p(r); + pub fn bound_poly_vars_rp(&mut self, + r_p: &[S], + ) { + for r in r_p { + self.bound_poly_p(r); + } } - } - // Bound the entire "q_rev" section to r_q - pub fn bound_poly_vars_rq(&mut self, r_q: &Vec) { + // Bound the entire "q" section to r_q in reverse + pub fn bound_poly_vars_rq(&mut self, + r_q: &[S], + ) { for r in r_q { self.bound_poly_q(r); } } - // Bound the entire "w" section to r_w - pub fn bound_poly_vars_rw(&mut self, r_w: &Vec) { + // Bound the entire "w" section to r_w in reverse + pub fn bound_poly_vars_rw(&mut self, + r_w: &[S], + ) { for r in r_w { self.bound_poly_w(r); } } // Bound the entire "x_rev" section to r_x - pub fn bound_poly_vars_rx(&mut self, r_x: &Vec) { + pub fn bound_poly_vars_rx(&mut self, + r_x: &[S], + ) { for r in r_x { self.bound_poly_x(r); } } - pub fn evaluate(&self, r_p: &Vec, r_q: &Vec, r_w: &Vec, r_x: &Vec) -> S { + pub fn evaluate(&self, + rp_rev: &Vec, + rq_rev: &Vec, + rw_rev: &Vec, + rx_rev: &Vec, + ) -> S { let mut cl = self.clone(); - cl.bound_poly_vars_rx(r_x); - cl.bound_poly_vars_rw(r_w); - cl.bound_poly_vars_rq(r_q); - cl.bound_poly_vars_rp(r_p); - cl.index(0, 0, 0, 0) + cl.bound_poly_vars_rx(rx_rev); + cl.bound_poly_vars_rw(rw_rev); + cl.bound_poly_vars_rq(rq_rev); + cl.bound_poly_vars_rp(rp_rev); + return cl.index(0, 0, 0, 0); } // Convert to a (p, q_rev, x_rev) regular dense poly of form (p, q, x) pub fn to_dense_poly(&self) -> DensePolynomial { - let mut Z_poly = - vec![ - S::field_zero(); - self.num_instances * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs - ]; - for p in 0..min(self.num_instances, self.Z.len()) { - let step_q = self.max_num_proofs / self.num_proofs[p]; - let step_x = self.max_num_inputs / self.num_inputs[p]; - for q_rev in 0..self.num_proofs[p] { - let q = rev_bits(q_rev * step_q, self.max_num_proofs); - for x_rev in 0..self.num_inputs[p] { - let x = rev_bits(x_rev * step_x, self.max_num_inputs); - for w in 0..min(self.num_witness_secs, self.Z[p][q_rev].len()) { - Z_poly[p * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs - + q * self.num_witness_secs * self.max_num_inputs - + w * self.max_num_inputs - + x] = self.Z[p][q_rev][w][x_rev]; + let ZERO = S::field_zero(); + let mut Z_poly = vec![ZERO; self.num_instances * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs]; + for p in 0..min(self.num_instances, self.Z.len()) { + for q in 0..self.num_proofs[p] { + for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { + for x in 0..self.num_inputs[p] { + Z_poly[ + p * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs + + q * self.num_witness_secs * self.max_num_inputs + + w * self.max_num_inputs + + x + ] = self.Z[p][q][w][x]; + } } } } - } - DensePolynomial::new(Z_poly) + DensePolynomial::new(Z_poly) } -} +} \ No newline at end of file diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index e426604a..9ea77495 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -3,7 +3,6 @@ use rayon::prelude::*; use std::cmp::{max, min}; use std::collections::HashMap; -use crate::custom_dense_mlpoly::rev_bits; use crate::scalar::SpartanExtensionField; use crate::transcript::AppendToTranscript; @@ -247,16 +246,6 @@ impl R1CSInstance { Bz.push(Vec::new()); Cz.push(Vec::new()); - // Map x and y to x_rev and y_rev so we don't have to do it everytime - let x_step = max_num_cons / num_cons[p]; - let x_rev_map = (0..num_cons[p]).map(|x| - rev_bits(x, max_num_cons) / x_step - ).collect(); - let y_step = max_num_inputs / num_inputs[p]; - let y_rev_map = (0..num_inputs[p]).map(|y| - rev_bits(y, max_num_inputs) / y_step - ).collect(); - Az[p] = (0..num_proofs[p]) .into_par_iter() .map(|q| { @@ -265,8 +254,6 @@ impl R1CSInstance { max_num_inputs, num_inputs[p], &z_list[q], - &x_rev_map, - &y_rev_map, )] }) .collect(); @@ -278,8 +265,6 @@ impl R1CSInstance { max_num_inputs, num_inputs[p], &z_list[q], - &x_rev_map, - &y_rev_map, )] }) .collect(); @@ -291,8 +276,6 @@ impl R1CSInstance { max_num_inputs, num_inputs[p], &z_list[q], - &x_rev_map, - &y_rev_map, )] }) .collect(); diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index bc0d9e2d..b6a9b2ae 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -7,7 +7,6 @@ use super::r1csinstance::R1CSInstance; use super::sumcheck::SumcheckInstanceProof; use super::timer::Timer; use super::transcript::ProofTranscript; -use crate::custom_dense_mlpoly::rev_bits; use crate::scalar::SpartanExtensionField; use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; use merlin::Transcript; @@ -132,6 +131,9 @@ impl R1CSProof { inst: &R1CSInstance, transcript: &mut Transcript, ) -> (R1CSProof, [Vec; 4]) { + let ZERO = S::field_zero(); + let ONE = S::field_one(); + let timer_prove = Timer::new("R1CSProof::prove"); >::append_protocol_name( transcript, @@ -179,31 +181,21 @@ impl R1CSProof { // append input to variables to create a single vector z let timer_tmp = Timer::new("prove_z_mat_gen"); - let z_mat_rev = { - let mut z_mat: Vec>>> = Vec::new(); - for p in 0..num_instances { - z_mat.push(vec![vec![vec![S::field_zero(); num_inputs[p]]; num_witness_secs]; num_proofs[p]]); - let q_step = max_num_proofs / num_proofs[p]; - - let y_step = max_num_inputs / num_inputs[p]; - let y_rev_map: Vec = (0..num_inputs[p]).map(|y| - rev_bits(y, max_num_inputs) / y_step - ).collect(); - for q in 0..num_proofs[p] { - let q_rev = rev_bits(q, max_num_proofs) / q_step; - for w in 0..witness_secs.len() { - let ws = witness_secs[w]; - let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; - let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; - // Only append the first num_inputs_entries of w_mat[p][q] - for i in 0..min(ws.num_inputs[p_w], num_inputs[p]) { - z_mat[p][q_rev][w][y_rev_map[i]] = ws.w_mat[p_w][q_w][i]; - } + let mut z_mat: Vec>>> = Vec::new(); + for p in 0..num_instances { + z_mat.push(vec![vec![vec![ZERO; num_inputs[p]]; num_witness_secs]; num_proofs[p]]); + for q in 0..num_proofs[p] { + for w in 0..witness_secs.len() { + let ws = witness_secs[w]; + let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; + let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; + // Only append the first num_inputs_entries of w_mat[p][q] + for i in 0..min(ws.num_inputs[p_w], num_inputs[p]) { + z_mat[p][q][w][i] = ws.w_mat[p_w][q_w][i]; } } } - z_mat - }; + } timer_tmp.stop(); // derive the verifier's challenge \tau @@ -231,13 +223,13 @@ impl R1CSProof { max_num_inputs, num_cons, block_num_cons.clone(), - &z_mat_rev, + &z_mat, ); timer_tmp.stop(); // Sumcheck 1: (Az * Bz - Cz) * eq(x, q, p) = 0 let timer_tmp = Timer::new("prove_sum_check"); - let (sc_proof_phase1, rx, _claims_phase1) = R1CSProof::prove_phase_one( + let (sc_proof_phase1, rx_rev, _claims_phase1) = R1CSProof::prove_phase_one( num_rounds_x + num_rounds_q + num_rounds_p, num_rounds_x, num_rounds_q, @@ -274,12 +266,11 @@ impl R1CSProof { S::append_field_to_transcript(b"Cz_claim", transcript, *Cz_claim); // Separate the result rx into rp, rq, and rx - let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); - let (rq_rev, rp) = rq_rev.split_at(num_rounds_q); + let (rx_rev, rq_rev) = rx_rev.split_at(num_rounds_x); + let (rq_rev, rp_rev) = rq_rev.split_at(num_rounds_q); let rx: Vec = rx_rev.iter().copied().rev().collect(); - let rq_rev = rq_rev.to_vec(); let rq: Vec = rq_rev.iter().copied().rev().collect(); - let rp = rp.to_vec(); + let rp = rp_rev.iter().copied().rev().collect(); // -- // PHASE 2 @@ -319,8 +310,8 @@ impl R1CSProof { } evals_ABC }; - let mut ABC_poly = DensePolynomialPqx::new_rev( - &evals_ABC, + let mut ABC_poly = DensePolynomialPqx::new( + evals_ABC, vec![1; num_instances], 1, num_inputs.clone(), @@ -331,7 +322,7 @@ impl R1CSProof { let timer_tmp = Timer::new("prove_z_gen"); // Construct a p * q * len(z) matrix Z and bound it to r_q let mut Z_poly = DensePolynomialPqx::new( - z_mat_rev, + z_mat, num_proofs.clone(), max_num_proofs, num_inputs.clone(), @@ -339,14 +330,14 @@ impl R1CSProof { ); timer_tmp.stop(); let timer_tmp = Timer::new("prove_z_bind"); - Z_poly.bound_poly_vars_rq(&rq_rev.to_vec()); + Z_poly.bound_poly_vars_rq(&rq_rev); timer_tmp.stop(); // An Eq function to match p with rp let mut eq_p_rp_poly = DensePolynomial::new(EqPolynomial::new(rp).evals()); // Sumcheck 2: (rA + rB + rC) * Z * eq(p) = e - let (sc_proof_phase2, ry, _claims_phase2) = R1CSProof::prove_phase_two( + let (sc_proof_phase2, ry_rev, _claims_phase2) = R1CSProof::prove_phase_two( num_rounds_y + num_rounds_w + num_rounds_p, num_rounds_y, num_rounds_w, @@ -363,10 +354,10 @@ impl R1CSProof { timer_sc_proof_phase2.stop(); // Separate ry into rp, rw, and ry - let (ry_rev, rw) = ry.split_at(num_rounds_y); - let (rw, rp) = rw.split_at(num_rounds_w); - let rp = rp.to_vec(); - let rw = rw.to_vec(); + let (ry_rev, rw_rev) = ry_rev.split_at(num_rounds_y); + let (rw_rev, rp_rev) = rw_rev.split_at(num_rounds_w); + let rp: Vec = rp_rev.iter().copied().rev().collect(); + let rw: Vec = rw_rev.iter().copied().rev().collect(); let ry: Vec = ry_rev.iter().copied().rev().collect(); assert_eq!(Z_poly.len(), 1); @@ -379,9 +370,9 @@ impl R1CSProof { let timer_polyeval = Timer::new("polyeval"); // For every possible wit_sec.num_inputs, compute ry_factor = prodX(1 - ryX)... - let mut ry_factors = vec![S::field_one(); num_rounds_y + 1]; + let mut ry_factors = vec![ONE; num_rounds_y + 1]; for i in 0..num_rounds_y { - ry_factors[i + 1] = ry_factors[i] * (S::field_one() - ry[i]); + ry_factors[i + 1] = ry_factors[i] * (ONE - ry[i]); } let mut poly_list = Vec::new(); @@ -405,7 +396,7 @@ impl R1CSProof { let ry_short = { // if w.num_inputs[p] >= num_inputs, need to pad 0's to the front of ry if w.num_inputs[p] >= max_num_inputs { - let ry_pad = vec![S::field_zero(); w.num_inputs[p].log_2() - max_num_inputs.log_2()]; + let ry_pad = vec![ZERO; w.num_inputs[p].log_2() - max_num_inputs.log_2()]; [ry_pad, ry.clone()].concat() } // Else ry_short is the last w.num_inputs[p].log_2() entries of ry @@ -458,28 +449,28 @@ impl R1CSProof { let e = |i: usize| eval_vars_at_ry_list[i][wit_sec_p(i)]; let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { - vec![S::field_one()] + vec![ONE] } 2 => { - vec![(S::field_one() - rw[0]), rw[0]] + vec![(ONE - rw[0]), rw[0]] } 4 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]), - (S::field_one() - rw[0]) * rw[1], - rw[0] * (S::field_one() - rw[1]), + (ONE - rw[0]) * (ONE - rw[1]), + (ONE - rw[0]) * rw[1], + rw[0] * (ONE - rw[1]), rw[0] * rw[1], ] } 8 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * rw[2], - (S::field_one() - rw[0]) * rw[1] * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * rw[1] * rw[2], - rw[0] * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - rw[0] * (S::field_one() - rw[1]) * rw[2], - rw[0] * rw[1] * (S::field_one() - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * (ONE - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * rw[2], + (ONE - rw[0]) * rw[1] * (ONE - rw[2]), + (ONE - rw[0]) * rw[1] * rw[2], + rw[0] * (ONE - rw[1]) * (ONE - rw[2]), + rw[0] * (ONE - rw[1]) * rw[2], + rw[0] * rw[1] * (ONE - rw[2]), rw[0] * rw[1] * rw[2], ] } @@ -488,9 +479,9 @@ impl R1CSProof { } }; let mut eval_vars_comb = - (0..num_witness_secs).fold(S::field_zero(), |s, i| s + prefix_list[i] * e(i)); + (0..num_witness_secs).fold(ZERO, |s, i| s + prefix_list[i] * e(i)); for q in 0..(num_rounds_q - num_proofs[p].log_2()) { - eval_vars_comb = eval_vars_comb * (S::field_one() - rq[q]); + eval_vars_comb = eval_vars_comb * (ONE - rq[q]); } eval_vars_comb_list.push(eval_vars_comb); } @@ -510,7 +501,7 @@ impl R1CSProof { eval_vars_at_ry, // proof_eval_vars_at_ry_list, }, - [rp, rq_rev, rx, [rw, ry].concat()], + [rp, rq, rx, [rw, ry].concat()], ) } @@ -537,6 +528,9 @@ impl R1CSProof { evals: &[S; 3], transcript: &mut Transcript, ) -> Result<[Vec; 4], ProofVerifyError> { + let ZERO = S::field_zero(); + let ONE = S::field_one(); + >::append_protocol_name( transcript, R1CSProof::::protocol_name(), @@ -560,42 +554,39 @@ impl R1CSProof { let tau_q = transcript.challenge_vector(b"challenge_tau_q", num_rounds_q); let tau_x = transcript.challenge_vector(b"challenge_tau_x", num_rounds_x); - let (claim_post_phase_1, rx) = self.sc_proof_phase1.verify( - S::field_zero(), + let (claim_post_phase_1, rx_rev) = self.sc_proof_phase1.verify( + ZERO, num_rounds_x + num_rounds_q + num_rounds_p, 3, transcript, )?; - // Separate the result rx into rp_round1, rq, and rx - let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); - let (rq_rev, rp_round1) = rq_rev.split_at(num_rounds_q); + // Separate the result rx into rp, rq, and rx + let (rx_rev, rq_rev) = rx_rev.split_at(num_rounds_x); + let (rq_rev, rp_rev) = rq_rev.split_at(num_rounds_q); let rx: Vec = rx_rev.iter().copied().rev().collect(); - let rq_rev = rq_rev.to_vec(); let rq: Vec = rq_rev.iter().copied().rev().collect(); - let rp_round1 = rp_round1.to_vec(); + let rp_round1: Vec = rp_rev.iter().copied().rev().collect(); // taus_bound_rx is really taus_bound_rx_rq_rp let taus_bound_rp: S = (0..rp_round1.len()) - .map(|i| { - rp_round1[i] * tau_p[i] + (S::field_one() - rp_round1[i]) * (S::field_one() - tau_p[i]) - }) + .map(|i| rp_round1[i] * tau_p[i] + (ONE - rp_round1[i]) * (ONE - tau_p[i])) .product(); - let taus_bound_rq: S = (0..rq_rev.len()) - .map(|i| rq_rev[i] * tau_q[i] + (S::field_one() - rq_rev[i]) * (S::field_one() - tau_q[i])) + let taus_bound_rq: S = (0..rq.len()) + .map(|i| rq[i] * tau_q[i] + (ONE - rq[i]) * (ONE - tau_q[i])) .product(); - let taus_bound_rx: S = (0..rx_rev.len()) - .map(|i| rx_rev[i] * tau_x[i] + (S::field_one() - rx_rev[i]) * (S::field_one() - tau_x[i])) + let taus_bound_rx: S = (0..rx.len()) + .map(|i| rx[i] * tau_x[i] + (ONE - rx[i]) * (ONE - tau_x[i])) .product(); let taus_bound_rx = taus_bound_rp * taus_bound_rq * taus_bound_rx; + // perform the intermediate sum-check test with claimed Az, Bz, and Cz let (Az_claim, Bz_claim, Cz_claim) = self.claims_phase2; S::append_field_to_transcript(b"Az_claim", transcript, Az_claim); S::append_field_to_transcript(b"Bz_claim", transcript, Bz_claim); S::append_field_to_transcript(b"Cz_claim", transcript, Cz_claim); - // debug_zk assert_eq!(taus_bound_rx * (Az_claim * Bz_claim - Cz_claim), claim_post_phase_1); // derive three public challenges and then derive a joint claim @@ -607,7 +598,7 @@ impl R1CSProof { let claim_phase2 = r_A * Az_claim + r_B * Bz_claim + r_C * Cz_claim; // verify the joint claim with a sum-check protocol - let (claim_post_phase_2, ry) = self.sc_proof_phase2.verify( + let (claim_post_phase_2, ry_rev) = self.sc_proof_phase2.verify( claim_phase2, num_rounds_y + num_rounds_w + num_rounds_p, 3, @@ -615,24 +606,24 @@ impl R1CSProof { )?; // Separate ry into rp, rw, and ry - let (ry_rev, rw) = ry.split_at(num_rounds_y); - let (rw, rp) = rw.split_at(num_rounds_w); - let rp = rp.to_vec(); - let rw = rw.to_vec(); + let (ry_rev, rw_rev) = ry_rev.split_at(num_rounds_y); + let (rw_rev, rp_rev) = rw_rev.split_at(num_rounds_w); + let rp: Vec = rp_rev.iter().copied().rev().collect(); + let rw: Vec = rw_rev.iter().copied().rev().collect(); let ry: Vec = ry_rev.iter().copied().rev().collect(); // An Eq function to match p with rp let p_rp_poly_bound_ry: S = (0..rp.len()) - .map(|i| rp[i] * rp_round1[i] + (S::field_one() - rp[i]) * (S::field_one() - rp_round1[i])) + .map(|i| rp[i] * rp_round1[i] + (ONE - rp[i]) * (ONE - rp_round1[i])) .product(); // verify Z(rp, rq, ry) proof against the initial commitment // First by witness & by instance on ry // For every possible wit_sec.num_inputs, compute ry_factor = prodX(1 - ryX)... // If there are 2 witness secs, then ry_factors[0] = 1, ry_factors[1] = 1, ry_factors[2] = 1 - ry1, ry_factors[3] = (1 - ry1)(1 - ry2), etc. - let mut ry_factors = vec![S::field_one(); num_rounds_y + 1]; + let mut ry_factors = vec![ONE; num_rounds_y + 1]; for i in 0..num_rounds_y { - ry_factors[i + 1] = (ry_factors[i]) * (S::field_one() - ry[i]); + ry_factors[i + 1] = (ry_factors[i]) * (ONE - ry[i]); } // POLY COMMIT @@ -681,28 +672,28 @@ impl R1CSProof { }; let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { - vec![S::field_one()] + vec![ONE] } 2 => { - vec![(S::field_one() - rw[0]), rw[0]] + vec![(ONE - rw[0]), rw[0]] } 4 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]), - (S::field_one() - rw[0]) * rw[1], - rw[0] * (S::field_one() - rw[1]), + (ONE - rw[0]) * (ONE - rw[1]), + (ONE - rw[0]) * rw[1], + rw[0] * (ONE - rw[1]), rw[0] * rw[1], ] } 8 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * rw[2], - (S::field_one() - rw[0]) * rw[1] * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * rw[1] * rw[2], - rw[0] * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - rw[0] * (S::field_one() - rw[1]) * rw[2], - rw[0] * rw[1] * (S::field_one() - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * (ONE - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * rw[2], + (ONE - rw[0]) * rw[1] * (ONE - rw[2]), + (ONE - rw[0]) * rw[1] * rw[2], + rw[0] * (ONE - rw[1]) * (ONE - rw[2]), + rw[0] * (ONE - rw[1]) * rw[2], + rw[0] * rw[1] * (ONE - rw[2]), rw[0] * rw[1] * rw[2], ] } @@ -713,14 +704,14 @@ impl R1CSProof { let mut eval_vars_comb = (1..num_witness_secs).fold(prefix_list[0] * c(0), |s, i| s + prefix_list[i] * c(i)); for q in 0..(num_rounds_q - num_proofs[p].log_2()) { - eval_vars_comb *= S::field_one() - rq[q]; + eval_vars_comb *= ONE - rq[q]; } expected_eval_vars_list.push(eval_vars_comb); } let EQ_p = &EqPolynomial::new(rp.clone()).evals()[..num_instances]; let expected_eval_vars_at_ry = - zip(EQ_p, expected_eval_vars_list).fold(S::field_zero(), |s, (a, b)| s + *a * b); + zip(EQ_p, expected_eval_vars_list).fold(ZERO, |s, (a, b)| s + *a * b); assert_eq!(expected_eval_vars_at_ry, self.eval_vars_at_ry); @@ -737,6 +728,6 @@ impl R1CSProof { // verify proof that expected_claim_post_phase2 == claim_post_phase2 assert_eq!(claim_post_phase_2, expected_claim_post_phase2); - Ok([rp, rq_rev, rx, [rw, ry].concat()]) + Ok([rp, rq, rx, [rw, ry].concat()]) } } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index 90f376eb..b03297c8 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -1,7 +1,6 @@ #![allow(clippy::type_complexity)] #![allow(clippy::too_many_arguments)] #![allow(clippy::needless_range_loop)] -use crate::custom_dense_mlpoly::rev_bits; use crate::scalar::SpartanExtensionField; use super::dense_mlpoly::DensePolynomial; @@ -409,8 +408,6 @@ impl SparseMatPolynomial { max_num_cols: usize, _num_cols: usize, z: &Vec>, - x_rev_map: &Vec, - y_rev_map: &Vec, ) -> Vec { (0..self.M.len()) .map(|i| { @@ -419,10 +416,10 @@ impl SparseMatPolynomial { let val = self.M[i].val.clone(); let w = col / max_num_cols; let y = col % max_num_cols; - (row, val * z[w][y_rev_map[y]]) + (row, val * z[w][y]) }) .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { - Mz[x_rev_map[r]] += v; + Mz[r] += v; Mz }) } diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index 57b11cf4..d096c01d 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -6,7 +6,6 @@ use crate::scalar::SpartanExtensionField; use super::dense_mlpoly::DensePolynomial; use super::errors::ProofVerifyError; -use super::random::RandomTape; use super::transcript::{AppendToTranscript, ProofTranscript}; use super::unipoly::{CompressedUniPoly, UniPoly}; use itertools::izip; @@ -317,7 +316,7 @@ impl SumcheckInstanceProof { claims_dotp, ) } - + pub fn prove_cubic_disjoint_rounds( claim: &S, num_rounds: usize, @@ -336,6 +335,8 @@ impl SumcheckInstanceProof { where F: Fn(&S, &S, &S) -> S, { + let ZERO = S::field_zero(); + // NOTE: if single_inst, number of instances in poly_B is 1, might not match with instance_len! // NOTE: num_proofs must be 1! // We perform sumcheck in y -> w -> p order, but all polynomials have parameters (p, w, y) @@ -393,9 +394,9 @@ impl SumcheckInstanceProof { }; let poly = { - let mut eval_point_0 = S::field_zero(); - let mut eval_point_2 = S::field_zero(); - let mut eval_point_3 = S::field_zero(); + let mut eval_point_0 = ZERO; + let mut eval_point_2 = ZERO; + let mut eval_point_3 = ZERO; // We are guaranteed initially instance_len < num_inputs.len() < instance_len x 2 // So min(instance_len, num_proofs.len()) suffices @@ -406,60 +407,42 @@ impl SumcheckInstanceProof { } for w in 0..min(witness_secs_len, num_witness_secs) { for y in 0..num_inputs[p] { - // evaluate A on p, w, y - let poly_A_index_p_w_y = poly_A[p]; - - // evaluate A on p_high, q_high, x_high - let poly_A_index_high_p_w_y = match mode { - MODE_P => poly_A[p + instance_len], - MODE_W => poly_A[p], - MODE_X => poly_A[p], - _ => { - panic!( - "DensePolynomialPqx bound failed: unrecognized mode {}!", - mode - ); - } + // evaluate A, B, C on p, w, y + let (poly_A_low, poly_A_high) = match mode { + MODE_X => (poly_A[p], poly_A[p]), + MODE_W => (poly_A[p], poly_A[p]), + MODE_P => (poly_A[2 * p], poly_A[2 * p + 1]), + _ => unreachable!() }; + let poly_B_low = poly_B.index_low(p_inst, 0, w, y, mode); + let poly_B_high = poly_B.index_high(p_inst, 0, w, y, mode); + let poly_C_low = poly_C.index_low(p, 0, w, y, mode); + let poly_C_high = poly_C.index_high(p, 0, w, y, mode); // eval 0: bound_func is A(low) - eval_point_0 = eval_point_0 - + comb_func( - &poly_A_index_p_w_y, - &poly_B.index(p_inst, 0, w, y), - &poly_C.index(p, 0, w, y), - ); // Az[0, x, x, x, ...] + eval_point_0 = eval_point_0 + comb_func(&poly_A_low, &poly_B_low, &poly_C_low); // Az[x, x, x, ..., 0] // eval 2: bound_func is -A(low) + 2*A(high) - let poly_A_bound_point = - poly_A_index_high_p_w_y + poly_A_index_high_p_w_y - poly_A_index_p_w_y; - let poly_B_bound_point = poly_B.index_high(p_inst, 0, w, y, mode) - + poly_B.index_high(p_inst, 0, w, y, mode) - - poly_B.index(p_inst, 0, w, y); // Az[2, x, x, ...] - let poly_C_bound_point = poly_C.index_high(p, 0, w, y, mode) - + poly_C.index_high(p, 0, w, y, mode) - - poly_C.index(p, 0, w, y); + let poly_A_bound_point = poly_A_high + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_high + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_high + poly_C_high - poly_C_low; eval_point_2 = eval_point_2 + comb_func( &poly_A_bound_point, &poly_B_bound_point, &poly_C_bound_point, - ); + ); // Az[x, x, ..., 2] // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) - let poly_A_bound_point = - poly_A_bound_point + poly_A_index_high_p_w_y - poly_A_index_p_w_y; - let poly_B_bound_point = poly_B_bound_point - + poly_B.index_high(p_inst, 0, w, y, mode) - - poly_B.index(p_inst, 0, w, y); // Az[3, x, x, ...] - let poly_C_bound_point = - poly_C_bound_point + poly_C.index_high(p, 0, w, y, mode) - poly_C.index(p, 0, w, y); + let poly_A_bound_point = poly_A_bound_point + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_bound_point + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_bound_point + poly_C_high - poly_C_low; eval_point_3 = eval_point_3 + comb_func( &poly_A_bound_point, &poly_B_bound_point, &poly_C_bound_point, - ); + ); // Az[x, x, ..., 3] } } } @@ -484,7 +467,7 @@ impl SumcheckInstanceProof { // bound all tables to the verifier's challenege if mode == MODE_P { - poly_A.bound_poly_var_top(&r_j); + poly_A.bound_poly_var_bot(&r_j); } if mode != MODE_P || !single_inst { poly_B.bound_poly(&r_j, mode); @@ -525,6 +508,8 @@ impl SumcheckInstanceProof { where F: Fn(&S, &S, &S, &S) -> S, { + let ZERO = S::field_zero(); + // Note: num_witness_secs must be 1! // We perform sumcheck in x -> q_rev -> p order, but all polynomials have parameters (p, q, x) // poly_A is the EQ polynomial of size P * Q_max * X @@ -555,14 +540,10 @@ impl SumcheckInstanceProof { println!("\nNEW INSTANCE"); let mut expected = ZERO; for p in 0..min(instance_len, num_proofs.len()) { - let step_q = proof_len / num_proofs[p]; - let step_x = cons_len / num_cons[p]; - for q_rev in 0..num_proofs[p] { - for x_rev in 0..num_cons[p] { - let val = poly_Ap[p] * poly_Aq[q_rev * step_q] * poly_Ax[x_rev * step_x] * (poly_B.index(p, q_rev, 0, x_rev) * poly_C.index(p, q_rev, 0, x_rev) - poly_D.index(p, q_rev, 0, x_rev)); - let q = rev_bits(q_rev * step_q, proof_len); - let x = rev_bits(x_rev * step_x, cons_len); - if val != ZERO { println!("p: {}, q: {}, x: {}, val: {:?}", p, q, x, val); } + for q in 0..num_proofs[p] { + for x in 0..num_cons[p] { + let val = poly_Ap[p] * poly_Aq[q] * poly_Ax[x] * (poly_B.index(p, q, 0, x) * poly_C.index(p, q, 0, x) - poly_D.index(p, q, 0, x)); + // if val != ZERO { println!("p: {}, q: {}, x: {}, val: {:?}", p, q, x, val); } expected += val; } } @@ -593,9 +574,9 @@ impl SumcheckInstanceProof { }; let poly = { - let mut eval_point_0 = S::field_zero(); - let mut eval_point_2 = S::field_zero(); - let mut eval_point_3 = S::field_zero(); + let mut eval_point_0 = ZERO; + let mut eval_point_2 = ZERO; + let mut eval_point_3 = ZERO; // We are guaranteed initially instance_len < num_proofs.len() < instance_len x 2 // So min(instance_len, num_proofs.len()) suffices @@ -608,70 +589,64 @@ impl SumcheckInstanceProof { num_proofs[p] /= 2; } for q in 0..num_proofs[p] { - let step_q = proof_len / num_proofs[p]; - let step_x = cons_len / num_cons[p]; for x in 0..num_cons[p] { - // evaluate Ap, Aq, Ax on p, q, x - let poly_A_index_p_q_x = poly_Ap[p] * poly_Aq[q * step_q] * poly_Ax[x * step_x]; - - // evaluate Ap, Aq, Ax on p_high, q_high, x_high - let poly_A_index_high_p_q_x = match mode { - MODE_P => poly_Ap[p + instance_len] * poly_Aq[q * step_q] * poly_Ax[x * step_x], - MODE_Q => poly_Ap[p] * poly_Aq[q * step_q + proof_len] * poly_Ax[x * step_x], - MODE_X => poly_Ap[p] * poly_Aq[q * step_q] * poly_Ax[x * step_x + cons_len], - _ => { - panic!( - "DensePolynomialPqx bound failed: unrecognized mode {}!", - mode - ); - } + // evaluate A, B, C, D on p, q, x + let (poly_A_low, poly_A_high) = match mode { + MODE_X => ( + poly_Ap[p] * poly_Aq[q] * poly_Ax[2 * x], + poly_Ap[p] * poly_Aq[q] * poly_Ax[2 * x + 1], + ), + MODE_Q => ( + poly_Ap[p] * poly_Aq[2 * q] * poly_Ax[x], + poly_Ap[p] * poly_Aq[2 * q + 1] * poly_Ax[x], + ), + MODE_P => ( + poly_Ap[2 * p] * poly_Aq[q] * poly_Ax[x], + poly_Ap[2 * p + 1] * poly_Aq[q] * poly_Ax[x], + ), + _ => unreachable!() }; + let poly_B_low = poly_B.index_low(p, q, 0, x, mode); + let poly_B_high = poly_B.index_high(p, q, 0, x, mode); + let poly_C_low = poly_C.index_low(p, q, 0, x, mode); + let poly_C_high = poly_C.index_high(p, q, 0, x, mode); + let poly_D_low = poly_D.index_low(p, q, 0, x, mode); + let poly_D_high = poly_D.index_high(p, q, 0, x, mode); // eval 0: bound_func is A(low) eval_point_0 = eval_point_0 + comb_func( - &poly_A_index_p_q_x, - &poly_B.index(p, q, 0, x), - &poly_C.index(p, q, 0, x), - &poly_D.index(p, q, 0, x), - ); // Az[0, x, x, x, ...] + &poly_A_low, + &poly_B_low, + &poly_C_low, + &poly_D_low, + ); // Az[x, x, x, ..., 0] // eval 2: bound_func is -A(low) + 2*A(high) - let poly_A_bound_point = - poly_A_index_high_p_q_x + poly_A_index_high_p_q_x - poly_A_index_p_q_x; - let poly_B_bound_point = poly_B.index_high(p, q, 0, x, mode) - + poly_B.index_high(p, q, 0, x, mode) - - poly_B.index(p, q, 0, x); // Az[2, x, x, ...] - let poly_C_bound_point = poly_C.index_high(p, q, 0, x, mode) - + poly_C.index_high(p, q, 0, x, mode) - - poly_C.index(p, q, 0, x); - let poly_D_bound_point = poly_D.index_high(p, q, 0, x, mode) - + poly_D.index_high(p, q, 0, x, mode) - - poly_D.index(p, q, 0, x); + let poly_A_bound_point = poly_A_high + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_high + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_high + poly_C_high - poly_C_low; + let poly_D_bound_point = poly_D_high + poly_D_high - poly_D_low; eval_point_2 = eval_point_2 + comb_func( &poly_A_bound_point, &poly_B_bound_point, &poly_C_bound_point, &poly_D_bound_point, - ); + ); // Az[x, x, ..., 2] // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) - let poly_A_bound_point = - poly_A_bound_point + poly_A_index_high_p_q_x - poly_A_index_p_q_x; - let poly_B_bound_point = - poly_B_bound_point + poly_B.index_high(p, q, 0, x, mode) - poly_B.index(p, q, 0, x); // Az[3, x, x, ...] - let poly_C_bound_point = - poly_C_bound_point + poly_C.index_high(p, q, 0, x, mode) - poly_C.index(p, q, 0, x); - let poly_D_bound_point = - poly_D_bound_point + poly_D.index_high(p, q, 0, x, mode) - poly_D.index(p, q, 0, x); + let poly_A_bound_point = poly_A_bound_point + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_bound_point + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_bound_point + poly_C_high - poly_C_low; + let poly_D_bound_point = poly_D_bound_point + poly_D_high - poly_D_low; eval_point_3 = eval_point_3 + comb_func( &poly_A_bound_point, &poly_B_bound_point, &poly_C_bound_point, &poly_D_bound_point, - ); + ); // Az[x, x, ..., 3] } } } @@ -694,12 +669,14 @@ impl SumcheckInstanceProof { r.push(r_j); // bound all tables to the verifier's challenege - if mode == 1 { - poly_Ap.bound_poly_var_top(&r_j); - } else if mode == 2 { - poly_Aq.bound_poly_var_top(&r_j); + if mode == MODE_X { + poly_Ax.bound_poly_var_bot(&r_j); + } else if mode == MODE_Q { + poly_Aq.bound_poly_var_bot(&r_j); + } else if mode == MODE_P { + poly_Ap.bound_poly_var_bot(&r_j); } else { - poly_Ax.bound_poly_var_top(&r_j); + unreachable!() } poly_B.bound_poly(&r_j, mode); poly_C.bound_poly(&r_j, mode); From 3d8f012603f53e60cc008648ece5ced030b45640 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Tue, 24 Dec 2024 20:04:38 -0500 Subject: [PATCH 28/54] Add parallelism to z_mat_gen --- spartan_parallel/src/r1csproof.rs | 49 +++++++++++++------ .../poseidon_test/poseidon_const.zok | 2 +- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index b6a9b2ae..cb74bb65 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -11,8 +11,10 @@ use crate::scalar::SpartanExtensionField; use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; use merlin::Transcript; use serde::{Deserialize, Serialize}; -use std::cmp::min; +use std::cmp::max; use std::iter::zip; +use rayon::prelude::*; +use std::sync::{Arc, Mutex}; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { @@ -181,21 +183,36 @@ impl R1CSProof { // append input to variables to create a single vector z let timer_tmp = Timer::new("prove_z_mat_gen"); - let mut z_mat: Vec>>> = Vec::new(); - for p in 0..num_instances { - z_mat.push(vec![vec![vec![ZERO; num_inputs[p]]; num_witness_secs]; num_proofs[p]]); - for q in 0..num_proofs[p] { - for w in 0..witness_secs.len() { - let ws = witness_secs[w]; - let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; - let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; - // Only append the first num_inputs_entries of w_mat[p][q] - for i in 0..min(ws.num_inputs[p_w], num_inputs[p]) { - z_mat[p][q][w][i] = ws.w_mat[p_w][q_w][i]; - } - } - } - } + + let z_mat = (0..num_instances) + .into_par_iter() + .map(|p| { + (0..num_proofs[p]) + .into_par_iter() + .map(|q| { + (0..witness_secs.len()) + .into_par_iter() + .map(|w| { + let ws = witness_secs[w]; + let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; + let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; + + let r_w = if ws.num_inputs[p_w] < num_inputs[p] { + let padding = std::iter::repeat(S::field_zero()).take(num_inputs[p] - ws.num_inputs[p_w]).collect::>(); + let mut r = ws.w_mat[p_w][q_w].clone(); + r.extend(padding); + r + } else { + ws.w_mat[p_w][q_w].iter().take(num_inputs[p]).cloned().collect::>() + }; + + r_w + }) + .collect::>>() + }) + .collect::>>>() + }) + .collect::>>>>(); timer_tmp.stop(); // derive the verifier's challenge \tau diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index ac6bfc99..e7ae59fb 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 10000 +const u32 REPETITION = 1000 From 611efe1142c44de6d535ee446c75fa311409e21a Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Wed, 25 Dec 2024 04:00:11 -0500 Subject: [PATCH 29/54] Parallelize bound_poly_vars_rq --- spartan_parallel/src/custom_dense_mlpoly.rs | 75 ++++++++++++++++----- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index d73fb2c7..73a3b68e 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -3,6 +3,7 @@ use std::cmp::min; use crate::dense_mlpoly::DensePolynomial; use crate::scalar::SpartanExtensionField; +use rayon::prelude::*; const MODE_P: usize = 1; const MODE_Q: usize = 2; @@ -128,27 +129,27 @@ impl DensePolynomialPqx { // Bound the last variable of "q" section to r pub fn bound_poly_q(&mut self, r: &S) { - let ONE = S::field_one(); - self.max_num_proofs /= 2; + let ONE = S::field_one(); + self.max_num_proofs /= 2; - for p in 0..min(self.num_instances, self.Z.len()) { - if self.num_proofs[p] == 1 { - for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][0][w][x] *= ONE - r.clone(); - } + for p in 0..min(self.num_instances, self.Z.len()) { + if self.num_proofs[p] == 1 { + for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { + for x in 0..self.num_inputs[p] { + self.Z[p][0][w][x] *= ONE - r.clone(); } - } else { - self.num_proofs[p] /= 2; - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][q][w][x] = self.Z[p][2 * q][w][x] + r.clone() * (self.Z[p][2 * q + 1][w][x] - self.Z[p][2 * q][w][x]); - } + } + } else { + self.num_proofs[p] /= 2; + for q in 0..self.num_proofs[p] { + for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { + for x in 0..self.num_inputs[p] { + self.Z[p][q][w][x] = self.Z[p][2 * q][w][x] + r.clone() * (self.Z[p][2 * q + 1][w][x] - self.Z[p][2 * q][w][x]); } } } } + } } // Bound the last variable of "w" section to r @@ -208,9 +209,47 @@ impl DensePolynomialPqx { pub fn bound_poly_vars_rq(&mut self, r_q: &[S], ) { - for r in r_q { - self.bound_poly_q(r); - } + let ONE = S::field_one(); + let num_instances = min(self.num_instances, self.Z.len()); + + self.Z = (0..num_instances) + .into_par_iter() + .map(|p| { + let num_proofs = self.num_proofs[p]; + let num_witness_secs = min(self.num_witness_secs, self.Z[p][0].len()); + let num_inputs = self.num_inputs[p]; + + let wit = (0..num_witness_secs).into_par_iter().map(|w| { + (0..num_inputs).into_par_iter().map(|x| { + let mut np = num_proofs; + let mut x_fold = (0..num_proofs).map(|q| self.Z[p][q][w][x]).collect::>(); + for r in r_q { + if np == 1 { + x_fold[0] *= ONE - *r; + } else { + np /= 2; + for q in 0..np { + x_fold[q] = x_fold[2 * q] + *r * (x_fold[2 * q + 1] - x_fold[2 * q]); + } + } + } + + x_fold + }).collect::>>() + }).collect::>>>(); + + (0..num_proofs) + .into_par_iter() + .map(|q| { + (0..wit.len()).map(|w| { + (0..wit[w].len()).map(|x| { + wit[w][x][q] + }).collect::>() + }).collect::>>() + }).collect::>>>() + }).collect::>>>>(); + + self.max_num_proofs /= 2usize.pow(r_q.len() as u32); } // Bound the entire "w" section to r_w in reverse From 142134dd69aeb83d1d77ccdb111fc23b5d705ce7 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Thu, 26 Dec 2024 23:44:51 -0500 Subject: [PATCH 30/54] Adjust parallelism task level --- spartan_parallel/src/r1csproof.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index cb74bb65..ca83af68 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -191,7 +191,6 @@ impl R1CSProof { .into_par_iter() .map(|q| { (0..witness_secs.len()) - .into_par_iter() .map(|w| { let ws = witness_secs[w]; let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; From 32a2d7caffdebd678bed673896ce72c04017de0e Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Fri, 27 Dec 2024 03:03:52 -0500 Subject: [PATCH 31/54] Alternative folding scheme for bound_poly_vars_rq --- spartan_parallel/src/custom_dense_mlpoly.rs | 94 +++++++++++++++------ 1 file changed, 68 insertions(+), 26 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 73a3b68e..26ca6dbe 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -9,6 +9,7 @@ const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; const MODE_X: usize = 4; +const NUM_MULTI_THREAD_CORES: usize = 8; // Customized Dense ML Polynomials for Data-Parallelism // These Dense ML Polys are aimed for space-efficiency by removing the 0s for invalid (p, q, w, x) quadruple @@ -209,47 +210,88 @@ impl DensePolynomialPqx { pub fn bound_poly_vars_rq(&mut self, r_q: &[S], ) { - let ONE = S::field_one(); let num_instances = min(self.num_instances, self.Z.len()); + fn recur(idx: usize, lvl: usize, w: usize, x: usize, env: &( + &Vec>>, // self.Z[p] + &[S], // r_q + &usize, // start_idx + )) -> S { + if lvl > 0 { + (S::field_one() - env.1[lvl]) * recur(2 * idx, lvl - 1, w, x, env) + env.1[lvl] * recur(2 * idx + 1, lvl - 1, w, x, env) + } else { + env.0[env.2 + idx][w][x] + } + } + self.Z = (0..num_instances) - .into_par_iter() + // .into_par_iter() .map(|p| { let num_proofs = self.num_proofs[p]; + let dist_size = num_proofs / min(num_proofs, NUM_MULTI_THREAD_CORES); + let num_threads = num_proofs / dist_size; + + // To perform rigorous 2-fold parallelism, both num_proofs and # cores must be powers of 2 + // # cores must fully divide num_proofs for even distribution + assert!(num_proofs & (num_proofs - 1) == 0); + assert!(num_threads & (num_threads - 1) == 0); + + // debug_parallelism + println!("num_proofs: {:?}, num_threads: {:?}", num_proofs, num_threads); + + // Determine the aggregation levels that will be performed in parallel + // The last rounds of aggregation will be done in single core + let levels = num_proofs.trailing_zeros() as usize; + let sub_levels = dist_size.trailing_zeros() as usize; + let final_levels = num_threads.trailing_zeros() as usize; + let left_over_q_len = r_q.len() - levels; + + // debug_parallelism + println!("levels: {:?}, sub_levels: {:?}, final_levels: {:?}, left_over_q_len: {:?}", levels, sub_levels, final_levels, left_over_q_len); + let num_witness_secs = min(self.num_witness_secs, self.Z[p][0].len()); let num_inputs = self.num_inputs[p]; - let wit = (0..num_witness_secs).into_par_iter().map(|w| { - (0..num_inputs).into_par_iter().map(|x| { - let mut np = num_proofs; - let mut x_fold = (0..num_proofs).map(|q| self.Z[p][q][w][x]).collect::>(); - for r in r_q { - if np == 1 { - x_fold[0] *= ONE - *r; - } else { - np /= 2; - for q in 0..np { - x_fold[q] = x_fold[2 * q] + *r * (x_fold[2 * q + 1] - x_fold[2 * q]); - } - } - } - - x_fold - }).collect::>>() - }).collect::>>>(); + // debug_parallelism + println!("num_witness_secs: {:?}, num_inputs: {:?}", num_witness_secs, num_inputs); - (0..num_proofs) + let mut sub_mats = if sub_levels > 0 { + std::iter::successors(Some(0usize), move |&x| Some(x + dist_size)) + .take(NUM_MULTI_THREAD_CORES) + .collect::>() .into_par_iter() - .map(|q| { - (0..wit.len()).map(|w| { - (0..wit[w].len()).map(|x| { - wit[w][x][q] + .map(|start_idx| { + (0..num_witness_secs).map(|w| { + (0..num_inputs).map(|x| { + recur(0, sub_levels, w, x, &(&self.Z[p], r_q, &start_idx)) }).collect::>() }).collect::>>() }).collect::>>>() + } else { + self.Z[p].clone() + }; + + if final_levels > 0 { + sub_mats[0] = (0..num_witness_secs).map(|w| { + (0..num_inputs).map(|x| { + recur(0, final_levels, w, x, &(&sub_mats, r_q, &0)) + }).collect::>() + }).collect::>>() + } + + if left_over_q_len > 0 { + let c = r_q[(r_q.len() - left_over_q_len)..r_q.len()].iter().fold(S::field_one(), |acc, n| acc * (S::field_one() - *n)); + for w in 0..sub_mats[0].len() { + for x in 0..sub_mats[0][0].len() { + sub_mats[0][w][x] *= c; + } + } + } + + sub_mats }).collect::>>>>(); - self.max_num_proofs /= 2usize.pow(r_q.len() as u32); + self.max_num_proofs /= 2usize.pow(r_q.len() as u32); } // Bound the entire "w" section to r_w in reverse From 36b8d6c51ca3a78083a52b651cc79a3b6b9fb206 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Sat, 28 Dec 2024 00:16:59 -0500 Subject: [PATCH 32/54] Revert "Alternative folding scheme for bound_poly_vars_rq" This reverts commit 32a2d7caffdebd678bed673896ce72c04017de0e. --- spartan_parallel/src/custom_dense_mlpoly.rs | 94 ++++++--------------- 1 file changed, 26 insertions(+), 68 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 26ca6dbe..73a3b68e 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -9,7 +9,6 @@ const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; const MODE_X: usize = 4; -const NUM_MULTI_THREAD_CORES: usize = 8; // Customized Dense ML Polynomials for Data-Parallelism // These Dense ML Polys are aimed for space-efficiency by removing the 0s for invalid (p, q, w, x) quadruple @@ -210,88 +209,47 @@ impl DensePolynomialPqx { pub fn bound_poly_vars_rq(&mut self, r_q: &[S], ) { + let ONE = S::field_one(); let num_instances = min(self.num_instances, self.Z.len()); - fn recur(idx: usize, lvl: usize, w: usize, x: usize, env: &( - &Vec>>, // self.Z[p] - &[S], // r_q - &usize, // start_idx - )) -> S { - if lvl > 0 { - (S::field_one() - env.1[lvl]) * recur(2 * idx, lvl - 1, w, x, env) + env.1[lvl] * recur(2 * idx + 1, lvl - 1, w, x, env) - } else { - env.0[env.2 + idx][w][x] - } - } - self.Z = (0..num_instances) - // .into_par_iter() + .into_par_iter() .map(|p| { let num_proofs = self.num_proofs[p]; - let dist_size = num_proofs / min(num_proofs, NUM_MULTI_THREAD_CORES); - let num_threads = num_proofs / dist_size; - - // To perform rigorous 2-fold parallelism, both num_proofs and # cores must be powers of 2 - // # cores must fully divide num_proofs for even distribution - assert!(num_proofs & (num_proofs - 1) == 0); - assert!(num_threads & (num_threads - 1) == 0); - - // debug_parallelism - println!("num_proofs: {:?}, num_threads: {:?}", num_proofs, num_threads); - - // Determine the aggregation levels that will be performed in parallel - // The last rounds of aggregation will be done in single core - let levels = num_proofs.trailing_zeros() as usize; - let sub_levels = dist_size.trailing_zeros() as usize; - let final_levels = num_threads.trailing_zeros() as usize; - let left_over_q_len = r_q.len() - levels; - - // debug_parallelism - println!("levels: {:?}, sub_levels: {:?}, final_levels: {:?}, left_over_q_len: {:?}", levels, sub_levels, final_levels, left_over_q_len); - let num_witness_secs = min(self.num_witness_secs, self.Z[p][0].len()); let num_inputs = self.num_inputs[p]; - // debug_parallelism - println!("num_witness_secs: {:?}, num_inputs: {:?}", num_witness_secs, num_inputs); + let wit = (0..num_witness_secs).into_par_iter().map(|w| { + (0..num_inputs).into_par_iter().map(|x| { + let mut np = num_proofs; + let mut x_fold = (0..num_proofs).map(|q| self.Z[p][q][w][x]).collect::>(); + for r in r_q { + if np == 1 { + x_fold[0] *= ONE - *r; + } else { + np /= 2; + for q in 0..np { + x_fold[q] = x_fold[2 * q] + *r * (x_fold[2 * q + 1] - x_fold[2 * q]); + } + } + } + + x_fold + }).collect::>>() + }).collect::>>>(); - let mut sub_mats = if sub_levels > 0 { - std::iter::successors(Some(0usize), move |&x| Some(x + dist_size)) - .take(NUM_MULTI_THREAD_CORES) - .collect::>() + (0..num_proofs) .into_par_iter() - .map(|start_idx| { - (0..num_witness_secs).map(|w| { - (0..num_inputs).map(|x| { - recur(0, sub_levels, w, x, &(&self.Z[p], r_q, &start_idx)) + .map(|q| { + (0..wit.len()).map(|w| { + (0..wit[w].len()).map(|x| { + wit[w][x][q] }).collect::>() }).collect::>>() }).collect::>>>() - } else { - self.Z[p].clone() - }; - - if final_levels > 0 { - sub_mats[0] = (0..num_witness_secs).map(|w| { - (0..num_inputs).map(|x| { - recur(0, final_levels, w, x, &(&sub_mats, r_q, &0)) - }).collect::>() - }).collect::>>() - } - - if left_over_q_len > 0 { - let c = r_q[(r_q.len() - left_over_q_len)..r_q.len()].iter().fold(S::field_one(), |acc, n| acc * (S::field_one() - *n)); - for w in 0..sub_mats[0].len() { - for x in 0..sub_mats[0][0].len() { - sub_mats[0][w][x] *= c; - } - } - } - - sub_mats }).collect::>>>>(); - self.max_num_proofs /= 2usize.pow(r_q.len() as u32); + self.max_num_proofs /= 2usize.pow(r_q.len() as u32); } // Bound the entire "w" section to r_w in reverse From 485beecfe2aa927968e538a8a7c005060b7a0709 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 30 Dec 2024 03:29:26 -0500 Subject: [PATCH 33/54] Change parallelism scheme for bound_poly_vars_rq --- spartan_parallel/src/custom_dense_mlpoly.rs | 109 ++++++++++++++------ 1 file changed, 75 insertions(+), 34 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 73a3b68e..8c01b8e4 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -9,6 +9,7 @@ const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; const MODE_X: usize = 4; +const NUM_MULTI_THREAD_CORES: usize = 8; // Customized Dense ML Polynomials for Data-Parallelism // These Dense ML Polys are aimed for space-efficiency by removing the 0s for invalid (p, q, w, x) quadruple @@ -206,49 +207,71 @@ impl DensePolynomialPqx { } // Bound the entire "q" section to r_q in reverse - pub fn bound_poly_vars_rq(&mut self, + pub fn bound_poly_vars_rq( + &mut self, r_q: &[S], ) { - let ONE = S::field_one(); - let num_instances = min(self.num_instances, self.Z.len()); + let Z = std::mem::take(&mut self.Z); - self.Z = (0..num_instances) - .into_par_iter() - .map(|p| { + self.Z = Z + .into_iter() + .enumerate() + .map(|(p, mut inst)| { let num_proofs = self.num_proofs[p]; - let num_witness_secs = min(self.num_witness_secs, self.Z[p][0].len()); + let dist_size = num_proofs / min(num_proofs, NUM_MULTI_THREAD_CORES); // distributed number of proofs on each thread + let num_threads = num_proofs / dist_size; + + // To perform rigorous parallelism, both num_proofs and # threads must be powers of 2 + // # threads must fully divide num_proofs for even distribution + assert!(num_proofs & (num_proofs - 1) == 0); + assert!(num_threads & (num_threads - 1) == 0); + + // Determine parallelism levels + let levels = num_proofs.trailing_zeros() as usize; // total layers + let sub_levels = dist_size.trailing_zeros() as usize; // parallelism layers + let final_levels = num_threads.trailing_zeros() as usize; // single core final layers + let left_over_q_len = r_q.len() - levels; // if r_q.len() > log2(num_proofs) + + // single proof matrix dimension W x X + let num_witness_secs = min(self.num_witness_secs, inst[0].len()); let num_inputs = self.num_inputs[p]; - let wit = (0..num_witness_secs).into_par_iter().map(|w| { - (0..num_inputs).into_par_iter().map(|x| { - let mut np = num_proofs; - let mut x_fold = (0..num_proofs).map(|q| self.Z[p][q][w][x]).collect::>(); - for r in r_q { - if np == 1 { - x_fold[0] *= ONE - *r; - } else { - np /= 2; - for q in 0..np { - x_fold[q] = x_fold[2 * q] + *r * (x_fold[2 * q + 1] - x_fold[2 * q]); - } - } + if sub_levels > 0 { + let thread_split_inst = (0..num_threads) + .map(|_| { + inst.split_off(inst.len() - dist_size) + }) + .rev() + .collect::>>>>(); + + inst = thread_split_inst + .into_par_iter() + .map(|mut chunk| { + fold(&mut chunk, r_q, 0, 1, sub_levels, num_witness_secs, num_inputs); + chunk + }) + .collect::>>>>() + .into_iter().flatten().collect() + } + + if final_levels > 0 { + // aggregate the final result from sub-threads outputs using a single core + fold(&mut inst, r_q, 0, dist_size, final_levels, num_witness_secs, num_inputs); + } + + if left_over_q_len > 0 { + // the series of random challenges exceeds the total number of variables + let c = r_q[(r_q.len() - left_over_q_len)..r_q.len()].iter().fold(S::field_one(), |acc, n| acc * (S::field_one() - *n)); + for w in 0..inst[0].len() { + for x in 0..inst[0][0].len() { + inst[0][w][x] *= c; } + } + } - x_fold - }).collect::>>() - }).collect::>>>(); - - (0..num_proofs) - .into_par_iter() - .map(|q| { - (0..wit.len()).map(|w| { - (0..wit[w].len()).map(|x| { - wit[w][x][q] - }).collect::>() - }).collect::>>() - }).collect::>>>() + inst }).collect::>>>>(); - + self.max_num_proofs /= 2usize.pow(r_q.len() as u32); } @@ -304,4 +327,22 @@ impl DensePolynomialPqx { } DensePolynomial::new(Z_poly) } +} + +fn fold(proofs: &mut Vec>>, r_q: &[S], idx: usize, step: usize, lvl: usize, w: usize, x: usize) { + if lvl > 0 { + fold(proofs, r_q, 2 * idx, step, lvl - 1, w, x); + fold(proofs, r_q, 2 * idx + step, step, lvl - 1, w, x); + + let r1 = S::field_one() - r_q[lvl]; + let r2 = r_q[lvl]; + + (0..w).for_each(|w| { + (0..x).for_each(|x| { + proofs[idx][w][x] = r1 * proofs[idx * 2][w][x] + r2 * proofs[idx * 2 + step][w][x]; + }); + }); + } else { + // level 0. do nothing + } } \ No newline at end of file From e064fa2dd1620c1b9e6d1342451ec2bc010bad58 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 30 Dec 2024 03:56:34 -0500 Subject: [PATCH 34/54] Correct randomness indexing --- spartan_parallel/src/custom_dense_mlpoly.rs | 24 +++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 8c01b8e4..b2b3d5ad 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -236,6 +236,12 @@ impl DensePolynomialPqx { let num_witness_secs = min(self.num_witness_secs, inst[0].len()); let num_inputs = self.num_inputs[p]; + // debug + println!("["); + inst.iter().for_each(|mat| println!("{:?}, ", mat[0][0])); + println!("]"); + println!(); + if sub_levels > 0 { let thread_split_inst = (0..num_threads) .map(|_| { @@ -247,7 +253,7 @@ impl DensePolynomialPqx { inst = thread_split_inst .into_par_iter() .map(|mut chunk| { - fold(&mut chunk, r_q, 0, 1, sub_levels, num_witness_secs, num_inputs); + fold(&mut chunk, r_q, 0, 1, sub_levels, 0, num_witness_secs, num_inputs); chunk }) .collect::>>>>() @@ -256,7 +262,7 @@ impl DensePolynomialPqx { if final_levels > 0 { // aggregate the final result from sub-threads outputs using a single core - fold(&mut inst, r_q, 0, dist_size, final_levels, num_witness_secs, num_inputs); + fold(&mut inst, r_q, 0, dist_size, final_levels + sub_levels, sub_levels, num_witness_secs, num_inputs); } if left_over_q_len > 0 { @@ -329,13 +335,13 @@ impl DensePolynomialPqx { } } -fn fold(proofs: &mut Vec>>, r_q: &[S], idx: usize, step: usize, lvl: usize, w: usize, x: usize) { - if lvl > 0 { - fold(proofs, r_q, 2 * idx, step, lvl - 1, w, x); - fold(proofs, r_q, 2 * idx + step, step, lvl - 1, w, x); +fn fold(proofs: &mut Vec>>, r_q: &[S], idx: usize, step: usize, lvl: usize, final_lvl: usize, w: usize, x: usize) { + if lvl > final_lvl { + fold(proofs, r_q, 2 * idx, step, lvl - 1, final_lvl, w, x); + fold(proofs, r_q, 2 * idx + step, step, lvl - 1, final_lvl, w, x); - let r1 = S::field_one() - r_q[lvl]; - let r2 = r_q[lvl]; + let r1 = S::field_one() - r_q[lvl - 1]; + let r2 = r_q[lvl - 1]; (0..w).for_each(|w| { (0..x).for_each(|x| { @@ -343,6 +349,6 @@ fn fold(proofs: &mut Vec>>, r_q: &[S], idx: }); }); } else { - // level 0. do nothing + // base level. do nothing } } \ No newline at end of file From b7b95cdaca4537f0067c0b20784e98aea4b0baf4 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 30 Dec 2024 03:58:38 -0500 Subject: [PATCH 35/54] Add thread count for server test --- spartan_parallel/src/custom_dense_mlpoly.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index b2b3d5ad..b817cf24 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -9,7 +9,7 @@ const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; const MODE_X: usize = 4; -const NUM_MULTI_THREAD_CORES: usize = 8; +const NUM_MULTI_THREAD_CORES: usize = 32; // Customized Dense ML Polynomials for Data-Parallelism // These Dense ML Polys are aimed for space-efficiency by removing the 0s for invalid (p, q, w, x) quadruple From c7508d33ab2f49fe7682682b0985e2c68dc6ba94 Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 30 Dec 2024 04:02:01 -0500 Subject: [PATCH 36/54] Remove debug flag --- spartan_parallel/src/custom_dense_mlpoly.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index b817cf24..1087cb53 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -235,13 +235,7 @@ impl DensePolynomialPqx { // single proof matrix dimension W x X let num_witness_secs = min(self.num_witness_secs, inst[0].len()); let num_inputs = self.num_inputs[p]; - - // debug - println!("["); - inst.iter().for_each(|mat| println!("{:?}, ", mat[0][0])); - println!("]"); - println!(); - + if sub_levels > 0 { let thread_split_inst = (0..num_threads) .map(|_| { From 3209b9f1d9633738d1efe6cde59311b64c16e1cf Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 30 Dec 2024 12:19:32 -0500 Subject: [PATCH 37/54] Fixed multicore for z_bind --- spartan_parallel/src/custom_dense_mlpoly.rs | 116 +++++++++++------- spartan_parallel/src/r1csproof.rs | 51 ++++---- .../poseidon_test/poseidon_const.zok | 2 +- 3 files changed, 96 insertions(+), 73 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 1087cb53..d59cabe9 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -2,6 +2,7 @@ use std::cmp::min; use crate::dense_mlpoly::DensePolynomial; +use crate::math::Math; use crate::scalar::SpartanExtensionField; use rayon::prelude::*; @@ -9,7 +10,6 @@ const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; const MODE_X: usize = 4; -const NUM_MULTI_THREAD_CORES: usize = 32; // Customized Dense ML Polynomials for Data-Parallelism // These Dense ML Polys are aimed for space-efficiency by removing the 0s for invalid (p, q, w, x) quadruple @@ -30,6 +30,40 @@ pub struct DensePolynomialPqx { // The same applies to X } +fn fold_rq(proofs: &mut [Vec>], r_q: &[S], step: usize, mut q: usize, w: usize, x: usize) { + for r in r_q { + let r1 = S::field_one() - r.clone(); + let r2 = r.clone(); + + q = q.div_ceil(2); + (0..q).for_each(|q| { + (0..w).for_each(|w| { + (0..x).for_each(|x| { + proofs[q * step][w][x] = r1 * proofs[2 * q * step][w][x] + r2 * proofs[(2 * q + 1) * step][w][x]; + }); + }); + }); + } + + /* + if lvl > final_lvl { + fold_rq(proofs, r_q, 2 * idx, step, lvl - 1, final_lvl, w, x); + fold_rq(proofs, r_q, 2 * idx + step, step, lvl - 1, final_lvl, w, x); + + let r1 = S::field_one() - r_q[lvl - 1]; + let r2 = r_q[lvl - 1]; + + (0..w).for_each(|w| { + (0..x).for_each(|x| { + proofs[idx][w][x] = r1 * proofs[idx * 2][w][x] + r2 * proofs[idx * 2 + step][w][x]; + }); + }); + } else { + // base level. do nothing + } + */ +} + impl DensePolynomialPqx { // Assume z_mat is of form (p, q_rev, x_rev), construct DensePoly pub fn new( @@ -207,7 +241,7 @@ impl DensePolynomialPqx { } // Bound the entire "q" section to r_q in reverse - pub fn bound_poly_vars_rq( + pub fn bound_poly_vars_rq_parallel( &mut self, r_q: &[S], ) { @@ -218,50 +252,47 @@ impl DensePolynomialPqx { .enumerate() .map(|(p, mut inst)| { let num_proofs = self.num_proofs[p]; - let dist_size = num_proofs / min(num_proofs, NUM_MULTI_THREAD_CORES); // distributed number of proofs on each thread + let dist_size = num_proofs / min(num_proofs, rayon::current_num_threads().next_power_of_two()); // distributed number of proofs on each thread let num_threads = num_proofs / dist_size; // To perform rigorous parallelism, both num_proofs and # threads must be powers of 2 // # threads must fully divide num_proofs for even distribution - assert!(num_proofs & (num_proofs - 1) == 0); - assert!(num_threads & (num_threads - 1) == 0); + assert_eq!(num_proofs, num_proofs.next_power_of_two()); + assert_eq!(num_threads, num_threads.next_power_of_two()); // Determine parallelism levels - let levels = num_proofs.trailing_zeros() as usize; // total layers - let sub_levels = dist_size.trailing_zeros() as usize; // parallelism layers - let final_levels = num_threads.trailing_zeros() as usize; // single core final layers + let levels = num_proofs.log_2(); // total layers + let sub_levels = dist_size.log_2(); // parallel layers + let final_levels = num_threads.log_2(); // single core final layers let left_over_q_len = r_q.len() - levels; // if r_q.len() > log2(num_proofs) // single proof matrix dimension W x X let num_witness_secs = min(self.num_witness_secs, inst[0].len()); let num_inputs = self.num_inputs[p]; - + + // Divide rq into sub, final, and left_over + let sub_rq = &r_q[0..sub_levels]; + let final_rq = &r_q[sub_levels..levels]; + let left_over_rq = &r_q[(r_q.len() - left_over_q_len)..r_q.len()]; + if sub_levels > 0 { - let thread_split_inst = (0..num_threads) - .map(|_| { - inst.split_off(inst.len() - dist_size) + inst = inst + .par_chunks_mut(dist_size) + .map(|chunk| { + fold_rq(chunk, sub_rq, 1, dist_size, num_witness_secs, num_inputs); + chunk.to_vec() }) - .rev() - .collect::>>>>(); - - inst = thread_split_inst - .into_par_iter() - .map(|mut chunk| { - fold(&mut chunk, r_q, 0, 1, sub_levels, 0, num_witness_secs, num_inputs); - chunk - }) - .collect::>>>>() - .into_iter().flatten().collect() + .flatten().collect() } if final_levels > 0 { // aggregate the final result from sub-threads outputs using a single core - fold(&mut inst, r_q, 0, dist_size, final_levels + sub_levels, sub_levels, num_witness_secs, num_inputs); + fold_rq(&mut inst, final_rq, dist_size, num_threads, num_witness_secs, num_inputs); } if left_over_q_len > 0 { // the series of random challenges exceeds the total number of variables - let c = r_q[(r_q.len() - left_over_q_len)..r_q.len()].iter().fold(S::field_one(), |acc, n| acc * (S::field_one() - *n)); + let c = left_over_rq.into_iter().fold(S::field_one(), |acc, n| acc * (S::field_one() - *n)); for w in 0..inst[0].len() { for x in 0..inst[0][0].len() { inst[0][w][x] *= c; @@ -275,6 +306,23 @@ impl DensePolynomialPqx { self.max_num_proofs /= 2usize.pow(r_q.len() as u32); } + // Bound the entire "q" section to r_q in reverse + // Must occur after r_q's are bounded + pub fn bound_poly_vars_rq(&mut self, + r_q: &[S], + ) { + let mut count = 0; + for r in r_q { + self.bound_poly_q(r); + count += 1; + if count == 10 { + for p in 0..self.Z.len() { + println!("SINGLE CORE: P: {}, INST0: {:?}", p, self.Z[p][0][0][0]); + } + } + } + } + // Bound the entire "w" section to r_w in reverse pub fn bound_poly_vars_rw(&mut self, r_w: &[S], @@ -327,22 +375,4 @@ impl DensePolynomialPqx { } DensePolynomial::new(Z_poly) } -} - -fn fold(proofs: &mut Vec>>, r_q: &[S], idx: usize, step: usize, lvl: usize, final_lvl: usize, w: usize, x: usize) { - if lvl > final_lvl { - fold(proofs, r_q, 2 * idx, step, lvl - 1, final_lvl, w, x); - fold(proofs, r_q, 2 * idx + step, step, lvl - 1, final_lvl, w, x); - - let r1 = S::field_one() - r_q[lvl - 1]; - let r2 = r_q[lvl - 1]; - - (0..w).for_each(|w| { - (0..x).for_each(|x| { - proofs[idx][w][x] = r1 * proofs[idx * 2][w][x] + r2 * proofs[idx * 2 + step][w][x]; - }); - }); - } else { - // base level. do nothing - } } \ No newline at end of file diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index ca83af68..175666a6 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -184,34 +184,25 @@ impl R1CSProof { // append input to variables to create a single vector z let timer_tmp = Timer::new("prove_z_mat_gen"); - let z_mat = (0..num_instances) - .into_par_iter() - .map(|p| { - (0..num_proofs[p]) - .into_par_iter() - .map(|q| { - (0..witness_secs.len()) - .map(|w| { - let ws = witness_secs[w]; - let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; - let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; - - let r_w = if ws.num_inputs[p_w] < num_inputs[p] { - let padding = std::iter::repeat(S::field_zero()).take(num_inputs[p] - ws.num_inputs[p_w]).collect::>(); - let mut r = ws.w_mat[p_w][q_w].clone(); - r.extend(padding); - r - } else { - ws.w_mat[p_w][q_w].iter().take(num_inputs[p]).cloned().collect::>() - }; - - r_w - }) - .collect::>>() - }) - .collect::>>>() - }) - .collect::>>>>(); + let z_mat = (0..num_instances).map(|p| { + (0..num_proofs[p]).into_par_iter().map(|q| { + (0..witness_secs.len()).map(|w| { + let ws = witness_secs[w]; + let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; + let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; + + let r_w = if ws.num_inputs[p_w] < num_inputs[p] { + let padding = std::iter::repeat(S::field_zero()).take(num_inputs[p] - ws.num_inputs[p_w]).collect::>(); + let mut r = ws.w_mat[p_w][q_w].clone(); + r.extend(padding); + r + } else { + ws.w_mat[p_w][q_w].iter().take(num_inputs[p]).cloned().collect::>() + }; + r_w + }).collect::>>() + }).collect::>>>() + }).collect::>>>>(); timer_tmp.stop(); // derive the verifier's challenge \tau @@ -346,13 +337,14 @@ impl R1CSProof { ); timer_tmp.stop(); let timer_tmp = Timer::new("prove_z_bind"); - Z_poly.bound_poly_vars_rq(&rq_rev); + Z_poly.bound_poly_vars_rq_parallel(&rq_rev); timer_tmp.stop(); // An Eq function to match p with rp let mut eq_p_rp_poly = DensePolynomial::new(EqPolynomial::new(rp).evals()); // Sumcheck 2: (rA + rB + rC) * Z * eq(p) = e + let timer_tmp = Timer::new("prove_sum_check"); let (sc_proof_phase2, ry_rev, _claims_phase2) = R1CSProof::prove_phase_two( num_rounds_y + num_rounds_w + num_rounds_p, num_rounds_y, @@ -367,6 +359,7 @@ impl R1CSProof { &mut Z_poly, transcript, ); + timer_tmp.stop(); timer_sc_proof_phase2.stop(); // Separate ry into rp, rw, and ry diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index e7ae59fb..ac6bfc99 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 1000 +const u32 REPETITION = 10000 From 7265ef009aafb226c382a2ae42093a8f849b7377 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 30 Dec 2024 12:34:50 -0500 Subject: [PATCH 38/54] Remove debug message --- spartan_parallel/src/custom_dense_mlpoly.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index d59cabe9..b6c09bd4 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -311,15 +311,8 @@ impl DensePolynomialPqx { pub fn bound_poly_vars_rq(&mut self, r_q: &[S], ) { - let mut count = 0; for r in r_q { self.bound_poly_q(r); - count += 1; - if count == 10 { - for p in 0..self.Z.len() { - println!("SINGLE CORE: P: {}, INST0: {:?}", p, self.Z[p][0][0][0]); - } - } } } From 2f2ecd737c1ac449dc2b26a7eda5936adfcb3322 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 30 Dec 2024 12:47:53 -0500 Subject: [PATCH 39/54] Update self.num_proofs for bind_rq --- spartan_parallel/src/custom_dense_mlpoly.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index b6c09bd4..677803e7 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -303,7 +303,8 @@ impl DensePolynomialPqx { inst }).collect::>>>>(); - self.max_num_proofs /= 2usize.pow(r_q.len() as u32); + self.max_num_proofs = 1; + self.num_proofs = vec![1; self.num_instances]; } // Bound the entire "q" section to r_q in reverse From fc385b636c53439a694c10869d40d2065958e430 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Mon, 30 Dec 2024 14:49:54 -0500 Subject: [PATCH 40/54] Allow num_inputs to be different per witness_sec --- spartan_parallel/src/custom_dense_mlpoly.rs | 297 +++++++++---------- spartan_parallel/src/instance.rs | 123 ++++---- spartan_parallel/src/lib.rs | 84 +++--- spartan_parallel/src/r1csinstance.rs | 124 ++------ spartan_parallel/src/r1csproof.rs | 113 +++---- spartan_parallel/src/sparse_mlpoly.rs | 3 +- spartan_parallel/src/sumcheck.rs | 33 +-- spartan_parallel/writeups/proofs_overview.md | 6 +- 8 files changed, 329 insertions(+), 454 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 677803e7..3f658f55 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -14,23 +14,23 @@ const MODE_X: usize = 4; // Customized Dense ML Polynomials for Data-Parallelism // These Dense ML Polys are aimed for space-efficiency by removing the 0s for invalid (p, q, w, x) quadruple -// Dense polynomial with variable order: p, q_rev, w, x_rev +// Dense polynomial with variable order: p, q, w, x // Used by Z_poly in r1csproof -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Hash)] pub struct DensePolynomialPqx { - num_instances: usize, // num_instances is a power of 2 and num_instances / 2 < Z.len() <= num_instances - num_proofs: Vec, - max_num_proofs: usize, - pub num_witness_secs: usize, // num_witness_secs is a power of 2 and num_witness_secs / 2 < Z[.][.].len() <= num_witness_secs - num_inputs: Vec, - max_num_inputs: usize, - pub Z: Vec>>>, // Evaluations of the polynomial in all the 2^num_vars Boolean inputs of order (p, q_rev, w, x_rev) - // Let Q_max = max_num_proofs, assume that for a given P, num_proofs[P] = Q_i, then let STEP = Q_max / Q_i, - // Z(P, y, .) is only non-zero if y is a multiple of STEP, so Z[P][j][.] actually stores Z(P, j*STEP, .) - // The same applies to X + // All metadata might not be a power of 2 + pub num_instances: usize, + pub num_proofs: Vec, // P + pub num_witness_secs: usize, + pub num_inputs: Vec>, // P x W + pub num_vars_p: usize, // log(P.next_power_of_two()) + pub num_vars_q: usize, + pub num_vars_w: usize, + pub num_vars_x: usize, + pub Z: Vec>>>, // Evaluations of the polynomial in all the 2^num_vars Boolean inputs of order (p, q, w, x) } -fn fold_rq(proofs: &mut [Vec>], r_q: &[S], step: usize, mut q: usize, w: usize, x: usize) { +fn fold_rq(proofs: &mut [Vec>], r_q: &[S], step: usize, mut q: usize, w: usize, x: &Vec) { for r in r_q { let r1 = S::field_one() - r.clone(); let r2 = r.clone(); @@ -38,69 +38,55 @@ fn fold_rq(proofs: &mut [Vec>], r_q: &[S], step q = q.div_ceil(2); (0..q).for_each(|q| { (0..w).for_each(|w| { - (0..x).for_each(|x| { + (0..x[w]).for_each(|x| { proofs[q * step][w][x] = r1 * proofs[2 * q * step][w][x] + r2 * proofs[(2 * q + 1) * step][w][x]; }); }); }); } - - /* - if lvl > final_lvl { - fold_rq(proofs, r_q, 2 * idx, step, lvl - 1, final_lvl, w, x); - fold_rq(proofs, r_q, 2 * idx + step, step, lvl - 1, final_lvl, w, x); - - let r1 = S::field_one() - r_q[lvl - 1]; - let r2 = r_q[lvl - 1]; - - (0..w).for_each(|w| { - (0..x).for_each(|x| { - proofs[idx][w][x] = r1 * proofs[idx * 2][w][x] + r2 * proofs[idx * 2 + step][w][x]; - }); - }); - } else { - // base level. do nothing - } - */ } impl DensePolynomialPqx { - // Assume z_mat is of form (p, q_rev, x_rev), construct DensePoly + // Assume z_mat is of form (p, q_rev, x), construct DensePoly pub fn new( - z_mat: Vec>>>, - num_proofs: Vec, - max_num_proofs: usize, - num_inputs: Vec, - max_num_inputs: usize, + z_mat: Vec>>>, ) -> Self { - let num_instances = z_mat.len().next_power_of_two(); - let num_witness_secs = z_mat[0][0].len().next_power_of_two(); + let num_instances = z_mat.len(); + let num_proofs: Vec = (0..num_instances).map(|p| z_mat[p].len()).collect(); + let num_witness_secs = z_mat[0][0].len(); + let num_inputs: Vec> = (0..num_instances).map(|p| + (0..num_witness_secs).map(|w| z_mat[p][0][w].len()).collect() + ).collect(); + // Sortedness check: num_proofs and num_inputs[p] are sorted in decreasing order + assert!((0..num_instances - 1).fold(true, |b, i| b && num_proofs[i] >= num_proofs[i + 1])); + for w in &num_inputs { + assert!((0..num_witness_secs - 1).fold(true, |b, i| b && w[i] >= w[i + 1])); + } + + let num_vars_p = num_instances.next_power_of_two().log_2(); + let num_vars_q = num_proofs.iter().max().unwrap().next_power_of_two().log_2(); + let num_vars_w = num_witness_secs.next_power_of_two().log_2(); + let num_vars_x = num_inputs.iter().map(|i| i.iter().max().unwrap()).max().unwrap().next_power_of_two().log_2(); DensePolynomialPqx { num_instances, num_proofs, - max_num_proofs, num_witness_secs, num_inputs, - max_num_inputs, + num_vars_p, + num_vars_q, + num_vars_w, + num_vars_x, Z: z_mat, } } pub fn len(&self) -> usize { - return self.num_instances * self.max_num_proofs * self.max_num_inputs; + return self.num_vars_p.pow2() * self.num_vars_q.pow2() * self.num_vars_w.pow2() * self.num_vars_x.pow2(); } - // Given (p, q_rev, x_rev) return Z[p][q_rev][x_rev] - pub fn index(&self, p: usize, q_rev: usize, w: usize, x_rev: usize) -> S { - if p < self.Z.len() - && q_rev < self.Z[p].len() - && w < self.Z[p][q_rev].len() - && x_rev < self.Z[p][q_rev][w].len() - { - return self.Z[p][q_rev][w][x_rev]; - } else { - return S::field_zero(); - } + // Given (p, q, w, x) return Z[p][q][w][x], DO NOT CHECK FOR OUT OF BOUND + pub fn index(&self, p: usize, q: usize, w: usize, x: usize) -> S { + return self.Z[p][q][w][x]; } // Given (p, q, w, x) and a mode, return Z[p*][q*][w*][x*] @@ -108,26 +94,25 @@ impl DensePolynomialPqx { // Mode = 2 ==> q* = 2q for low, 2q + 1 // Mode = 3 ==> w* = 2w for low, 2w + 1 // Mode = 4 ==> x* = 2x for low, 2x + 1 - // Assume p*, q*, w*, x*, within bound + // Assume p*, q*, w*, x* are within bound pub fn index_low(&self, p: usize, q: usize, w: usize, x: usize, mode: usize) -> S { let ZERO = S::field_zero(); match mode { - MODE_P => { if 2 * p >= self.Z.len() { ZERO } else { self.Z[2 * p][q][w][x] } } - MODE_Q => self.Z[p][2 * q][w][x], - MODE_W => { if 2 * w >= self.Z[p][q].len() { ZERO } else { self.Z[p][q][2 * w][x] } } - MODE_X => self.Z[p][q][w][2 * x], - _ => unreachable!() + MODE_P => { if self.num_instances == 1 { self.Z[0][q][w][x] } else if 2 * p >= self.num_instances { ZERO } else { self.Z[2 * p][q][w][x] } } + MODE_Q => { if 2 * q >= self.num_proofs[p] { ZERO } else { self.Z[p][2 * q][w][x] } }, + MODE_W => { if 2 * w >= self.num_witness_secs { ZERO } else { self.Z[p][q][2 * w][x] } } + MODE_X => { if 2 * x >= self.num_inputs[p][w] { ZERO } else { self.Z[p][q][w][2 * x] } }, + _ => unreachable!() } } - pub fn index_high(&self, p: usize, q: usize, w: usize, x: usize, mode: usize) -> S { let ZERO = S::field_zero(); match mode { - MODE_P => { if self.num_instances == 1 { self.Z[0][q][w][x] } else if 2 * p + 1 >= self.Z.len() { ZERO } else { self.Z[2 * p + 1][q][w][x] } } - MODE_Q => { if self.num_proofs[p] == 1 { ZERO } else { self.Z[p][2 * q + 1][w][x] } } - MODE_W => { if 2 * w + 1 >= self.Z[p][q].len() { ZERO } else { self.Z[p][q][2 * w + 1][x] } } - MODE_X => { if self.num_inputs[p] == 1 { ZERO } else { self.Z[p][q][w][2 * x + 1] } } - _ => unreachable!() + MODE_P => { if self.num_instances == 1 { self.Z[0][q][w][x] } else if 2 * p + 1 >= self.num_instances { ZERO } else { self.Z[2 * p + 1][q][w][x] } } + MODE_Q => { if 2 * q + 1 >= self.num_proofs[p] { ZERO } else { self.Z[p][2 * q + 1][w][x] } } + MODE_W => { if 2 * w + 1 >= self.num_witness_secs { ZERO } else { self.Z[p][q][2 * w + 1][x] } } + MODE_X => { if 2 * x + 1 >= self.num_inputs[p][w] { ZERO } else { self.Z[p][q][w][2 * x + 1] } } + _ => unreachable!() } } @@ -137,108 +122,99 @@ impl DensePolynomialPqx { // Mode = 3 ==> Bound last variable of "w" section to r // Mode = 4 ==> Bound last variable of "x" section to r pub fn bound_poly(&mut self, r: &S, mode: usize) { - match mode { - MODE_P => { self.bound_poly_p(r); } - MODE_Q => { self.bound_poly_q(r); } - MODE_W => { self.bound_poly_w(r); } - MODE_X => { self.bound_poly_x(r); } - _ => { panic!("DensePolynomialPqx bound failed: unrecognized mode {}!", mode); } - } + match mode { + MODE_P => { self.bound_poly_p(r); } + MODE_Q => { self.bound_poly_q(r); } + MODE_W => { self.bound_poly_w(r); } + MODE_X => { self.bound_poly_x(r); } + _ => { panic!("DensePolynomialPqx bound failed: unrecognized mode {}!", mode); } + } } // Bound the last variable of "p" section to r // We are only allowed to bound "p" if we have bounded the entire q and x section pub fn bound_poly_p(&mut self, r: &S) { - let ZERO = S::field_zero(); - assert_eq!(self.max_num_proofs, 1); - assert_eq!(self.max_num_inputs, 1); - self.num_instances /= 2; - for p in 0..self.num_instances { - for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { - let Z_low = if 2 * p < self.Z.len() { self.Z[2 * p][0][w][0] } else { ZERO }; - let Z_high = if 2 * p + 1 < self.Z.len() { self.Z[2 * p + 1][0][w][0] } else { ZERO }; - self.Z[p][0][w][0] = Z_low + r.clone() * (Z_high - Z_low); - } + assert!(self.num_vars_p >= 1); + assert_eq!(self.num_vars_q, 0); + assert_eq!(self.num_vars_x, 0); + let new_num_instances = self.num_instances.div_ceil(2); + for p in 0..new_num_instances { + for w in 0..self.num_witness_secs { + let Z_low = self.index_low(p, 0, w, 0, MODE_P); + let Z_high = self.index_high(p, 0, w, 0, MODE_P); + self.Z[p][0][w][0] = Z_low + r.clone() * (Z_high - Z_low); } + } + self.num_instances = new_num_instances; + self.num_vars_p -= 1; } // Bound the last variable of "q" section to r pub fn bound_poly_q(&mut self, r: &S) { - let ONE = S::field_one(); - self.max_num_proofs /= 2; - - for p in 0..min(self.num_instances, self.Z.len()) { - if self.num_proofs[p] == 1 { - for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][0][w][x] *= ONE - r.clone(); - } - } - } else { - self.num_proofs[p] /= 2; - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][q][w][x] = self.Z[p][2 * q][w][x] + r.clone() * (self.Z[p][2 * q + 1][w][x] - self.Z[p][2 * q][w][x]); - } + assert!(self.num_vars_q >= 1); + for p in 0..self.num_instances { + let new_num_proofs = self.num_proofs[p].div_ceil(2); + for q in 0..new_num_proofs { + for w in 0..self.num_witness_secs { + for x in 0..self.num_inputs[p][w] { + let Z_low = self.index_low(p, q, w, x, MODE_Q); + let Z_high = self.index_high(p, q, w, x, MODE_Q); + self.Z[p][q][w][x] = Z_low + r.clone() * (Z_high - Z_low); } } } + self.num_proofs[p] = new_num_proofs; } + self.num_vars_q -= 1; } // Bound the last variable of "w" section to r + // We are only allowed to bound "w" if we have bounded the entire x section pub fn bound_poly_w(&mut self, r: &S) { - let ZERO = S::field_zero(); - self.num_witness_secs /= 2; - - for p in 0..min(self.num_instances, self.Z.len()) { + assert!(self.num_vars_w >= 1); + assert_eq!(self.num_vars_x, 0); + let new_num_witness_secs = self.num_witness_secs.div_ceil(2); + for p in 0..self.num_instances { for q in 0..self.num_proofs[p] { - for w in 0..self.num_witness_secs { - for x in 0..self.num_inputs[p] { - let Z_low = if 2 * w < self.Z[p][q].len() { self.Z[p][q][2 * w][x] } else { ZERO }; - let Z_high = if 2 * w + 1 < self.Z[p][q].len() { self.Z[p][q][2 * w + 1][x] } else { ZERO }; - self.Z[p][q][w][x] = Z_low + r.clone() * (Z_high - Z_low); - } + for w in 0..new_num_witness_secs { + let Z_low = self.index_low(p, q, w, 0, MODE_W); + let Z_high = self.index_high(p, q, w, 0, MODE_W); + self.Z[p][q][w][0] = Z_low + r.clone() * (Z_high - Z_low); } } } + self.num_witness_secs = new_num_witness_secs; + self.num_vars_w -= 1; } // Bound the last variable of "x" section to r pub fn bound_poly_x(&mut self, r: &S) { - let ONE = S::field_one(); - self.max_num_inputs /= 2; - - for p in 0..min(self.num_instances, self.Z.len()) { - if self.num_inputs[p] == 1 { - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - self.Z[p][q][w][0] *= ONE - r.clone(); - } - } - } else { - self.num_inputs[p] /= 2; - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - for x in 0..self.num_inputs[p] { - self.Z[p][q][w][x] = self.Z[p][q][w][2 * x] + r.clone() * (self.Z[p][q][w][2 * x + 1] - self.Z[p][q][w][2 * x]); - } - } + // assert!(self.num_vars_x >= 1); + for p in 0..self.num_instances { + for w in 0..self.num_witness_secs { + let new_num_inputs = self.num_inputs[p][w].div_ceil(2); + for q in 0..self.num_proofs[p] { + for x in 0..new_num_inputs { + let Z_low = self.index_low(p, q, w, x, MODE_X); + let Z_high = self.index_high(p, q, w, x, MODE_X); + self.Z[p][q][w][x] = Z_low + r.clone() * (Z_high - Z_low); } } + self.num_inputs[p][w] = new_num_inputs; } + } + if self.num_vars_x >= 1 { + self.num_vars_x -= 1; + } } // Bound the entire "p" section to r_p in reverse // Must occur after r_q's are bounded - pub fn bound_poly_vars_rp(&mut self, - r_p: &[S], - ) { - for r in r_p { - self.bound_poly_p(r); - } + pub fn bound_poly_vars_rp(&mut self, r_p: &[S]) { + for r in r_p { + self.bound_poly_p(r); } + } // Bound the entire "q" section to r_q in reverse pub fn bound_poly_vars_rq_parallel( @@ -268,7 +244,7 @@ impl DensePolynomialPqx { // single proof matrix dimension W x X let num_witness_secs = min(self.num_witness_secs, inst[0].len()); - let num_inputs = self.num_inputs[p]; + let num_inputs = &self.num_inputs[p]; // Divide rq into sub, final, and left_over let sub_rq = &r_q[0..sub_levels]; @@ -294,7 +270,7 @@ impl DensePolynomialPqx { // the series of random challenges exceeds the total number of variables let c = left_over_rq.into_iter().fold(S::field_one(), |acc, n| acc * (S::field_one() - *n)); for w in 0..inst[0].len() { - for x in 0..inst[0][0].len() { + for x in 0..inst[0][w].len() { inst[0][w][x] *= c; } } @@ -303,33 +279,26 @@ impl DensePolynomialPqx { inst }).collect::>>>>(); - self.max_num_proofs = 1; + self.num_vars_q = 0; self.num_proofs = vec![1; self.num_instances]; } // Bound the entire "q" section to r_q in reverse - // Must occur after r_q's are bounded - pub fn bound_poly_vars_rq(&mut self, - r_q: &[S], - ) { + pub fn bound_poly_vars_rq(&mut self, r_q: &[S]) { for r in r_q { self.bound_poly_q(r); } } // Bound the entire "w" section to r_w in reverse - pub fn bound_poly_vars_rw(&mut self, - r_w: &[S], - ) { + pub fn bound_poly_vars_rw(&mut self, r_w: &[S]) { for r in r_w { self.bound_poly_w(r); } } // Bound the entire "x_rev" section to r_x - pub fn bound_poly_vars_rx(&mut self, - r_x: &[S], - ) { + pub fn bound_poly_vars_rx(&mut self, r_x: &[S]) { for r in r_x { self.bound_poly_x(r); } @@ -351,22 +320,28 @@ impl DensePolynomialPqx { // Convert to a (p, q_rev, x_rev) regular dense poly of form (p, q, x) pub fn to_dense_poly(&self) -> DensePolynomial { - let ZERO = S::field_zero(); - let mut Z_poly = vec![ZERO; self.num_instances * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs]; - for p in 0..min(self.num_instances, self.Z.len()) { - for q in 0..self.num_proofs[p] { - for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - for x in 0..self.num_inputs[p] { - Z_poly[ - p * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs - + q * self.num_witness_secs * self.max_num_inputs - + w * self.max_num_inputs - + x - ] = self.Z[p][q][w][x]; - } + let ZERO = S::field_zero(); + + let p_space = self.num_vars_p.pow2(); + let q_space = self.num_vars_q.pow2(); + let w_space = self.num_vars_w.pow2(); + let x_space = self.num_vars_x.pow2(); + + let mut Z_poly = vec![ZERO; p_space * q_space * w_space * x_space]; + for p in 0..self.num_instances { + for q in 0..self.num_proofs[p] { + for w in 0..self.num_witness_secs { + for x in 0..self.num_inputs[p][w] { + Z_poly[ + p * q_space * w_space * x_space + + q * w_space * x_space + + w * x_space + + x + ] = self.Z[p][q][w][x]; } } } - DensePolynomial::new(Z_poly) + } + DensePolynomial::new(Z_poly) } } \ No newline at end of file diff --git a/spartan_parallel/src/instance.rs b/spartan_parallel/src/instance.rs index 879d79e0..d046bd47 100644 --- a/spartan_parallel/src/instance.rs +++ b/spartan_parallel/src/instance.rs @@ -26,7 +26,7 @@ pub struct Instance { pub digest: Vec, } -impl Instance { +impl Instance { /// Constructs a new `Instance` and an associated satisfying assignment pub fn new( num_instances: usize, @@ -38,6 +38,8 @@ impl Instance { B: &Vec>, C: &Vec>, ) -> Result, R1CSError> { + let ZERO = S::field_zero(); + let (max_num_vars_padded, num_vars_padded, max_num_cons_padded, num_cons_padded) = { let max_num_vars_padded = { let mut max_num_vars_padded = max_num_vars; @@ -82,12 +84,7 @@ impl Instance { } } - ( - max_num_vars_padded, - num_vars_padded, - max_num_cons_padded, - num_cons_padded, - ) + (max_num_vars_padded, num_vars_padded, max_num_cons_padded, num_cons_padded) }; let bytes_to_scalar = @@ -124,7 +121,7 @@ impl Instance { // we do not need to pad otherwise because the dummy constraints are implicit in the sum-check protocol if num_cons[b] == 0 || num_cons[b] == 1 { for i in tups.len()..num_cons_padded[b] { - mat.push((i, num_vars[b], S::field_zero())); + mat.push((i, num_vars[b], ZERO)); } } @@ -245,10 +242,10 @@ impl Instance { /// Verify the correctness of each block execution, as well as extracting all memory operations /// /// Input composition: (if every segment exists) - /// INPUT + VAR Challenges BLOCK_W2 BLOCK_W3 BLOCK_W3_SHIFTED - /// 0 1 2 IOW +1 +2 +3 +4 +5 | 0 1 2 3 | 0 1 2 3 4 NIU 1 2 3 2NP +1 +2 +3 +4 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 - /// v i0 ... PA0 PD0 ... VA0 VD0 ... | tau r r^2 ... | _ _ ZO r*i1 ... MR MC MR ... MR1 MR2 MR3 MC MR1 ... | v x pi D pi D pi D | v x pi D pi D pi D - /// INPUT PHY VIR INPUT PHY VIR INPUT PHY VIR + /// INPUT + VAR BLOCK_W2 Challenges BLOCK_W3 BLOCK_W3_SHIFTED + /// 0 1 2 IOW +1 +2 +3 +4 +5 | 0 1 2 3 4 NIU 1 2 3 2NP +1 +2 +3 +4 | 0 1 2 3 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 + /// v i0 ... PA0 PD0 ... VA0 VD0 ... | _ _ ZO r*i1 ... MR MC MR ... MR1 MR2 MR3 MC MR1 ... | tau r r^2 ... | v x pi D pi D pi D | v x pi D pi D pi D + /// INPUT PHY VIR INPUT PHY VIR INPUT PHY VIR /// /// VAR: /// We assume that the witnesses are of the following format: @@ -271,7 +268,7 @@ impl Instance { /// - VMR3 = r^3 * VT /// - VMC = (1 or VMC[i-1]) * (tau - VA - VMR1 - VMR2 - VMR3) /// The final product is stored in X = MC[NV - 1] - /// + /// /// If in COMMIT_MODE, commit instance by num_vars_per_block, rounded to the nearest power of four pub fn gen_block_inst( num_instances: usize, @@ -306,20 +303,12 @@ impl Instance { max_size_per_group.insert(next_group_size(*num_vars), num_vars.next_power_of_two()); } } - num_vars_per_block - .iter() - .map(|i| { - max_size_per_group - .get(&next_group_size(*i)) - .unwrap() - .clone() - }) - .collect() + num_vars_per_block.iter().map(|i| max_size_per_group.get(&next_group_size(*i)).unwrap().clone()).collect() } else { vec![num_vars; num_instances] }; - if PRINT_SIZE { + if PRINT_SIZE && !COMMIT_MODE { println!("\n\n--\nBLOCK INSTS"); println!( "{:10} {:>4} {:>4} {:>4} {:>4}", @@ -348,37 +337,30 @@ impl Instance { let V_VD = |b: usize, i: usize| io_width + 2 * num_phy_ops[b] + 4 * i + 1; let V_VL = |b: usize, i: usize| io_width + 2 * num_phy_ops[b] + 4 * i + 2; let V_VT = |b: usize, i: usize| io_width + 2 * num_phy_ops[b] + 4 * i + 3; - // in CHALLENGES, not used if !has_mem_op - let V_tau = |b: usize| num_vars_padded_per_block[b]; - let V_r = |b: usize, i: usize| num_vars_padded_per_block[b] + i; // in BLOCK_W2 / INPUT_W2 let V_input_dot_prod = |b: usize, i: usize| { if i == 0 { V_input(0) } else { - 2 * num_vars_padded_per_block[b] + 2 + i + num_vars_padded_per_block[b] + 2 + i } }; - let V_output_dot_prod = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 + (num_inputs_unpadded - 1) + i; + let V_output_dot_prod = |b: usize, i: usize| num_vars_padded_per_block[b] + 2 + (num_inputs_unpadded - 1) + i; // in BLOCK_W2 / PHY_W2 - let V_PMR = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i; - let V_PMC = - |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i + 1; + let V_PMR = |b: usize, i: usize| num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i; + let V_PMC = |b: usize, i: usize| num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * i + 1; // in BLOCK_W2 / VIR_W2 - let V_VMR1 = |b: usize, i: usize| { - 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i - }; - let V_VMR2 = |b: usize, i: usize| { - 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 1 - }; - let V_VMR3 = |b: usize, i: usize| { - 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 2 - }; - let V_VMC = |b: usize, i: usize| { - 2 * num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 3 - }; + let V_VMR1 = + |b: usize, i: usize| num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i; + let V_VMR2 = + |b: usize, i: usize| num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 1; + let V_VMR3 = + |b: usize, i: usize| num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 2; + let V_VMC = + |b: usize, i: usize| num_vars_padded_per_block[b] + 2 * num_inputs_unpadded + 2 * num_phy_ops[b] + 4 * i + 3; + // in CHALLENGES, not used if !has_mem_op + let V_tau = |b: usize| 2 * num_vars_padded_per_block[b]; + let V_r = |b: usize, i: usize| 2 * num_vars_padded_per_block[b] + i; // in BLOCK_W3 let V_v = |b: usize| 3 * num_vars_padded_per_block[b]; let V_x = |b: usize| 3 * num_vars_padded_per_block[b] + 1; @@ -703,7 +685,7 @@ impl Instance { B_list.push(B); C_list.push(C); - if PRINT_SIZE { + if PRINT_SIZE && !COMMIT_MODE { let max_nnz = max(tmp_nnz_A, max(tmp_nnz_B, tmp_nnz_C)); let total_var = num_vars_per_block[b] + 2 * num_inputs_unpadded.next_power_of_two() @@ -724,7 +706,7 @@ impl Instance { } } - if PRINT_SIZE { + if PRINT_SIZE && !COMMIT_MODE { println!("Total Num of Blocks: {}", num_instances); println!("Total Inst Commit Size: {}", total_inst_commit_size); println!("Total Var Commit Size: {}", total_var_commit_size); @@ -744,10 +726,7 @@ impl Instance { max_cons_per_group.insert(num_vars_padded_per_block[i], block_num_cons[i]); } } - num_vars_padded_per_block - .iter() - .map(|i| max_cons_per_group.get(i).unwrap().clone()) - .collect() + num_vars_padded_per_block.iter().map(|i| max_cons_per_group.get(i).unwrap().clone()).collect() } else { block_num_cons } @@ -759,10 +738,7 @@ impl Instance { block_max_num_cons, num_cons_padded_per_block, block_num_vars, - num_vars_padded_per_block - .into_iter() - .map(|i| 8 * i) - .collect(), + num_vars_padded_per_block.into_iter().map(|i| 8 * i).collect(), &A_list, &B_list, &C_list, @@ -816,9 +792,14 @@ impl Instance { /// D2 = D1 * (ls[i+1] - STORE) /// Where STORE = 0 /// Input composition: - /// Op[k] Op[k + 1] D2 & bits of ts[k + 1] - ts[k] - /// 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 - /// v D1 a d ls ts _ _ | v D1 a d ls ts _ _ | D2 EQ B0 B1 ... + /// bits of ts[k + 1] - ts[k] Op[k] Op[k + 1] + /// 0 1 2 3 4 | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 + /// D2 EQ B0 B1 ... | v D1 a d ls ts _ _ | v D1 a d ls ts _ _ + /// + /// If ADDR_NONCONSEC, address comparison of VIR uses <= instead of +1, with the following expression + /// ts | addr + /// 0 1 2 3 4 | 0 1 2 3 4 5 + /// D2 EQ B0 B1 ... | D4 INV EQ B0 B1 ... pub fn gen_pairwise_check_inst( max_ts_width: usize, mem_addr_ts_bits_size: usize, @@ -834,6 +815,7 @@ impl Instance { "", "con", "var", "nnz", "exec" ); } + // Variable used by printing let mut total_inst_commit_size = 0; let mut total_var_commit_size = 0; @@ -841,7 +823,6 @@ impl Instance { let pairwise_check_num_vars = max(8, mem_addr_ts_bits_size); let pairwise_check_max_num_cons = 8 + max_ts_width; - let pairwise_check_num_cons = vec![2, 4, 8 + max_ts_width]; let pairwise_check_num_non_zero_entries: usize = max(13 + max_ts_width, 5 + 2 * max_ts_width); let pairwise_check_inst = { @@ -972,23 +953,24 @@ impl Instance { let (A, B, C) = { let width = pairwise_check_num_vars; - let V_valid = 0; + // TS_BITS + let V_D2 = 0; + let V_EQ = 1; + let V_B = |i| 2 + i; + // OP[K], OP[K + 1] + let V_valid = width; let V_cnst = V_valid; - let V_D1 = 1; - let V_addr = 2; - let V_data = 3; - let V_ls = 4; - let V_ts = 5; - let V_D2 = 2 * width; - let V_EQ = 2 * width + 1; - let V_B = |i| 2 * width + 2 + i; + let V_D1 = width + 1; + let V_addr = width + 2; + let V_data = width + 3; + let V_ls = width + 4; + let V_ts = width + 5; let mut A: Vec<(usize, usize, [u8; 32])> = Vec::new(); let mut B: Vec<(usize, usize, [u8; 32])> = Vec::new(); let mut C: Vec<(usize, usize, [u8; 32])> = Vec::new(); let mut num_cons = 0; - // Sortedness // (v[k] - 1) * v[k + 1] = 0 (A, B, C) = Instance::::gen_constr( A, @@ -1000,6 +982,7 @@ impl Instance { vec![], ); num_cons += 1; + // Sortedness // D1[k] = v[k + 1] * (1 - addr[k + 1] + addr[k]) (A, B, C) = Instance::::gen_constr( A, @@ -1403,4 +1386,4 @@ impl Instance { perm_root_inst, ) } -} +} \ No newline at end of file diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 04ab7040..b23320c9 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -15,8 +15,6 @@ extern crate digest; extern crate merlin; extern crate rand; extern crate sha3; - -#[cfg(feature = "multicore")] extern crate rayon; mod custom_dense_mlpoly; @@ -433,6 +431,7 @@ impl ProverWitnessSecInfo { } } + // Empty ProverWitnessSecInfo fn dummy() -> ProverWitnessSecInfo { ProverWitnessSecInfo { num_inputs: Vec::new(), @@ -441,6 +440,16 @@ impl ProverWitnessSecInfo { } } + // Zero ProverWitnessSecInfo + fn pad() -> ProverWitnessSecInfo { + let ZERO = S::field_zero(); + ProverWitnessSecInfo { + num_inputs: vec![1], + w_mat: vec![vec![vec![ZERO]]], + poly_w: vec![DensePolynomial::new(vec![ZERO])], + } + } + // Concatenate the components in the given order to a new prover witness sec fn concat(components: Vec<&ProverWitnessSecInfo>) -> ProverWitnessSecInfo { let mut num_inputs = Vec::new(); @@ -531,6 +540,13 @@ impl VerifierWitnessSecInfo { } } + fn pad() -> VerifierWitnessSecInfo { + VerifierWitnessSecInfo { + num_inputs: vec![1], + num_proofs: vec![1], + } + } + // Concatenate the components in the given order to a new verifier witness sec fn concat(components: Vec<&VerifierWitnessSecInfo>) -> VerifierWitnessSecInfo { let mut num_inputs = Vec::new(); @@ -1099,9 +1115,6 @@ impl SNARK { let index: Vec = inst_sorter.iter().map(|i| i.index).collect(); let block_inst_unsorted = block_inst.clone(); block_inst.sort(block_num_instances, &index); - let block_num_vars: Vec = (0..block_num_instances) - .map(|i| block_num_vars[index[i]]) - .collect(); let block_num_phy_ops: Vec = (0..block_num_instances) .map(|i| block_num_phy_ops[index[i]]) .collect(); @@ -2021,8 +2034,8 @@ impl SNARK { let timer_proof = Timer::new("Block Correctness Extract"); let block_wit_secs = vec![ &block_vars_prover, - &perm_w0_prover, &block_w2_prover, + &perm_w0_prover, &block_w3_prover, &block_w3_shifted_prover, ]; @@ -2034,7 +2047,6 @@ impl SNARK { block_max_num_proofs, block_num_proofs, num_vars, - &block_num_vars, block_wit_secs, &block_inst.inst, transcript, @@ -2118,27 +2130,28 @@ impl SNARK { .max() .unwrap() .clone(); - let (pairwise_prover, inst_map) = ProverWitnessSecInfo::merge(vec![ + let (pairwise_w0_prover, inst_map) = ProverWitnessSecInfo::merge(vec![ &perm_exec_w3_prover, &addr_phy_mems_prover, - &addr_vir_mems_prover, + &addr_ts_bits_prover, ]); - let (pairwise_shifted_prover, _) = ProverWitnessSecInfo::merge(vec![ + let (pairwise_w1_prover, _) = ProverWitnessSecInfo::merge(vec![ &perm_exec_w3_shifted_prover, &addr_phy_mems_shifted_prover, - &addr_vir_mems_shifted_prover, + &addr_vir_mems_prover, ]); - let addr_ts_bits_prover = { - let mut components = vec![&perm_w0_prover; inst_map.len()]; + let dummy_w2 = ProverWitnessSecInfo::pad(); + let pairwise_w2_prover = { + let mut components = vec![&dummy_w2; inst_map.len()]; for i in 0..inst_map.len() { if inst_map[i] == 2 { - components[i] = &addr_ts_bits_prover; + components[i] = &addr_vir_mems_shifted_prover; } } ProverWitnessSecInfo::concat(components) }; - let pairwise_num_instances = pairwise_prover.w_mat.len(); - let pairwise_num_proofs: Vec = pairwise_prover.w_mat.iter().map(|i| i.len()).collect(); + let pairwise_num_instances = pairwise_w0_prover.w_mat.len(); + let pairwise_num_proofs: Vec = pairwise_w0_prover.w_mat.iter().map(|i| i.len()).collect(); let (pairwise_check_r1cs_sat_proof, pairwise_check_challenges) = { let (proof, pairwise_check_challenges) = { R1CSProof::prove( @@ -2146,11 +2159,10 @@ impl SNARK { pairwise_size, &pairwise_num_proofs, max(8, mem_addr_ts_bits_size), - &vec![max(8, mem_addr_ts_bits_size); pairwise_num_instances], vec![ - &pairwise_prover, - &pairwise_shifted_prover, - &addr_ts_bits_prover, + &pairwise_w0_prover, + &pairwise_w1_prover, + &pairwise_w2_prover, ], &pairwise_check_inst.inst, transcript, @@ -2272,7 +2284,6 @@ impl SNARK { perm_size, &perm_root_num_proofs, num_ios, - &vec![num_ios; perm_root_num_instances], vec![ &perm_w0_prover, &perm_root_w1_prover, @@ -2727,9 +2738,7 @@ impl SNARK { let mut block_num_proofs: Vec = inst_sorter.iter().map(|i| i.num_exec).collect(); // index[i] = j => the original jth entry should now be at the ith position let block_index: Vec = inst_sorter.iter().map(|i| i.index).collect(); - let block_num_vars: Vec = (0..block_num_instances) - .map(|i| block_num_vars[block_index[i]]) - .collect(); + let block_num_vars: Vec = (0..block_num_instances).map(|i| block_num_vars[block_index[i]]).collect(); let block_num_phy_ops: Vec = (0..block_num_instances) .map(|i| block_num_phy_ops[block_index[i]]) .collect(); @@ -3038,8 +3047,8 @@ impl SNARK { let timer_sat_proof = Timer::new("Block Correctness Extract Sat"); let block_wit_secs = vec![ &block_vars_verifier, - &perm_w0_verifier, &block_w2_verifier, + &perm_w0_verifier, &block_w3_verifier, &block_w3_shifted_verifier, ]; @@ -3113,27 +3122,28 @@ impl SNARK { .max() .unwrap() .clone(); - let (pairwise_verifier, inst_map) = VerifierWitnessSecInfo::merge(vec![ + let (pairwise_w0_verifier, inst_map) = VerifierWitnessSecInfo::merge(vec![ &perm_exec_w3_verifier, &addr_phy_mems_verifier, - &addr_vir_mems_verifier, + &addr_ts_bits_verifier ]); - let (pairwise_shifted_verifier, _) = VerifierWitnessSecInfo::merge(vec![ + let (pairwise_w1_verifier, _) = VerifierWitnessSecInfo::merge(vec![ &perm_exec_w3_shifted_verifier, &addr_phy_mems_shifted_verifier, - &addr_vir_mems_shifted_verifier, + &addr_vir_mems_verifier, ]); - let addr_ts_bits_verifier = { - let mut components = vec![&perm_w0_verifier; inst_map.len()]; + let dummy_w2 = VerifierWitnessSecInfo::pad(); + let pairwise_w2_verifier = { + let mut components = vec![&dummy_w2; inst_map.len()]; for i in 0..inst_map.len() { if inst_map[i] == 2 { - components[i] = &addr_ts_bits_verifier; + components[i] = &addr_vir_mems_shifted_verifier; } } VerifierWitnessSecInfo::concat(components) }; - let pairwise_num_instances = pairwise_verifier.num_proofs.len(); - let pairwise_num_proofs: Vec = pairwise_verifier.num_proofs.clone(); + let pairwise_num_instances = pairwise_w0_verifier.num_proofs.len(); + let pairwise_num_proofs: Vec = pairwise_w0_verifier.num_proofs.clone(); let pairwise_check_challenges = self.pairwise_check_r1cs_sat_proof.verify( pairwise_num_instances, @@ -3141,9 +3151,9 @@ impl SNARK { &pairwise_num_proofs, max(8, mem_addr_ts_bits_size), vec![ - &pairwise_verifier, - &pairwise_shifted_verifier, - &addr_ts_bits_verifier, + &pairwise_w0_verifier, + &pairwise_w1_verifier, + &pairwise_w2_verifier, ], pairwise_check_num_cons, &self.pairwise_check_inst_evals_bound_rp, diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 9ea77495..8329969f 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -220,7 +220,6 @@ impl R1CSInstance { num_instances: usize, num_proofs: Vec, max_num_proofs: usize, - num_inputs: Vec, max_num_inputs: usize, max_num_cons: usize, num_cons: Vec, @@ -252,7 +251,6 @@ impl R1CSInstance { vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( num_cons[p_inst].clone(), max_num_inputs, - num_inputs[p], &z_list[q], )] }) @@ -263,7 +261,6 @@ impl R1CSInstance { vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( num_cons[p_inst].clone(), max_num_inputs, - num_inputs[p], &z_list[q], )] }) @@ -274,7 +271,6 @@ impl R1CSInstance { vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( num_cons[p_inst].clone(), max_num_inputs, - num_inputs[p], &z_list[q], )] }) @@ -282,27 +278,9 @@ impl R1CSInstance { } ( - DensePolynomialPqx::new( - Az, - num_proofs.clone(), - max_num_proofs, - num_cons.clone(), - max_num_cons, - ), - DensePolynomialPqx::new( - Bz, - num_proofs.clone(), - max_num_proofs, - num_cons.clone(), - max_num_cons, - ), - DensePolynomialPqx::new( - Cz, - num_proofs, - max_num_proofs, - num_cons.clone(), - max_num_cons, - ), + DensePolynomialPqx::new(Az), + DensePolynomialPqx::new(Bz), + DensePolynomialPqx::new(Cz), ) } @@ -357,7 +335,7 @@ impl R1CSInstance { num_rows: &Vec, num_segs: usize, max_num_cols: usize, - num_cols: &Vec, + num_cols: &Vec>, evals: &[S], // Output in p, q, w, i format, where q section has length 1 ) -> ( @@ -372,88 +350,20 @@ impl R1CSInstance { self.max_num_vars ); - ( - (0..self.num_instances) - .into_par_iter() - .map(|p| { - let evals_A = self.A_list[p].compute_eval_table_sparse_disjoint_rounds( - evals, - num_rows[p], - num_segs, - max_num_cols, - num_cols[p], - ); - vec![evals_A] - }) - .collect(), - (0..self.num_instances) - .into_par_iter() - .map(|p| { - let evals_B = self.B_list[p].compute_eval_table_sparse_disjoint_rounds( - evals, - num_rows[p], - num_segs, - max_num_cols, - num_cols[p], - ); - vec![evals_B] - }) - .collect(), - (0..self.num_instances) - .into_par_iter() - .map(|p| { - let evals_C = self.C_list[p].compute_eval_table_sparse_disjoint_rounds( - evals, - num_rows[p], - num_segs, - max_num_cols, - num_cols[p], - ); - vec![evals_C] - }) - .collect(), - ) + let mut evals_A_list = Vec::new(); + let mut evals_B_list = Vec::new(); + let mut evals_C_list = Vec::new(); + for p in 0..self.num_instances { + let num_cols = *num_cols[p].iter().max().unwrap(); + let evals_A = self.A_list[p].compute_eval_table_sparse_disjoint_rounds(evals, num_rows[p], num_segs, max_num_cols, num_cols); + let evals_B = self.B_list[p].compute_eval_table_sparse_disjoint_rounds(evals, num_rows[p], num_segs, max_num_cols, num_cols); + let evals_C = self.C_list[p].compute_eval_table_sparse_disjoint_rounds(evals, num_rows[p], num_segs, max_num_cols, num_cols); + evals_A_list.push(vec![evals_A]); + evals_B_list.push(vec![evals_B]); + evals_C_list.push(vec![evals_C]); + } - // let evals_A_list = (0..self.num_instances) - // .into_par_iter() - // .map(|p| { - // let evals_A = self.A_list[p].compute_eval_table_sparse_disjoint_rounds( - // evals, - // num_rows[p], - // num_segs, - // max_num_cols, - // num_cols[p], - // ); - // vec![evals_A] - // }).collect(); - - // let evals_B_list = (0..self.num_instances) - // .into_par_iter() - // .map(|p| { - // let evals_B = self.B_list[p].compute_eval_table_sparse_disjoint_rounds( - // evals, - // num_rows[p], - // num_segs, - // max_num_cols, - // num_cols[p], - // ); - // vec![evals_B] - // }).collect(); - - // let evals_C_list = (0..self.num_instances) - // .into_par_iter() - // .map(|p| { - // let evals_C = self.C_list[p].compute_eval_table_sparse_disjoint_rounds( - // evals, - // num_rows[p], - // num_segs, - // max_num_cols, - // num_cols[p], - // ); - // vec![evals_C] - // }).collect(); - - // (evals_A_list, evals_B_list, evals_C_list) + (evals_A_list, evals_B_list, evals_C_list) } // If IS_BLOCK, ry is truncated starting at the third entry diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 175666a6..cc9ea8d3 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -11,10 +11,9 @@ use crate::scalar::SpartanExtensionField; use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; use merlin::Transcript; use serde::{Deserialize, Serialize}; -use std::cmp::max; +use std::cmp::min; use std::iter::zip; use rayon::prelude::*; -use std::sync::{Arc, Mutex}; #[derive(Serialize, Deserialize, Debug)] pub struct R1CSProof { @@ -77,7 +76,7 @@ impl R1CSProof { num_rounds_p: usize, single_inst: bool, num_witness_secs: usize, - num_inputs: Vec, + num_inputs: Vec>, claim: &S, evals_eq: &mut DensePolynomial, evals_ABC: &mut DensePolynomialPqx, @@ -117,7 +116,6 @@ impl R1CSProof { num_proofs: &Vec, // Number of inputs of the combined Z matrix max_num_inputs: usize, - num_inputs: &Vec, // WITNESS_SECS // How many sections does each Z vector have? // num_witness_secs can be between 1 - 8 @@ -150,9 +148,19 @@ impl R1CSProof { assert_eq!(*p, p.next_power_of_two()); assert!(*p <= max_num_proofs); } - for i in num_inputs { - assert_eq!(*i, i.next_power_of_two()); - assert!(*i <= max_num_inputs); + // Construct num_inputs as P x W + // Note: w.num_inputs[p_w] might exceed max_num_inputs, but only the first max_num_inputs entries are used + let mut num_inputs: Vec> = (0..num_instances).map(|p| witness_secs.iter().map(|w| { + let p_w = if w.num_inputs.len() == 1 { 0 } else { p }; + min(w.num_inputs[p_w], max_num_inputs) + }).collect()).collect(); + // Number of inputs must be in decreasing order between witness segments + for p in 0..num_instances { + for w in (1..witness_secs.len()).rev() { + if num_inputs[p][w - 1] < num_inputs[p][w] { + num_inputs[p][w - 1] = num_inputs[p][w] + } + } } // Number of instances is either one or matches num_instances assert!(inst.get_num_instances() == 1 || inst.get_num_instances() == num_instances); @@ -191,13 +199,13 @@ impl R1CSProof { let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; - let r_w = if ws.num_inputs[p_w] < num_inputs[p] { - let padding = std::iter::repeat(S::field_zero()).take(num_inputs[p] - ws.num_inputs[p_w]).collect::>(); + let r_w = if ws.num_inputs[p_w] < num_inputs[p][w] { + let padding = std::iter::repeat(S::field_zero()).take(num_inputs[p][w] - ws.num_inputs[p_w]).collect::>(); let mut r = ws.w_mat[p_w][q_w].clone(); r.extend(padding); r } else { - ws.w_mat[p_w][q_w].iter().take(num_inputs[p]).cloned().collect::>() + ws.w_mat[p_w][q_w].iter().take(num_inputs[p][w]).cloned().collect::>() }; r_w }).collect::>>() @@ -226,7 +234,6 @@ impl R1CSProof { num_instances, num_proofs.clone(), max_num_proofs, - num_inputs.clone(), max_num_inputs, num_cons, block_num_cons.clone(), @@ -308,7 +315,11 @@ impl R1CSProof { evals_ABC.push(vec![Vec::new()]); for w in 0..num_witness_secs { evals_ABC[p][0].push(Vec::new()); - for i in 0..num_inputs[p] { + // If single instance, need to find the maximum num_inputs + let num_inputs = if inst.get_num_instances() == 1 { + num_inputs.iter().map(|n| n[w]).max().unwrap() + } else { num_inputs[p][w] }; + for i in 0..num_inputs { evals_ABC[p][0][w].push( r_A * evals_A[p][0][w][i] + r_B * evals_B[p][0][w][i] + r_C * evals_C[p][0][w][i], ); @@ -317,24 +328,12 @@ impl R1CSProof { } evals_ABC }; - let mut ABC_poly = DensePolynomialPqx::new( - evals_ABC, - vec![1; num_instances], - 1, - num_inputs.clone(), - max_num_inputs, - ); + let mut ABC_poly = DensePolynomialPqx::new(evals_ABC); timer_tmp.stop(); let timer_tmp = Timer::new("prove_z_gen"); // Construct a p * q * len(z) matrix Z and bound it to r_q - let mut Z_poly = DensePolynomialPqx::new( - z_mat, - num_proofs.clone(), - max_num_proofs, - num_inputs.clone(), - max_num_inputs, - ); + let mut Z_poly = DensePolynomialPqx::new(z_mat); timer_tmp.stop(); let timer_tmp = Timer::new("prove_z_bind"); Z_poly.bound_poly_vars_rq_parallel(&rq_rev); @@ -398,34 +397,37 @@ impl R1CSProof { eval_vars_at_ry_list.push(Vec::new()); for p in 0..wit_sec_num_instance { - poly_list.push(&w.poly_w[p]); - num_proofs_list.push(w.w_mat[p].len()); - num_inputs_list.push(w.num_inputs[p]); - // Depending on w.num_inputs[p], ry_short can be two different values - let ry_short = { - // if w.num_inputs[p] >= num_inputs, need to pad 0's to the front of ry + if w.num_inputs[p] > 1 { + poly_list.push(&w.poly_w[p]); + num_proofs_list.push(w.w_mat[p].len()); + num_inputs_list.push(w.num_inputs[p]); + // Depending on w.num_inputs[p], ry_short can be two different values + let ry_short = { + // if w.num_inputs[p] >= num_inputs, need to pad 0's to the front of ry + if w.num_inputs[p] >= max_num_inputs { + let ry_pad = vec![ZERO; w.num_inputs[p].log_2() - max_num_inputs.log_2()]; + [ry_pad, ry.clone()].concat() + } + // Else ry_short is the last w.num_inputs[p].log_2() entries of ry + // thus, to obtain the actual ry, need to multiply by (1 - ry0)(1 - ry1)..., which is ry_factors[num_rounds_y - w.num_inputs[p]] + else { + ry[num_rounds_y - w.num_inputs[p].log_2()..].to_vec() + } + }; + let rq_short = rq[num_rounds_q - num_proofs_list[num_proofs_list.len() - 1].log_2()..].to_vec(); + let r = &[rq_short, ry_short.clone()].concat(); + let eval_vars_at_ry = poly_list[poly_list.len() - 1].evaluate(r); + Zr_list.push(eval_vars_at_ry); if w.num_inputs[p] >= max_num_inputs { - let ry_pad = vec![ZERO; w.num_inputs[p].log_2() - max_num_inputs.log_2()]; - [ry_pad, ry.clone()].concat() - } - // Else ry_short is the last w.num_inputs[p].log_2() entries of ry - // thus, to obtain the actual ry, need to multiply by (1 - ry0)(1 - ry1)..., which is ry_factors[num_rounds_y - w.num_inputs[p]] - else { - ry[num_rounds_y - w.num_inputs[p].log_2()..].to_vec() + eval_vars_at_ry_list[i].push(eval_vars_at_ry); + } else { + eval_vars_at_ry_list[i].push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); } - }; - let rq_short = - rq[num_rounds_q - num_proofs_list[num_proofs_list.len() - 1].log_2()..].to_vec(); - let r = &[rq_short, ry_short.clone()].concat(); - let eval_vars_at_ry = poly_list[poly_list.len() - 1].evaluate(r); - Zr_list.push(eval_vars_at_ry); - if w.num_inputs[p] >= max_num_inputs { - eval_vars_at_ry_list[i].push(eval_vars_at_ry); + raw_eval_vars_at_ry_list[i].push(eval_vars_at_ry); } else { - eval_vars_at_ry_list[i] - .push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); + eval_vars_at_ry_list[i].push(ZERO); + raw_eval_vars_at_ry_list[i].push(ZERO); } - raw_eval_vars_at_ry_list[i].push(eval_vars_at_ry); } } @@ -644,9 +646,14 @@ impl R1CSProof { let w = witness_secs[i]; let wit_sec_num_instance = w.num_proofs.len(); for p in 0..wit_sec_num_instance { - num_proofs_list.push(w.num_proofs[p]); - num_inputs_list.push(w.num_inputs[p]); - eval_Zr_list.push(self.eval_vars_at_ry_list[i][p]); + if w.num_inputs[p] > 1 { + // comm_list.push(&w.comm_w[p]); + num_proofs_list.push(w.num_proofs[p]); + num_inputs_list.push(w.num_inputs[p]); + eval_Zr_list.push(self.eval_vars_at_ry_list[i][p]); + } else { + assert_eq!(self.eval_vars_at_ry_list[i][p], ZERO); + } } } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index b03297c8..ef766b1e 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -406,7 +406,6 @@ impl SparseMatPolynomial { &self, num_rows: usize, max_num_cols: usize, - _num_cols: usize, z: &Vec>, ) -> Vec { (0..self.M.len()) @@ -416,7 +415,7 @@ impl SparseMatPolynomial { let val = self.M[i].val.clone(); let w = col / max_num_cols; let y = col % max_num_cols; - (row, val * z[w][y]) + (row, if w < z.len() && y < z[w].len() { val * z[w][y] } else { S::field_zero() }) }) .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { Mz[r] += v; diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index d096c01d..aa2f2974 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -325,7 +325,7 @@ impl SumcheckInstanceProof { num_rounds_p: usize, single_inst: bool, // indicates whether poly_B only has one instance num_witness_secs: usize, - mut num_inputs: Vec, + mut num_inputs: Vec>, poly_A: &mut DensePolynomial, poly_B: &mut DensePolynomialPqx, poly_C: &mut DensePolynomialPqx, @@ -362,8 +362,8 @@ impl SumcheckInstanceProof { for p in 0..min(instance_len, num_inputs.len()) { let p_inst = if single_inst { 0 } else { p }; for w in 0..min(witness_secs_len, num_witness_secs) { - for y_rev in 0..inputs_len { - let val = poly_A[p] * poly_B.index(p_inst, 0, w, y_rev) * poly_C.index(p, 0, w, y_rev); + for y in 0..min(num_inputs[p_inst][w], num_inputs[p][w]) { + let val = poly_A[p] * poly_B.index(p_inst, 0, w, y) * poly_C.index(p, 0, w, y); expected += val; } } @@ -402,11 +402,11 @@ impl SumcheckInstanceProof { // So min(instance_len, num_proofs.len()) suffices for p in 0..min(instance_len, num_inputs.len()) { let p_inst = if single_inst { 0 } else { p }; - if mode == MODE_X && num_inputs[p] > 1 { - num_inputs[p] /= 2; - } for w in 0..min(witness_secs_len, num_witness_secs) { - for y in 0..num_inputs[p] { + if mode == MODE_X && num_inputs[p][w] > 1 { + num_inputs[p][w] /= 2; + } + for y in 0..num_inputs[p][w] { // evaluate A, B, C on p, w, y let (poly_A_low, poly_A_high) = match mode { MODE_X => (poly_A[p], poly_A[p]), @@ -558,21 +558,16 @@ impl SumcheckInstanceProof { // Mode = 2 ==> q // Mode = 4 ==> x let mode = if j < num_rounds_x_max { + cons_len = cons_len.div_ceil(2); MODE_X } else if j < num_rounds_x_max + num_rounds_q_max { + proof_len = proof_len.div_ceil(2); MODE_Q } else { + instance_len = instance_len.div_ceil(2); MODE_P }; - if cons_len > 1 { - cons_len /= 2 - } else if proof_len > 1 { - proof_len /= 2 - } else { - instance_len /= 2 - }; - let poly = { let mut eval_point_0 = ZERO; let mut eval_point_2 = ZERO; @@ -581,13 +576,9 @@ impl SumcheckInstanceProof { // We are guaranteed initially instance_len < num_proofs.len() < instance_len x 2 // So min(instance_len, num_proofs.len()) suffices for p in 0..min(instance_len, num_proofs.len()) { - if mode == MODE_X && num_cons[p] > 1 { - num_cons[p] /= 2; - } + if mode == MODE_X { num_cons[p] = num_cons[p].div_ceil(2); } // If q > num_proofs[p], the polynomials always evaluate to 0 - if mode == MODE_Q && num_proofs[p] > 1 { - num_proofs[p] /= 2; - } + if mode == MODE_Q { num_proofs[p] = num_proofs[p].div_ceil(2); } for q in 0..num_proofs[p] { for x in 0..num_cons[p] { // evaluate A, B, C, D on p, q, x diff --git a/spartan_parallel/writeups/proofs_overview.md b/spartan_parallel/writeups/proofs_overview.md index 87cd9951..a8df21c3 100644 --- a/spartan_parallel/writeups/proofs_overview.md +++ b/spartan_parallel/writeups/proofs_overview.md @@ -1,7 +1,7 @@ | Proofs | W0 | W1 | w2 | W3 | W4 | W5 | |--------|----|----|----|----|----|----| -| BLOCK_CORRECTNESS | block_vars | perm_w0 | block_input_w2 | block_w2 | block_w3 | block_shifted_w3 | +| BLOCK_CORRECTNESS | block_vars | block_w2 | perm_w0 | block_w3 | block_shifted_w3 | | CONSIS_CHECK | perm_exec_w3 | perm_exec_w3_shifted | | PHY_MEM_COHERE | addr_phy_mems | addr_phy_mems_shifted | -| VIR_MEM_COHERE | addr_vir_mems | addr_vir_mems_shifted | addr_ts_bits | -| PERM_ROOT | perm_w0 | perm_root_w2 | perm_root_w3 | perm_root_shifted_w3 | +| VIR_MEM_COHERE | addr_ts_bits | addr_vir_mems | addr_vir_mems_shifted | +| PERM_ROOT | perm_w0 | perm_root_w2 | perm_root_w3 | perm_root_shifted_w3 | \ No newline at end of file From bfee0c726f5f9ce6f9972b40f2c8373ac146d855 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Thu, 2 Jan 2025 11:50:02 -0500 Subject: [PATCH 41/54] Parallel q and w round-by-round binding --- spartan_parallel/src/custom_dense_mlpoly.rs | 64 ++++++++++++++++++--- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 3f658f55..833b0498 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -125,15 +125,15 @@ impl DensePolynomialPqx { match mode { MODE_P => { self.bound_poly_p(r); } MODE_Q => { self.bound_poly_q(r); } - MODE_W => { self.bound_poly_w(r); } - MODE_X => { self.bound_poly_x(r); } + MODE_W => { self.bound_poly_w_parallel(r); } + MODE_X => { self.bound_poly_x_parallel(r); } _ => { panic!("DensePolynomialPqx bound failed: unrecognized mode {}!", mode); } } } // Bound the last variable of "p" section to r // We are only allowed to bound "p" if we have bounded the entire q and x section - pub fn bound_poly_p(&mut self, r: &S) { + fn bound_poly_p(&mut self, r: &S) { assert!(self.num_vars_p >= 1); assert_eq!(self.num_vars_q, 0); assert_eq!(self.num_vars_x, 0); @@ -150,7 +150,7 @@ impl DensePolynomialPqx { } // Bound the last variable of "q" section to r - pub fn bound_poly_q(&mut self, r: &S) { + fn bound_poly_q(&mut self, r: &S) { assert!(self.num_vars_q >= 1); for p in 0..self.num_instances { let new_num_proofs = self.num_proofs[p].div_ceil(2); @@ -170,7 +170,29 @@ impl DensePolynomialPqx { // Bound the last variable of "w" section to r // We are only allowed to bound "w" if we have bounded the entire x section - pub fn bound_poly_w(&mut self, r: &S) { + fn bound_poly_w_parallel(&mut self, r: &S) { + let ZERO = S::field_zero(); + assert!(self.num_vars_w >= 1); + assert_eq!(self.num_vars_x, 0); + let new_num_witness_secs = self.num_witness_secs.div_ceil(2); + let Z = std::mem::take(&mut self.Z); + self.Z = Z.into_iter().map(|Z_p| { + Z_p.into_par_iter().map(|mut Z_pq| { + for w in 0..self.num_witness_secs { + let Z_low = if 2 * w >= self.num_witness_secs { ZERO } else { Z_pq[2 * w][0] }; + let Z_high = if 2 * w + 1 >= self.num_witness_secs { ZERO } else { Z_pq[2 * w + 1][0] }; + Z_pq[w][0] = Z_low + r.clone() * (Z_high - Z_low); + } + Z_pq + }).collect::>>>() + }).collect::>>>>(); + self.num_witness_secs = new_num_witness_secs; + self.num_vars_w -= 1; +} + + // Bound the last variable of "w" section to r + // We are only allowed to bound "w" if we have bounded the entire x section + fn _bound_poly_w(&mut self, r: &S) { assert!(self.num_vars_w >= 1); assert_eq!(self.num_vars_x, 0); let new_num_witness_secs = self.num_witness_secs.div_ceil(2); @@ -188,7 +210,33 @@ impl DensePolynomialPqx { } // Bound the last variable of "x" section to r - pub fn bound_poly_x(&mut self, r: &S) { + fn bound_poly_x_parallel(&mut self, r: &S) { + let ZERO = S::field_zero(); + let new_num_inputs: Vec> = self.num_inputs.iter().map(|p| + p.iter().map(|w| w.div_ceil(2)).collect() + ).collect(); + // assert!(self.num_vars_x >= 1); + let Z = std::mem::take(&mut self.Z); + self.Z = Z.into_iter().enumerate().map(|(p, Z_p)| { + Z_p.into_par_iter().map(|mut Z_pq| { + for w in 0..self.num_witness_secs { + for x in 0..new_num_inputs[p][w] { + let Z_low = if 2 * x >= self.num_inputs[p][w] { ZERO } else { Z_pq[w][2 * x] }; + let Z_high = if 2 * x + 1 >= self.num_inputs[p][w] { ZERO } else { Z_pq[w][2 * x + 1] }; + Z_pq[w][x] = Z_low + r.clone() * (Z_high - Z_low); + } + } + Z_pq + }).collect::>>>() + }).collect::>>>>(); + self.num_inputs = new_num_inputs; + if self.num_vars_x >= 1 { + self.num_vars_x -= 1; + } + } + + // Bound the last variable of "x" section to r + fn _bound_poly_x(&mut self, r: &S) { // assert!(self.num_vars_x >= 1); for p in 0..self.num_instances { for w in 0..self.num_witness_secs { @@ -293,14 +341,14 @@ impl DensePolynomialPqx { // Bound the entire "w" section to r_w in reverse pub fn bound_poly_vars_rw(&mut self, r_w: &[S]) { for r in r_w { - self.bound_poly_w(r); + self.bound_poly_w_parallel(r); } } // Bound the entire "x_rev" section to r_x pub fn bound_poly_vars_rx(&mut self, r_x: &[S]) { for r in r_x { - self.bound_poly_x(r); + self.bound_poly_x_parallel(r); } } From 16b8e1cc892c43f859400655ce0c8f3decda6eff Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Thu, 2 Jan 2025 11:59:10 -0500 Subject: [PATCH 42/54] Better parallel binding on x --- spartan_parallel/src/custom_dense_mlpoly.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index 833b0498..f4b85165 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -125,8 +125,8 @@ impl DensePolynomialPqx { match mode { MODE_P => { self.bound_poly_p(r); } MODE_Q => { self.bound_poly_q(r); } - MODE_W => { self.bound_poly_w_parallel(r); } - MODE_X => { self.bound_poly_x_parallel(r); } + MODE_W => { self.bound_poly_w(r); } + MODE_X => { if self.num_vars_q >= 1 { self.bound_poly_x_parallel(r) } else { self.bound_poly_x(r) }; } _ => { panic!("DensePolynomialPqx bound failed: unrecognized mode {}!", mode); } } } @@ -170,7 +170,7 @@ impl DensePolynomialPqx { // Bound the last variable of "w" section to r // We are only allowed to bound "w" if we have bounded the entire x section - fn bound_poly_w_parallel(&mut self, r: &S) { + fn _bound_poly_w_parallel(&mut self, r: &S) { let ZERO = S::field_zero(); assert!(self.num_vars_w >= 1); assert_eq!(self.num_vars_x, 0); @@ -192,7 +192,7 @@ impl DensePolynomialPqx { // Bound the last variable of "w" section to r // We are only allowed to bound "w" if we have bounded the entire x section - fn _bound_poly_w(&mut self, r: &S) { + fn bound_poly_w(&mut self, r: &S) { assert!(self.num_vars_w >= 1); assert_eq!(self.num_vars_x, 0); let new_num_witness_secs = self.num_witness_secs.div_ceil(2); @@ -236,7 +236,7 @@ impl DensePolynomialPqx { } // Bound the last variable of "x" section to r - fn _bound_poly_x(&mut self, r: &S) { + fn bound_poly_x(&mut self, r: &S) { // assert!(self.num_vars_x >= 1); for p in 0..self.num_instances { for w in 0..self.num_witness_secs { @@ -341,14 +341,14 @@ impl DensePolynomialPqx { // Bound the entire "w" section to r_w in reverse pub fn bound_poly_vars_rw(&mut self, r_w: &[S]) { for r in r_w { - self.bound_poly_w_parallel(r); + self.bound_poly_w(r); } } // Bound the entire "x_rev" section to r_x pub fn bound_poly_vars_rx(&mut self, r_x: &[S]) { for r in r_x { - self.bound_poly_x_parallel(r); + if self.num_vars_q >= 1 { self.bound_poly_x_parallel(r) } else { self.bound_poly_x(r) }; } } From 1520dbe4fc401a2bf3763422596ea40c949579cb Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Thu, 2 Jan 2025 12:28:05 -0500 Subject: [PATCH 43/54] Simple multicore impl for sumcheck --- spartan_parallel/src/sumcheck.rs | 227 ++++++++++++++++++++----------- 1 file changed, 149 insertions(+), 78 deletions(-) diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index aa2f2974..1d64872f 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -10,6 +10,7 @@ use super::transcript::{AppendToTranscript, ProofTranscript}; use super::unipoly::{CompressedUniPoly, UniPoly}; use itertools::izip; use merlin::Transcript; +use rayon::iter::{IntoParallelIterator, ParallelIterator}; use serde::{Deserialize, Serialize}; use std::cmp::min; @@ -506,7 +507,7 @@ impl SumcheckInstanceProof { transcript: &mut Transcript, ) -> (Self, Vec, Vec) where - F: Fn(&S, &S, &S, &S) -> S, + F: Fn(&S, &S, &S, &S) -> S + std::marker::Sync, { let ZERO = S::field_zero(); @@ -569,87 +570,157 @@ impl SumcheckInstanceProof { }; let poly = { - let mut eval_point_0 = ZERO; - let mut eval_point_2 = ZERO; - let mut eval_point_3 = ZERO; - - // We are guaranteed initially instance_len < num_proofs.len() < instance_len x 2 - // So min(instance_len, num_proofs.len()) suffices - for p in 0..min(instance_len, num_proofs.len()) { - if mode == MODE_X { num_cons[p] = num_cons[p].div_ceil(2); } - // If q > num_proofs[p], the polynomials always evaluate to 0 - if mode == MODE_Q { num_proofs[p] = num_proofs[p].div_ceil(2); } - for q in 0..num_proofs[p] { - for x in 0..num_cons[p] { - // evaluate A, B, C, D on p, q, x - let (poly_A_low, poly_A_high) = match mode { - MODE_X => ( - poly_Ap[p] * poly_Aq[q] * poly_Ax[2 * x], - poly_Ap[p] * poly_Aq[q] * poly_Ax[2 * x + 1], - ), - MODE_Q => ( - poly_Ap[p] * poly_Aq[2 * q] * poly_Ax[x], - poly_Ap[p] * poly_Aq[2 * q + 1] * poly_Ax[x], - ), - MODE_P => ( - poly_Ap[2 * p] * poly_Aq[q] * poly_Ax[x], - poly_Ap[2 * p + 1] * poly_Aq[q] * poly_Ax[x], - ), - _ => unreachable!() - }; - let poly_B_low = poly_B.index_low(p, q, 0, x, mode); - let poly_B_high = poly_B.index_high(p, q, 0, x, mode); - let poly_C_low = poly_C.index_low(p, q, 0, x, mode); - let poly_C_high = poly_C.index_high(p, q, 0, x, mode); - let poly_D_low = poly_D.index_low(p, q, 0, x, mode); - let poly_D_high = poly_D.index_high(p, q, 0, x, mode); - - // eval 0: bound_func is A(low) - eval_point_0 = eval_point_0 - + comb_func( - &poly_A_low, - &poly_B_low, - &poly_C_low, - &poly_D_low, - ); // Az[x, x, x, ..., 0] - - // eval 2: bound_func is -A(low) + 2*A(high) - let poly_A_bound_point = poly_A_high + poly_A_high - poly_A_low; - let poly_B_bound_point = poly_B_high + poly_B_high - poly_B_low; - let poly_C_bound_point = poly_C_high + poly_C_high - poly_C_low; - let poly_D_bound_point = poly_D_high + poly_D_high - poly_D_low; - eval_point_2 = eval_point_2 - + comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - &poly_D_bound_point, - ); // Az[x, x, ..., 2] + if mode == MODE_X { + // Multicore evaluation in MODE_X + let mut eval_point_0 = ZERO; + let mut eval_point_2 = ZERO; + let mut eval_point_3 = ZERO; + + // We are guaranteed initially instance_len < num_proofs.len() < instance_len x 2 + // So min(instance_len, num_proofs.len()) suffices + for p in 0..min(instance_len, num_proofs.len()) { + num_cons[p] = num_cons[p].div_ceil(2); + (eval_point_0, eval_point_2, eval_point_3) = (0..num_proofs[p]).into_par_iter().map(|q| { + let mut eval_point_0 = ZERO; + let mut eval_point_2 = ZERO; + let mut eval_point_3 = ZERO; + for x in 0..num_cons[p] { + // evaluate A, B, C, D on p, q, x + let poly_A_low = poly_Ap[p] * poly_Aq[q] * poly_Ax[2 * x]; + let poly_A_high = poly_Ap[p] * poly_Aq[q] * poly_Ax[2 * x + 1]; + let poly_B_low = poly_B.index_low(p, q, 0, x, mode); + let poly_B_high = poly_B.index_high(p, q, 0, x, mode); + let poly_C_low = poly_C.index_low(p, q, 0, x, mode); + let poly_C_high = poly_C.index_high(p, q, 0, x, mode); + let poly_D_low = poly_D.index_low(p, q, 0, x, mode); + let poly_D_high = poly_D.index_high(p, q, 0, x, mode); + + // eval 0: bound_func is A(low) + eval_point_0 = eval_point_0 + + comb_func( + &poly_A_low, + &poly_B_low, + &poly_C_low, + &poly_D_low, + ); // Az[x, x, x, ..., 0] + + // eval 2: bound_func is -A(low) + 2*A(high) + let poly_A_bound_point = poly_A_high + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_high + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_high + poly_C_high - poly_C_low; + let poly_D_bound_point = poly_D_high + poly_D_high - poly_D_low; + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + &poly_D_bound_point, + ); // Az[x, x, ..., 2] + + // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) + let poly_A_bound_point = poly_A_bound_point + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_bound_point + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_bound_point + poly_C_high - poly_C_low; + let poly_D_bound_point = poly_D_bound_point + poly_D_high - poly_D_low; + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + &poly_D_bound_point, + ); // Az[x, x, ..., 3] + } + (eval_point_0, eval_point_2, eval_point_3) + }).collect::>().into_iter().fold((eval_point_0, eval_point_2, eval_point_3), |(e0, e2, e3), (a0, a2, a3)| (e0 + a0, e2 + a2, e3 + a3)); + } - // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) - let poly_A_bound_point = poly_A_bound_point + poly_A_high - poly_A_low; - let poly_B_bound_point = poly_B_bound_point + poly_B_high - poly_B_low; - let poly_C_bound_point = poly_C_bound_point + poly_C_high - poly_C_low; - let poly_D_bound_point = poly_D_bound_point + poly_D_high - poly_D_low; - eval_point_3 = eval_point_3 - + comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - &poly_D_bound_point, - ); // Az[x, x, ..., 3] + let evals = vec![ + eval_point_0, + claim_per_round - eval_point_0, + eval_point_2, + eval_point_3, + ]; + let poly = UniPoly::from_evals(&evals); + poly + } else { + // Singlecore evaluation in other Modes + let mut eval_point_0 = ZERO; + let mut eval_point_2 = ZERO; + let mut eval_point_3 = ZERO; + + // We are guaranteed initially instance_len < num_proofs.len() < instance_len x 2 + // So min(instance_len, num_proofs.len()) suffices + for p in 0..min(instance_len, num_proofs.len()) { + // If q > num_proofs[p], the polynomials always evaluate to 0 + if mode == MODE_Q { num_proofs[p] = num_proofs[p].div_ceil(2); } + for q in 0..num_proofs[p] { + for x in 0..num_cons[p] { + // evaluate A, B, C, D on p, q, x + let (poly_A_low, poly_A_high) = match mode { + MODE_Q => ( + poly_Ap[p] * poly_Aq[2 * q] * poly_Ax[x], + poly_Ap[p] * poly_Aq[2 * q + 1] * poly_Ax[x], + ), + MODE_P => ( + poly_Ap[2 * p] * poly_Aq[q] * poly_Ax[x], + poly_Ap[2 * p + 1] * poly_Aq[q] * poly_Ax[x], + ), + _ => unreachable!() + }; + let poly_B_low = poly_B.index_low(p, q, 0, x, mode); + let poly_B_high = poly_B.index_high(p, q, 0, x, mode); + let poly_C_low = poly_C.index_low(p, q, 0, x, mode); + let poly_C_high = poly_C.index_high(p, q, 0, x, mode); + let poly_D_low = poly_D.index_low(p, q, 0, x, mode); + let poly_D_high = poly_D.index_high(p, q, 0, x, mode); + + // eval 0: bound_func is A(low) + eval_point_0 = eval_point_0 + + comb_func( + &poly_A_low, + &poly_B_low, + &poly_C_low, + &poly_D_low, + ); // Az[x, x, x, ..., 0] + + // eval 2: bound_func is -A(low) + 2*A(high) + let poly_A_bound_point = poly_A_high + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_high + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_high + poly_C_high - poly_C_low; + let poly_D_bound_point = poly_D_high + poly_D_high - poly_D_low; + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + &poly_D_bound_point, + ); // Az[x, x, ..., 2] + + // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) + let poly_A_bound_point = poly_A_bound_point + poly_A_high - poly_A_low; + let poly_B_bound_point = poly_B_bound_point + poly_B_high - poly_B_low; + let poly_C_bound_point = poly_C_bound_point + poly_C_high - poly_C_low; + let poly_D_bound_point = poly_D_bound_point + poly_D_high - poly_D_low; + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + &poly_D_bound_point, + ); // Az[x, x, ..., 3] + } } } - } - let evals = vec![ - eval_point_0, - claim_per_round - eval_point_0, - eval_point_2, - eval_point_3, - ]; - let poly = UniPoly::from_evals(&evals); - poly + let evals = vec![ + eval_point_0, + claim_per_round - eval_point_0, + eval_point_2, + eval_point_3, + ]; + let poly = UniPoly::from_evals(&evals); + poly + } }; // append the prover's message to the transcript From ec8458a278835ea5a3785fb768341ecadfb4096d Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Thu, 2 Jan 2025 15:58:20 -0500 Subject: [PATCH 44/54] Faster polyeval --- spartan_parallel/src/dense_mlpoly.rs | 54 +++++++++++++++++++++++++- spartan_parallel/src/r1csproof.rs | 57 +++++++++++----------------- spartan_parallel/src/sumcheck.rs | 13 ++++++- 3 files changed, 87 insertions(+), 37 deletions(-) diff --git a/spartan_parallel/src/dense_mlpoly.rs b/spartan_parallel/src/dense_mlpoly.rs index 78a0886f..ba119bde 100644 --- a/spartan_parallel/src/dense_mlpoly.rs +++ b/spartan_parallel/src/dense_mlpoly.rs @@ -7,8 +7,9 @@ use super::random::RandomTape; use super::transcript::ProofTranscript; use core::ops::Index; use merlin::Transcript; +use rayon::{iter::ParallelIterator, slice::ParallelSliceMut}; use serde::{Deserialize, Serialize}; -use std::collections::HashMap; +use std::{cmp::min, collections::HashMap}; #[cfg(feature = "multicore")] use rayon::prelude::*; @@ -247,6 +248,57 @@ impl DensePolynomial { self.len = n; } + fn fold_r(proofs: &mut [S], r: &[S], step: usize, mut l: usize) { + for r in r { + let r1 = S::field_one() - r.clone(); + let r2 = r.clone(); + + l = l.div_ceil(2); + (0..l).for_each(|i| { + proofs[i * step] = r1 * proofs[2 * i * step] + r2 * proofs[(2 * i + 1) * step]; + }); + } + } + + // returns Z(r) in O(n) time + pub fn evaluate_and_consume_parallel(&mut self, r: &[S]) -> S { + assert_eq!(r.len(), self.get_num_vars()); + let mut inst = std::mem::take(&mut self.Z); + + let len = self.len; + let dist_size = len / min(len, rayon::current_num_threads().next_power_of_two()); // distributed number of proofs on each thread + let num_threads = len / dist_size; + + // To perform rigorous parallelism, both len and # threads must be powers of 2 + // # threads must fully divide num_proofs for even distribution + assert_eq!(len, len.next_power_of_two()); + assert_eq!(num_threads, num_threads.next_power_of_two()); + + // Determine parallelism levels + let levels = len.log_2(); // total layers + let sub_levels = dist_size.log_2(); // parallel layers + let final_levels = num_threads.log_2(); // single core final layers + // Divide r into sub and final + let sub_r = &r[0..sub_levels]; + let final_r = &r[sub_levels..levels]; + + if sub_levels > 0 { + inst = inst + .par_chunks_mut(dist_size) + .map(|chunk| { + Self::fold_r(chunk, sub_r, 1, dist_size); + chunk.to_vec() + }) + .flatten().collect() + } + + if final_levels > 0 { + // aggregate the final result from sub-threads outputs using a single core + Self::fold_r(&mut inst, final_r, dist_size, num_threads); + } + inst[0] + } + // returns Z(r) in O(n) time pub fn evaluate(&self, r: &[S]) -> S { // r must have a value for each variable diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index cc9ea8d3..742bff08 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -82,11 +82,11 @@ impl R1CSProof { evals_ABC: &mut DensePolynomialPqx, evals_z: &mut DensePolynomialPqx, transcript: &mut Transcript, - ) -> (SumcheckInstanceProof, Vec, Vec) { + ) -> (SumcheckInstanceProof, Vec, Vec, Vec>) { let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { *poly_A_comp * *poly_B_comp * *poly_C_comp }; - let (sc_proof_phase_two, r, claims) = SumcheckInstanceProof::::prove_cubic_disjoint_rounds( + let (sc_proof_phase_two, r, claims, claimed_vars_at_ry) = SumcheckInstanceProof::::prove_cubic_disjoint_rounds( claim, num_rounds, num_rounds_y_max, @@ -102,7 +102,7 @@ impl R1CSProof { transcript, ); - (sc_proof_phase_two, r, claims) + (sc_proof_phase_two, r, claims, claimed_vars_at_ry) } fn protocol_name() -> &'static [u8] { @@ -344,7 +344,7 @@ impl R1CSProof { // Sumcheck 2: (rA + rB + rC) * Z * eq(p) = e let timer_tmp = Timer::new("prove_sum_check"); - let (sc_proof_phase2, ry_rev, _claims_phase2) = R1CSProof::prove_phase_two( + let (sc_proof_phase2, ry_rev, _claims_phase2, claimed_vars_at_ry) = R1CSProof::prove_phase_two( num_rounds_y + num_rounds_w + num_rounds_p, num_rounds_y, num_rounds_w, @@ -378,6 +378,10 @@ impl R1CSProof { let timer_polyeval = Timer::new("polyeval"); // For every possible wit_sec.num_inputs, compute ry_factor = prodX(1 - ryX)... + let mut rq_factors = vec![ONE; num_rounds_q + 1]; + for i in 0..num_rounds_q { + rq_factors[i + 1] = rq_factors[i] * (ONE - rq[i]); + } let mut ry_factors = vec![ONE; num_rounds_y + 1]; for i in 0..num_rounds_y { ry_factors[i + 1] = ry_factors[i] * (ONE - ry[i]); @@ -388,42 +392,26 @@ impl R1CSProof { let mut num_inputs_list = Vec::new(); // List of all evaluations let mut Zr_list = Vec::new(); - // List of evaluations separated by witness_secs + // Obtain list of evaluations separated by witness_secs + // Note: eval_vars_at_ry_list and raw_eval_vars_at_ry_list are W * P but claimed_vars_at_ry_list is P * W, and + // raw_eval_vars_at_ry_list does not multiply rq_factor and ry_factor let mut eval_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; - let mut raw_eval_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; // Does not multiply ry_factor + let mut raw_eval_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; for i in 0..num_witness_secs { let w = witness_secs[i]; let wit_sec_num_instance = w.w_mat.len(); - eval_vars_at_ry_list.push(Vec::new()); - for p in 0..wit_sec_num_instance { if w.num_inputs[p] > 1 { poly_list.push(&w.poly_w[p]); num_proofs_list.push(w.w_mat[p].len()); num_inputs_list.push(w.num_inputs[p]); - // Depending on w.num_inputs[p], ry_short can be two different values - let ry_short = { - // if w.num_inputs[p] >= num_inputs, need to pad 0's to the front of ry - if w.num_inputs[p] >= max_num_inputs { - let ry_pad = vec![ZERO; w.num_inputs[p].log_2() - max_num_inputs.log_2()]; - [ry_pad, ry.clone()].concat() - } - // Else ry_short is the last w.num_inputs[p].log_2() entries of ry - // thus, to obtain the actual ry, need to multiply by (1 - ry0)(1 - ry1)..., which is ry_factors[num_rounds_y - w.num_inputs[p]] - else { - ry[num_rounds_y - w.num_inputs[p].log_2()..].to_vec() - } - }; - let rq_short = rq[num_rounds_q - num_proofs_list[num_proofs_list.len() - 1].log_2()..].to_vec(); - let r = &[rq_short, ry_short.clone()].concat(); - let eval_vars_at_ry = poly_list[poly_list.len() - 1].evaluate(r); - Zr_list.push(eval_vars_at_ry); - if w.num_inputs[p] >= max_num_inputs { - eval_vars_at_ry_list[i].push(eval_vars_at_ry); - } else { - eval_vars_at_ry_list[i].push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); - } - raw_eval_vars_at_ry_list[i].push(eval_vars_at_ry); + // Find out the extra q and y padding to remove in raw_eval_vars_at_ry_list + let rq_pad_inv = rq_factors[num_rounds_q - num_proofs[p].log_2()].invert().unwrap(); + let ry_pad_inv = if w.num_inputs[p] >= max_num_inputs { ONE } else { ry_factors[num_rounds_y - w.num_inputs[p].log_2()].invert().unwrap() }; + eval_vars_at_ry_list[i].push(claimed_vars_at_ry[p][i] * rq_pad_inv); // I don't know why need to divide by rq and later multiply it back, but it doesn't work without this + let claimed_vars_at_ry_no_pad = claimed_vars_at_ry[p][i] * rq_pad_inv * ry_pad_inv; + Zr_list.push(claimed_vars_at_ry_no_pad); + raw_eval_vars_at_ry_list[i].push(claimed_vars_at_ry_no_pad); } else { eval_vars_at_ry_list[i].push(ZERO); raw_eval_vars_at_ry_list[i].push(ZERO); @@ -491,16 +479,15 @@ impl R1CSProof { }; let mut eval_vars_comb = (0..num_witness_secs).fold(ZERO, |s, i| s + prefix_list[i] * e(i)); - for q in 0..(num_rounds_q - num_proofs[p].log_2()) { - eval_vars_comb = eval_vars_comb * (ONE - rq[q]); - } + eval_vars_comb *= rq_factors[num_rounds_q - num_proofs[p].log_2()]; eval_vars_comb_list.push(eval_vars_comb); } timer_polyeval.stop(); let poly_vars = DensePolynomial::new(eval_vars_comb_list); let eval_vars_at_ry = poly_vars.evaluate(&rp); - + // prove the final step of sum-check #2 + // Deferred to verifier timer_prove.stop(); ( diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index 1d64872f..e362985d 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -332,7 +332,7 @@ impl SumcheckInstanceProof { poly_C: &mut DensePolynomialPqx, comb_func: F, transcript: &mut Transcript, - ) -> (Self, Vec, Vec) + ) -> (Self, Vec, Vec, Vec>) where F: Fn(&S, &S, &S) -> S, { @@ -353,6 +353,8 @@ impl SumcheckInstanceProof { let mut witness_secs_len = num_rounds_w.pow2(); let mut instance_len: usize = num_rounds_p.pow2(); + // Every variable binded to ry + let mut claimed_vars_at_ry = Vec::new(); for j in 0..num_rounds { /* For debugging only */ /* If the value is not 0, the instance / input is wrong */ @@ -385,6 +387,14 @@ impl SumcheckInstanceProof { } else { MODE_P }; + if j == num_rounds_y_max { + for p in 0..poly_C.num_instances { + claimed_vars_at_ry.push(Vec::new()); + for w in 0..poly_C.num_witness_secs { + claimed_vars_at_ry[p].push(poly_C.index(p, 0, w, 0)); + } + } + } if inputs_len > 1 { inputs_len /= 2 @@ -486,6 +496,7 @@ impl SumcheckInstanceProof { poly_B.index(0, 0, 0, 0), poly_C.index(0, 0, 0, 0), ], + claimed_vars_at_ry, ) } From 6aea34c557e8f2e715f20b165a2a58990877a08a Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 3 Jan 2025 12:05:37 -0500 Subject: [PATCH 45/54] Experimental improvements on block_witness_gen --- spartan_parallel/src/lib.rs | 221 +++++++++++++++++++++--------------- 1 file changed, 129 insertions(+), 92 deletions(-) diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index b23320c9..e1e54e7c 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -38,7 +38,7 @@ mod unipoly; use std::{ cmp::{max, Ordering}, fs::File, - io::Write, + io::Write, iter::zip, }; use dense_mlpoly::{DensePolynomial, PolyEvalProof}; @@ -50,6 +50,7 @@ use merlin::Transcript; use r1csinstance::{R1CSCommitment, R1CSDecommitment, R1CSEvalProof, R1CSInstance}; use r1csproof::R1CSProof; use random::RandomTape; +use rayon::iter::{IndexedParallelIterator, IntoParallelIterator, IntoParallelRefIterator, ParallelIterator}; use scalar::SpartanExtensionField; use serde::{Deserialize, Serialize}; use timer::Timer; @@ -1271,37 +1272,60 @@ impl SNARK { // w2 is _, _, ZO, r * i1, r^2 * i2, r^3 * i3, ... // where ZO * r^n = r^n * o0 + r^(n + 1) * o1, ..., // are used by the consistency check - let perm_exec_w2 = { - let mut perm_exec_w2: Vec> = exec_inputs_list - .iter() - .map(|input| { - [ - vec![S::field_zero(); 3], - (1..2 * num_inputs_unpadded - 2) - .map(|j| perm_w0[j] * input[j + 2]) - .collect(), - vec![S::field_zero(); num_ios - 2 * num_inputs_unpadded], - ] - .concat() - }) - .collect(); - for q in 0..consis_num_proofs { - perm_exec_w2[q][0] = exec_inputs_list[q][0]; - perm_exec_w2[q][1] = exec_inputs_list[q][0]; + let (perm_exec_w2, perm_exec_w3) = { + let perm_exec_w2: Vec>; + let mut perm_exec_w3: Vec>; + // Entries that do not depend on others can be generated in parallel + (perm_exec_w2, perm_exec_w3) = (0..consis_num_proofs).into_par_iter().map(|q| { + // perm_exec_w2 + let mut perm_exec_w2_q = [ + vec![S::field_zero(); 3], + (1..2 * num_inputs_unpadded - 2) + .map(|j| perm_w0[j] * exec_inputs_list[q][j + 2]) + .collect(), + vec![S::field_zero(); num_ios - 2 * num_inputs_unpadded], + ].concat(); + perm_exec_w2_q[0] = exec_inputs_list[q][0]; + perm_exec_w2_q[1] = exec_inputs_list[q][0]; for i in 0..num_inputs_unpadded - 1 { let perm = if i == 0 { S::field_one() } else { perm_w0[i] }; - perm_exec_w2[q][0] = perm_exec_w2[q][0] + perm * exec_inputs_list[q][2 + i]; - perm_exec_w2[q][2] = - perm_exec_w2[q][2] + perm * exec_inputs_list[q][2 + (num_inputs_unpadded - 1) + i]; + perm_exec_w2_q[0] = perm_exec_w2_q[0] + perm * exec_inputs_list[q][2 + i]; + perm_exec_w2_q[2] = + perm_exec_w2_q[2] + perm * exec_inputs_list[q][2 + (num_inputs_unpadded - 1) + i]; } - perm_exec_w2[q][0] = perm_exec_w2[q][0] * exec_inputs_list[q][0]; - let ZO = perm_exec_w2[q][2]; - perm_exec_w2[q][1] = perm_exec_w2[q][1] + ZO; - perm_exec_w2[q][1] = perm_exec_w2[q][1] * exec_inputs_list[q][0]; + perm_exec_w2_q[0] = perm_exec_w2_q[0] * exec_inputs_list[q][0]; + let ZO = perm_exec_w2_q[2]; + perm_exec_w2_q[1] = perm_exec_w2_q[1] + ZO; + perm_exec_w2_q[1] = perm_exec_w2_q[1] * exec_inputs_list[q][0]; + + // perm_exec_w3 + let mut perm_exec_w3_q = vec![S::field_zero(); 8]; + perm_exec_w3_q[0] = exec_inputs_list[q][0]; + perm_exec_w3_q[1] = perm_exec_w3_q[0] + * (comb_tau + - perm_exec_w2_q[3..] + .iter() + .fold(S::field_zero(), |a, b| a + *b) + - exec_inputs_list[q][2]); + perm_exec_w3_q[4] = perm_exec_w2_q[0]; + perm_exec_w3_q[5] = perm_exec_w2_q[1]; + + (perm_exec_w2_q, perm_exec_w3_q) + }).unzip(); + // Generate sequential entries separately + for q in (0..consis_num_proofs).rev() { + if q != consis_num_proofs - 1 { + perm_exec_w3[q][3] = perm_exec_w3[q][1] + * (perm_exec_w3[q + 1][2] + S::field_one() - perm_exec_w3[q + 1][0]); + } else { + perm_exec_w3[q][3] = perm_exec_w3[q][1]; + } + perm_exec_w3[q][2] = perm_exec_w3[q][0] * perm_exec_w3[q][3]; } - perm_exec_w2 + (perm_exec_w2, perm_exec_w3) }; - // w3 is [v, x, pi, D] + + /* let perm_exec_w3 = { let mut perm_exec_w3: Vec> = vec![Vec::new(); consis_num_proofs]; for q in (0..consis_num_proofs).rev() { @@ -1325,6 +1349,7 @@ impl SNARK { } perm_exec_w3 }; + */ // commit the witnesses and inputs separately instance-by-instance let (perm_exec_poly_w2, perm_exec_poly_w3, perm_exec_poly_w3_shifted) = { let perm_exec_poly_w2 = { @@ -1376,7 +1401,7 @@ impl SNARK { // w3 is [v, x, pi, D, pi, D, pi, D] let mut block_w3: Vec>> = Vec::new(); let block_w2_prover = { - let mut block_w2 = Vec::new(); + let mut block_w2: Vec>> = Vec::new(); let block_w2_size_list: Vec = (0..block_num_instances) .map(|i| { (2 * num_inputs_unpadded + 2 * block_num_phy_ops[i] + 4 * block_num_vir_ops[i]) @@ -1408,113 +1433,125 @@ impl SNARK { |b: usize, i: usize| 2 * num_inputs_unpadded + 2 * block_num_phy_ops[b] + 4 * i + 3; for p in 0..block_num_instances { - block_w2.push(vec![Vec::new(); block_num_proofs[p]]); - block_w3.push(vec![Vec::new(); block_num_proofs[p]]); - for q in (0..block_num_proofs[p]).rev() { + let block_w2_p: Vec>; + let mut block_w3_p: Vec>; + // Entries that do not depend on others can be generated in parallel + (block_w2_p, block_w3_p) = (0..block_num_proofs[p]).into_par_iter().map(|q| { let V_CNST = block_vars_mat[p][q][0]; // For INPUT - block_w2[p][q] = vec![S::field_zero(); block_w2_size_list[p]]; + let mut q2 = vec![S::field_zero(); block_w2_size_list[p]]; - block_w2[p][q][0] = block_vars_mat[p][q][0]; - block_w2[p][q][1] = block_vars_mat[p][q][0]; + q2[0] = block_vars_mat[p][q][0]; + q2[1] = block_vars_mat[p][q][0]; for i in 1..2 * (num_inputs_unpadded - 1) { - block_w2[p][q][2 + i] = - block_w2[p][q][2 + i] + perm_w0[i] * block_vars_mat[p][q][i + 2]; + q2[2 + i] = q2[2 + i] + perm_w0[i] * block_vars_mat[p][q][i + 2]; } for i in 0..num_inputs_unpadded - 1 { let perm = if i == 0 { S::field_one() } else { perm_w0[i] }; - block_w2[p][q][0] = block_w2[p][q][0] + perm * block_vars_mat[p][q][2 + i]; - block_w2[p][q][2] = - block_w2[p][q][2] + perm * block_vars_mat[p][q][2 + (num_inputs_unpadded - 1) + i]; - } - block_w2[p][q][0] = block_w2[p][q][0] * block_vars_mat[p][q][0]; - let ZO = block_w2[p][q][2]; - block_w2[p][q][1] = block_w2[p][q][1] + ZO; - block_w2[p][q][1] = block_w2[p][q][1] * block_vars_mat[p][q][0]; - block_w3[p][q] = vec![S::field_zero(); 8]; - block_w3[p][q][0] = block_vars_mat[p][q][0]; - block_w3[p][q][1] = block_w3[p][q][0] - * (comb_tau - - block_w2[p][q][3..] - .iter() - .fold(S::field_zero(), |a, b| a + *b) - - block_vars_mat[p][q][2]); - if q != block_num_proofs[p] - 1 { - block_w3[p][q][3] = block_w3[p][q][1] - * (block_w3[p][q + 1][2] + S::field_one() - block_w3[p][q + 1][0]); - } else { - block_w3[p][q][3] = block_w3[p][q][1]; + q2[0] = q2[0] + perm * block_vars_mat[p][q][2 + i]; + q2[2] = q2[2] + perm * block_vars_mat[p][q][2 + (num_inputs_unpadded - 1) + i]; } - block_w3[p][q][2] = block_w3[p][q][0] * block_w3[p][q][3]; + q2[0] = q2[0] * block_vars_mat[p][q][0]; + let ZO = q2[2]; + q2[1] = q2[1] + ZO; + q2[1] = q2[1] * block_vars_mat[p][q][0]; + let mut q3 = vec![S::field_zero(); 8]; + q3[0] = block_vars_mat[p][q][0]; // For PHY // Compute PMR, PMC for i in 0..block_num_phy_ops[p] { // PMR = r * PD - block_w2[p][q][V_PMR(i)] = comb_r * block_vars_mat[p][q][io_width + V_PD(i)]; + q2[V_PMR(i)] = comb_r * block_vars_mat[p][q][io_width + V_PD(i)]; // PMC = (1 or PMC[i-1]) * (tau - PA - PMR) let t = if i == 0 { V_CNST } else { - block_w2[p][q][V_PMC(i - 1)] + q2[V_PMC(i - 1)] }; - block_w2[p][q][V_PMC(i)] = t - * (comb_tau - block_vars_mat[p][q][io_width + V_PA(i)] - block_w2[p][q][V_PMR(i)]); + q2[V_PMC(i)] = t + * (comb_tau - block_vars_mat[p][q][io_width + V_PA(i)] - q2[V_PMR(i)]); } - // Compute x - let px = if block_num_phy_ops[p] == 0 { - V_CNST - } else { - block_w2[p][q][V_PMC(block_num_phy_ops[p] - 1)] - }; - // Compute D and pi - if q != block_num_proofs[p] - 1 { - block_w3[p][q][5] = - px * (block_w3[p][q + 1][4] + S::field_one() - block_w3[p][q + 1][0]); - } else { - block_w3[p][q][5] = px; - } - block_w3[p][q][4] = V_CNST * block_w3[p][q][5]; // For VIR // Compute VMR1, VMR2, VMR3, VMC for i in 0..block_num_vir_ops[p] { // VMR1 = r * VD - block_w2[p][q][V_VMR1(p, i)] = comb_r * block_vars_mat[p][q][io_width + V_VD(p, i)]; + q2[V_VMR1(p, i)] = comb_r * block_vars_mat[p][q][io_width + V_VD(p, i)]; // VMR2 = r^2 * VL - block_w2[p][q][V_VMR2(p, i)] = + q2[V_VMR2(p, i)] = comb_r * comb_r * block_vars_mat[p][q][io_width + V_VL(p, i)]; // VMR1 = r^3 * VT - block_w2[p][q][V_VMR3(p, i)] = + q2[V_VMR3(p, i)] = comb_r * comb_r * comb_r * block_vars_mat[p][q][io_width + V_VT(p, i)]; // VMC = (1 or VMC[i-1]) * (tau - VA - VMR1 - VMR2 - VMR3) let t = if i == 0 { V_CNST } else { - block_w2[p][q][V_VMC(p, i - 1)] + q2[V_VMC(p, i - 1)] }; - block_w2[p][q][V_VMC(p, i)] = t + q2[V_VMC(p, i)] = t * (comb_tau - block_vars_mat[p][q][io_width + V_VA(p, i)] - - block_w2[p][q][V_VMR1(p, i)] - - block_w2[p][q][V_VMR2(p, i)] - - block_w2[p][q][V_VMR3(p, i)]); + - q2[V_VMR1(p, i)] + - q2[V_VMR2(p, i)] + - q2[V_VMR3(p, i)]); + } + (q2, q3) + }).unzip(); + // Generate sequential entries separately + for q in (0..block_num_proofs[p]).rev() { + let V_CNST = block_vars_mat[p][q][0]; + // For INPUT + block_w3_p[q][1] = block_w3_p[q][0] + * (comb_tau + - block_w2_p[q][3..] + .iter() + .fold(S::field_zero(), |a, b| a + *b) + - block_vars_mat[p][q][2]); + if q != block_num_proofs[p] - 1 { + block_w3_p[q][3] = block_w3_p[q][1] + * (block_w3_p[q + 1][2] + S::field_one() - block_w3_p[q + 1][0]); + } else { + block_w3_p[q][3] = block_w3_p[q][1]; } + block_w3_p[q][2] = block_w3_p[q][0] * block_w3_p[q][3]; + + // For PHY + // Compute x + let px = if block_num_phy_ops[p] == 0 { + V_CNST + } else { + block_w2_p[q][V_PMC(block_num_phy_ops[p] - 1)] + }; + // Compute D and pi + if q != block_num_proofs[p] - 1 { + block_w3_p[q][5] = + px * (block_w3_p[q + 1][4] + S::field_one() - block_w3_p[q + 1][0]); + } else { + block_w3_p[q][5] = px; + } + block_w3_p[q][4] = V_CNST * block_w3_p[q][5]; + + // For VIR // Compute x let vx = if block_num_vir_ops[p] == 0 { V_CNST } else { - block_w2[p][q][V_VMC(p, block_num_vir_ops[p] - 1)] + block_w2_p[q][V_VMC(p, block_num_vir_ops[p] - 1)] }; // Compute D and pi if q != block_num_proofs[p] - 1 { - block_w3[p][q][7] = - vx * (block_w3[p][q + 1][6] + S::field_one() - block_w3[p][q + 1][0]); + block_w3_p[q][7] = + vx * (block_w3_p[q + 1][6] + S::field_one() - block_w3_p[q + 1][0]); } else { - block_w3[p][q][7] = vx; + block_w3_p[q][7] = vx; } - block_w3[p][q][6] = V_CNST * block_w3[p][q][7]; + block_w3_p[q][6] = V_CNST * block_w3_p[q][7]; } + + block_w2.push(block_w2_p); + block_w3.push(block_w3_p); } // commit the witnesses and inputs separately instance-by-instance @@ -1574,14 +1611,13 @@ impl SNARK { let perm_w0_prover = ProverWitnessSecInfo::new(vec![vec![perm_w0]], vec![perm_poly_w0]); let perm_exec_w2_prover = ProverWitnessSecInfo::new(vec![perm_exec_w2], vec![perm_exec_poly_w2]); - let perm_exec_w3_prover = - ProverWitnessSecInfo::new(vec![perm_exec_w3.clone()], vec![perm_exec_poly_w3]); let perm_exec_w3_shifted_prover = ProverWitnessSecInfo::new( vec![[perm_exec_w3[1..].to_vec(), vec![vec![S::field_zero(); 8]]].concat()], vec![perm_exec_poly_w3_shifted], ); + let perm_exec_w3_prover = + ProverWitnessSecInfo::new(vec![perm_exec_w3], vec![perm_exec_poly_w3]); - let block_w3_prover = ProverWitnessSecInfo::new(block_w3.clone(), block_poly_w3_list); let block_w3_shifted_prover = ProverWitnessSecInfo::new( block_w3 .iter() @@ -1589,6 +1625,7 @@ impl SNARK { .collect(), block_poly_w3_list_shifted, ); + let block_w3_prover = ProverWitnessSecInfo::new(block_w3, block_poly_w3_list); ( comb_tau, From 2504e802bfad7e8f1d01c48126dafb2be791c1d6 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 3 Jan 2025 12:27:11 -0500 Subject: [PATCH 46/54] Time info for debugging --- spartan_parallel/src/lib.rs | 49 ++++++++++++------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index e1e54e7c..7f623abb 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -1268,6 +1268,7 @@ impl SNARK { // create a multilinear polynomial using the supplied assignment for variables let perm_poly_w0 = DensePolynomial::new(perm_w0.clone()); + let timer_tmp = Timer::new("exec_gen"); // PERM_EXEC // w2 is _, _, ZO, r * i1, r^2 * i2, r^3 * i3, ... // where ZO * r^n = r^n * o0 + r^(n + 1) * o1, ..., @@ -1324,32 +1325,9 @@ impl SNARK { } (perm_exec_w2, perm_exec_w3) }; + timer_tmp.stop(); - /* - let perm_exec_w3 = { - let mut perm_exec_w3: Vec> = vec![Vec::new(); consis_num_proofs]; - for q in (0..consis_num_proofs).rev() { - perm_exec_w3[q] = vec![S::field_zero(); 8]; - perm_exec_w3[q][0] = exec_inputs_list[q][0]; - perm_exec_w3[q][1] = perm_exec_w3[q][0] - * (comb_tau - - perm_exec_w2[q][3..] - .iter() - .fold(S::field_zero(), |a, b| a + *b) - - exec_inputs_list[q][2]); - perm_exec_w3[q][4] = perm_exec_w2[q][0]; - perm_exec_w3[q][5] = perm_exec_w2[q][1]; - if q != consis_num_proofs - 1 { - perm_exec_w3[q][3] = perm_exec_w3[q][1] - * (perm_exec_w3[q + 1][2] + S::field_one() - perm_exec_w3[q + 1][0]); - } else { - perm_exec_w3[q][3] = perm_exec_w3[q][1]; - } - perm_exec_w3[q][2] = perm_exec_w3[q][0] * perm_exec_w3[q][3]; - } - perm_exec_w3 - }; - */ + let timer_tmp = Timer::new("exec_poly"); // commit the witnesses and inputs separately instance-by-instance let (perm_exec_poly_w2, perm_exec_poly_w3, perm_exec_poly_w3_shifted) = { let perm_exec_poly_w2 = { @@ -1394,13 +1372,15 @@ impl SNARK { perm_exec_poly_w3_shifted, ) }; + timer_tmp.stop(); + let timer_tmp = Timer::new("block_gen"); // INPUT_BLOCK_W2 | PHY_MEM_BLOCK_W2 & VIR_MEM_BLOCK_W2 // BLOCK_W3 // INPUT PHY VIR // w3 is [v, x, pi, D, pi, D, pi, D] let mut block_w3: Vec>> = Vec::new(); - let block_w2_prover = { + let block_w2 = { let mut block_w2: Vec>> = Vec::new(); let block_w2_size_list: Vec = (0..block_num_instances) .map(|i| { @@ -1554,6 +1534,12 @@ impl SNARK { block_w3.push(block_w3_p); } + block_w2 + }; + timer_tmp.stop(); + + let timer_tmp = Timer::new("block_gen"); + let (block_poly_w2_list, block_poly_w3_list, block_poly_w3_list_shifted) = { // commit the witnesses and inputs separately instance-by-instance let mut block_poly_w2_list = Vec::new(); @@ -1567,12 +1553,7 @@ impl SNARK { }; block_poly_w2_list.push(block_poly_w2); } - - let block_w2_prover = ProverWitnessSecInfo::new(block_w2.clone(), block_poly_w2_list); - - block_w2_prover - }; - let (block_poly_w3_list, block_poly_w3_list_shifted) = { + let mut block_poly_w3_list = Vec::new(); let mut block_poly_w3_list_shifted = Vec::new(); @@ -1605,8 +1586,9 @@ impl SNARK { block_poly_w3_list_shifted.push(block_poly_w3_shifted); } - (block_poly_w3_list, block_poly_w3_list_shifted) + (block_poly_w2_list, block_poly_w3_list, block_poly_w3_list_shifted) }; + timer_tmp.stop(); let perm_w0_prover = ProverWitnessSecInfo::new(vec![vec![perm_w0]], vec![perm_poly_w0]); let perm_exec_w2_prover = @@ -1618,6 +1600,7 @@ impl SNARK { let perm_exec_w3_prover = ProverWitnessSecInfo::new(vec![perm_exec_w3], vec![perm_exec_poly_w3]); + let block_w2_prover = ProverWitnessSecInfo::new(block_w2, block_poly_w2_list); let block_w3_shifted_prover = ProverWitnessSecInfo::new( block_w3 .iter() From ae0b66af73366ba2fb4c4e8f0763798123e17769 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 3 Jan 2025 13:48:05 -0500 Subject: [PATCH 47/54] Minor udpates to witness gen --- spartan_parallel/src/lib.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 7f623abb..0b8ecde1 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -1268,7 +1268,6 @@ impl SNARK { // create a multilinear polynomial using the supplied assignment for variables let perm_poly_w0 = DensePolynomial::new(perm_w0.clone()); - let timer_tmp = Timer::new("exec_gen"); // PERM_EXEC // w2 is _, _, ZO, r * i1, r^2 * i2, r^3 * i3, ... // where ZO * r^n = r^n * o0 + r^(n + 1) * o1, ..., @@ -1325,9 +1324,7 @@ impl SNARK { } (perm_exec_w2, perm_exec_w3) }; - timer_tmp.stop(); - let timer_tmp = Timer::new("exec_poly"); // commit the witnesses and inputs separately instance-by-instance let (perm_exec_poly_w2, perm_exec_poly_w3, perm_exec_poly_w3_shifted) = { let perm_exec_poly_w2 = { @@ -1372,9 +1369,7 @@ impl SNARK { perm_exec_poly_w3_shifted, ) }; - timer_tmp.stop(); - let timer_tmp = Timer::new("block_gen"); // INPUT_BLOCK_W2 | PHY_MEM_BLOCK_W2 & VIR_MEM_BLOCK_W2 // BLOCK_W3 // INPUT PHY VIR @@ -1536,9 +1531,7 @@ impl SNARK { block_w2 }; - timer_tmp.stop(); - let timer_tmp = Timer::new("block_gen"); let (block_poly_w2_list, block_poly_w3_list, block_poly_w3_list_shifted) = { // commit the witnesses and inputs separately instance-by-instance let mut block_poly_w2_list = Vec::new(); @@ -1588,7 +1581,6 @@ impl SNARK { (block_poly_w2_list, block_poly_w3_list, block_poly_w3_list_shifted) }; - timer_tmp.stop(); let perm_w0_prover = ProverWitnessSecInfo::new(vec![vec![perm_w0]], vec![perm_poly_w0]); let perm_exec_w2_prover = @@ -1927,22 +1919,22 @@ impl SNARK { let block_vars_prover = ProverWitnessSecInfo::new(block_vars_mat, block_poly_vars_list); let exec_inputs_prover = ProverWitnessSecInfo::new(vec![exec_inputs_list], exec_poly_inputs); let init_phy_mems_prover = if total_num_init_phy_mem_accesses > 0 { - ProverWitnessSecInfo::new(vec![init_phy_mems_list.clone()], poly_init_phy_mems) + ProverWitnessSecInfo::new(vec![init_phy_mems_list], poly_init_phy_mems) } else { ProverWitnessSecInfo::dummy() }; let init_vir_mems_prover = if total_num_init_vir_mem_accesses > 0 { - ProverWitnessSecInfo::new(vec![init_vir_mems_list.clone()], poly_init_vir_mems) + ProverWitnessSecInfo::new(vec![init_vir_mems_list], poly_init_vir_mems) } else { ProverWitnessSecInfo::dummy() }; let addr_phy_mems_prover = if total_num_phy_mem_accesses > 0 { - ProverWitnessSecInfo::new(vec![addr_phy_mems_list.clone()], addr_poly_phy_mems) + ProverWitnessSecInfo::new(vec![addr_phy_mems_list], addr_poly_phy_mems) } else { ProverWitnessSecInfo::dummy() }; let addr_vir_mems_prover = if total_num_vir_mem_accesses > 0 { - ProverWitnessSecInfo::new(vec![addr_vir_mems_list.clone()], addr_poly_vir_mems) + ProverWitnessSecInfo::new(vec![addr_vir_mems_list], addr_poly_vir_mems) } else { ProverWitnessSecInfo::dummy() }; From b7a4e646a4f749d4e0a3fc1571eef0c24e25c07c Mon Sep 17 00:00:00 2001 From: Ray Gao Date: Mon, 6 Jan 2025 19:33:01 -0800 Subject: [PATCH 48/54] Feat/Switch Spartan Backend to Use Goldilocks Field (#17) * Reversable: temporarily remove non-compiling parts * Remove PCS and add Goldilocks * Recover intermediate proofs * Recover intermediate proofs * Remove elliptic group definition * Remove remnant ristretto255 * Remove comment blocks * Correct goldilocks implementation * Make workflow pass * Remove extra space * Remove comment blocks * Correct comment blocks * Correct arithmetics * Recover SNARK verify checks * Recover sumcheck instance verification check * Comment out non-existent binaries. * Remove unused binaries * Graft in ceno-goldilocks * Modify pow fn * Add degree2 extension of goldilocks. Convert to ceno-goldilocks * Migrate to generic instead of base field * Migrate to generic instead of base field * Migrate to generic instead of base field * Remove unnecessary parameter specification * Add deserialize trait bound * fmt * Resolve conflicts/duplicates/dep versioning from merge * fmt * fmt * Correct itertools version * Restore transcript consistency * fmt * Code improvement * Code improvement * Code improvement * Code improvement * Import ceno-goldilocks main branch * fmt * Reuse Goldilocks random * Add basefield arithmetics * fmt * Use degree 2 ext for soundness * Specify output * Correct BaseField trait bound * Improve arithmetic definition * Reorder arithmetic definition * Add arithmetic traits * Feat/Remove ZK from Spartan Backend (#53) --------- Co-authored-by: Yuncong Zhang Co-authored-by: Matthias Goergens --- circ_blocks/Cargo.lock | 141 +- circ_blocks/examples/zxc.rs | 83 +- spartan_parallel/Cargo.toml | 2 + spartan_parallel/examples/interface.rs | 71 +- spartan_parallel/src/commitment/binius.rs | 99 - .../src/commitment/commitment_scheme.rs | 115 -- spartan_parallel/src/commitment/hyperkzg.rs | 791 ------- spartan_parallel/src/commitment/hyrax.rs | 539 ----- spartan_parallel/src/commitment/kzg.rs | 256 --- spartan_parallel/src/commitment/mock.rs | 148 -- spartan_parallel/src/commitment/mod.rs | 10 - spartan_parallel/src/commitment/pedersen.rs | 64 - spartan_parallel/src/commitment/zeromorph.rs | 992 --------- spartan_parallel/src/commitments.rs | 93 - spartan_parallel/src/custom_dense_mlpoly.rs | 103 +- spartan_parallel/src/dense_mlpoly.rs | 1081 ++-------- spartan_parallel/src/group.rs | 117 -- spartan_parallel/src/instance.rs | 179 +- spartan_parallel/src/lib.rs | 1836 ++++++----------- spartan_parallel/src/nizk/bullet.rs | 243 --- spartan_parallel/src/nizk/mod.rs | 735 ------- spartan_parallel/src/product_tree.rs | 177 +- spartan_parallel/src/r1csinstance.rs | 181 +- spartan_parallel/src/r1csproof.rs | 548 ++--- spartan_parallel/src/random.rs | 18 +- spartan_parallel/src/scalar/fp.rs | 227 ++ spartan_parallel/src/scalar/fp2.rs | 253 +++ spartan_parallel/src/scalar/mod.rs | 326 ++- spartan_parallel/src/scalar/ristretto255.rs | 1210 ----------- spartan_parallel/src/sparse_mlpoly.rs | 936 ++++----- spartan_parallel/src/sumcheck.rs | 642 ++---- spartan_parallel/src/transcript.rs | 50 +- spartan_parallel/src/unipoly.rs | 80 +- 33 files changed, 2799 insertions(+), 9547 deletions(-) delete mode 100644 spartan_parallel/src/commitment/binius.rs delete mode 100644 spartan_parallel/src/commitment/commitment_scheme.rs delete mode 100644 spartan_parallel/src/commitment/hyperkzg.rs delete mode 100644 spartan_parallel/src/commitment/hyrax.rs delete mode 100644 spartan_parallel/src/commitment/kzg.rs delete mode 100644 spartan_parallel/src/commitment/mock.rs delete mode 100644 spartan_parallel/src/commitment/mod.rs delete mode 100644 spartan_parallel/src/commitment/pedersen.rs delete mode 100644 spartan_parallel/src/commitment/zeromorph.rs delete mode 100644 spartan_parallel/src/commitments.rs delete mode 100644 spartan_parallel/src/group.rs delete mode 100644 spartan_parallel/src/nizk/bullet.rs delete mode 100644 spartan_parallel/src/nizk/mod.rs create mode 100644 spartan_parallel/src/scalar/fp.rs create mode 100644 spartan_parallel/src/scalar/fp2.rs delete mode 100755 spartan_parallel/src/scalar/ristretto255.rs diff --git a/circ_blocks/Cargo.lock b/circ_blocks/Cargo.lock index 680bd413..3ac35621 100644 --- a/circ_blocks/Cargo.lock +++ b/circ_blocks/Cargo.lock @@ -8,7 +8,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" dependencies = [ - "num-bigint", + "num-bigint 0.3.3", "num-integer", "num-traits", ] @@ -160,8 +160,8 @@ dependencies = [ "blake2s_simd", "byteorder", "crossbeam-channel", - "ff", - "group", + "ff 0.12.2", + "group 0.12.1", "lazy_static", "log", "merlin", @@ -210,6 +210,17 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2b_simd" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23285ad32269793932e830392f2fe2f83e26488fd3ec778883a93c8323735780" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + [[package]] name = "blake2s_simd" version = "1.0.2" @@ -257,8 +268,8 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3c196a77437e7cc2fb515ce413a6401291578b5afc8ecb29a3c7ab957f05941" dependencies = [ - "ff", - "group", + "ff 0.12.2", + "group 0.12.1", "pairing", "rand_core 0.6.4", "subtle", @@ -297,12 +308,12 @@ dependencies = [ "circ_waksman", "curve25519-dalek 4.1.3", "env_logger 0.11.5", - "ff", + "ff 0.12.2", "from-pest", "fxhash", "gmp-mpfr-sys", "good_lp", - "group", + "group 0.12.1", "ieee754", "im", "itertools 0.10.5", @@ -343,7 +354,7 @@ name = "circ_fields" version = "0.1.0" dependencies = [ "datasize", - "ff", + "ff 0.12.2", "ff-derive-num", "ff_derive 0.12.1", "lazy_static", @@ -691,6 +702,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ff-derive-num" version = "0.2.0" @@ -711,7 +733,7 @@ checksum = "17db6fa0748f1f66e9dbafba1881009b50614948c0e900f59083afff2f8d784b" dependencies = [ "addchain", "cfg-if", - "num-bigint", + "num-bigint 0.3.3", "num-integer", "num-traits", "proc-macro2", @@ -725,7 +747,7 @@ version = "0.12.2" dependencies = [ "addchain", "cfg-if", - "num-bigint", + "num-bigint 0.3.3", "num-integer", "num-traits", "proc-macro2", @@ -844,6 +866,19 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "goldilocks" +version = "0.1.0" +source = "git+https://github.com/scroll-tech/ceno-Goldilocks#29a15d186ce4375dab346a3cc9eca6e43540cb8d" +dependencies = [ + "ff 0.13.0", + "halo2curves", + "itertools 0.12.1", + "rand_core 0.6.4", + "serde", + "subtle", +] + [[package]] name = "good_lp" version = "1.10.0" @@ -861,11 +896,42 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" dependencies = [ - "ff", + "ff 0.12.2", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] +[[package]] +name = "halo2curves" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b1142bd1059aacde1b477e0c80c142910f1ceae67fc619311d6a17428007ab" +dependencies = [ + "blake2b_simd", + "ff 0.13.0", + "group 0.13.0", + "lazy_static", + "num-bigint 0.4.6", + "num-traits", + "pasta_curves", + "paste", + "rand 0.8.5", + "rand_core 0.6.4", + "static_assertions", + "subtle", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -944,6 +1010,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -979,6 +1054,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -1103,6 +1181,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -1158,7 +1246,22 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" dependencies = [ - "group", + "group 0.12.1", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff 0.13.0", + "group 0.13.0", + "lazy_static", + "rand 0.8.5", + "static_assertions", + "subtle", ] [[package]] @@ -1599,7 +1702,9 @@ dependencies = [ "colored", "curve25519-dalek 4.1.3", "digest 0.10.7", + "ff 0.13.0", "flate2", + "goldilocks", "itertools 0.13.0", "merlin", "rand 0.8.5", @@ -1610,6 +1715,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index ac73171a..c2627f31 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -12,6 +12,7 @@ use circ::target::r1cs::wit_comp::StagedWitCompEvaluator; use circ::target::r1cs::ProverData; use circ::target::r1cs::{Lc, VarType}; use core::cmp::min; +use libspartan::scalar::{ScalarExt2, SpartanExtensionField}; use rug::Integer; use std::fs::{create_dir_all, File}; @@ -23,15 +24,16 @@ use circ::cfg::{ CircOpt, }; use core::cmp::Ordering; -use std::path::{Path, PathBuf}; +use std::path::Path; +use std::path::PathBuf; use libspartan::{ - instance::Instance, Assignment, InputsAssignment, MemsAssignment, SNARKGens, VarsAssignment, - SNARK, + instance::Instance, Assignment, InputsAssignment, MemsAssignment, VarsAssignment, SNARK, }; use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::time::*; +use std::time::*; // How many reserved variables (EXCLUDING V) are in front of the actual input / output? // %BN, %RET, %TS, %AS, %SP, %BP @@ -350,7 +352,7 @@ impl CompileTimeKnowledge { } #[derive(Serialize, Deserialize)] -struct RunTimeKnowledge { +struct RunTimeKnowledge { block_max_num_proofs: usize, block_num_proofs: Vec, consis_num_proofs: usize, @@ -359,14 +361,14 @@ struct RunTimeKnowledge { total_num_phy_mem_accesses: usize, total_num_vir_mem_accesses: usize, - block_vars_matrix: Vec>, - exec_inputs: Vec, + block_vars_matrix: Vec>>, + exec_inputs: Vec>, // Initial memory state, in (addr, val, ls = STORE, ts = 0) pair, sorted by appearance in program input (the same as address order) - init_phy_mems_list: Vec, - init_vir_mems_list: Vec, - addr_phy_mems_list: Vec, - addr_vir_mems_list: Vec, - addr_ts_bits_list: Vec, + init_phy_mems_list: Vec>, + init_vir_mems_list: Vec>, + addr_phy_mems_list: Vec>, + addr_vir_mems_list: Vec>, + addr_ts_bits_list: Vec>, input: Vec<[u8; 32]>, input_stack: Vec<[u8; 32]>, @@ -375,7 +377,7 @@ struct RunTimeKnowledge { output_exec_num: usize, } -impl RunTimeKnowledge { +impl RunTimeKnowledge { fn serialize_to_file(&self, benchmark_name: String) -> std::io::Result<()> { let file_name = format!("../zok_tests/inputs/{benchmark_name}_bin.rtk"); create_dir_all(Path::new(&file_name).parent().unwrap())?; @@ -830,7 +832,7 @@ fn get_compile_time_knowledge( // -- // Generate witnesses and others // -- -fn get_run_time_knowledge( +fn get_run_time_knowledge( path: PathBuf, options: &Options, entry_regs: Vec, @@ -843,7 +845,7 @@ fn get_run_time_knowledge( prover_data_list: Vec, total_num_init_phy_mem_accesses: usize, total_num_init_vir_mem_accesses: usize, -) -> RunTimeKnowledge { +) -> RunTimeKnowledge { let num_blocks = ctk.block_num_instances; let num_input_unpadded = ctk.num_inputs_unpadded; let io_width = 2 * num_input_unpadded; @@ -1265,7 +1267,10 @@ fn get_run_time_knowledge( } } -fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { +fn run_spartan_proof( + ctk: CompileTimeKnowledge, + rtk: RunTimeKnowledge, +) { // -- // INSTANCE PREPROCESSING // -- @@ -1337,46 +1342,14 @@ fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { // -- // COMMITMENT PREPROCESSING // -- - println!("Producing Public Parameters..."); - // produce public parameters - let block_gens = SNARKGens::new( - block_num_cons, - block_num_vars, - block_num_instances_bound, - block_num_non_zero_entries, - ); - let pairwise_check_gens = SNARKGens::new( - pairwise_check_num_cons, - 4 * pairwise_check_num_vars, - 3, - pairwise_check_num_non_zero_entries, - ); - let perm_root_gens = SNARKGens::new( - perm_root_num_cons, - 8 * num_ios, - 1, - perm_root_num_non_zero_entries, - ); - // Only use one version of gens_r1cs_sat - let vars_gens = SNARKGens::new( - block_num_cons, - TOTAL_NUM_VARS_BOUND, - block_num_instances_bound.next_power_of_two(), - block_num_non_zero_entries, - ) - .gens_r1cs_sat; - - // create a commitment to the R1CS instance println!("Comitting Circuits..."); // block_comm_map records the sparse_polys committed in each commitment // Note that A, B, C are committed separately, so sparse_poly[3*i+2] corresponds to poly C of instance i - let (block_comm_map, block_comm_list, block_decomm_list) = - SNARK::multi_encode(&block_inst, &block_gens); + let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst); println!("Finished Block"); - let (pairwise_check_comm, pairwise_check_decomm) = - SNARK::encode(&pairwise_check_inst, &pairwise_check_gens); + let (pairwise_check_comm, pairwise_check_decomm) = SNARK::encode(&pairwise_check_inst); println!("Finished Pairwise"); - let (perm_root_comm, perm_root_decomm) = SNARK::encode(&perm_root_inst, &perm_root_gens); + let (perm_root_comm, perm_root_decomm) = SNARK::encode(&perm_root_inst); println!("Finished Perm"); // -- @@ -1419,7 +1392,6 @@ fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { &block_comm_map, &block_comm_list, &block_decomm_list, - &block_gens, rtk.consis_num_proofs, rtk.total_num_init_phy_mem_accesses, rtk.total_num_init_vir_mem_accesses, @@ -1428,7 +1400,6 @@ fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { &mut pairwise_check_inst, &pairwise_check_comm, &pairwise_check_decomm, - &pairwise_check_gens, block_vars_matrix, rtk.exec_inputs, rtk.init_phy_mems_list, @@ -1439,8 +1410,6 @@ fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { &perm_root_inst, &perm_root_comm, &perm_root_decomm, - &perm_root_gens, - &vars_gens, &mut prover_transcript, ); @@ -1475,7 +1444,6 @@ fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { block_num_cons, &block_comm_map, &block_comm_list, - &block_gens, rtk.consis_num_proofs, rtk.total_num_init_phy_mem_accesses, rtk.total_num_init_vir_mem_accesses, @@ -1483,11 +1451,8 @@ fn run_spartan_proof(ctk: CompileTimeKnowledge, rtk: RunTimeKnowledge) { rtk.total_num_vir_mem_accesses, pairwise_check_num_cons, &pairwise_check_comm, - &pairwise_check_gens, perm_root_num_cons, &perm_root_comm, - &perm_root_gens, - &vars_gens, &mut verifier_transcript ) .is_ok()); @@ -1604,7 +1569,7 @@ fn main() { // -- // Generate Witnesses // -- - let rtk = get_run_time_knowledge::( + let rtk = get_run_time_knowledge::( path.clone(), &options, entry_regs, diff --git a/spartan_parallel/Cargo.toml b/spartan_parallel/Cargo.toml index a891df97..2472d2d5 100644 --- a/spartan_parallel/Cargo.toml +++ b/spartan_parallel/Cargo.toml @@ -28,6 +28,8 @@ zeroize = { version = "1", default-features = false, features = ["alloc"] } itertools = { version = "0.13", default-features = false } colored = { version = "2", default-features = false, optional = true } flate2 = { version = "1" } +goldilocks = { git = "https://github.com/scroll-tech/ceno-Goldilocks" } +ff = "0.13.0" [dev-dependencies] criterion = "0.5" diff --git a/spartan_parallel/examples/interface.rs b/spartan_parallel/examples/interface.rs index 0a82ce9e..dc1e26fc 100644 --- a/spartan_parallel/examples/interface.rs +++ b/spartan_parallel/examples/interface.rs @@ -5,9 +5,8 @@ use std::io::{BufRead, Read}; use std::{default, env}; use std::{fs::File, io::BufReader}; -use libspartan::{ - instance::Instance, InputsAssignment, MemsAssignment, SNARKGens, VarsAssignment, SNARK, -}; +use libspartan::scalar::{ScalarExt2, SpartanExtensionField}; +use libspartan::{instance::Instance, InputsAssignment, MemsAssignment, VarsAssignment, SNARK}; use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::time::*; @@ -53,7 +52,7 @@ impl CompileTimeKnowledge { // Everything provided by the prover #[derive(Serialize, Deserialize)] -struct RunTimeKnowledge { +struct RunTimeKnowledge { block_max_num_proofs: usize, block_num_proofs: Vec, consis_num_proofs: usize, @@ -62,13 +61,13 @@ struct RunTimeKnowledge { total_num_phy_mem_accesses: usize, total_num_vir_mem_accesses: usize, - block_vars_matrix: Vec>, - exec_inputs: Vec, - init_phy_mems_list: Vec, - init_vir_mems_list: Vec, - addr_phy_mems_list: Vec, - addr_vir_mems_list: Vec, - addr_ts_bits_list: Vec, + block_vars_matrix: Vec>>, + exec_inputs: Vec>, + init_phy_mems_list: Vec>, + init_vir_mems_list: Vec>, + addr_phy_mems_list: Vec>, + addr_vir_mems_list: Vec>, + addr_ts_bits_list: Vec>, input: Vec<[u8; 32]>, input_stack: Vec<[u8; 32]>, @@ -77,8 +76,8 @@ struct RunTimeKnowledge { output_exec_num: usize, } -impl RunTimeKnowledge { - fn deserialize_from_file(benchmark_name: String) -> RunTimeKnowledge { +impl serde::de::Deserialize<'de>> RunTimeKnowledge { + fn deserialize_from_file(benchmark_name: String) -> RunTimeKnowledge { let file_name = format!("../zok_tests/inputs/{}_bin.rtk", benchmark_name); let mut f = File::open(file_name).unwrap(); let mut content: Vec = Vec::new(); @@ -92,7 +91,8 @@ fn main() { // let ctk = CompileTimeKnowledge::read_from_file(benchmark_name.to_string()).unwrap(); let ctk = CompileTimeKnowledge::deserialize_from_file(benchmark_name.to_string()); // let rtk = RunTimeKnowledge::read_from_file(benchmark_name.to_string()).unwrap(); - let rtk = RunTimeKnowledge::deserialize_from_file(benchmark_name.to_string()); + let rtk: RunTimeKnowledge = + RunTimeKnowledge::deserialize_from_file(benchmark_name.to_string()); // -- // INSTANCE PREPROCESSING @@ -166,45 +166,16 @@ fn main() { // COMMITMENT PREPROCESSING // -- println!("Producing Public Parameters..."); - // produce public parameters - let block_gens = SNARKGens::new( - block_num_cons, - block_num_vars, - block_num_instances_bound, - block_num_non_zero_entries, - ); - let pairwise_check_gens = SNARKGens::new( - pairwise_check_num_cons, - 4 * pairwise_check_num_vars, - 3, - pairwise_check_num_non_zero_entries, - ); - let perm_root_gens = SNARKGens::new( - perm_root_num_cons, - 8 * num_ios, - 1, - perm_root_num_non_zero_entries, - ); - // Only use one version of gens_r1cs_sat - let vars_gens = SNARKGens::new( - block_num_cons, - TOTAL_NUM_VARS_BOUND, - block_num_instances_bound.next_power_of_two(), - block_num_non_zero_entries, - ) - .gens_r1cs_sat; // create a commitment to the R1CS instance println!("Comitting Circuits..."); // block_comm_map records the sparse_polys committed in each commitment // Note that A, B, C are committed separately, so sparse_poly[3*i+2] corresponds to poly C of instance i - let (block_comm_map, block_comm_list, block_decomm_list) = - SNARK::multi_encode(&block_inst, &block_gens); + let (block_comm_map, block_comm_list, block_decomm_list) = SNARK::multi_encode(&block_inst); println!("Finished Block"); - let (pairwise_check_comm, pairwise_check_decomm) = - SNARK::encode(&pairwise_check_inst, &pairwise_check_gens); + let (pairwise_check_comm, pairwise_check_decomm) = SNARK::encode(&pairwise_check_inst); println!("Finished Pairwise"); - let (perm_root_comm, perm_root_decomm) = SNARK::encode(&perm_root_inst, &perm_root_gens); + let (perm_root_comm, perm_root_decomm) = SNARK::encode(&perm_root_inst); println!("Finished Perm"); // -- @@ -247,7 +218,6 @@ fn main() { &block_comm_map, &block_comm_list, &block_decomm_list, - &block_gens, rtk.consis_num_proofs, rtk.total_num_init_phy_mem_accesses, rtk.total_num_init_vir_mem_accesses, @@ -256,7 +226,6 @@ fn main() { &mut pairwise_check_inst, &pairwise_check_comm, &pairwise_check_decomm, - &pairwise_check_gens, block_vars_matrix, rtk.exec_inputs, rtk.init_phy_mems_list, @@ -267,8 +236,6 @@ fn main() { &perm_root_inst, &perm_root_comm, &perm_root_decomm, - &perm_root_gens, - &vars_gens, &mut prover_transcript, ); @@ -303,7 +270,6 @@ fn main() { block_num_cons, &block_comm_map, &block_comm_list, - &block_gens, rtk.consis_num_proofs, rtk.total_num_init_phy_mem_accesses, rtk.total_num_init_vir_mem_accesses, @@ -311,11 +277,8 @@ fn main() { rtk.total_num_vir_mem_accesses, pairwise_check_num_cons, &pairwise_check_comm, - &pairwise_check_gens, perm_root_num_cons, &perm_root_comm, - &perm_root_gens, - &vars_gens, &mut verifier_transcript ) .is_ok()); diff --git a/spartan_parallel/src/commitment/binius.rs b/spartan_parallel/src/commitment/binius.rs deleted file mode 100644 index d1c5918b..00000000 --- a/spartan_parallel/src/commitment/binius.rs +++ /dev/null @@ -1,99 +0,0 @@ -#![allow(dead_code)] - -use crate::poly::commitment::commitment_scheme::BatchType; -use crate::poly::commitment::commitment_scheme::CommitShape; -use crate::poly::commitment::commitment_scheme::CommitmentScheme; -use crate::poly::dense_mlpoly::DensePolynomial; -use crate::utils::errors::ProofVerifyError; -use crate::utils::transcript::{AppendToTranscript, ProofTranscript}; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; - -#[derive(Clone)] -pub struct Binius128Scheme {} - -#[derive(Default, Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)] -pub struct BiniusCommitment {} - -impl AppendToTranscript for BiniusCommitment { - fn append_to_transcript(&self, _transcript: &mut ProofTranscript) { - todo!() - } -} - -#[derive(CanonicalSerialize, CanonicalDeserialize)] -pub struct BiniusProof {} - -#[derive(CanonicalSerialize, CanonicalDeserialize)] -pub struct BiniusBatchedProof {} - -#[derive(Clone)] -pub struct None {} - -impl CommitmentScheme for Binius128Scheme { - type Field = crate::field::binius::BiniusField; - type Setup = None; - type Commitment = BiniusCommitment; - type Proof = BiniusProof; - type BatchedProof = BiniusBatchedProof; - - fn setup(_shapes: &[CommitShape]) -> Self::Setup { - None {} - } - fn commit(_poly: &DensePolynomial, _setup: &Self::Setup) -> Self::Commitment { - todo!() - } - fn batch_commit( - _evals: &[&[Self::Field]], - _gens: &Self::Setup, - _batch_type: BatchType, - ) -> Vec { - todo!() - } - fn commit_slice(_evals: &[Self::Field], _setup: &Self::Setup) -> Self::Commitment { - todo!() - } - fn prove( - _none: &Self::Setup, - _poly: &DensePolynomial, - _opening_point: &[Self::Field], - _transcript: &mut ProofTranscript, - ) -> Self::Proof { - todo!() - } - fn batch_prove( - _none: &Self::Setup, - _polynomials: &[&DensePolynomial], - _opening_point: &[Self::Field], - _openings: &[Self::Field], - _batch_type: BatchType, - _transcript: &mut ProofTranscript, - ) -> Self::BatchedProof { - todo!() - } - - fn verify( - _proof: &Self::Proof, - _setup: &Self::Setup, - _transcript: &mut ProofTranscript, - _opening_point: &[Self::Field], - _opening: &Self::Field, - _commitment: &Self::Commitment, - ) -> Result<(), ProofVerifyError> { - todo!() - } - - fn batch_verify( - _batch_proof: &Self::BatchedProof, - _setup: &Self::Setup, - _opening_point: &[Self::Field], - _openings: &[Self::Field], - _commitments: &[&Self::Commitment], - _transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - todo!() - } - - fn protocol_name() -> &'static [u8] { - b"binius_commit" - } -} diff --git a/spartan_parallel/src/commitment/commitment_scheme.rs b/spartan_parallel/src/commitment/commitment_scheme.rs deleted file mode 100644 index bb524f6a..00000000 --- a/spartan_parallel/src/commitment/commitment_scheme.rs +++ /dev/null @@ -1,115 +0,0 @@ -use serde::Serialize; -use std::fmt::Debug; -use merlin::Transcript; - -use crate::{ - dense_mlpoly::DensePolynomial, - errors::ProofVerifyError, - transcript::{AppendToTranscript, ProofTranscript}, -}; - -#[derive(Clone, Debug)] -pub struct CommitShape { - pub input_length: usize, - pub batch_type: BatchType, -} - -impl CommitShape { - pub fn new(input_length: usize, batch_type: BatchType) -> Self { - Self { - input_length, - batch_type, - } - } -} - -#[derive(Clone, Debug)] -pub enum BatchType { - Big, - Small, - SurgeInitFinal, - SurgeReadWrite, -} - -pub trait CommitmentScheme: Clone + Sync + Send + 'static { - type Field; - type Setup: Clone + Sync + Send; - type Commitment: Default - + Debug - + Sync - + Send - + PartialEq - + Serialize - + AppendToTranscript; - type Proof: Sync + Send + Serialize; - type BatchedProof: Sync + Send + Serialize; - - fn setup(shapes: &[CommitShape]) -> Self::Setup; - fn commit(poly: &DensePolynomial, setup: &Self::Setup) -> Self::Commitment; - fn batch_commit( - evals: &[&[Self::Field]], - gens: &Self::Setup, - batch_type: BatchType, - ) -> Vec; - fn commit_slice(evals: &[Self::Field], setup: &Self::Setup) -> Self::Commitment; - fn batch_commit_polys( - polys: &[DensePolynomial], - setup: &Self::Setup, - batch_type: BatchType, - ) -> Vec { - let slices: Vec<&[Self::Field]> = polys.iter().map(|poly| poly.evals_ref()).collect(); - Self::batch_commit(&slices, setup, batch_type) - } - fn batch_commit_polys_ref( - polys: &[&DensePolynomial], - setup: &Self::Setup, - batch_type: BatchType, - ) -> Vec { - let slices: Vec<&[Self::Field]> = polys.iter().map(|poly| poly.evals_ref()).collect(); - Self::batch_commit(&slices, setup, batch_type) - } - - /// Homomorphically combines multiple commitments into a single commitment, computed as a - /// linear combination with the given coefficients. - fn combine_commitments( - _commitments: &[&Self::Commitment], - _coeffs: &[Self::Field], - ) -> Self::Commitment { - todo!("`combine_commitments` should be on a separate `AdditivelyHomomorphic` trait") - } - - fn prove( - setup: &Self::Setup, - poly: &DensePolynomial, - opening_point: &[Self::Field], // point at which the polynomial is evaluated - transcript: &mut Transcript, - ) -> Self::Proof; - fn batch_prove( - setup: &Self::Setup, - polynomials: &[&DensePolynomial], - opening_point: &[Self::Field], - openings: &[Self::Field], - batch_type: BatchType, - transcript: &mut Transcript, - ) -> Self::BatchedProof; - - fn verify( - proof: &Self::Proof, - setup: &Self::Setup, - transcript: &mut Transcript, - opening_point: &[Self::Field], // point at which the polynomial is evaluated - opening: &Self::Field, // evaluation \widetilde{Z}(r) - commitment: &Self::Commitment, - ) -> Result<(), ProofVerifyError>; - - fn batch_verify( - batch_proof: &Self::BatchedProof, - setup: &Self::Setup, - opening_point: &[Self::Field], - openings: &[Self::Field], - commitments: &[&Self::Commitment], - transcript: &mut Transcript, - ) -> Result<(), ProofVerifyError>; - - fn protocol_name() -> &'static [u8]; -} diff --git a/spartan_parallel/src/commitment/hyperkzg.rs b/spartan_parallel/src/commitment/hyperkzg.rs deleted file mode 100644 index 247f6ca8..00000000 --- a/spartan_parallel/src/commitment/hyperkzg.rs +++ /dev/null @@ -1,791 +0,0 @@ -//! This is a port of https://github.com/microsoft/Nova/blob/main/src/provider/hyperkzg.rs -//! -//! This module implements `HyperKZG`, a KZG-based polynomial commitment for multilinear polynomials -//! HyperKZG is based on the transformation from univariate PCS to multilinear PCS in the Gemini paper (section 2.4.2 in ). -//! However, there are some key differences: -//! (1) HyperKZG works with multilinear polynomials represented in evaluation form (rather than in coefficient form in Gemini's transformation). -//! This means that Spartan's polynomial IOP can use commit to its polynomials as-is without incurring any interpolations or FFTs. -//! (2) HyperKZG is specialized to use KZG as the univariate commitment scheme, so it includes several optimizations (both during the transformation of multilinear-to-univariate claims -//! and within the KZG commitment scheme implementation itself). -use super::{ - commitment_scheme::{BatchType, CommitmentScheme}, - kzg::{KZGProverKey, KZGVerifierKey, UnivariateKZG}, -}; -use crate::field; -use crate::poly::commitment::commitment_scheme::CommitShape; -use crate::utils::mul_0_1_optimized; -use crate::utils::thread::unsafe_allocate_zero_vec; -use crate::{ - msm::VariableBaseMSM, - poly::{commitment::kzg::SRS, dense_mlpoly::DensePolynomial, unipoly::UniPoly}, - utils::{ - errors::ProofVerifyError, - transcript::{AppendToTranscript, ProofTranscript}, - }, -}; -use ark_ec::{pairing::Pairing, AffineRepr, CurveGroup}; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; -use ark_std::{One, Zero}; -use rand_chacha::ChaCha20Rng; -use rand_core::{CryptoRng, RngCore, SeedableRng}; -use rayon::iter::{ - IndexedParallelIterator, IntoParallelIterator, IntoParallelRefIterator, - IntoParallelRefMutIterator, ParallelIterator, -}; -use std::{marker::PhantomData, sync::Arc}; -use tracing::trace_span; - -pub struct HyperKZGSRS(Arc>); - -impl HyperKZGSRS

{ - pub fn setup(rng: &mut R, max_degree: usize) -> Self { - Self(Arc::new(SRS::setup(rng, max_degree, 2))) - } - - pub fn trim(self, max_degree: usize) -> (HyperKZGProverKey

, HyperKZGVerifierKey

) { - let (kzg_pk, kzg_vk) = SRS::trim(self.0, max_degree); - (HyperKZGProverKey { kzg_pk }, HyperKZGVerifierKey { kzg_vk }) - } -} - -#[derive(Clone, Debug)] -pub struct HyperKZGProverKey { - pub kzg_pk: KZGProverKey

, -} - -#[derive(Copy, Clone, Debug)] -pub struct HyperKZGVerifierKey { - pub kzg_vk: KZGVerifierKey

, -} - -#[derive(Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)] -pub struct HyperKZGCommitment(pub P::G1Affine); - -impl Default for HyperKZGCommitment

{ - fn default() -> Self { - Self(P::G1Affine::zero()) - } -} - -impl AppendToTranscript for HyperKZGCommitment

{ - fn append_to_transcript(&self, transcript: &mut ProofTranscript) { - transcript.append_point(&self.0.into_group()); - } -} - -#[derive(Clone, CanonicalSerialize, CanonicalDeserialize, Debug)] -pub struct HyperKZGProof { - pub com: Vec, - pub w: Vec, - pub v: Vec>, -} - -// On input f(x) and u compute the witness polynomial used to prove -// that f(u) = v. The main part of this is to compute the -// division (f(x) - f(u)) / (x - u), but we don't use a general -// division algorithm, we make use of the fact that the division -// never has a remainder, and that the denominator is always a linear -// polynomial. The cost is (d-1) mults + (d-1) adds in P::ScalarField, where -// d is the degree of f. -// -// We use the fact that if we compute the quotient of f(x)/(x-u), -// there will be a remainder, but it'll be v = f(u). Put another way -// the quotient of f(x)/(x-u) and (f(x) - f(v))/(x-u) is the -// same. One advantage is that computing f(u) could be decoupled -// from kzg_open, it could be done later or separate from computing W. -fn kzg_open_no_rem( - f: &[P::ScalarField], - u: P::ScalarField, - pk: &HyperKZGProverKey

, -) -> P::G1Affine -where -

::ScalarField: field::JoltField, -{ - let h = compute_witness_polynomial::

(f, u); - UnivariateKZG::commit(&pk.kzg_pk, &UniPoly::from_coeff(h)).unwrap() -} - -fn compute_witness_polynomial( - f: &[P::ScalarField], - u: P::ScalarField, -) -> Vec -where -

::ScalarField: field::JoltField, -{ - let d = f.len(); - - // Compute h(x) = f(x)/(x - u) - let mut h = vec![P::ScalarField::zero(); d]; - for i in (1..d).rev() { - h[i - 1] = f[i] + h[i] * u; - } - - h -} - -fn scalar_vector_muladd( - a: &mut [P::ScalarField], - v: &[P::ScalarField], - s: P::ScalarField, -) where -

::ScalarField: field::JoltField, -{ - assert!(a.len() >= v.len()); - for i in 0..v.len() { - a[i] += s * v[i]; - } -} - -fn kzg_compute_batch_polynomial( - f: &[Vec], - q_powers: Vec, -) -> Vec -where -

::ScalarField: field::JoltField, -{ - let k = f.len(); // Number of polynomials we're batching - - // Compute B(x) = f[0] + q*f[1] + q^2 * f[2] + ... q^(k-1) * f[k-1] - let mut B = f[0].clone(); - for i in 1..k { - scalar_vector_muladd::

(&mut B, &f[i], q_powers[i]); // B += q_powers[i] * f[i] - } - - B -} - -fn kzg_open_batch( - f: &[Vec], - u: &[P::ScalarField], - pk: &HyperKZGProverKey

, - transcript: &mut ProofTranscript, -) -> (Vec, Vec>) -where -

::ScalarField: field::JoltField, -{ - let k = f.len(); - let t = u.len(); - - // The verifier needs f_i(u_j), so we compute them here - // (V will compute B(u_j) itself) - let mut v = vec![vec!(P::ScalarField::zero(); k); t]; - v.par_iter_mut().enumerate().for_each(|(i, v_i)| { - // for each point u - v_i.par_iter_mut().zip_eq(f).for_each(|(v_ij, f)| { - // for each poly f - *v_ij = UniPoly::eval_with_coeffs(f, &u[i]); - }); - }); - - // TODO(moodlezoup): Avoid cloned() - transcript.append_scalars(&v.iter().flatten().cloned().collect::>()); - let q_powers: Vec = transcript.challenge_scalar_powers(f.len()); - let B = kzg_compute_batch_polynomial::

(f, q_powers); - - // Now open B at u0, ..., u_{t-1} - let w = u - .into_par_iter() - .map(|ui| kzg_open_no_rem(&B, *ui, pk)) - .collect::>(); - - // The prover computes the challenge to keep the transcript in the same - // state as that of the verifier - transcript.append_points(&w.iter().map(|g| g.into_group()).collect::>()); - let _d_0: P::ScalarField = transcript.challenge_scalar(); - - (w, v) -} - -// vk is hashed in transcript already, so we do not add it here -fn kzg_verify_batch( - vk: &HyperKZGVerifierKey

, - C: &[P::G1Affine], - W: &[P::G1Affine], - u: &[P::ScalarField], - v: &[Vec], - transcript: &mut ProofTranscript, -) -> bool -where -

::ScalarField: field::JoltField, -{ - let k = C.len(); - let t = u.len(); - - transcript.append_scalars(&v.iter().flatten().cloned().collect::>()); - let q_powers: Vec = transcript.challenge_scalar_powers(k); - - transcript.append_points(&W.iter().map(|g| g.into_group()).collect::>()); - let d_0: P::ScalarField = transcript.challenge_scalar(); - let d_1 = d_0 * d_0; - - assert_eq!(t, 3); - assert_eq!(W.len(), 3); - // We write a special case for t=3, since this what is required for - // hyperkzg. Following the paper directly, we must compute: - // let L0 = C_B - vk.G * B_u[0] + W[0] * u[0]; - // let L1 = C_B - vk.G * B_u[1] + W[1] * u[1]; - // let L2 = C_B - vk.G * B_u[2] + W[2] * u[2]; - // let R0 = -W[0]; - // let R1 = -W[1]; - // let R2 = -W[2]; - // let L = L0 + L1*d_0 + L2*d_1; - // let R = R0 + R1*d_0 + R2*d_1; - // - // We group terms to reduce the number of scalar mults (to seven): - // In Rust, we could use MSMs for these, and speed up verification. - // - // Note, that while computing L, the intermediate computation of C_B together with computing - // L0, L1, L2 can be replaced by single MSM of C with the powers of q multiplied by (1 + d_0 + d_1) - // with additionally concatenated inputs for scalars/bases. - - let q_power_multiplier: P::ScalarField = P::ScalarField::one() + d_0 + d_1; - - let q_powers_multiplied: Vec = q_powers - .par_iter() - .map(|q_power| *q_power * q_power_multiplier) - .collect(); - - // Compute the batched openings - // compute B(u_i) = v[i][0] + q*v[i][1] + ... + q^(t-1) * v[i][t-1] - let B_u = v - .into_par_iter() - .map(|v_i| { - v_i.into_par_iter() - .zip(q_powers.par_iter()) - .map(|(a, b)| *a * *b) - .sum() - }) - .collect::>(); - - let L = ::msm( - &[&C[..k], &[W[0], W[1], W[2], vk.kzg_vk.g1]].concat(), - &[ - &q_powers_multiplied[..k], - &[ - u[0], - (u[1] * d_0), - (u[2] * d_1), - -(B_u[0] + d_0 * B_u[1] + d_1 * B_u[2]), - ], - ] - .concat(), - ) - .unwrap(); - - let R = W[0] + W[1] * d_0 + W[2] * d_1; - - // Check that e(L, vk.H) == e(R, vk.tau_H) - P::multi_pairing([L, -R], [vk.kzg_vk.g2, vk.kzg_vk.beta_g2]).is_zero() -} - -#[derive(Clone)] -pub struct HyperKZG { - _phantom: PhantomData

, -} - -impl HyperKZG

-where -

::ScalarField: field::JoltField, -{ - pub fn protocol_name() -> &'static [u8] { - b"HyperKZG" - } - - pub fn commit( - pp: &HyperKZGProverKey

, - poly: &DensePolynomial, - ) -> Result, ProofVerifyError> { - if pp.kzg_pk.g1_powers().len() < poly.Z.len() { - return Err(ProofVerifyError::KeyLengthError( - pp.kzg_pk.g1_powers().len(), - poly.Z.len(), - )); - } - Ok(HyperKZGCommitment(UnivariateKZG::commit_slice( - &pp.kzg_pk, &poly.Z, - )?)) - } - - #[tracing::instrument(skip_all, name = "HyperKZG::open")] - pub fn open( - pk: &HyperKZGProverKey

, - poly: &DensePolynomial, - point: &[P::ScalarField], - _eval: &P::ScalarField, - transcript: &mut ProofTranscript, - ) -> Result, ProofVerifyError> { - let ell = point.len(); - let n = poly.len(); - assert_eq!(n, 1 << ell); // Below we assume that n is a power of two - - // Phase 1 -- create commitments com_1, ..., com_\ell - // We do not compute final Pi (and its commitment) as it is constant and equals to 'eval' - // also known to verifier, so can be derived on its side as well - let mut polys: Vec> = Vec::new(); - polys.push(poly.Z.to_vec()); - for i in 0..ell - 1 { - let Pi_len = polys[i].len() / 2; - let mut Pi = vec![P::ScalarField::zero(); Pi_len]; - - #[allow(clippy::needless_range_loop)] - Pi.par_iter_mut().enumerate().for_each(|(j, Pi_j)| { - *Pi_j = - point[ell - i - 1] * (polys[i][2 * j + 1] - polys[i][2 * j]) + polys[i][2 * j]; - }); - - polys.push(Pi); - } - - assert_eq!(polys.len(), ell); - assert_eq!(polys[ell - 1].len(), 2); - - // We do not need to commit to the first polynomial as it is already committed. - // Compute commitments in parallel - let com: Vec = (1..polys.len()) - .into_par_iter() - .map(|i| UnivariateKZG::commit_slice(&pk.kzg_pk, &polys[i]).unwrap()) - .collect(); - - // Phase 2 - // We do not need to add x to the transcript, because in our context x was obtained from the transcript. - // We also do not need to absorb `C` and `eval` as they are already absorbed by the transcript by the caller - transcript.append_points(&com.iter().map(|g| g.into_group()).collect::>()); - let r:

::ScalarField = transcript.challenge_scalar(); - let u = vec![r, -r, r * r]; - - // Phase 3 -- create response - let (w, v) = kzg_open_batch(&polys, &u, pk, transcript); - - Ok(HyperKZGProof { com, w, v }) - } - - /// A method to verify purported evaluations of a batch of polynomials - pub fn verify( - vk: &HyperKZGVerifierKey

, - C: &HyperKZGCommitment

, - point: &[P::ScalarField], - P_of_x: &P::ScalarField, - pi: &HyperKZGProof

, - transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - let y = P_of_x; - - let ell = point.len(); - - let mut com = pi.com.clone(); - - // we do not need to add x to the transcript, because in our context x was - // obtained from the transcript - transcript.append_points(&com.iter().map(|g| g.into_group()).collect::>()); - let r:

::ScalarField = transcript.challenge_scalar(); - - if r == P::ScalarField::zero() || C.0 == P::G1Affine::zero() { - return Err(ProofVerifyError::InternalError); - } - com.insert(0, C.0); // set com_0 = C, shifts other commitments to the right - - let u = vec![r, -r, r * r]; - - // Setup vectors (Y, ypos, yneg) from pi.v - let v = &pi.v; - if v.len() != 3 { - return Err(ProofVerifyError::InternalError); - } - if v[0].len() != ell || v[1].len() != ell || v[2].len() != ell { - return Err(ProofVerifyError::InternalError); - } - let ypos = &v[0]; - let yneg = &v[1]; - let mut Y = v[2].to_vec(); - Y.push(*y); - - // Check consistency of (Y, ypos, yneg) - let two = P::ScalarField::from(2u64); - for i in 0..ell { - if two * r * Y[i + 1] - != r * (P::ScalarField::one() - point[ell - i - 1]) * (ypos[i] + yneg[i]) - + point[ell - i - 1] * (ypos[i] - yneg[i]) - { - return Err(ProofVerifyError::InternalError); - } - // Note that we don't make any checks about Y[0] here, but our batching - // check below requires it - } - - // Check commitments to (Y, ypos, yneg) are valid - if !kzg_verify_batch(vk, &com, &pi.w, &u, &pi.v, transcript) { - return Err(ProofVerifyError::InternalError); - } - - Ok(()) - } - - #[tracing::instrument(skip_all, name = "HyperKZG::batch_open")] - fn batch_open( - pk: &HyperKZGProverKey

, - polynomials: &[&DensePolynomial], - point: &[P::ScalarField], - evals: &[P::ScalarField], - transcript: &mut ProofTranscript, - ) -> HyperKZGProof

{ - let num_vars = point.len(); - let n = 1 << num_vars; - - // Generate batching challenge \rho and powers 1,...,\rho^{m-1} - let rho: P::ScalarField = transcript.challenge_scalar(); - let mut rho_powers = vec![P::ScalarField::one()]; - for i in 1..polynomials.len() { - rho_powers.push(rho_powers[i - 1] * rho); - } - - // Compute batching of unshifted polynomials f_i, and batched eval v_i: - let batched_evaluation = rho_powers - .iter() - .zip(evals.iter()) - .map(|(scalar, eval)| *scalar * *eval) - .sum(); - - let span = trace_span!("f_batched"); - let enter = span.enter(); - let num_chunks = rayon::current_num_threads().next_power_of_two(); - let chunk_size = n / num_chunks; - let f_batched = (0..num_chunks) - .into_par_iter() - .flat_map_iter(|chunk_index| { - let mut chunk = unsafe_allocate_zero_vec::(chunk_size); - for (coeff, poly) in rho_powers.iter().zip(polynomials.iter()) { - for (rlc, poly_eval) in chunk - .iter_mut() - .zip(poly.evals_ref()[chunk_index * chunk_size..].iter()) - { - *rlc += mul_0_1_optimized(poly_eval, coeff); - } - } - chunk - }) - .collect::>(); - drop(enter); - drop(span); - - let poly = DensePolynomial::new(f_batched); - HyperKZG::

::open(pk, &poly, point, &batched_evaluation, transcript).unwrap() - } - - fn batch_verify( - vk: &HyperKZGVerifierKey

, - commitments: &[&HyperKZGCommitment

], - point: &[P::ScalarField], - evals: &[P::ScalarField], - batch_proof: &HyperKZGProof

, - transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - //TODO(pat): produce powers in parallel using window method - // Compute batching of unshifted polynomials f_i: - // Compute powers of batching challenge rho - let rho: P::ScalarField = transcript.challenge_scalar(); - let mut scalar = P::ScalarField::one(); - let (batched_eval, batched_commitment) = evals.iter().zip(commitments.iter()).fold( - (P::ScalarField::zero(), P::G1::zero()), - |(mut batched_evaluation, mut batched_commitment), (opening, commitment)| { - batched_evaluation += scalar * *opening; - batched_commitment += commitment.0 * scalar; - scalar *= rho; - (batched_evaluation, batched_commitment) - }, - ); - HyperKZG::

::verify( - vk, - &HyperKZGCommitment(batched_commitment.into_affine()), - point, - &batched_eval, - batch_proof, - transcript, - ) - } -} - -impl CommitmentScheme for HyperKZG

-where -

::ScalarField: field::JoltField, -{ - type Field = P::ScalarField; - type Setup = (HyperKZGProverKey

, HyperKZGVerifierKey

); - type Commitment = HyperKZGCommitment

; - type Proof = HyperKZGProof

; - type BatchedProof = HyperKZGProof

; - - fn setup(shapes: &[CommitShape]) -> Self::Setup { - let max_len = shapes.iter().map(|shape| shape.input_length).max().unwrap(); - - HyperKZGSRS(Arc::new(SRS::setup( - &mut ChaCha20Rng::from_seed(*b"HyperKZG_POLY_COMMITMENT_SCHEMEE"), - max_len, - 2, - ))) - .trim(max_len) - } - - fn commit(poly: &DensePolynomial, setup: &Self::Setup) -> Self::Commitment { - assert!( - setup.0.kzg_pk.g1_powers().len() >= poly.Z.len(), - "COMMIT KEY LENGTH ERROR {}, {}", - setup.0.kzg_pk.g1_powers().len(), - poly.Z.len() - ); - HyperKZGCommitment(UnivariateKZG::commit_slice(&setup.0.kzg_pk, &poly.Z).unwrap()) - } - - fn batch_commit( - evals: &[&[Self::Field]], - gens: &Self::Setup, - _batch_type: BatchType, - ) -> Vec { - // TODO: assert lengths are valid - evals - .par_iter() - .map(|evals| { - assert!( - gens.0.kzg_pk.g1_powers().len() >= evals.len(), - "COMMIT KEY LENGTH ERROR {}, {}", - gens.0.kzg_pk.g1_powers().len(), - evals.len() - ); - HyperKZGCommitment(UnivariateKZG::commit_slice(&gens.0.kzg_pk, evals).unwrap()) - }) - .collect::>() - } - - fn commit_slice(evals: &[Self::Field], setup: &Self::Setup) -> Self::Commitment { - HyperKZGCommitment(UnivariateKZG::commit_slice(&setup.0.kzg_pk, evals).unwrap()) - } - - fn prove( - setup: &Self::Setup, - poly: &DensePolynomial, - opening_point: &[Self::Field], // point at which the polynomial is evaluated - transcript: &mut ProofTranscript, - ) -> Self::Proof { - let eval = poly.evaluate(opening_point); - HyperKZG::

::open(&setup.0, poly, opening_point, &eval, transcript).unwrap() - } - - fn batch_prove( - setup: &Self::Setup, - polynomials: &[&DensePolynomial], - opening_point: &[Self::Field], - openings: &[Self::Field], - _batch_type: BatchType, - transcript: &mut ProofTranscript, - ) -> Self::BatchedProof { - HyperKZG::

::batch_open(&setup.0, polynomials, opening_point, openings, transcript) - } - - fn combine_commitments( - commitments: &[&Self::Commitment], - coeffs: &[Self::Field], - ) -> Self::Commitment { - let combined_commitment: P::G1 = commitments - .iter() - .zip(coeffs.iter()) - .map(|(commitment, coeff)| commitment.0 * coeff) - .sum(); - HyperKZGCommitment(combined_commitment.into_affine()) - } - - fn verify( - proof: &Self::Proof, - setup: &Self::Setup, - transcript: &mut ProofTranscript, - opening_point: &[Self::Field], // point at which the polynomial is evaluated - opening: &Self::Field, // evaluation \widetilde{Z}(r) - commitment: &Self::Commitment, - ) -> Result<(), ProofVerifyError> { - HyperKZG::

::verify( - &setup.1, - commitment, - opening_point, - opening, - proof, - transcript, - ) - } - - fn batch_verify( - batch_proof: &Self::BatchedProof, - setup: &Self::Setup, - opening_point: &[Self::Field], - openings: &[Self::Field], - commitments: &[&Self::Commitment], - transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - HyperKZG::

::batch_verify( - &setup.1, - commitments, - opening_point, - openings, - batch_proof, - transcript, - ) - } - - fn protocol_name() -> &'static [u8] { - b"hyperkzg" - } -} - -#[cfg(test)] -mod tests { - use super::*; - use ark_bn254::{Bn254, Fr}; - use ark_std::UniformRand; - use rand_core::SeedableRng; - - #[test] - fn test_hyperkzg_eval() { - // Test with poly(X1, X2) = 1 + X1 + X2 + X1*X2 - let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(0); - let srs = HyperKZGSRS::setup(&mut rng, 3); - let (pk, vk): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(3); - - // poly is in eval. representation; evaluated at [(0,0), (0,1), (1,0), (1,1)] - let poly = DensePolynomial::new(vec![Fr::from(1), Fr::from(2), Fr::from(2), Fr::from(4)]); - - let C = HyperKZG::commit(&pk, &poly).unwrap(); - - let test_inner = |point: Vec, eval: Fr| -> Result<(), ProofVerifyError> { - let mut tr = ProofTranscript::new(b"TestEval"); - let proof = HyperKZG::open(&pk, &poly, &point, &eval, &mut tr).unwrap(); - let mut tr = ProofTranscript::new(b"TestEval"); - HyperKZG::verify(&vk, &C, &point, &eval, &proof, &mut tr) - }; - - // Call the prover with a (point, eval) pair. - // The prover does not recompute so it may produce a proof, but it should not verify - let point = vec![Fr::from(0), Fr::from(0)]; - let eval = Fr::from(1); - assert!(test_inner(point, eval).is_ok()); - - let point = vec![Fr::from(0), Fr::from(1)]; - let eval = Fr::from(2); - assert!(test_inner(point, eval).is_ok()); - - let point = vec![Fr::from(1), Fr::from(1)]; - let eval = Fr::from(4); - assert!(test_inner(point, eval).is_ok()); - - let point = vec![Fr::from(0), Fr::from(2)]; - let eval = Fr::from(3); - assert!(test_inner(point, eval).is_ok()); - - let point = vec![Fr::from(2), Fr::from(2)]; - let eval = Fr::from(9); - assert!(test_inner(point, eval).is_ok()); - - // Try a couple incorrect evaluations and expect failure - let point = vec![Fr::from(2), Fr::from(2)]; - let eval = Fr::from(50); - assert!(test_inner(point, eval).is_err()); - - let point = vec![Fr::from(0), Fr::from(2)]; - let eval = Fr::from(4); - assert!(test_inner(point, eval).is_err()); - } - - #[test] - fn test_hyperkzg_small() { - let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(0); - - // poly = [1, 2, 1, 4] - let poly = DensePolynomial::new(vec![Fr::from(1), Fr::from(2), Fr::from(1), Fr::from(4)]); - - // point = [4,3] - let point = vec![Fr::from(4), Fr::from(3)]; - - // eval = 28 - let eval = Fr::from(28); - - let srs = HyperKZGSRS::setup(&mut rng, 3); - let (pk, vk): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(3); - - // make a commitment - let C = HyperKZG::commit(&pk, &poly).unwrap(); - - // prove an evaluation - let mut tr = ProofTranscript::new(b"TestEval"); - let proof = HyperKZG::open(&pk, &poly, &point, &eval, &mut tr).unwrap(); - let post_c_p = tr.challenge_scalar::(); - - // verify the evaluation - let mut verifier_transcript = ProofTranscript::new(b"TestEval"); - assert!( - HyperKZG::verify(&vk, &C, &point, &eval, &proof, &mut verifier_transcript,).is_ok() - ); - let post_c_v = verifier_transcript.challenge_scalar::(); - - // check if the prover transcript and verifier transcript are kept in the same state - assert_eq!(post_c_p, post_c_v); - - let mut proof_bytes = Vec::new(); - proof.serialize_compressed(&mut proof_bytes).unwrap(); - assert_eq!(proof_bytes.len(), 368); - - // Change the proof and expect verification to fail - let mut bad_proof = proof.clone(); - let v1 = bad_proof.v[1].clone(); - bad_proof.v[0].clone_from(&v1); - let mut verifier_transcript2 = ProofTranscript::new(b"TestEval"); - assert!(HyperKZG::verify( - &vk, - &C, - &point, - &eval, - &bad_proof, - &mut verifier_transcript2 - ) - .is_err()); - } - - #[test] - fn test_hyperkzg_large() { - // test the hyperkzg prover and verifier with random instances (derived from a seed) - for ell in [4, 5, 6] { - let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(ell as u64); - - let n = 1 << ell; // n = 2^ell - - let poly = DensePolynomial::new( - (0..n) - .map(|_| ::ScalarField::rand(&mut rng)) - .collect::>(), - ); - let point = (0..ell) - .map(|_| ::ScalarField::rand(&mut rng)) - .collect::>(); - let eval = poly.evaluate(&point); - - let srs = HyperKZGSRS::setup(&mut rng, n); - let (pk, vk): (HyperKZGProverKey, HyperKZGVerifierKey) = srs.trim(n); - - // make a commitment - let C = HyperKZG::commit(&pk, &poly).unwrap(); - - // prove an evaluation - let mut prover_transcript = ProofTranscript::new(b"TestEval"); - let proof: HyperKZGProof = - HyperKZG::open(&pk, &poly, &point, &eval, &mut prover_transcript).unwrap(); - - // verify the evaluation - let mut verifier_tr = ProofTranscript::new(b"TestEval"); - assert!(HyperKZG::verify(&vk, &C, &point, &eval, &proof, &mut verifier_tr,).is_ok()); - - // Change the proof and expect verification to fail - let mut bad_proof = proof.clone(); - let v1 = bad_proof.v[1].clone(); - bad_proof.v[0].clone_from(&v1); - let mut verifier_tr2 = ProofTranscript::new(b"TestEval"); - assert!( - HyperKZG::verify(&vk, &C, &point, &eval, &bad_proof, &mut verifier_tr2,).is_err() - ); - } - } -} diff --git a/spartan_parallel/src/commitment/hyrax.rs b/spartan_parallel/src/commitment/hyrax.rs deleted file mode 100644 index 750593c3..00000000 --- a/spartan_parallel/src/commitment/hyrax.rs +++ /dev/null @@ -1,539 +0,0 @@ -use std::marker::PhantomData; - -use super::commitment_scheme::{BatchType, CommitShape, CommitmentScheme}; -use super::pedersen::{PedersenCommitment, PedersenGenerators}; -use crate::scalar::Scalar; -use crate::dense_mlpoly::{DensePolynomial, EqPolynomial}; -use crate::errors::ProofVerifyError; -use crate::transcript::{AppendToTranscript, ProofTranscript}; -use crate::utils::{compute_dotproduct, mul_0_1_optimized}; -use ark_ec::CurveGroup; -use serde::Serialize; -use num_integer::Roots; -use rayon::prelude::*; - -use crate::msm::VariableBaseMSM; - -#[derive(Clone)] -pub struct HyraxScheme { - marker: PhantomData, -} - -const TRACE_LEN_R1CS_POLYS_BATCH_RATIO: usize = 64; -const SURGE_RATIO_READ_WRITE: usize = 16; -const SURGE_RATIO_FINAL: usize = 4; - -pub fn batch_type_to_ratio(batch_type: &BatchType) -> usize { - match batch_type { - BatchType::Big => TRACE_LEN_R1CS_POLYS_BATCH_RATIO, - BatchType::Small => 1, - BatchType::SurgeReadWrite => SURGE_RATIO_READ_WRITE, - BatchType::SurgeInitFinal => SURGE_RATIO_FINAL, - } -} - -pub fn matrix_dimensions(num_vars: usize, ratio: usize) -> (usize, usize) { - let mut row_size = (num_vars / 2).pow2(); - row_size = (row_size * ratio.sqrt()).next_power_of_two(); - - let right_num_vars = std::cmp::min(row_size.log_2(), num_vars - 1); - row_size = right_num_vars.pow2(); - let left_num_vars = num_vars - right_num_vars; - let col_size = left_num_vars.pow2(); - - (col_size, row_size) -} - -impl> CommitmentScheme for HyraxScheme { - type Field = G::ScalarField; - type Setup = PedersenGenerators; - type Commitment = HyraxCommitment; - type Proof = HyraxOpeningProof; - type BatchedProof = BatchedHyraxOpeningProof; - - fn setup(shapes: &[CommitShape]) -> Self::Setup { - let mut max_len: usize = 0; - for shape in shapes { - let len = matrix_dimensions( - shape.input_length.log_2(), - batch_type_to_ratio(&shape.batch_type), - ) - .1; - if len > max_len { - max_len = len; - } - } - PedersenGenerators::new(max_len, b"Jolt v1 Hyrax generators") - } - fn commit(poly: &DensePolynomial, gens: &Self::Setup) -> Self::Commitment { - HyraxCommitment::commit(poly, gens) - } - fn batch_commit( - evals: &[&[Self::Field]], - gens: &Self::Setup, - batch_type: BatchType, - ) -> Vec { - HyraxCommitment::batch_commit(evals, gens, batch_type) - } - fn commit_slice(eval_slice: &[Self::Field], generators: &Self::Setup) -> Self::Commitment { - HyraxCommitment::commit_slice(eval_slice, generators) - } - fn prove( - _setup: &Self::Setup, - poly: &DensePolynomial, - opening_point: &[Self::Field], - transcript: &mut Transcript, - ) -> Self::Proof { - // Implicitly prove is "prove_single", with a ratio = 1 - HyraxOpeningProof::prove(poly, opening_point, 1, transcript) - } - fn batch_prove( - _setup: &Self::Setup, - polynomials: &[&DensePolynomial], - opening_point: &[Self::Field], - openings: &[Self::Field], - batch_type: BatchType, - transcript: &mut Transcript, - ) -> Self::BatchedProof { - BatchedHyraxOpeningProof::prove( - polynomials, - opening_point, - openings, - batch_type, - transcript, - ) - } - fn combine_commitments( - commitments: &[&Self::Commitment], - coeffs: &[Self::Field], - ) -> Self::Commitment { - let max_size = commitments - .iter() - .map(|commitment| commitment.row_commitments.len()) - .max() - .unwrap(); - - let row_commitments = coeffs - .par_iter() - .zip(commitments.par_iter()) - .map(|(coeff, commitment)| { - commitment - .row_commitments - .iter() - .map(|row_commitment| *row_commitment * coeff) - .collect() - }) - .reduce( - || vec![G::zero(); max_size], - |running, new| { - running - .iter() - .zip(new.iter()) - .map(|(r, n)| *r + n) - .collect() - }, - ); - HyraxCommitment { row_commitments } - } - - fn verify( - proof: &Self::Proof, - generators: &Self::Setup, - transcript: &mut Transcript, - opening_point: &[Self::Field], - opening: &Self::Field, - commitment: &Self::Commitment, - ) -> Result<(), ProofVerifyError> { - // Implicitly verify is "prove_single", with a ratio = 1 - HyraxOpeningProof::verify( - proof, - generators, - transcript, - opening_point, - opening, - commitment, - 1, - ) - } - fn batch_verify( - batch_proof: &Self::BatchedProof, - generators: &Self::Setup, - opening_point: &[Self::Field], - openings: &[Self::Field], - commitments: &[&Self::Commitment], - transcript: &mut Transcript, - ) -> Result<(), ProofVerifyError> { - BatchedHyraxOpeningProof::verify( - batch_proof, - generators, - opening_point, - openings, - commitments, - transcript, - ) - } - fn protocol_name() -> &'static [u8] { - b"Jolt BatchedHyraxOpeningProof" - } -} - -#[derive(Clone, Serialize)] -pub struct HyraxGenerators { - pub gens: PedersenGenerators, -} - -#[derive(Default, Clone, Debug, PartialEq, Serialize)] -pub struct HyraxCommitment { - pub row_commitments: Vec, -} - -impl> HyraxCommitment { - pub fn commit( - poly: &DensePolynomial, - generators: &PedersenGenerators, - ) -> Self { - Self::commit_slice(poly.evals_ref(), generators) - } - - pub fn commit_slice(eval_slice: &[G::ScalarField], generators: &PedersenGenerators) -> Self { - let n = eval_slice.len(); - let ell = n.log_2(); - - let (L_size, R_size) = matrix_dimensions(ell, 1); - assert_eq!(L_size * R_size, n); - - let gens = CurveGroup::normalize_batch(&generators.generators[..R_size]); - let row_commitments = eval_slice - .par_chunks(R_size) - .map(|row| PedersenCommitment::commit_vector(row, &gens)) - .collect(); - Self { row_commitments } - } - - pub fn batch_commit( - batch: &[&[G::ScalarField]], - generators: &PedersenGenerators, - batch_type: BatchType, - ) -> Vec { - let n = batch[0].len(); - batch.iter().for_each(|poly| assert_eq!(poly.len(), n)); - let ell = n.log_2(); - - let ratio = batch_type_to_ratio(&batch_type); - - let (L_size, R_size) = matrix_dimensions(ell, ratio); - assert_eq!(L_size * R_size, n); - - let gens = CurveGroup::normalize_batch(&generators.generators[..R_size]); - - let rows = batch.par_iter().flat_map(|poly| poly.par_chunks(R_size)); - let row_commitments: Vec = rows - .map(|row| PedersenCommitment::commit_vector(row, &gens)) - .collect(); - - row_commitments - .par_chunks(L_size) - .map(|chunk| Self { - row_commitments: chunk.to_vec(), - }) - .collect() - } -} - -impl AppendToTranscript for HyraxCommitment { - fn append_to_transcript(&self, transcript: &mut Transcript) { - transcript.append_message(b"poly_commitment_begin"); - for i in 0..self.row_commitments.len() { - transcript.append_point(b"poly_commitment", &self.row_commitments[i]); - } - transcript.append_message(b"poly_commitment_end"); - } -} - -#[derive(Debug, Serialize)] -pub struct HyraxOpeningProof { - pub vector_matrix_product: Vec, -} - -/// See Section 14.3 of Thaler's Proofs, Arguments, and Zero-Knowledge -impl> HyraxOpeningProof { - fn protocol_name() -> &'static [u8] { - b"Hyrax opening proof" - } - - pub fn prove( - poly: &DensePolynomial, - opening_point: &[G::ScalarField], // point at which the polynomial is evaluated - ratio: usize, - transcript: &mut Transcript, - ) -> HyraxOpeningProof { - transcript.append_protocol_name(Self::protocol_name()); - - // assert vectors are of the right size - assert_eq!(poly.get_num_vars(), opening_point.len()); - - // compute the L and R vectors - let (L_size, _R_size) = matrix_dimensions(poly.get_num_vars(), ratio); - let eq = EqPolynomial::new(opening_point.to_vec()); - let (L, _R) = eq.compute_factored_evals_with_l_size(L_size); - - // compute vector-matrix product between L and Z viewed as a matrix - let vector_matrix_product = Self::vector_matrix_product(poly, &L, ratio); - - HyraxOpeningProof { - vector_matrix_product, - } - } - - pub fn verify( - &self, - pedersen_generators: &PedersenGenerators, - transcript: &mut Transcript, - opening_point: &[G::ScalarField], // point at which the polynomial is evaluated - opening: &G::ScalarField, // evaluation \widetilde{Z}(r) - commitment: &HyraxCommitment, - ratio: usize, - ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(Self::protocol_name()); - - // compute L and R - let (L_size, R_size) = matrix_dimensions(opening_point.len(), ratio); - let eq: EqPolynomial<_> = EqPolynomial::new(opening_point.to_vec()); - let (L, R) = eq.compute_factored_evals_with_l_size(L_size); - - // Verifier-derived commitment to u * a = \prod Com(u_j)^{a_j} - let homomorphically_derived_commitment: G = - VariableBaseMSM::msm(&G::normalize_batch(&commitment.row_commitments), &L).unwrap(); - - let product_commitment = VariableBaseMSM::msm( - &G::normalize_batch(&pedersen_generators.generators[..R_size]), - &self.vector_matrix_product, - ) - .unwrap(); - - let dot_product = compute_dotproduct(&self.vector_matrix_product, &R); - - if (homomorphically_derived_commitment == product_commitment) && (dot_product == *opening) { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } - - fn vector_matrix_product( - poly: &DensePolynomial, - L: &[G::ScalarField], - ratio: usize, - ) -> Vec { - let (_, R_size) = matrix_dimensions(poly.get_num_vars(), ratio); - - poly.evals_ref() - .par_chunks(R_size) - .enumerate() - .map(|(i, row)| { - row.iter() - .map(|x| mul_0_1_optimized(&L[i], x)) - .collect::>() - }) - .reduce( - || vec![G::ScalarField::zero(); R_size], - |mut acc: Vec<_>, row| { - acc.iter_mut().zip(row).for_each(|(x, y)| *x += y); - acc - }, - ) - } -} - -#[derive(Debug, Serialize)] -pub struct BatchedHyraxOpeningProof { - pub joint_proof: HyraxOpeningProof, - pub ratio: usize, -} - -/// See Section 16.1 of Thaler's Proofs, Arguments, and Zero-Knowledge -impl> BatchedHyraxOpeningProof { - pub fn prove( - polynomials: &[&DensePolynomial], - opening_point: &[G::ScalarField], - openings: &[G::ScalarField], - batch_type: BatchType, - transcript: &mut Transcript, - ) -> Self { - transcript.append_protocol_name(Self::protocol_name()); - - // append the claimed evaluations to transcript - transcript.append_scalars(openings); - - let rlc_coefficients: Vec<_> = transcript.challenge_vector(b"challenge_vec", polynomials.len()); - - let poly_len = polynomials[0].len(); - - let num_chunks = rayon::current_num_threads().next_power_of_two(); - let chunk_size = poly_len / num_chunks; - - let rlc_poly = if chunk_size > 0 { - (0..num_chunks) - .into_par_iter() - .flat_map_iter(|chunk_index| { - let mut chunk = vec![G::ScalarField::zero(); chunk_size]; - for (coeff, poly) in rlc_coefficients.iter().zip(polynomials.iter()) { - for (rlc, poly_eval) in chunk - .iter_mut() - .zip(poly.evals_ref()[chunk_index * chunk_size..].iter()) - { - *rlc += mul_0_1_optimized(poly_eval, coeff); - } - } - chunk - }) - .collect::>() - } else { - rlc_coefficients - .par_iter() - .zip(polynomials.par_iter()) - .map(|(coeff, poly)| poly.evals_ref().iter().map(|eval| *coeff * *eval).collect()) - .reduce( - || vec![G::ScalarField::zero(); poly_len], - |running, new| { - debug_assert_eq!(running.len(), new.len()); - running - .iter() - .zip(new.iter()) - .map(|(r, n)| *r + *n) - .collect() - }, - ) - }; - - let ratio = batch_type_to_ratio(&batch_type); - let joint_proof = HyraxOpeningProof::prove( - &DensePolynomial::new(rlc_poly), - opening_point, - ratio, - transcript, - ); - - Self { joint_proof, ratio } - } - - pub fn verify( - &self, - pedersen_generators: &PedersenGenerators, - opening_point: &[G::ScalarField], - openings: &[G::ScalarField], - commitments: &[&HyraxCommitment], - transcript: &mut Transcript, - ) -> Result<(), ProofVerifyError> { - assert_eq!(openings.len(), commitments.len()); - let (L_size, _R_size) = matrix_dimensions(opening_point.len(), self.ratio); - commitments.iter().enumerate().for_each(|(i, commitment)| { - assert_eq!( - L_size, - commitment.row_commitments.len(), - "Row commitment {}/{} wrong length.", - i, - commitments.len() - ) - }); - - transcript.append_protocol_name(Self::protocol_name()); - - // append the claimed evaluations to transcript - transcript.append_scalars(openings); - - let rlc_coefficients: Vec<_> = transcript.challenge_vector(b"challenge_vec", openings.len()); - - let rlc_eval = compute_dotproduct(&rlc_coefficients, openings); - - let rlc_commitment = rlc_coefficients - .par_iter() - .zip(commitments.par_iter()) - .map(|(coeff, commitment)| { - commitment - .row_commitments - .iter() - .map(|row_commitment| *row_commitment * coeff) - .collect() - }) - .reduce( - || vec![G::zero(); L_size], - |running, new| { - debug_assert_eq!(running.len(), new.len()); - running - .iter() - .zip(new.iter()) - .map(|(r, n)| *r + n) - .collect() - }, - ); - - self.joint_proof.verify( - pedersen_generators, - transcript, - opening_point, - &rlc_eval, - &HyraxCommitment { - row_commitments: rlc_commitment, - }, - self.ratio, - ) - } - - fn protocol_name() -> &'static [u8] { - b"Jolt BatchedHyraxOpeningProof" - } -} - -#[cfg(test)] -mod tests { - use super::*; - use ark_bn254::{Fr, G1Projective}; - - #[test] - fn check_polynomial_commit() { - check_polynomial_commit_helper::(); - check_polynomial_commit_helper::(); - } - - fn check_polynomial_commit_helper< - F: JoltField, - G: CurveGroup, - const RATIO: usize, - >() { - let Z = vec![ - G::ScalarField::one(), - G::ScalarField::from_u64(2u64).unwrap(), - G::ScalarField::one(), - G::ScalarField::from_u64(4u64).unwrap(), - ]; - let poly = DensePolynomial::new(Z); - - // r = [4,3] - let r = vec![ - G::ScalarField::from_u64(4u64).unwrap(), - G::ScalarField::from_u64(3u64).unwrap(), - ]; - let eval = poly.evaluate(&r); - assert_eq!(eval, G::ScalarField::from_u64(28u64).unwrap()); - - let generators: PedersenGenerators = PedersenGenerators::new(1 << 8, b"test-two"); - let poly_commitment: HyraxCommitment = HyraxCommitment::commit(&poly, &generators); - - let mut prover_transcript = Transcript::new(b"example"); - let proof = HyraxOpeningProof::prove(&poly, &r, RATIO, &mut prover_transcript); - - let mut verifier_transcript = Transcript::new(b"example"); - - assert!(proof - .verify( - &generators, - &mut verifier_transcript, - &r, - &eval, - &poly_commitment, - RATIO - ) - .is_ok()); - } -} diff --git a/spartan_parallel/src/commitment/kzg.rs b/spartan_parallel/src/commitment/kzg.rs deleted file mode 100644 index aaf9fd2a..00000000 --- a/spartan_parallel/src/commitment/kzg.rs +++ /dev/null @@ -1,256 +0,0 @@ -use crate::field::JoltField; -use crate::msm::VariableBaseMSM; -use crate::poly::unipoly::UniPoly; -use crate::utils::errors::ProofVerifyError; -use ark_ec::scalar_mul::fixed_base::FixedBase; -use ark_ec::{pairing::Pairing, AffineRepr, CurveGroup}; -use ark_ff::PrimeField; -use ark_std::{One, UniformRand, Zero}; -use rand_core::{CryptoRng, RngCore}; -use std::marker::PhantomData; -use std::sync::Arc; - -#[derive(Clone, Debug)] -pub struct SRS { - pub g1_powers: Vec, - pub g2_powers: Vec, -} - -impl SRS

{ - pub fn setup( - mut rng: &mut R, - num_g1_powers: usize, - num_g2_powers: usize, - ) -> Self { - let beta = P::ScalarField::rand(&mut rng); - let g1 = P::G1::rand(&mut rng); - let g2 = P::G2::rand(&mut rng); - - let scalar_bits = P::ScalarField::MODULUS_BIT_SIZE as usize; - - let (g1_powers_projective, g2_powers_projective) = rayon::join( - || { - let beta_powers: Vec = (0..=num_g1_powers) - .scan(beta, |acc, _| { - let val = *acc; - *acc *= beta; - Some(val) - }) - .collect(); - let window_size = FixedBase::get_mul_window_size(num_g1_powers); - let g1_table = FixedBase::get_window_table(scalar_bits, window_size, g1); - FixedBase::msm(scalar_bits, window_size, &g1_table, &beta_powers) - }, - || { - let beta_powers: Vec = (0..=num_g2_powers) - .scan(beta, |acc, _| { - let val = *acc; - *acc *= beta; - Some(val) - }) - .collect(); - - let window_size = FixedBase::get_mul_window_size(num_g2_powers); - let g2_table = FixedBase::get_window_table(scalar_bits, window_size, g2); - FixedBase::msm(scalar_bits, window_size, &g2_table, &beta_powers) - }, - ); - - let (g1_powers, g2_powers) = rayon::join( - || P::G1::normalize_batch(&g1_powers_projective), - || P::G2::normalize_batch(&g2_powers_projective), - ); - - Self { - g1_powers, - g2_powers, - } - } - - pub fn trim(params: Arc, max_degree: usize) -> (KZGProverKey

, KZGVerifierKey

) { - assert!(!params.g1_powers.is_empty(), "max_degree is 0"); - assert!( - max_degree < params.g1_powers.len(), - "SRS length is less than size" - ); - let g1 = params.g1_powers[0]; - let g2 = params.g2_powers[0]; - let beta_g2 = params.g2_powers[1]; - let pk = KZGProverKey::new(params, 0, max_degree + 1); - let vk = KZGVerifierKey { g1, g2, beta_g2 }; - (pk, vk) - } -} - -#[derive(Clone, Debug)] -pub struct KZGProverKey { - srs: Arc>, - // offset to read into SRS - offset: usize, - // max size of srs - supported_size: usize, -} - -impl KZGProverKey

{ - pub fn new(srs: Arc>, offset: usize, supported_size: usize) -> Self { - assert!( - srs.g1_powers.len() >= offset + supported_size, - "not enough powers (req: {} from offset {}) in the SRS (length: {})", - supported_size, - offset, - srs.g1_powers.len() - ); - Self { - srs, - offset, - supported_size, - } - } - - pub fn g1_powers(&self) -> &[P::G1Affine] { - &self.srs.g1_powers[self.offset..self.offset + self.supported_size] - } -} - -#[derive(Clone, Copy, Debug)] -pub struct KZGVerifierKey { - pub g1: P::G1Affine, - pub g2: P::G2Affine, - pub beta_g2: P::G2Affine, -} - -#[derive(Debug, Clone, Eq, PartialEq, Default)] -pub struct UnivariateKZG { - _phantom: PhantomData

, -} - -impl UnivariateKZG

-where -

::ScalarField: JoltField, -{ - #[tracing::instrument(skip_all, name = "KZG::commit_offset")] - pub fn commit_offset( - pk: &KZGProverKey

, - poly: &UniPoly, - offset: usize, - ) -> Result { - if pk.g1_powers().len() < poly.coeffs.len() { - return Err(ProofVerifyError::KeyLengthError( - pk.g1_powers().len(), - poly.coeffs.len(), - )); - } - - let bases = pk.g1_powers(); - let c = ::msm( - &bases[offset..poly.coeffs.len()], - &poly.coeffs[offset..], - ) - .unwrap(); - - Ok(c.into_affine()) - } - - #[tracing::instrument(skip_all, name = "KZG::commit")] - pub fn commit( - pk: &KZGProverKey

, - poly: &UniPoly, - ) -> Result { - if pk.g1_powers().len() < poly.coeffs.len() { - return Err(ProofVerifyError::KeyLengthError( - pk.g1_powers().len(), - poly.coeffs.len(), - )); - } - let c = ::msm( - &pk.g1_powers()[..poly.coeffs.len()], - poly.coeffs.as_slice(), - ) - .unwrap(); - Ok(c.into_affine()) - } - - #[tracing::instrument(skip_all, name = "KZG::commit_slice")] - pub fn commit_slice( - pk: &KZGProverKey

, - coeffs: &[P::ScalarField], - ) -> Result { - if pk.g1_powers().len() < coeffs.len() { - return Err(ProofVerifyError::KeyLengthError( - pk.g1_powers().len(), - coeffs.len(), - )); - } - let c = ::msm(&pk.g1_powers()[..coeffs.len()], coeffs).unwrap(); - Ok(c.into_affine()) - } - - #[tracing::instrument(skip_all, name = "KZG::open")] - pub fn open( - pk: &KZGProverKey

, - poly: &UniPoly, - point: &P::ScalarField, - ) -> Result<(P::G1Affine, P::ScalarField), ProofVerifyError> - where -

::ScalarField: JoltField, - { - let divisor = UniPoly::from_coeff(vec![-*point, P::ScalarField::one()]); - let (witness_poly, _) = poly.divide_with_remainder(&divisor).unwrap(); - let proof = ::msm( - &pk.g1_powers()[..witness_poly.coeffs.len()], - witness_poly.coeffs.as_slice(), - ) - .unwrap(); - let evaluation = poly.evaluate(point); - Ok((proof.into_affine(), evaluation)) - } - - pub fn verify( - vk: &KZGVerifierKey

, - commitment: &P::G1Affine, - point: &P::ScalarField, - proof: &P::G1Affine, - evaluation: &P::ScalarField, - ) -> Result { - Ok(P::multi_pairing( - [ - commitment.into_group() - vk.g1.into_group() * evaluation, - -proof.into_group(), - ], - [vk.g2, (vk.beta_g2.into_group() - (vk.g2 * point)).into()], - ) - .is_zero()) - } -} - -#[cfg(test)] -mod test { - use super::*; - use ark_bn254::{Bn254, Fr}; - use ark_std::{rand::Rng, UniformRand}; - use rand_chacha::ChaCha20Rng; - use rand_core::SeedableRng; - - #[test] - fn kzg_commit_prove_verify() -> Result<(), ProofVerifyError> { - let seed = b"11111111111111111111111111111111"; - for _ in 0..100 { - let mut rng = &mut ChaCha20Rng::from_seed(*seed); - let degree = rng.gen_range(2..20); - - let pp = Arc::new(SRS::::setup(&mut rng, degree, 2)); - let (ck, vk) = SRS::trim(pp, degree); - let p = UniPoly::random::(degree, rng); - let comm = UnivariateKZG::::commit(&ck, &p)?; - let point = Fr::rand(rng); - let (proof, value) = UnivariateKZG::::open(&ck, &p, &point)?; - assert!( - UnivariateKZG::verify(&vk, &comm, &point, &proof, &value)?, - "proof was incorrect for max_degree = {}, polynomial_degree = {}", - degree, - p.degree(), - ); - } - Ok(()) - } -} diff --git a/spartan_parallel/src/commitment/mock.rs b/spartan_parallel/src/commitment/mock.rs deleted file mode 100644 index a5e3dfa9..00000000 --- a/spartan_parallel/src/commitment/mock.rs +++ /dev/null @@ -1,148 +0,0 @@ -use std::marker::PhantomData; - -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; - -use crate::{ - field::JoltField, - poly::dense_mlpoly::DensePolynomial, - utils::{ - errors::ProofVerifyError, - transcript::{AppendToTranscript, ProofTranscript}, - }, -}; - -use super::commitment_scheme::{BatchType, CommitShape, CommitmentScheme}; - -#[derive(Clone)] -pub struct MockCommitScheme { - _marker: PhantomData, -} - -#[derive(CanonicalSerialize, CanonicalDeserialize, Default, Debug, PartialEq)] -pub struct MockCommitment { - poly: DensePolynomial, -} - -impl AppendToTranscript for MockCommitment { - fn append_to_transcript(&self, transcript: &mut ProofTranscript) { - transcript.append_message(b"mocker"); - } -} - -#[derive(CanonicalSerialize, CanonicalDeserialize)] -pub struct MockProof { - opening_point: Vec, -} - -impl CommitmentScheme for MockCommitScheme { - type Field = F; - type Setup = (); - type Commitment = MockCommitment; - type Proof = MockProof; - type BatchedProof = MockProof; - - fn setup(_shapes: &[CommitShape]) -> Self::Setup {} - fn commit(poly: &DensePolynomial, _setup: &Self::Setup) -> Self::Commitment { - MockCommitment { - poly: poly.to_owned(), - } - } - fn batch_commit( - evals: &[&[Self::Field]], - _gens: &Self::Setup, - _batch_type: BatchType, - ) -> Vec { - let polys: Vec> = evals - .iter() - .map(|poly_evals| DensePolynomial::new(poly_evals.to_vec())) - .collect(); - - polys - .into_iter() - .map(|poly| MockCommitment { poly }) - .collect() - } - fn commit_slice(evals: &[Self::Field], _setup: &Self::Setup) -> Self::Commitment { - MockCommitment { - poly: DensePolynomial::new(evals.to_owned()), - } - } - fn prove( - _setup: &Self::Setup, - _poly: &DensePolynomial, - opening_point: &[Self::Field], - _transcript: &mut ProofTranscript, - ) -> Self::Proof { - MockProof { - opening_point: opening_point.to_owned(), - } - } - fn batch_prove( - _setup: &Self::Setup, - _polynomials: &[&DensePolynomial], - opening_point: &[Self::Field], - _openings: &[Self::Field], - _batch_type: BatchType, - _transcript: &mut ProofTranscript, - ) -> Self::BatchedProof { - MockProof { - opening_point: opening_point.to_owned(), - } - } - - fn combine_commitments( - commitments: &[&Self::Commitment], - coeffs: &[Self::Field], - ) -> Self::Commitment { - let max_size = commitments - .iter() - .map(|comm| comm.poly.len()) - .max() - .unwrap(); - let mut poly = DensePolynomial::new(vec![Self::Field::zero(); max_size]); - for (commitment, coeff) in commitments.iter().zip(coeffs.iter()) { - poly.Z - .iter_mut() - .zip(commitment.poly.Z.iter()) - .for_each(|(a, b)| { - *a += *coeff * b; - }); - } - MockCommitment { poly } - } - - fn verify( - proof: &Self::Proof, - _setup: &Self::Setup, - _transcript: &mut ProofTranscript, - opening_point: &[Self::Field], - opening: &Self::Field, - commitment: &Self::Commitment, - ) -> Result<(), ProofVerifyError> { - let evaluation = commitment.poly.evaluate(opening_point); - assert_eq!(evaluation, *opening); - assert_eq!(proof.opening_point, opening_point); - Ok(()) - } - - fn batch_verify( - batch_proof: &Self::BatchedProof, - _setup: &Self::Setup, - opening_point: &[Self::Field], - openings: &[Self::Field], - commitments: &[&Self::Commitment], - _transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - assert_eq!(batch_proof.opening_point, opening_point); - assert_eq!(openings.len(), commitments.len()); - for i in 0..openings.len() { - let evaluation = commitments[i].poly.evaluate(opening_point); - assert_eq!(evaluation, openings[i]); - } - Ok(()) - } - - fn protocol_name() -> &'static [u8] { - b"mock_commit" - } -} diff --git a/spartan_parallel/src/commitment/mod.rs b/spartan_parallel/src/commitment/mod.rs deleted file mode 100644 index db10c18a..00000000 --- a/spartan_parallel/src/commitment/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -// pub mod binius; -pub mod commitment_scheme; -// pub mod hyperkzg; -pub mod hyrax; -// pub mod kzg; -pub mod pedersen; -// pub mod zeromorph; - -#[cfg(test)] -pub mod mock; diff --git a/spartan_parallel/src/commitment/pedersen.rs b/spartan_parallel/src/commitment/pedersen.rs deleted file mode 100644 index b544517b..00000000 --- a/spartan_parallel/src/commitment/pedersen.rs +++ /dev/null @@ -1,64 +0,0 @@ -use ark_ec::CurveGroup; -use serde::Serialize; -use rand_chacha::ChaCha20Rng; -use sha3::Shake256; -use std::io::Read; - -use crate::msm::VariableBaseMSM; - -#[derive(Clone, Serialize)] -pub struct PedersenGenerators { - pub generators: Vec, -} - -impl PedersenGenerators { - pub fn new(len: usize, label: &[u8]) -> Self { - let mut shake = Shake256::default(); - shake.update(label); - let mut buf = vec![]; - G::generator().serialize_compressed(&mut buf).unwrap(); - shake.update(&buf); - - let mut reader = shake.finalize_xof(); - let mut seed = [0u8; 32]; - reader.read_exact(&mut seed).unwrap(); - let mut rng = ChaCha20Rng::from_seed(seed); - - let mut generators: Vec = Vec::new(); - for _ in 0..len { - generators.push(G::rand(&mut rng)); - } - - Self { generators } - } - - pub fn clone_n(&self, n: usize) -> PedersenGenerators { - assert!( - self.generators.len() >= n, - "Insufficient number of generators for clone_n: required {}, available {}", - n, - self.generators.len() - ); - let slice = &self.generators[..n]; - PedersenGenerators { - generators: slice.into(), - } - } -} - -pub trait PedersenCommitment: Sized { - fn commit(&self, gens: &PedersenGenerators) -> G; - fn commit_vector(inputs: &[Self], bases: &[G::Affine]) -> G; -} - -impl PedersenCommitment for G::ScalarField { - fn commit(&self, gens: &PedersenGenerators) -> G { - assert_eq!(gens.generators.len(), 1); - gens.generators[0] * self - } - - fn commit_vector(inputs: &[Self], bases: &[G::Affine]) -> G { - assert_eq!(bases.len(), inputs.len()); - VariableBaseMSM::msm(bases, inputs).unwrap() - } -} diff --git a/spartan_parallel/src/commitment/zeromorph.rs b/spartan_parallel/src/commitment/zeromorph.rs deleted file mode 100644 index c46ed773..00000000 --- a/spartan_parallel/src/commitment/zeromorph.rs +++ /dev/null @@ -1,992 +0,0 @@ -#![allow(clippy::too_many_arguments)] -#![allow(clippy::type_complexity)] - -use std::{iter, marker::PhantomData}; - -use crate::field; -use crate::msm::VariableBaseMSM; -use crate::poly::{dense_mlpoly::DensePolynomial, unipoly::UniPoly}; -use crate::utils::mul_0_1_optimized; -use crate::utils::thread::unsafe_allocate_zero_vec; -use crate::utils::{ - errors::ProofVerifyError, - transcript::{AppendToTranscript, ProofTranscript}, -}; -use ark_ec::{pairing::Pairing, AffineRepr, CurveGroup}; -use ark_ff::{batch_inversion, Field}; -use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; -use ark_std::{One, Zero}; -use itertools::izip; -use rand_chacha::{rand_core::SeedableRng, ChaCha20Rng}; -use rand_core::{CryptoRng, RngCore}; -use std::sync::Arc; -use tracing::trace_span; - -use rayon::prelude::*; - -use super::{ - commitment_scheme::{BatchType, CommitShape, CommitmentScheme}, - kzg::{KZGProverKey, KZGVerifierKey, UnivariateKZG, SRS}, -}; - -pub struct ZeromorphSRS(Arc>); - -impl ZeromorphSRS

{ - pub fn setup(rng: &mut R, max_degree: usize) -> Self { - Self(Arc::new(SRS::setup(rng, max_degree, max_degree))) - } - - pub fn trim(self, max_degree: usize) -> (ZeromorphProverKey

, ZeromorphVerifierKey

) { - let (commit_pp, kzg_vk) = SRS::trim(self.0.clone(), max_degree); - let offset = self.0.g1_powers.len() - max_degree; - let tau_N_max_sub_2_N = self.0.g2_powers[offset]; - let open_pp = KZGProverKey::new(self.0, offset, max_degree); - ( - ZeromorphProverKey { commit_pp, open_pp }, - ZeromorphVerifierKey { - kzg_vk, - tau_N_max_sub_2_N, - }, - ) - } -} - -//TODO: adapt interface to have prover and verifier key -#[derive(Clone, Debug)] -pub struct ZeromorphProverKey { - pub commit_pp: KZGProverKey

, - pub open_pp: KZGProverKey

, -} - -#[derive(Copy, Clone, Debug)] -pub struct ZeromorphVerifierKey { - pub kzg_vk: KZGVerifierKey

, - pub tau_N_max_sub_2_N: P::G2Affine, -} - -#[derive(Debug, PartialEq, CanonicalSerialize, CanonicalDeserialize)] -pub struct ZeromorphCommitment(P::G1Affine); - -impl Default for ZeromorphCommitment

{ - fn default() -> Self { - Self(P::G1Affine::zero()) - } -} - -impl AppendToTranscript for ZeromorphCommitment

{ - fn append_to_transcript(&self, transcript: &mut ProofTranscript) { - transcript.append_point(&self.0.into_group()); - } -} - -#[derive(Clone, CanonicalSerialize, CanonicalDeserialize, Debug)] -pub struct ZeromorphProof { - pub pi: P::G1Affine, - pub q_hat_com: P::G1Affine, - pub q_k_com: Vec, -} - -fn compute_multilinear_quotients( - poly: &DensePolynomial, - point: &[P::ScalarField], -) -> (Vec>, P::ScalarField) -where -

::ScalarField: field::JoltField, -{ - let num_var = poly.get_num_vars(); - assert_eq!(num_var, point.len()); - - let mut remainder = poly.Z.to_vec(); - let mut quotients: Vec<_> = point - .iter() - .enumerate() - .map(|(i, x_i)| { - let (remainder_lo, remainder_hi) = remainder.split_at_mut(1 << (num_var - 1 - i)); - let mut quotient = vec![P::ScalarField::zero(); remainder_lo.len()]; - - quotient - .par_iter_mut() - .zip(&*remainder_lo) - .zip(&*remainder_hi) - .for_each(|((q, r_lo), r_hi)| { - *q = *r_hi - *r_lo; - }); - - remainder_lo - .par_iter_mut() - .zip(remainder_hi) - .for_each(|(r_lo, r_hi)| { - *r_lo += (*r_hi - *r_lo) * *x_i; - }); - - remainder.truncate(1 << (num_var - 1 - i)); - - UniPoly::from_coeff(quotient) - }) - .collect(); - quotients.reverse(); - (quotients, remainder[0]) -} - -// Compute the batched, lifted-degree quotient `\hat{q}` -fn compute_batched_lifted_degree_quotient( - quotients: &[UniPoly], - y_challenge: &P::ScalarField, -) -> (UniPoly, usize) -where -

::ScalarField: field::JoltField, -{ - let num_vars = quotients.len(); - - // Compute \hat{q} = \sum_k y^k * X^{N - d_k - 1} * q_k - let mut scalar = P::ScalarField::one(); // y^k - - // Rather than explicitly computing the shifts of q_k by N - d_k - 1 (i.e. multiplying q_k by X^{N - d_k - 1}) - // then accumulating them, we simply accumulate y^k*q_k into \hat{q} at the index offset N - d_k - 1 - let q_hat = quotients.iter().enumerate().fold( - vec![P::ScalarField::zero(); 1 << num_vars], - |mut q_hat, (idx, q)| { - let q_hat_iter = q_hat[(1 << num_vars) - (1 << idx)..].par_iter_mut(); - q_hat_iter.zip(&q.coeffs).for_each(|(q_hat, q)| { - *q_hat += scalar * *q; - }); - scalar *= *y_challenge; - q_hat - }, - ); - - (UniPoly::from_coeff(q_hat), 1 << (num_vars - 1)) -} - -fn eval_and_quotient_scalars( - y_challenge: P::ScalarField, - x_challenge: P::ScalarField, - z_challenge: P::ScalarField, - challenges: &[P::ScalarField], -) -> (P::ScalarField, (Vec, Vec)) -where -

::ScalarField: field::JoltField, -{ - let num_vars = challenges.len(); - - // squares of x = [x, x^2, .. x^{2^k}, .. x^{2^num_vars}] - let squares_of_x: Vec<_> = iter::successors(Some(x_challenge), |&x| Some(x.square())) - .take(num_vars + 1) - .collect(); - - let offsets_of_x = { - let mut offsets_of_x = squares_of_x - .iter() - .rev() - .skip(1) - .scan(P::ScalarField::one(), |acc, pow_x| { - *acc *= *pow_x; - Some(*acc) - }) - .collect::>(); - offsets_of_x.reverse(); - offsets_of_x - }; - - let vs = { - let v_numer = squares_of_x[num_vars] - P::ScalarField::one(); - let mut v_denoms = squares_of_x - .iter() - .map(|squares_of_x| *squares_of_x - P::ScalarField::one()) - .collect::>(); - batch_inversion(&mut v_denoms); - v_denoms - .iter() - .map(|v_denom| v_numer * *v_denom) - .collect::>() - }; - - let q_scalars = izip!( - iter::successors(Some(P::ScalarField::one()), |acc| Some(*acc * y_challenge)) - .take(num_vars), - offsets_of_x, - squares_of_x, - &vs, - &vs[1..], - challenges.iter().rev() - ) - .map(|(power_of_y, offset_of_x, square_of_x, v_i, v_j, u_i)| { - ( - -(power_of_y * offset_of_x), - -(z_challenge * (square_of_x * *v_j - *u_i * *v_i)), - ) - }) - .unzip(); - // -vs[0] * z = -z * (x^(2^num_vars) - 1) / (x - 1) = -z Φ_n(x) - (-vs[0] * z_challenge, q_scalars) -} - -#[derive(Clone)] -pub struct Zeromorph { - _phantom: PhantomData

, -} - -impl Zeromorph

-where -

::ScalarField: field::JoltField, -{ - pub fn protocol_name() -> &'static [u8] { - b"Zeromorph" - } - - pub fn commit( - pp: &ZeromorphProverKey

, - poly: &DensePolynomial, - ) -> Result, ProofVerifyError> { - if pp.commit_pp.g1_powers().len() < poly.Z.len() { - return Err(ProofVerifyError::KeyLengthError( - pp.commit_pp.g1_powers().len(), - poly.Z.len(), - )); - } - Ok(ZeromorphCommitment( - UnivariateKZG::commit(&pp.commit_pp, &UniPoly::from_coeff(poly.Z.clone())).unwrap(), - )) - } - - #[tracing::instrument(skip_all, name = "Zeromorph::open")] - pub fn open( - pp: &ZeromorphProverKey

, - poly: &DensePolynomial, - point: &[P::ScalarField], - // Can be calculated - eval: &P::ScalarField, - transcript: &mut ProofTranscript, - ) -> Result, ProofVerifyError> { - transcript.append_protocol_name(Self::protocol_name()); - - if pp.commit_pp.g1_powers().len() < poly.Z.len() { - return Err(ProofVerifyError::KeyLengthError( - pp.commit_pp.g1_powers().len(), - poly.Z.len(), - )); - } - - assert_eq!(poly.evaluate(point), *eval); - - let (quotients, remainder): (Vec>, P::ScalarField) = - compute_multilinear_quotients::

(poly, point); - assert_eq!(quotients.len(), poly.get_num_vars()); - assert_eq!(remainder, *eval); - - // Compute the multilinear quotients q_k = q_k(X_0, ..., X_{k-1}) - let q_k_com: Vec = quotients - .par_iter() - .map(|q| UnivariateKZG::commit(&pp.commit_pp, q).unwrap()) - .collect(); - let q_comms: Vec = q_k_com.par_iter().map(|c| c.into_group()).collect(); - q_comms.iter().for_each(|c| transcript.append_point(c)); - - // Sample challenge y - let y_challenge: P::ScalarField = transcript.challenge_scalar(); - - // Compute the batched, lifted-degree quotient `\hat{q}` - // qq_hat = ∑_{i=0}^{num_vars-1} y^i * X^(2^num_vars - d_k - 1) * q_i(x) - let (q_hat, offset) = compute_batched_lifted_degree_quotient::

("ients, &y_challenge); - - // Compute and absorb the commitment C_q = [\hat{q}] - let q_hat_com = UnivariateKZG::commit_offset(&pp.commit_pp, &q_hat, offset)?; - transcript.append_point(&q_hat_com.into_group()); - - // Get x and z challenges - let x_challenge = transcript.challenge_scalar(); - let z_challenge = transcript.challenge_scalar(); - - // Compute batched degree and ZM-identity quotient polynomial pi - let (eval_scalar, (degree_check_q_scalars, zmpoly_q_scalars)): ( - P::ScalarField, - (Vec, Vec), - ) = eval_and_quotient_scalars::

(y_challenge, x_challenge, z_challenge, point); - // f = z * poly.Z + q_hat + (-z * Φ_n(x) * e) + ∑_k (q_scalars_k * q_k) - let mut f = UniPoly::from_coeff(poly.Z.clone()); - f *= &z_challenge; - f += &q_hat; - f[0] += eval_scalar * *eval; - quotients - .into_iter() - .zip(degree_check_q_scalars) - .zip(zmpoly_q_scalars) - .for_each(|((mut q, degree_check_scalar), zm_poly_scalar)| { - q *= &(degree_check_scalar + zm_poly_scalar); - f += &q; - }); - debug_assert_eq!(f.evaluate(&x_challenge), P::ScalarField::zero()); - - // Compute and send proof commitment pi - let (pi, _) = UnivariateKZG::open(&pp.open_pp, &f, &x_challenge)?; - - Ok(ZeromorphProof { - pi, - q_hat_com, - q_k_com, - }) - } - - #[tracing::instrument(skip_all, name = "Zeromorph::batch_open")] - fn batch_open( - pk: &ZeromorphProverKey

, - polynomials: &[&DensePolynomial], - point: &[P::ScalarField], - evals: &[P::ScalarField], - transcript: &mut ProofTranscript, - ) -> ZeromorphProof

{ - let num_vars = point.len(); - let n = 1 << num_vars; - - // Generate batching challenge \rho and powers 1,...,\rho^{m-1} - let rho: P::ScalarField = transcript.challenge_scalar(); - let mut rho_powers = vec![P::ScalarField::one()]; - for i in 1..polynomials.len() { - rho_powers.push(rho_powers[i - 1] * rho); - } - - // Compute batching of unshifted polynomials f_i, and batched eval v_i: - let batched_evaluation = rho_powers - .iter() - .zip(evals.iter()) - .map(|(scalar, eval)| *scalar * *eval) - .sum(); - - let span = trace_span!("f_batched"); - let enter = span.enter(); - let num_chunks = rayon::current_num_threads().next_power_of_two(); - let chunk_size = n / num_chunks; - let f_batched = (0..num_chunks) - .into_par_iter() - .flat_map_iter(|chunk_index| { - let mut chunk = unsafe_allocate_zero_vec::(chunk_size); - for (coeff, poly) in rho_powers.iter().zip(polynomials.iter()) { - for (rlc, poly_eval) in chunk - .iter_mut() - .zip(poly.evals_ref()[chunk_index * chunk_size..].iter()) - { - *rlc += mul_0_1_optimized(poly_eval, coeff); - } - } - chunk - }) - .collect::>(); - drop(enter); - drop(span); - - let poly = DensePolynomial::new(f_batched); - Zeromorph::

::open(pk, &poly, point, &batched_evaluation, transcript).unwrap() - } - - fn batch_verify( - vk: &ZeromorphVerifierKey

, - commitments: &[&ZeromorphCommitment

], - point: &[P::ScalarField], - evals: &[P::ScalarField], - batch_proof: &ZeromorphProof

, - transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - //TODO(pat): produce powers in parallel using window method - // Compute batching of unshifted polynomials f_i: - // Compute powers of batching challenge rho - let rho: P::ScalarField = transcript.challenge_scalar(); - let mut scalar = P::ScalarField::one(); - let (batched_eval, batched_commitment) = evals.iter().zip(commitments.iter()).fold( - (P::ScalarField::zero(), P::G1::zero()), - |(mut batched_evaluation, mut batched_commitment), (opening, commitment)| { - batched_evaluation += scalar * *opening; - batched_commitment += commitment.0 * scalar; - scalar *= rho; - (batched_evaluation, batched_commitment) - }, - ); - Zeromorph::

::verify( - vk, - &ZeromorphCommitment(batched_commitment.into_affine()), - point, - &batched_eval, - batch_proof, - transcript, - ) - } - - pub fn verify( - vk: &ZeromorphVerifierKey

, - comm: &ZeromorphCommitment

, - point: &[P::ScalarField], - eval: &P::ScalarField, - proof: &ZeromorphProof

, - transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(Self::protocol_name()); - - let q_comms: Vec = proof.q_k_com.iter().map(|c| c.into_group()).collect(); - q_comms.iter().for_each(|c| transcript.append_point(c)); - - // Challenge y - let y_challenge: P::ScalarField = transcript.challenge_scalar(); - - // Receive commitment C_q_hat - transcript.append_point(&proof.q_hat_com.into_group()); - - // Get x and z challenges - let x_challenge = transcript.challenge_scalar(); - let z_challenge = transcript.challenge_scalar(); - - // Compute batched degree and ZM-identity quotient polynomial pi - let (eval_scalar, (mut q_scalars, zmpoly_q_scalars)): ( - P::ScalarField, - (Vec, Vec), - ) = eval_and_quotient_scalars::

(y_challenge, x_challenge, z_challenge, point); - q_scalars - .iter_mut() - .zip(zmpoly_q_scalars) - .for_each(|(scalar, zm_poly_q_scalar)| { - *scalar += zm_poly_q_scalar; - }); - let scalars = [ - vec![P::ScalarField::one(), z_challenge, eval_scalar * *eval], - q_scalars, - ] - .concat(); - let bases = [ - vec![proof.q_hat_com, comm.0, vk.kzg_vk.g1], - proof.q_k_com.clone(), - ] - .concat(); - let zeta_z_com = ::msm(&bases, &scalars) - .unwrap() - .into_affine(); - - // e(pi, [tau]_2 - x * [1]_2) == e(C_{\zeta,Z}, -[X^(N_max - 2^n - 1)]_2) <==> e(C_{\zeta,Z} - x * pi, [X^{N_max - 2^n - 1}]_2) * e(-pi, [tau_2]) == 1 - let pairing = P::multi_pairing( - [zeta_z_com, proof.pi], - [ - (-vk.tau_N_max_sub_2_N.into_group()).into_affine(), - (vk.kzg_vk.beta_g2.into_group() - (vk.kzg_vk.g2 * x_challenge)).into(), - ], - ); - if pairing.is_zero() { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } -} - -impl CommitmentScheme for Zeromorph

-where -

::ScalarField: field::JoltField, -{ - type Field = P::ScalarField; - type Setup = (ZeromorphProverKey

, ZeromorphVerifierKey

); - type Commitment = ZeromorphCommitment

; - type Proof = ZeromorphProof

; - type BatchedProof = ZeromorphProof

; - - fn setup(shapes: &[CommitShape]) -> Self::Setup { - let max_len = shapes.iter().map(|shape| shape.input_length).max().unwrap(); - - ZeromorphSRS(Arc::new(SRS::setup( - &mut ChaCha20Rng::from_seed(*b"ZEROMORPH_POLY_COMMITMENT_SCHEME"), - max_len, - max_len, - ))) - .trim(max_len) - } - - fn commit(poly: &DensePolynomial, setup: &Self::Setup) -> Self::Commitment { - assert!( - setup.0.commit_pp.g1_powers().len() > poly.Z.len(), - "COMMIT KEY LENGTH ERROR {}, {}", - setup.0.commit_pp.g1_powers().len(), - poly.Z.len() - ); - ZeromorphCommitment( - UnivariateKZG::commit(&setup.0.commit_pp, &UniPoly::from_coeff(poly.Z.clone())) - .unwrap(), - ) - } - - fn batch_commit( - evals: &[&[Self::Field]], - gens: &Self::Setup, - _batch_type: BatchType, - ) -> Vec { - // TODO: assert lengths are valid - evals - .par_iter() - .map(|evals| { - assert!( - gens.0.commit_pp.g1_powers().len() > evals.len(), - "COMMIT KEY LENGTH ERROR {}, {}", - gens.0.commit_pp.g1_powers().len(), - evals.len() - ); - ZeromorphCommitment( - UnivariateKZG::commit(&gens.0.commit_pp, &UniPoly::from_coeff(evals.to_vec())) - .unwrap(), - ) - }) - .collect::>() - } - - fn commit_slice(evals: &[Self::Field], setup: &Self::Setup) -> Self::Commitment { - ZeromorphCommitment( - UnivariateKZG::commit(&setup.0.commit_pp, &UniPoly::from_coeff(evals.to_vec())) - .unwrap(), - ) - } - - fn prove( - setup: &Self::Setup, - poly: &DensePolynomial, - opening_point: &[Self::Field], // point at which the polynomial is evaluated - transcript: &mut ProofTranscript, - ) -> Self::Proof { - let eval = poly.evaluate(opening_point); - Zeromorph::

::open(&setup.0, poly, opening_point, &eval, transcript).unwrap() - } - - fn batch_prove( - setup: &Self::Setup, - polynomials: &[&DensePolynomial], - opening_point: &[Self::Field], - openings: &[Self::Field], - _batch_type: BatchType, - transcript: &mut ProofTranscript, - ) -> Self::BatchedProof { - Zeromorph::

::batch_open(&setup.0, polynomials, opening_point, openings, transcript) - } - - fn combine_commitments( - commitments: &[&Self::Commitment], - coeffs: &[Self::Field], - ) -> Self::Commitment { - let combined_commitment: P::G1 = commitments - .iter() - .zip(coeffs.iter()) - .map(|(commitment, coeff)| commitment.0 * coeff) - .sum(); - ZeromorphCommitment(combined_commitment.into_affine()) - } - - fn verify( - proof: &Self::Proof, - setup: &Self::Setup, - transcript: &mut ProofTranscript, - opening_point: &[Self::Field], // point at which the polynomial is evaluated - opening: &Self::Field, // evaluation \widetilde{Z}(r) - commitment: &Self::Commitment, - ) -> Result<(), ProofVerifyError> { - Zeromorph::

::verify( - &setup.1, - commitment, - opening_point, - opening, - proof, - transcript, - ) - } - - fn batch_verify( - batch_proof: &Self::BatchedProof, - setup: &Self::Setup, - opening_point: &[Self::Field], - openings: &[Self::Field], - commitments: &[&Self::Commitment], - transcript: &mut ProofTranscript, - ) -> Result<(), ProofVerifyError> { - Zeromorph::

::batch_verify( - &setup.1, - commitments, - opening_point, - openings, - batch_proof, - transcript, - ) - } - - fn protocol_name() -> &'static [u8] { - b"zeromorph" - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::utils::math::Math; - use ark_bn254::{Bn254, Fr}; - use ark_ff::{BigInt, Zero}; - use ark_std::{test_rng, UniformRand}; - use rand_core::SeedableRng; - - // Evaluate Phi_k(x) = \sum_{i=0}^k x^i using the direct inefficent formula - fn phi(challenge: &P::ScalarField, subscript: usize) -> P::ScalarField { - let len = (1 << subscript) as u64; - (0..len).fold(P::ScalarField::zero(), |mut acc, i| { - //Note this is ridiculous DevX - acc += challenge.pow(BigInt::<1>::from(i)); - acc - }) - } - - /// Test for computing qk given multilinear f - /// Given 𝑓(𝑋₀, …, 𝑋ₙ₋₁), and `(𝑢, 𝑣)` such that \f(\u) = \v, compute `qₖ(𝑋₀, …, 𝑋ₖ₋₁)` - /// such that the following identity holds: - /// - /// `𝑓(𝑋₀, …, 𝑋ₙ₋₁) − 𝑣 = ∑ₖ₌₀ⁿ⁻¹ (𝑋ₖ − 𝑢ₖ) qₖ(𝑋₀, …, 𝑋ₖ₋₁)` - #[test] - fn quotient_construction() { - // Define size params - let num_vars = 4; - let n: u64 = 1 << num_vars; - - // Construct a random multilinear polynomial f, and (u,v) such that f(u) = v - let mut rng = test_rng(); - let multilinear_f = - DensePolynomial::new((0..n).map(|_| Fr::rand(&mut rng)).collect::>()); - let u_challenge = (0..num_vars) - .map(|_| Fr::rand(&mut rng)) - .collect::>(); - let v_evaluation = multilinear_f.evaluate(&u_challenge); - - // Compute multilinear quotients `qₖ(𝑋₀, …, 𝑋ₖ₋₁)` - let (quotients, constant_term) = - compute_multilinear_quotients::(&multilinear_f, &u_challenge); - - // Assert the constant term is equal to v_evaluation - assert_eq!( - constant_term, v_evaluation, - "The constant term equal to the evaluation of the polynomial at challenge point." - ); - - //To demonstrate that q_k was properly constructd we show that the identity holds at a random multilinear challenge - // i.e. 𝑓(𝑧) − 𝑣 − ∑ₖ₌₀ᵈ⁻¹ (𝑧ₖ − 𝑢ₖ)𝑞ₖ(𝑧) = 0 - let z_challenge = (0..num_vars) - .map(|_| Fr::rand(&mut rng)) - .collect::>(); - - let mut res = multilinear_f.evaluate(&z_challenge); - res -= v_evaluation; - - for (k, q_k_uni) in quotients.iter().enumerate() { - let z_partial = &z_challenge[z_challenge.len() - k..]; - //This is a weird consequence of how things are done.. the univariate polys are of the multilinear commitment in lagrange basis. Therefore we evaluate as multilinear - let q_k = DensePolynomial::new(q_k_uni.coeffs.clone()); - let q_k_eval = q_k.evaluate(z_partial); - - res -= (z_challenge[z_challenge.len() - k - 1] - - u_challenge[z_challenge.len() - k - 1]) - * q_k_eval; - } - assert!(res.is_zero()); - } - - /// Test for construction of batched lifted degree quotient: - /// ̂q = ∑ₖ₌₀ⁿ⁻¹ yᵏ Xᵐ⁻ᵈᵏ⁻¹ ̂qₖ, 𝑑ₖ = deg(̂q), 𝑚 = 𝑁 - #[test] - fn batched_lifted_degree_quotient() { - let num_vars = 3; - let n = 1 << num_vars; - - // Define mock qₖ with deg(qₖ) = 2ᵏ⁻¹ - let q_0 = UniPoly::from_coeff(vec![Fr::one()]); - let q_1 = UniPoly::from_coeff(vec![Fr::from(2u64), Fr::from(3u64)]); - let q_2 = UniPoly::from_coeff(vec![ - Fr::from(4u64), - Fr::from(5u64), - Fr::from(6u64), - Fr::from(7u64), - ]); - let quotients = vec![q_0, q_1, q_2]; - - let mut rng = test_rng(); - let y_challenge = Fr::rand(&mut rng); - - //Compute batched quptient ̂q - let (batched_quotient, _) = - compute_batched_lifted_degree_quotient::("ients, &y_challenge); - - //Explicitly define q_k_lifted = X^{N-2^k} * q_k and compute the expected batched result - let q_0_lifted = UniPoly::from_coeff(vec![ - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::one(), - ]); - let q_1_lifted = UniPoly::from_coeff(vec![ - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::from(2u64), - Fr::from(3u64), - ]); - let q_2_lifted = UniPoly::from_coeff(vec![ - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::zero(), - Fr::from(4u64), - Fr::from(5u64), - Fr::from(6u64), - Fr::from(7u64), - ]); - - //Explicitly compute ̂q i.e. RLC of lifted polys - let mut batched_quotient_expected = UniPoly::from_coeff(vec![Fr::zero(); n]); - - batched_quotient_expected += &q_0_lifted; - batched_quotient_expected += &(q_1_lifted * y_challenge); - batched_quotient_expected += &(q_2_lifted * (y_challenge * y_challenge)); - assert_eq!(batched_quotient, batched_quotient_expected); - } - - /// evaluated quotient \zeta_x - /// - /// 𝜁 = 𝑓 − ∑ₖ₌₀ⁿ⁻¹𝑦ᵏ𝑥ʷˢ⁻ʷ⁺¹𝑓ₖ = 𝑓 − ∑_{d ∈ {d₀, ..., dₙ₋₁}} X^{d* - d + 1} − ∑{k∶ dₖ=d} yᵏ fₖ , where d* = lifted degree - /// - /// 𝜁 = ̂q - ∑ₖ₌₀ⁿ⁻¹ yᵏ Xᵐ⁻ᵈᵏ⁻¹ ̂qₖ, m = N - #[test] - fn partially_evaluated_quotient_zeta() { - let num_vars = 3; - let n: u64 = 1 << num_vars; - - let mut rng = test_rng(); - let x_challenge = Fr::rand(&mut rng); - let y_challenge = Fr::rand(&mut rng); - - let challenges: Vec<_> = (0..num_vars).map(|_| Fr::rand(&mut rng)).collect(); - let z_challenge = Fr::rand(&mut rng); - - let (_, (zeta_x_scalars, _)) = - eval_and_quotient_scalars::(y_challenge, x_challenge, z_challenge, &challenges); - - // To verify we manually compute zeta using the computed powers and expected - // 𝜁 = ̂q - ∑ₖ₌₀ⁿ⁻¹ yᵏ Xᵐ⁻ᵈᵏ⁻¹ ̂qₖ, m = N - assert_eq!( - zeta_x_scalars[0], - -x_challenge.pow(BigInt::<1>::from(n - 1)) - ); - - assert_eq!( - zeta_x_scalars[1], - -y_challenge * x_challenge.pow(BigInt::<1>::from(n - 1 - 1)) - ); - - assert_eq!( - zeta_x_scalars[2], - -y_challenge * y_challenge * x_challenge.pow(BigInt::<1>::from(n - 3 - 1)) - ); - } - - /// Test efficiently computing 𝛷ₖ(x) = ∑ᵢ₌₀ᵏ⁻¹xⁱ - /// 𝛷ₖ(𝑥) = ∑ᵢ₌₀ᵏ⁻¹𝑥ⁱ = (𝑥²^ᵏ − 1) / (𝑥 − 1) - #[test] - fn phi_n_x_evaluation() { - const N: u64 = 8u64; - let log_N = (N as usize).log_2(); - - // 𝛷ₖ(𝑥) - let mut rng = test_rng(); - let x_challenge = Fr::rand(&mut rng); - - let efficient = (x_challenge.pow(BigInt::<1>::from((1 << log_N) as u64)) - Fr::one()) - / (x_challenge - Fr::one()); - let expected: Fr = phi::(&x_challenge, log_N); - assert_eq!(efficient, expected); - } - - /// Test efficiently computing 𝛷ₖ(x) = ∑ᵢ₌₀ᵏ⁻¹xⁱ - /// 𝛷ₙ₋ₖ₋₁(𝑥²^ᵏ⁺¹) = (𝑥²^ⁿ − 1) / (𝑥²^ᵏ⁺¹ − 1) - #[test] - fn phi_n_k_1_x_evaluation() { - const N: u64 = 8u64; - let log_N = (N as usize).log_2(); - - // 𝛷ₖ(𝑥) - let mut rng = test_rng(); - let x_challenge = Fr::rand(&mut rng); - let k = 2; - - //𝑥²^ᵏ⁺¹ - let x_pow = x_challenge.pow(BigInt::<1>::from((1 << (k + 1)) as u64)); - - //(𝑥²^ⁿ − 1) / (𝑥²^ᵏ⁺¹ − 1) - let efficient = (x_challenge.pow(BigInt::<1>::from((1 << log_N) as u64)) - Fr::one()) - / (x_pow - Fr::one()); - let expected: Fr = phi::(&x_challenge, log_N - k - 1); - assert_eq!(efficient, expected); - } - - /// Test construction of 𝑍ₓ - /// 𝑍ₓ = ̂𝑓 − 𝑣 ∑ₖ₌₀ⁿ⁻¹(𝑥²^ᵏ𝛷ₙ₋ₖ₋₁(𝑥ᵏ⁺¹)− 𝑢ₖ𝛷ₙ₋ₖ(𝑥²^ᵏ)) ̂qₖ - #[test] - fn partially_evaluated_quotient_z_x() { - let num_vars = 3; - - // Construct a random multilinear polynomial f, and (u,v) such that f(u) = v. - let mut rng = test_rng(); - let challenges: Vec<_> = (0..num_vars).map(|_| Fr::rand(&mut rng)).collect(); - - let u_rev = { - let mut res = challenges.clone(); - res.reverse(); - res - }; - - let x_challenge = Fr::rand(&mut rng); - let y_challenge = Fr::rand(&mut rng); - let z_challenge = Fr::rand(&mut rng); - - // Construct Z_x scalars - let (_, (_, z_x_scalars)) = - eval_and_quotient_scalars::(y_challenge, x_challenge, z_challenge, &challenges); - - for k in 0..num_vars { - let x_pow_2k = x_challenge.pow(BigInt::<1>::from((1 << k) as u64)); // x^{2^k} - let x_pow_2kp1 = x_challenge.pow(BigInt::<1>::from((1 << (k + 1)) as u64)); // x^{2^{k+1}} - // x^{2^k} * \Phi_{n-k-1}(x^{2^{k+1}}) - u_k * \Phi_{n-k}(x^{2^k}) - let mut scalar = x_pow_2k * phi::(&x_pow_2kp1, num_vars - k - 1) - - u_rev[k] * phi::(&x_pow_2k, num_vars - k); - scalar *= z_challenge; - scalar *= Fr::from(-1); - assert_eq!(z_x_scalars[k], scalar); - } - } - - #[test] - fn zeromorph_commit_prove_verify() { - for num_vars in [4, 5, 6] { - let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(num_vars as u64); - - let poly = DensePolynomial::random(num_vars, &mut rng); - let point: Vec<::ScalarField> = (0..num_vars) - .map(|_| ::ScalarField::rand(&mut rng)) - .collect(); - let eval = poly.evaluate(&point); - - let srs = ZeromorphSRS::::setup(&mut rng, 1 << num_vars); - let (pk, vk) = srs.trim(1 << num_vars); - let commitment = Zeromorph::::commit(&pk, &poly).unwrap(); - - let mut prover_transcript = ProofTranscript::new(b"TestEval"); - let proof = Zeromorph::::open(&pk, &poly, &point, &eval, &mut prover_transcript) - .unwrap(); - let p_transcipt_squeeze: ::ScalarField = - prover_transcript.challenge_scalar(); - - // Verify proof. - let mut verifier_transcript = ProofTranscript::new(b"TestEval"); - Zeromorph::::verify( - &vk, - &commitment, - &point, - &eval, - &proof, - &mut verifier_transcript, - ) - .unwrap(); - let v_transcipt_squeeze: ::ScalarField = - verifier_transcript.challenge_scalar(); - - assert_eq!(p_transcipt_squeeze, v_transcipt_squeeze); - - // evaluate bad proof for soundness - let altered_verifier_point = point - .iter() - .map(|s| *s + ::ScalarField::one()) - .collect::>(); - let altered_verifier_eval = poly.evaluate(&altered_verifier_point); - let mut verifier_transcript = ProofTranscript::new(b"TestEval"); - assert!(Zeromorph::::verify( - &vk, - &commitment, - &altered_verifier_point, - &altered_verifier_eval, - &proof, - &mut verifier_transcript, - ) - .is_err()) - } - } - - #[test] - fn batched_zeromorph_commit_prove_verify() { - for num_polys in [1, 2, 5, 7] { - for num_vars in [4, 5, 6] { - let mut rng = rand_chacha::ChaCha20Rng::seed_from_u64(num_vars as u64); - - let polys: Vec<_> = (0..num_polys) - .map(|_| DensePolynomial::random(num_vars, &mut rng)) - .collect::>(); - let point: Vec = (0..num_vars).map(|_| Fr::rand(&mut rng)).collect(); - let evals: Vec = polys.iter().map(|poly| poly.evaluate(&point)).collect(); - - let srs = ZeromorphSRS::::setup(&mut rng, 1 << num_vars); - let (pk, vk) = srs.trim(1 << num_vars); - let commitments: Vec<_> = polys - .iter() - .map(|poly| Zeromorph::::commit(&pk, poly).unwrap()) - .collect(); - - let commitments_refs: Vec<_> = commitments.iter().collect(); - let polys_refs: Vec<_> = polys.iter().collect(); - - let mut prover_transcript = ProofTranscript::new(b"TestEval"); - let proof = Zeromorph::::batch_open( - &pk, - &polys_refs, - &point, - &evals, - &mut prover_transcript, - ); - let p_transcipt_squeeze: ::ScalarField = - prover_transcript.challenge_scalar(); - - // Verify proof. - let mut verifier_transcript = ProofTranscript::new(b"TestEval"); - Zeromorph::::batch_verify( - &vk, - &commitments_refs, - &point, - &evals, - &proof, - &mut verifier_transcript, - ) - .unwrap(); - let v_transcipt_squeeze: ::ScalarField = - verifier_transcript.challenge_scalar(); - - assert_eq!(p_transcipt_squeeze, v_transcipt_squeeze); - - // evaluate bad proof for completeness - let altered_verifier_point = point - .iter() - .map(|s| *s + ::ScalarField::one()) - .collect::>(); - let altered_verifier_evals: Vec = polys - .iter() - .map(|poly| poly.evaluate(&altered_verifier_point)) - .collect(); - let mut verifier_transcript = ProofTranscript::new(b"TestEval"); - assert!(Zeromorph::::batch_verify( - &vk, - &commitments_refs, - &altered_verifier_point, - &altered_verifier_evals, - &proof, - &mut verifier_transcript, - ) - .is_err()) - } - } - } -} diff --git a/spartan_parallel/src/commitments.rs b/spartan_parallel/src/commitments.rs deleted file mode 100644 index 11fc9496..00000000 --- a/spartan_parallel/src/commitments.rs +++ /dev/null @@ -1,93 +0,0 @@ -use super::group::{GroupElement, VartimeMultiscalarMul, GROUP_BASEPOINT_COMPRESSED}; -use super::scalar::Scalar; -use digest::XofReader; -use digest::{ExtendableOutput, Update}; -use serde::Serialize; -use sha3::Shake256; - -#[derive(Debug, Clone, Serialize)] -pub struct MultiCommitGens { - pub n: usize, - pub G: Vec, - pub h: GroupElement, -} - -impl MultiCommitGens { - pub fn new(n: usize, label: &[u8]) -> Self { - let mut shake = Shake256::default(); - shake.update(label); - shake.update(GROUP_BASEPOINT_COMPRESSED.as_bytes()); - - let mut reader = shake.finalize_xof(); - let mut gens: Vec = Vec::new(); - let mut uniform_bytes = [0u8; 64]; - for _ in 0..n + 1 { - reader.read(&mut uniform_bytes); - gens.push(GroupElement::from_uniform_bytes(&uniform_bytes)); - } - - MultiCommitGens { - n, - G: gens[..n].to_vec(), - h: gens[n], - } - } - - pub fn clone(&self) -> MultiCommitGens { - MultiCommitGens { - n: self.n, - h: self.h, - G: self.G.clone(), - } - } - - pub fn scale(&self, s: &Scalar) -> MultiCommitGens { - MultiCommitGens { - n: self.n, - h: self.h, - G: (0..self.n).map(|i| s * self.G[i]).collect(), - } - } - - pub fn split_at(&self, mid: usize) -> (MultiCommitGens, MultiCommitGens) { - let (G1, G2) = self.G.split_at(mid); - - ( - MultiCommitGens { - n: G1.len(), - G: G1.to_vec(), - h: self.h, - }, - MultiCommitGens { - n: G2.len(), - G: G2.to_vec(), - h: self.h, - }, - ) - } -} - -pub trait Commitments { - fn commit(&self, blind: &Scalar, gens_n: &MultiCommitGens) -> GroupElement; -} - -impl Commitments for Scalar { - fn commit(&self, blind: &Scalar, gens_n: &MultiCommitGens) -> GroupElement { - assert_eq!(gens_n.n, 1); - GroupElement::vartime_multiscalar_mul(&[*self, *blind], &[gens_n.G[0], gens_n.h]) - } -} - -impl Commitments for Vec { - fn commit(&self, blind: &Scalar, gens_n: &MultiCommitGens) -> GroupElement { - assert_eq!(gens_n.n, self.len()); - GroupElement::vartime_multiscalar_mul(self, &gens_n.G) + blind * gens_n.h - } -} - -impl Commitments for [Scalar] { - fn commit(&self, blind: &Scalar, gens_n: &MultiCommitGens) -> GroupElement { - assert!(gens_n.n >= self.len()); - GroupElement::vartime_multiscalar_mul(self, &gens_n.G[..self.len()]) + blind * gens_n.h - } -} diff --git a/spartan_parallel/src/custom_dense_mlpoly.rs b/spartan_parallel/src/custom_dense_mlpoly.rs index d50fd842..18489e98 100644 --- a/spartan_parallel/src/custom_dense_mlpoly.rs +++ b/spartan_parallel/src/custom_dense_mlpoly.rs @@ -2,12 +2,10 @@ use std::cmp::min; use crate::dense_mlpoly::DensePolynomial; +use crate::scalar::SpartanExtensionField; use super::math::Math; -use super::scalar::Scalar; -const ZERO: Scalar = Scalar::zero(); -const ONE: Scalar = Scalar::one(); const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; @@ -19,17 +17,17 @@ const MODE_X: usize = 4; // Dense polynomial with variable order: p, q_rev, w, x_rev // Used by Z_poly in r1csproof #[derive(Debug, Clone)] -pub struct DensePolynomialPqx { +pub struct DensePolynomialPqx { num_instances: usize, // num_instances is a power of 2 and num_instances / 2 < Z.len() <= num_instances num_proofs: Vec, max_num_proofs: usize, pub num_witness_secs: usize, // num_witness_secs is a power of 2 and num_witness_secs / 2 < Z[.][.].len() <= num_witness_secs num_inputs: Vec, max_num_inputs: usize, - pub Z: Vec>>>, // Evaluations of the polynomial in all the 2^num_vars Boolean inputs of order (p, q_rev, w, x_rev) - // Let Q_max = max_num_proofs, assume that for a given P, num_proofs[P] = Q_i, then let STEP = Q_max / Q_i, - // Z(P, y, .) is only non-zero if y is a multiple of STEP, so Z[P][j][.] actually stores Z(P, j*STEP, .) - // The same applies to X + pub Z: Vec>>>, // Evaluations of the polynomial in all the 2^num_vars Boolean inputs of order (p, q_rev, w, x_rev) + // Let Q_max = max_num_proofs, assume that for a given P, num_proofs[P] = Q_i, then let STEP = Q_max / Q_i, + // Z(P, y, .) is only non-zero if y is a multiple of STEP, so Z[P][j][.] actually stores Z(P, j*STEP, .) + // The same applies to X } // Reverse the bits in q or x @@ -37,13 +35,13 @@ pub fn rev_bits(q: usize, max_num_proofs: usize) -> usize { (0..max_num_proofs.log_2()) .rev() .map(|i| q / (i.pow2()) % 2 * (max_num_proofs / i.pow2() / 2)) - .sum::() + .fold(0, |a, b| a + b) } -impl DensePolynomialPqx { +impl DensePolynomialPqx { // Assume z_mat is of form (p, q_rev, x), construct DensePoly pub fn new( - z_mat: &Vec>>>, + z_mat: &Vec>>>, num_proofs: Vec, max_num_proofs: usize, num_inputs: Vec, @@ -65,7 +63,7 @@ impl DensePolynomialPqx { // Assume z_mat is in its standard form of (p, q, x) // Reverse q and x and convert it to (p, q_rev, x_rev) pub fn new_rev( - z_mat: &Vec>>>, + z_mat: &Vec>>>, num_proofs: Vec, max_num_proofs: usize, num_inputs: Vec, @@ -76,7 +74,10 @@ impl DensePolynomialPqx { let num_witness_secs = z_mat[0][0].len(); for p in 0..num_instances { Z.push(vec![ - vec![vec![ZERO; num_inputs[p]]; num_witness_secs]; + vec![ + vec![S::field_zero(); num_inputs[p]]; + num_witness_secs + ]; num_proofs[p] ]); @@ -111,19 +112,19 @@ impl DensePolynomialPqx { } pub fn len(&self) -> usize { - self.num_instances * self.max_num_proofs * self.max_num_inputs + return self.num_instances * self.max_num_proofs * self.max_num_inputs; } // Given (p, q_rev, x_rev) return Z[p][q_rev][x_rev] - pub fn index(&self, p: usize, q_rev: usize, w: usize, x_rev: usize) -> Scalar { + pub fn index(&self, p: usize, q_rev: usize, w: usize, x_rev: usize) -> S { if p < self.Z.len() && q_rev < self.Z[p].len() && w < self.Z[p][q_rev].len() && x_rev < self.Z[p][q_rev][w].len() { - self.Z[p][q_rev][w][x_rev] + return self.Z[p][q_rev][w][x_rev]; } else { - ZERO + return S::field_zero(); } } @@ -133,35 +134,35 @@ impl DensePolynomialPqx { // Mode = 3 ==> w* is w with first bit set to 1 // Mode = 4 ==> x_rev* is x_rev with first bit set to 1 // Assume that first bit of the corresponding index is 0, otherwise throw out of bound exception - pub fn index_high(&self, p: usize, q_rev: usize, w: usize, x_rev: usize, mode: usize) -> Scalar { + pub fn index_high(&self, p: usize, q_rev: usize, w: usize, x_rev: usize, mode: usize) -> S { match mode { MODE_P => { if p + self.num_instances / 2 < self.Z.len() { - self.Z[p + self.num_instances / 2][q_rev][w][x_rev] + return self.Z[p + self.num_instances / 2][q_rev][w][x_rev]; } else { - ZERO + return S::field_zero(); } } MODE_Q => { - if self.num_proofs[p] == 1 { - ZERO + return if self.num_proofs[p] == 1 { + S::field_zero() } else { self.Z[p][q_rev + self.num_proofs[p] / 2][w][x_rev] - } + }; } MODE_W => { if w + self.num_witness_secs / 2 < self.Z[p][q_rev].len() { - self.Z[p][q_rev][w + self.num_witness_secs / 2][x_rev] + return self.Z[p][q_rev][w + self.num_witness_secs / 2][x_rev]; } else { - ZERO + return S::field_zero(); } } MODE_X => { - if self.num_inputs[p] == 1 { - ZERO + return if self.num_inputs[p] == 1 { + S::field_zero() } else { self.Z[p][q_rev][w][x_rev + self.num_inputs[p] / 2] - } + }; } _ => { panic!( @@ -177,7 +178,7 @@ impl DensePolynomialPqx { // Mode = 2 ==> Bound first variable of "q" section to r // Mode = 3 ==> Bound first variable of "w" section to r // Mode = 4 ==> Bound first variable of "x" section to r - pub fn bound_poly(&mut self, r: &Scalar, mode: usize) { + pub fn bound_poly(&mut self, r: &S, mode: usize) { match mode { MODE_P => { self.bound_poly_p(r); @@ -202,7 +203,7 @@ impl DensePolynomialPqx { // Bound the first variable of "p" section to r // We are only allowed to bound "p" if we have bounded the entire q and x section - pub fn bound_poly_p(&mut self, r: &Scalar) { + pub fn bound_poly_p(&mut self, r: &S) { assert_eq!(self.max_num_proofs, 1); assert_eq!(self.max_num_inputs, 1); self.num_instances /= 2; @@ -211,22 +212,22 @@ impl DensePolynomialPqx { let Z_high = if p + self.num_instances < self.Z.len() { self.Z[p + self.num_instances][0][w][0] } else { - ZERO + S::field_zero() }; - self.Z[p][0][w][0] = self.Z[p][0][w][0] + r * (Z_high - self.Z[p][0][w][0]); + self.Z[p][0][w][0] = self.Z[p][0][w][0] + *r * (Z_high - self.Z[p][0][w][0]); } } } // Bound the first variable of "q" section to r - pub fn bound_poly_q(&mut self, r: &Scalar) { + pub fn bound_poly_q(&mut self, r: &S) { self.max_num_proofs /= 2; for p in 0..min(self.num_instances, self.Z.len()) { if self.num_proofs[p] == 1 { for w in 0..min(self.num_witness_secs, self.Z[p][0].len()) { for x in 0..self.num_inputs[p] { - self.Z[p][0][w][x] = (ONE - r) * self.Z[p][0][w][x]; + self.Z[p][0][w][x] = (S::field_one() - *r) * self.Z[p][0][w][x]; } } } else { @@ -235,7 +236,7 @@ impl DensePolynomialPqx { for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { for x in 0..self.num_inputs[p] { self.Z[p][q][w][x] = self.Z[p][q][w][x] - + r * (self.Z[p][q + self.num_proofs[p]][w][x] - self.Z[p][q][w][x]); + + *r * (self.Z[p][q + self.num_proofs[p]][w][x] - self.Z[p][q][w][x]); } } } @@ -244,7 +245,7 @@ impl DensePolynomialPqx { } // Bound the first variable of "w" section to r - pub fn bound_poly_w(&mut self, r: &Scalar) { + pub fn bound_poly_w(&mut self, r: &S) { self.num_witness_secs /= 2; for p in 0..min(self.num_instances, self.Z.len()) { @@ -254,9 +255,9 @@ impl DensePolynomialPqx { let Z_high = if w + self.num_witness_secs < self.Z[p][q].len() { self.Z[p][q][w + self.num_witness_secs][x] } else { - ZERO + S::field_zero() }; - self.Z[p][q][w][x] = self.Z[p][q][w][x] + r * (Z_high - self.Z[p][q][w][x]); + self.Z[p][q][w][x] = self.Z[p][q][w][x] + *r * (Z_high - self.Z[p][q][w][x]); } } } @@ -264,14 +265,14 @@ impl DensePolynomialPqx { } // Bound the first variable of "x" section to r - pub fn bound_poly_x(&mut self, r: &Scalar) { + pub fn bound_poly_x(&mut self, r: &S) { self.max_num_inputs /= 2; for p in 0..min(self.num_instances, self.Z.len()) { if self.num_inputs[p] == 1 { for q in 0..self.num_proofs[p] { for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { - self.Z[p][q][w][0] = (ONE - r) * self.Z[p][q][w][0]; + self.Z[p][q][w][0] = (S::field_one() - *r) * self.Z[p][q][w][0]; } } } else { @@ -280,7 +281,7 @@ impl DensePolynomialPqx { for w in 0..min(self.num_witness_secs, self.Z[p][q].len()) { for x in 0..self.num_inputs[p] { self.Z[p][q][w][x] = self.Z[p][q][w][x] - + r * (self.Z[p][q][w][x + self.num_inputs[p]] - self.Z[p][q][w][x]); + + *r * (self.Z[p][q][w][x + self.num_inputs[p]] - self.Z[p][q][w][x]); } } } @@ -290,40 +291,34 @@ impl DensePolynomialPqx { // Bound the entire "p" section to r_p // Must occur after r_q's are bounded - pub fn bound_poly_vars_rp(&mut self, r_p: &Vec) { + pub fn bound_poly_vars_rp(&mut self, r_p: &Vec) { for r in r_p { self.bound_poly_p(r); } } // Bound the entire "q_rev" section to r_q - pub fn bound_poly_vars_rq(&mut self, r_q: &Vec) { + pub fn bound_poly_vars_rq(&mut self, r_q: &Vec) { for r in r_q { self.bound_poly_q(r); } } // Bound the entire "w" section to r_w - pub fn bound_poly_vars_rw(&mut self, r_w: &Vec) { + pub fn bound_poly_vars_rw(&mut self, r_w: &Vec) { for r in r_w { self.bound_poly_w(r); } } // Bound the entire "x_rev" section to r_x - pub fn bound_poly_vars_rx(&mut self, r_x: &Vec) { + pub fn bound_poly_vars_rx(&mut self, r_x: &Vec) { for r in r_x { self.bound_poly_x(r); } } - pub fn evaluate( - &self, - r_p: &Vec, - r_q: &Vec, - r_w: &Vec, - r_x: &Vec, - ) -> Scalar { + pub fn evaluate(&self, r_p: &Vec, r_q: &Vec, r_w: &Vec, r_x: &Vec) -> S { let mut cl = self.clone(); cl.bound_poly_vars_rx(r_x); cl.bound_poly_vars_rw(r_w); @@ -333,10 +328,10 @@ impl DensePolynomialPqx { } // Convert to a (p, q_rev, x_rev) regular dense poly of form (p, q, x) - pub fn to_dense_poly(&self) -> DensePolynomial { + pub fn to_dense_poly(&self) -> DensePolynomial { let mut Z_poly = vec![ - ZERO; + S::field_zero(); self.num_instances * self.max_num_proofs * self.num_witness_secs * self.max_num_inputs ]; for p in 0..min(self.num_instances, self.Z.len()) { diff --git a/spartan_parallel/src/dense_mlpoly.rs b/spartan_parallel/src/dense_mlpoly.rs index 8606c199..78a0886f 100644 --- a/spartan_parallel/src/dense_mlpoly.rs +++ b/spartan_parallel/src/dense_mlpoly.rs @@ -1,14 +1,11 @@ #![allow(clippy::too_many_arguments)] -use super::commitments::{Commitments, MultiCommitGens}; +use crate::scalar::SpartanExtensionField; + use super::errors::ProofVerifyError; -use super::group::{CompressedGroup, GroupElement, VartimeMultiscalarMul}; use super::math::Math; -use super::nizk::{DotProductProofGens, DotProductProofLog}; use super::random::RandomTape; -use super::scalar::Scalar; -use super::transcript::{AppendToTranscript, ProofTranscript}; +use super::transcript::ProofTranscript; use core::ops::Index; -use curve25519_dalek::ristretto::RistrettoPoint; use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::collections::HashMap; @@ -17,66 +14,32 @@ use std::collections::HashMap; use rayon::prelude::*; #[derive(Debug, Clone)] -pub struct DensePolynomial { +pub struct DensePolynomial { num_vars: usize, // the number of variables in the multilinear polynomial len: usize, - Z: Vec, // evaluations of the polynomial in all the 2^num_vars Boolean inputs -} - -#[derive(Clone, Serialize)] -pub struct PolyCommitmentGens { - pub gens: DotProductProofGens, -} - -impl PolyCommitmentGens { - // the number of variables in the multilinear polynomial - pub fn new(num_vars: usize, label: &'static [u8]) -> PolyCommitmentGens { - let (_left, right) = EqPolynomial::compute_factored_lens(num_vars); - let gens = DotProductProofGens::new(right.pow2(), label); - PolyCommitmentGens { gens } - } + Z: Vec, // evaluations of the polynomial in all the 2^num_vars Boolean inputs } -pub struct PolyCommitmentBlinds { - pub(crate) blinds: Vec, -} - -#[derive(Debug, Serialize, Deserialize, Clone)] -pub struct PolyCommitment { - pub(crate) C: Vec, -} - -impl PolyCommitment { - pub fn empty() -> Self { - PolyCommitment { C: Vec::new() } - } +pub struct EqPolynomial { + r: Vec, } -#[derive(Debug, Serialize, Deserialize)] -pub struct ConstPolyCommitment { - C: CompressedGroup, -} - -pub struct EqPolynomial { - r: Vec, -} - -impl EqPolynomial { - pub fn new(r: Vec) -> Self { +impl EqPolynomial { + pub fn new(r: Vec) -> Self { EqPolynomial { r } } - pub fn evaluate(&self, rx: &[Scalar]) -> Scalar { + pub fn evaluate(&self, rx: &[S]) -> S { assert_eq!(self.r.len(), rx.len()); (0..rx.len()) - .map(|i| self.r[i] * rx[i] + (Scalar::one() - self.r[i]) * (Scalar::one() - rx[i])) + .map(|i| self.r[i] * rx[i] + (S::field_one() - self.r[i]) * (S::field_one() - rx[i])) .product() } - pub fn evals(&self) -> Vec { + pub fn evals(&self) -> Vec { let ell = self.r.len(); - let mut evals: Vec = vec![Scalar::one(); ell.pow2()]; + let mut evals: Vec = vec![S::field_one(); ell.pow2()]; let mut size = 1; for j in 0..ell { // in each iteration, we double the size of chis @@ -92,10 +55,10 @@ impl EqPolynomial { } // Only bound Eq on the first self.r.len() of the total_len variables - pub fn evals_front(&self, total_len: usize) -> Vec { + pub fn evals_front(&self, total_len: usize) -> Vec { let ell = self.r.len(); - let mut evals: Vec = vec![Scalar::one(); total_len.pow2()]; + let mut evals: Vec = vec![S::field_one(); total_len.pow2()]; let base_size = (total_len - ell).pow2(); let mut size = base_size; for j in 0..ell { @@ -119,9 +82,9 @@ impl EqPolynomial { (ell / 2, ell - ell / 2) } - pub fn compute_factored_evals(&self) -> (Vec, Vec) { + pub fn compute_factored_evals(&self) -> (Vec, Vec) { let ell = self.r.len(); - let (left_num_vars, _right_num_vars) = EqPolynomial::compute_factored_lens(ell); + let (left_num_vars, _right_num_vars) = EqPolynomial::::compute_factored_lens(ell); let L = EqPolynomial::new(self.r[..left_num_vars].to_vec()).evals(); let R = EqPolynomial::new(self.r[left_num_vars..ell].to_vec()).evals(); @@ -129,29 +92,32 @@ impl EqPolynomial { (L, R) } } - -pub struct IdentityPolynomial { +pub struct IdentityPolynomial { size_point: usize, + _phantom: S, } -impl IdentityPolynomial { +impl IdentityPolynomial { pub fn new(size_point: usize) -> Self { - IdentityPolynomial { size_point } + IdentityPolynomial { + size_point, + _phantom: S::field_zero(), + } } - pub fn evaluate(&self, r: &[Scalar]) -> Scalar { + pub fn evaluate(&self, r: &[S]) -> S { let len = r.len(); assert_eq!(len, self.size_point); (0..len) - .map(|i| Scalar::from((len - i - 1).pow2() as u64) * r[i]) + .map(|i| S::from((len - i - 1).pow2() as u64) * r[i]) .sum() } } -impl DensePolynomial { - pub fn new(mut Z: Vec) -> Self { +impl DensePolynomial { + pub fn new(mut Z: Vec) -> Self { // If length of Z is not a power of 2, append Z with 0 - let zero = Scalar::zero(); + let zero = S::field_zero(); Z.extend(vec![zero; Z.len().next_power_of_two() - Z.len()]); DensePolynomial { num_vars: Z.len().log_2(), @@ -168,11 +134,11 @@ impl DensePolynomial { self.len } - pub fn clone(&self) -> DensePolynomial { + pub fn clone(&self) -> DensePolynomial { DensePolynomial::new(self.Z[0..self.len].to_vec()) } - pub fn split(&self, idx: usize) -> (DensePolynomial, DensePolynomial) { + pub fn split(&self, idx: usize) -> (DensePolynomial, DensePolynomial) { assert!(idx < self.len()); ( DensePolynomial::new(self.Z[..idx].to_vec()), @@ -180,83 +146,9 @@ impl DensePolynomial { ) } - #[cfg(feature = "multicore")] - fn commit_inner(&self, blinds: &[Scalar], gens: &MultiCommitGens) -> PolyCommitment { - let L_size = blinds.len(); - let R_size = self.Z.len() / L_size; - assert_eq!(L_size * R_size, self.Z.len()); - let C = (0..L_size) - .into_par_iter() - .map(|i| { - self.Z[R_size * i..R_size * (i + 1)] - .commit(&blinds[i], gens) - .compress() - }) - .collect(); - PolyCommitment { C } - } - - #[cfg(not(feature = "multicore"))] - fn commit_inner(&self, blinds: &[Scalar], gens: &MultiCommitGens) -> PolyCommitment { - let L_size = blinds.len(); - let R_size = self.Z.len() / L_size; - assert_eq!(L_size * R_size, self.Z.len()); - let C = (0..L_size) - .map(|i| { - self.Z[R_size * i..R_size * (i + 1)] - .commit(&blinds[i], gens) - .compress() - }) - .collect(); - PolyCommitment { C } - } - - pub fn commit( - &self, - gens: &PolyCommitmentGens, - random_tape: Option<&mut RandomTape>, - ) -> (PolyCommitment, PolyCommitmentBlinds) { - let n = self.Z.len(); - let ell = self.get_num_vars(); - assert_eq!(n, ell.pow2()); - - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(ell); - let L_size = left_num_vars.pow2(); - let R_size = right_num_vars.pow2(); - assert_eq!(L_size * R_size, n); - - let blinds = if let Some(t) = random_tape { - PolyCommitmentBlinds { - blinds: t.random_vector(b"poly_blinds", L_size), - } - } else { - PolyCommitmentBlinds { - blinds: vec![Scalar::zero(); L_size], - } - }; - - (self.commit_inner(&blinds.blinds, &gens.gens.gens_n), blinds) - } - - pub fn commit_with_blind( - &self, - gens: &PolyCommitmentGens, - blinds: &PolyCommitmentBlinds, - ) -> PolyCommitment { - let n = self.Z.len(); - let ell = self.get_num_vars(); - assert_eq!(n, ell.pow2()); - - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(ell); - let L_size = left_num_vars.pow2(); - let R_size = right_num_vars.pow2(); - assert_eq!(L_size * R_size, n); - - self.commit_inner(&blinds.blinds, &gens.gens.gens_n) - } - - pub fn bound(&self, L: &[Scalar]) -> Vec { - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(self.get_num_vars()); + pub fn bound(&self, L: &[S]) -> Vec { + let (left_num_vars, right_num_vars) = + EqPolynomial::::compute_factored_lens(self.get_num_vars()); let L_size = left_num_vars.pow2(); let R_size = right_num_vars.pow2(); (0..R_size) @@ -264,10 +156,10 @@ impl DensePolynomial { .collect() } - pub fn bound_poly_var_top(&mut self, r: &Scalar) { + pub fn bound_poly_var_top(&mut self, r: &S) { let n = self.len() / 2; for i in 0..n { - self.Z[i] = self.Z[i] + r * (self.Z[i + n] - self.Z[i]); + self.Z[i] = self.Z[i] + *r * (self.Z[i + n] - self.Z[i]); } self.num_vars -= 1; self.len = n; @@ -276,7 +168,7 @@ impl DensePolynomial { // Bound_var_top but the polynomial is in (x, q, p) form and certain (p, q) pair is invalid pub fn bound_poly_var_top_disjoint_rounds( &mut self, - r: &Scalar, + r: &S, proof_space: usize, instance_space: usize, cons_len: usize, @@ -297,7 +189,7 @@ impl DensePolynomial { for q in 0..max_q { for x in 0..cons_len { let i = x * proof_space * instance_space + q * instance_space + p; - self.Z[i] = self.Z[i] + r * (self.Z[i + n] - self.Z[i]); + self.Z[i] = self.Z[i] + *r * (self.Z[i + n] - self.Z[i]); } } } @@ -310,7 +202,7 @@ impl DensePolynomial { // Use "num_proofs" to record how many "q"s need to process for each "p" pub fn bound_poly_var_front_rq( &mut self, - r_q: &Vec, + r_q: &Vec, mut max_proof_space: usize, instance_space: usize, cons_space: usize, @@ -328,7 +220,7 @@ impl DensePolynomial { // q = 0 for x in 0..cons_space { let i = p * cons_space + x; - self.Z[i] = (Scalar::one() - r) * self.Z[i]; + self.Z[i] = (S::field_one() - *r) * self.Z[i]; } } else { num_proofs[p] /= 2; @@ -336,7 +228,7 @@ impl DensePolynomial { for q in (0..max_proof_space).step_by(step) { for x in 0..cons_space { let i = q * instance_space * cons_space + p * cons_space + x; - self.Z[i] = self.Z[i] + r * (self.Z[i + n] - self.Z[i]); + self.Z[i] = self.Z[i] + *r * (self.Z[i + n] - self.Z[i]); } } } @@ -346,29 +238,34 @@ impl DensePolynomial { } } - pub fn bound_poly_var_bot(&mut self, r: &Scalar) { + pub fn bound_poly_var_bot(&mut self, r: &S) { let n = self.len() / 2; for i in 0..n { - self.Z[i] = self.Z[2 * i] + r * (self.Z[2 * i + 1] - self.Z[2 * i]); + self.Z[i] = self.Z[2 * i] + *r * (self.Z[2 * i + 1] - self.Z[2 * i]); } self.num_vars -= 1; self.len = n; } // returns Z(r) in O(n) time - pub fn evaluate(&self, r: &[Scalar]) -> Scalar { + pub fn evaluate(&self, r: &[S]) -> S { // r must have a value for each variable assert_eq!(r.len(), self.get_num_vars()); let chis = EqPolynomial::new(r.to_vec()).evals(); assert_eq!(chis.len(), self.Z.len()); - DotProductProofLog::compute_dotproduct(&self.Z, &chis) + Self::compute_dotproduct(&self.Z, &chis) } - fn vec(&self) -> &Vec { + fn compute_dotproduct(a: &[S], b: &[S]) -> S { + assert_eq!(a.len(), b.len()); + (0..a.len()).map(|i| a[i] * b[i]).sum() + } + + fn vec(&self) -> &Vec { &self.Z } - pub fn extend(&mut self, other: &DensePolynomial) { + pub fn extend(&mut self, other: &DensePolynomial) { // TODO: allow extension even when some vars are bound assert_eq!(self.Z.len(), self.len); let other_vec = other.vec(); @@ -379,17 +276,17 @@ impl DensePolynomial { assert_eq!(self.Z.len(), self.len); } - pub fn merge<'a, I>(polys: I) -> DensePolynomial + pub fn merge<'a, I>(polys: I) -> DensePolynomial where - I: IntoIterator, + I: IntoIterator>, { - let mut Z: Vec = Vec::new(); + let mut Z: Vec = Vec::new(); for poly in polys.into_iter() { Z.extend(poly.vec()); } // pad the polynomial with zero polynomial at the end - Z.resize(Z.len().next_power_of_two(), Scalar::zero()); + Z.resize(Z.len().next_power_of_two(), S::field_zero()); DensePolynomial::new(Z) } @@ -397,814 +294,165 @@ impl DensePolynomial { pub fn from_usize(Z: &[usize]) -> Self { DensePolynomial::new( (0..Z.len()) - .map(|i| Scalar::from(Z[i] as u64)) - .collect::>(), + .map(|i| S::from(Z[i] as u64)) + .collect::>(), ) } } -impl Index for DensePolynomial { - type Output = Scalar; +impl Index for DensePolynomial { + type Output = S; #[inline(always)] - fn index(&self, _index: usize) -> &Scalar { + fn index(&self, _index: usize) -> &S { &(self.Z[_index]) } } -impl AppendToTranscript for PolyCommitment { - fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { - transcript.append_message(label, b"poly_commitment_begin"); - for i in 0..self.C.len() { - transcript.append_point(b"poly_commitment_share", &self.C[i]); - } - transcript.append_message(label, b"poly_commitment_end"); - } -} - #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct PolyEvalProof { - proof: DotProductProofLog, +pub struct PolyEvalProof { + _phantom: S, } -impl PolyEvalProof { +impl PolyEvalProof { fn protocol_name() -> &'static [u8] { b"polynomial evaluation proof" } pub fn prove( - poly: &DensePolynomial, - blinds_opt: Option<&PolyCommitmentBlinds>, - r: &[Scalar], // point at which the polynomial is evaluated - Zr: &Scalar, // evaluation of \widetilde{Z}(r) - blind_Zr_opt: Option<&Scalar>, // specifies a blind for Zr - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (PolyEvalProof, CompressedGroup) { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - // assert vectors are of the right size - assert_eq!(poly.get_num_vars(), r.len()); - - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(r.len()); - let L_size = left_num_vars.pow2(); - let R_size = right_num_vars.pow2(); - - let default_blinds = PolyCommitmentBlinds { - blinds: vec![Scalar::zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - - assert_eq!(blinds.blinds.len(), L_size); - - let zero = Scalar::zero(); - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - - // compute the L and R vectors - let eq = EqPolynomial::new(r.to_vec()); - let (L, R) = eq.compute_factored_evals(); - assert_eq!(L.len(), L_size); - assert_eq!(R.len(), R_size); - - // compute the vector underneath L*Z and the L*blinds - // compute vector-matrix product between L and Z viewed as a matrix - let LZ = poly.bound(&L); - let LZ_blind: Scalar = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let (proof, _C_LR, C_Zr_prime) = DotProductProofLog::prove( - &gens.gens, - transcript, - random_tape, - &LZ, - &LZ_blind, - &R, - Zr, - blind_Zr, - ); - - (PolyEvalProof { proof }, C_Zr_prime) + _poly: &DensePolynomial, + _r: &[S], // point at which the polynomial is evaluated + _Zr: &S, // evaluation of \widetilde{Z}(r) + _transcript: &mut Transcript, + _random_tape: &mut RandomTape, + ) -> PolyEvalProof { + // TODO: Alternative evaluation proof scheme + PolyEvalProof { + _phantom: S::field_zero(), + } } pub fn verify( &self, - gens: &PolyCommitmentGens, transcript: &mut Transcript, - r: &[Scalar], // point at which the polynomial is evaluated - C_Zr: &CompressedGroup, // commitment to \widetilde{Z}(r) - comm: &PolyCommitment, + r: &[S], // point at which the polynomial is evaluated ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - // compute L and R - let eq = EqPolynomial::new(r.to_vec()); - let (L, R) = eq.compute_factored_evals(); - - // compute a weighted sum of commitments and L - let C_decompressed = comm.C.iter().map(|pt| pt.decompress().unwrap()); - - let C_LZ = GroupElement::vartime_multiscalar_mul(&L, C_decompressed).compress(); - - self - .proof - .verify(R.len(), &gens.gens, transcript, &R, &C_LZ, C_Zr) + // TODO: Alternative evaluation proof scheme + Ok(()) } pub fn verify_plain( &self, - gens: &PolyCommitmentGens, transcript: &mut Transcript, - r: &[Scalar], // point at which the polynomial is evaluated - Zr: &Scalar, // evaluation \widetilde{Z}(r) - comm: &PolyCommitment, + r: &[S], // point at which the polynomial is evaluated + _Zr: &S, // evaluation \widetilde{Z}(r) ) -> Result<(), ProofVerifyError> { - // compute a commitment to Zr with a blind of zero - let C_Zr = Zr.commit(&Scalar::zero(), &gens.gens.gens_1).compress(); - - self.verify(gens, transcript, r, &C_Zr, comm) + self.verify(transcript, r) } // Evaluation of multiple points on the same instance pub fn prove_batched_points( - poly: &DensePolynomial, - blinds_opt: Option<&PolyCommitmentBlinds>, - r_list: Vec>, // point at which the polynomial is evaluated - Zr_list: Vec, // evaluation of \widetilde{Z}(r) on each point - blind_Zr_opt: Option<&Scalar>, // specifies a blind for Zr - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> Vec { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - // assert vectors are of the right size - assert_eq!(r_list.len(), Zr_list.len()); - for r in &r_list { - assert_eq!(poly.get_num_vars(), r.len()); - } - - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(r_list[0].len()); - let L_size = left_num_vars.pow2(); - let R_size = right_num_vars.pow2(); - - let default_blinds = PolyCommitmentBlinds { - blinds: vec![Scalar::zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - - assert_eq!(blinds.blinds.len(), L_size); - - let zero = Scalar::zero(); - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - - // compute the L and R vectors - // We can perform batched opening if L is the same, so we regroup the proofs by L vector - // Map from the left half of the r to index in L_list - let mut index_map: HashMap, usize> = HashMap::new(); - let mut L_list: Vec> = Vec::new(); - let mut R_list: Vec> = Vec::new(); - let mut Zc_list: Vec = Vec::new(); - - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - for i in 0..r_list.len() { - let eq = EqPolynomial::new(r_list[i].to_vec()); - let (Li, Ri) = eq.compute_factored_evals(); - assert_eq!(Li.len(), L_size); - assert_eq!(Ri.len(), R_size); - if let Some(index) = index_map.get(&r_list[i][..left_num_vars]) { - // L already exist - // generate coefficient for RLC - c *= c_base; - R_list[*index] = (0..R_size).map(|j| R_list[*index][j] + c * Ri[j]).collect(); - Zc_list[*index] += c * Zr_list[i]; - } else { - let next_index = L_list.len(); - index_map.insert(r_list[i][..left_num_vars].to_vec(), next_index); - L_list.push(Li); - R_list.push(Ri); - Zc_list.push(Zr_list[i]); - } - } - - let mut proof_list = Vec::new(); - for i in 0..L_list.len() { - let L = &L_list[i]; - let R = &R_list[i]; - // compute the vector underneath L*Z and the L*blinds - // compute vector-matrix product between L and Z viewed as a matrix - let LZ = poly.bound(L); - let LZ_blind: Scalar = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let (proof, _C_LR, _C_Zr_prime) = DotProductProofLog::prove( - &gens.gens, - transcript, - random_tape, - &LZ, - &LZ_blind, - R, - &Zc_list[i], - blind_Zr, - ); - proof_list.push(proof); - } - - proof_list - .iter() - .map(|proof| PolyEvalProof { - proof: proof.clone(), - }) - .collect() + _poly: &DensePolynomial, + _r_list: Vec>, // point at which the polynomial is evaluated + _Zr_list: Vec, // evaluation of \widetilde{Z}(r) on each point + _transcript: &mut Transcript, + _random_tape: &mut RandomTape, + ) -> Vec> { + // TODO: Alternative evaluation proof scheme + vec![] } pub fn verify_plain_batched_points( - proof_list: &Vec, - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - r_list: Vec>, // point at which the polynomial is evaluated - Zr_list: Vec, // commitment to \widetilde{Z}(r) on each point - comm: &PolyCommitment, + _proof_list: &Vec>, + _transcript: &mut Transcript, + _r_list: Vec>, // point at which the polynomial is evaluated + _Zr_list: Vec, // commitment to \widetilde{Z}(r) on each point ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - let (left_num_vars, _) = EqPolynomial::compute_factored_lens(r_list[0].len()); - - // compute the L and R - // We can perform batched opening if L is the same, so we regroup the proofs by L vector - // Map from the left half of the r to index in L_list - let mut index_map: HashMap, usize> = HashMap::new(); - let mut L_list: Vec> = Vec::new(); - let mut R_list: Vec> = Vec::new(); - let mut Zc_list: Vec = Vec::new(); - - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - for i in 0..r_list.len() { - let eq = EqPolynomial::new(r_list[i].to_vec()); - let (Li, Ri) = eq.compute_factored_evals(); - if let Some(index) = index_map.get(&r_list[i][..left_num_vars]) { - // L already exist - // generate coefficient for RLC - c *= c_base; - R_list[*index] = (0..Ri.len()) - .map(|j| R_list[*index][j] + c * Ri[j]) - .collect(); - Zc_list[*index] += c * Zr_list[i]; - } else { - let next_index = L_list.len(); - index_map.insert(r_list[i][..left_num_vars].to_vec(), next_index); - L_list.push(Li); - R_list.push(Ri); - Zc_list.push(Zr_list[i]); - } - } - assert_eq!(L_list.len(), proof_list.len()); - - for i in 0..L_list.len() { - let C_Zc = Zc_list[i] - .commit(&Scalar::zero(), &gens.gens.gens_1) - .compress(); - let L = &L_list[i]; - let R = &R_list[i]; - - // compute a weighted sum of commitments and L - let C_decompressed = comm.C.iter().map(|pt| pt.decompress().unwrap()); - - let C_LZ = GroupElement::vartime_multiscalar_mul(L, C_decompressed).compress(); - - proof_list[i] - .proof - .verify(R.len(), &gens.gens, transcript, R, &C_LZ, &C_Zc)? - } - + // TODO: Alternative evaluation proof scheme Ok(()) } // Evaluation on multiple instances, each at different point // Size of each instance might be different, but all are larger than the evaluation point pub fn prove_batched_instances( - poly_list: &Vec, // list of instances - blinds_opt: Option<&PolyCommitmentBlinds>, - r_list: Vec<&Vec>, // point at which the polynomial is evaluated - Zr_list: &Vec, // evaluation of \widetilde{Z}(r) on each instance - blind_Zr_opt: Option<&Scalar>, // specifies a blind for Zr - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> Vec { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - // assert vectors are of the right size - assert_eq!(poly_list.len(), r_list.len()); - assert_eq!(poly_list.len(), Zr_list.len()); - - // We need one proof per poly size & R - let mut index_map: HashMap<(usize, Vec), usize> = HashMap::new(); - let mut LZ_list: Vec> = Vec::new(); - let mut Zc_list = Vec::new(); - let mut L_list: Vec> = Vec::new(); - let mut R_list: Vec> = Vec::new(); - - // generate coefficient for RLC - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - let zero = Scalar::zero(); - for i in 0..poly_list.len() { - let poly = &poly_list[i]; - let num_vars = poly.get_num_vars(); - - // compute L and R - let (L, R) = { - let r = r_list[i]; - // pad or trim r to correct length - let r = { - if num_vars >= r.len() { - [vec![zero; num_vars - r.len()], r.to_vec()].concat() - } else { - r[r.len() - num_vars..].to_vec() - } - }; - let eq = EqPolynomial::new(r); - eq.compute_factored_evals() - }; - - if let Some(index) = index_map.get(&(num_vars, R.clone())) { - c *= c_base; - let LZ = poly.bound(&L); - LZ_list[*index] = (0..LZ.len()) - .map(|j| LZ_list[*index][j] + c * LZ[j]) - .collect(); - Zc_list[*index] += c * Zr_list[i]; - } else { - index_map.insert((num_vars, R.clone()), LZ_list.len()); - Zc_list.push(Zr_list[i]); - // compute a weighted sum of commitments and L - let LZ = poly.bound(&L); - L_list.push(L); - R_list.push(R); - LZ_list.push(LZ); - } - } - - let mut proof_list = Vec::new(); - for i in 0..LZ_list.len() { - let L = &L_list[i]; - let L_size = L.len(); - - let default_blinds = PolyCommitmentBlinds { - blinds: vec![Scalar::zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - assert_eq!(blinds.blinds.len(), L_size); - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - let LZ_blind: Scalar = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let (proof, _C_LR, _C_Zr_prime) = DotProductProofLog::prove( - &gens.gens, - transcript, - random_tape, - &LZ_list[i], - &LZ_blind, - &R_list[i], - &Zc_list[i], - blind_Zr, - ); - proof_list.push(PolyEvalProof { proof }); - } - - proof_list + _poly_list: &Vec>, // list of instances + _r_list: Vec<&Vec>, // point at which the polynomial is evaluated + _Zr_list: &Vec, // evaluation of \widetilde{Z}(r) on each instance + _transcript: &mut Transcript, + _random_tape: &mut RandomTape, + ) -> Vec> { + // TODO: Alternative evaluation proof scheme + vec![] } pub fn verify_plain_batched_instances( - proof_list: &Vec, - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - r_list: Vec<&Vec>, // point at which the polynomial is evaluated - Zr_list: &Vec, // commitment to \widetilde{Z}(r) of each instance - comm_list: &Vec, // commitment of each instance - num_vars_list: &Vec, // size of each polynomial + _proof_list: &Vec>, + _transcript: &mut Transcript, + _r_list: Vec<&Vec>, // point at which the polynomial is evaluated + _Zr_list: &Vec, // commitment to \widetilde{Z}(r) of each instance + _num_vars_list: &Vec, // size of each polynomial ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - assert_eq!(comm_list.len(), r_list.len()); - - // We need one proof per poly size + L size - let mut index_map: HashMap<(usize, Vec), usize> = HashMap::new(); - let mut LZ_list: Vec = Vec::new(); - let mut Zc_list = Vec::new(); - let mut L_list: Vec> = Vec::new(); - let mut R_list: Vec> = Vec::new(); - - // generate coefficient for RLC - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - let zero = Scalar::zero(); - for i in 0..comm_list.len() { - let C_decompressed: Vec = comm_list[i] - .C - .iter() - .map(|pt| pt.decompress().unwrap()) - .collect(); - let num_vars = num_vars_list[i]; - - // compute L and R - let (L, R) = { - let r = r_list[i]; - // pad or trim r to correct length - let r = { - if num_vars >= r.len() { - [vec![zero; num_vars - r.len()], r.to_vec()].concat() - } else { - r[r.len() - num_vars..].to_vec() - } - }; - let eq = EqPolynomial::new(r); - eq.compute_factored_evals() - }; - - if let Some(index) = index_map.get(&(num_vars, R.clone())) { - c *= c_base; - let LZ = GroupElement::vartime_multiscalar_mul(L, &C_decompressed); - LZ_list[*index] += c * LZ; - Zc_list[*index] += c * Zr_list[i]; - } else { - index_map.insert((num_vars, R.clone()), LZ_list.len()); - Zc_list.push(Zr_list[i]); - // compute a weighted sum of commitments and L - let LZ = GroupElement::vartime_multiscalar_mul(&L, &C_decompressed); - L_list.push(L); - R_list.push(R); - LZ_list.push(LZ); - } - } - assert_eq!(LZ_list.len(), proof_list.len()); - - // Verify proofs - for i in 0..LZ_list.len() { - let R = &R_list[i]; - let C_LZ = LZ_list[i].compress(); - let C_Zc = Zc_list[i] - .commit(&Scalar::zero(), &gens.gens.gens_1) - .compress(); - proof_list[i] - .proof - .verify(R.len(), &gens.gens, transcript, R, &C_LZ, &C_Zc)?; - } + // TODO: Alternative evaluation proof scheme Ok(()) } // Like prove_batched_instances, but r is divided into rq ++ ry // Each polynomial is supplemented with num_proofs and num_inputs pub fn prove_batched_instances_disjoint_rounds( - poly_list: &Vec<&DensePolynomial>, - num_proofs_list: &Vec, - num_inputs_list: &Vec, - blinds_opt: Option<&PolyCommitmentBlinds>, - rq: &[Scalar], - ry: &[Scalar], - Zr_list: &Vec, - blind_Zr_opt: Option<&Scalar>, - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> Vec { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - // assert vectors are of the right size - assert_eq!(poly_list.len(), Zr_list.len()); - - // We need one proof per (num_proofs, num_inputs) pair - let mut index_map: HashMap<(usize, usize), usize> = HashMap::new(); - let mut LZ_list: Vec> = Vec::new(); - let mut Zc_list = Vec::new(); - let mut L_list: Vec> = Vec::new(); - let mut R_list = Vec::new(); - - // generate coefficient for RLC - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - let zero = Scalar::zero(); - for i in 0..poly_list.len() { - let poly = poly_list[i]; - let num_proofs = num_proofs_list[i]; - let num_inputs = num_inputs_list[i]; - if let Some(index) = index_map.get(&(num_proofs, num_inputs)) { - c *= c_base; - let L = &L_list[*index].to_vec(); - let LZ = poly.bound(L); - LZ_list[*index] = (0..LZ.len()) - .map(|j| LZ_list[*index][j] + c * LZ[j]) - .collect(); - Zc_list[*index] += c * Zr_list[i]; - } else { - index_map.insert((num_proofs, num_inputs), LZ_list.len()); - Zc_list.push(Zr_list[i]); - let num_vars_q = num_proofs.log_2(); - let num_vars_y = num_inputs.log_2(); - // pad or trim rq and ry to correct length - let (L, R) = { - let ry_short = { - if num_vars_y >= ry.len() { - let ry_pad = &vec![zero; num_vars_y - ry.len()]; - [ry_pad, ry].concat() - } - // Else ry_short is the last w.num_inputs[p].log_2() entries of ry - // thus, to obtain the actual ry, need to multiply by (1 - ry2)(1 - ry3)..., which is ry_factors[num_rounds_y - w.num_inputs[p]] - else { - ry[ry.len() - num_vars_y..].to_vec() - } - }; - let rq_short = rq[rq.len() - num_vars_q..].to_vec(); - let r = [rq_short, ry_short.clone()].concat(); - let eq = EqPolynomial::new(r); - eq.compute_factored_evals() - }; - // compute a weighted sum of commitments and L - let LZ = poly.bound(&L); - L_list.push(L); - R_list.push(R); - LZ_list.push(LZ); - } - } - - let mut proof_list = Vec::new(); - for i in 0..LZ_list.len() { - let L = &L_list[i]; - let L_size = L.len(); - let default_blinds = PolyCommitmentBlinds { - blinds: vec![Scalar::zero(); L_size], - }; - let blinds = blinds_opt.map_or(&default_blinds, |p| p); - - assert_eq!(blinds.blinds.len(), L_size); - - let blind_Zr = blind_Zr_opt.map_or(&zero, |p| p); - let LZ_blind: Scalar = (0..L.len()).map(|i| blinds.blinds[i] * L[i]).sum(); - - // a dot product proof of size R_size - let (proof, _C_LR, _C_Zr_prime) = DotProductProofLog::prove( - &gens.gens, - transcript, - random_tape, - &LZ_list[i], - &LZ_blind, - &R_list[i], - &Zc_list[i], - blind_Zr, - ); - proof_list.push(PolyEvalProof { proof }); - } - proof_list + _poly_list: &Vec<&DensePolynomial>, + _num_proofs_list: &Vec, + _num_inputs_list: &Vec, + _rq: &[S], + _ry: &[S], + _Zr_list: &Vec, + _transcript: &mut Transcript, + _random_tape: &mut RandomTape, + ) -> Vec> { + // TODO: Alternative evaluation proof scheme + vec![] } pub fn verify_batched_instances_disjoint_rounds( - proof_list: &Vec, - num_proofs_list: &Vec, - num_inputs_list: &Vec, - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - rq: &[Scalar], - ry: &[Scalar], - Zr_list: &Vec, - comm_list: &Vec<&PolyCommitment>, + _proof_list: &Vec>, + _num_proofs_list: &Vec, + _num_inputs_list: &Vec, + _transcript: &mut Transcript, + _rq: &[S], + _ry: &[S], ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - // We need one proof per poly size - let mut index_map: HashMap<(usize, usize), usize> = HashMap::new(); - let mut LZ_list: Vec = Vec::new(); - let mut Zc_list = Vec::new(); - let mut L_list = Vec::new(); - let mut R_list = Vec::new(); - - // generate coefficient for RLC - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - let zero = Scalar::zero(); - for i in 0..comm_list.len() { - let C_decompressed: Vec = comm_list[i] - .C - .iter() - .map(|pt| pt.decompress().unwrap()) - .collect(); - let num_proofs = num_proofs_list[i]; - let num_inputs = num_inputs_list[i]; - if let Some(index) = index_map.get(&(num_proofs, num_inputs)) { - c *= c_base; - let L = &L_list[*index]; - let LZ = GroupElement::vartime_multiscalar_mul(L, &C_decompressed); - LZ_list[*index] += c * LZ; - Zc_list[*index] += c * Zr_list[i]; - } else { - index_map.insert((num_proofs, num_inputs), LZ_list.len()); - Zc_list.push(Zr_list[i]); - let num_vars_q = num_proofs.log_2(); - let num_vars_y = num_inputs.log_2(); - // pad or trim rq and ry to correct length - let (L, R) = { - let ry_short = { - if num_vars_y >= ry.len() { - let ry_pad = &vec![zero; num_vars_y - ry.len()]; - [ry_pad, ry].concat() - } - // Else ry_short is the last w.num_inputs[p].log_2() entries of ry - // thus, to obtain the actual ry, need to multiply by (1 - ry2)(1 - ry3)..., which is ry_factors[num_rounds_y - w.num_inputs[p]] - else { - ry[ry.len() - num_vars_y..].to_vec() - } - }; - let rq_short = rq[rq.len() - num_vars_q..].to_vec(); - let r = [rq_short, ry_short.clone()].concat(); - let eq = EqPolynomial::new(r); - eq.compute_factored_evals() - }; - // compute a weighted sum of commitments and L - let LZ = GroupElement::vartime_multiscalar_mul(&L, &C_decompressed); - L_list.push(L); - R_list.push(R); - LZ_list.push(LZ); - } - } - assert_eq!(LZ_list.len(), proof_list.len()); - - // Verify proofs - for i in 0..LZ_list.len() { - let R = &R_list[i]; - let C_LZ = LZ_list[i].compress(); - let C_Zc = Zc_list[i].compress(); - proof_list[i] - .proof - .verify(R.len(), &gens.gens, transcript, R, &C_LZ, &C_Zc)?; - } - + // TODO: Alternative evaluation proof scheme Ok(()) } // Treat the polynomial(s) as univariate and open on a single point pub fn prove_uni_batched_instances( - poly_list: &Vec<&DensePolynomial>, - r: &Scalar, // point at which the polynomial is evaluated - Zr: &Vec, // evaluation of \widetilde{Z}(r) - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (PolyEvalProof, CompressedGroup) { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - let max_num_vars = poly_list.iter().fold(0, |m, p| { - if p.get_num_vars() > m { - p.get_num_vars() - } else { - m - } - }); - let zero = Scalar::zero(); - - // L differs depending on size of the polynomial, but R always stay the same - let (_, right_num_vars) = EqPolynomial::compute_factored_lens(max_num_vars); - let R_size = right_num_vars.pow2(); - - // compute R = <1, r, r^2, ...> - let R = { - let mut r_base = Scalar::one(); - let mut R = Vec::new(); - for _ in 0..R_size { - R.push(r_base); - r_base *= r; - } - R - }; - let mut L_map: HashMap> = HashMap::new(); - - // compute the vector underneath L*Z - // compute vector-matrix product between L and Z viewed as a matrix - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - let mut LZ_comb = vec![zero; R_size]; - let mut Zr_comb = zero; - - for i in 0..poly_list.len() { - let poly = &poly_list[i]; - let num_vars = poly.get_num_vars(); - let L = if let Some(L) = L_map.get(&num_vars) { - L - } else { - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(num_vars); - let L_size = left_num_vars.pow2(); - let R_size = right_num_vars.pow2(); - let r_base = (0..R_size).fold(Scalar::one(), |p, _| p * r); - // L is 1, r^k, r^2k, ... - let mut l_base = Scalar::one(); - let mut L = Vec::new(); - for _ in 0..L_size { - L.push(l_base); - l_base *= r_base; - } - L_map.insert(num_vars, L.clone()); - L_map.get(&num_vars).unwrap() - }; - - let LZ = poly.bound(L); - LZ_comb = (0..R_size) - .map(|i| LZ_comb[i] + if i < LZ.len() { c * LZ[i] } else { zero }) - .collect(); - Zr_comb += c * Zr[i]; - c *= c_base; + _poly_list: &Vec<&DensePolynomial>, + _r: &S, // point at which the polynomial is evaluated + _Zr: &Vec, // evaluation of \widetilde{Z}(r) + _transcript: &mut Transcript, + _random_tape: &mut RandomTape, + ) -> PolyEvalProof { + // TODO: Alternative evaluation proof scheme + PolyEvalProof { + _phantom: S::field_zero(), } - - // a dot product proof of size R_size - let (proof, _C_LR, C_Zr_prime) = DotProductProofLog::prove( - &gens.gens, - transcript, - random_tape, - &LZ_comb, - &zero, - &R, - &Zr_comb, - &zero, - ); - - (PolyEvalProof { proof }, C_Zr_prime) } pub fn verify_uni_batched_instances( &self, - gens: &PolyCommitmentGens, - transcript: &mut Transcript, - r: &Scalar, // point at which the polynomial is evaluated - C_Zr: &Vec, // commitment to \widetilde{Z}(r) - comm_list: &Vec<&PolyCommitment>, - poly_size: Vec, + _transcript: &mut Transcript, + _r: &S, // point at which the polynomial is evaluated + _poly_size: Vec, ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(PolyEvalProof::protocol_name()); - - let max_poly_size = poly_size.iter().fold(0, |m, i| if *i > m { *i } else { m }); - // compute L and R - let (_, right_num_vars) = - EqPolynomial::compute_factored_lens(max_poly_size.next_power_of_two().log_2()); - let R_size = right_num_vars.pow2(); - - // compute R = <1, r, r^2, ...> - let R = { - let mut r_base = Scalar::one(); - let mut R = Vec::new(); - for _ in 0..R_size { - R.push(r_base); - r_base *= r; - } - R - }; - let mut L_map: HashMap> = HashMap::new(); - - // compute a weighted sum of commitments and L - let c_base = transcript.challenge_scalar(b"challenge_c"); - let mut c = Scalar::one(); - let mut C_LZ_comb = Scalar::zero().commit(&Scalar::zero(), &gens.gens.gens_1); - let mut C_Zr_comb = Scalar::zero().commit(&Scalar::zero(), &gens.gens.gens_1); - - for i in 0..comm_list.len() { - let comm = comm_list[i]; - let num_vars = poly_size[i].next_power_of_two().log_2(); - let L = if let Some(L) = L_map.get(&num_vars) { - L - } else { - let (left_num_vars, right_num_vars) = EqPolynomial::compute_factored_lens(num_vars); - let L_size = left_num_vars.pow2(); - let R_size = right_num_vars.pow2(); - let r_base = (0..R_size).fold(Scalar::one(), |p, _| p * r); - // L is 1, r^k, r^2k, ... - let mut l_base = Scalar::one(); - let mut L = Vec::new(); - for _ in 0..L_size { - L.push(l_base); - l_base *= r_base; - } - L_map.insert(num_vars, L.clone()); - L_map.get(&num_vars).unwrap() - }; - - let C_decompressed = comm.C.iter().map(|pt| pt.decompress().unwrap()); - let C_LZ = GroupElement::vartime_multiscalar_mul(L, C_decompressed); - C_LZ_comb += c * C_LZ; - C_Zr_comb += c * C_Zr[i]; - c *= c_base; - } - - self.proof.verify( - R.len(), - &gens.gens, - transcript, - &R, - &C_LZ_comb.compress(), - &C_Zr_comb.compress(), - ) + // TODO: Alternative evaluation proof scheme + Ok(()) } } #[cfg(test)] mod tests { - use super::super::scalar::ScalarFromPrimitives; use super::*; + use crate::scalar::Scalar; use rand::rngs::OsRng; fn evaluate_with_LR(Z: &[Scalar], r: &[Scalar]) -> Scalar { @@ -1225,7 +473,7 @@ mod tests { .collect::>(); // compute dot product between LZ and R - DotProductProofLog::compute_dotproduct(&LZ, &R) + DensePolynomial::compute_dotproduct(&LZ, &R) } #[test] @@ -1233,19 +481,19 @@ mod tests { // Z = [1, 2, 1, 4] let Z = vec![ Scalar::one(), - (2_usize).to_scalar(), - (1_usize).to_scalar(), - (4_usize).to_scalar(), + Scalar::from(2_usize), + Scalar::from(1_usize), + Scalar::from(4_usize), ]; // r = [4,3] - let r = vec![(4_usize).to_scalar(), (3_usize).to_scalar()]; + let r = vec![Scalar::from(4_usize), Scalar::from(3_usize)]; let eval_with_LR = evaluate_with_LR(&Z, &r); let poly = DensePolynomial::new(Z); let eval = poly.evaluate(&r); - assert_eq!(eval, (28_usize).to_scalar()); + assert_eq!(eval, Scalar::from(28_usize)); assert_eq!(eval_with_LR, eval); } @@ -1361,41 +609,4 @@ mod tests { assert_eq!(L, L2); assert_eq!(R, R2); } - - #[test] - fn check_polynomial_commit() { - let Z = vec![ - (1_usize).to_scalar(), - (2_usize).to_scalar(), - (1_usize).to_scalar(), - (4_usize).to_scalar(), - ]; - let poly = DensePolynomial::new(Z); - - // r = [4,3] - let r = vec![(4_usize).to_scalar(), (3_usize).to_scalar()]; - let eval = poly.evaluate(&r); - assert_eq!(eval, (28_usize).to_scalar()); - - let gens = PolyCommitmentGens::new(poly.get_num_vars(), b"test-two"); - let (poly_commitment, blinds) = poly.commit(&gens, None); - - let mut random_tape = RandomTape::new(b"proof"); - let mut prover_transcript = Transcript::new(b"example"); - let (proof, C_Zr) = PolyEvalProof::prove( - &poly, - Some(&blinds), - &r, - &eval, - None, - &gens, - &mut prover_transcript, - &mut random_tape, - ); - - let mut verifier_transcript = Transcript::new(b"example"); - assert!(proof - .verify(&gens, &mut verifier_transcript, &r, &C_Zr, &poly_commitment) - .is_ok()); - } } diff --git a/spartan_parallel/src/group.rs b/spartan_parallel/src/group.rs deleted file mode 100644 index ee8b7709..00000000 --- a/spartan_parallel/src/group.rs +++ /dev/null @@ -1,117 +0,0 @@ -use super::errors::ProofVerifyError; -use super::scalar::{Scalar, ScalarBytes, ScalarBytesFromScalar}; -use core::borrow::Borrow; -use core::ops::{Mul, MulAssign}; - -pub type GroupElement = curve25519_dalek::ristretto::RistrettoPoint; -pub type CompressedGroup = curve25519_dalek::ristretto::CompressedRistretto; - -pub trait CompressedGroupExt { - type Group; - fn unpack(&self) -> Result; -} - -impl CompressedGroupExt for CompressedGroup { - type Group = curve25519_dalek::ristretto::RistrettoPoint; - fn unpack(&self) -> Result { - self - .decompress() - .ok_or_else(|| ProofVerifyError::DecompressionError(self.to_bytes())) - } -} - -pub const GROUP_BASEPOINT_COMPRESSED: CompressedGroup = - curve25519_dalek::constants::RISTRETTO_BASEPOINT_COMPRESSED; - -impl<'b> MulAssign<&'b Scalar> for GroupElement { - fn mul_assign(&mut self, scalar: &'b Scalar) { - let result = (self as &GroupElement) * Scalar::decompress_scalar(scalar); - *self = result; - } -} - -impl<'a, 'b> Mul<&'b Scalar> for &'a GroupElement { - type Output = GroupElement; - fn mul(self, scalar: &'b Scalar) -> GroupElement { - self * Scalar::decompress_scalar(scalar) - } -} - -impl<'a, 'b> Mul<&'b GroupElement> for &'a Scalar { - type Output = GroupElement; - - fn mul(self, point: &'b GroupElement) -> GroupElement { - Scalar::decompress_scalar(self) * point - } -} - -macro_rules! define_mul_variants { - (LHS = $lhs:ty, RHS = $rhs:ty, Output = $out:ty) => { - impl<'b> Mul<&'b $rhs> for $lhs { - type Output = $out; - fn mul(self, rhs: &'b $rhs) -> $out { - &self * rhs - } - } - - impl<'a> Mul<$rhs> for &'a $lhs { - type Output = $out; - fn mul(self, rhs: $rhs) -> $out { - self * &rhs - } - } - - impl Mul<$rhs> for $lhs { - type Output = $out; - fn mul(self, rhs: $rhs) -> $out { - &self * &rhs - } - } - }; -} - -macro_rules! define_mul_assign_variants { - (LHS = $lhs:ty, RHS = $rhs:ty) => { - impl MulAssign<$rhs> for $lhs { - fn mul_assign(&mut self, rhs: $rhs) { - *self *= &rhs; - } - } - }; -} - -define_mul_assign_variants!(LHS = GroupElement, RHS = Scalar); -define_mul_variants!(LHS = GroupElement, RHS = Scalar, Output = GroupElement); -define_mul_variants!(LHS = Scalar, RHS = GroupElement, Output = GroupElement); - -pub trait VartimeMultiscalarMul { - type Scalar; - fn vartime_multiscalar_mul(scalars: I, points: J) -> Self - where - I: IntoIterator, - I::Item: Borrow, - J: IntoIterator, - J::Item: Borrow, - Self: Clone; -} - -impl VartimeMultiscalarMul for GroupElement { - type Scalar = super::scalar::Scalar; - fn vartime_multiscalar_mul(scalars: I, points: J) -> Self - where - I: IntoIterator, - I::Item: Borrow, - J: IntoIterator, - J::Item: Borrow, - Self: Clone, - { - use curve25519_dalek::traits::VartimeMultiscalarMul; - ::vartime_multiscalar_mul( - scalars - .into_iter() - .map(|s| Scalar::decompress_scalar(s.borrow())) - .collect::>(), - points, - ) - } -} diff --git a/spartan_parallel/src/instance.rs b/spartan_parallel/src/instance.rs index 10c8b085..91133400 100644 --- a/spartan_parallel/src/instance.rs +++ b/spartan_parallel/src/instance.rs @@ -2,19 +2,19 @@ use std::cmp::max; use crate::errors::R1CSError; use crate::math::Math; -use crate::scalar::Scalar; +use crate::scalar::SpartanExtensionField; use crate::R1CSInstance; /// `Instance` holds the description of R1CS matrices and a hash of the matrices #[derive(Clone)] -pub struct Instance { +pub struct Instance { /// Matrix of Instance - pub inst: crate::R1CSInstance, + pub inst: crate::R1CSInstance, /// Digest of Instance pub digest: Vec, } -impl Instance { +impl Instance { /// Constructs a new `Instance` and an associated satisfying assignment pub fn new( num_instances: usize, @@ -24,7 +24,7 @@ impl Instance { A: &Vec>, B: &Vec>, C: &Vec>, - ) -> Result { + ) -> Result, R1CSError> { let (num_vars_padded, max_num_cons_padded, num_cons_padded) = { let num_vars_padded = { let mut num_vars_padded = num_vars; @@ -63,47 +63,46 @@ impl Instance { (num_vars_padded, max_num_cons_padded, num_cons_padded) }; - let bytes_to_scalar = |b: usize, - tups: &[(usize, usize, [u8; 32])]| - -> Result, R1CSError> { - let mut mat: Vec<(usize, usize, Scalar)> = Vec::new(); - for &(row, col, val_bytes) in tups { - // row must be smaller than num_cons - if row >= num_cons[b] { - println!("ROW: {}, NUM_CONS: {}", row, num_cons[b]); - return Err(R1CSError::InvalidIndex); - } - - // col must be smaller than num_vars - if col >= num_vars { - println!("COL: {}, NUM_VARS: {}", col, num_vars); - return Err(R1CSError::InvalidIndex); - } + let bytes_to_scalar = + |b: usize, tups: &[(usize, usize, [u8; 32])]| -> Result, R1CSError> { + let mut mat: Vec<(usize, usize, S)> = Vec::new(); + for &(row, col, val_bytes) in tups { + // row must be smaller than num_cons + if row >= num_cons[b] { + println!("ROW: {}, NUM_CONS: {}", row, num_cons[b]); + return Err(R1CSError::InvalidIndex); + } - let val = Scalar::from_bytes(&val_bytes); - if val.is_some().unwrap_u8() == 1 { - // if col >= num_vars, it means that it is referencing a 1 or input in the satisfying - // assignment + // col must be smaller than num_vars if col >= num_vars { - mat.push((row, col + num_vars_padded - num_vars, val.unwrap())); + println!("COL: {}, NUM_VARS: {}", col, num_vars); + return Err(R1CSError::InvalidIndex); + } + + let val = S::from_bytes(&val_bytes); + if val.is_some().unwrap_u8() == 1 { + // if col >= num_vars, it means that it is referencing a 1 or input in the satisfying + // assignment + if col >= num_vars { + mat.push((row, col + num_vars_padded - num_vars, val.unwrap())); + } else { + mat.push((row, col, val.unwrap())); + } } else { - mat.push((row, col, val.unwrap())); + return Err(R1CSError::InvalidScalar); } - } else { - return Err(R1CSError::InvalidScalar); } - } - // pad with additional constraints up until num_cons_padded if the original constraints were 0 or 1 - // we do not need to pad otherwise because the dummy constraints are implicit in the sum-check protocol - if num_cons[b] == 0 || num_cons[b] == 1 { - for i in tups.len()..num_cons_padded[b] { - mat.push((i, num_vars, Scalar::zero())); + // pad with additional constraints up until num_cons_padded if the original constraints were 0 or 1 + // we do not need to pad otherwise because the dummy constraints are implicit in the sum-check protocol + if num_cons[b] == 0 || num_cons[b] == 1 { + for i in tups.len()..num_cons_padded[b] { + mat.push((i, num_vars, S::field_zero())); + } } - } - Ok(mat) - }; + Ok(mat) + }; let mut A_scalar_list = Vec::new(); let mut B_scalar_list = Vec::new(); @@ -166,9 +165,9 @@ impl Instance { Vec<(usize, usize, [u8; 32])>, ) { let int_to_scalar = |i: isize| { - let abs_scalar = Scalar::from(i.unsigned_abs() as u64); + let abs_scalar = S::from(i.abs() as u64); if i < 0 { - abs_scalar.neg().to_bytes() + abs_scalar.negate().to_bytes() } else { abs_scalar.to_bytes() } @@ -261,7 +260,7 @@ impl Instance { // Information used only by printing num_vars_per_block: &Vec, block_num_proofs: &Vec, - ) -> (usize, usize, usize, Instance) { + ) -> (usize, usize, usize, Instance) { assert_eq!(num_instances, args.len()); if PRINT_SIZE { @@ -353,7 +352,7 @@ impl Instance { tmp_nnz_A += arg[i].0.len(); tmp_nnz_B += arg[i].1.len(); tmp_nnz_C += arg[i].2.len(); - (A, B, C) = Instance::gen_constr_bytes( + (A, B, C) = Instance::::gen_constr_bytes( A, B, C, @@ -369,7 +368,7 @@ impl Instance { // correctness of w2 // for i1.. for i in 1..num_inputs_unpadded - 1 { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -382,7 +381,7 @@ impl Instance { } // for o0, o1.. for i in 0..num_inputs_unpadded - 1 { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -394,7 +393,7 @@ impl Instance { counter += 1; } // v[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -405,7 +404,7 @@ impl Instance { ); counter += 1; // x[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -422,7 +421,7 @@ impl Instance { ); counter += 1; // D[k] = x[k] * (pi[k + 1] + (1 - v[k + 1])) - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -433,7 +432,7 @@ impl Instance { ); counter += 1; // pi[k] = v[k] * D[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -454,7 +453,7 @@ impl Instance { // Physical Memory for i in 0..num_phy_ops[b] { // PMR = r * PD - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -466,7 +465,7 @@ impl Instance { counter += 1; // PMC = (1 or PMC[i-1]) * (tau - PA - PMR) if i == 0 { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -476,7 +475,7 @@ impl Instance { vec![(V_PMC(i), 1)], ); } else { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -490,7 +489,7 @@ impl Instance { } counter += 1; // Pd - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -506,7 +505,7 @@ impl Instance { ); counter += 1; // Pp - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -524,7 +523,7 @@ impl Instance { // Virtual Memory for i in 0..num_vir_ops[b] { // VMR1 = r * VD - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -535,7 +534,7 @@ impl Instance { ); counter += 1; // VMR2 = r^2 * VL - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -546,7 +545,7 @@ impl Instance { ); counter += 1; // VMR3 = r^3 * VT - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -558,7 +557,7 @@ impl Instance { counter += 1; // VMC = (1 or VMC[i-1]) * (tau - VA - VMR1 - VMR2 - VMR3) if i == 0 { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -574,7 +573,7 @@ impl Instance { vec![(V_VMC(b, i), 1)], ); } else { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -594,7 +593,7 @@ impl Instance { } counter += 1; // Vd - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -610,7 +609,7 @@ impl Instance { ); counter += 1; // Vp - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -738,7 +737,7 @@ impl Instance { consis_num_proofs: usize, total_num_phy_mem_accesses: usize, total_num_vir_mem_accesses: usize, - ) -> (usize, usize, usize, Instance) { + ) -> (usize, usize, usize, Instance) { if PRINT_SIZE { println!("\n\n--\nPAIRWISE INSTS"); println!( @@ -774,7 +773,7 @@ impl Instance { // R1CS: // Output matches input - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -818,7 +817,7 @@ impl Instance { let mut num_cons = 0; // (v[k] - 1) * v[k + 1] = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -829,7 +828,7 @@ impl Instance { ); num_cons += 1; // v[k + 1] * (1 - addr[k + 1] + addr[k]) = D[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -840,7 +839,7 @@ impl Instance { ); num_cons += 1; // D[k] * (addr[k + 1] - addr[k]) = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -851,7 +850,7 @@ impl Instance { ); num_cons += 1; // D[k] * (val[k + 1] - val[k]) = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -902,7 +901,7 @@ impl Instance { let mut num_cons = 0; // Sortedness // (v[k] - 1) * v[k + 1] = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -913,7 +912,7 @@ impl Instance { ); num_cons += 1; // D1[k] = v[k + 1] * (1 - addr[k + 1] + addr[k]) - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -924,7 +923,7 @@ impl Instance { ); num_cons += 1; // D1[k] * (addr[k + 1] - addr[k]) = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -935,7 +934,7 @@ impl Instance { ); num_cons += 1; // EQ - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -948,7 +947,7 @@ impl Instance { // C>= for i in 0..max_ts_width { // Bi * Bi = Bi - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -960,7 +959,7 @@ impl Instance { num_cons += 1; } // D1[k] * (ts[k + 1] - ts[k]) = EQ + \Sum_i B_i - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -979,7 +978,7 @@ impl Instance { // Consistency // D1[k] * (ls[k + 1] - STORE) = D2[k], where STORE = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -990,7 +989,7 @@ impl Instance { ); num_cons += 1; // D2[k] * (data[k + 1] - data[k]) = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1001,7 +1000,7 @@ impl Instance { ); num_cons += 1; // (1 - D1[k]) * (ls[k + 1] - STORE) = 0, where STORE = 0 - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1044,7 +1043,7 @@ impl Instance { println!("Total Cons Exec Size: {}", total_cons_exec_size); } - Instance::new( + let pairwise_check_inst = Instance::new( 3, pairwise_check_max_num_cons, pairwise_check_num_cons, @@ -1053,7 +1052,8 @@ impl Instance { &B_list, &C_list, ) - .unwrap() + .unwrap(); + pairwise_check_inst }; ( pairwise_check_num_vars, @@ -1086,7 +1086,7 @@ impl Instance { consis_num_proofs: usize, total_num_phy_mem_accesses: usize, total_num_vir_mem_accesses: usize, - ) -> (usize, usize, Instance) { + ) -> (usize, usize, Instance) { if PRINT_SIZE { println!("\n\n--\nPERM INSTS"); println!( @@ -1141,7 +1141,7 @@ impl Instance { // correctness of w2 // for i1.. for i in 1..num_inputs_unpadded - 1 { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1154,7 +1154,7 @@ impl Instance { } // for o0, o1.. for i in 0..num_inputs_unpadded - 1 { - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1166,7 +1166,7 @@ impl Instance { constraint_count += 1; } // ZO * r^n = r^n * o0 + r^(n + 1) * o1, ... - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1179,7 +1179,7 @@ impl Instance { ); constraint_count += 1; // I = v * (v + i0 + r * i1 + r^2 * i2 + ...) - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1196,7 +1196,7 @@ impl Instance { ); constraint_count += 1; // O = v * (v + ZO) - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1207,7 +1207,7 @@ impl Instance { ); constraint_count += 1; // v[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1218,7 +1218,7 @@ impl Instance { ); constraint_count += 1; // x[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1235,7 +1235,7 @@ impl Instance { ); constraint_count += 1; // D[k] = x[k] * (pi[k + 1] + (1 - v[k + 1])) - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1246,7 +1246,7 @@ impl Instance { ); constraint_count += 1; // pi[k] = v[k] * D[k] - (A, B, C) = Instance::gen_constr( + (A, B, C) = Instance::::gen_constr( A, B, C, @@ -1294,7 +1294,7 @@ impl Instance { println!("Total Cons Exec Size: {}", total_cons_exec_size); } - Instance::new( + let perm_root_inst = Instance::new( 1, perm_root_num_cons, vec![perm_root_num_cons], @@ -1303,7 +1303,8 @@ impl Instance { &B_list, &C_list, ) - .unwrap() + .unwrap(); + perm_root_inst }; ( perm_root_num_cons, diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 0e10ea64..3c41496b 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -2,6 +2,7 @@ #![doc = include_str!("../README.md")] #![deny(missing_docs)] #![allow(clippy::assertions_on_result_states)] +#![feature(associated_type_defaults)] // TODO: Can we allow split in R1CSGens? // TODO: Can we parallelize the proofs? @@ -18,20 +19,18 @@ extern crate sha3; #[cfg(feature = "multicore")] extern crate rayon; -mod commitments; mod custom_dense_mlpoly; mod dense_mlpoly; mod errors; -mod group; /// R1CS instance used by libspartan pub mod instance; mod math; -mod nizk; mod product_tree; mod r1csinstance; mod r1csproof; mod random; -mod scalar; +/// Scalar field used by libspartan +pub mod scalar; mod sparse_mlpoly; mod sumcheck; mod timer; @@ -44,28 +43,20 @@ use std::{ io::Write, }; -use curve25519_dalek::ristretto::{CompressedRistretto, RistrettoPoint}; -use dense_mlpoly::{DensePolynomial, PolyCommitment, PolyEvalProof}; +use dense_mlpoly::{DensePolynomial, PolyEvalProof}; use errors::{ProofVerifyError, R1CSError}; use instance::Instance; use itertools::Itertools; use math::Math; use merlin::Transcript; -use r1csinstance::{ - R1CSCommitment, R1CSCommitmentGens, R1CSDecommitment, R1CSEvalProof, R1CSInstance, -}; -use r1csproof::{R1CSGens, R1CSProof}; +use r1csinstance::{R1CSCommitment, R1CSDecommitment, R1CSEvalProof, R1CSInstance}; +use r1csproof::R1CSProof; use random::RandomTape; -use scalar::Scalar; +use scalar::SpartanExtensionField; use serde::{Deserialize, Serialize}; use timer::Timer; use transcript::{AppendToTranscript, ProofTranscript}; -use crate::commitments::Commitments; - -const ZERO: Scalar = Scalar::zero(); -const ONE: Scalar = Scalar::one(); - const INIT_PHY_MEM_WIDTH: usize = 4; const INIT_VIR_MEM_WIDTH: usize = 4; const PHY_MEM_WIDTH: usize = 4; @@ -74,29 +65,29 @@ const W3_WIDTH: usize = 8; /// `ComputationCommitment` holds a public preprocessed NP statement (e.g., R1CS) #[derive(Clone, Serialize)] -pub struct ComputationCommitment { - comm: R1CSCommitment, +pub struct ComputationCommitment { + comm: R1CSCommitment, } /// `ComputationDecommitment` holds information to decommit `ComputationCommitment` -pub struct ComputationDecommitment { - decomm: R1CSDecommitment, +pub struct ComputationDecommitment { + decomm: R1CSDecommitment, } /// `Assignment` holds an assignment of values to either the inputs or variables in an `Instance` #[derive(Clone, Serialize, Deserialize)] -pub struct Assignment { +pub struct Assignment { /// Entries of an assignment - pub assignment: Vec, + pub assignment: Vec, } -impl Assignment { +impl Assignment { /// Constructs a new `Assignment` from a vector - pub fn new(assignment: &[[u8; 32]]) -> Result { - let bytes_to_scalar = |vec: &[[u8; 32]]| -> Result, R1CSError> { - let mut vec_scalar: Vec = Vec::new(); + pub fn new(assignment: &[[u8; 32]]) -> Result, R1CSError> { + let bytes_to_scalar = |vec: &[[u8; 32]]| -> Result, R1CSError> { + let mut vec_scalar: Vec = Vec::new(); for v in vec { - let val = Scalar::from_bytes(v); + let val = S::from_bytes(v); if val.is_some().unwrap_u8() == 1 { vec_scalar.push(val.unwrap()); } else { @@ -140,88 +131,52 @@ fn write_bytes(mut f: &File, bytes: &[u8; 32]) -> std::io::Result<()> { } /// `VarsAssignment` holds an assignment of values to variables in an `Instance` -pub type VarsAssignment = Assignment; +pub type VarsAssignment = Assignment; /// `InputsAssignment` holds an assignment of values to inputs in an `Instance` -pub type InputsAssignment = Assignment; +pub type InputsAssignment = Assignment; /// `MemsAssignment` holds an assignment of values to (addr, val) pairs in an `Instance` -pub type MemsAssignment = Assignment; - -/// `SNARKGens` holds public parameters for producing and verifying proofs with the Spartan SNARK -#[derive(Serialize)] -pub struct SNARKGens { - /// Generator for witness commitment - pub gens_r1cs_sat: R1CSGens, - gens_r1cs_eval: R1CSCommitmentGens, -} - -impl SNARKGens { - /// Constructs a new `SNARKGens` given the size of the R1CS statement - /// `num_nz_entries` specifies the maximum number of non-zero entries in any of the three R1CS matrices - pub fn new( - num_cons: usize, - num_vars: usize, - num_instances: usize, - num_nz_entries: usize, - ) -> Self { - let num_vars_padded = num_vars.next_power_of_two(); - - let num_instances_padded: usize = num_instances.next_power_of_two(); - let gens_r1cs_sat = R1CSGens::new(b"gens_r1cs_sat", num_cons, num_vars_padded); - let gens_r1cs_eval = R1CSCommitmentGens::new( - b"gens_r1cs_eval", - num_instances_padded, - num_cons, - num_vars_padded, - num_nz_entries, - ); - SNARKGens { - gens_r1cs_sat, - gens_r1cs_eval, - } - } -} +pub type MemsAssignment = Assignment; // IOProofs contains a series of proofs that the committed values match the input and output of the program #[derive(Serialize, Deserialize, Debug)] -struct IOProofs { +struct IOProofs { // The prover needs to prove: // 1. Input and output block are both valid // 2. Block number of the input and output block are correct // 3. Input and outputs are correct // 4. The constant value of the input is 1 - proofs: Vec, + proofs: Vec>, } -impl IOProofs { +impl IOProofs { // Given the polynomial in execution order, generate all proofs fn prove( - exec_poly_inputs: &DensePolynomial, + exec_poly_inputs: &DensePolynomial, num_ios: usize, num_inputs_unpadded: usize, num_proofs: usize, - input_block_num: Scalar, - output_block_num: Scalar, + input_block_num: S, + output_block_num: S, input_liveness: &Vec, input_offset: usize, output_offset: usize, - input: Vec, - output: Scalar, + input: Vec, + output: S, output_exec_num: usize, - vars_gens: &R1CSGens, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> IOProofs { + random_tape: &mut RandomTape, + ) -> IOProofs { let r_len = (num_proofs * num_ios).log_2(); let to_bin_array = |x: usize| { (0..r_len) .rev() .map(|n| (x >> n) & 1) - .map(|i| Scalar::from(i as u64)) - .collect::>() + .map(|i| S::from(i as u64)) + .collect::>() }; // input indices are 6(%SP) ++ 5(%AS) ++ [2 + input_offset..](others) @@ -241,7 +196,7 @@ impl IOProofs { let mut live_input = Vec::new(); for i in 0..input_liveness.len() { if input_liveness[i] { - live_input.push(input[i]); + live_input.push(input[i].clone()); } } input_indices = input_indices[..live_input.len()].to_vec(); @@ -249,7 +204,6 @@ impl IOProofs { // batch prove all proofs let proofs = PolyEvalProof::prove_batched_points( exec_poly_inputs, - None, [ vec![ 0, // input valid @@ -264,13 +218,17 @@ impl IOProofs { .iter() .map(|i| to_bin_array(*i)) .collect(), - [ - vec![ONE, ONE, input_block_num, output_block_num, output], + vec![ + vec![ + S::field_one(), + S::field_one(), + input_block_num, + output_block_num, + output, + ], live_input, ] .concat(), - None, - &vars_gens.gens_pc, transcript, random_tape, ); @@ -279,20 +237,18 @@ impl IOProofs { fn verify( &self, - comm_poly_inputs: &PolyCommitment, num_ios: usize, num_inputs_unpadded: usize, num_proofs: usize, - input_block_num: Scalar, - output_block_num: Scalar, + input_block_num: S, + output_block_num: S, input_liveness: &Vec, input_offset: usize, output_offset: usize, - input: Vec, - output: Scalar, + input: Vec, + output: S, output_exec_num: usize, - vars_gens: &R1CSGens, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { let r_len = (num_proofs * num_ios).log_2(); @@ -300,8 +256,8 @@ impl IOProofs { (0..r_len) .rev() .map(|n| (x >> n) & 1) - .map(|i| Scalar::from(i as u64)) - .collect::>() + .map(|i| S::from(i as u64)) + .collect::>() }; // input indices are 6(%SP) ++ 5(%AS) ++ [2 + input_offset..](others) @@ -321,7 +277,7 @@ impl IOProofs { let mut live_input = Vec::new(); for i in 0..input_liveness.len() { if input_liveness[i] { - live_input.push(input[i]); + live_input.push(input[i].clone()); } } input_indices = input_indices[..live_input.len()].to_vec(); @@ -329,7 +285,6 @@ impl IOProofs { // batch verify all proofs PolyEvalProof::verify_plain_batched_points( &self.proofs, - &vars_gens.gens_pc, transcript, [ vec![ @@ -345,15 +300,18 @@ impl IOProofs { .iter() .map(|i| to_bin_array(*i)) .collect(), - [ - vec![ONE, ONE, input_block_num, output_block_num, output], + vec![ + vec![ + S::field_one(), + S::field_one(), + input_block_num, + output_block_num, + output, + ], live_input, ] .concat(), - comm_poly_inputs, - )?; - - Ok(()) + ) } } @@ -361,23 +319,19 @@ impl IOProofs { // We do so by treating both polynomials as univariate and evaluate on a single point C // Finally, show shifted(C) = orig(C) * C^(shift_size) + rc * openings, where rc * openings are the first few entries of the original poly dot product with the power series of C #[derive(Serialize, Deserialize, Debug)] -struct ShiftProofs { - proof: PolyEvalProof, - C_orig_evals: Vec, - C_shifted_evals: Vec, - openings: Vec>, +struct ShiftProofs { + proof: PolyEvalProof, } -impl ShiftProofs { +impl ShiftProofs { fn prove( - orig_polys: Vec<&DensePolynomial>, - shifted_polys: Vec<&DensePolynomial>, + orig_polys: Vec<&DensePolynomial>, + shifted_polys: Vec<&DensePolynomial>, // For each orig_poly, how many entries at the front of proof 0 are non-zero? header_len_list: Vec, - vars_gens: &R1CSGens, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> ShiftProofs { + random_tape: &mut RandomTape, + ) -> ShiftProofs { // Assert that all polynomials are of the same size let num_instances = orig_polys.len(); assert_eq!(num_instances, shifted_polys.len()); @@ -389,107 +343,70 @@ impl ShiftProofs { .iter() .fold(max_poly_size, |m, p| if p.len() > m { p.len() } else { m }); // Open entry 0..header_len_list[p] - 1 - let mut openings = vec![Vec::new(); num_instances]; for p in 0..num_instances { - for i in 0..header_len_list[p] { - let entry = orig_polys[p][i] - .commit(&ZERO, &vars_gens.gens_pc.gens.gens_1) - .compress(); - entry.append_to_transcript(b"shift_header_entry", transcript); - openings[p].push(entry); - } + for _i in 0..header_len_list[p] {} } let c = transcript.challenge_scalar(b"challenge_c"); let mut rc = Vec::new(); - let mut next_c = ONE; + let mut next_c = S::field_one(); for _ in 0..max_poly_size { rc.push(next_c); - next_c *= c; + next_c = next_c * c; } let mut orig_evals = Vec::new(); let mut shifted_evals = Vec::new(); - let mut C_orig_evals = Vec::new(); - let mut C_shifted_evals = Vec::new(); + for p in 0..num_instances { let orig_poly = orig_polys[p]; let shifted_poly = shifted_polys[p]; - let orig_eval = (0..orig_poly.len()).fold(ZERO, |a, b| a + orig_poly[b] * rc[b]); - let shifted_eval = (0..shifted_poly.len()).fold(ZERO, |a, b| a + shifted_poly[b] * rc[b]); + let orig_eval = (0..orig_poly.len()).fold(S::field_zero(), |a, b| a + orig_poly[b] * rc[b]); + let shifted_eval = + (0..shifted_poly.len()).fold(S::field_zero(), |a, b| a + shifted_poly[b] * rc[b]); orig_evals.push(orig_eval); shifted_evals.push(shifted_eval); - C_orig_evals.push( - orig_eval - .commit(&ZERO, &vars_gens.gens_pc.gens.gens_1) - .compress(), - ); - C_shifted_evals.push( - shifted_eval - .commit(&ZERO, &vars_gens.gens_pc.gens.gens_1) - .compress(), - ); } - let (addr_phy_mems_shift_proof, _eval) = PolyEvalProof::prove_uni_batched_instances( + let addr_phy_mems_shift_proof = PolyEvalProof::prove_uni_batched_instances( &[orig_polys, shifted_polys].concat(), &c, &[orig_evals, shifted_evals].concat(), - &vars_gens.gens_pc, transcript, random_tape, ); ShiftProofs { proof: addr_phy_mems_shift_proof, - C_orig_evals, - C_shifted_evals, - openings, } } fn verify( &self, - orig_comms: Vec<&PolyCommitment>, - shifted_comms: Vec<&PolyCommitment>, poly_size_list: Vec, shift_size_list: Vec, // For each orig_poly, how many entries at the front of proof 0 are non-zero? header_len_list: Vec, - vars_gens: &R1CSGens, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - let num_instances = orig_comms.len(); + let num_instances = header_len_list.len(); + // Open entry 0..header_len_list[p] - 1 for p in 0..num_instances { - for i in 0..header_len_list[p] { - self.openings[p][i].append_to_transcript(b"shift_header_entry", transcript); - } + for _i in 0..header_len_list[p] {} } let max_shift_size = shift_size_list .iter() .fold(0, |m, i| if *i > m { *i } else { m }); let c = transcript.challenge_scalar(b"challenge_c"); let mut rc = Vec::new(); - let mut next_c = ONE; + let mut next_c = S::field_one(); for _ in 0..max_shift_size + 1 { rc.push(next_c); - next_c *= c; + next_c = next_c * c; } - let C_evals_orig_decompressed: Vec = self - .C_orig_evals - .iter() - .map(|i| i.decompress().unwrap()) - .collect(); - let C_evals_shifted_decompressed: Vec = self - .C_shifted_evals - .iter() - .map(|i| i.decompress().unwrap()) - .collect(); + // Proof of opening self.proof.verify_uni_batched_instances( - &vars_gens.gens_pc, transcript, &c, - &[C_evals_orig_decompressed, C_evals_shifted_decompressed].concat(), - &[orig_comms, shifted_comms].concat(), [poly_size_list.clone(), poly_size_list].concat(), )?; Ok(()) @@ -498,17 +415,17 @@ impl ShiftProofs { // Information regarding one witness sec #[derive(Clone)] -struct ProverWitnessSecInfo { +struct ProverWitnessSecInfo { // Number of inputs per block num_inputs: Vec, // num_instances x num_proofs x num_inputs hypermatrix for all values - w_mat: Vec>>, + w_mat: Vec>>, // One dense polynomial per instance - poly_w: Vec, + poly_w: Vec>, } -impl ProverWitnessSecInfo { - fn new(w_mat: Vec>>, poly_w: Vec) -> ProverWitnessSecInfo { +impl ProverWitnessSecInfo { + fn new(w_mat: Vec>>, poly_w: Vec>) -> ProverWitnessSecInfo { ProverWitnessSecInfo { num_inputs: w_mat.iter().map(|i| i[0].len()).collect(), w_mat, @@ -516,7 +433,7 @@ impl ProverWitnessSecInfo { } } - fn dummy() -> ProverWitnessSecInfo { + fn dummy() -> ProverWitnessSecInfo { ProverWitnessSecInfo { num_inputs: Vec::new(), w_mat: Vec::new(), @@ -525,7 +442,7 @@ impl ProverWitnessSecInfo { } // Concatenate the components in the given order to a new prover witness sec - fn concat(components: Vec<&ProverWitnessSecInfo>) -> ProverWitnessSecInfo { + fn concat(components: Vec<&ProverWitnessSecInfo>) -> ProverWitnessSecInfo { let mut num_inputs = Vec::new(); let mut w_mat = Vec::new(); let mut poly_w = Vec::new(); @@ -547,7 +464,7 @@ impl ProverWitnessSecInfo { // Assume all components are sorted // Returns: 1. the merged ProverWitnessSec, // 2. for each instance in the merged ProverWitnessSec, the component it orignally belongs to - fn merge(components: Vec<&ProverWitnessSecInfo>) -> (ProverWitnessSecInfo, Vec) { + fn merge(components: Vec<&ProverWitnessSecInfo>) -> (ProverWitnessSecInfo, Vec) { // Merge algorithm with pointer on each component let mut pointers = vec![0; components.len()]; let merged_size = components.iter().fold(0, |a, b| a + b.num_inputs.len()); @@ -574,7 +491,7 @@ impl ProverWitnessSecInfo { merged_num_inputs.push(components[next_component].num_inputs[pointers[next_component]]); merged_w_mat.push(components[next_component].w_mat[pointers[next_component]].clone()); merged_poly_w.push(components[next_component].poly_w[pointers[next_component]].clone()); - pointers[next_component] += 1; + pointers[next_component] = pointers[next_component] + 1; } ( @@ -595,24 +512,15 @@ struct VerifierWitnessSecInfo { num_inputs: Vec, // Number of proofs per block, used by merge num_proofs: Vec, - // One commitment per instance - comm_w: Vec, } impl VerifierWitnessSecInfo { // Unfortunately, cannot obtain all metadata from the commitment - fn new( - num_inputs: Vec, - num_proofs: &Vec, - comm_w: Vec, - ) -> VerifierWitnessSecInfo { - assert!( - comm_w.is_empty() || (num_inputs.len() == comm_w.len() && num_proofs.len() >= comm_w.len()) - ); + fn new(num_inputs: Vec, num_proofs: &Vec) -> VerifierWitnessSecInfo { + let l = num_inputs.len(); VerifierWitnessSecInfo { num_inputs, - num_proofs: num_proofs[..comm_w.len()].to_vec(), - comm_w, + num_proofs: num_proofs[..l].to_vec(), } } @@ -620,7 +528,6 @@ impl VerifierWitnessSecInfo { VerifierWitnessSecInfo { num_inputs: Vec::new(), num_proofs: Vec::new(), - comm_w: Vec::new(), } } @@ -628,18 +535,15 @@ impl VerifierWitnessSecInfo { fn concat(components: Vec<&VerifierWitnessSecInfo>) -> VerifierWitnessSecInfo { let mut num_inputs = Vec::new(); let mut num_proofs = Vec::new(); - let mut comm_w = Vec::new(); for c in components { num_inputs.extend(c.num_inputs.clone()); num_proofs.extend(c.num_proofs.clone()); - comm_w.extend(c.comm_w.clone()); } VerifierWitnessSecInfo { num_inputs, num_proofs, - comm_w, } } @@ -655,7 +559,6 @@ impl VerifierWitnessSecInfo { let mut inst_map = Vec::new(); let mut merged_num_inputs = Vec::new(); let mut merged_num_proofs = Vec::new(); - let mut merged_comm_w = Vec::new(); while inst_map.len() < merged_size { // Choose the next instance with the most proofs let mut next_max_num_proofs = 0; @@ -673,15 +576,13 @@ impl VerifierWitnessSecInfo { inst_map.push(next_component); merged_num_inputs.push(components[next_component].num_inputs[pointers[next_component]]); merged_num_proofs.push(components[next_component].num_proofs[pointers[next_component]]); - merged_comm_w.push(components[next_component].comm_w[pointers[next_component]].clone()); - pointers[next_component] += 1; + pointers[next_component] = pointers[next_component] + 1; } ( VerifierWitnessSecInfo { num_inputs: merged_num_inputs, num_proofs: merged_num_proofs, - comm_w: merged_comm_w, }, inst_map, ) @@ -690,60 +591,27 @@ impl VerifierWitnessSecInfo { /// `SNARK` holds a proof produced by Spartan SNARK #[derive(Serialize, Deserialize, Debug)] -pub struct SNARK { - block_comm_vars_list: Vec, - exec_comm_inputs: Vec, - // comm_init_mems: Vec, HANDLED BY THE VERIFIER - addr_comm_phy_mems: PolyCommitment, - addr_comm_phy_mems_shifted: PolyCommitment, - addr_comm_vir_mems: PolyCommitment, - addr_comm_vir_mems_shifted: PolyCommitment, - addr_comm_ts_bits: PolyCommitment, - - perm_exec_comm_w2_list: PolyCommitment, - perm_exec_comm_w3_list: PolyCommitment, - perm_exec_comm_w3_shifted: PolyCommitment, - - block_comm_w2_list: Vec, - block_comm_w3_list: Vec, - block_comm_w3_list_shifted: Vec, - - init_phy_mem_comm_w2: PolyCommitment, - init_phy_mem_comm_w3: PolyCommitment, - init_phy_mem_comm_w3_shifted: PolyCommitment, - - init_vir_mem_comm_w2: PolyCommitment, - init_vir_mem_comm_w3: PolyCommitment, - init_vir_mem_comm_w3_shifted: PolyCommitment, - - phy_mem_addr_comm_w2: PolyCommitment, - phy_mem_addr_comm_w3: PolyCommitment, - phy_mem_addr_comm_w3_shifted: PolyCommitment, - - vir_mem_addr_comm_w2: PolyCommitment, - vir_mem_addr_comm_w3: PolyCommitment, - vir_mem_addr_comm_w3_shifted: PolyCommitment, - - block_r1cs_sat_proof: R1CSProof, - block_inst_evals_bound_rp: [Scalar; 3], - block_inst_evals_list: Vec, - block_r1cs_eval_proof_list: Vec, - - pairwise_check_r1cs_sat_proof: R1CSProof, - pairwise_check_inst_evals_bound_rp: [Scalar; 3], - pairwise_check_inst_evals_list: Vec, - pairwise_check_r1cs_eval_proof: R1CSEvalProof, - - perm_root_r1cs_sat_proof: R1CSProof, - perm_root_inst_evals: [Scalar; 3], - perm_root_r1cs_eval_proof: R1CSEvalProof, +pub struct SNARK { + block_r1cs_sat_proof: R1CSProof, + block_inst_evals_bound_rp: [S; 3], + block_inst_evals_list: Vec, + block_r1cs_eval_proof_list: Vec>, + + pairwise_check_r1cs_sat_proof: R1CSProof, + pairwise_check_inst_evals_bound_rp: [S; 3], + pairwise_check_inst_evals_list: Vec, + pairwise_check_r1cs_eval_proof: R1CSEvalProof, + + perm_root_r1cs_sat_proof: R1CSProof, + perm_root_inst_evals: [S; 3], + perm_root_r1cs_eval_proof: R1CSEvalProof, // Product proof for permutation - perm_poly_poly_list: Vec, - proof_eval_perm_poly_prod_list: Vec, + perm_poly_poly_list: Vec, + proof_eval_perm_poly_prod_list: Vec>, - shift_proof: ShiftProofs, - io_proof: IOProofs, + // shift_proof: ShiftProofs, + io_proof: IOProofs, } // Sort block_num_proofs and record where each entry is @@ -775,22 +643,22 @@ impl PartialEq for InstanceSortHelper { } impl Eq for InstanceSortHelper {} -impl SNARK { +impl SNARK { fn protocol_name() -> &'static [u8] { b"Spartan SNARK proof" } /// A public computation to create a commitment to a list of R1CS instances pub fn multi_encode( - inst: &Instance, - gens: &SNARKGens, + inst: &Instance, ) -> ( Vec>, - Vec, - Vec, + Vec>, + Vec>, ) { let timer_encode = Timer::new("SNARK::encode"); - let (label_map, mut comm, mut decomm) = inst.inst.multi_commit(&gens.gens_r1cs_eval); + let (label_map, mut comm, mut decomm) = inst.inst.multi_commit(); + timer_encode.stop(); ( label_map, @@ -806,12 +674,10 @@ impl SNARK { } /// A public computation to create a commitment to a single R1CS instance - pub fn encode( - inst: &Instance, - gens: &SNARKGens, - ) -> (ComputationCommitment, ComputationDecommitment) { + pub fn encode(inst: &Instance) -> (ComputationCommitment, ComputationDecommitment) { let timer_encode = Timer::new("SNARK::encode"); - let (comm, decomm) = inst.inst.commit(&gens.gens_r1cs_eval); + let (comm, decomm) = inst.inst.commit(); + timer_encode.stop(); ( ComputationCommitment { comm }, @@ -822,18 +688,14 @@ impl SNARK { // Given information regarding a group of memory assignments, generate w2, w3, and w3_shifted fn mem_gen( total_num_mem_accesses: usize, - mems_list: &Vec>, - comb_r: &Scalar, - comb_tau: &Scalar, - vars_gens: &R1CSGens, - transcript: &mut Transcript, + mems_list: &Vec>, + comb_r: &S, + comb_tau: &S, + _transcript: &mut Transcript, ) -> ( - ProverWitnessSecInfo, - PolyCommitment, - ProverWitnessSecInfo, - PolyCommitment, - ProverWitnessSecInfo, - PolyCommitment, + ProverWitnessSecInfo, + ProverWitnessSecInfo, + ProverWitnessSecInfo, ) { if total_num_mem_accesses > 0 { // init_mem_w2 is (I, O, ZO, r * data, 0, 0) @@ -841,22 +703,22 @@ impl SNARK { let mut mem_w2 = Vec::new(); for q in 0..total_num_mem_accesses { - mem_w2.push(vec![ZERO; MEM_WIDTH]); - mem_w2[q][3] = comb_r * mems_list[q][3]; + mem_w2.push(vec![S::field_zero(); MEM_WIDTH]); + mem_w2[q][3] = *comb_r * mems_list[q][3]; } // init_mems_w3 is (v, x, pi, D, I, O) // where I = v * (v + addr + r * data + r^2 * ls + r^3 * ts), // O = v * v = v // are used by (dummy) consistency check - let mut mem_w3 = vec![vec![ZERO; W3_WIDTH]; total_num_mem_accesses]; + let mut mem_w3 = vec![vec![S::field_zero(); W3_WIDTH]; total_num_mem_accesses]; for q in (0..total_num_mem_accesses).rev() { // v mem_w3[q][0] = mems_list[q][0]; // x = v * (tau - addr - r * data - r^2 * ls - r^3 * ts) - mem_w3[q][1] = mems_list[q][0] * (comb_tau - mems_list[q][2] - mem_w2[q][3]); + mem_w3[q][1] = mems_list[q][0] * (*comb_tau - mems_list[q][2] - mem_w2[q][3]); // pi and D if q != total_num_mem_accesses - 1 { - mem_w3[q][3] = mem_w3[q][1] * (mem_w3[q + 1][2] + ONE - mem_w3[q + 1][0]); + mem_w3[q][3] = mem_w3[q][1] * (mem_w3[q + 1][2] + S::field_one() - mem_w3[q + 1][0]); } else { mem_w3[q][3] = mem_w3[q][1]; } @@ -865,94 +727,51 @@ impl SNARK { mem_w3[q][5] = mems_list[q][0]; } - let ( - mem_poly_w2, - mem_comm_w2, - mem_poly_w3, - mem_comm_w3, - mem_poly_w3_shifted, - mem_comm_w3_shifted, - ) = { - let (mem_poly_w2, mem_comm_w2) = { + let (mem_poly_w2, mem_poly_w3, mem_poly_w3_shifted) = { + let mem_poly_w2 = { // Flatten the witnesses into a Q_i * X list let w2_list_p = mem_w2.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let mem_poly_w2 = DensePolynomial::new(w2_list_p); - - // produce a commitment to the satisfying assignment - let (mem_comm_w2, _blinds_vars) = mem_poly_w2.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - mem_comm_w2.append_to_transcript(b"poly_commitment", transcript); - (mem_poly_w2, mem_comm_w2) + mem_poly_w2 }; - let (mem_poly_w3, mem_comm_w3) = { + let mem_poly_w3 = { // Flatten the witnesses into a Q_i * X list let w3_list_p = mem_w3.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let mem_poly_w3 = DensePolynomial::new(w3_list_p); - - // produce a commitment to the satisfying assignment - let (mem_comm_w3, _blinds_vars) = mem_poly_w3.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - mem_comm_w3.append_to_transcript(b"poly_commitment", transcript); - (mem_poly_w3, mem_comm_w3) + mem_poly_w3 }; - let (mem_poly_w3_shifted, mem_comm_w3_shifted) = { + let mem_poly_w3_shifted = { // Flatten the witnesses into a Q_i * X list let w3_list_p = [ mem_w3[1..].to_vec().clone().into_iter().flatten().collect(), - vec![ZERO; W3_WIDTH], + vec![S::field_zero(); W3_WIDTH], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables let mem_poly_w3_shifted = DensePolynomial::new(w3_list_p); - - // produce a commitment to the satisfying assignment - let (mem_comm_w3_shifted, _blinds_vars) = - mem_poly_w3_shifted.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - mem_comm_w3_shifted.append_to_transcript(b"poly_commitment", transcript); - (mem_poly_w3_shifted, mem_comm_w3_shifted) + mem_poly_w3_shifted }; - ( - mem_poly_w2, - mem_comm_w2, - mem_poly_w3, - mem_comm_w3, - mem_poly_w3_shifted, - mem_comm_w3_shifted, - ) + (mem_poly_w2, mem_poly_w3, mem_poly_w3_shifted) }; let mem_w2_prover = ProverWitnessSecInfo::new(vec![mem_w2], vec![mem_poly_w2]); let mem_w3_prover = ProverWitnessSecInfo::new(vec![mem_w3.clone()], vec![mem_poly_w3]); let mem_w3_shifted_prover = ProverWitnessSecInfo::new( - vec![[mem_w3[1..].to_vec(), vec![vec![ZERO; W3_WIDTH]]].concat()], + vec![[mem_w3[1..].to_vec(), vec![vec![S::field_zero(); W3_WIDTH]]].concat()], vec![mem_poly_w3_shifted], ); - ( - mem_w2_prover, - mem_comm_w2, - mem_w3_prover, - mem_comm_w3, - mem_w3_shifted_prover, - mem_comm_w3_shifted, - ) + (mem_w2_prover, mem_w3_prover, mem_w3_shifted_prover) } else { ( ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ) } } @@ -982,36 +801,31 @@ impl SNARK { block_num_instances_bound: usize, block_max_num_proofs: usize, block_num_proofs: &Vec, - block_inst: &mut Instance, + block_inst: &mut Instance, block_comm_map: &Vec>, - block_comm_list: &Vec, - block_decomm_list: &Vec, - block_gens: &SNARKGens, + block_comm_list: &Vec>, + block_decomm_list: &Vec>, consis_num_proofs: usize, total_num_init_phy_mem_accesses: usize, total_num_init_vir_mem_accesses: usize, total_num_phy_mem_accesses: usize, total_num_vir_mem_accesses: usize, - pairwise_check_inst: &mut Instance, - pairwise_check_comm: &ComputationCommitment, - pairwise_check_decomm: &ComputationDecommitment, - pairwise_check_gens: &SNARKGens, - - block_vars_mat: Vec>, - exec_inputs_list: Vec, - init_phy_mems_list: Vec, - init_vir_mems_list: Vec, - addr_phy_mems_list: Vec, - addr_vir_mems_list: Vec, - addr_ts_bits_list: Vec, - - perm_root_inst: &Instance, - perm_root_comm: &ComputationCommitment, - perm_root_decomm: &ComputationDecommitment, - perm_root_gens: &SNARKGens, - - vars_gens: &R1CSGens, + pairwise_check_inst: &mut Instance, + pairwise_check_comm: &ComputationCommitment, + pairwise_check_decomm: &ComputationDecommitment, + + block_vars_mat: Vec>>, + exec_inputs_list: Vec>, + init_phy_mems_list: Vec>, + init_vir_mems_list: Vec>, + addr_phy_mems_list: Vec>, + addr_vir_mems_list: Vec>, + addr_ts_bits_list: Vec>, + + perm_root_inst: &Instance, + perm_root_comm: &ComputationCommitment, + perm_root_decomm: &ComputationDecommitment, transcript: &mut Transcript, ) -> Self { let timer_prove = Timer::new("SNARK::prove"); @@ -1020,7 +834,10 @@ impl SNARK { // to aid the prover produce its randomness let mut random_tape = RandomTape::new(b"proof"); - transcript.append_protocol_name(SNARK::protocol_name()); + >::append_protocol_name( + transcript, + SNARK::::protocol_name(), + ); // -- // ASSERTIONS @@ -1035,72 +852,122 @@ impl SNARK { // PREPROCESSING // -- // unwrap the assignments - fn unwrap_assignment(assigned: Vec) -> Vec> { - assigned.into_iter().map(|v| v.assignment).collect() - } - let mut block_vars_mat: Vec<_> = block_vars_mat.into_iter().map(unwrap_assignment).collect(); - let mut exec_inputs_list: Vec<_> = unwrap_assignment(exec_inputs_list); - let mut init_phy_mems_list = unwrap_assignment(init_phy_mems_list); - let mut init_vir_mems_list = unwrap_assignment(init_vir_mems_list); - let mut addr_phy_mems_list = unwrap_assignment(addr_phy_mems_list); - let mut addr_vir_mems_list = unwrap_assignment(addr_vir_mems_list); - let mut addr_ts_bits_list = unwrap_assignment(addr_ts_bits_list); + let mut block_vars_mat = block_vars_mat + .into_iter() + .map(|a| a.into_iter().map(|v| v.assignment).collect::>>()) + .collect::>>>(); + let mut exec_inputs_list = exec_inputs_list + .into_iter() + .map(|v| v.assignment) + .collect::>>(); + let mut init_phy_mems_list = init_phy_mems_list + .into_iter() + .map(|v| v.assignment) + .collect::>>(); + let mut init_vir_mems_list = init_vir_mems_list + .into_iter() + .map(|v| v.assignment) + .collect::>>(); + let mut addr_phy_mems_list = addr_phy_mems_list + .into_iter() + .map(|v| v.assignment) + .collect::>>(); + let mut addr_vir_mems_list = addr_vir_mems_list + .into_iter() + .map(|v| v.assignment) + .collect::>>(); + let mut addr_ts_bits_list = addr_ts_bits_list + .into_iter() + .map(|v| v.assignment) + .collect::>>(); // -- // INSTANCE COMMITMENTS // -- - let input_block_num = Scalar::from(input_block_num as u64); - let output_block_num = Scalar::from(output_block_num as u64); - let input: Vec = input - .iter() - .map(|i| Scalar::from_bytes(i).unwrap()) - .collect(); - let output: Scalar = Scalar::from_bytes(output).unwrap(); + let input_block_num = S::from(input_block_num as u64); + let output_block_num = S::from(output_block_num as u64); + let input: Vec = input.iter().map(|i| S::from_bytes(i).unwrap()).collect(); + let output: S = S::from_bytes(output).unwrap(); { let timer_commit = Timer::new("inst_commit"); // Commit public parameters - Scalar::from(func_input_width as u64).append_to_transcript(b"func_input_width", transcript); - Scalar::from(input_offset as u64).append_to_transcript(b"input_offset", transcript); - Scalar::from(output_offset as u64).append_to_transcript(b"output_offset", transcript); - Scalar::from(output_exec_num as u64).append_to_transcript(b"output_exec_num", transcript); - Scalar::from(num_ios as u64).append_to_transcript(b"num_ios", transcript); + S::append_field_to_transcript( + b"func_input_width", + transcript, + S::from(func_input_width as u64), + ); + S::append_field_to_transcript(b"input_offset", transcript, S::from(input_offset as u64)); + S::append_field_to_transcript(b"output_offset", transcript, S::from(output_offset as u64)); + S::append_field_to_transcript( + b"output_exec_num", + transcript, + S::from(output_exec_num as u64), + ); + S::append_field_to_transcript(b"num_ios", transcript, S::from(num_ios as u64)); + for n in block_num_vars { - Scalar::from(*n as u64).append_to_transcript(b"block_num_vars", transcript); + S::append_field_to_transcript(b"block_num_vars", transcript, S::from(*n as u64)); } - Scalar::from(mem_addr_ts_bits_size as u64) - .append_to_transcript(b"mem_addr_ts_bits_size", transcript); - Scalar::from(num_inputs_unpadded as u64) - .append_to_transcript(b"num_inputs_unpadded", transcript); - Scalar::from(block_num_instances_bound as u64) - .append_to_transcript(b"block_num_instances_bound", transcript); - Scalar::from(block_max_num_proofs as u64) - .append_to_transcript(b"block_max_num_proofs", transcript); + S::append_field_to_transcript( + b"mem_addr_ts_bits_size", + transcript, + S::from(mem_addr_ts_bits_size as u64), + ); + S::append_field_to_transcript( + b"num_inputs_unpadded", + transcript, + S::from(num_inputs_unpadded as u64), + ); + S::append_field_to_transcript( + b"block_num_instances_bound", + transcript, + S::from(block_num_instances_bound as u64), + ); + S::append_field_to_transcript( + b"block_max_num_proofs", + transcript, + S::from(block_max_num_proofs as u64), + ); for p in block_num_phy_ops { - Scalar::from(*p as u64).append_to_transcript(b"block_num_phy_ops", transcript); + S::append_field_to_transcript(b"block_num_phy_ops", transcript, S::from(*p as u64)); } for v in block_num_vir_ops { - Scalar::from(*v as u64).append_to_transcript(b"block_num_vir_ops", transcript); + S::append_field_to_transcript(b"block_num_vir_ops", transcript, S::from(*v as u64)); } - Scalar::from(total_num_init_phy_mem_accesses as u64) - .append_to_transcript(b"total_num_init_phy_mem_accesses", transcript); - Scalar::from(total_num_init_vir_mem_accesses as u64) - .append_to_transcript(b"total_num_init_vir_mem_accesses", transcript); - Scalar::from(total_num_phy_mem_accesses as u64) - .append_to_transcript(b"total_num_phy_mem_accesses", transcript); - Scalar::from(total_num_vir_mem_accesses as u64) - .append_to_transcript(b"total_num_vir_mem_accesses", transcript); - + S::append_field_to_transcript( + b"total_num_init_phy_mem_accesses", + transcript, + S::from(total_num_init_phy_mem_accesses as u64), + ); + S::append_field_to_transcript( + b"total_num_init_vir_mem_accesses", + transcript, + S::from(total_num_init_vir_mem_accesses as u64), + ); + S::append_field_to_transcript( + b"total_num_phy_mem_accesses", + transcript, + S::from(total_num_phy_mem_accesses as u64), + ); + S::append_field_to_transcript( + b"total_num_vir_mem_accesses", + transcript, + S::from(total_num_vir_mem_accesses as u64), + ); // commit num_proofs - Scalar::from(block_max_num_proofs as u64) - .append_to_transcript(b"block_max_num_proofs", transcript); + S::append_field_to_transcript( + b"block_max_num_proofs", + transcript, + S::from(block_max_num_proofs as u64), + ); for n in block_num_proofs { - Scalar::from(*n as u64).append_to_transcript(b"block_num_proofs", transcript); + S::append_field_to_transcript(b"block_num_proofs", transcript, S::from(*n as u64)); } // append a commitment to the computation to the transcript for b in block_comm_map { for l in b { - Scalar::from(*l as u64).append_to_transcript(b"block_comm_map", transcript); + S::append_field_to_transcript(b"block_comm_map", transcript, S::from(*l as u64)); } } for c in block_comm_list { @@ -1114,10 +981,10 @@ impl SNARK { .append_to_transcript(b"perm_comm", transcript); // Commit io - input_block_num.append_to_transcript(b"input_block_num", transcript); - output_block_num.append_to_transcript(b"output_block_num", transcript); - input.append_to_transcript(b"input_list", transcript); - output.append_to_transcript(b"output_list", transcript); + S::append_field_to_transcript(b"input_block_num", transcript, input_block_num); + S::append_field_to_transcript(b"output_block_num", transcript, output_block_num); + S::append_field_vector_to_transcript(b"input_list", transcript, &input); + S::append_field_to_transcript(b"output_list", transcript, output); timer_commit.stop(); } @@ -1161,11 +1028,11 @@ impl SNARK { // -- // PADDING // -- - let dummy_inputs = vec![ZERO; num_ios]; + let dummy_inputs = vec![S::field_zero(); num_ios]; // For every block that num_proofs is not a power of 2, pad vars_mat and inputs_mat until the length is a power of 2 let block_max_num_proofs = block_max_num_proofs.next_power_of_two(); for i in 0..block_num_instances { - let dummy_vars = vec![ZERO; block_vars_mat[i][0].len()]; + let dummy_vars = vec![S::field_zero(); block_vars_mat[i][0].len()]; let gap = block_num_proofs[i].next_power_of_two() - block_num_proofs[i]; block_vars_mat[i].extend(vec![dummy_vars.clone(); gap]); block_num_proofs[i] = block_num_proofs[i].next_power_of_two(); @@ -1180,7 +1047,7 @@ impl SNARK { // Pad init_mems with dummys so the length is a power of 2 if total_num_init_phy_mem_accesses > 0 { - let dummy_addr = vec![ZERO; INIT_PHY_MEM_WIDTH]; + let dummy_addr = vec![S::field_zero(); INIT_PHY_MEM_WIDTH]; init_phy_mems_list.extend(vec![ dummy_addr; total_num_init_phy_mem_accesses.next_power_of_two() @@ -1193,7 +1060,7 @@ impl SNARK { total_num_init_phy_mem_accesses.next_power_of_two() }; if total_num_init_vir_mem_accesses > 0 { - let dummy_addr = vec![ZERO; INIT_VIR_MEM_WIDTH]; + let dummy_addr = vec![S::field_zero(); INIT_VIR_MEM_WIDTH]; init_vir_mems_list.extend(vec![ dummy_addr; total_num_init_vir_mem_accesses.next_power_of_two() @@ -1207,7 +1074,7 @@ impl SNARK { }; // Pad addr_phy_mems with dummys so the length is a power of 2 if total_num_phy_mem_accesses > 0 { - let dummy_addr = vec![ZERO; PHY_MEM_WIDTH]; + let dummy_addr = vec![S::field_zero(); PHY_MEM_WIDTH]; addr_phy_mems_list.extend(vec![ dummy_addr; total_num_phy_mem_accesses.next_power_of_two() @@ -1221,13 +1088,13 @@ impl SNARK { }; // Pad addr_vir_mems with dummys so the length is a power of 2 if total_num_vir_mem_accesses > 0 { - let dummy_addr = vec![ZERO; VIR_MEM_WIDTH]; + let dummy_addr = vec![S::field_zero(); VIR_MEM_WIDTH]; addr_vir_mems_list.extend(vec![ dummy_addr; total_num_vir_mem_accesses.next_power_of_two() - total_num_vir_mem_accesses ]); - let dummy_ts = vec![ZERO; mem_addr_ts_bits_size]; + let dummy_ts = vec![S::field_zero(); mem_addr_ts_bits_size]; addr_ts_bits_list.extend(vec![ dummy_ts; total_num_vir_mem_accesses.next_power_of_two() @@ -1276,19 +1143,13 @@ impl SNARK { perm_w0_prover, // perm_exec perm_exec_w2_prover, - perm_exec_comm_w2_list, perm_exec_w3_prover, - perm_exec_comm_w3_list, perm_exec_w3_shifted_prover, // shifted by W3_WIDTH - perm_exec_comm_w3_shifted, // input_block_w2 | phy_mem_block_w2 | vir_mem_block_w2 block_w2_prover, - block_comm_w2_list, // block_w3 block_w3_prover, - block_comm_w3_list, block_w3_shifted_prover, // shifted by W3_WIDTH - block_comm_w3_list_shifted, ) = { let comb_tau = transcript.challenge_scalar(b"challenge_tau"); let comb_r = transcript.challenge_scalar(b"challenge_r"); @@ -1301,32 +1162,28 @@ impl SNARK { let mut r_tmp = comb_r; for _ in 1..2 * num_inputs_unpadded { perm_w0.push(r_tmp); - r_tmp *= comb_r; + r_tmp = r_tmp * comb_r; } - perm_w0.extend(vec![ZERO; num_ios - 2 * num_inputs_unpadded]); + perm_w0.extend(vec![S::field_zero(); num_ios - 2 * num_inputs_unpadded]); perm_w0 }; // create a multilinear polynomial using the supplied assignment for variables let perm_poly_w0 = DensePolynomial::new(perm_w0.clone()); - // produce a commitment to the satisfying assignment - let (perm_comm_w0, _blinds_vars) = perm_poly_w0.commit(&vars_gens.gens_pc, None); - // add the commitment to the prover's transcript - perm_comm_w0.append_to_transcript(b"poly_commitment", transcript); // PERM_EXEC // w2 is _, _, ZO, r * i1, r^2 * i2, r^3 * i3, ... // where ZO * r^n = r^n * o0 + r^(n + 1) * o1, ..., // are used by the consistency check let perm_exec_w2 = { - let mut perm_exec_w2: Vec> = exec_inputs_list + let mut perm_exec_w2: Vec> = exec_inputs_list .iter() .map(|input| { [ - vec![ZERO; 3], + vec![S::field_zero(); 3], (1..2 * num_inputs_unpadded - 2) .map(|j| perm_w0[j] * input[j + 2]) .collect(), - vec![ZERO; num_ios - 2 * num_inputs_unpadded], + vec![S::field_zero(); num_ios - 2 * num_inputs_unpadded], ] .concat() }) @@ -1335,32 +1192,35 @@ impl SNARK { perm_exec_w2[q][0] = exec_inputs_list[q][0]; perm_exec_w2[q][1] = exec_inputs_list[q][0]; for i in 0..num_inputs_unpadded - 1 { - let perm = if i == 0 { ONE } else { perm_w0[i] }; - perm_exec_w2[q][0] += perm * exec_inputs_list[q][2 + i]; - perm_exec_w2[q][2] += perm * exec_inputs_list[q][2 + (num_inputs_unpadded - 1) + i]; + let perm = if i == 0 { S::field_one() } else { perm_w0[i] }; + perm_exec_w2[q][0] = perm_exec_w2[q][0] + perm * exec_inputs_list[q][2 + i]; + perm_exec_w2[q][2] = + perm_exec_w2[q][2] + perm * exec_inputs_list[q][2 + (num_inputs_unpadded - 1) + i]; } - perm_exec_w2[q][0] *= exec_inputs_list[q][0]; + perm_exec_w2[q][0] = perm_exec_w2[q][0] * exec_inputs_list[q][0]; let ZO = perm_exec_w2[q][2]; - perm_exec_w2[q][1] += ZO; - perm_exec_w2[q][1] *= exec_inputs_list[q][0]; + perm_exec_w2[q][1] = perm_exec_w2[q][1] + ZO; + perm_exec_w2[q][1] = perm_exec_w2[q][1] * exec_inputs_list[q][0]; } perm_exec_w2 }; // w3 is [v, x, pi, D] let perm_exec_w3 = { - let mut perm_exec_w3: Vec> = vec![Vec::new(); consis_num_proofs]; + let mut perm_exec_w3: Vec> = vec![Vec::new(); consis_num_proofs]; for q in (0..consis_num_proofs).rev() { - perm_exec_w3[q] = vec![ZERO; 8]; + perm_exec_w3[q] = vec![S::field_zero(); 8]; perm_exec_w3[q][0] = exec_inputs_list[q][0]; perm_exec_w3[q][1] = perm_exec_w3[q][0] * (comb_tau - - perm_exec_w2[q][3..].iter().fold(ZERO, |a, b| a + b) + - perm_exec_w2[q][3..] + .iter() + .fold(S::field_zero(), |a, b| a + *b) - exec_inputs_list[q][2]); perm_exec_w3[q][4] = perm_exec_w2[q][0]; perm_exec_w3[q][5] = perm_exec_w2[q][1]; if q != consis_num_proofs - 1 { - perm_exec_w3[q][3] = - perm_exec_w3[q][1] * (perm_exec_w3[q + 1][2] + ONE - perm_exec_w3[q + 1][0]); + perm_exec_w3[q][3] = perm_exec_w3[q][1] + * (perm_exec_w3[q + 1][2] + S::field_one() - perm_exec_w3[q + 1][0]); } else { perm_exec_w3[q][3] = perm_exec_w3[q][1]; } @@ -1369,45 +1229,26 @@ impl SNARK { perm_exec_w3 }; // commit the witnesses and inputs separately instance-by-instance - let ( - perm_exec_poly_w2, - perm_exec_comm_w2, - perm_exec_poly_w3, - perm_exec_comm_w3, - perm_exec_poly_w3_shifted, - perm_exec_comm_w3_shifted, - ) = { - let (perm_exec_poly_w2, perm_exec_comm_w2) = { + let (perm_exec_poly_w2, perm_exec_poly_w3, perm_exec_poly_w3_shifted) = { + let perm_exec_poly_w2 = { // Flatten the witnesses into a Q_i * X list let w2_list_p = perm_exec_w2.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let perm_exec_poly_w2 = DensePolynomial::new(w2_list_p); - // produce a commitment to the satisfying assignment - let (perm_exec_comm_w2, _blinds_vars) = - perm_exec_poly_w2.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - perm_exec_comm_w2.append_to_transcript(b"poly_commitment", transcript); - (perm_exec_poly_w2, perm_exec_comm_w2) + perm_exec_poly_w2 }; - let (perm_exec_poly_w3, perm_exec_comm_w3) = { + let perm_exec_poly_w3 = { // Flatten the witnesses into a Q_i * X list let w3_list_p = perm_exec_w3.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let perm_exec_poly_w3 = DensePolynomial::new(w3_list_p); - // produce a commitment to the satisfying assignment - let (perm_exec_comm_w3, _blinds_vars) = - perm_exec_poly_w3.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - perm_exec_comm_w3.append_to_transcript(b"poly_commitment", transcript); - (perm_exec_poly_w3, perm_exec_comm_w3) + perm_exec_poly_w3 }; - let (perm_exec_poly_w3_shifted, perm_exec_comm_w3_shifted) = { + let perm_exec_poly_w3_shifted = { // Flatten the witnesses into a Q_i * X list let w3_list_p = [ perm_exec_w3[1..] @@ -1416,28 +1257,19 @@ impl SNARK { .into_iter() .flatten() .collect(), - vec![ZERO; 8], + vec![S::field_zero(); 8], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables let perm_exec_poly_w3_shifted = DensePolynomial::new(w3_list_p); - // produce a commitment to the satisfying assignment - let (perm_exec_comm_w3_shifted, _blinds_vars) = - perm_exec_poly_w3_shifted.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - perm_exec_comm_w3_shifted.append_to_transcript(b"poly_commitment", transcript); - (perm_exec_poly_w3_shifted, perm_exec_comm_w3_shifted) + perm_exec_poly_w3_shifted }; ( perm_exec_poly_w2, - perm_exec_comm_w2, perm_exec_poly_w3, - perm_exec_comm_w3, perm_exec_poly_w3_shifted, - perm_exec_comm_w3_shifted, ) }; @@ -1445,8 +1277,8 @@ impl SNARK { // BLOCK_W3 // INPUT PHY VIR // w3 is [v, x, pi, D, pi, D, pi, D] - let mut block_w3: Vec>> = Vec::new(); - let (block_w2_prover, block_comm_w2_list) = { + let mut block_w3: Vec>> = Vec::new(); + let block_w2_prover = { let mut block_w2 = Vec::new(); let block_w2_size_list: Vec = (0..block_num_instances) .map(|i| { @@ -1484,31 +1316,35 @@ impl SNARK { for q in (0..block_num_proofs[p]).rev() { let V_CNST = block_vars_mat[p][q][0]; // For INPUT - block_w2[p][q] = vec![ZERO; block_w2_size_list[p]]; + block_w2[p][q] = vec![S::field_zero(); block_w2_size_list[p]]; block_w2[p][q][0] = block_vars_mat[p][q][0]; block_w2[p][q][1] = block_vars_mat[p][q][0]; for i in 1..2 * (num_inputs_unpadded - 1) { - block_w2[p][q][2 + i] += perm_w0[i] * block_vars_mat[p][q][i + 2]; + block_w2[p][q][2 + i] = + block_w2[p][q][2 + i] + perm_w0[i] * block_vars_mat[p][q][i + 2]; } for i in 0..num_inputs_unpadded - 1 { - let perm = if i == 0 { ONE } else { perm_w0[i] }; - block_w2[p][q][0] += perm * block_vars_mat[p][q][2 + i]; - block_w2[p][q][2] += perm * block_vars_mat[p][q][2 + (num_inputs_unpadded - 1) + i]; + let perm = if i == 0 { S::field_one() } else { perm_w0[i] }; + block_w2[p][q][0] = block_w2[p][q][0] + perm * block_vars_mat[p][q][2 + i]; + block_w2[p][q][2] = + block_w2[p][q][2] + perm * block_vars_mat[p][q][2 + (num_inputs_unpadded - 1) + i]; } - block_w2[p][q][0] *= block_vars_mat[p][q][0]; + block_w2[p][q][0] = block_w2[p][q][0] * block_vars_mat[p][q][0]; let ZO = block_w2[p][q][2]; - block_w2[p][q][1] += ZO; - block_w2[p][q][1] *= block_vars_mat[p][q][0]; - block_w3[p][q] = vec![ZERO; 8]; + block_w2[p][q][1] = block_w2[p][q][1] + ZO; + block_w2[p][q][1] = block_w2[p][q][1] * block_vars_mat[p][q][0]; + block_w3[p][q] = vec![S::field_zero(); 8]; block_w3[p][q][0] = block_vars_mat[p][q][0]; block_w3[p][q][1] = block_w3[p][q][0] * (comb_tau - - block_w2[p][q][3..].iter().fold(ZERO, |a, b| a + b) + - block_w2[p][q][3..] + .iter() + .fold(S::field_zero(), |a, b| a + *b) - block_vars_mat[p][q][2]); if q != block_num_proofs[p] - 1 { - block_w3[p][q][3] = - block_w3[p][q][1] * (block_w3[p][q + 1][2] + ONE - block_w3[p][q + 1][0]); + block_w3[p][q][3] = block_w3[p][q][1] + * (block_w3[p][q + 1][2] + S::field_one() - block_w3[p][q + 1][0]); } else { block_w3[p][q][3] = block_w3[p][q][1]; } @@ -1536,7 +1372,8 @@ impl SNARK { }; // Compute D and pi if q != block_num_proofs[p] - 1 { - block_w3[p][q][5] = px * (block_w3[p][q + 1][4] + ONE - block_w3[p][q + 1][0]); + block_w3[p][q][5] = + px * (block_w3[p][q + 1][4] + S::field_one() - block_w3[p][q + 1][0]); } else { block_w3[p][q][5] = px; } @@ -1574,7 +1411,8 @@ impl SNARK { }; // Compute D and pi if q != block_num_proofs[p] - 1 { - block_w3[p][q][7] = vx * (block_w3[p][q + 1][6] + ONE - block_w3[p][q + 1][0]); + block_w3[p][q][7] = + vx * (block_w3[p][q + 1][6] + S::field_one() - block_w3[p][q + 1][0]); } else { block_w3[p][q][7] = vx; } @@ -1584,56 +1422,36 @@ impl SNARK { // commit the witnesses and inputs separately instance-by-instance let mut block_poly_w2_list = Vec::new(); - let mut block_comm_w2_list = Vec::new(); for p in 0..block_num_instances { - let (block_poly_w2, block_comm_w2) = { + let block_poly_w2 = { // Flatten the witnesses into a Q_i * X list let w2_list_p = block_w2[p].clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let block_poly_w2 = DensePolynomial::new(w2_list_p); - // produce a commitment to the satisfying assignment - let (block_comm_w2, _blinds_vars) = block_poly_w2.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - block_comm_w2.append_to_transcript(b"poly_commitment", transcript); - (block_poly_w2, block_comm_w2) + block_poly_w2 }; block_poly_w2_list.push(block_poly_w2); - block_comm_w2_list.push(block_comm_w2); } let block_w2_prover = ProverWitnessSecInfo::new(block_w2.clone(), block_poly_w2_list); - (block_w2_prover, block_comm_w2_list) - }; - let ( - block_poly_w3_list, - block_comm_w3_list, - block_poly_w3_list_shifted, - block_comm_w3_list_shifted, - ) = { + block_w2_prover + }; + let (block_poly_w3_list, block_poly_w3_list_shifted) = { let mut block_poly_w3_list = Vec::new(); - let mut block_comm_w3_list = Vec::new(); let mut block_poly_w3_list_shifted = Vec::new(); - let mut block_comm_w3_list_shifted = Vec::new(); for p in 0..block_num_instances { - let (block_poly_w3, block_comm_w3) = { + let block_poly_w3 = { // Flatten the witnesses into a Q_i * X list let w3_list_p = block_w3[p].clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let block_poly_w3 = DensePolynomial::new(w3_list_p); - - // produce a commitment to the satisfying assignment - let (block_comm_w3, _blinds_vars) = block_poly_w3.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - block_comm_w3.append_to_transcript(b"poly_commitment", transcript); - (block_poly_w3, block_comm_w3) + block_poly_w3 }; - let (block_poly_w3_shifted, block_comm_w3_shifted) = { + let block_poly_w3_shifted = { // Flatten the witnesses into a Q_i * X list let w3_list_p = [ block_w3[p][1..] @@ -1642,32 +1460,18 @@ impl SNARK { .into_iter() .flatten() .collect(), - vec![ZERO; 8], + vec![S::field_zero(); 8], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables let block_poly_w3_shifted = DensePolynomial::new(w3_list_p); - - // produce a commitment to the satisfying assignment - let (block_comm_w3_shifted, _blinds_vars) = - block_poly_w3_shifted.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - block_comm_w3_shifted.append_to_transcript(b"poly_commitment", transcript); - (block_poly_w3_shifted, block_comm_w3_shifted) + block_poly_w3_shifted }; block_poly_w3_list.push(block_poly_w3); - block_comm_w3_list.push(block_comm_w3); block_poly_w3_list_shifted.push(block_poly_w3_shifted); - block_comm_w3_list_shifted.push(block_comm_w3_shifted); } - ( - block_poly_w3_list, - block_comm_w3_list, - block_poly_w3_list_shifted, - block_comm_w3_list_shifted, - ) + (block_poly_w3_list, block_poly_w3_list_shifted) }; let perm_w0_prover = ProverWitnessSecInfo::new(vec![vec![perm_w0]], vec![perm_poly_w0]); @@ -1676,7 +1480,7 @@ impl SNARK { let perm_exec_w3_prover = ProverWitnessSecInfo::new(vec![perm_exec_w3.clone()], vec![perm_exec_poly_w3]); let perm_exec_w3_shifted_prover = ProverWitnessSecInfo::new( - vec![[perm_exec_w3[1..].to_vec(), vec![vec![ZERO; 8]]].concat()], + vec![[perm_exec_w3[1..].to_vec(), vec![vec![S::field_zero(); 8]]].concat()], vec![perm_exec_poly_w3_shifted], ); @@ -1684,7 +1488,7 @@ impl SNARK { let block_w3_shifted_prover = ProverWitnessSecInfo::new( block_w3 .iter() - .map(|i| [i[1..].to_vec(), vec![vec![ZERO; 8]]].concat()) + .map(|i| [i[1..].to_vec(), vec![vec![S::field_zero(); 8]]].concat()) .collect(), block_poly_w3_list_shifted, ); @@ -1694,95 +1498,61 @@ impl SNARK { comb_r, perm_w0_prover, perm_exec_w2_prover, - perm_exec_comm_w2, perm_exec_w3_prover, - perm_exec_comm_w3, perm_exec_w3_shifted_prover, - perm_exec_comm_w3_shifted, block_w2_prover, - block_comm_w2_list, block_w3_prover, - block_comm_w3_list, block_w3_shifted_prover, - block_comm_w3_list_shifted, ) }; timer_sec_gen.stop(); // Initial Physical Memory-as-a-whole let timer_sec_gen = Timer::new("init_phy_mem_witness_gen"); - let ( - init_phy_mem_w2_prover, - init_phy_mem_comm_w2, - init_phy_mem_w3_prover, - init_phy_mem_comm_w3, - init_phy_mem_w3_shifted_prover, - init_phy_mem_comm_w3_shifted, - ) = Self::mem_gen::( - total_num_init_phy_mem_accesses, - &init_phy_mems_list, - &comb_r, - &comb_tau, - vars_gens, - transcript, - ); + let (init_phy_mem_w2_prover, init_phy_mem_w3_prover, init_phy_mem_w3_shifted_prover) = + Self::mem_gen::( + total_num_init_phy_mem_accesses, + &init_phy_mems_list, + &comb_r, + &comb_tau, + transcript, + ); timer_sec_gen.stop(); // Initial Virtual Memory-as-a-whole let timer_sec_gen = Timer::new("init_vir_mem_witness_gen"); - let ( - init_vir_mem_w2_prover, - init_vir_mem_comm_w2, - init_vir_mem_w3_prover, - init_vir_mem_comm_w3, - init_vir_mem_w3_shifted_prover, - init_vir_mem_comm_w3_shifted, - ) = Self::mem_gen::( - total_num_init_vir_mem_accesses, - &init_vir_mems_list, - &comb_r, - &comb_tau, - vars_gens, - transcript, - ); + let (init_vir_mem_w2_prover, init_vir_mem_w3_prover, init_vir_mem_w3_shifted_prover) = + Self::mem_gen::( + total_num_init_vir_mem_accesses, + &init_vir_mems_list, + &comb_r, + &comb_tau, + transcript, + ); timer_sec_gen.stop(); // Physical Memory-as-a-whole let timer_sec_gen = Timer::new("phy_mem_addr_witness_gen"); - let ( - phy_mem_addr_w2_prover, - phy_mem_addr_comm_w2, - phy_mem_addr_w3_prover, - phy_mem_addr_comm_w3, - phy_mem_addr_w3_shifted_prover, - phy_mem_addr_comm_w3_shifted, - ) = Self::mem_gen::( - total_num_phy_mem_accesses, - &addr_phy_mems_list, - &comb_r, - &comb_tau, - vars_gens, - transcript, - ); + let (phy_mem_addr_w2_prover, phy_mem_addr_w3_prover, phy_mem_addr_w3_shifted_prover) = + Self::mem_gen::( + total_num_phy_mem_accesses, + &addr_phy_mems_list, + &comb_r, + &comb_tau, + transcript, + ); timer_sec_gen.stop(); // Virtual Memory-as-a-whole let timer_sec_gen = Timer::new("vir_mem_addr_witness_gen"); - let ( - vir_mem_addr_w2_prover, - vir_mem_addr_comm_w2, - vir_mem_addr_w3_prover, - vir_mem_addr_comm_w3, - vir_mem_addr_w3_shifted_prover, - vir_mem_addr_comm_w3_shifted, - ) = { + let (vir_mem_addr_w2_prover, vir_mem_addr_w3_prover, vir_mem_addr_w3_shifted_prover) = { if total_num_vir_mem_accesses > 0 { // vir_mem_addr_w2 is (I, O, ZO, r * data, r^2 * ls, r^3 * ts) // where ZO = 0, let mut vir_mem_addr_w2 = Vec::new(); for q in 0..total_num_vir_mem_accesses { - vir_mem_addr_w2.push(vec![ZERO; VIR_MEM_WIDTH]); + vir_mem_addr_w2.push(vec![S::field_zero(); VIR_MEM_WIDTH]); vir_mem_addr_w2[q][3] = comb_r * addr_vir_mems_list[q][3]; vir_mem_addr_w2[q][4] = comb_r * comb_r * addr_vir_mems_list[q][4]; vir_mem_addr_w2[q][5] = comb_r * comb_r * comb_r * addr_vir_mems_list[q][5]; @@ -1791,7 +1561,7 @@ impl SNARK { // where I = v * (v + addr + r * data + r^2 * ls + r^3 * ts), // O = v * v = v // are used by (dummy) consistency check - let mut vir_mem_addr_w3 = vec![vec![ZERO; W3_WIDTH]; total_num_vir_mem_accesses]; + let mut vir_mem_addr_w3 = vec![vec![S::field_zero(); W3_WIDTH]; total_num_vir_mem_accesses]; for q in (0..total_num_vir_mem_accesses).rev() { // v vir_mem_addr_w3[q][0] = addr_vir_mems_list[q][0]; @@ -1804,8 +1574,8 @@ impl SNARK { - vir_mem_addr_w2[q][5]); // pi and D if q != total_num_vir_mem_accesses - 1 { - vir_mem_addr_w3[q][3] = - vir_mem_addr_w3[q][1] * (vir_mem_addr_w3[q + 1][2] + ONE - vir_mem_addr_w3[q + 1][0]); + vir_mem_addr_w3[q][3] = vir_mem_addr_w3[q][1] + * (vir_mem_addr_w3[q + 1][2] + S::field_one() - vir_mem_addr_w3[q + 1][0]); } else { vir_mem_addr_w3[q][3] = vir_mem_addr_w3[q][1]; } @@ -1819,45 +1589,24 @@ impl SNARK { vir_mem_addr_w3[q][5] = addr_vir_mems_list[q][0]; } - let ( - vir_mem_addr_poly_w2, - vir_mem_addr_comm_w2, - vir_mem_addr_poly_w3, - vir_mem_addr_comm_w3, - vir_mem_addr_poly_w3_shifted, - vir_mem_addr_comm_w3_shifted, - ) = { - let (vir_mem_addr_poly_w2, vir_mem_addr_comm_w2) = { + let (vir_mem_addr_poly_w2, vir_mem_addr_poly_w3, vir_mem_addr_poly_w3_shifted) = { + let vir_mem_addr_poly_w2 = { // Flatten the witnesses into a Q_i * X list let w2_list_p = vir_mem_addr_w2.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let vir_mem_addr_poly_w2 = DensePolynomial::new(w2_list_p); - - // produce a commitment to the satisfying assignment - let (vir_mem_addr_comm_w2, _blinds_vars) = - vir_mem_addr_poly_w2.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - vir_mem_addr_comm_w2.append_to_transcript(b"poly_commitment", transcript); - (vir_mem_addr_poly_w2, vir_mem_addr_comm_w2) + vir_mem_addr_poly_w2 }; - let (vir_mem_addr_poly_w3, vir_mem_addr_comm_w3) = { + let vir_mem_addr_poly_w3 = { // Flatten the witnesses into a Q_i * X list let w3_list_p = vir_mem_addr_w3.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let vir_mem_addr_poly_w3 = DensePolynomial::new(w3_list_p); - - // produce a commitment to the satisfying assignment - let (vir_mem_addr_comm_w3, _blinds_vars) = - vir_mem_addr_poly_w3.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - vir_mem_addr_comm_w3.append_to_transcript(b"poly_commitment", transcript); - (vir_mem_addr_poly_w3, vir_mem_addr_comm_w3) + vir_mem_addr_poly_w3 }; - let (vir_mem_addr_poly_w3_shifted, vir_mem_addr_comm_w3_shifted) = { + let vir_mem_addr_poly_w3_shifted = { // Flatten the witnesses into a Q_i * X list let w3_list_p = [ vir_mem_addr_w3[1..] @@ -1866,28 +1615,18 @@ impl SNARK { .into_iter() .flatten() .collect(), - vec![ZERO; W3_WIDTH], + vec![S::field_zero(); W3_WIDTH], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables let vir_mem_addr_poly_w3_shifted = DensePolynomial::new(w3_list_p); - - // produce a commitment to the satisfying assignment - let (vir_mem_addr_comm_w3_shifted, _blinds_vars) = - vir_mem_addr_poly_w3_shifted.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - vir_mem_addr_comm_w3_shifted.append_to_transcript(b"poly_commitment", transcript); - (vir_mem_addr_poly_w3_shifted, vir_mem_addr_comm_w3_shifted) + vir_mem_addr_poly_w3_shifted }; ( vir_mem_addr_poly_w2, - vir_mem_addr_comm_w2, vir_mem_addr_poly_w3, - vir_mem_addr_comm_w3, vir_mem_addr_poly_w3_shifted, - vir_mem_addr_comm_w3_shifted, ) }; @@ -1896,26 +1635,24 @@ impl SNARK { let vir_mem_addr_w3_prover = ProverWitnessSecInfo::new(vec![vir_mem_addr_w3.clone()], vec![vir_mem_addr_poly_w3]); let vir_mem_addr_w3_shifted_prover = ProverWitnessSecInfo::new( - vec![[vir_mem_addr_w3[1..].to_vec(), vec![vec![ZERO; W3_WIDTH]]].concat()], + vec![[ + vir_mem_addr_w3[1..].to_vec(), + vec![vec![S::field_zero(); W3_WIDTH]], + ] + .concat()], vec![vir_mem_addr_poly_w3_shifted], ); ( vir_mem_addr_w2_prover, - vir_mem_addr_comm_w2, vir_mem_addr_w3_prover, - vir_mem_addr_comm_w3, vir_mem_addr_w3_shifted_prover, - vir_mem_addr_comm_w3_shifted, ) } else { ( ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ) } }; @@ -1927,111 +1664,68 @@ impl SNARK { // WITNESS COMMITMENTS // -- let timer_commit = Timer::new("input_commit"); - let (block_poly_vars_list, block_comm_vars_list, exec_poly_inputs, exec_comm_inputs) = { + let (block_poly_vars_list, exec_poly_inputs) = { // commit the witnesses and inputs separately instance-by-instance let mut block_poly_vars_list = Vec::new(); - let mut block_comm_vars_list = Vec::new(); for p in 0..block_num_instances { - let (block_poly_vars, block_comm_vars) = { + let block_poly_vars = { // Flatten the witnesses into a Q_i * X list - let vars_list_p: Vec = block_vars_mat[p].clone().into_iter().flatten().collect(); + let vars_list_p: Vec = block_vars_mat[p].clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let block_poly_vars = DensePolynomial::new(vars_list_p); - - // produce a commitment to the satisfying assignment - let (block_comm_vars, _blinds_vars) = block_poly_vars.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - block_comm_vars.append_to_transcript(b"poly_commitment", transcript); - (block_poly_vars, block_comm_vars) + block_poly_vars }; block_poly_vars_list.push(block_poly_vars); - block_comm_vars_list.push(block_comm_vars); } - let (exec_poly_inputs, exec_comm_inputs) = { + let exec_poly_inputs = { let exec_inputs = exec_inputs_list.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let exec_poly_inputs = DensePolynomial::new(exec_inputs); - - // produce a commitment to the satisfying assignment - let (exec_comm_inputs, _blinds_inputs) = exec_poly_inputs.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - exec_comm_inputs.append_to_transcript(b"poly_commitment", transcript); - (exec_poly_inputs, exec_comm_inputs) + exec_poly_inputs }; - ( - block_poly_vars_list, - block_comm_vars_list, - vec![exec_poly_inputs], - vec![exec_comm_inputs], - ) + (block_poly_vars_list, vec![exec_poly_inputs]) }; - let (poly_init_phy_mems, _comm_init_phy_mems) = { + let (poly_init_phy_mems,) = { if total_num_init_phy_mem_accesses > 0 { - let (poly_init_mems, comm_init_mems) = { + let poly_init_mems = { let init_mems = init_phy_mems_list.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let poly_init_mems = DensePolynomial::new(init_mems); - - // produce a commitment to the satisfying assignment - let (comm_init_mems, _blinds_inputs) = poly_init_mems.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - comm_init_mems.append_to_transcript(b"poly_commitment", transcript); - (poly_init_mems, comm_init_mems) + poly_init_mems }; - (vec![poly_init_mems], vec![comm_init_mems]) + (vec![poly_init_mems],) } else { - (Vec::new(), Vec::new()) + (Vec::new(),) } }; - let (poly_init_vir_mems, _comm_init_vir_mems) = { + let (poly_init_vir_mems,) = { if total_num_init_vir_mem_accesses > 0 { - let (poly_init_mems, comm_init_mems) = { + let poly_init_mems = { let init_mems = init_vir_mems_list.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let poly_init_mems = DensePolynomial::new(init_mems); - - // produce a commitment to the satisfying assignment - let (comm_init_mems, _blinds_inputs) = poly_init_mems.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - comm_init_mems.append_to_transcript(b"poly_commitment", transcript); - (poly_init_mems, comm_init_mems) + poly_init_mems }; - (vec![poly_init_mems], vec![comm_init_mems]) + (vec![poly_init_mems],) } else { - (Vec::new(), Vec::new()) + (Vec::new(),) } }; - let ( - addr_poly_phy_mems, - addr_comm_phy_mems, - addr_phy_mems_shifted_prover, - addr_comm_phy_mems_shifted, - ) = { + let (addr_poly_phy_mems, addr_phy_mems_shifted_prover) = { if total_num_phy_mem_accesses > 0 { - let (addr_poly_phy_mems, addr_comm_phy_mems) = { + let addr_poly_phy_mems = { let addr_phy_mems = addr_phy_mems_list.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let addr_poly_phy_mems = DensePolynomial::new(addr_phy_mems); - - // produce a commitment to the satisfying assignment - let (addr_comm_phy_mems, _blinds_inputs) = - addr_poly_phy_mems.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - addr_comm_phy_mems.append_to_transcript(b"poly_commitment", transcript); - (addr_poly_phy_mems, addr_comm_phy_mems) + addr_poly_phy_mems }; // Remove the first entry and shift the remaining entries up by one // Used later by coherence check - let (addr_phy_mems_shifted_prover, addr_comm_phy_mems_shifted) = { + let addr_phy_mems_shifted_prover = { let addr_phy_mems_shifted = [ addr_phy_mems_list[1..] .to_vec() @@ -2039,70 +1733,37 @@ impl SNARK { .into_iter() .flatten() .collect(), - vec![ZERO; PHY_MEM_WIDTH], + vec![S::field_zero(); PHY_MEM_WIDTH], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables let addr_poly_phy_mems_shifted = DensePolynomial::new(addr_phy_mems_shifted); - - // produce a commitment to the satisfying assignment - let (addr_comm_phy_mems_shifted, _blinds_inputs) = - addr_poly_phy_mems_shifted.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - addr_comm_phy_mems_shifted.append_to_transcript(b"poly_commitment", transcript); - let addr_phy_mems_shifted_prover = ProverWitnessSecInfo::new( vec![[ addr_phy_mems_list[1..].to_vec(), - vec![vec![ZERO; PHY_MEM_WIDTH]], + vec![vec![S::field_zero(); PHY_MEM_WIDTH]], ] .concat()], vec![addr_poly_phy_mems_shifted], ); - - (addr_phy_mems_shifted_prover, addr_comm_phy_mems_shifted) + addr_phy_mems_shifted_prover }; - ( - vec![addr_poly_phy_mems], - addr_comm_phy_mems, - addr_phy_mems_shifted_prover, - addr_comm_phy_mems_shifted, - ) + (vec![addr_poly_phy_mems], addr_phy_mems_shifted_prover) } else { - ( - Vec::new(), - PolyCommitment::empty(), - ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), - ) + (Vec::new(), ProverWitnessSecInfo::dummy()) } }; - let ( - addr_poly_vir_mems, - addr_comm_vir_mems, - addr_vir_mems_shifted_prover, - addr_comm_vir_mems_shifted, - addr_ts_bits_prover, - addr_comm_ts_bits, - ) = { + let (addr_poly_vir_mems, addr_vir_mems_shifted_prover, addr_ts_bits_prover) = { if total_num_vir_mem_accesses > 0 { - let (addr_poly_vir_mems, addr_comm_vir_mems) = { + let addr_poly_vir_mems = { let addr_vir_mems = addr_vir_mems_list.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let addr_poly_vir_mems = DensePolynomial::new(addr_vir_mems); - - // produce a commitment to the satisfying assignment - let (addr_comm_vir_mems, _blinds_inputs) = - addr_poly_vir_mems.commit(&vars_gens.gens_pc, None); - - // add the commitment to the prover's transcript - addr_comm_vir_mems.append_to_transcript(b"poly_commitment", transcript); - (addr_poly_vir_mems, addr_comm_vir_mems) + addr_poly_vir_mems }; // Remove the first entry and shift the remaining entries up by one // Used later by coherence check - let (addr_vir_mems_shifted_prover, addr_comm_vir_mems_shifted) = { + let addr_vir_mems_shifted_prover = { let addr_vir_mems_shifted = [ addr_vir_mems_list[1..] .to_vec() @@ -2110,59 +1771,39 @@ impl SNARK { .into_iter() .flatten() .collect(), - vec![ZERO; VIR_MEM_WIDTH], + vec![S::field_zero(); VIR_MEM_WIDTH], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables let addr_poly_vir_mems_shifted = DensePolynomial::new(addr_vir_mems_shifted); - - // produce a commitment to the satisfying assignment - let (addr_comm_vir_mems_shifted, _blinds_inputs) = - addr_poly_vir_mems_shifted.commit(&vars_gens.gens_pc, None); - // add the commitment to the prover's transcript - addr_comm_vir_mems_shifted.append_to_transcript(b"poly_commitment", transcript); - let addr_vir_mems_shifted_prover = ProverWitnessSecInfo::new( vec![[ addr_vir_mems_list[1..].to_vec(), - vec![vec![ZERO; VIR_MEM_WIDTH]], + vec![vec![S::field_zero(); VIR_MEM_WIDTH]], ] .concat()], vec![addr_poly_vir_mems_shifted], ); - (addr_vir_mems_shifted_prover, addr_comm_vir_mems_shifted) + addr_vir_mems_shifted_prover }; - let (addr_ts_bits_prover, addr_comm_ts_bits) = { + let addr_ts_bits_prover = { let addr_ts_bits = addr_ts_bits_list.clone().into_iter().flatten().collect(); // create a multilinear polynomial using the supplied assignment for variables let addr_poly_ts_bits = DensePolynomial::new(addr_ts_bits); - - // produce a commitment to the satisfying assignment - let (addr_comm_ts_bits, _blinds_inputs) = - addr_poly_ts_bits.commit(&vars_gens.gens_pc, None); - // add the commitment to the prover's transcript - addr_comm_ts_bits.append_to_transcript(b"poly_commitment", transcript); - let addr_ts_bits_prover = ProverWitnessSecInfo::new(vec![addr_ts_bits_list], vec![addr_poly_ts_bits]); - (addr_ts_bits_prover, addr_comm_ts_bits) + addr_ts_bits_prover }; ( vec![addr_poly_vir_mems], - addr_comm_vir_mems, addr_vir_mems_shifted_prover, - addr_comm_vir_mems_shifted, addr_ts_bits_prover, - addr_comm_ts_bits, ) } else { ( Vec::new(), - PolyCommitment::empty(), ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ProverWitnessSecInfo::dummy(), - PolyCommitment::empty(), ) } }; @@ -2201,6 +1842,7 @@ impl SNARK { &block_w3_prover, &block_w3_shifted_prover, ]; + let (block_r1cs_sat_proof, block_challenges) = { let (proof, block_challenges) = { R1CSProof::prove( @@ -2211,9 +1853,7 @@ impl SNARK { &block_num_vars, block_wit_secs, &block_inst.inst, - vars_gens, transcript, - &mut random_tape, ) }; @@ -2235,13 +1875,14 @@ impl SNARK { timer_eval.stop(); for r in &inst_evals_list { - r.append_to_transcript(b"ABCr_claim", transcript); + S::append_field_to_transcript(b"ABCr_claim", transcript, *r); } + // Sample random combinations of A, B, C for inst_evals_bound_rp check in the Verifier // The random values are not used by the prover, but need to be appended to the transcript - let _ = transcript.challenge_scalar(b"challenge_c0"); - let _ = transcript.challenge_scalar(b"challenge_c1"); - let _ = transcript.challenge_scalar(b"challenge_c2"); + let _: S = transcript.challenge_scalar(b"challenge_c0"); + let _: S = transcript.challenge_scalar(b"challenge_c1"); + let _: S = transcript.challenge_scalar(b"challenge_c2"); let r1cs_eval_proof_list = { let mut r1cs_eval_proof_list = Vec::new(); @@ -2254,10 +1895,10 @@ impl SNARK { .iter() .map(|i| inst_evals_list[*i]) .collect(), - &block_gens.gens_r1cs_eval, transcript, &mut random_tape, ); + let proof_encoded: Vec = bincode::serialize(&proof).unwrap(); Timer::print(&format!("len_r1cs_eval_proof {:?}", proof_encoded.len())); @@ -2282,14 +1923,15 @@ impl SNARK { // PAIRWISE_CHECK // -- let timer_proof = Timer::new("Pairwise Check"); - let pairwise_size = *[ + let pairwise_size = [ consis_num_proofs, total_num_phy_mem_accesses, total_num_vir_mem_accesses, ] .iter() .max() - .unwrap(); + .unwrap() + .clone(); let (pairwise_prover, inst_map) = ProverWitnessSecInfo::merge(vec![ &perm_exec_w3_prover, &addr_phy_mems_prover, @@ -2325,9 +1967,7 @@ impl SNARK { &addr_ts_bits_prover, ], &pairwise_check_inst.inst, - vars_gens, transcript, - &mut random_tape, ) }; @@ -2355,13 +1995,13 @@ impl SNARK { timer_eval.stop(); for r in &inst_evals_list { - r.append_to_transcript(b"ABCr_claim", transcript); + S::append_field_to_transcript(b"ABCr_claim", transcript, *r); } // Sample random combinations of A, B, C for inst_evals_bound_rp check in the Verifier // The random values are not used by the prover, but need to be appended to the transcript - let _ = transcript.challenge_scalar(b"challenge_c0"); - let _ = transcript.challenge_scalar(b"challenge_c1"); - let _ = transcript.challenge_scalar(b"challenge_c2"); + let _: S = transcript.challenge_scalar(b"challenge_c0"); + let _: S = transcript.challenge_scalar(b"challenge_c1"); + let _: S = transcript.challenge_scalar(b"challenge_c2"); let r1cs_eval_proof = { let proof = R1CSEvalProof::prove( @@ -2369,7 +2009,6 @@ impl SNARK { &rx, &ry, &inst_evals_list, - &pairwise_check_gens.gens_r1cs_eval, transcript, &mut random_tape, ); @@ -2396,7 +2035,7 @@ impl SNARK { // PERM_EXEC_ROOT, MEM_ADDR_ROOT // -- let timer_proof = Timer::new("Perm Root"); - let perm_size = *[ + let perm_size = [ consis_num_proofs, total_num_init_phy_mem_accesses, total_num_init_vir_mem_accesses, @@ -2405,7 +2044,8 @@ impl SNARK { ] .iter() .max() - .unwrap(); + .unwrap() + .clone(); let (perm_root_w1_prover, _) = ProverWitnessSecInfo::merge(vec![ &exec_inputs_prover, &init_phy_mems_prover, @@ -2453,9 +2093,7 @@ impl SNARK { &perm_root_w3_shifted_prover, ], &perm_root_inst.inst, - vars_gens, transcript, - &mut random_tape, ) }; @@ -2472,9 +2110,11 @@ impl SNARK { let timer_eval = Timer::new("eval_sparse_polys"); let inst_evals = { let (Ar, Br, Cr) = inst.inst.evaluate(&rx, &ry); - Ar.append_to_transcript(b"Ar_claim", transcript); - Br.append_to_transcript(b"Br_claim", transcript); - Cr.append_to_transcript(b"Cr_claim", transcript); + + for (val, tag) in [(Ar, b"Ar_claim"), (Br, b"Br_claim"), (Cr, b"Cr_claim")].into_iter() { + S::append_field_to_transcript(tag, transcript, val); + } + [Ar, Br, Cr] }; timer_eval.stop(); @@ -2485,7 +2125,6 @@ impl SNARK { &rx, &ry, &inst_evals.to_vec(), - &perm_root_gens.gens_r1cs_eval, transcript, &mut random_tape, ); @@ -2525,9 +2164,9 @@ impl SNARK { let pm_bl_id = 6; let vm_bl_id = if max_block_num_phy_ops > 0 { 7 } else { 6 }; // PHY_MEM_BLOCK takes r = 4, VIR_MEM_BLOCK takes r = 6, everything else takes r = 2 - let perm_poly_poly_list: Vec = (0..inst_map.len()) + let perm_poly_poly_list: Vec = (0..inst_map.len()) .map(|i| { - let p = &perm_poly_w3_prover.poly_w[i]; + let p: &DensePolynomial = &perm_poly_w3_prover.poly_w[i]; let i = inst_map[i]; if i == vm_bl_id { p[6] @@ -2538,10 +2177,10 @@ impl SNARK { } }) .collect(); - let two_b = vec![ONE, ZERO]; - let four_b = vec![ONE, ZERO, ZERO]; - let six_b = vec![ONE, ONE, ZERO]; - let r_list: Vec<&Vec> = inst_map + let two_b = vec![S::field_one(), S::field_zero()]; + let four_b = vec![S::field_one(), S::field_zero(), S::field_zero()]; + let six_b = vec![S::field_one(), S::field_one(), S::field_zero()]; + let r_list: Vec<&Vec> = inst_map .iter() .map(|i| { if *i == vm_bl_id { @@ -2555,11 +2194,8 @@ impl SNARK { .collect(); let proof_eval_perm_poly_prod_list = PolyEvalProof::prove_batched_instances( &perm_poly_w3_prover.poly_w, - None, r_list, &perm_poly_poly_list, - None, - &vars_gens.gens_pc, transcript, &mut random_tape, ); @@ -2621,15 +2257,16 @@ impl SNARK { shifted_polys.push(&vir_mem_addr_w3_shifted_prover.poly_w[0]); header_len_list.push(6); } - - ShiftProofs::prove( + /* + let shift_proof = ShiftProofs::prove( orig_polys, shifted_polys, header_len_list, - vars_gens, transcript, &mut random_tape, - ) + ); + shift_proof + */ }; timer_proof.stop(); @@ -2651,7 +2288,6 @@ impl SNARK { input, output, output_exec_num, - vars_gens, transcript, &mut random_tape, ); @@ -2660,38 +2296,6 @@ impl SNARK { timer_prove.stop(); SNARK { - block_comm_vars_list, - exec_comm_inputs, - addr_comm_phy_mems, - addr_comm_phy_mems_shifted, - addr_comm_vir_mems, - addr_comm_vir_mems_shifted, - addr_comm_ts_bits, - - perm_exec_comm_w2_list, - perm_exec_comm_w3_list, - perm_exec_comm_w3_shifted, - - block_comm_w2_list, - block_comm_w3_list, - block_comm_w3_list_shifted, - - init_phy_mem_comm_w2, - init_phy_mem_comm_w3, - init_phy_mem_comm_w3_shifted, - - init_vir_mem_comm_w2, - init_vir_mem_comm_w3, - init_vir_mem_comm_w3_shifted, - - phy_mem_addr_comm_w2, - phy_mem_addr_comm_w3, - phy_mem_addr_comm_w3_shifted, - - vir_mem_addr_comm_w2, - vir_mem_addr_comm_w3, - vir_mem_addr_comm_w3_shifted, - block_r1cs_sat_proof, block_inst_evals_bound_rp, block_inst_evals_list, @@ -2709,7 +2313,7 @@ impl SNARK { perm_poly_poly_list, proof_eval_perm_poly_prod_list, - shift_proof, + // shift_proof, io_proof, } } @@ -2746,8 +2350,7 @@ impl SNARK { block_num_proofs: &Vec, block_num_cons: usize, block_comm_map: &Vec>, - block_comm_list: &Vec, - block_gens: &SNARKGens, + block_comm_list: &Vec>, consis_num_proofs: usize, total_num_init_phy_mem_accesses: usize, @@ -2755,21 +2358,18 @@ impl SNARK { total_num_phy_mem_accesses: usize, total_num_vir_mem_accesses: usize, pairwise_check_num_cons: usize, - pairwise_check_comm: &ComputationCommitment, - pairwise_check_gens: &SNARKGens, + pairwise_check_comm: &ComputationCommitment, perm_root_num_cons: usize, - perm_root_comm: &ComputationCommitment, - perm_root_gens: &SNARKGens, + perm_root_comm: &ComputationCommitment, - vars_gens: &R1CSGens, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { let proof_size = bincode::serialize(&self).unwrap().len(); let commit_size = bincode::serialize(&block_comm_list).unwrap().len() + - // bincode::serialize(&block_gens).unwrap().len() + + // bincode::serialize(&block_gens).unwrap().len() + bincode::serialize(&pairwise_check_comm).unwrap().len() + - // bincode::serialize(&pairwise_check_gens).unwrap().len() + + // bincode::serialize(&pairwise_check_gens).unwrap().len() + bincode::serialize(&perm_root_comm).unwrap().len(); // bincode::serialize(&perm_root_gens).unwrap().len(); let meta_size = @@ -2788,7 +2388,10 @@ impl SNARK { // bincode::serialize(vars_gens).unwrap().len(); let timer_verify = Timer::new("SNARK::verify"); - transcript.append_protocol_name(SNARK::protocol_name()); + >::append_protocol_name( + transcript, + SNARK::::protocol_name(), + ); // -- // ASSERTIONS @@ -2801,66 +2404,101 @@ impl SNARK { // -- // COMMITMENTS // -- - let input_block_num = Scalar::from(input_block_num as u64); - let output_block_num = Scalar::from(output_block_num as u64); - let input: Vec = input - .iter() - .map(|i| Scalar::from_bytes(i).unwrap()) - .collect(); - let input_stack: Vec = input_stack + let input_block_num = S::from(input_block_num as u64); + let output_block_num = S::from(output_block_num as u64); + let input: Vec = input.iter().map(|i| S::from_bytes(i).unwrap()).collect(); + let input_stack: Vec = input_stack .iter() - .map(|i| Scalar::from_bytes(i).unwrap()) + .map(|i| S::from_bytes(i).unwrap()) .collect(); - let input_mem: Vec = input_mem + let input_mem: Vec = input_mem .iter() - .map(|i| Scalar::from_bytes(i).unwrap()) + .map(|i| S::from_bytes(i).unwrap()) .collect(); - let output: Scalar = Scalar::from_bytes(output).unwrap(); + let output: S = S::from_bytes(output).unwrap(); { let timer_commit = Timer::new("inst_commit"); // Commit public parameters - Scalar::from(func_input_width as u64).append_to_transcript(b"func_input_width", transcript); - Scalar::from(input_offset as u64).append_to_transcript(b"input_offset", transcript); - Scalar::from(output_offset as u64).append_to_transcript(b"output_offset", transcript); - Scalar::from(output_exec_num as u64).append_to_transcript(b"output_exec_num", transcript); - Scalar::from(num_ios as u64).append_to_transcript(b"num_ios", transcript); + S::append_field_to_transcript( + b"func_input_width", + transcript, + S::from(func_input_width as u64), + ); + S::append_field_to_transcript(b"input_offset", transcript, S::from(input_offset as u64)); + S::append_field_to_transcript(b"output_offset", transcript, S::from(output_offset as u64)); + S::append_field_to_transcript( + b"output_exec_num", + transcript, + S::from(output_exec_num as u64), + ); + S::append_field_to_transcript(b"num_ios", transcript, S::from(num_ios as u64)); + for n in block_num_vars { - Scalar::from(*n as u64).append_to_transcript(b"block_num_vars", transcript); + S::append_field_to_transcript(b"block_num_vars", transcript, S::from(*n as u64)); } - Scalar::from(mem_addr_ts_bits_size as u64) - .append_to_transcript(b"mem_addr_ts_bits_size", transcript); - Scalar::from(num_inputs_unpadded as u64) - .append_to_transcript(b"num_inputs_unpadded", transcript); - Scalar::from(block_num_instances_bound as u64) - .append_to_transcript(b"block_num_instances_bound", transcript); - Scalar::from(block_max_num_proofs as u64) - .append_to_transcript(b"block_max_num_proofs", transcript); + S::append_field_to_transcript( + b"mem_addr_ts_bits_size", + transcript, + S::from(mem_addr_ts_bits_size as u64), + ); + S::append_field_to_transcript( + b"num_inputs_unpadded", + transcript, + S::from(num_inputs_unpadded as u64), + ); + S::append_field_to_transcript( + b"block_num_instances_bound", + transcript, + S::from(block_num_instances_bound as u64), + ); + S::append_field_to_transcript( + b"block_max_num_proofs", + transcript, + S::from(block_max_num_proofs as u64), + ); + for p in block_num_phy_ops { - Scalar::from(*p as u64).append_to_transcript(b"block_num_phy_ops", transcript); + S::append_field_to_transcript(b"block_num_phy_ops", transcript, S::from(*p as u64)); } for v in block_num_vir_ops { - Scalar::from(*v as u64).append_to_transcript(b"block_num_vir_ops", transcript); + S::append_field_to_transcript(b"block_num_vir_ops", transcript, S::from(*v as u64)); } - Scalar::from(total_num_init_phy_mem_accesses as u64) - .append_to_transcript(b"total_num_init_phy_mem_accesses", transcript); - Scalar::from(total_num_init_vir_mem_accesses as u64) - .append_to_transcript(b"total_num_init_vir_mem_accesses", transcript); - Scalar::from(total_num_phy_mem_accesses as u64) - .append_to_transcript(b"total_num_phy_mem_accesses", transcript); - Scalar::from(total_num_vir_mem_accesses as u64) - .append_to_transcript(b"total_num_vir_mem_accesses", transcript); + S::append_field_to_transcript( + b"total_num_init_phy_mem_accesses", + transcript, + S::from(total_num_init_phy_mem_accesses as u64), + ); + S::append_field_to_transcript( + b"total_num_init_vir_mem_accesses", + transcript, + S::from(total_num_init_vir_mem_accesses as u64), + ); + S::append_field_to_transcript( + b"total_num_phy_mem_accesses", + transcript, + S::from(total_num_phy_mem_accesses as u64), + ); + S::append_field_to_transcript( + b"total_num_vir_mem_accesses", + transcript, + S::from(total_num_vir_mem_accesses as u64), + ); // commit num_proofs - Scalar::from(block_max_num_proofs as u64) - .append_to_transcript(b"block_max_num_proofs", transcript); + S::append_field_to_transcript( + b"block_max_num_proofs", + transcript, + S::from(block_max_num_proofs as u64), + ); + for n in block_num_proofs { - Scalar::from(*n as u64).append_to_transcript(b"block_num_proofs", transcript); + S::append_field_to_transcript(b"block_num_proofs", transcript, S::from(*n as u64)); } // append a commitment to the computation to the transcript for b in block_comm_map { for l in b { - Scalar::from(*l as u64).append_to_transcript(b"block_comm_map", transcript); + S::append_field_to_transcript(b"block_comm_map", transcript, S::from(*l as u64)); } } for c in block_comm_list { @@ -2874,10 +2512,10 @@ impl SNARK { .append_to_transcript(b"perm_comm", transcript); // Commit io - input_block_num.append_to_transcript(b"input_block_num", transcript); - output_block_num.append_to_transcript(b"output_block_num", transcript); - input.append_to_transcript(b"input_list", transcript); - output.append_to_transcript(b"output_list", transcript); + S::append_field_to_transcript(b"input_block_num", transcript, input_block_num); + S::append_field_to_transcript(b"output_block_num", transcript, output_block_num); + S::append_field_vector_to_transcript(b"input_list", transcript, &input); + S::append_field_to_transcript(b"output_list", transcript, output); timer_commit.stop(); } @@ -2996,26 +2634,11 @@ impl SNARK { let mut r_tmp = comb_r; for _ in 1..2 * num_inputs_unpadded { perm_w0.push(r_tmp); - r_tmp *= comb_r; + r_tmp = r_tmp * comb_r; } - perm_w0.extend(vec![ZERO; num_ios - 2 * num_inputs_unpadded]); + perm_w0.extend(vec![S::field_zero(); num_ios - 2 * num_inputs_unpadded]); // create a multilinear polynomial using the supplied assignment for variables - let perm_poly_w0 = DensePolynomial::new(perm_w0.clone()); - // produce a commitment to the satisfying assignment - let (perm_comm_w0, _blinds_vars) = perm_poly_w0.commit(&vars_gens.gens_pc, None); - // add the commitment to the prover's transcript - perm_comm_w0.append_to_transcript(b"poly_commitment", transcript); - - // perm_exec - self - .perm_exec_comm_w2_list - .append_to_transcript(b"poly_commitment", transcript); - self - .perm_exec_comm_w3_list - .append_to_transcript(b"poly_commitment", transcript); - self - .perm_exec_comm_w3_shifted - .append_to_transcript(b"poly_commitment", transcript); + let _perm_poly_w0 = DensePolynomial::new(perm_w0.clone()); // block_w2 let block_w2_verifier = { @@ -3025,78 +2648,34 @@ impl SNARK { .next_power_of_two() }) .collect(); - for p in 0..block_num_instances { - self.block_comm_w2_list[p].append_to_transcript(b"poly_commitment", transcript); - } - VerifierWitnessSecInfo::new( - block_w2_size_list, - block_num_proofs, - self.block_comm_w2_list.clone(), - ) + VerifierWitnessSecInfo::new(block_w2_size_list, &block_num_proofs) }; - // block_w3 - for p in 0..block_num_instances { - self.block_comm_w3_list[p].append_to_transcript(b"poly_commitment", transcript); - self.block_comm_w3_list_shifted[p].append_to_transcript(b"poly_commitment", transcript); - } ( - VerifierWitnessSecInfo::new(vec![num_ios], &vec![1], vec![perm_comm_w0.clone()]), - VerifierWitnessSecInfo::new( - vec![num_ios], - &vec![consis_num_proofs], - vec![self.perm_exec_comm_w2_list.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![consis_num_proofs], - vec![self.perm_exec_comm_w3_list.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![consis_num_proofs], - vec![self.perm_exec_comm_w3_shifted.clone()], - ), + VerifierWitnessSecInfo::new(vec![num_ios], &vec![1]), + VerifierWitnessSecInfo::new(vec![num_ios], &vec![consis_num_proofs]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![consis_num_proofs]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![consis_num_proofs]), block_w2_verifier, VerifierWitnessSecInfo::new( vec![W3_WIDTH; block_num_instances], &block_num_proofs.clone(), - self.block_comm_w3_list.clone(), ), VerifierWitnessSecInfo::new( vec![W3_WIDTH; block_num_instances], &block_num_proofs.clone(), - self.block_comm_w3_list_shifted.clone(), ), ) }; let (init_phy_mem_w2_verifier, init_phy_mem_w3_verifier, init_phy_mem_w3_shifted_verifier) = { if total_num_init_phy_mem_accesses > 0 { - self - .init_phy_mem_comm_w2 - .append_to_transcript(b"poly_commitment", transcript); - self - .init_phy_mem_comm_w3 - .append_to_transcript(b"poly_commitment", transcript); - self - .init_phy_mem_comm_w3_shifted - .append_to_transcript(b"poly_commitment", transcript); ( VerifierWitnessSecInfo::new( vec![INIT_PHY_MEM_WIDTH], &vec![total_num_init_phy_mem_accesses], - vec![self.init_phy_mem_comm_w2.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_init_phy_mem_accesses], - vec![self.init_phy_mem_comm_w3.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_init_phy_mem_accesses], - vec![self.init_phy_mem_comm_w3_shifted.clone()], ), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_init_phy_mem_accesses]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_init_phy_mem_accesses]), ) } else { ( @@ -3109,31 +2688,13 @@ impl SNARK { let (init_vir_mem_w2_verifier, init_vir_mem_w3_verifier, init_vir_mem_w3_shifted_verifier) = { if total_num_init_vir_mem_accesses > 0 { - self - .init_vir_mem_comm_w2 - .append_to_transcript(b"poly_commitment", transcript); - self - .init_vir_mem_comm_w3 - .append_to_transcript(b"poly_commitment", transcript); - self - .init_vir_mem_comm_w3_shifted - .append_to_transcript(b"poly_commitment", transcript); ( VerifierWitnessSecInfo::new( vec![INIT_VIR_MEM_WIDTH], &vec![total_num_init_vir_mem_accesses], - vec![self.init_vir_mem_comm_w2.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_init_vir_mem_accesses], - vec![self.init_vir_mem_comm_w3.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_init_vir_mem_accesses], - vec![self.init_vir_mem_comm_w3_shifted.clone()], ), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_init_vir_mem_accesses]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_init_vir_mem_accesses]), ) } else { ( @@ -3146,31 +2707,10 @@ impl SNARK { let (phy_mem_addr_w2_verifier, phy_mem_addr_w3_verifier, phy_mem_addr_w3_shifted_verifier) = { if total_num_phy_mem_accesses > 0 { - self - .phy_mem_addr_comm_w2 - .append_to_transcript(b"poly_commitment", transcript); - self - .phy_mem_addr_comm_w3 - .append_to_transcript(b"poly_commitment", transcript); - self - .phy_mem_addr_comm_w3_shifted - .append_to_transcript(b"poly_commitment", transcript); ( - VerifierWitnessSecInfo::new( - vec![PHY_MEM_WIDTH], - &vec![total_num_phy_mem_accesses], - vec![self.phy_mem_addr_comm_w2.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_phy_mem_accesses], - vec![self.phy_mem_addr_comm_w3.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_phy_mem_accesses], - vec![self.phy_mem_addr_comm_w3_shifted.clone()], - ), + VerifierWitnessSecInfo::new(vec![PHY_MEM_WIDTH], &vec![total_num_phy_mem_accesses]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_phy_mem_accesses]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_phy_mem_accesses]), ) } else { ( @@ -3183,31 +2723,10 @@ impl SNARK { let (vir_mem_addr_w2_verifier, vir_mem_addr_w3_verifier, vir_mem_addr_w3_shifted_verifier) = { if total_num_vir_mem_accesses > 0 { - self - .vir_mem_addr_comm_w2 - .append_to_transcript(b"poly_commitment", transcript); - self - .vir_mem_addr_comm_w3 - .append_to_transcript(b"poly_commitment", transcript); - self - .vir_mem_addr_comm_w3_shifted - .append_to_transcript(b"poly_commitment", transcript); ( - VerifierWitnessSecInfo::new( - vec![VIR_MEM_WIDTH], - &vec![total_num_vir_mem_accesses], - vec![self.vir_mem_addr_comm_w2.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_vir_mem_accesses], - vec![self.vir_mem_addr_comm_w3.clone()], - ), - VerifierWitnessSecInfo::new( - vec![W3_WIDTH], - &vec![total_num_vir_mem_accesses], - vec![self.vir_mem_addr_comm_w3_shifted.clone()], - ), + VerifierWitnessSecInfo::new(vec![VIR_MEM_WIDTH], &vec![total_num_vir_mem_accesses]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_vir_mem_accesses]), + VerifierWitnessSecInfo::new(vec![W3_WIDTH], &vec![total_num_vir_mem_accesses]), ) } else { ( @@ -3220,26 +2739,14 @@ impl SNARK { let (block_vars_verifier, exec_inputs_verifier) = { // add the commitment to the verifier's transcript - for p in 0..block_num_instances { - self.block_comm_vars_list[p].append_to_transcript(b"poly_commitment", transcript); - } - self.exec_comm_inputs[0].append_to_transcript(b"poly_commitment", transcript); ( - VerifierWitnessSecInfo::new( - block_num_vars, - block_num_proofs, - self.block_comm_vars_list.clone(), - ), - VerifierWitnessSecInfo::new( - vec![num_ios], - &vec![consis_num_proofs], - self.exec_comm_inputs.clone(), - ), + VerifierWitnessSecInfo::new(block_num_vars, &block_num_proofs), + VerifierWitnessSecInfo::new(vec![num_ios], &vec![consis_num_proofs]), ) }; let init_phy_mems_verifier = { - if !input_stack.is_empty() { + if input_stack.len() > 0 { assert_eq!( total_num_init_phy_mem_accesses, input_stack.len().next_power_of_two() @@ -3247,29 +2754,33 @@ impl SNARK { // Let the verifier generate init_mems itself let init_stacks = [ (0..input_stack.len()) - .map(|i| vec![ONE, ZERO, Scalar::from(i as u64), input_stack[i]]) + .map(|i| { + vec![ + S::field_one(), + S::field_zero(), + S::from(i as u64), + input_stack[i].clone(), + ] + }) .concat(), - vec![ZERO; INIT_PHY_MEM_WIDTH * (total_num_init_phy_mem_accesses - input_stack.len())], + vec![ + S::field_zero(); + INIT_PHY_MEM_WIDTH * (total_num_init_phy_mem_accesses - input_stack.len()) + ], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables - let poly_init_stacks = DensePolynomial::new(init_stacks.clone()); - // produce a commitment to the satisfying assignment - let (comm_init_stacks, _blinds_vars) = poly_init_stacks.commit(&vars_gens.gens_pc, None); - // add the commitment to the prover's transcript - comm_init_stacks.append_to_transcript(b"poly_commitment", transcript); - + let _poly_init_stacks = DensePolynomial::new(init_stacks.clone()); VerifierWitnessSecInfo::new( vec![INIT_PHY_MEM_WIDTH], &vec![total_num_init_phy_mem_accesses], - vec![comm_init_stacks], ) } else { VerifierWitnessSecInfo::dummy() } }; let init_vir_mems_verifier = { - if !input_mem.is_empty() { + if input_mem.len() > 0 { assert_eq!( total_num_init_vir_mem_accesses, input_mem.len().next_power_of_two() @@ -3277,22 +2788,26 @@ impl SNARK { // Let the verifier generate init_mems itself let init_mems = [ (0..input_mem.len()) - .map(|i| vec![ONE, ZERO, Scalar::from(i as u64), input_mem[i]]) + .map(|i| { + vec![ + S::field_one(), + S::field_zero(), + S::from(i as u64), + input_mem[i].clone(), + ] + }) .concat(), - vec![ZERO; INIT_VIR_MEM_WIDTH * (total_num_init_vir_mem_accesses - input_mem.len())], + vec![ + S::field_zero(); + INIT_VIR_MEM_WIDTH * (total_num_init_vir_mem_accesses - input_mem.len()) + ], ] .concat(); // create a multilinear polynomial using the supplied assignment for variables - let poly_init_mems = DensePolynomial::new(init_mems.clone()); - // produce a commitment to the satisfying assignment - let (comm_init_mems, _blinds_vars) = poly_init_mems.commit(&vars_gens.gens_pc, None); - // add the commitment to the prover's transcript - comm_init_mems.append_to_transcript(b"poly_commitment", transcript); - + let _poly_init_mems = DensePolynomial::new(init_mems.clone()); VerifierWitnessSecInfo::new( vec![INIT_VIR_MEM_WIDTH], &vec![total_num_init_vir_mem_accesses], - vec![comm_init_mems], ) } else { VerifierWitnessSecInfo::dummy() @@ -3301,23 +2816,9 @@ impl SNARK { let (addr_phy_mems_verifier, addr_phy_mems_shifted_verifier) = { if total_num_phy_mem_accesses > 0 { - self - .addr_comm_phy_mems - .append_to_transcript(b"poly_commitment", transcript); - self - .addr_comm_phy_mems_shifted - .append_to_transcript(b"poly_commitment", transcript); ( - VerifierWitnessSecInfo::new( - vec![PHY_MEM_WIDTH], - &vec![total_num_phy_mem_accesses], - vec![self.addr_comm_phy_mems.clone()], - ), - VerifierWitnessSecInfo::new( - vec![PHY_MEM_WIDTH], - &vec![total_num_phy_mem_accesses], - vec![self.addr_comm_phy_mems_shifted.clone()], - ), + VerifierWitnessSecInfo::new(vec![PHY_MEM_WIDTH], &vec![total_num_phy_mem_accesses]), + VerifierWitnessSecInfo::new(vec![PHY_MEM_WIDTH], &vec![total_num_phy_mem_accesses]), ) } else { ( @@ -3329,30 +2830,12 @@ impl SNARK { let (addr_vir_mems_verifier, addr_vir_mems_shifted_verifier, addr_ts_bits_verifier) = { if total_num_vir_mem_accesses > 0 { - self - .addr_comm_vir_mems - .append_to_transcript(b"poly_commitment", transcript); - self - .addr_comm_vir_mems_shifted - .append_to_transcript(b"poly_commitment", transcript); - self - .addr_comm_ts_bits - .append_to_transcript(b"poly_commitment", transcript); ( - VerifierWitnessSecInfo::new( - vec![VIR_MEM_WIDTH], - &vec![total_num_vir_mem_accesses], - vec![self.addr_comm_vir_mems.clone()], - ), - VerifierWitnessSecInfo::new( - vec![VIR_MEM_WIDTH], - &vec![total_num_vir_mem_accesses], - vec![self.addr_comm_vir_mems_shifted.clone()], - ), + VerifierWitnessSecInfo::new(vec![VIR_MEM_WIDTH], &vec![total_num_vir_mem_accesses]), + VerifierWitnessSecInfo::new(vec![VIR_MEM_WIDTH], &vec![total_num_vir_mem_accesses]), VerifierWitnessSecInfo::new( vec![mem_addr_ts_bits_size], &vec![total_num_vir_mem_accesses], - vec![self.addr_comm_ts_bits.clone()], ), ) } else { @@ -3377,6 +2860,7 @@ impl SNARK { &block_w3_verifier, &block_w3_shifted_verifier, ]; + let block_challenges = self.block_r1cs_sat_proof.verify( block_num_instances, block_max_num_proofs, @@ -3384,7 +2868,6 @@ impl SNARK { num_vars, block_wit_secs, block_num_cons, - vars_gens, &self.block_inst_evals_bound_rp, transcript, )?; @@ -3392,17 +2875,18 @@ impl SNARK { let timer_eval_proof = Timer::new("Block Correctness Extract Eval"); // Verify Evaluation on BLOCK - let [rp, _, rx, ry] = block_challenges; + let [_rp, _, rx, ry] = block_challenges; for r in &self.block_inst_evals_list { - r.append_to_transcript(b"ABCr_claim", transcript); + S::append_field_to_transcript(b"ABCr_claim", transcript, *r); } + // Sample random combinations of A, B, C for inst_evals_bound_rp check - let c0 = transcript.challenge_scalar(b"challenge_c0"); - let c1 = transcript.challenge_scalar(b"challenge_c1"); - let c2 = transcript.challenge_scalar(b"challenge_c2"); + let c0: S = transcript.challenge_scalar(b"challenge_c0"); + let c1: S = transcript.challenge_scalar(b"challenge_c1"); + let c2: S = transcript.challenge_scalar(b"challenge_c2"); - let ABC_evals: Vec = (0..block_num_instances_bound) + let ABC_evals: Vec = (0..block_num_instances_bound) .map(|i| { c0 * self.block_inst_evals_list[3 * i] + c1 * self.block_inst_evals_list[3 * i + 1] @@ -3419,21 +2903,15 @@ impl SNARK { .iter() .map(|i| self.block_inst_evals_list[*i]) .collect(), - &block_gens.gens_r1cs_eval, transcript, )?; } + // Permute block_inst_evals_list to the correct order for RP evaluation - let ABC_evals: Vec = (0..block_num_instances) + let _ABC_evals: Vec = (0..block_num_instances) .map(|i| ABC_evals[block_index[i]]) .collect(); - // Verify that block_inst_evals_bound_rp is block_inst_evals_list bind rp - assert_eq!( - DensePolynomial::new(ABC_evals).evaluate(&rp), - c0 * self.block_inst_evals_bound_rp[0] - + c1 * self.block_inst_evals_bound_rp[1] - + c2 * self.block_inst_evals_bound_rp[2] - ); + timer_eval_proof.stop(); } @@ -3443,14 +2921,15 @@ impl SNARK { { let timer_sat_proof = Timer::new("Pairwise Check Sat"); - let pairwise_size = *[ + let pairwise_size = [ consis_num_proofs, total_num_phy_mem_accesses, total_num_vir_mem_accesses, ] .iter() .max() - .unwrap(); + .unwrap() + .clone(); let (pairwise_verifier, inst_map) = VerifierWitnessSecInfo::merge(vec![ &perm_exec_w3_verifier, &addr_phy_mems_verifier, @@ -3484,7 +2963,6 @@ impl SNARK { &addr_ts_bits_verifier, ], pairwise_check_num_cons, - vars_gens, &self.pairwise_check_inst_evals_bound_rp, transcript, )?; @@ -3492,17 +2970,17 @@ impl SNARK { let timer_eval_proof = Timer::new("Pairwise Check Eval"); // Verify Evaluation on CONSIS_CHECK - let [rp, _, rx, ry] = pairwise_check_challenges; + let [_rp, _, rx, ry] = pairwise_check_challenges; for r in &self.pairwise_check_inst_evals_list { - r.append_to_transcript(b"ABCr_claim", transcript); + S::append_field_to_transcript(b"ABCr_claim", transcript, *r); } // Sample random combinations of A, B, C for inst_evals_bound_rp check - let c0 = transcript.challenge_scalar(b"challenge_c0"); - let c1 = transcript.challenge_scalar(b"challenge_c1"); - let c2 = transcript.challenge_scalar(b"challenge_c2"); + let c0: S = transcript.challenge_scalar(b"challenge_c0"); + let c1: S = transcript.challenge_scalar(b"challenge_c1"); + let c2: S = transcript.challenge_scalar(b"challenge_c2"); - let ABC_evals: Vec = (0..3) + let ABC_evals: Vec = (0..3) .map(|i| { c0 * self.pairwise_check_inst_evals_list[3 * i] + c1 * self.pairwise_check_inst_evals_list[3 * i + 1] @@ -3515,20 +2993,13 @@ impl SNARK { &rx, &ry, &self.pairwise_check_inst_evals_list, - &pairwise_check_gens.gens_r1cs_eval, transcript, )?; // Permute pairwise_check_inst_evals_list to the correct order for RP evaluation - let ABC_evals: Vec = (0..pairwise_num_instances) + let _ABC_evals: Vec = (0..pairwise_num_instances) .map(|i| ABC_evals[pairwise_index[i]]) .collect(); - // Verify that pairwise_check_inst_evals_bound_rp is pairwise_check_inst_evals_list bind rp - assert_eq!( - DensePolynomial::new(ABC_evals).evaluate(&rp), - c0 * self.pairwise_check_inst_evals_bound_rp[0] - + c1 * self.pairwise_check_inst_evals_bound_rp[1] - + c2 * self.pairwise_check_inst_evals_bound_rp[2] - ); + // Correctness of the shift will be handled in SHIFT_PROOFS timer_eval_proof.stop(); }; @@ -3537,7 +3008,7 @@ impl SNARK { // PERM_EXEC_ROOT, MEM_ADDR_ROOT // -- { - let perm_size = *[ + let perm_size = [ consis_num_proofs, total_num_init_phy_mem_accesses, total_num_init_vir_mem_accesses, @@ -3546,7 +3017,8 @@ impl SNARK { ] .iter() .max() - .unwrap(); + .unwrap() + .clone(); let timer_sat_proof = Timer::new("Perm Root Sat"); let (perm_root_w1_verifier, _) = VerifierWitnessSecInfo::merge(vec![ &exec_inputs_verifier, @@ -3591,7 +3063,6 @@ impl SNARK { &perm_root_w3_shifted_verifier, ], perm_root_num_cons, - vars_gens, &self.perm_root_inst_evals, transcript, )?; @@ -3600,16 +3071,15 @@ impl SNARK { let timer_eval_proof = Timer::new("Perm Root Eval"); // Verify Evaluation on PERM_BLOCK_ROOT let [Ar, Br, Cr] = &self.perm_root_inst_evals; - Ar.append_to_transcript(b"Ar_claim", transcript); - Br.append_to_transcript(b"Br_claim", transcript); - Cr.append_to_transcript(b"Cr_claim", transcript); + for (val, tag) in [(Ar, b"Ar_claim"), (Br, b"Br_claim"), (Cr, b"Cr_claim")].into_iter() { + S::append_field_to_transcript(tag, transcript, *val); + } let [_, _, rx, ry] = perm_block_root_challenges; self.perm_root_r1cs_eval_proof.verify( &perm_root_comm.comm, &rx, &ry, &self.perm_root_inst_evals.to_vec(), - &perm_root_gens.gens_r1cs_eval, transcript, )?; timer_eval_proof.stop(); @@ -3654,10 +3124,10 @@ impl SNARK { let num_vars_list = (0..perm_poly_num_instances) .map(|i| (perm_poly_num_proofs[i] * perm_poly_num_inputs[i]).log_2()) .collect(); - let two_b = vec![ONE, ZERO]; - let four_b = vec![ONE, ZERO, ZERO]; - let six_b = vec![ONE, ONE, ZERO]; - let r_list: Vec<&Vec> = inst_map + let two_b = vec![S::field_one(), S::field_zero()]; + let four_b = vec![S::field_one(), S::field_zero(), S::field_zero()]; + let six_b = vec![S::field_one(), S::field_one(), S::field_zero()]; + let r_list: Vec<&Vec> = inst_map .iter() .map(|i| { if *i == vm_bl_id { @@ -3671,21 +3141,19 @@ impl SNARK { .collect(); PolyEvalProof::verify_plain_batched_instances( &self.proof_eval_perm_poly_prod_list, - &vars_gens.gens_pc, transcript, r_list, &self.perm_poly_poly_list, - &perm_poly_w3_verifier.comm_w, &num_vars_list, )?; // Compute poly for PERM_EXEC, PERM_BLOCK, MEM_BLOCK, MEM_ADDR base on INST_MAP - let mut perm_block_poly_bound_tau = ONE; - let mut perm_exec_poly_bound_tau = ONE; - let mut phy_mem_block_poly_bound_tau = ONE; - let mut phy_mem_addr_poly_bound_tau = ONE; - let mut vir_mem_block_poly_bound_tau = ONE; - let mut vir_mem_addr_poly_bound_tau = ONE; + let mut perm_block_poly_bound_tau = S::field_one(); + let mut perm_exec_poly_bound_tau = S::field_one(); + let mut phy_mem_block_poly_bound_tau = S::field_one(); + let mut phy_mem_addr_poly_bound_tau = S::field_one(); + let mut vir_mem_block_poly_bound_tau = S::field_one(); + let mut vir_mem_addr_poly_bound_tau = S::field_one(); // INST_MAP: // 0 -> perm_exec, // 1 -> init_phy_mem, count towards phy_mem_block @@ -3698,32 +3166,37 @@ impl SNARK { for p in 0..perm_poly_num_instances { match inst_map[p] { 0 => { - perm_exec_poly_bound_tau *= self.perm_poly_poly_list[p]; + perm_exec_poly_bound_tau = perm_exec_poly_bound_tau * self.perm_poly_poly_list[p]; } 1 => { - phy_mem_block_poly_bound_tau *= self.perm_poly_poly_list[p]; + phy_mem_block_poly_bound_tau = + phy_mem_block_poly_bound_tau * self.perm_poly_poly_list[p]; } 2 => { - vir_mem_block_poly_bound_tau *= self.perm_poly_poly_list[p]; + vir_mem_block_poly_bound_tau = + vir_mem_block_poly_bound_tau * self.perm_poly_poly_list[p]; } 3 => { - phy_mem_addr_poly_bound_tau *= self.perm_poly_poly_list[p]; + phy_mem_addr_poly_bound_tau = phy_mem_addr_poly_bound_tau * self.perm_poly_poly_list[p]; } 4 => { - vir_mem_addr_poly_bound_tau *= self.perm_poly_poly_list[p]; + vir_mem_addr_poly_bound_tau = vir_mem_addr_poly_bound_tau * self.perm_poly_poly_list[p]; } 5 => { - perm_block_poly_bound_tau *= self.perm_poly_poly_list[p]; + perm_block_poly_bound_tau = perm_block_poly_bound_tau * self.perm_poly_poly_list[p]; } 6 => { if max_block_num_phy_ops > 0 { - phy_mem_block_poly_bound_tau *= self.perm_poly_poly_list[p]; + phy_mem_block_poly_bound_tau = + phy_mem_block_poly_bound_tau * self.perm_poly_poly_list[p]; } else { - vir_mem_block_poly_bound_tau *= self.perm_poly_poly_list[p]; + vir_mem_block_poly_bound_tau = + vir_mem_block_poly_bound_tau * self.perm_poly_poly_list[p]; } } 7 => { - vir_mem_block_poly_bound_tau *= self.perm_poly_poly_list[p]; + vir_mem_block_poly_bound_tau = + vir_mem_block_poly_bound_tau * self.perm_poly_poly_list[p]; } _ => {} } @@ -3732,6 +3205,7 @@ impl SNARK { // Correctness of Permutation assert_eq!(perm_block_poly_bound_tau, perm_exec_poly_bound_tau); + // Correctness of Memory assert_eq!(phy_mem_block_poly_bound_tau, phy_mem_addr_poly_bound_tau); assert_eq!(vir_mem_block_poly_bound_tau, vir_mem_addr_poly_bound_tau); @@ -3742,16 +3216,6 @@ impl SNARK { // -- let timer_proof = Timer::new("Shift Proofs"); { - // perm_exec_w3 - let mut orig_comms = vec![&perm_exec_w3_verifier.comm_w[0]]; - let mut shifted_comms = vec![&perm_exec_w3_shifted_verifier.comm_w[0]]; - // block_w3 - for comm in &block_w3_verifier.comm_w { - orig_comms.push(comm); - } - for comm in &block_w3_shifted_verifier.comm_w { - shifted_comms.push(comm); - } let mut poly_size_list = [ vec![8 * consis_num_proofs], (0..block_num_instances) @@ -3763,55 +3227,39 @@ impl SNARK { let mut header_len_list = [vec![6], vec![8; block_num_instances]].concat(); // init_phy_mem_w3, init_vir_mem_w3 if total_num_init_phy_mem_accesses > 0 { - orig_comms.push(&init_phy_mem_w3_verifier.comm_w[0]); - shifted_comms.push(&init_phy_mem_w3_shifted_verifier.comm_w[0]); poly_size_list.push(8 * total_num_init_phy_mem_accesses); shift_size_list.push(8); header_len_list.push(6); } if total_num_init_vir_mem_accesses > 0 { - orig_comms.push(&init_vir_mem_w3_verifier.comm_w[0]); - shifted_comms.push(&init_vir_mem_w3_shifted_verifier.comm_w[0]); poly_size_list.push(8 * total_num_init_vir_mem_accesses); shift_size_list.push(8); header_len_list.push(6); } // addr_phy_mems, phy_mem_addr_w3 if total_num_phy_mem_accesses > 0 { - orig_comms.push(&addr_phy_mems_verifier.comm_w[0]); - shifted_comms.push(&addr_phy_mems_shifted_verifier.comm_w[0]); poly_size_list.push(4 * total_num_phy_mem_accesses); shift_size_list.push(4); header_len_list.push(4); - orig_comms.push(&phy_mem_addr_w3_verifier.comm_w[0]); - shifted_comms.push(&phy_mem_addr_w3_shifted_verifier.comm_w[0]); poly_size_list.push(8 * total_num_phy_mem_accesses); shift_size_list.push(8); header_len_list.push(6); } // addr_vir_mems, vir_mem_addr_w3 if total_num_vir_mem_accesses > 0 { - orig_comms.push(&addr_vir_mems_verifier.comm_w[0]); - shifted_comms.push(&addr_vir_mems_shifted_verifier.comm_w[0]); poly_size_list.push(8 * total_num_vir_mem_accesses); shift_size_list.push(8); header_len_list.push(6); - orig_comms.push(&vir_mem_addr_w3_verifier.comm_w[0]); - shifted_comms.push(&vir_mem_addr_w3_shifted_verifier.comm_w[0]); poly_size_list.push(8 * total_num_vir_mem_accesses); shift_size_list.push(8); header_len_list.push(6); } - self.shift_proof.verify( - orig_comms, - shifted_comms, - poly_size_list, - shift_size_list, - header_len_list, - vars_gens, - transcript, - )?; + /* + self + .shift_proof + .verify(poly_size_list, shift_size_list, header_len_list, transcript)?; + */ } timer_proof.stop(); @@ -3820,7 +3268,6 @@ impl SNARK { // -- let timer_proof = Timer::new("IO Proofs"); self.io_proof.verify( - &self.exec_comm_inputs[0], num_ios, num_inputs_unpadded, consis_num_proofs, @@ -3832,7 +3279,6 @@ impl SNARK { input, output, output_exec_num, - vars_gens, transcript, )?; timer_proof.stop(); diff --git a/spartan_parallel/src/nizk/bullet.rs b/spartan_parallel/src/nizk/bullet.rs deleted file mode 100644 index a62a71c0..00000000 --- a/spartan_parallel/src/nizk/bullet.rs +++ /dev/null @@ -1,243 +0,0 @@ -//! This module is an adaptation of code from the bulletproofs crate. -//! See NOTICE.md for more details -#![allow(non_snake_case)] -#![allow(clippy::type_complexity)] -#![allow(clippy::too_many_arguments)] -use super::super::errors::ProofVerifyError; -use super::super::group::{CompressedGroup, GroupElement, VartimeMultiscalarMul}; -use super::super::math::Math; -use super::super::scalar::Scalar; -use super::super::transcript::ProofTranscript; -use core::iter; -use merlin::Transcript; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct BulletReductionProof { - L_vec: Vec, - R_vec: Vec, -} - -impl BulletReductionProof { - /// Create an inner-product proof. - /// - /// The proof is created with respect to the bases \\(G\\). - /// - /// The `transcript` is passed in as a parameter so that the - /// challenges depend on the *entire* transcript (including parent - /// protocols). - /// - /// The lengths of the vectors must all be the same, and must all be - /// either 0 or a power of 2. - pub fn prove( - transcript: &mut Transcript, - Q: &GroupElement, - G_vec: &[GroupElement], - H: &GroupElement, - a_vec: &[Scalar], - b_vec: &[Scalar], - blind: &Scalar, - blinds_vec: &[(Scalar, Scalar)], - ) -> ( - BulletReductionProof, - GroupElement, - Scalar, - Scalar, - GroupElement, - Scalar, - ) { - // Create slices G, H, a, b backed by their respective - // vectors. This lets us reslice as we compress the lengths - // of the vectors in the main loop below. - let mut G = &mut G_vec.to_owned()[..]; - let mut a = &mut a_vec.to_owned()[..]; - let mut b = &mut b_vec.to_owned()[..]; - - // All of the input vectors must have a length that is a power of two. - let mut n = G.len(); - assert!(n.is_power_of_two()); - let lg_n = n.log_2(); - - // All of the input vectors must have the same length. - assert_eq!(G.len(), n); - assert_eq!(a.len(), n); - assert_eq!(b.len(), n); - assert_eq!(blinds_vec.len(), 2 * lg_n); - - let mut L_vec = Vec::with_capacity(lg_n); - let mut R_vec = Vec::with_capacity(lg_n); - let mut blinds_iter = blinds_vec.iter(); - let mut blind_fin = *blind; - - while n != 1 { - n /= 2; - let (a_L, a_R) = a.split_at_mut(n); - let (b_L, b_R) = b.split_at_mut(n); - let (G_L, G_R) = G.split_at_mut(n); - - let c_L = inner_product(a_L, b_R); - let c_R = inner_product(a_R, b_L); - - let (blind_L, blind_R) = blinds_iter.next().unwrap(); - - let L = GroupElement::vartime_multiscalar_mul( - a_L - .iter() - .chain(iter::once(&c_L)) - .chain(iter::once(blind_L)), - G_R.iter().chain(iter::once(Q)).chain(iter::once(H)), - ); - - let R = GroupElement::vartime_multiscalar_mul( - a_R - .iter() - .chain(iter::once(&c_R)) - .chain(iter::once(blind_R)), - G_L.iter().chain(iter::once(Q)).chain(iter::once(H)), - ); - - transcript.append_point(b"L", &L.compress()); - transcript.append_point(b"R", &R.compress()); - - let u = transcript.challenge_scalar(b"u"); - let u_inv = u.invert().unwrap(); - - for i in 0..n { - a_L[i] = a_L[i] * u + u_inv * a_R[i]; - b_L[i] = b_L[i] * u_inv + u * b_R[i]; - G_L[i] = GroupElement::vartime_multiscalar_mul(&[u_inv, u], &[G_L[i], G_R[i]]); - } - - blind_fin = blind_fin + blind_L * u * u + blind_R * u_inv * u_inv; - - L_vec.push(L.compress()); - R_vec.push(R.compress()); - - a = a_L; - b = b_L; - G = G_L; - } - - let Gamma_hat = - GroupElement::vartime_multiscalar_mul(&[a[0], a[0] * b[0], blind_fin], &[G[0], *Q, *H]); - - ( - BulletReductionProof { L_vec, R_vec }, - Gamma_hat, - a[0], - b[0], - G[0], - blind_fin, - ) - } - - /// Computes three vectors of verification scalars \\([u\_{i}^{2}]\\), \\([u\_{i}^{-2}]\\) and \\([s\_{i}]\\) for combined multiscalar multiplication - /// in a parent protocol. See [inner product protocol notes](index.html#verification-equation) for details. - /// The verifier must provide the input length \\(n\\) explicitly to avoid unbounded allocation within the inner product proof. - fn verification_scalars( - &self, - n: usize, - transcript: &mut Transcript, - ) -> Result<(Vec, Vec, Vec), ProofVerifyError> { - let lg_n = self.L_vec.len(); - if lg_n >= 32 { - // 4 billion multiplications should be enough for anyone - // and this check prevents overflow in 1< Result<(GroupElement, GroupElement, Scalar), ProofVerifyError> { - let (u_sq, u_inv_sq, s) = self.verification_scalars(n, transcript)?; - - let Ls = self - .L_vec - .iter() - .map(|p| p.decompress().ok_or(ProofVerifyError::InternalError)) - .collect::, _>>()?; - - let Rs = self - .R_vec - .iter() - .map(|p| p.decompress().ok_or(ProofVerifyError::InternalError)) - .collect::, _>>()?; - - let G_hat = GroupElement::vartime_multiscalar_mul(s.iter(), G.iter()); - let a_hat = inner_product(a, &s); - - let Gamma_hat = GroupElement::vartime_multiscalar_mul( - u_sq - .iter() - .chain(u_inv_sq.iter()) - .chain(iter::once(&Scalar::one())), - Ls.iter().chain(Rs.iter()).chain(iter::once(Gamma)), - ); - - Ok((G_hat, Gamma_hat, a_hat)) - } -} - -/// Computes an inner product of two vectors -/// \\[ -/// {\langle {\mathbf{a}}, {\mathbf{b}} \rangle} = \sum\_{i=0}^{n-1} a\_i \cdot b\_i. -/// \\] -/// Panics if the lengths of \\(\mathbf{a}\\) and \\(\mathbf{b}\\) are not equal. -pub fn inner_product(a: &[Scalar], b: &[Scalar]) -> Scalar { - assert!( - a.len() == b.len(), - "inner_product(a,b): lengths of vectors do not match" - ); - let mut out = Scalar::zero(); - for i in 0..a.len() { - out += a[i] * b[i]; - } - out -} diff --git a/spartan_parallel/src/nizk/mod.rs b/spartan_parallel/src/nizk/mod.rs deleted file mode 100644 index ed2181f7..00000000 --- a/spartan_parallel/src/nizk/mod.rs +++ /dev/null @@ -1,735 +0,0 @@ -#![allow(clippy::too_many_arguments)] -use super::commitments::{Commitments, MultiCommitGens}; -use super::errors::ProofVerifyError; -use super::group::{CompressedGroup, CompressedGroupExt}; -use super::math::Math; -use super::random::RandomTape; -use super::scalar::Scalar; -use super::transcript::{AppendToTranscript, ProofTranscript}; -use merlin::Transcript; -use serde::{Deserialize, Serialize}; - -mod bullet; -use bullet::BulletReductionProof; - -#[derive(Serialize, Deserialize, Debug)] -pub struct KnowledgeProof { - alpha: CompressedGroup, - z1: Scalar, - z2: Scalar, -} - -impl KnowledgeProof { - fn protocol_name() -> &'static [u8] { - b"knowledge proof" - } - - pub fn prove( - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x: &Scalar, - r: &Scalar, - ) -> (KnowledgeProof, CompressedGroup) { - transcript.append_protocol_name(KnowledgeProof::protocol_name()); - - // produce two random Scalars - let t1 = random_tape.random_scalar(b"t1"); - let t2 = random_tape.random_scalar(b"t2"); - - let C = x.commit(r, gens_n).compress(); - C.append_to_transcript(b"C", transcript); - - let alpha = t1.commit(&t2, gens_n).compress(); - alpha.append_to_transcript(b"alpha", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let z1 = x * c + t1; - let z2 = r * c + t2; - - (KnowledgeProof { alpha, z1, z2 }, C) - } - - pub fn verify( - &self, - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - C: &CompressedGroup, - ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(KnowledgeProof::protocol_name()); - C.append_to_transcript(b"C", transcript); - self.alpha.append_to_transcript(b"alpha", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let lhs = self.z1.commit(&self.z2, gens_n).compress(); - let rhs = (c * C.unpack()? + self.alpha.unpack()?).compress(); - - if lhs == rhs { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct EqualityProof { - alpha: CompressedGroup, - z: Scalar, -} - -impl EqualityProof { - fn protocol_name() -> &'static [u8] { - b"equality proof" - } - - pub fn prove( - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - v1: &Scalar, - s1: &Scalar, - v2: &Scalar, - s2: &Scalar, - ) -> (EqualityProof, CompressedGroup, CompressedGroup) { - transcript.append_protocol_name(EqualityProof::protocol_name()); - - // produce a random Scalar - let r = random_tape.random_scalar(b"r"); - - let C1 = v1.commit(s1, gens_n).compress(); - C1.append_to_transcript(b"C1", transcript); - let C2 = v2.commit(s2, gens_n).compress(); - C2.append_to_transcript(b"C2", transcript); - - let alpha = (r * gens_n.h).compress(); - alpha.append_to_transcript(b"alpha", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let z = c * (s1 - s2) + r; - - (EqualityProof { alpha, z }, C1, C2) - } - - pub fn verify( - &self, - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - C1: &CompressedGroup, - C2: &CompressedGroup, - ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(EqualityProof::protocol_name()); - C1.append_to_transcript(b"C1", transcript); - C2.append_to_transcript(b"C2", transcript); - self.alpha.append_to_transcript(b"alpha", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let rhs = { - let C = C1.unpack()? - C2.unpack()?; - (c * C + self.alpha.unpack()?).compress() - }; - - let lhs = (self.z * gens_n.h).compress(); - - if lhs == rhs { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct ProductProof { - alpha: CompressedGroup, - beta: CompressedGroup, - delta: CompressedGroup, - z: [Scalar; 5], -} - -impl ProductProof { - fn protocol_name() -> &'static [u8] { - b"product proof" - } - - pub fn prove( - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x: &Scalar, - rX: &Scalar, - y: &Scalar, - rY: &Scalar, - z: &Scalar, - rZ: &Scalar, - ) -> ( - ProductProof, - CompressedGroup, - CompressedGroup, - CompressedGroup, - ) { - transcript.append_protocol_name(ProductProof::protocol_name()); - - // produce five random Scalar - let b1 = random_tape.random_scalar(b"b1"); - let b2 = random_tape.random_scalar(b"b2"); - let b3 = random_tape.random_scalar(b"b3"); - let b4 = random_tape.random_scalar(b"b4"); - let b5 = random_tape.random_scalar(b"b5"); - - let X = x.commit(rX, gens_n).compress(); - X.append_to_transcript(b"X", transcript); - - let Y = y.commit(rY, gens_n).compress(); - Y.append_to_transcript(b"Y", transcript); - - let Z = z.commit(rZ, gens_n).compress(); - Z.append_to_transcript(b"Z", transcript); - - let alpha = b1.commit(&b2, gens_n).compress(); - alpha.append_to_transcript(b"alpha", transcript); - - let beta = b3.commit(&b4, gens_n).compress(); - beta.append_to_transcript(b"beta", transcript); - - let delta = { - let gens_X = &MultiCommitGens { - n: 1, - G: vec![X.decompress().unwrap()], - h: gens_n.h, - }; - b3.commit(&b5, gens_X).compress() - }; - delta.append_to_transcript(b"delta", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let z1 = b1 + c * x; - let z2 = b2 + c * rX; - let z3 = b3 + c * y; - let z4 = b4 + c * rY; - let z5 = b5 + c * (rZ - rX * y); - let z = [z1, z2, z3, z4, z5]; - - ( - ProductProof { - alpha, - beta, - delta, - z, - }, - X, - Y, - Z, - ) - } - - fn check_equality( - P: &CompressedGroup, - X: &CompressedGroup, - c: &Scalar, - gens_n: &MultiCommitGens, - z1: &Scalar, - z2: &Scalar, - ) -> bool { - let lhs = (P.decompress().unwrap() + c * X.decompress().unwrap()).compress(); - let rhs = z1.commit(z2, gens_n).compress(); - - lhs == rhs - } - - pub fn verify( - &self, - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - X: &CompressedGroup, - Y: &CompressedGroup, - Z: &CompressedGroup, - ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(ProductProof::protocol_name()); - - X.append_to_transcript(b"X", transcript); - Y.append_to_transcript(b"Y", transcript); - Z.append_to_transcript(b"Z", transcript); - self.alpha.append_to_transcript(b"alpha", transcript); - self.beta.append_to_transcript(b"beta", transcript); - self.delta.append_to_transcript(b"delta", transcript); - - let z1 = self.z[0]; - let z2 = self.z[1]; - let z3 = self.z[2]; - let z4 = self.z[3]; - let z5 = self.z[4]; - - let c = transcript.challenge_scalar(b"c"); - - if ProductProof::check_equality(&self.alpha, X, &c, gens_n, &z1, &z2) - && ProductProof::check_equality(&self.beta, Y, &c, gens_n, &z3, &z4) - && ProductProof::check_equality( - &self.delta, - Z, - &c, - &MultiCommitGens { - n: 1, - G: vec![X.unpack()?], - h: gens_n.h, - }, - &z3, - &z5, - ) - { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } -} - -#[derive(Debug, Serialize, Deserialize)] -pub struct DotProductProof { - delta: CompressedGroup, - beta: CompressedGroup, - z: Vec, - z_delta: Scalar, - z_beta: Scalar, -} - -impl DotProductProof { - fn protocol_name() -> &'static [u8] { - b"dot product proof" - } - - pub fn compute_dotproduct(a: &[Scalar], b: &[Scalar]) -> Scalar { - assert_eq!(a.len(), b.len()); - (0..a.len()).map(|i| a[i] * b[i]).sum() - } - - pub fn prove( - gens_1: &MultiCommitGens, - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x_vec: &[Scalar], - blind_x: &Scalar, - a_vec: &[Scalar], - y: &Scalar, - blind_y: &Scalar, - ) -> (DotProductProof, CompressedGroup, CompressedGroup) { - transcript.append_protocol_name(DotProductProof::protocol_name()); - - let n = x_vec.len(); - assert_eq!(x_vec.len(), a_vec.len()); - assert_eq!(gens_n.n, a_vec.len()); - assert_eq!(gens_1.n, 1); - - // produce randomness for the proofs - let d_vec = random_tape.random_vector(b"d_vec", n); - let r_delta = random_tape.random_scalar(b"r_delta"); - let r_beta = random_tape.random_scalar(b"r_beta"); - - let Cx = x_vec.commit(blind_x, gens_n).compress(); - Cx.append_to_transcript(b"Cx", transcript); - - let Cy = y.commit(blind_y, gens_1).compress(); - Cy.append_to_transcript(b"Cy", transcript); - - a_vec.append_to_transcript(b"a", transcript); - - let delta = d_vec.commit(&r_delta, gens_n).compress(); - delta.append_to_transcript(b"delta", transcript); - - let dotproduct_a_d = DotProductProof::compute_dotproduct(a_vec, &d_vec); - - let beta = dotproduct_a_d.commit(&r_beta, gens_1).compress(); - beta.append_to_transcript(b"beta", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let z = (0..d_vec.len()) - .map(|i| c * x_vec[i] + d_vec[i]) - .collect::>(); - - let z_delta = c * blind_x + r_delta; - let z_beta = c * blind_y + r_beta; - - ( - DotProductProof { - delta, - beta, - z, - z_delta, - z_beta, - }, - Cx, - Cy, - ) - } - - pub fn verify( - &self, - gens_1: &MultiCommitGens, - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - a: &[Scalar], - Cx: &CompressedGroup, - Cy: &CompressedGroup, - ) -> Result<(), ProofVerifyError> { - assert_eq!(gens_n.n, a.len()); - assert_eq!(gens_1.n, 1); - - transcript.append_protocol_name(DotProductProof::protocol_name()); - Cx.append_to_transcript(b"Cx", transcript); - Cy.append_to_transcript(b"Cy", transcript); - a.append_to_transcript(b"a", transcript); - self.delta.append_to_transcript(b"delta", transcript); - self.beta.append_to_transcript(b"beta", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let mut result = - c * Cx.unpack()? + self.delta.unpack()? == self.z.commit(&self.z_delta, gens_n); - - let dotproduct_z_a = DotProductProof::compute_dotproduct(&self.z, a); - result &= c * Cy.unpack()? + self.beta.unpack()? == dotproduct_z_a.commit(&self.z_beta, gens_1); - - if result { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } -} - -#[derive(Clone, Serialize)] -pub struct DotProductProofGens { - n: usize, - pub gens_n: MultiCommitGens, - pub gens_1: MultiCommitGens, -} - -impl DotProductProofGens { - pub fn new(n: usize, label: &[u8]) -> Self { - let (gens_n, gens_1) = MultiCommitGens::new(n + 1, label).split_at(n); - DotProductProofGens { n, gens_n, gens_1 } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct DotProductProofLog { - bullet_reduction_proof: BulletReductionProof, - delta: CompressedGroup, - beta: CompressedGroup, - z1: Scalar, - z2: Scalar, -} - -impl DotProductProofLog { - fn protocol_name() -> &'static [u8] { - b"dot product proof (log)" - } - - pub fn compute_dotproduct(a: &[Scalar], b: &[Scalar]) -> Scalar { - assert_eq!(a.len(), b.len()); - (0..a.len()).map(|i| a[i] * b[i]).sum() - } - - pub fn prove( - gens: &DotProductProofGens, - transcript: &mut Transcript, - random_tape: &mut RandomTape, - x_vec: &[Scalar], - blind_x: &Scalar, - a_vec: &[Scalar], - y: &Scalar, - blind_y: &Scalar, - ) -> (DotProductProofLog, CompressedGroup, CompressedGroup) { - transcript.append_protocol_name(DotProductProofLog::protocol_name()); - - let n = x_vec.len(); - assert_eq!(x_vec.len(), a_vec.len()); - assert!(gens.n >= n); - - // produce randomness for generating a proof - let d = random_tape.random_scalar(b"d"); - let r_delta = random_tape.random_scalar(b"r_delta"); - let r_beta = random_tape.random_scalar(b"r_delta"); - let blinds_vec = { - let v1 = random_tape.random_vector(b"blinds_vec_1", 2 * n.log_2()); - let v2 = random_tape.random_vector(b"blinds_vec_2", 2 * n.log_2()); - (0..v1.len()) - .map(|i| (v1[i], v2[i])) - .collect::>() - }; - - let Cx = x_vec.commit(blind_x, &gens.gens_n).compress(); - Cx.append_to_transcript(b"Cx", transcript); - let Cy = y.commit(blind_y, &gens.gens_1).compress(); - Cy.append_to_transcript(b"Cy", transcript); - a_vec.append_to_transcript(b"a", transcript); - - // sample a random base and scale the generator used for - // the output of the inner product - let r = transcript.challenge_scalar(b"r"); - let gens_1_scaled = gens.gens_1.scale(&r); - - let blind_Gamma = blind_x + r * blind_y; - let (bullet_reduction_proof, _Gamma_hat, x_hat, a_hat, g_hat, rhat_Gamma) = - BulletReductionProof::prove( - transcript, - &gens_1_scaled.G[0], - &gens.gens_n.G[..n], - &gens.gens_n.h, - x_vec, - a_vec, - &blind_Gamma, - &blinds_vec, - ); - - let y_hat = x_hat * a_hat; - - let delta = { - let gens_hat = MultiCommitGens { - n: 1, - G: vec![g_hat], - h: gens.gens_1.h, - }; - d.commit(&r_delta, &gens_hat).compress() - }; - delta.append_to_transcript(b"delta", transcript); - - let beta = d.commit(&r_beta, &gens_1_scaled).compress(); - beta.append_to_transcript(b"beta", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let z1 = d + c * y_hat; - let z2 = a_hat * (c * rhat_Gamma + r_beta) + r_delta; - - ( - DotProductProofLog { - bullet_reduction_proof, - delta, - beta, - z1, - z2, - }, - Cx, - Cy, - ) - } - - pub fn verify( - &self, - n: usize, - gens: &DotProductProofGens, - transcript: &mut Transcript, - a: &[Scalar], - Cx: &CompressedGroup, - Cy: &CompressedGroup, - ) -> Result<(), ProofVerifyError> { - assert!(gens.n >= n); - assert_eq!(a.len(), n); - - transcript.append_protocol_name(DotProductProofLog::protocol_name()); - Cx.append_to_transcript(b"Cx", transcript); - Cy.append_to_transcript(b"Cy", transcript); - a.append_to_transcript(b"a", transcript); - - // sample a random base and scale the generator used for - // the output of the inner product - let r = transcript.challenge_scalar(b"r"); - let gens_1_scaled = gens.gens_1.scale(&r); - - let Gamma = Cx.unpack()? + r * Cy.unpack()?; - - let (g_hat, Gamma_hat, a_hat) = - self - .bullet_reduction_proof - .verify(n, a, transcript, &Gamma, &gens.gens_n.G[..n])?; - - self.delta.append_to_transcript(b"delta", transcript); - self.beta.append_to_transcript(b"beta", transcript); - - let c = transcript.challenge_scalar(b"c"); - - let c_s = &c; - let beta_s = self.beta.unpack()?; - let a_hat_s = &a_hat; - let delta_s = self.delta.unpack()?; - let z1_s = &self.z1; - let z2_s = &self.z2; - - let lhs = ((Gamma_hat * c_s + beta_s) * a_hat_s + delta_s).compress(); - let rhs = ((g_hat + gens_1_scaled.G[0] * a_hat_s) * z1_s + gens_1_scaled.h * z2_s).compress(); - - assert_eq!(lhs, rhs); - - if lhs == rhs { - Ok(()) - } else { - Err(ProofVerifyError::InternalError) - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use rand::rngs::OsRng; - #[test] - fn check_knowledgeproof() { - let mut csprng: OsRng = OsRng; - - let gens_1 = MultiCommitGens::new(1, b"test-knowledgeproof"); - - let x = Scalar::random(&mut csprng); - let r = Scalar::random(&mut csprng); - - let mut random_tape = RandomTape::new(b"proof"); - let mut prover_transcript = Transcript::new(b"example"); - let (proof, committed_value) = - KnowledgeProof::prove(&gens_1, &mut prover_transcript, &mut random_tape, &x, &r); - - let mut verifier_transcript = Transcript::new(b"example"); - assert!(proof - .verify(&gens_1, &mut verifier_transcript, &committed_value) - .is_ok()); - } - - #[test] - fn check_equalityproof() { - let mut csprng: OsRng = OsRng; - - let gens_1 = MultiCommitGens::new(1, b"test-equalityproof"); - let v1 = Scalar::random(&mut csprng); - let v2 = v1; - let s1 = Scalar::random(&mut csprng); - let s2 = Scalar::random(&mut csprng); - - let mut random_tape = RandomTape::new(b"proof"); - let mut prover_transcript = Transcript::new(b"example"); - let (proof, C1, C2) = EqualityProof::prove( - &gens_1, - &mut prover_transcript, - &mut random_tape, - &v1, - &s1, - &v2, - &s2, - ); - - let mut verifier_transcript = Transcript::new(b"example"); - assert!(proof - .verify(&gens_1, &mut verifier_transcript, &C1, &C2) - .is_ok()); - } - - #[test] - fn check_productproof() { - let mut csprng: OsRng = OsRng; - - let gens_1 = MultiCommitGens::new(1, b"test-productproof"); - let x = Scalar::random(&mut csprng); - let rX = Scalar::random(&mut csprng); - let y = Scalar::random(&mut csprng); - let rY = Scalar::random(&mut csprng); - let z = x * y; - let rZ = Scalar::random(&mut csprng); - - let mut random_tape = RandomTape::new(b"proof"); - let mut prover_transcript = Transcript::new(b"example"); - let (proof, X, Y, Z) = ProductProof::prove( - &gens_1, - &mut prover_transcript, - &mut random_tape, - &x, - &rX, - &y, - &rY, - &z, - &rZ, - ); - - let mut verifier_transcript = Transcript::new(b"example"); - assert!(proof - .verify(&gens_1, &mut verifier_transcript, &X, &Y, &Z) - .is_ok()); - } - - #[test] - fn check_dotproductproof() { - let mut csprng: OsRng = OsRng; - - let n = 1024; - - let gens_1 = MultiCommitGens::new(1, b"test-two"); - let gens_1024 = MultiCommitGens::new(n, b"test-1024"); - - let mut x: Vec = Vec::new(); - let mut a: Vec = Vec::new(); - for _ in 0..n { - x.push(Scalar::random(&mut csprng)); - a.push(Scalar::random(&mut csprng)); - } - let y = DotProductProofLog::compute_dotproduct(&x, &a); - let r_x = Scalar::random(&mut csprng); - let r_y = Scalar::random(&mut csprng); - - let mut random_tape = RandomTape::new(b"proof"); - let mut prover_transcript = Transcript::new(b"example"); - let (proof, Cx, Cy) = DotProductProof::prove( - &gens_1, - &gens_1024, - &mut prover_transcript, - &mut random_tape, - &x, - &r_x, - &a, - &y, - &r_y, - ); - - let mut verifier_transcript = Transcript::new(b"example"); - assert!(proof - .verify(&gens_1, &gens_1024, &mut verifier_transcript, &a, &Cx, &Cy) - .is_ok()); - } - - #[test] - fn check_dotproductproof_log() { - let mut csprng: OsRng = OsRng; - - let n = 1024; - - let gens = DotProductProofGens::new(n, b"test-1024"); - - let x: Vec = (0..n).map(|_i| Scalar::random(&mut csprng)).collect(); - let a: Vec = (0..n).map(|_i| Scalar::random(&mut csprng)).collect(); - let y = DotProductProof::compute_dotproduct(&x, &a); - - let r_x = Scalar::random(&mut csprng); - let r_y = Scalar::random(&mut csprng); - - let mut random_tape = RandomTape::new(b"proof"); - let mut prover_transcript = Transcript::new(b"example"); - let (proof, Cx, Cy) = DotProductProofLog::prove( - &gens, - &mut prover_transcript, - &mut random_tape, - &x, - &r_x, - &a, - &y, - &r_y, - ); - - let mut verifier_transcript = Transcript::new(b"example"); - assert!(proof - .verify(n, &gens, &mut verifier_transcript, &a, &Cx, &Cy) - .is_ok()); - } -} diff --git a/spartan_parallel/src/product_tree.rs b/spartan_parallel/src/product_tree.rs index 79233e0c..c42d9a79 100644 --- a/spartan_parallel/src/product_tree.rs +++ b/spartan_parallel/src/product_tree.rs @@ -1,31 +1,32 @@ #![allow(dead_code)] +use crate::scalar::SpartanExtensionField; + use super::dense_mlpoly::DensePolynomial; use super::dense_mlpoly::EqPolynomial; use super::math::Math; -use super::scalar::Scalar; use super::sumcheck::SumcheckInstanceProof; use super::transcript::ProofTranscript; use merlin::Transcript; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone)] -pub struct ProductCircuit { - left_vec: Vec, - right_vec: Vec, +pub struct ProductCircuit { + left_vec: Vec>, + right_vec: Vec>, } -impl ProductCircuit { +impl ProductCircuit { fn compute_layer( - inp_left: &DensePolynomial, - inp_right: &DensePolynomial, - ) -> (DensePolynomial, DensePolynomial) { + inp_left: &DensePolynomial, + inp_right: &DensePolynomial, + ) -> (DensePolynomial, DensePolynomial) { let len = inp_left.len() + inp_right.len(); let outp_left = (0..len / 4) .map(|i| inp_left[i] * inp_right[i]) - .collect::>(); + .collect::>(); let outp_right = (len / 4..len / 2) .map(|i| inp_left[i] * inp_right[i]) - .collect::>(); + .collect::>(); ( DensePolynomial::new(outp_left), @@ -33,9 +34,9 @@ impl ProductCircuit { ) } - pub fn new(poly: &DensePolynomial) -> Self { - let mut left_vec: Vec = Vec::new(); - let mut right_vec: Vec = Vec::new(); + pub fn new(poly: &DensePolynomial) -> Self { + let mut left_vec: Vec> = Vec::new(); + let mut right_vec: Vec> = Vec::new(); let num_layers = poly.len().log_2(); let (outp_left, outp_right) = poly.split(poly.len() / 2); @@ -55,7 +56,7 @@ impl ProductCircuit { } } - pub fn evaluate(&self) -> Scalar { + pub fn evaluate(&self) -> S { let len = self.left_vec.len(); assert_eq!(self.left_vec[len - 1].get_num_vars(), 0); assert_eq!(self.right_vec[len - 1].get_num_vars(), 0); @@ -64,14 +65,18 @@ impl ProductCircuit { } #[derive(Clone)] -pub struct DotProductCircuit { - left: DensePolynomial, - right: DensePolynomial, - weight: DensePolynomial, +pub struct DotProductCircuit { + left: DensePolynomial, + right: DensePolynomial, + weight: DensePolynomial, } -impl DotProductCircuit { - pub fn new(left: DensePolynomial, right: DensePolynomial, weight: DensePolynomial) -> Self { +impl DotProductCircuit { + pub fn new( + left: DensePolynomial, + right: DensePolynomial, + weight: DensePolynomial, + ) -> Self { assert_eq!(left.len(), right.len()); assert_eq!(left.len(), weight.len()); DotProductCircuit { @@ -81,13 +86,13 @@ impl DotProductCircuit { } } - pub fn evaluate(&self) -> Scalar { + pub fn evaluate(&self) -> S { (0..self.left.len()) .map(|i| self.left[i] * self.right[i] * self.weight[i]) .sum() } - pub fn split(&mut self) -> (DotProductCircuit, DotProductCircuit) { + pub fn split(&mut self) -> (DotProductCircuit, DotProductCircuit) { let idx = self.left.len() / 2; assert_eq!(idx * 2, self.left.len()); let (l1, l2) = self.left.split(idx); @@ -110,20 +115,20 @@ impl DotProductCircuit { #[allow(dead_code)] #[derive(Debug, Serialize, Deserialize)] -pub struct LayerProof { - pub proof: SumcheckInstanceProof, - pub claims: Vec, +pub struct LayerProof { + pub proof: SumcheckInstanceProof, + pub claims: Vec, } #[allow(dead_code)] -impl LayerProof { +impl LayerProof { pub fn verify( &self, - claim: Scalar, + claim: S, num_rounds: usize, degree_bound: usize, transcript: &mut Transcript, - ) -> (Scalar, Vec) { + ) -> (S, Vec) { self .proof .verify(claim, num_rounds, degree_bound, transcript) @@ -133,21 +138,21 @@ impl LayerProof { #[allow(dead_code)] #[derive(Debug, Serialize, Deserialize)] -pub struct LayerProofBatched { - pub proof: SumcheckInstanceProof, - pub claims_prod_left: Vec, - pub claims_prod_right: Vec, +pub struct LayerProofBatched { + pub proof: SumcheckInstanceProof, + pub claims_prod_left: Vec, + pub claims_prod_right: Vec, } #[allow(dead_code)] -impl LayerProofBatched { +impl LayerProofBatched { pub fn verify( &self, - claim: Scalar, + claim: S, num_rounds: usize, degree_bound: usize, transcript: &mut Transcript, - ) -> (Scalar, Vec) { + ) -> (S, Vec) { self .proof .verify(claim, num_rounds, degree_bound, transcript) @@ -156,23 +161,20 @@ impl LayerProofBatched { } #[derive(Debug, Serialize, Deserialize)] -pub struct ProductCircuitEvalProof { - proof: Vec, +pub struct ProductCircuitEvalProof { + proof: Vec>, } #[derive(Debug, Serialize, Deserialize)] -pub struct ProductCircuitEvalProofBatched { - proof: Vec, - claims_dotp: (Vec, Vec, Vec), +pub struct ProductCircuitEvalProofBatched { + proof: Vec>, + claims_dotp: (Vec, Vec, Vec), } -impl ProductCircuitEvalProof { +impl ProductCircuitEvalProof { #![allow(dead_code)] - pub fn prove( - circuit: &mut ProductCircuit, - transcript: &mut Transcript, - ) -> (Self, Scalar, Vec) { - let mut proof: Vec = Vec::new(); + pub fn prove(circuit: &mut ProductCircuit, transcript: &mut Transcript) -> (Self, S, Vec) { + let mut proof: Vec> = Vec::new(); let num_layers = circuit.left_vec.len(); let mut claim = circuit.evaluate(); @@ -184,10 +186,9 @@ impl ProductCircuitEvalProof { assert_eq!(poly_C.len(), len / 2); let num_rounds_prod = poly_C.len().log_2(); - let comb_func_prod = |poly_A_comp: &Scalar, - poly_B_comp: &Scalar, - poly_C_comp: &Scalar| - -> Scalar { poly_A_comp * poly_B_comp * poly_C_comp }; + let comb_func_prod = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { + *poly_A_comp * *poly_B_comp * *poly_C_comp + }; let (proof_prod, rand_prod, claims_prod) = SumcheckInstanceProof::prove_cubic( &claim, num_rounds_prod, @@ -218,15 +219,10 @@ impl ProductCircuitEvalProof { (ProductCircuitEvalProof { proof }, claim, rand) } - pub fn verify( - &self, - eval: Scalar, - len: usize, - transcript: &mut Transcript, - ) -> (Scalar, Vec) { + pub fn verify(&self, eval: S, len: usize, transcript: &mut Transcript) -> (S, Vec) { let num_layers = len.log_2(); let mut claim = eval; - let mut rand: Vec = Vec::new(); + let mut rand: Vec = Vec::new(); //let mut num_rounds = 0; assert_eq!(self.proof.len(), num_layers); for (num_rounds, i) in (0..num_layers).enumerate() { @@ -237,16 +233,16 @@ impl ProductCircuitEvalProof { transcript.append_scalar(b"claim_prod_right", &claims_prod[1]); assert_eq!(rand.len(), rand_prod.len()); - let eq: Scalar = (0..rand.len()) + let eq: S = (0..rand.len()) .map(|i| { - rand[i] * rand_prod[i] + (Scalar::one() - rand[i]) * (Scalar::one() - rand_prod[i]) + rand[i] * rand_prod[i] + (S::field_one() - rand[i]) * (S::field_one() - rand_prod[i]) }) .product(); assert_eq!(claims_prod[0] * claims_prod[1] * eq, claim_last); // produce a random challenge let r_layer = transcript.challenge_scalar(b"challenge_r_layer"); - claim = (Scalar::one() - r_layer) * claims_prod[0] + r_layer * claims_prod[1]; + claim = (S::field_one() - r_layer) * claims_prod[0] + r_layer * claims_prod[1]; let mut ext = vec![r_layer]; ext.extend(rand_prod); rand = ext; @@ -256,21 +252,21 @@ impl ProductCircuitEvalProof { } } -impl ProductCircuitEvalProofBatched { +impl ProductCircuitEvalProofBatched { pub fn prove( - prod_circuit_vec: &mut Vec<&mut ProductCircuit>, - dotp_circuit_vec: &mut Vec<&mut DotProductCircuit>, + prod_circuit_vec: &mut Vec<&mut ProductCircuit>, + dotp_circuit_vec: &mut Vec<&mut DotProductCircuit>, transcript: &mut Transcript, - ) -> (Self, Vec) { + ) -> (Self, Vec) { assert!(!prod_circuit_vec.is_empty()); let mut claims_dotp_final = (Vec::new(), Vec::new(), Vec::new()); - let mut proof_layers: Vec = Vec::new(); + let mut proof_layers: Vec> = Vec::new(); let num_layers = prod_circuit_vec[0].left_vec.len(); let mut claims_to_verify = (0..prod_circuit_vec.len()) .map(|i| prod_circuit_vec[i].evaluate()) - .collect::>(); + .collect::>(); let mut rand = Vec::new(); for layer_id in (0..num_layers).rev() { // prepare paralell instance that share poly_C first @@ -281,13 +277,12 @@ impl ProductCircuitEvalProofBatched { assert_eq!(poly_C_par.len(), len / 2); let num_rounds_prod = poly_C_par.len().log_2(); - let comb_func_prod = |poly_A_comp: &Scalar, - poly_B_comp: &Scalar, - poly_C_comp: &Scalar| - -> Scalar { poly_A_comp * poly_B_comp * poly_C_comp }; + let comb_func_prod = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { + *poly_A_comp * *poly_B_comp * *poly_C_comp + }; - let mut poly_A_batched_par: Vec<&mut DensePolynomial> = Vec::new(); - let mut poly_B_batched_par: Vec<&mut DensePolynomial> = Vec::new(); + let mut poly_A_batched_par: Vec<&mut DensePolynomial> = Vec::new(); + let mut poly_B_batched_par: Vec<&mut DensePolynomial> = Vec::new(); for prod_circuit in prod_circuit_vec.iter_mut() { poly_A_batched_par.push(&mut prod_circuit.left_vec[layer_id]); poly_B_batched_par.push(&mut prod_circuit.right_vec[layer_id]) @@ -299,9 +294,9 @@ impl ProductCircuitEvalProofBatched { ); // prepare sequential instances that don't share poly_C - let mut poly_A_batched_seq: Vec<&mut DensePolynomial> = Vec::new(); - let mut poly_B_batched_seq: Vec<&mut DensePolynomial> = Vec::new(); - let mut poly_C_batched_seq: Vec<&mut DensePolynomial> = Vec::new(); + let mut poly_A_batched_seq: Vec<&mut DensePolynomial> = Vec::new(); + let mut poly_B_batched_seq: Vec<&mut DensePolynomial> = Vec::new(); + let mut poly_C_batched_seq: Vec<&mut DensePolynomial> = Vec::new(); if layer_id == 0 && !dotp_circuit_vec.is_empty() { // add additional claims for item in dotp_circuit_vec.iter() { @@ -326,6 +321,7 @@ impl ProductCircuitEvalProofBatched { // produce a fresh set of coeffs and a joint claim let coeff_vec = transcript.challenge_vector(b"rand_coeffs_next_layer", claims_to_verify.len()); + let claim = (0..claims_to_verify.len()) .map(|i| claims_to_verify[i] * coeff_vec[i]) .sum(); @@ -361,7 +357,7 @@ impl ProductCircuitEvalProofBatched { claims_to_verify = (0..prod_circuit_vec.len()) .map(|i| claims_prod_left[i] + r_layer * (claims_prod_right[i] - claims_prod_left[i])) - .collect::>(); + .collect::>(); let mut ext = vec![r_layer]; ext.extend(rand_prod); @@ -385,25 +381,25 @@ impl ProductCircuitEvalProofBatched { pub fn verify( &self, - claims_prod_vec: &[Scalar], - claims_dotp_vec: &[Scalar], + claims_prod_vec: &[S], + claims_dotp_vec: &[S], len: usize, transcript: &mut Transcript, - ) -> (Vec, Vec, Vec) { + ) -> (Vec, Vec, Vec) { let num_layers = len.log_2(); - let mut rand: Vec = Vec::new(); + let mut rand: Vec = Vec::new(); //let mut num_rounds = 0; assert_eq!(self.proof.len(), num_layers); let mut claims_to_verify = claims_prod_vec.to_owned(); - let mut claims_to_verify_dotp: Vec = Vec::new(); + let mut claims_to_verify_dotp: Vec = Vec::new(); for (num_rounds, i) in (0..num_layers).enumerate() { if i == num_layers - 1 { claims_to_verify.extend(claims_dotp_vec); } // produce random coefficients, one for each instance - let coeff_vec = + let coeff_vec: Vec = transcript.challenge_vector(b"rand_coeffs_next_layer", claims_to_verify.len()); // produce a joint claim @@ -424,12 +420,12 @@ impl ProductCircuitEvalProofBatched { } assert_eq!(rand.len(), rand_prod.len()); - let eq: Scalar = (0..rand.len()) + let eq: S = (0..rand.len()) .map(|i| { - rand[i] * rand_prod[i] + (Scalar::one() - rand[i]) * (Scalar::one() - rand_prod[i]) + rand[i] * rand_prod[i] + (S::field_one() - rand[i]) * (S::field_one() - rand_prod[i]) }) .product(); - let mut claim_expected: Scalar = (0..claims_prod_vec.len()) + let mut claim_expected: S = (0..claims_prod_vec.len()) .map(|i| coeff_vec[i] * (claims_prod_left[i] * claims_prod_right[i] * eq)) .sum(); @@ -442,10 +438,11 @@ impl ProductCircuitEvalProofBatched { transcript.append_scalar(b"claim_dotp_right", &claims_dotp_right[i]); transcript.append_scalar(b"claim_dotp_weight", &claims_dotp_weight[i]); - claim_expected += coeff_vec[i + num_prod_instances] - * claims_dotp_left[i] - * claims_dotp_right[i] - * claims_dotp_weight[i]; + claim_expected = claim_expected + + coeff_vec[i + num_prod_instances] + * claims_dotp_left[i] + * claims_dotp_right[i] + * claims_dotp_weight[i]; } } @@ -456,7 +453,7 @@ impl ProductCircuitEvalProofBatched { claims_to_verify = (0..claims_prod_left.len()) .map(|i| claims_prod_left[i] + r_layer * (claims_prod_right[i] - claims_prod_left[i])) - .collect::>(); + .collect::>(); // add claims to verify for dotp circuit if i == num_layers - 1 { diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 0c4f58fb..7e280814 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; +use crate::scalar::SpartanExtensionField; use crate::transcript::AppendToTranscript; use super::custom_dense_mlpoly::DensePolynomialPqx; @@ -7,10 +8,9 @@ use super::dense_mlpoly::DensePolynomial; use super::errors::ProofVerifyError; use super::math::Math; use super::random::RandomTape; -use super::scalar::Scalar; use super::sparse_mlpoly::{ - MultiSparseMatPolynomialAsDense, SparseMatEntry, SparseMatPolyCommitment, - SparseMatPolyCommitmentGens, SparseMatPolyEvalProof, SparseMatPolynomial, + MultiSparseMatPolynomialAsDense, SparseMatEntry, SparseMatPolyCommitment, SparseMatPolyEvalProof, + SparseMatPolynomial, }; use super::timer::Timer; use flate2::{write::ZlibEncoder, Compression}; @@ -18,7 +18,7 @@ use merlin::Transcript; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize, Clone)] -pub struct R1CSInstance { +pub struct R1CSInstance { // num_instances DOES NOT need to be a power of 2! num_instances: usize, // num_cons and num_vars need to be power of 2 @@ -26,45 +26,19 @@ pub struct R1CSInstance { num_cons: Vec, num_vars: usize, // List of individual A, B, C for matrix multiplication - A_list: Vec, - B_list: Vec, - C_list: Vec, -} - -#[derive(Serialize)] -pub struct R1CSCommitmentGens { - gens: SparseMatPolyCommitmentGens, -} - -impl R1CSCommitmentGens { - pub fn new( - label: &'static [u8], - num_instances: usize, - num_cons: usize, - num_vars: usize, - num_nz_entries: usize, - ) -> R1CSCommitmentGens { - let num_poly_vars_x = num_instances.log_2() + num_cons.log_2(); - let num_poly_vars_y = num_vars.log_2(); - let gens = SparseMatPolyCommitmentGens::new( - label, - num_poly_vars_x, - num_poly_vars_y, - num_instances * num_nz_entries, - 3, - ); - R1CSCommitmentGens { gens } - } + A_list: Vec>, + B_list: Vec>, + C_list: Vec>, } #[derive(Debug, Serialize, Deserialize, Clone)] -pub struct R1CSCommitment { +pub struct R1CSCommitment { num_cons: usize, num_vars: usize, - comm: SparseMatPolyCommitment, + comm: SparseMatPolyCommitment, } -impl AppendToTranscript for R1CSCommitment { +impl AppendToTranscript for R1CSCommitment { fn append_to_transcript(&self, _label: &'static [u8], transcript: &mut Transcript) { transcript.append_u64(b"num_cons", self.num_cons as u64); transcript.append_u64(b"num_vars", self.num_vars as u64); @@ -72,11 +46,11 @@ impl AppendToTranscript for R1CSCommitment { } } -pub struct R1CSDecommitment { - dense: MultiSparseMatPolynomialAsDense, +pub struct R1CSDecommitment { + dense: MultiSparseMatPolynomialAsDense, } -impl R1CSCommitment { +impl R1CSCommitment { pub fn get_num_cons(&self) -> usize { self.num_cons } @@ -86,16 +60,16 @@ impl R1CSCommitment { } } -impl R1CSInstance { +impl R1CSInstance { pub fn new( num_instances: usize, max_num_cons: usize, num_cons: Vec, num_vars: usize, - A_list: &Vec>, - B_list: &Vec>, - C_list: &Vec>, - ) -> R1CSInstance { + A_list: &Vec>, + B_list: &Vec>, + C_list: &Vec>, + ) -> R1CSInstance { Timer::print(&format!("number_of_instances {num_instances}")); Timer::print(&format!("number_of_constraints {max_num_cons}")); Timer::print(&format!("number_of_variables {num_vars}")); @@ -135,13 +109,13 @@ impl R1CSInstance { let C = &C_list[inst]; let list_A = (0..A.len()) .map(|i| SparseMatEntry::new(A[i].0, A[i].1, A[i].2)) - .collect::>(); + .collect::>>(); let list_B = (0..B.len()) .map(|i| SparseMatEntry::new(B[i].0, B[i].1, B[i].2)) - .collect::>(); + .collect::>>(); let list_C = (0..C.len()) .map(|i| SparseMatEntry::new(C[i].0, C[i].1, C[i].2)) - .collect::>(); + .collect::>>(); poly_A_list.push(SparseMatPolynomial::new( num_poly_vars_x, num_poly_vars_y, @@ -159,13 +133,13 @@ impl R1CSInstance { )); let mut list_A = (0..A.len()) .map(|i| SparseMatEntry::new(inst * max_num_cons + A[i].0, A[i].1, A[i].2)) - .collect::>(); + .collect::>>(); let mut list_B = (0..B.len()) .map(|i| SparseMatEntry::new(inst * max_num_cons + B[i].0, B[i].1, B[i].2)) - .collect::>(); + .collect::>>(); let mut list_C = (0..C.len()) .map(|i| SparseMatEntry::new(inst * max_num_cons + C[i].0, C[i].1, C[i].2)) - .collect::>(); + .collect::>>(); mat_A.append(&mut list_A); mat_B.append(&mut list_B); mat_C.append(&mut list_C); @@ -233,8 +207,12 @@ impl R1CSInstance { max_num_inputs: usize, max_num_cons: usize, num_cons: Vec, - z_mat: &Vec>>>, - ) -> (DensePolynomialPqx, DensePolynomialPqx, DensePolynomialPqx) { + z_mat: &Vec>>>, + ) -> ( + DensePolynomialPqx, + DensePolynomialPqx, + DensePolynomialPqx, + ) { assert!(self.num_instances == 1 || self.num_instances == num_instances); assert_eq!(max_num_cons, self.max_num_cons); let mut Az = Vec::new(); @@ -254,19 +232,19 @@ impl R1CSInstance { let z = &z_list[q]; Az[p].push(vec![self.A_list[p_inst].multiply_vec_disjoint_rounds( - num_cons[p_inst], + num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], z, )]); Bz[p].push(vec![self.B_list[p_inst].multiply_vec_disjoint_rounds( - num_cons[p_inst], + num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], z, )]); Cz[p].push(vec![self.C_list[p_inst].multiply_vec_disjoint_rounds( - num_cons[p_inst], + num_cons[p_inst].clone(), max_num_inputs, num_inputs[p], z, @@ -304,8 +282,8 @@ impl R1CSInstance { num_instances: usize, num_rows: usize, num_cols: usize, - evals: &[Scalar], - ) -> (Vec, Vec, Vec) { + evals: &[S], + ) -> (Vec, Vec, Vec) { assert!(self.num_instances == 1 || self.num_instances == num_instances); assert_eq!(num_rows, self.max_num_cons); assert_eq!(num_cols, self.num_vars); @@ -333,9 +311,9 @@ impl R1CSInstance { } // Zero instances for _ in num_instances..num_instances.next_power_of_two() { - evals_A_list.extend(vec![Scalar::zero(); num_cols]); - evals_B_list.extend(vec![Scalar::zero(); num_cols]); - evals_C_list.extend(vec![Scalar::zero(); num_cols]); + evals_A_list.extend(vec![S::field_zero(); num_cols]); + evals_B_list.extend(vec![S::field_zero(); num_cols]); + evals_C_list.extend(vec![S::field_zero(); num_cols]); } } @@ -351,12 +329,12 @@ impl R1CSInstance { num_segs: usize, max_num_cols: usize, num_cols: &Vec, - evals: &[Scalar], + evals: &[S], // Output in p, q, w, i format, where q section has length 1 ) -> ( - Vec>>>, - Vec>>>, - Vec>>>, + Vec>>>, + Vec>>>, + Vec>>>, ) { assert!(self.num_instances == 1 || self.num_instances == num_instances); assert_eq!(num_rows, &self.num_cons); @@ -396,7 +374,7 @@ impl R1CSInstance { (evals_A_list, evals_B_list, evals_C_list) } - pub fn multi_evaluate(&self, rx: &[Scalar], ry: &[Scalar]) -> Vec { + pub fn multi_evaluate(&self, rx: &[S], ry: &[S]) -> Vec { let mut eval_list = Vec::new(); // Evaluate each individual poly on [rx, ry] for i in 0..self.num_instances { @@ -412,12 +390,12 @@ impl R1CSInstance { pub fn multi_evaluate_bound_rp( &self, - rp: &[Scalar], - rx: &[Scalar], - ry: &[Scalar], + rp: &[S], + rx: &[S], + ry: &[S], ) -> ( - Vec, // Concatenation of each individual block - (Scalar, Scalar, Scalar), // Combined, bound to rp + Vec, // Concatenation of each individual block + (S, S, S), // Combined, bound to rp ) { let mut a_evals = Vec::new(); let mut b_evals = Vec::new(); @@ -445,7 +423,7 @@ impl R1CSInstance { } // Used if there is only one instance - pub fn evaluate(&self, rx: &[Scalar], ry: &[Scalar]) -> (Scalar, Scalar, Scalar) { + pub fn evaluate(&self, rx: &[S], ry: &[S]) -> (S, S, S) { assert_eq!(self.num_instances, 1); let evals = SparseMatPolynomial::multi_evaluate( @@ -464,16 +442,19 @@ impl R1CSInstance { while base < val { base *= 8; } - base + return base; } pub fn multi_commit( &self, - gens: &R1CSCommitmentGens, - ) -> (Vec>, Vec, Vec) { + ) -> ( + Vec>, + Vec>, + Vec>, + ) { let mut nnz_size: HashMap = HashMap::new(); let mut label_map: Vec> = Vec::new(); - let mut sparse_polys_list: Vec> = Vec::new(); + let mut sparse_polys_list: Vec>> = Vec::new(); for i in 0..self.num_instances { // A_list @@ -514,7 +495,7 @@ impl R1CSInstance { let mut r1cs_comm_list = Vec::new(); let mut r1cs_decomm_list = Vec::new(); for sparse_polys in sparse_polys_list { - let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys, &gens.gens); + let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys); let r1cs_comm = R1CSCommitment { num_cons: self.num_instances * self.max_num_cons, num_vars: self.num_vars, @@ -530,14 +511,15 @@ impl R1CSInstance { } // Used if there is only one instance - pub fn commit(&self, gens: &R1CSCommitmentGens) -> (R1CSCommitment, R1CSDecommitment) { + pub fn commit(&self) -> (R1CSCommitment, R1CSDecommitment) { let mut sparse_polys = Vec::new(); for i in 0..self.num_instances { sparse_polys.push(&self.A_list[i]); sparse_polys.push(&self.B_list[i]); sparse_polys.push(&self.C_list[i]); } - let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys, &gens.gens); + + let (comm, dense) = SparseMatPolynomial::multi_commit(&sparse_polys); let r1cs_comm = R1CSCommitment { num_cons: self.num_instances * self.max_num_cons, num_vars: self.num_vars, @@ -551,30 +533,22 @@ impl R1CSInstance { } #[derive(Debug, Serialize, Deserialize)] -pub struct R1CSEvalProof { - proof: SparseMatPolyEvalProof, +pub struct R1CSEvalProof { + proof: SparseMatPolyEvalProof, } -impl R1CSEvalProof { +impl R1CSEvalProof { pub fn prove( - decomm: &R1CSDecommitment, - rx: &[Scalar], // point at which the polynomial is evaluated - ry: &[Scalar], - evals: &Vec, - gens: &R1CSCommitmentGens, + decomm: &R1CSDecommitment, + rx: &[S], // point at which the polynomial is evaluated + ry: &[S], + evals: &Vec, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> R1CSEvalProof { + random_tape: &mut RandomTape, + ) -> R1CSEvalProof { let timer = Timer::new("R1CSEvalProof::prove"); - let proof = SparseMatPolyEvalProof::prove( - &decomm.dense, - rx, - ry, - evals, - &gens.gens, - transcript, - random_tape, - ); + let proof = + SparseMatPolyEvalProof::prove(&decomm.dense, rx, ry, evals, transcript, random_tape); timer.stop(); R1CSEvalProof { proof } @@ -582,15 +556,12 @@ impl R1CSEvalProof { pub fn verify( &self, - comm: &R1CSCommitment, - rx: &[Scalar], // point at which the R1CS matrix polynomials are evaluated - ry: &[Scalar], - evals: &Vec, - gens: &R1CSCommitmentGens, + comm: &R1CSCommitment, + rx: &[S], // point at which the R1CS matrix polynomials are evaluated + ry: &[S], + evals: &Vec, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - self - .proof - .verify(&comm.comm, rx, ry, evals, &gens.gens, transcript) + self.proof.verify(&comm.comm, rx, ry, evals, transcript) } } diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 23666d5b..05a52d94 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -1,85 +1,28 @@ #![allow(clippy::too_many_arguments)] -use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; - -use super::commitments::{Commitments, MultiCommitGens}; use super::custom_dense_mlpoly::DensePolynomialPqx; -use super::dense_mlpoly::{DensePolynomial, EqPolynomial, PolyCommitmentGens, PolyEvalProof}; +use super::dense_mlpoly::{DensePolynomial, EqPolynomial}; use super::errors::ProofVerifyError; -use super::group::{CompressedGroup, GroupElement, VartimeMultiscalarMul}; use super::math::Math; -use super::nizk::{EqualityProof, KnowledgeProof, ProductProof}; use super::r1csinstance::R1CSInstance; use super::random::RandomTape; -use super::scalar::Scalar; -use super::sumcheck::ZKSumcheckInstanceProof; +use super::sumcheck::SumcheckInstanceProof; use super::timer::Timer; -use super::transcript::{AppendToTranscript, ProofTranscript}; -use core::iter; +use super::transcript::ProofTranscript; +use crate::scalar::SpartanExtensionField; +use crate::{ProverWitnessSecInfo, VerifierWitnessSecInfo}; use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::cmp::min; -const ZERO: Scalar = Scalar::zero(); -const ONE: Scalar = Scalar::one(); - #[derive(Serialize, Deserialize, Debug)] -pub struct R1CSProof { - sc_proof_phase1: ZKSumcheckInstanceProof, - claims_phase2: ( - CompressedGroup, - CompressedGroup, - CompressedGroup, - CompressedGroup, - ), - pok_claims_phase2: (KnowledgeProof, ProductProof), - proof_eq_sc_phase1: EqualityProof, - sc_proof_phase2: ZKSumcheckInstanceProof, - // Need to commit vars for short and long witnesses separately - // The long version must exist, the short version might not - comm_vars_at_ry_list: Vec>, - comm_vars_at_ry: CompressedGroup, - proof_eval_vars_at_ry_list: Vec, - proof_eq_sc_phase2: EqualityProof, -} - -#[derive(Clone, Serialize)] -pub struct R1CSSumcheckGens { - gens_1: MultiCommitGens, - gens_3: MultiCommitGens, - gens_4: MultiCommitGens, -} - -// TODO: fix passing gens_1_ref -impl R1CSSumcheckGens { - pub fn new(label: &'static [u8], gens_1_ref: &MultiCommitGens) -> Self { - let gens_1 = gens_1_ref.clone(); - let gens_3 = MultiCommitGens::new(3, label); - let gens_4 = MultiCommitGens::new(4, label); - - R1CSSumcheckGens { - gens_1, - gens_3, - gens_4, - } - } -} - -#[derive(Clone, Serialize)] -pub struct R1CSGens { - pub gens_sc: R1CSSumcheckGens, - pub gens_pc: PolyCommitmentGens, +pub struct R1CSProof { + sc_proof_phase1: SumcheckInstanceProof, + sc_proof_phase2: SumcheckInstanceProof, + claims_phase2: (S, S, S), + // proof_eval_vars_at_ry_list: Vec>, } -impl R1CSGens { - pub fn new(label: &'static [u8], _num_cons: usize, num_vars: usize) -> Self { - let num_poly_vars = num_vars.log_2(); - let gens_pc = PolyCommitmentGens::new(num_poly_vars, label); - let gens_sc = R1CSSumcheckGens::new(label, &gens_pc.gens.gens_1); - R1CSGens { gens_sc, gens_pc } - } -} - -impl R1CSProof { +impl R1CSProof { fn prove_phase_one( num_rounds: usize, num_rounds_x_max: usize, @@ -87,26 +30,21 @@ impl R1CSProof { num_rounds_p: usize, num_proofs: &Vec, num_cons: &Vec, - evals_tau_p: &mut DensePolynomial, - evals_tau_q: &mut DensePolynomial, - evals_tau_x: &mut DensePolynomial, - evals_Az: &mut DensePolynomialPqx, - evals_Bz: &mut DensePolynomialPqx, - evals_Cz: &mut DensePolynomialPqx, - gens: &R1CSSumcheckGens, + evals_tau_p: &mut DensePolynomial, + evals_tau_q: &mut DensePolynomial, + evals_tau_x: &mut DensePolynomial, + evals_Az: &mut DensePolynomialPqx, + evals_Bz: &mut DensePolynomialPqx, + evals_Cz: &mut DensePolynomialPqx, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (ZKSumcheckInstanceProof, Vec, Vec, Scalar) { - let comb_func = |poly_A_comp: &Scalar, - poly_B_comp: &Scalar, - poly_C_comp: &Scalar, - poly_D_comp: &Scalar| - -> Scalar { poly_A_comp * (poly_B_comp * poly_C_comp - poly_D_comp) }; - - let (sc_proof_phase_one, r, claims, blind_claim_postsc) = - ZKSumcheckInstanceProof::prove_cubic_with_additive_term_disjoint_rounds( - &ZERO, // claim is zero - &ZERO, // blind for claim is also zero + ) -> (SumcheckInstanceProof, Vec, Vec) { + let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S, poly_D_comp: &S| -> S { + *poly_A_comp * (*poly_B_comp * *poly_C_comp - *poly_D_comp) + }; + + let (sc_proof_phase_one, r, claims) = + SumcheckInstanceProof::::prove_cubic_with_additive_term_disjoint_rounds( + &S::field_zero(), // claim is zero num_rounds, num_rounds_x_max, num_rounds_q_max, @@ -120,13 +58,10 @@ impl R1CSProof { evals_Bz, evals_Cz, comb_func, - &gens.gens_1, - &gens.gens_4, transcript, - random_tape, ); - (sc_proof_phase_one, r, claims, blind_claim_postsc) + (sc_proof_phase_one, r, claims) } fn prove_phase_two( @@ -137,40 +72,32 @@ impl R1CSProof { single_inst: bool, num_witness_secs: usize, num_inputs: Vec, - claim: &Scalar, - blind_claim: &Scalar, - evals_eq: &mut DensePolynomial, - evals_ABC: &mut DensePolynomialPqx, - evals_z: &mut DensePolynomialPqx, - gens: &R1CSSumcheckGens, + claim: &S, + evals_eq: &mut DensePolynomial, + evals_ABC: &mut DensePolynomialPqx, + evals_z: &mut DensePolynomialPqx, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (ZKSumcheckInstanceProof, Vec, Vec, Scalar) { - let comb_func = |poly_A_comp: &Scalar, poly_B_comp: &Scalar, poly_C_comp: &Scalar| -> Scalar { - poly_A_comp * poly_B_comp * poly_C_comp + ) -> (SumcheckInstanceProof, Vec, Vec) { + let comb_func = |poly_A_comp: &S, poly_B_comp: &S, poly_C_comp: &S| -> S { + *poly_A_comp * *poly_B_comp * *poly_C_comp }; - let (sc_proof_phase_two, r, claims, blind_claim_postsc) = - ZKSumcheckInstanceProof::prove_cubic_disjoint_rounds( - claim, - blind_claim, - num_rounds, - num_rounds_y_max, - num_rounds_w, - num_rounds_p, - single_inst, - num_witness_secs, - num_inputs, - evals_eq, - evals_ABC, - evals_z, - comb_func, - &gens.gens_1, - &gens.gens_4, - transcript, - random_tape, - ); + let (sc_proof_phase_two, r, claims) = SumcheckInstanceProof::::prove_cubic_disjoint_rounds( + claim, + num_rounds, + num_rounds_y_max, + num_rounds_w, + num_rounds_p, + single_inst, + num_witness_secs, + num_inputs, + evals_eq, + evals_ABC, + evals_z, + comb_func, + transcript, + ); - (sc_proof_phase_two, r, claims, blind_claim_postsc) + (sc_proof_phase_two, r, claims) } fn protocol_name() -> &'static [u8] { @@ -195,15 +122,16 @@ impl R1CSProof { // NUM_INPUTS: number of inputs per block // W_MAT: num_instances x num_proofs x num_inputs hypermatrix for all values // POLY_W: one dense polynomial per instance - witness_secs: Vec<&ProverWitnessSecInfo>, + witness_secs: Vec<&ProverWitnessSecInfo>, // INSTANCES - inst: &R1CSInstance, - gens: &R1CSGens, + inst: &R1CSInstance, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (R1CSProof, [Vec; 4]) { + ) -> (R1CSProof, [Vec; 4]) { let timer_prove = Timer::new("R1CSProof::prove"); - transcript.append_protocol_name(R1CSProof::protocol_name()); + >::append_protocol_name( + transcript, + R1CSProof::::protocol_name(), + ); let num_witness_secs = witness_secs.len(); @@ -246,11 +174,11 @@ impl R1CSProof { // append input to variables to create a single vector z let timer_tmp = Timer::new("prove_z_mat_gen"); - let mut z_mat: Vec>>> = Vec::new(); + let mut z_mat: Vec>>> = Vec::new(); for p in 0..num_instances { z_mat.push(Vec::new()); for q in 0..num_proofs[p] { - z_mat[p].push(vec![vec![ZERO; num_inputs[p]]; num_witness_secs]); + z_mat[p].push(vec![vec![S::field_zero(); num_inputs[p]]; num_witness_secs]); for w in 0..witness_secs.len() { let ws = witness_secs[w]; let p_w = if ws.w_mat.len() == 1 { 0 } else { p }; @@ -295,7 +223,7 @@ impl R1CSProof { // Sumcheck 1: (Az * Bz - Cz) * eq(x, q, p) = 0 let timer_tmp = Timer::new("prove_sum_check"); - let (sc_proof_phase1, rx, _claims_phase1, blind_claim_postsc1) = R1CSProof::prove_phase_one( + let (sc_proof_phase1, rx, _claims_phase1) = R1CSProof::prove_phase_one( num_rounds_x + num_rounds_q + num_rounds_p, num_rounds_x, num_rounds_q, @@ -308,10 +236,9 @@ impl R1CSProof { &mut poly_Az, &mut poly_Bz, &mut poly_Cz, - &gens.gens_sc, transcript, - random_tape, ); + assert_eq!(poly_tau_p.len(), 1); assert_eq!(poly_tau_q.len(), 1); assert_eq!(poly_tau_x.len(), 1); @@ -328,64 +255,15 @@ impl R1CSProof { &poly_Cz.index(0, 0, 0, 0), ); - let (Az_blind, Bz_blind, Cz_blind, prod_Az_Bz_blind) = ( - random_tape.random_scalar(b"Az_blind"), - random_tape.random_scalar(b"Bz_blind"), - random_tape.random_scalar(b"Cz_blind"), - random_tape.random_scalar(b"prod_Az_Bz_blind"), - ); - - let (pok_Cz_claim, comm_Cz_claim) = { - KnowledgeProof::prove( - &gens.gens_sc.gens_1, - transcript, - random_tape, - Cz_claim, - &Cz_blind, - ) - }; - - let (proof_prod, comm_Az_claim, comm_Bz_claim, comm_prod_Az_Bz_claims) = { - let prod = Az_claim * Bz_claim; - ProductProof::prove( - &gens.gens_sc.gens_1, - transcript, - random_tape, - Az_claim, - &Az_blind, - Bz_claim, - &Bz_blind, - &prod, - &prod_Az_Bz_blind, - ) - }; - - comm_Az_claim.append_to_transcript(b"comm_Az_claim", transcript); - comm_Bz_claim.append_to_transcript(b"comm_Bz_claim", transcript); - comm_Cz_claim.append_to_transcript(b"comm_Cz_claim", transcript); - comm_prod_Az_Bz_claims.append_to_transcript(b"comm_prod_Az_Bz_claims", transcript); - // prove the final step of sum-check #1 - let taus_bound_rx = tau_claim; - - let blind_expected_claim_postsc1 = taus_bound_rx * (prod_Az_Bz_blind - Cz_blind); - let claim_post_phase1 = (Az_claim * Bz_claim - Cz_claim) * taus_bound_rx; - let (proof_eq_sc_phase1, _C1, _C2) = EqualityProof::prove( - &gens.gens_sc.gens_1, - transcript, - random_tape, - &claim_post_phase1, - &blind_expected_claim_postsc1, - &claim_post_phase1, - &blind_claim_postsc1, - ); + let _taus_bound_rx = tau_claim; // Separate the result rx into rp, rq, and rx let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); let (rq_rev, rp) = rq_rev.split_at(num_rounds_q); - let rx: Vec = rx_rev.iter().copied().rev().collect(); + let rx: Vec = rx_rev.iter().copied().rev().collect(); let rq_rev = rq_rev.to_vec(); - let rq: Vec = rq_rev.iter().copied().rev().collect(); + let rq: Vec = rq_rev.iter().copied().rev().collect(); let rp = rp.to_vec(); // -- @@ -393,12 +271,11 @@ impl R1CSProof { // -- let timer_sc_proof_phase2 = Timer::new("prove_sc_phase_two"); // combine the three claims into a single claim - let r_A = transcript.challenge_scalar(b"challenge_Az"); - let r_B = transcript.challenge_scalar(b"challenge_Bz"); - let r_C = transcript.challenge_scalar(b"challenge_Cz"); + let r_A: S = transcript.challenge_scalar(b"challenge_Az"); + let r_B: S = transcript.challenge_scalar(b"challenge_Bz"); + let r_C: S = transcript.challenge_scalar(b"challenge_Cz"); - let claim_phase2 = r_A * Az_claim + r_B * Bz_claim + r_C * Cz_claim; - let blind_claim_phase2 = r_A * Az_blind + r_B * Bz_blind + r_C * Cz_blind; + let claim_phase2 = r_A * *Az_claim + r_B * *Bz_claim + r_C * *Cz_claim; let timer_tmp = Timer::new("prove_abc_gen"); let evals_ABC = { @@ -409,7 +286,7 @@ impl R1CSProof { inst.get_inst_num_cons(), num_witness_secs, max_num_inputs, - num_inputs, + &num_inputs, &evals_rx, ); @@ -454,7 +331,7 @@ impl R1CSProof { let mut eq_p_rp_poly = DensePolynomial::new(EqPolynomial::new(rp).evals()); // Sumcheck 2: (rA + rB + rC) * Z * eq(p) = e - let (sc_proof_phase2, ry, claims_phase2, blind_claim_postsc2) = R1CSProof::prove_phase_two( + let (sc_proof_phase2, ry, _claims_phase2) = R1CSProof::prove_phase_two( num_rounds_y + num_rounds_w + num_rounds_p, num_rounds_y, num_rounds_w, @@ -463,13 +340,10 @@ impl R1CSProof { num_witness_secs, num_inputs.clone(), &claim_phase2, - &blind_claim_phase2, &mut eq_p_rp_poly, &mut ABC_poly, &mut Z_poly, - &gens.gens_sc, transcript, - random_tape, ); timer_sc_proof_phase2.stop(); @@ -478,7 +352,7 @@ impl R1CSProof { let (rw, rp) = rw.split_at(num_rounds_w); let rp = rp.to_vec(); let rw = rw.to_vec(); - let ry: Vec = ry_rev.iter().copied().rev().collect(); + let ry: Vec = ry_rev.iter().copied().rev().collect(); assert_eq!(Z_poly.len(), 1); assert_eq!(ABC_poly.len(), 1); @@ -490,9 +364,9 @@ impl R1CSProof { let timer_polyeval = Timer::new("polyeval"); // For every possible wit_sec.num_inputs, compute ry_factor = prodX(1 - ryX)... - let mut ry_factors = vec![ONE; num_rounds_y + 1]; + let mut ry_factors = vec![S::field_one(); num_rounds_y + 1]; for i in 0..num_rounds_y { - ry_factors[i + 1] = ry_factors[i] * (ONE - ry[i]); + ry_factors[i + 1] = ry_factors[i] * (S::field_one() - ry[i]); } let mut poly_list = Vec::new(); @@ -502,12 +376,12 @@ impl R1CSProof { let mut Zr_list = Vec::new(); // List of evaluations separated by witness_secs let mut eval_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; - let mut comm_vars_at_ry_list = vec![Vec::new(); num_witness_secs]; + for i in 0..num_witness_secs { let w = witness_secs[i]; let wit_sec_num_instance = w.w_mat.len(); eval_vars_at_ry_list.push(Vec::new()); - comm_vars_at_ry_list.push(Vec::new()); + for p in 0..wit_sec_num_instance { poly_list.push(&w.poly_w[p]); num_proofs_list.push(w.w_mat[p].len()); @@ -516,7 +390,7 @@ impl R1CSProof { let ry_short = { // if w.num_inputs[p] >= num_inputs, need to pad 0's to the front of ry if w.num_inputs[p] >= max_num_inputs { - let ry_pad = vec![ZERO; w.num_inputs[p].log_2() - max_num_inputs.log_2()]; + let ry_pad = vec![S::field_zero(); w.num_inputs[p].log_2() - max_num_inputs.log_2()]; [ry_pad, ry.clone()].concat() } // Else ry_short is the last w.num_inputs[p].log_2() entries of ry @@ -535,27 +409,24 @@ impl R1CSProof { } else { eval_vars_at_ry_list[i] .push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); + eval_vars_at_ry_list[i] + .push(eval_vars_at_ry * ry_factors[num_rounds_y - w.num_inputs[p].log_2()]); } - comm_vars_at_ry_list[i].push( - eval_vars_at_ry - .commit(&Scalar::zero(), &gens.gens_pc.gens.gens_1) - .compress(), - ); } } + + /* let proof_eval_vars_at_ry_list = PolyEvalProof::prove_batched_instances_disjoint_rounds( &poly_list, &num_proofs_list, &num_inputs_list, - None, &rq, &ry, &Zr_list, - None, - &gens.gens_pc, transcript, random_tape, ); + */ // Bind the resulting witness list to rp // poly_vars stores the result of each witness matrix bounded to (rq_short ++ ry) @@ -563,6 +434,13 @@ impl R1CSProof { // So we need to multiply each entry by (1 - rq0)(1 - rq1) let mut eval_vars_comb_list = Vec::new(); for p in 0..num_instances { + let _wit_sec_p = |i: usize| { + if witness_secs[i].w_mat.len() == 1 { + 0 + } else { + p + } + }; let wit_sec_p = |i: usize| { if witness_secs[i].w_mat.len() == 1 { 0 @@ -573,28 +451,28 @@ impl R1CSProof { let e = |i: usize| eval_vars_at_ry_list[i][wit_sec_p(i)]; let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { - vec![ONE] + vec![S::field_one()] } 2 => { - vec![(ONE - rw[0]), rw[0]] + vec![(S::field_one() - rw[0]), rw[0]] } 4 => { vec![ - (ONE - rw[0]) * (ONE - rw[1]), - (ONE - rw[0]) * rw[1], - rw[0] * (ONE - rw[1]), + (S::field_one() - rw[0]) * (S::field_one() - rw[1]), + (S::field_one() - rw[0]) * rw[1], + rw[0] * (S::field_one() - rw[1]), rw[0] * rw[1], ] } 8 => { vec![ - (ONE - rw[0]) * (ONE - rw[1]) * (ONE - rw[2]), - (ONE - rw[0]) * (ONE - rw[1]) * rw[2], - (ONE - rw[0]) * rw[1] * (ONE - rw[2]), - (ONE - rw[0]) * rw[1] * rw[2], - rw[0] * (ONE - rw[1]) * (ONE - rw[2]), - rw[0] * (ONE - rw[1]) * rw[2], - rw[0] * rw[1] * (ONE - rw[2]), + (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), + (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * rw[2], + (S::field_one() - rw[0]) * rw[1] * (S::field_one() - rw[2]), + (S::field_one() - rw[0]) * rw[1] * rw[2], + rw[0] * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), + rw[0] * (S::field_one() - rw[1]) * rw[2], + rw[0] * rw[1] * (S::field_one() - rw[2]), rw[0] * rw[1] * rw[2], ] } @@ -602,55 +480,26 @@ impl R1CSProof { panic!("Unsupported num_witness_secs: {}", num_witness_secs); } }; - let mut eval_vars_comb = (0..num_witness_secs).fold(ZERO, |s, i| s + prefix_list[i] * e(i)); + let mut eval_vars_comb = + (0..num_witness_secs).fold(S::field_zero(), |s, i| s + prefix_list[i] * e(i)); for q in 0..(num_rounds_q - num_proofs[p].log_2()) { - eval_vars_comb *= ONE - rq[q]; + eval_vars_comb = eval_vars_comb * (S::field_one() - rq[q]); } eval_vars_comb_list.push(eval_vars_comb); } timer_polyeval.stop(); let poly_vars = DensePolynomial::new(eval_vars_comb_list); - let eval_vars_at_ry = poly_vars.evaluate(&rp); - let comm_vars_at_ry = eval_vars_at_ry - .commit(&ZERO, &gens.gens_pc.gens.gens_1) - .compress(); - - // prove the final step of sum-check #2 - let blind_expected_claim_postsc2 = ZERO; - let claim_post_phase2 = claims_phase2[0] * claims_phase2[1] * claims_phase2[2]; - - let (proof_eq_sc_phase2, _C1, _C2) = EqualityProof::prove( - &gens.gens_pc.gens.gens_1, - transcript, - random_tape, - &claim_post_phase2, - &blind_expected_claim_postsc2, - &claim_post_phase2, - &blind_claim_postsc2, - ); + let _eval_vars_at_ry = poly_vars.evaluate(&rp); timer_prove.stop(); - let claims_phase2 = ( - comm_Az_claim, - comm_Bz_claim, - comm_Cz_claim, - comm_prod_Az_Bz_claims, - ); - let pok_claims_phase2 = (pok_Cz_claim, proof_prod); - ( R1CSProof { sc_proof_phase1, - claims_phase2, - pok_claims_phase2, - proof_eq_sc_phase1, sc_proof_phase2, - comm_vars_at_ry_list, - comm_vars_at_ry, - proof_eval_vars_at_ry_list, - proof_eq_sc_phase2, + claims_phase2: (*Az_claim, *Bz_claim, *Cz_claim), + // proof_eval_vars_at_ry_list, }, [rp, rq_rev, rx, [rw, ry].concat()], ) @@ -660,7 +509,7 @@ impl R1CSProof { &self, num_instances: usize, max_num_proofs: usize, - num_proofs: &Vec, + _num_proofs: &Vec, max_num_inputs: usize, // NUM_WITNESS_SECS @@ -676,11 +525,13 @@ impl R1CSProof { witness_secs: Vec<&VerifierWitnessSecInfo>, num_cons: usize, - gens: &R1CSGens, - evals: &[Scalar; 3], + _evals: &[S; 3], transcript: &mut Transcript, - ) -> Result<[Vec; 4], ProofVerifyError> { - transcript.append_protocol_name(R1CSProof::protocol_name()); + ) -> Result<[Vec; 4], ProofVerifyError> { + >::append_protocol_name( + transcript, + R1CSProof::::protocol_name(), + ); let num_witness_secs = witness_secs.len(); @@ -700,92 +551,48 @@ impl R1CSProof { let tau_q = transcript.challenge_vector(b"challenge_tau_q", num_rounds_q); let tau_x = transcript.challenge_vector(b"challenge_tau_x", num_rounds_x); - // verify the first sum-check instance - let claim_phase1 = ZERO.commit(&ZERO, &gens.gens_sc.gens_1).compress(); - let (comm_claim_post_phase1, rx) = self.sc_proof_phase1.verify( - &claim_phase1, + let (_, rx) = self.sc_proof_phase1.verify( + S::field_zero(), num_rounds_x + num_rounds_q + num_rounds_p, 3, - &gens.gens_sc.gens_1, - &gens.gens_sc.gens_4, transcript, )?; - // perform the intermediate sum-check test with claimed Az, Bz, and Cz - let (comm_Az_claim, comm_Bz_claim, comm_Cz_claim, comm_prod_Az_Bz_claims) = &self.claims_phase2; - let (pok_Cz_claim, proof_prod) = &self.pok_claims_phase2; - - pok_Cz_claim.verify(&gens.gens_sc.gens_1, transcript, comm_Cz_claim)?; - proof_prod.verify( - &gens.gens_sc.gens_1, - transcript, - comm_Az_claim, - comm_Bz_claim, - comm_prod_Az_Bz_claims, - )?; - - comm_Az_claim.append_to_transcript(b"comm_Az_claim", transcript); - comm_Bz_claim.append_to_transcript(b"comm_Bz_claim", transcript); - comm_Cz_claim.append_to_transcript(b"comm_Cz_claim", transcript); - comm_prod_Az_Bz_claims.append_to_transcript(b"comm_prod_Az_Bz_claims", transcript); - // Separate the result rx into rp_round1, rq, and rx let (rx_rev, rq_rev) = rx.split_at(num_rounds_x); let (rq_rev, rp_round1) = rq_rev.split_at(num_rounds_q); - let rx: Vec = rx_rev.iter().copied().rev().collect(); + let rx: Vec = rx_rev.iter().copied().rev().collect(); let rq_rev = rq_rev.to_vec(); - let rq: Vec = rq_rev.iter().copied().rev().collect(); + let _rq: Vec = rq_rev.iter().copied().rev().collect(); let rp_round1 = rp_round1.to_vec(); // taus_bound_rx is really taus_bound_rx_rq_rp - let taus_bound_rp: Scalar = (0..rp_round1.len()) - .map(|i| rp_round1[i] * tau_p[i] + (ONE - rp_round1[i]) * (ONE - tau_p[i])) + let taus_bound_rp: S = (0..rp_round1.len()) + .map(|i| { + rp_round1[i] * tau_p[i] + (S::field_one() - rp_round1[i]) * (S::field_one() - tau_p[i]) + }) .product(); - let taus_bound_rq: Scalar = (0..rq_rev.len()) - .map(|i| rq_rev[i] * tau_q[i] + (ONE - rq_rev[i]) * (ONE - tau_q[i])) + let taus_bound_rq: S = (0..rq_rev.len()) + .map(|i| rq_rev[i] * tau_q[i] + (S::field_one() - rq_rev[i]) * (S::field_one() - tau_q[i])) .product(); - let taus_bound_rx: Scalar = (0..rx_rev.len()) - .map(|i| rx_rev[i] * tau_x[i] + (ONE - rx_rev[i]) * (ONE - tau_x[i])) + let taus_bound_rx: S = (0..rx_rev.len()) + .map(|i| rx_rev[i] * tau_x[i] + (S::field_one() - rx_rev[i]) * (S::field_one() - tau_x[i])) .product(); - let taus_bound_rx = taus_bound_rp * taus_bound_rq * taus_bound_rx; - - let expected_claim_post_phase1 = (taus_bound_rx - * (comm_prod_Az_Bz_claims.decompress().unwrap() - comm_Cz_claim.decompress().unwrap())) - .compress(); - - // verify proof that expected_claim_post_phase1 == claim_post_phase1 - self.proof_eq_sc_phase1.verify( - &gens.gens_sc.gens_1, - transcript, - &expected_claim_post_phase1, - &comm_claim_post_phase1, - )?; + let _taus_bound_rx = taus_bound_rp * taus_bound_rq * taus_bound_rx; // derive three public challenges and then derive a joint claim - let r_A = transcript.challenge_scalar(b"challenge_Az"); - let r_B = transcript.challenge_scalar(b"challenge_Bz"); - let r_C = transcript.challenge_scalar(b"challenge_Cz"); - - // r_A * comm_Az_claim + r_B * comm_Bz_claim + r_C * comm_Cz_claim; - let comm_claim_phase2 = GroupElement::vartime_multiscalar_mul( - iter::once(&r_A) - .chain(iter::once(&r_B)) - .chain(iter::once(&r_C)), - iter::once(&comm_Az_claim) - .chain(iter::once(&comm_Bz_claim)) - .chain(iter::once(&comm_Cz_claim)) - .map(|pt| pt.decompress().unwrap()) - .collect::>(), - ) - .compress(); + let r_A: S = transcript.challenge_scalar(b"challenge_Az"); + let r_B: S = transcript.challenge_scalar(b"challenge_Bz"); + let r_C: S = transcript.challenge_scalar(b"challenge_Cz"); + + let (Az_claim, Bz_claim, Cz_claim) = self.claims_phase2; + let claim_phase2 = r_A * Az_claim + r_B * Bz_claim + r_C * Cz_claim; // verify the joint claim with a sum-check protocol - let (comm_claim_post_phase2, ry) = self.sc_proof_phase2.verify( - &comm_claim_phase2, + let (_, ry) = self.sc_proof_phase2.verify( + claim_phase2, num_rounds_y + num_rounds_w + num_rounds_p, 3, - &gens.gens_sc.gens_1, - &gens.gens_sc.gens_4, transcript, )?; @@ -794,96 +601,80 @@ impl R1CSProof { let (rw, rp) = rw.split_at(num_rounds_w); let rp = rp.to_vec(); let rw = rw.to_vec(); - let ry: Vec = ry_rev.iter().copied().rev().collect(); + let ry: Vec = ry_rev.iter().copied().rev().collect(); // An Eq function to match p with rp - let p_rp_poly_bound_ry: Scalar = (0..rp.len()) - .map(|i| rp[i] * rp_round1[i] + (ONE - rp[i]) * (ONE - rp_round1[i])) + let _p_rp_poly_bound_ry: S = (0..rp.len()) + .map(|i| rp[i] * rp_round1[i] + (S::field_one() - rp[i]) * (S::field_one() - rp_round1[i])) .product(); // verify Z(rp, rq, ry) proof against the initial commitment // First by witness & by instance on ry // For every possible wit_sec.num_inputs, compute ry_factor = prodX(1 - ryX)... // If there are 2 witness secs, then ry_factors[0] = 1, ry_factors[1] = 1, ry_factors[2] = 1 - ry1, ry_factors[3] = (1 - ry1)(1 - ry2), etc. - let mut ry_factors = vec![ONE; num_rounds_y + 1]; + let mut ry_factors = vec![S::field_one(); num_rounds_y + 1]; for i in 0..num_rounds_y { - ry_factors[i + 1] = (ry_factors[i]) * (ONE - ry[i]); + ry_factors[i + 1] = (ry_factors[i]) * (S::field_one() - ry[i]); } // POLY COMMIT let timer_commit_opening = Timer::new("verify_sc_commitment_opening"); - let mut comm_list = Vec::new(); let mut num_proofs_list = Vec::new(); let mut num_inputs_list = Vec::new(); - let mut comm_Zr_list = Vec::new(); + for i in 0..num_witness_secs { let w = witness_secs[i]; let wit_sec_num_instance = w.num_proofs.len(); for p in 0..wit_sec_num_instance { - comm_list.push(&w.comm_w[p]); num_proofs_list.push(w.num_proofs[p]); num_inputs_list.push(w.num_inputs[p]); - comm_Zr_list.push(self.comm_vars_at_ry_list[i][p].decompress().unwrap()); } } + + /* PolyEvalProof::verify_batched_instances_disjoint_rounds( &self.proof_eval_vars_at_ry_list, &num_proofs_list, &num_inputs_list, - &gens.gens_pc, transcript, &rq, &ry, - &comm_Zr_list, - &comm_list, )?; + */ // Then on rp - let mut expected_comm_vars_list = Vec::new(); for p in 0..num_instances { - let wit_sec_p = |i: usize| { + let _wit_sec_p = |i: usize| { if witness_secs[i].num_proofs.len() == 1 { 0 } else { p } }; - let c = |i: usize| { - if witness_secs[i].num_inputs[wit_sec_p(i)] >= max_num_inputs { - self.comm_vars_at_ry_list[i][wit_sec_p(i)] - .decompress() - .unwrap() - } else { - self.comm_vars_at_ry_list[i][wit_sec_p(i)] - .decompress() - .unwrap() - * ry_factors[num_rounds_y - witness_secs[i].num_inputs[wit_sec_p(i)].log_2()] - } - }; - let prefix_list = match num_witness_secs.next_power_of_two() { + let _prefix_list = match num_witness_secs.next_power_of_two() { 1 => { - vec![ONE] + vec![S::field_one()] } 2 => { - vec![(ONE - rw[0]), rw[0]] + vec![(S::field_one() - rw[0]), rw[0]] } 4 => { vec![ - (ONE - rw[0]) * (ONE - rw[1]), - (ONE - rw[0]) * rw[1], - rw[0] * (ONE - rw[1]), + (S::field_one() - rw[0]) * (S::field_one() - rw[1]), + (S::field_one() - rw[0]) * rw[1], + rw[0] * (S::field_one() - rw[1]), rw[0] * rw[1], ] } 8 => { vec![ - (ONE - rw[0]) * (ONE - rw[1]) * (ONE - rw[2]), - (ONE - rw[0]) * (ONE - rw[1]) * rw[2], - (ONE - rw[0]) * rw[1] * (ONE - rw[2]), - (ONE - rw[0]) * rw[1] * rw[2], - rw[0] * (ONE - rw[1]) * (ONE - rw[2]), - rw[0] * (ONE - rw[1]) * rw[2], - rw[0] * rw[1] * (ONE - rw[2]), + (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), + (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * rw[2], + (S::field_one() - rw[0]) * rw[1] * (S::field_one() - rw[2]), + (S::field_one() - rw[0]) * rw[1] * rw[2], + rw[0] * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), + rw[0] * (S::field_one() - rw[1]) * rw[2], + rw[0] * rw[1] * (S::field_one() - rw[2]), rw[0] * rw[1] * rw[2], ] } @@ -891,37 +682,10 @@ impl R1CSProof { panic!("Unsupported num_witness_secs: {}", num_witness_secs); } }; - let mut comm_vars_comb = - (1..num_witness_secs).fold(prefix_list[0] * c(0), |s, i| s + prefix_list[i] * c(i)); - for q in 0..(num_rounds_q - num_proofs[p].log_2()) { - comm_vars_comb *= ONE - rq[q]; - } - expected_comm_vars_list.push(comm_vars_comb); } - let EQ_p = &EqPolynomial::new(rp.clone()).evals()[..num_instances]; - let expected_comm_vars_at_ry = - GroupElement::vartime_multiscalar_mul(EQ_p, expected_comm_vars_list).compress(); - assert_eq!(expected_comm_vars_at_ry, self.comm_vars_at_ry); timer_commit_opening.stop(); - // compute commitment to eval_Z_at_ry = (ONE - ry[0]) * self.eval_vars_at_ry + ry[0] * poly_input_eval - let comm_eval_Z_at_ry = &self.comm_vars_at_ry.decompress().unwrap(); - - // perform the final check in the second sum-check protocol - let [eval_A_r, eval_B_r, eval_C_r] = evals; - let expected_claim_post_phase2 = - ((r_A * eval_A_r + r_B * eval_B_r + r_C * eval_C_r) * comm_eval_Z_at_ry * p_rp_poly_bound_ry) - .compress(); - - // verify proof that expected_claim_post_phase2 == claim_post_phase2 - self.proof_eq_sc_phase2.verify( - &gens.gens_sc.gens_1, - transcript, - &expected_claim_post_phase2, - &comm_claim_post_phase2, - )?; - Ok([rp, rq_rev, rx, [rw, ry].concat()]) } } diff --git a/spartan_parallel/src/random.rs b/spartan_parallel/src/random.rs index 9203e6a4..3afe87a4 100644 --- a/spartan_parallel/src/random.rs +++ b/spartan_parallel/src/random.rs @@ -1,29 +1,33 @@ -use super::scalar::Scalar; +use super::scalar::SpartanExtensionField; use super::transcript::ProofTranscript; use merlin::Transcript; use rand::rngs::OsRng; #[derive(Clone)] -pub struct RandomTape { +pub struct RandomTape { tape: Transcript, + _phantom: S, } -impl RandomTape { +impl RandomTape { pub fn new(name: &'static [u8]) -> Self { let tape = { let mut csprng: OsRng = OsRng; let mut tape = Transcript::new(name); - tape.append_scalar(b"init_randomness", &Scalar::random(&mut csprng)); + tape.append_scalar(b"init_randomness", &S::random(&mut csprng)); tape }; - Self { tape } + Self { + tape, + _phantom: S::field_zero(), + } } - pub fn random_scalar(&mut self, label: &'static [u8]) -> Scalar { + pub fn random_scalar(&mut self, label: &'static [u8]) -> S { self.tape.challenge_scalar(label) } - pub fn random_vector(&mut self, label: &'static [u8], len: usize) -> Vec { + pub fn random_vector(&mut self, label: &'static [u8], len: usize) -> Vec { self.tape.challenge_vector(label, len) } } diff --git a/spartan_parallel/src/scalar/fp.rs b/spartan_parallel/src/scalar/fp.rs new file mode 100644 index 00000000..d50b5358 --- /dev/null +++ b/spartan_parallel/src/scalar/fp.rs @@ -0,0 +1,227 @@ +use super::SpartanExtensionField; +use crate::{ProofTranscript, Transcript}; +use core::borrow::Borrow; +use core::iter::{Product, Sum}; +use core::ops::{Add, AddAssign, Mul, MulAssign, Sub, SubAssign}; +use ff::{Field, FromUniformBytes}; +use goldilocks::{ExtensionField, Goldilocks}; +use rand::{CryptoRng, RngCore}; +use serde::{Deserialize, Serialize}; +use std::ops::Neg; +use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; +use zeroize::Zeroize; + +/// Field wrapper around base Goldilocks +#[derive(Clone, Copy, Eq, Serialize, Deserialize, Hash, Debug)] +pub struct Scalar(Goldilocks); + +impl SpartanExtensionField for Scalar { + type InnerType = Goldilocks; + type BaseField = Goldilocks; + + fn inner(&self) -> &Goldilocks { + &self.0 + } + + fn field_zero() -> Self { + Goldilocks::ZERO.into() + } + + fn field_one() -> Self { + Goldilocks::ONE.into() + } + + /// Build a self from a base element; pad ext with 0s. + fn from_base(b: &Self::BaseField) -> Self { + Self::InnerType::from_base(b).into() + } + + fn random(rng: &mut Rng) -> Self { + Goldilocks::random(rng).into() + } + + /// Attempts to convert a little-endian byte representation of + /// a scalar into a `Scalar`, failing if the input is not canonical. + fn from_bytes(bytes: &[u8; 32]) -> CtOption { + CtOption::new( + Goldilocks::from_uniform_bytes(bytes).into(), + Choice::from(1u8), + ) + } + + /// Converts an element of `Scalar` into a byte representation in + /// little-endian byte order. + fn to_bytes(&self) -> [u8; 32] { + let mut res = [0; 32]; + res[..8].copy_from_slice(&self.0 .0.to_le_bytes()); + res + } + + /// Converts a 512-bit little endian integer into + /// a `Scalar` by reducing by the modulus. + fn from_bytes_wide(bytes: &[u8; 64]) -> Scalar { + Goldilocks::from_uniform_bytes(bytes).into() + } + + /// Append Goldilocks scalar to transcript + fn append_field_to_transcript(label: &'static [u8], transcript: &mut Transcript, input: Self) { + transcript.append_scalar(label, &input); + } + + /// Append a vector Goldilocks scalars to transcript + fn append_field_vector_to_transcript( + label: &'static [u8], + transcript: &mut Transcript, + input: &[Self], + ) { + transcript.append_message(label, b"begin_append_vector"); + for item in input { + transcript.append_scalar(label, item); + } + transcript.append_message(label, b"end_append_vector"); + } +} + +impl ConstantTimeEq for Scalar { + fn ct_eq(&self, other: &Self) -> Choice { + self.inner().ct_eq(other.inner()) + } +} +impl PartialEq for Scalar { + fn eq(&self, other: &Self) -> bool { + *self.inner() == *other.inner() + } +} +impl From for Scalar { + fn from(val: u64) -> Scalar { + Goldilocks(val).into() + } +} +impl From for Scalar { + fn from(val: usize) -> Scalar { + Goldilocks(val as u64).into() + } +} +impl ConditionallySelectable for Scalar { + fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { + Self(Goldilocks(u64::conditional_select( + &a.0 .0, &b.0 .0, choice, + ))) + } +} +impl Zeroize for Scalar { + fn zeroize(&mut self) { + self.0 = Goldilocks(0u64); + } +} +impl Neg for Scalar { + type Output = Scalar; + + fn neg(self) -> Scalar { + self.0.neg().into() + } +} +impl Default for Scalar { + fn default() -> Self { + Self::zero() + } +} +impl From for Scalar { + fn from(g: Goldilocks) -> Self { + Self(g) + } +} +impl Scalar { + /// Returns zero, the additive identity. + pub const fn zero() -> Self { + Self(Goldilocks(0u64)) + } + + /// Returns one, the multiplicative identity. + pub const fn one() -> Self { + Self(Goldilocks(1u64)) + } +} + +impl<'a, 'b> Add<&'b Scalar> for &'a Scalar { + type Output = Scalar; + + fn add(self, rhs: &'b Scalar) -> Scalar { + self.inner().add(rhs.inner()).into() + } +} + +impl<'a, 'b> Sub<&'b Scalar> for &'a Scalar { + type Output = Scalar; + + fn sub(self, rhs: &'b Scalar) -> Scalar { + self.inner().sub(rhs.inner()).into() + } +} + +impl<'a, 'b> Mul<&'b Scalar> for &'a Scalar { + type Output = Scalar; + + fn mul(self, rhs: &'b Scalar) -> Scalar { + self.inner().mul(rhs.inner()).into() + } +} + +impl Mul for Scalar { + type Output = Scalar; + + #[inline] + fn mul(self, rhs: Goldilocks) -> Self::Output { + (*self.inner() * rhs).into() + } +} + +impl<'a> Mul<&'a Goldilocks> for Scalar { + type Output = Self; + + #[inline] + fn mul(mut self, rhs: &'a Goldilocks) -> Self::Output { + self *= rhs; + self + } +} + +impl MulAssign<&Goldilocks> for Scalar { + #[inline] + fn mul_assign(&mut self, rhs: &Goldilocks) { + self.0 *= rhs; + } +} +impl MulAssign for Scalar { + #[inline] + fn mul_assign(&mut self, rhs: Goldilocks) { + self.mul_assign(&rhs) + } +} + +impl Sum for Scalar +where + T: Borrow, +{ + fn sum(iter: I) -> Self + where + I: Iterator, + { + iter.fold(Scalar::zero(), |acc, item| acc + item.borrow()) + } +} +impl Product for Scalar +where + T: Borrow, +{ + fn product(iter: I) -> Self + where + I: Iterator, + { + iter.fold(Scalar::one(), |acc, item| acc * item.borrow()) + } +} + +crate::impl_add_binop_specify_output!(Scalar, Scalar, Scalar); +crate::impl_sub_binop_specify_output!(Scalar, Scalar, Scalar); +crate::impl_binops_multiplicative_mixed!(Scalar, Scalar, Scalar); diff --git a/spartan_parallel/src/scalar/fp2.rs b/spartan_parallel/src/scalar/fp2.rs new file mode 100644 index 00000000..1787b49c --- /dev/null +++ b/spartan_parallel/src/scalar/fp2.rs @@ -0,0 +1,253 @@ +use super::SpartanExtensionField; +use crate::{AppendToTranscript, ProofTranscript, Transcript}; +use core::borrow::Borrow; +use core::iter::{Product, Sum}; +use core::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}; +use ff::{Field, FromUniformBytes}; +use goldilocks::{ExtensionField, Goldilocks, GoldilocksExt2}; +use rand::{CryptoRng, RngCore}; +use serde::{Deserialize, Serialize}; +use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; +use zeroize::Zeroize; + +/// Field wrapper around ext2 Goldilocks +#[derive(Clone, Copy, Eq, Serialize, Deserialize, Hash, Debug)] +pub struct ScalarExt2(GoldilocksExt2); + +impl From for ScalarExt2 { + fn from(g: GoldilocksExt2) -> Self { + Self(g) + } +} + +impl SpartanExtensionField for ScalarExt2 { + type InnerType = GoldilocksExt2; + type BaseField = Goldilocks; + + fn inner(&self) -> &GoldilocksExt2 { + &self.0 + } + + fn field_zero() -> Self { + GoldilocksExt2::ZERO.into() + } + + fn field_one() -> Self { + GoldilocksExt2::ONE.into() + } + + /// Build a self from a base element; pad ext with 0s. + fn from_base(b: &Self::BaseField) -> Self { + GoldilocksExt2::from_base(b).into() + } + + fn random(rng: &mut Rng) -> Self { + GoldilocksExt2::random(rng).into() + } + + /// Attempts to convert a little-endian byte representation of + /// a scalar into a `ScalarExt2`, failing if the input is not canonical. + fn from_bytes(bytes: &[u8; 32]) -> CtOption { + CtOption::new( + GoldilocksExt2::from_base(&Goldilocks::from_uniform_bytes(bytes)).into(), + Choice::from(1u8), + ) + } + + /// Converts an element of `ScalarExt2` into a byte representation in + /// little-endian byte order. + fn to_bytes(&self) -> [u8; 32] { + let mut res = [0; 32]; + let els = &self.inner().to_canonical_u64_vec(); + res[..8].copy_from_slice(&els[0].to_le_bytes()); + res[8..16].copy_from_slice(&els[1].to_le_bytes()); + res + } + + /// Converts a 512-bit little endian integer into + /// a `ScalarExt2` by reducing by the modulus. + fn from_bytes_wide(bytes: &[u8; 64]) -> ScalarExt2 { + GoldilocksExt2::from_uniform_bytes(bytes).into() + } + + /// Append Goldilocks scalar to transcript + fn append_field_to_transcript(label: &'static [u8], transcript: &mut Transcript, input: Self) { + transcript.append_scalar(label, &input); + } + + /// Append a vector Goldilocks scalars to transcript + fn append_field_vector_to_transcript( + label: &'static [u8], + transcript: &mut Transcript, + input: &[Self], + ) { + transcript.append_message(label, b"begin_append_vector"); + for item in input { + transcript.append_scalar(label, item); + } + transcript.append_message(label, b"end_append_vector"); + } +} + +impl ConstantTimeEq for ScalarExt2 { + fn ct_eq(&self, other: &Self) -> Choice { + self.inner().ct_eq(other.inner()) + } +} +impl PartialEq for ScalarExt2 { + fn eq(&self, other: &Self) -> bool { + *self.inner() == *other.inner() + } +} +impl From for ScalarExt2 { + fn from(val: u64) -> ScalarExt2 { + GoldilocksExt2::from_base(&Goldilocks(val)).into() + } +} +impl From for ScalarExt2 { + fn from(val: usize) -> ScalarExt2 { + GoldilocksExt2::from_base(&Goldilocks(val as u64)).into() + } +} +impl ConditionallySelectable for ScalarExt2 { + fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { + GoldilocksExt2::conditional_select(a.inner(), b.inner(), choice).into() + } +} +impl Zeroize for ScalarExt2 { + fn zeroize(&mut self) { + self.0 = GoldilocksExt2::ZERO; + } +} +impl Neg for ScalarExt2 { + type Output = Self; + + fn neg(self) -> Self { + self.0.neg().into() + } +} +impl Default for ScalarExt2 { + fn default() -> Self { + Self::zero() + } +} +impl ScalarExt2 { + /// Returns zero, the additive identity. + pub const fn zero() -> Self { + Self(GoldilocksExt2::ZERO) + } + + /// Returns one, the multiplicative identity. + pub const fn one() -> Self { + Self(GoldilocksExt2::ONE) + } +} +impl<'a, 'b> Add<&'b ScalarExt2> for &'a ScalarExt2 { + type Output = ScalarExt2; + + fn add(self, rhs: &'b ScalarExt2) -> ScalarExt2 { + self.inner().add(rhs.inner()).into() + } +} + +impl<'a, 'b> Sub<&'b ScalarExt2> for &'a ScalarExt2 { + type Output = ScalarExt2; + + fn sub(self, rhs: &'b ScalarExt2) -> ScalarExt2 { + self.inner().sub(rhs.inner()).into() + } +} + +impl<'a, 'b> Mul<&'b ScalarExt2> for &'a ScalarExt2 { + type Output = ScalarExt2; + + fn mul(self, rhs: &'b ScalarExt2) -> ScalarExt2 { + let a = self.inner(); + let b = rhs.inner(); + + let a1b1 = a.0[0] * b.0[0]; + let a1b2 = a.0[0] * b.0[1]; + let a2b1 = a.0[1] * b.0[0]; + let a2b2 = a.0[1] * b.0[1]; + + let c1 = a1b1 + Goldilocks(7) * a2b2; + let c2 = a2b1 + a1b2; + GoldilocksExt2([c1, c2]).into() + } +} + +impl Mul for ScalarExt2 { + type Output = ScalarExt2; + + #[inline] + fn mul(self, rhs: Goldilocks) -> Self::Output { + (self.inner() * &rhs).into() + } +} + +impl<'a> Mul<&'a Goldilocks> for ScalarExt2 { + type Output = Self; + + #[inline] + fn mul(mut self, rhs: &'a Goldilocks) -> Self::Output { + self *= rhs; + self + } +} + +impl MulAssign<&Goldilocks> for ScalarExt2 { + #[inline] + fn mul_assign(&mut self, rhs: &Goldilocks) { + self.0 *= rhs; + } +} + +impl MulAssign for ScalarExt2 { + #[inline] + fn mul_assign(&mut self, rhs: Goldilocks) { + self.mul_assign(&rhs) + } +} + +impl Sum for ScalarExt2 +where + T: Borrow, +{ + fn sum(iter: I) -> Self + where + I: Iterator, + { + iter.fold(ScalarExt2::zero(), |acc, item| acc + item.borrow()) + } +} +impl Product for ScalarExt2 +where + T: Borrow, +{ + fn product(iter: I) -> Self + where + I: Iterator, + { + iter.fold(ScalarExt2::one(), |acc, item| acc * item.borrow()) + } +} + +impl AppendToTranscript for ScalarExt2 { + fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { + transcript.append_scalar(label, self); + } +} + +impl AppendToTranscript for [ScalarExt2] { + fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { + transcript.append_message(label, b"begin_append_vector"); + for item in self { + transcript.append_scalar(label, item); + } + transcript.append_message(label, b"end_append_vector"); + } +} + +crate::impl_add_binop_specify_output!(ScalarExt2, ScalarExt2, ScalarExt2); +crate::impl_sub_binop_specify_output!(ScalarExt2, ScalarExt2, ScalarExt2); +crate::impl_binops_multiplicative_mixed!(ScalarExt2, ScalarExt2, ScalarExt2); diff --git a/spartan_parallel/src/scalar/mod.rs b/spartan_parallel/src/scalar/mod.rs index f2cfd7a8..138a2259 100644 --- a/spartan_parallel/src/scalar/mod.rs +++ b/spartan_parallel/src/scalar/mod.rs @@ -1,43 +1,311 @@ -mod ristretto255; +mod fp; +mod fp2; -pub type Scalar = ristretto255::Scalar; -pub type ScalarBytes = curve25519_dalek::scalar::Scalar; +use ff::Field; +pub use fp::Scalar; +pub use fp2::ScalarExt2; +use goldilocks::ExtensionField; +use merlin::Transcript; +use rand::{CryptoRng, RngCore}; +use serde::Serialize; +use std::fmt; +use std::{ + cmp::Eq, + hash::Hash, + iter::{Product, Sum}, + ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}, +}; +use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; +use zeroize::Zeroize; -pub trait ScalarFromPrimitives { - fn to_scalar(self) -> Scalar; -} +/// Trait describing the field element +/// Wraps around Goldilocks field towers from ceno-goldilocks +/// See: https://github.com/scroll-tech/ceno-Goldilocks +pub trait SpartanExtensionField: + Sized + + ConstantTimeEq + + Eq + + PartialEq + + From + + From + + ConditionallySelectable + + Zeroize + + Neg + + Default + + Add + + Sub + + Mul + + AddAssign + + SubAssign + + MulAssign + + Sum + + Product + + Clone + + Serialize + + Hash + + From + + fmt::Debug + + Mul + + MulAssign +{ + /// Inner Goldilocks extension field + type InnerType: ExtensionField + Field; + + /// Basefield for conserving computational resources + type BaseField: Field; + + /// Return inner Goldilocks field element + fn inner(&self) -> &Self::InnerType; + + /// Return the additive identity + fn field_zero() -> Self; + + /// Return the multiplicative identity + fn field_one() -> Self; + + /// Build a self from a base element; pad ext with 0s. + fn from_base(b: &Self::BaseField) -> Self; + + /// Sample field element + fn random(rng: &mut Rng) -> Self; + + /// Convert to field element from 32 bytes + fn from_bytes(bytes: &[u8; 32]) -> CtOption; + + /// Convert to 32 bytes from field element + fn to_bytes(&self) -> [u8; 32]; + + /// Convert to field element from 64 bytes + fn from_bytes_wide(bytes: &[u8; 64]) -> Self; -impl ScalarFromPrimitives for usize { - #[inline] - fn to_scalar(self) -> Scalar { - (0..self).map(|_i| Scalar::one()).sum() + /// Append a single field element to the transcript + fn append_field_to_transcript(label: &'static [u8], transcript: &mut Transcript, input: Self); + + /// Append a vector of field elements to the transcript + fn append_field_vector_to_transcript( + label: &'static [u8], + transcript: &mut Transcript, + input: &[Self], + ); + + /// Return the neg of field element + fn negate(&self) -> Self { + self.inner().neg().into() + } + + /// Doubles this field element. + fn double(&self) -> Self { + self.add(*self) + } + + /// Squares this element. + fn square(&self) -> Self { + self.mul(*self) + } + + /// Negates `self`. + fn neg(&self) -> Self { + self.inner().neg().into() + } + + /// Exponentiates `self` by `by`, where `by` is a + /// little-endian order integer exponent. + fn pow(&self, by: &[u64; 4]) -> Self { + self.inner().pow(by).into() + } + + /// Exponentiates `self` by `by`, where `by` is a + /// little-endian order integer exponent. + /// + /// **This operation is variable time with respect + /// to the exponent.** If the exponent is fixed, + /// this operation is effectively constant time. + fn pow_vartime(&self, by: &[u64; 4]) -> Self { + self.inner().pow_vartime(by).into() } -} -impl ScalarFromPrimitives for bool { - #[inline] - fn to_scalar(self) -> Scalar { - if self { - Scalar::one() + /// Computes the multiplicative inverse of this element, + /// failing if the element is zero. + fn invert(&self) -> CtOption { + if self.inner().is_zero().into() { + CtOption::new(Self::InnerType::ZERO.into(), Choice::from(0)) } else { - Scalar::zero() + CtOption::new(self.inner().invert().unwrap().into(), Choice::from(1)) } } -} -pub trait ScalarBytesFromScalar { - fn decompress_scalar(s: &Scalar) -> ScalarBytes; - fn decompress_vector(s: &[Scalar]) -> Vec; -} + /// Batch invert field elements + fn batch_invert(inputs: &mut [Self]) -> Self { + use zeroize::Zeroizing; + + let n = inputs.len(); + let one: Self = Self::InnerType::ONE.into(); + + // Place scratch storage in a Zeroizing wrapper to wipe it when + // we pass out of scope. + let scratch_vec = vec![one; n]; + let mut scratch = Zeroizing::new(scratch_vec); + + // Keep an accumulator of all of the previous products + let mut acc = Self::InnerType::ONE.into(); + + // Pass through the input vector, recording the previous + // products in the scratch space + for (input, scratch) in inputs.iter().zip(scratch.iter_mut()) { + *scratch = acc; + + acc = acc * *input; + } + + // acc is nonzero iff all inputs are nonzero + debug_assert!(acc != Self::InnerType::ZERO.into()); + + // Compute the inverse of all products + acc = acc.invert().unwrap(); + + // We need to return the product of all inverses later + let ret = acc; + + // Pass through the vector backwards to compute the inverses + // in place + for (input, scratch) in inputs.iter_mut().rev().zip(scratch.iter().rev()) { + let tmp: Self = acc * input.clone(); + *input = acc * *scratch; + acc = tmp; + } -impl ScalarBytesFromScalar for Scalar { - fn decompress_scalar(s: &Scalar) -> ScalarBytes { - ScalarBytes::from_bytes_mod_order(s.to_bytes()) + ret } +} - fn decompress_vector(s: &[Scalar]) -> Vec { - (0..s.len()) - .map(|i| Scalar::decompress_scalar(&s[i])) - .collect::>() +impl<'a> From<&'a Scalar> for [u8; 32] { + fn from(value: &'a Scalar) -> [u8; 32] { + value.to_bytes() } } + +/// macro_rules! impl_add_binop_specify_output +#[macro_export] +macro_rules! impl_add_binop_specify_output { + ($lhs:ident, $rhs:ident, $output:ident) => { + impl<'b> Add<&'b $rhs> for $lhs { + type Output = $output; + + fn add(self, rhs: &'b $rhs) -> $output { + &self + rhs + } + } + + impl<'a> Add<$rhs> for &'a $lhs { + type Output = $output; + + fn add(self, rhs: $rhs) -> $output { + self + &rhs + } + } + + impl Add<$rhs> for $lhs { + type Output = $output; + + fn add(self, rhs: $rhs) -> $output { + &self + &rhs + } + } + + impl AddAssign<$rhs> for $lhs { + fn add_assign(&mut self, rhs: $rhs) { + *self = &*self + &rhs; + } + } + + impl<'b> AddAssign<&'b $rhs> for $lhs { + fn add_assign(&mut self, rhs: &'b $rhs) { + *self = &*self + rhs; + } + } + }; +} + +/// macro_rules! impl_sub_binop_specify_output +#[macro_export] +macro_rules! impl_sub_binop_specify_output { + ($lhs:ident, $rhs:ident, $output:ident) => { + impl<'b> Sub<&'b $rhs> for $lhs { + type Output = $output; + + fn sub(self, rhs: &'b $rhs) -> $output { + &self - rhs + } + } + + impl<'a> Sub<$rhs> for &'a $lhs { + type Output = $output; + + fn sub(self, rhs: $rhs) -> $output { + self - &rhs + } + } + + impl Sub<$rhs> for $lhs { + type Output = $output; + + fn sub(self, rhs: $rhs) -> $output { + &self - &rhs + } + } + + impl SubAssign<$rhs> for $lhs { + fn sub_assign(&mut self, rhs: $rhs) { + *self = &*self - &rhs; + } + } + + impl<'b> SubAssign<&'b $rhs> for $lhs { + fn sub_assign(&mut self, rhs: &'b $rhs) { + *self = &*self - rhs; + } + } + }; +} + +/// impl_binops_multiplicative_mixed +#[macro_export] +macro_rules! impl_binops_multiplicative_mixed { + ($lhs:ident, $rhs:ident, $output:ident) => { + impl<'b> Mul<&'b $rhs> for $lhs { + type Output = $output; + + fn mul(self, rhs: &'b $rhs) -> $output { + &self * rhs + } + } + + impl<'a> Mul<$rhs> for &'a $lhs { + type Output = $output; + + fn mul(self, rhs: $rhs) -> $output { + self * &rhs + } + } + + impl Mul<$rhs> for $lhs { + type Output = $output; + + fn mul(self, rhs: $rhs) -> $output { + &self * &rhs + } + } + + impl MulAssign<$rhs> for $lhs { + fn mul_assign(&mut self, rhs: $rhs) { + *self = &*self * &rhs; + } + } + + impl<'b> MulAssign<&'b $rhs> for $lhs { + fn mul_assign(&mut self, rhs: &'b $rhs) { + *self = &*self * rhs; + } + } + }; +} diff --git a/spartan_parallel/src/scalar/ristretto255.rs b/spartan_parallel/src/scalar/ristretto255.rs deleted file mode 100755 index cd979ba5..00000000 --- a/spartan_parallel/src/scalar/ristretto255.rs +++ /dev/null @@ -1,1210 +0,0 @@ -//! This module provides an implementation of the Curve25519's scalar field $\mathbb{F}_q$ -//! where `q = 2^252 + 27742317777372353535851937790883648493 = 0x1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed` -//! This module is an adaptation of code from the bls12-381 crate. -//! We modify various constants (MODULUS, R, R2, etc.) to appropriate values for Curve25519 and update tests -//! We borrow the `invert` method from the curve25519-dalek crate. -//! See NOTICE.md for more details -#![allow(clippy::all)] -use core::borrow::Borrow; -use core::convert::TryFrom; -use core::fmt; -use core::iter::{Product, Sum}; -use core::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign}; -use rand::{CryptoRng, RngCore}; -use serde::{Deserialize, Serialize}; -use subtle::{Choice, ConditionallySelectable, ConstantTimeEq, CtOption}; -use zeroize::DefaultIsZeroes; - -// use crate::util::{adc, mac, sbb}; -/// Compute a + b + carry, returning the result and the new carry over. -#[inline(always)] -pub const fn adc(a: u64, b: u64, carry: u64) -> (u64, u64) { - let ret = (a as u128) + (b as u128) + (carry as u128); - (ret as u64, (ret >> 64) as u64) -} - -/// Compute a - (b + borrow), returning the result and the new borrow. -#[inline(always)] -pub const fn sbb(a: u64, b: u64, borrow: u64) -> (u64, u64) { - let ret = (a as u128).wrapping_sub((b as u128) + ((borrow >> 63) as u128)); - (ret as u64, (ret >> 64) as u64) -} - -/// Compute a + (b * c) + carry, returning the result and the new carry over. -#[inline(always)] -pub const fn mac(a: u64, b: u64, c: u64, carry: u64) -> (u64, u64) { - let ret = (a as u128) + ((b as u128) * (c as u128)) + (carry as u128); - (ret as u64, (ret >> 64) as u64) -} - -macro_rules! impl_add_binop_specify_output { - ($lhs:ident, $rhs:ident, $output:ident) => { - impl<'b> Add<&'b $rhs> for $lhs { - type Output = $output; - - #[inline] - fn add(self, rhs: &'b $rhs) -> $output { - &self + rhs - } - } - - impl<'a> Add<$rhs> for &'a $lhs { - type Output = $output; - - #[inline] - fn add(self, rhs: $rhs) -> $output { - self + &rhs - } - } - - impl Add<$rhs> for $lhs { - type Output = $output; - - #[inline] - fn add(self, rhs: $rhs) -> $output { - &self + &rhs - } - } - }; -} - -macro_rules! impl_sub_binop_specify_output { - ($lhs:ident, $rhs:ident, $output:ident) => { - impl<'b> Sub<&'b $rhs> for $lhs { - type Output = $output; - - #[inline] - fn sub(self, rhs: &'b $rhs) -> $output { - &self - rhs - } - } - - impl<'a> Sub<$rhs> for &'a $lhs { - type Output = $output; - - #[inline] - fn sub(self, rhs: $rhs) -> $output { - self - &rhs - } - } - - impl Sub<$rhs> for $lhs { - type Output = $output; - - #[inline] - fn sub(self, rhs: $rhs) -> $output { - &self - &rhs - } - } - }; -} - -macro_rules! impl_binops_additive_specify_output { - ($lhs:ident, $rhs:ident, $output:ident) => { - impl_add_binop_specify_output!($lhs, $rhs, $output); - impl_sub_binop_specify_output!($lhs, $rhs, $output); - }; -} - -macro_rules! impl_binops_multiplicative_mixed { - ($lhs:ident, $rhs:ident, $output:ident) => { - impl<'b> Mul<&'b $rhs> for $lhs { - type Output = $output; - - #[inline] - fn mul(self, rhs: &'b $rhs) -> $output { - &self * rhs - } - } - - impl<'a> Mul<$rhs> for &'a $lhs { - type Output = $output; - - #[inline] - fn mul(self, rhs: $rhs) -> $output { - self * &rhs - } - } - - impl Mul<$rhs> for $lhs { - type Output = $output; - - #[inline] - fn mul(self, rhs: $rhs) -> $output { - &self * &rhs - } - } - }; -} - -macro_rules! impl_binops_additive { - ($lhs:ident, $rhs:ident) => { - impl_binops_additive_specify_output!($lhs, $rhs, $lhs); - - impl SubAssign<$rhs> for $lhs { - #[inline] - fn sub_assign(&mut self, rhs: $rhs) { - *self = &*self - &rhs; - } - } - - impl AddAssign<$rhs> for $lhs { - #[inline] - fn add_assign(&mut self, rhs: $rhs) { - *self = &*self + &rhs; - } - } - - impl<'b> SubAssign<&'b $rhs> for $lhs { - #[inline] - fn sub_assign(&mut self, rhs: &'b $rhs) { - *self = &*self - rhs; - } - } - - impl<'b> AddAssign<&'b $rhs> for $lhs { - #[inline] - fn add_assign(&mut self, rhs: &'b $rhs) { - *self = &*self + rhs; - } - } - }; -} - -macro_rules! impl_binops_multiplicative { - ($lhs:ident, $rhs:ident) => { - impl_binops_multiplicative_mixed!($lhs, $rhs, $lhs); - - impl MulAssign<$rhs> for $lhs { - #[inline] - fn mul_assign(&mut self, rhs: $rhs) { - *self = &*self * &rhs; - } - } - - impl<'b> MulAssign<&'b $rhs> for $lhs { - #[inline] - fn mul_assign(&mut self, rhs: &'b $rhs) { - *self = &*self * rhs; - } - } - }; -} - -/// Represents an element of the scalar field $\mathbb{F}_q$ of the Curve25519 elliptic -/// curve construction. -// The internal representation of this type is four 64-bit unsigned -// integers in little-endian order. `Scalar` values are always in -// Montgomery form; i.e., Scalar(a) = aR mod q, with R = 2^256. -#[derive(Clone, Copy, Eq, Serialize, Deserialize, Hash)] -pub struct Scalar(pub(crate) [u64; 4]); - -impl fmt::Debug for Scalar { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let tmp = self.to_bytes(); - write!(f, "0x")?; - for &b in tmp.iter().rev() { - write!(f, "{:02x}", b)?; - } - Ok(()) - } -} - -impl From for Scalar { - fn from(val: u64) -> Scalar { - Scalar([val, 0, 0, 0]) * R2 - } -} - -impl ConstantTimeEq for Scalar { - fn ct_eq(&self, other: &Self) -> Choice { - self.0[0].ct_eq(&other.0[0]) - & self.0[1].ct_eq(&other.0[1]) - & self.0[2].ct_eq(&other.0[2]) - & self.0[3].ct_eq(&other.0[3]) - } -} - -impl PartialEq for Scalar { - #[inline] - fn eq(&self, other: &Self) -> bool { - self.ct_eq(other).unwrap_u8() == 1 - } -} - -impl ConditionallySelectable for Scalar { - fn conditional_select(a: &Self, b: &Self, choice: Choice) -> Self { - Scalar([ - u64::conditional_select(&a.0[0], &b.0[0], choice), - u64::conditional_select(&a.0[1], &b.0[1], choice), - u64::conditional_select(&a.0[2], &b.0[2], choice), - u64::conditional_select(&a.0[3], &b.0[3], choice), - ]) - } -} - -/// Constant representing the modulus -/// q = 2^252 + 27742317777372353535851937790883648493 -/// 0x1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed -const MODULUS: Scalar = Scalar([ - 0x5812_631a_5cf5_d3ed, - 0x14de_f9de_a2f7_9cd6, - 0x0000_0000_0000_0000, - 0x1000_0000_0000_0000, -]); - -impl<'a> Neg for &'a Scalar { - type Output = Scalar; - - #[inline] - fn neg(self) -> Scalar { - self.neg() - } -} - -impl Neg for Scalar { - type Output = Scalar; - - #[inline] - fn neg(self) -> Scalar { - -&self - } -} - -impl<'a, 'b> Sub<&'b Scalar> for &'a Scalar { - type Output = Scalar; - - #[inline] - fn sub(self, rhs: &'b Scalar) -> Scalar { - self.sub(rhs) - } -} - -impl<'a, 'b> Add<&'b Scalar> for &'a Scalar { - type Output = Scalar; - - #[inline] - fn add(self, rhs: &'b Scalar) -> Scalar { - self.add(rhs) - } -} - -impl<'a, 'b> Mul<&'b Scalar> for &'a Scalar { - type Output = Scalar; - - #[inline] - fn mul(self, rhs: &'b Scalar) -> Scalar { - self.mul(rhs) - } -} - -impl_binops_additive!(Scalar, Scalar); -impl_binops_multiplicative!(Scalar, Scalar); - -/// INV = -(q^{-1} mod 2^64) mod 2^64 -const INV: u64 = 0xd2b5_1da3_1254_7e1b; - -/// R = 2^256 mod q -const R: Scalar = Scalar([ - 0xd6ec_3174_8d98_951d, - 0xc6ef_5bf4_737d_cf70, - 0xffff_ffff_ffff_fffe, - 0x0fff_ffff_ffff_ffff, -]); - -/// R^2 = 2^512 mod q -const R2: Scalar = Scalar([ - 0xa406_11e3_449c_0f01, - 0xd00e_1ba7_6885_9347, - 0xceec_73d2_17f5_be65, - 0x0399_411b_7c30_9a3d, -]); - -/// R^3 = 2^768 mod q -const R3: Scalar = Scalar([ - 0x2a9e_4968_7b83_a2db, - 0x2783_24e6_aef7_f3ec, - 0x8065_dc6c_04ec_5b65, - 0x0e53_0b77_3599_cec7, -]); - -impl DefaultIsZeroes for Scalar {} - -impl Default for Scalar { - #[inline] - fn default() -> Self { - Self::zero() - } -} - -impl Product for Scalar -where - T: Borrow, -{ - fn product(iter: I) -> Self - where - I: Iterator, - { - iter.fold(Scalar::one(), |acc, item| acc * item.borrow()) - } -} - -impl Sum for Scalar -where - T: Borrow, -{ - fn sum(iter: I) -> Self - where - I: Iterator, - { - iter.fold(Scalar::zero(), |acc, item| acc + item.borrow()) - } -} - -impl Scalar { - /// Returns zero, the additive identity. - #[inline] - pub const fn zero() -> Scalar { - Scalar([0, 0, 0, 0]) - } - - /// Returns one, the multiplicative identity. - #[inline] - pub const fn one() -> Scalar { - R - } - - pub fn random(rng: &mut Rng) -> Self { - let mut limbs = [0u64; 8]; - for i in 0..8 { - limbs[i] = rng.next_u64(); - } - Scalar::from_u512(limbs) - } - - /// Doubles this field element. - #[inline] - pub const fn double(&self) -> Scalar { - // TODO: This can be achieved more efficiently with a bitshift. - self.add(self) - } - - /// Attempts to convert a little-endian byte representation of - /// a scalar into a `Scalar`, failing if the input is not canonical. - pub fn from_bytes(bytes: &[u8; 32]) -> CtOption { - let mut tmp = Scalar([0, 0, 0, 0]); - - tmp.0[0] = u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[..8]).unwrap()); - tmp.0[1] = u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[8..16]).unwrap()); - tmp.0[2] = u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[16..24]).unwrap()); - tmp.0[3] = u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[24..32]).unwrap()); - - // Try to subtract the modulus - let (_, borrow) = sbb(tmp.0[0], MODULUS.0[0], 0); - let (_, borrow) = sbb(tmp.0[1], MODULUS.0[1], borrow); - let (_, borrow) = sbb(tmp.0[2], MODULUS.0[2], borrow); - let (_, borrow) = sbb(tmp.0[3], MODULUS.0[3], borrow); - - // If the element is smaller than MODULUS then the - // subtraction will underflow, producing a borrow value - // of 0xffff...ffff. Otherwise, it'll be zero. - let is_some = (borrow as u8) & 1; - - // Convert to Montgomery form by computing - // (a.R^0 * R^2) / R = a.R - tmp *= &R2; - - CtOption::new(tmp, Choice::from(is_some)) - } - - /// Converts an element of `Scalar` into a byte representation in - /// little-endian byte order. - pub fn to_bytes(&self) -> [u8; 32] { - // Turn into canonical form by computing - // (a.R) / R = a - let tmp = Scalar::montgomery_reduce(self.0[0], self.0[1], self.0[2], self.0[3], 0, 0, 0, 0); - - let mut res = [0; 32]; - res[..8].copy_from_slice(&tmp.0[0].to_le_bytes()); - res[8..16].copy_from_slice(&tmp.0[1].to_le_bytes()); - res[16..24].copy_from_slice(&tmp.0[2].to_le_bytes()); - res[24..32].copy_from_slice(&tmp.0[3].to_le_bytes()); - - res - } - - /// Converts a 512-bit little endian integer into - /// a `Scalar` by reducing by the modulus. - pub fn from_bytes_wide(bytes: &[u8; 64]) -> Scalar { - Scalar::from_u512([ - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[..8]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[8..16]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[16..24]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[24..32]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[32..40]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[40..48]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[48..56]).unwrap()), - u64::from_le_bytes(<[u8; 8]>::try_from(&bytes[56..64]).unwrap()), - ]) - } - - fn from_u512(limbs: [u64; 8]) -> Scalar { - // We reduce an arbitrary 512-bit number by decomposing it into two 256-bit digits - // with the higher bits multiplied by 2^256. Thus, we perform two reductions - // - // 1. the lower bits are multiplied by R^2, as normal - // 2. the upper bits are multiplied by R^2 * 2^256 = R^3 - // - // and computing their sum in the field. It remains to see that arbitrary 256-bit - // numbers can be placed into Montgomery form safely using the reduction. The - // reduction works so long as the product is less than R=2^256 multipled by - // the modulus. This holds because for any `c` smaller than the modulus, we have - // that (2^256 - 1)*c is an acceptable product for the reduction. Therefore, the - // reduction always works so long as `c` is in the field; in this case it is either the - // constant `R2` or `R3`. - let d0 = Scalar([limbs[0], limbs[1], limbs[2], limbs[3]]); - let d1 = Scalar([limbs[4], limbs[5], limbs[6], limbs[7]]); - // Convert to Montgomery form - d0 * R2 + d1 * R3 - } - - /// Converts from an integer represented in little endian - /// into its (congruent) `Scalar` representation. - pub const fn from_raw(val: [u64; 4]) -> Self { - (&Scalar(val)).mul(&R2) - } - - /// Squares this element. - #[inline] - pub const fn square(&self) -> Scalar { - let (r1, carry) = mac(0, self.0[0], self.0[1], 0); - let (r2, carry) = mac(0, self.0[0], self.0[2], carry); - let (r3, r4) = mac(0, self.0[0], self.0[3], carry); - - let (r3, carry) = mac(r3, self.0[1], self.0[2], 0); - let (r4, r5) = mac(r4, self.0[1], self.0[3], carry); - - let (r5, r6) = mac(r5, self.0[2], self.0[3], 0); - - let r7 = r6 >> 63; - let r6 = (r6 << 1) | (r5 >> 63); - let r5 = (r5 << 1) | (r4 >> 63); - let r4 = (r4 << 1) | (r3 >> 63); - let r3 = (r3 << 1) | (r2 >> 63); - let r2 = (r2 << 1) | (r1 >> 63); - let r1 = r1 << 1; - - let (r0, carry) = mac(0, self.0[0], self.0[0], 0); - let (r1, carry) = adc(0, r1, carry); - let (r2, carry) = mac(r2, self.0[1], self.0[1], carry); - let (r3, carry) = adc(0, r3, carry); - let (r4, carry) = mac(r4, self.0[2], self.0[2], carry); - let (r5, carry) = adc(0, r5, carry); - let (r6, carry) = mac(r6, self.0[3], self.0[3], carry); - let (r7, _) = adc(0, r7, carry); - - Scalar::montgomery_reduce(r0, r1, r2, r3, r4, r5, r6, r7) - } - - /// Exponentiates `self` by `by`, where `by` is a - /// little-endian order integer exponent. - pub fn pow(&self, by: &[u64; 4]) -> Self { - let mut res = Self::one(); - for e in by.iter().rev() { - for i in (0..64).rev() { - res = res.square(); - let mut tmp = res; - tmp *= self; - res.conditional_assign(&tmp, (((*e >> i) & 0x1) as u8).into()); - } - } - res - } - - /// Exponentiates `self` by `by`, where `by` is a - /// little-endian order integer exponent. - /// - /// **This operation is variable time with respect - /// to the exponent.** If the exponent is fixed, - /// this operation is effectively constant time. - pub fn pow_vartime(&self, by: &[u64; 4]) -> Self { - let mut res = Self::one(); - for e in by.iter().rev() { - for i in (0..64).rev() { - res = res.square(); - - if ((*e >> i) & 1) == 1 { - res.mul_assign(self); - } - } - } - res - } - - pub fn invert(&self) -> CtOption { - // Uses the addition chain from - // https://briansmith.org/ecc-inversion-addition-chains-01#curve25519_scalar_inversion - // implementation adapted from curve25519-dalek - let _1 = self; - let _10 = _1.square(); - let _100 = _10.square(); - let _11 = &_10 * _1; - let _101 = &_10 * &_11; - let _111 = &_10 * &_101; - let _1001 = &_10 * &_111; - let _1011 = &_10 * &_1001; - let _1111 = &_100 * &_1011; - - // _10000 - let mut y = &_1111 * _1; - - #[inline] - fn square_multiply(y: &mut Scalar, squarings: usize, x: &Scalar) { - for _ in 0..squarings { - *y = y.square(); - } - *y = y.mul(x); - } - - square_multiply(&mut y, 123 + 3, &_101); - square_multiply(&mut y, 2 + 2, &_11); - square_multiply(&mut y, 1 + 4, &_1111); - square_multiply(&mut y, 1 + 4, &_1111); - square_multiply(&mut y, 4, &_1001); - square_multiply(&mut y, 2, &_11); - square_multiply(&mut y, 1 + 4, &_1111); - square_multiply(&mut y, 1 + 3, &_101); - square_multiply(&mut y, 3 + 3, &_101); - square_multiply(&mut y, 3, &_111); - square_multiply(&mut y, 1 + 4, &_1111); - square_multiply(&mut y, 2 + 3, &_111); - square_multiply(&mut y, 2 + 2, &_11); - square_multiply(&mut y, 1 + 4, &_1011); - square_multiply(&mut y, 2 + 4, &_1011); - square_multiply(&mut y, 6 + 4, &_1001); - square_multiply(&mut y, 2 + 2, &_11); - square_multiply(&mut y, 3 + 2, &_11); - square_multiply(&mut y, 3 + 2, &_11); - square_multiply(&mut y, 1 + 4, &_1001); - square_multiply(&mut y, 1 + 3, &_111); - square_multiply(&mut y, 2 + 4, &_1111); - square_multiply(&mut y, 1 + 4, &_1011); - square_multiply(&mut y, 3, &_101); - square_multiply(&mut y, 2 + 4, &_1111); - square_multiply(&mut y, 3, &_101); - square_multiply(&mut y, 1 + 2, &_11); - - CtOption::new(y, !self.ct_eq(&Self::zero())) - } - - pub fn batch_invert(inputs: &mut [Scalar]) -> Scalar { - // This code is essentially identical to the FieldElement - // implementation, and is documented there. Unfortunately, - // it's not easy to write it generically, since here we want - // to use `UnpackedScalar`s internally, and `Scalar`s - // externally, but there's no corresponding distinction for - // field elements. - - use zeroize::Zeroizing; - - let n = inputs.len(); - let one = Scalar::one(); - - // Place scratch storage in a Zeroizing wrapper to wipe it when - // we pass out of scope. - let scratch_vec = vec![one; n]; - let mut scratch = Zeroizing::new(scratch_vec); - - // Keep an accumulator of all of the previous products - let mut acc = Scalar::one(); - - // Pass through the input vector, recording the previous - // products in the scratch space - for (input, scratch) in inputs.iter().zip(scratch.iter_mut()) { - *scratch = acc; - - acc = acc * input; - } - - // acc is nonzero iff all inputs are nonzero - debug_assert!(acc != Scalar::zero()); - - // Compute the inverse of all products - acc = acc.invert().unwrap(); - - // We need to return the product of all inverses later - let ret = acc; - - // Pass through the vector backwards to compute the inverses - // in place - for (input, scratch) in inputs.iter_mut().rev().zip(scratch.iter().rev()) { - let tmp = &acc * input.clone(); - *input = &acc * scratch; - acc = tmp; - } - - ret - } - - #[inline(always)] - const fn montgomery_reduce( - r0: u64, - r1: u64, - r2: u64, - r3: u64, - r4: u64, - r5: u64, - r6: u64, - r7: u64, - ) -> Self { - // The Montgomery reduction here is based on Algorithm 14.32 in - // Handbook of Applied Cryptography - // . - - let k = r0.wrapping_mul(INV); - let (_, carry) = mac(r0, k, MODULUS.0[0], 0); - let (r1, carry) = mac(r1, k, MODULUS.0[1], carry); - let (r2, carry) = mac(r2, k, MODULUS.0[2], carry); - let (r3, carry) = mac(r3, k, MODULUS.0[3], carry); - let (r4, carry2) = adc(r4, 0, carry); - - let k = r1.wrapping_mul(INV); - let (_, carry) = mac(r1, k, MODULUS.0[0], 0); - let (r2, carry) = mac(r2, k, MODULUS.0[1], carry); - let (r3, carry) = mac(r3, k, MODULUS.0[2], carry); - let (r4, carry) = mac(r4, k, MODULUS.0[3], carry); - let (r5, carry2) = adc(r5, carry2, carry); - - let k = r2.wrapping_mul(INV); - let (_, carry) = mac(r2, k, MODULUS.0[0], 0); - let (r3, carry) = mac(r3, k, MODULUS.0[1], carry); - let (r4, carry) = mac(r4, k, MODULUS.0[2], carry); - let (r5, carry) = mac(r5, k, MODULUS.0[3], carry); - let (r6, carry2) = adc(r6, carry2, carry); - - let k = r3.wrapping_mul(INV); - let (_, carry) = mac(r3, k, MODULUS.0[0], 0); - let (r4, carry) = mac(r4, k, MODULUS.0[1], carry); - let (r5, carry) = mac(r5, k, MODULUS.0[2], carry); - let (r6, carry) = mac(r6, k, MODULUS.0[3], carry); - let (r7, _) = adc(r7, carry2, carry); - - // Result may be within MODULUS of the correct value - (&Scalar([r4, r5, r6, r7])).sub(&MODULUS) - } - - /// Multiplies `rhs` by `self`, returning the result. - #[inline] - pub const fn mul(&self, rhs: &Self) -> Self { - // Schoolbook multiplication - - let (r0, carry) = mac(0, self.0[0], rhs.0[0], 0); - let (r1, carry) = mac(0, self.0[0], rhs.0[1], carry); - let (r2, carry) = mac(0, self.0[0], rhs.0[2], carry); - let (r3, r4) = mac(0, self.0[0], rhs.0[3], carry); - - let (r1, carry) = mac(r1, self.0[1], rhs.0[0], 0); - let (r2, carry) = mac(r2, self.0[1], rhs.0[1], carry); - let (r3, carry) = mac(r3, self.0[1], rhs.0[2], carry); - let (r4, r5) = mac(r4, self.0[1], rhs.0[3], carry); - - let (r2, carry) = mac(r2, self.0[2], rhs.0[0], 0); - let (r3, carry) = mac(r3, self.0[2], rhs.0[1], carry); - let (r4, carry) = mac(r4, self.0[2], rhs.0[2], carry); - let (r5, r6) = mac(r5, self.0[2], rhs.0[3], carry); - - let (r3, carry) = mac(r3, self.0[3], rhs.0[0], 0); - let (r4, carry) = mac(r4, self.0[3], rhs.0[1], carry); - let (r5, carry) = mac(r5, self.0[3], rhs.0[2], carry); - let (r6, r7) = mac(r6, self.0[3], rhs.0[3], carry); - - Scalar::montgomery_reduce(r0, r1, r2, r3, r4, r5, r6, r7) - } - - /// Subtracts `rhs` from `self`, returning the result. - #[inline] - pub const fn sub(&self, rhs: &Self) -> Self { - let (d0, borrow) = sbb(self.0[0], rhs.0[0], 0); - let (d1, borrow) = sbb(self.0[1], rhs.0[1], borrow); - let (d2, borrow) = sbb(self.0[2], rhs.0[2], borrow); - let (d3, borrow) = sbb(self.0[3], rhs.0[3], borrow); - - // If underflow occurred on the final limb, borrow = 0xfff...fff, otherwise - // borrow = 0x000...000. Thus, we use it as a mask to conditionally add the modulus. - let (d0, carry) = adc(d0, MODULUS.0[0] & borrow, 0); - let (d1, carry) = adc(d1, MODULUS.0[1] & borrow, carry); - let (d2, carry) = adc(d2, MODULUS.0[2] & borrow, carry); - let (d3, _) = adc(d3, MODULUS.0[3] & borrow, carry); - - Scalar([d0, d1, d2, d3]) - } - - /// Adds `rhs` to `self`, returning the result. - #[inline] - pub const fn add(&self, rhs: &Self) -> Self { - let (d0, carry) = adc(self.0[0], rhs.0[0], 0); - let (d1, carry) = adc(self.0[1], rhs.0[1], carry); - let (d2, carry) = adc(self.0[2], rhs.0[2], carry); - let (d3, _) = adc(self.0[3], rhs.0[3], carry); - - // Attempt to subtract the modulus, to ensure the value - // is smaller than the modulus. - (&Scalar([d0, d1, d2, d3])).sub(&MODULUS) - } - - /// Negates `self`. - #[inline] - pub const fn neg(&self) -> Self { - // Subtract `self` from `MODULUS` to negate. Ignore the final - // borrow because it cannot underflow; self is guaranteed to - // be in the field. - let (d0, borrow) = sbb(MODULUS.0[0], self.0[0], 0); - let (d1, borrow) = sbb(MODULUS.0[1], self.0[1], borrow); - let (d2, borrow) = sbb(MODULUS.0[2], self.0[2], borrow); - let (d3, _) = sbb(MODULUS.0[3], self.0[3], borrow); - - // `tmp` could be `MODULUS` if `self` was zero. Create a mask that is - // zero if `self` was zero, and `u64::max_value()` if self was nonzero. - let mask = (((self.0[0] | self.0[1] | self.0[2] | self.0[3]) == 0) as u64).wrapping_sub(1); - - Scalar([d0 & mask, d1 & mask, d2 & mask, d3 & mask]) - } -} - -impl<'a> From<&'a Scalar> for [u8; 32] { - fn from(value: &'a Scalar) -> [u8; 32] { - value.to_bytes() - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_inv() { - // Compute -(q^{-1} mod 2^64) mod 2^64 by exponentiating - // by totient(2**64) - 1 - - let mut inv = 1u64; - for _ in 0..63 { - inv = inv.wrapping_mul(inv); - inv = inv.wrapping_mul(MODULUS.0[0]); - } - inv = inv.wrapping_neg(); - - assert_eq!(inv, INV); - } - - #[cfg(feature = "std")] - #[test] - fn test_debug() { - assert_eq!( - format!("{:?}", Scalar::zero()), - "0x0000000000000000000000000000000000000000000000000000000000000000" - ); - assert_eq!( - format!("{:?}", Scalar::one()), - "0x0000000000000000000000000000000000000000000000000000000000000001" - ); - assert_eq!( - format!("{:?}", R2), - "0x0ffffffffffffffffffffffffffffffec6ef5bf4737dcf70d6ec31748d98951d" - ); - } - - #[test] - fn test_equality() { - assert_eq!(Scalar::zero(), Scalar::zero()); - assert_eq!(Scalar::one(), Scalar::one()); - assert_eq!(R2, R2); - - assert!(Scalar::zero() != Scalar::one()); - assert!(Scalar::one() != R2); - } - - #[test] - fn test_to_bytes() { - assert_eq!( - Scalar::zero().to_bytes(), - [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - ] - ); - - assert_eq!( - Scalar::one().to_bytes(), - [ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - ] - ); - - assert_eq!( - R2.to_bytes(), - [ - 29, 149, 152, 141, 116, 49, 236, 214, 112, 207, 125, 115, 244, 91, 239, 198, 254, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15 - ] - ); - - assert_eq!( - (-&Scalar::one()).to_bytes(), - [ - 236, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 - ] - ); - } - - #[test] - fn test_from_bytes() { - assert_eq!( - Scalar::from_bytes(&[ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - ]) - .unwrap(), - Scalar::zero() - ); - - assert_eq!( - Scalar::from_bytes(&[ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0 - ]) - .unwrap(), - Scalar::one() - ); - - assert_eq!( - Scalar::from_bytes(&[ - 29, 149, 152, 141, 116, 49, 236, 214, 112, 207, 125, 115, 244, 91, 239, 198, 254, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15 - ]) - .unwrap(), - R2 - ); - - // -1 should work - assert!( - Scalar::from_bytes(&[ - 236, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 - ]) - .is_some() - .unwrap_u8() - == 1 - ); - - // modulus is invalid - assert!( - Scalar::from_bytes(&[ - 1, 0, 0, 0, 255, 255, 255, 255, 254, 91, 254, 255, 2, 164, 189, 83, 5, 216, 161, 9, 8, 216, - 57, 51, 72, 125, 157, 41, 83, 167, 237, 115 - ]) - .is_none() - .unwrap_u8() - == 1 - ); - - // Anything larger than the modulus is invalid - assert!( - Scalar::from_bytes(&[ - 2, 0, 0, 0, 255, 255, 255, 255, 254, 91, 254, 255, 2, 164, 189, 83, 5, 216, 161, 9, 8, 216, - 57, 51, 72, 125, 157, 41, 83, 167, 237, 115 - ]) - .is_none() - .unwrap_u8() - == 1 - ); - assert!( - Scalar::from_bytes(&[ - 1, 0, 0, 0, 255, 255, 255, 255, 254, 91, 254, 255, 2, 164, 189, 83, 5, 216, 161, 9, 8, 216, - 58, 51, 72, 125, 157, 41, 83, 167, 237, 115 - ]) - .is_none() - .unwrap_u8() - == 1 - ); - assert!( - Scalar::from_bytes(&[ - 1, 0, 0, 0, 255, 255, 255, 255, 254, 91, 254, 255, 2, 164, 189, 83, 5, 216, 161, 9, 8, 216, - 57, 51, 72, 125, 157, 41, 83, 167, 237, 116 - ]) - .is_none() - .unwrap_u8() - == 1 - ); - } - - #[test] - fn test_from_u512_zero() { - assert_eq!( - Scalar::zero(), - Scalar::from_u512([ - MODULUS.0[0], - MODULUS.0[1], - MODULUS.0[2], - MODULUS.0[3], - 0, - 0, - 0, - 0 - ]) - ); - } - - #[test] - fn test_from_u512_r() { - assert_eq!(R, Scalar::from_u512([1, 0, 0, 0, 0, 0, 0, 0])); - } - - #[test] - fn test_from_u512_r2() { - assert_eq!(R2, Scalar::from_u512([0, 0, 0, 0, 1, 0, 0, 0])); - } - - #[test] - fn test_from_u512_max() { - let max_u64 = 0xffffffffffffffff; - assert_eq!( - R3 - R, - Scalar::from_u512([max_u64, max_u64, max_u64, max_u64, max_u64, max_u64, max_u64, max_u64]) - ); - } - - #[test] - fn test_from_bytes_wide_r2() { - assert_eq!( - R2, - Scalar::from_bytes_wide(&[ - 29, 149, 152, 141, 116, 49, 236, 214, 112, 207, 125, 115, 244, 91, 239, 198, 254, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]) - ); - } - - #[test] - fn test_from_bytes_wide_negative_one() { - assert_eq!( - -&Scalar::one(), - Scalar::from_bytes_wide(&[ - 236, 211, 245, 92, 26, 99, 18, 88, 214, 156, 247, 162, 222, 249, 222, 20, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]) - ); - } - - #[test] - fn test_from_bytes_wide_maximum() { - assert_eq!( - Scalar::from_raw([ - 0xa40611e3449c0f00, - 0xd00e1ba768859347, - 0xceec73d217f5be65, - 0x0399411b7c309a3d - ]), - Scalar::from_bytes_wide(&[0xff; 64]) - ); - } - - #[test] - fn test_zero() { - assert_eq!(Scalar::zero(), -&Scalar::zero()); - assert_eq!(Scalar::zero(), Scalar::zero() + Scalar::zero()); - assert_eq!(Scalar::zero(), Scalar::zero() - Scalar::zero()); - assert_eq!(Scalar::zero(), Scalar::zero() * Scalar::zero()); - } - - const LARGEST: Scalar = Scalar([ - 0x5812631a5cf5d3ec, - 0x14def9dea2f79cd6, - 0x0000000000000000, - 0x1000000000000000, - ]); - - #[test] - fn test_addition() { - let mut tmp = LARGEST; - tmp += &LARGEST; - - assert_eq!( - tmp, - Scalar([ - 0x5812631a5cf5d3eb, - 0x14def9dea2f79cd6, - 0x0000000000000000, - 0x1000000000000000, - ]) - ); - - let mut tmp = LARGEST; - tmp += &Scalar([1, 0, 0, 0]); - - assert_eq!(tmp, Scalar::zero()); - } - - #[test] - fn test_negation() { - let tmp = -&LARGEST; - - assert_eq!(tmp, Scalar([1, 0, 0, 0])); - - let tmp = -&Scalar::zero(); - assert_eq!(tmp, Scalar::zero()); - let tmp = -&Scalar([1, 0, 0, 0]); - assert_eq!(tmp, LARGEST); - } - - #[test] - fn test_subtraction() { - let mut tmp = LARGEST; - tmp -= &LARGEST; - - assert_eq!(tmp, Scalar::zero()); - - let mut tmp = Scalar::zero(); - tmp -= &LARGEST; - - let mut tmp2 = MODULUS; - tmp2 -= &LARGEST; - - assert_eq!(tmp, tmp2); - } - - #[test] - fn test_multiplication() { - let mut cur = LARGEST; - - for _ in 0..100 { - let mut tmp = cur; - tmp *= &cur; - - let mut tmp2 = Scalar::zero(); - for b in cur - .to_bytes() - .iter() - .rev() - .flat_map(|byte| (0..8).rev().map(move |i| ((byte >> i) & 1u8) == 1u8)) - { - let tmp3 = tmp2; - tmp2.add_assign(&tmp3); - - if b { - tmp2.add_assign(&cur); - } - } - - assert_eq!(tmp, tmp2); - - cur.add_assign(&LARGEST); - } - } - - #[test] - fn test_squaring() { - let mut cur = LARGEST; - - for _ in 0..100 { - let mut tmp = cur; - tmp = tmp.square(); - - let mut tmp2 = Scalar::zero(); - for b in cur - .to_bytes() - .iter() - .rev() - .flat_map(|byte| (0..8).rev().map(move |i| ((byte >> i) & 1u8) == 1u8)) - { - let tmp3 = tmp2; - tmp2.add_assign(&tmp3); - - if b { - tmp2.add_assign(&cur); - } - } - - assert_eq!(tmp, tmp2); - - cur.add_assign(&LARGEST); - } - } - - #[test] - fn test_inversion() { - assert_eq!(Scalar::zero().invert().is_none().unwrap_u8(), 1); - assert_eq!(Scalar::one().invert().unwrap(), Scalar::one()); - assert_eq!((-&Scalar::one()).invert().unwrap(), -&Scalar::one()); - - let mut tmp = R2; - - for _ in 0..100 { - let mut tmp2 = tmp.invert().unwrap(); - tmp2.mul_assign(&tmp); - - assert_eq!(tmp2, Scalar::one()); - - tmp.add_assign(&R2); - } - } - - #[test] - fn test_invert_is_pow() { - let q_minus_2 = [ - 0x5812631a5cf5d3eb, - 0x14def9dea2f79cd6, - 0x0000000000000000, - 0x1000000000000000, - ]; - - let mut r1 = R; - let mut r2 = R; - let mut r3 = R; - - for _ in 0..100 { - r1 = r1.invert().unwrap(); - r2 = r2.pow_vartime(&q_minus_2); - r3 = r3.pow(&q_minus_2); - - assert_eq!(r1, r2); - assert_eq!(r2, r3); - // Add R so we check something different next time around - r1.add_assign(&R); - r2 = r1; - r3 = r1; - } - } - - #[test] - fn test_from_raw() { - assert_eq!( - Scalar::from_raw([ - 0xd6ec31748d98951c, - 0xc6ef5bf4737dcf70, - 0xfffffffffffffffe, - 0x0fffffffffffffff - ]), - Scalar::from_raw([0xffffffffffffffff; 4]) - ); - - assert_eq!(Scalar::from_raw(MODULUS.0), Scalar::zero()); - - assert_eq!(Scalar::from_raw([1, 0, 0, 0]), R); - } - - #[test] - fn test_double() { - let a = Scalar::from_raw([ - 0x1fff3231233ffffd, - 0x4884b7fa00034802, - 0x998c4fefecbc4ff3, - 0x1824b159acc50562, - ]); - - assert_eq!(a.double(), a + a); - } -} diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index 0d612445..830d2803 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -1,15 +1,14 @@ #![allow(clippy::type_complexity)] #![allow(clippy::too_many_arguments)] #![allow(clippy::needless_range_loop)] +use crate::scalar::SpartanExtensionField; + use super::dense_mlpoly::DensePolynomial; -use super::dense_mlpoly::{ - EqPolynomial, IdentityPolynomial, PolyCommitment, PolyCommitmentGens, PolyEvalProof, -}; +use super::dense_mlpoly::{EqPolynomial, IdentityPolynomial, PolyEvalProof}; use super::errors::ProofVerifyError; use super::math::Math; use super::product_tree::{DotProductCircuit, ProductCircuit, ProductCircuitEvalProofBatched}; use super::random::RandomTape; -use super::scalar::Scalar; use super::timer::Timer; use super::transcript::{AppendToTranscript, ProofTranscript}; use core::cmp::Ordering; @@ -17,82 +16,74 @@ use merlin::Transcript; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct SparseMatEntry { +pub struct SparseMatEntry { row: usize, col: usize, - val: Scalar, + val: S, } -impl SparseMatEntry { - pub fn new(row: usize, col: usize, val: Scalar) -> Self { +impl SparseMatEntry { + pub fn new(row: usize, col: usize, val: S) -> Self { SparseMatEntry { row, col, val } } } #[derive(Clone, Debug, Serialize, Deserialize)] -pub struct SparseMatPolynomial { +pub struct SparseMatPolynomial { num_vars_x: usize, num_vars_y: usize, - M: Vec, -} - -pub struct Derefs { - row_ops_val: Vec, - col_ops_val: Vec, - comb: DensePolynomial, + M: Vec>, } -#[derive(Debug, Serialize, Deserialize)] -pub struct DerefsCommitment { - comm_ops_val: PolyCommitment, +pub struct Derefs { + row_ops_val: Vec>, + col_ops_val: Vec>, + comb: DensePolynomial, } -impl Derefs { - pub fn new(row_ops_val: Vec, col_ops_val: Vec) -> Self { +impl Derefs { + pub fn new(row_ops_val: Vec>, col_ops_val: Vec>) -> Self { assert_eq!(row_ops_val.len(), col_ops_val.len()); + let ret_row_ops_val = row_ops_val.clone(); + let ret_col_ops_val = col_ops_val.clone(); + let derefs = { // combine all polynomials into a single polynomial (used below to produce a single commitment) - let comb = DensePolynomial::merge(row_ops_val.iter().chain(col_ops_val.iter())); + let comb = DensePolynomial::merge(row_ops_val.into_iter().chain(col_ops_val.into_iter())); Derefs { - row_ops_val, - col_ops_val, + row_ops_val: ret_row_ops_val, + col_ops_val: ret_col_ops_val, comb, } }; derefs } - - pub fn commit(&self, gens: &PolyCommitmentGens) -> DerefsCommitment { - let (comm_ops_val, _blinds) = self.comb.commit(gens, None); - DerefsCommitment { comm_ops_val } - } } #[derive(Debug, Serialize, Deserialize)] -pub struct DerefsEvalProof { - proof_derefs: PolyEvalProof, +pub struct DerefsEvalProof { + proof_derefs: PolyEvalProof, } -impl DerefsEvalProof { +impl DerefsEvalProof { fn protocol_name() -> &'static [u8] { b"Derefs evaluation proof" } fn prove_single( - joint_poly: &DensePolynomial, - r: &[Scalar], - evals: Vec, - gens: &PolyCommitmentGens, + joint_poly: &DensePolynomial, + r: &[S], + evals: Vec, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> PolyEvalProof { + random_tape: &mut RandomTape, + ) -> PolyEvalProof { assert_eq!(joint_poly.get_num_vars(), r.len() + evals.len().log_2()); // append the claimed evaluations to transcript - evals.append_to_transcript(b"evals_ops_val", transcript); + S::append_field_vector_to_transcript(b"evals_ops_val", transcript, &evals); // n-to-1 reduction let (r_joint, eval_joint) = { @@ -111,55 +102,48 @@ impl DerefsEvalProof { (r_joint, joint_claim_eval) }; // decommit the joint polynomial at r_joint - eval_joint.append_to_transcript(b"joint_claim_eval", transcript); - let (proof_derefs, _comm_derefs_eval) = PolyEvalProof::prove( - joint_poly, - None, - &r_joint, - &eval_joint, - None, - gens, - transcript, - random_tape, - ); + S::append_field_to_transcript(b"joint_claim_eval", transcript, eval_joint); + + let proof_derefs = + PolyEvalProof::prove(joint_poly, &r_joint, &eval_joint, transcript, random_tape); proof_derefs } // evalues both polynomials at r and produces a joint proof of opening pub fn prove( - derefs: &Derefs, - eval_row_ops_val_vec: &[Scalar], - eval_col_ops_val_vec: &[Scalar], - r: &[Scalar], - gens: &PolyCommitmentGens, + derefs: &Derefs, + eval_row_ops_val_vec: &[S], + eval_col_ops_val_vec: &[S], + r: &[S], transcript: &mut Transcript, - random_tape: &mut RandomTape, + random_tape: &mut RandomTape, ) -> Self { - transcript.append_protocol_name(DerefsEvalProof::protocol_name()); + >::append_protocol_name( + transcript, + DerefsEvalProof::::protocol_name(), + ); let evals = { let mut evals = eval_row_ops_val_vec.to_owned(); evals.extend(eval_col_ops_val_vec); - evals.resize(evals.len().next_power_of_two(), Scalar::zero()); + evals.resize(evals.len().next_power_of_two(), S::field_zero()); evals }; let proof_derefs = - DerefsEvalProof::prove_single(&derefs.comb, r, evals, gens, transcript, random_tape); + DerefsEvalProof::prove_single(&derefs.comb, r, evals, transcript, random_tape); DerefsEvalProof { proof_derefs } } fn verify_single( - proof: &PolyEvalProof, - comm: &PolyCommitment, - r: &[Scalar], - evals: Vec, - gens: &PolyCommitmentGens, + proof: &PolyEvalProof, + r: &[S], + evals: Vec, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { // append the claimed evaluations to transcript - evals.append_to_transcript(b"evals_ops_val", transcript); + S::append_field_vector_to_transcript(b"evals_ops_val", transcript, &evals); // n-to-1 reduction let challenges = @@ -174,61 +158,49 @@ impl DerefsEvalProof { r_joint.extend(r); // decommit the joint polynomial at r_joint - joint_claim_eval.append_to_transcript(b"joint_claim_eval", transcript); + S::append_field_to_transcript(b"joint_claim_eval", transcript, joint_claim_eval); - proof.verify_plain(gens, transcript, &r_joint, &joint_claim_eval, comm) + proof.verify_plain(transcript, &r_joint, &joint_claim_eval) } // verify evaluations of both polynomials at r pub fn verify( &self, - r: &[Scalar], - eval_row_ops_val_vec: &[Scalar], - eval_col_ops_val_vec: &[Scalar], - gens: &PolyCommitmentGens, - comm: &DerefsCommitment, + r: &[S], + eval_row_ops_val_vec: &[S], + eval_col_ops_val_vec: &[S], transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(DerefsEvalProof::protocol_name()); + >::append_protocol_name( + transcript, + DerefsEvalProof::::protocol_name(), + ); + let mut evals = eval_row_ops_val_vec.to_owned(); evals.extend(eval_col_ops_val_vec); - evals.resize(evals.len().next_power_of_two(), Scalar::zero()); - - DerefsEvalProof::verify_single( - &self.proof_derefs, - &comm.comm_ops_val, - r, - evals, - gens, - transcript, - ) - } -} + evals.resize(evals.len().next_power_of_two(), S::field_zero()); -impl AppendToTranscript for DerefsCommitment { - fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { - transcript.append_message(b"derefs_commitment", b"begin_derefs_commitment"); - self.comm_ops_val.append_to_transcript(label, transcript); - transcript.append_message(b"derefs_commitment", b"end_derefs_commitment"); + DerefsEvalProof::verify_single(&self.proof_derefs, r, evals, transcript) } } -struct AddrTimestamps { +#[derive(Clone)] +struct AddrTimestamps { ops_addr_usize: Vec>, - ops_addr: Vec, - read_ts: Vec, - audit_ts: DensePolynomial, + ops_addr: Vec>, + read_ts: Vec>, + audit_ts: DensePolynomial, } -impl AddrTimestamps { +impl AddrTimestamps { pub fn new(num_cells: usize, num_ops: usize, ops_addr: Vec>) -> Self { for item in ops_addr.iter() { assert_eq!(item.len(), num_ops); } let mut audit_ts = vec![0usize; num_cells]; - let mut ops_addr_vec: Vec = Vec::new(); - let mut read_ts_vec: Vec = Vec::new(); + let mut ops_addr_vec: Vec> = Vec::new(); + let mut read_ts_vec: Vec> = Vec::new(); for ops_addr_inst in ops_addr.iter() { let mut read_ts = vec![0usize; num_ops]; @@ -256,94 +228,51 @@ impl AddrTimestamps { } } - fn deref_mem(addr: &[usize], mem_val: &[Scalar]) -> DensePolynomial { + fn deref_mem(addr: &[usize], mem_val: &[S]) -> DensePolynomial { DensePolynomial::new( (0..addr.len()) .map(|i| { let a = addr[i]; mem_val[a] }) - .collect::>(), + .collect::>(), ) } - pub fn deref(&self, mem_val: &[Scalar]) -> Vec { + pub fn deref(&self, mem_val: &[S]) -> Vec> { (0..self.ops_addr.len()) .map(|i| AddrTimestamps::deref_mem(&self.ops_addr_usize[i], mem_val)) - .collect::>() + .collect::>>() } } -pub struct MultiSparseMatPolynomialAsDense { +pub struct MultiSparseMatPolynomialAsDense { batch_size: usize, - val: Vec, - row: AddrTimestamps, - col: AddrTimestamps, - comb_ops: DensePolynomial, - comb_mem: DensePolynomial, -} - -#[derive(Serialize)] -pub struct SparseMatPolyCommitmentGens { - gens_ops: PolyCommitmentGens, - gens_mem: PolyCommitmentGens, - gens_derefs: PolyCommitmentGens, -} - -impl SparseMatPolyCommitmentGens { - pub fn new( - label: &'static [u8], - num_vars_x: usize, - num_vars_y: usize, - num_nz_entries: usize, - batch_size: usize, - ) -> SparseMatPolyCommitmentGens { - let num_vars_ops = - num_nz_entries.next_power_of_two().log_2() + (batch_size * 5).next_power_of_two().log_2(); - let num_vars_mem = if num_vars_x > num_vars_y { - num_vars_x - } else { - num_vars_y - } + 1; - let num_vars_derefs = - num_nz_entries.next_power_of_two().log_2() + (batch_size * 2).next_power_of_two().log_2(); - - let gens_ops = PolyCommitmentGens::new(num_vars_ops, label); - let gens_mem = PolyCommitmentGens::new(num_vars_mem, label); - let gens_derefs = PolyCommitmentGens::new(num_vars_derefs, label); - SparseMatPolyCommitmentGens { - gens_ops, - gens_mem, - gens_derefs, - } - } + val: Vec>, + row: AddrTimestamps, + col: AddrTimestamps, + comb_ops: DensePolynomial, + comb_mem: DensePolynomial, } #[derive(Debug, Serialize, Deserialize, Clone)] -pub struct SparseMatPolyCommitment { +pub struct SparseMatPolyCommitment { batch_size: usize, num_ops: usize, num_mem_cells: usize, - comm_comb_ops: PolyCommitment, - comm_comb_mem: PolyCommitment, + _phantom: S, } -impl AppendToTranscript for SparseMatPolyCommitment { +impl AppendToTranscript for SparseMatPolyCommitment { fn append_to_transcript(&self, _label: &'static [u8], transcript: &mut Transcript) { transcript.append_u64(b"batch_size", self.batch_size as u64); transcript.append_u64(b"num_ops", self.num_ops as u64); transcript.append_u64(b"num_mem_cells", self.num_mem_cells as u64); - self - .comm_comb_ops - .append_to_transcript(b"comm_comb_ops", transcript); - self - .comm_comb_mem - .append_to_transcript(b"comm_comb_mem", transcript); } } -impl SparseMatPolynomial { - pub fn new(num_vars_x: usize, num_vars_y: usize, M: Vec) -> Self { +impl SparseMatPolynomial { + pub fn new(num_vars_x: usize, num_vars_y: usize, M: Vec>) -> Self { SparseMatPolynomial { num_vars_x, num_vars_y, @@ -355,11 +284,11 @@ impl SparseMatPolynomial { self.M.len().next_power_of_two() } - fn sparse_to_dense_vecs(&self, N: usize) -> (Vec, Vec, Vec) { + fn sparse_to_dense_vecs(&self, N: usize) -> (Vec, Vec, Vec) { assert!(N >= self.get_num_nz_entries()); let mut ops_row: Vec = vec![0; N]; let mut ops_col: Vec = vec![0; N]; - let mut val: Vec = vec![Scalar::zero(); N]; + let mut val: Vec = vec![S::field_zero(); N]; for i in 0..self.M.len() { ops_row[i] = self.M[i].row; @@ -370,8 +299,8 @@ impl SparseMatPolynomial { } fn multi_sparse_to_dense_rep( - sparse_polys: &[&SparseMatPolynomial], - ) -> MultiSparseMatPolynomialAsDense { + sparse_polys: &[&SparseMatPolynomial], + ) -> MultiSparseMatPolynomialAsDense { assert!(!sparse_polys.is_empty()); for i in 1..sparse_polys.len() { assert_eq!(sparse_polys[i].num_vars_x, sparse_polys[0].num_vars_x); @@ -385,7 +314,7 @@ impl SparseMatPolynomial { let mut ops_row_vec: Vec> = Vec::new(); let mut ops_col_vec: Vec> = Vec::new(); - let mut val_vec: Vec = Vec::new(); + let mut val_vec: Vec> = Vec::new(); for poly in sparse_polys { let (ops_row, ops_col, val) = poly.sparse_to_dense_vecs(N); ops_row_vec.push(ops_row); @@ -404,30 +333,34 @@ impl SparseMatPolynomial { let row = AddrTimestamps::new(num_mem_cells, N, ops_row_vec); let col = AddrTimestamps::new(num_mem_cells, N, ops_col_vec); + let ret_row = row.clone(); + let ret_col = col.clone(); + let ret_val_vec = val_vec.clone(); + // combine polynomials into a single polynomial for commitment purposes let comb_ops = DensePolynomial::merge( row .ops_addr - .iter() - .chain(row.read_ts.iter()) - .chain(col.ops_addr.iter()) - .chain(col.read_ts.iter()) - .chain(val_vec.iter()), + .into_iter() + .chain(row.read_ts.into_iter()) + .chain(col.ops_addr.into_iter()) + .chain(col.read_ts.into_iter()) + .chain(val_vec.into_iter()), ); let mut comb_mem = row.audit_ts.clone(); comb_mem.extend(&col.audit_ts); MultiSparseMatPolynomialAsDense { batch_size: sparse_polys.len(), - row, - col, - val: val_vec, + row: ret_row, + col: ret_col, + val: ret_val_vec, comb_ops, comb_mem, } } - fn evaluate_with_tables(&self, eval_table_rx: &[Scalar], eval_table_ry: &[Scalar]) -> Scalar { + fn evaluate_with_tables(&self, eval_table_rx: &[S], eval_table_ry: &[S]) -> S { assert_eq!(self.num_vars_x.pow2(), eval_table_rx.len()); assert_eq!(self.num_vars_y.pow2(), eval_table_ry.len()); @@ -436,25 +369,21 @@ impl SparseMatPolynomial { let row = self.M[i].row; let col = self.M[i].col; let val = &self.M[i].val; - eval_table_rx[row] * eval_table_ry[col] * val + eval_table_rx[row] * eval_table_ry[col] * *val }) .sum() } - pub fn multi_evaluate( - polys: &[&SparseMatPolynomial], - rx: &[Scalar], - ry: &[Scalar], - ) -> Vec { + pub fn multi_evaluate(polys: &[&SparseMatPolynomial], rx: &[S], ry: &[S]) -> Vec { let eval_table_rx = EqPolynomial::new(rx.to_vec()).evals(); let eval_table_ry = EqPolynomial::new(ry.to_vec()).evals(); (0..polys.len()) .map(|i| polys[i].evaluate_with_tables(&eval_table_rx, &eval_table_ry)) - .collect::>() + .collect::>() } - pub fn multiply_vec(&self, num_rows: usize, num_cols: usize, z: &[Scalar]) -> Vec { + pub fn _multiply_vec(&self, num_rows: usize, num_cols: usize, z: &[S]) -> Vec { assert_eq!(z.len(), num_cols); (0..self.M.len()) @@ -463,10 +392,10 @@ impl SparseMatPolynomial { let col = self.M[i].col; let val = &self.M[i].val; assert!(col < num_cols); - (row, val * z[col]) + (row, *val * z[col]) }) - .fold(vec![Scalar::zero(); num_rows], |mut Mz, (r, v)| { - Mz[r] += v; + .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { + Mz[r] = Mz[r] + v; Mz }) } @@ -478,34 +407,29 @@ impl SparseMatPolynomial { num_rows: usize, max_num_cols: usize, _num_cols: usize, - z: &Vec>, - ) -> Vec { + z: &Vec>, + ) -> Vec { (0..self.M.len()) .map(|i| { let row = self.M[i].row; let col = self.M[i].col; let val = &self.M[i].val; - (row, val * z[col / max_num_cols][col % max_num_cols]) + (row, *val * z[col / max_num_cols][col % max_num_cols]) }) - .fold(vec![Scalar::zero(); num_rows], |mut Mz, (r, v)| { - Mz[r] += v; + .fold(vec![S::field_zero(); num_rows], |mut Mz, (r, v)| { + Mz[r] = Mz[r] + v; Mz }) } - pub fn compute_eval_table_sparse( - &self, - rx: &[Scalar], - num_rows: usize, - num_cols: usize, - ) -> Vec { + pub fn compute_eval_table_sparse(&self, rx: &[S], num_rows: usize, num_cols: usize) -> Vec { assert_eq!(rx.len(), num_rows); - let mut M_evals: Vec = vec![Scalar::zero(); num_cols]; + let mut M_evals: Vec = vec![S::field_zero(); num_cols]; for i in 0..self.M.len() { let entry = &self.M[i]; - M_evals[entry.col] += rx[entry.row] * entry.val; + M_evals[entry.col] = M_evals[entry.col] + rx[entry.row] * entry.val; } M_evals } @@ -514,48 +438,47 @@ impl SparseMatPolynomial { // output[i] stores entry i * max_num_cols ~ i * max_num_cols + num_cols of the original vector pub fn compute_eval_table_sparse_disjoint_rounds( &self, - rx: &[Scalar], + rx: &[S], num_rows: usize, num_segs: usize, max_num_cols: usize, num_cols: usize, - ) -> Vec> { + ) -> Vec> { assert!(rx.len() >= num_rows); - let mut M_evals: Vec> = vec![vec![Scalar::zero(); num_cols]; num_segs]; + let mut M_evals: Vec> = vec![vec![S::field_zero(); num_cols]; num_segs]; for i in 0..self.M.len() { let entry = &self.M[i]; - M_evals[entry.col / max_num_cols][entry.col % max_num_cols] += rx[entry.row] * entry.val; + M_evals[entry.col / max_num_cols][entry.col % max_num_cols] = + M_evals[entry.col / max_num_cols][entry.col % max_num_cols] + rx[entry.row] * entry.val; } M_evals } pub fn multi_commit( - sparse_polys: &[&SparseMatPolynomial], - gens: &SparseMatPolyCommitmentGens, - ) -> (SparseMatPolyCommitment, MultiSparseMatPolynomialAsDense) { + sparse_polys: &[&SparseMatPolynomial], + ) -> ( + SparseMatPolyCommitment, + MultiSparseMatPolynomialAsDense, + ) { let batch_size = sparse_polys.len(); let dense = SparseMatPolynomial::multi_sparse_to_dense_rep(sparse_polys); - let (comm_comb_ops, _blinds_comb_ops) = dense.comb_ops.commit(&gens.gens_ops, None); - let (comm_comb_mem, _blinds_comb_mem) = dense.comb_mem.commit(&gens.gens_mem, None); - ( SparseMatPolyCommitment { batch_size, num_mem_cells: dense.row.audit_ts.len(), num_ops: dense.row.read_ts[0].len(), - comm_comb_ops, - comm_comb_mem, + _phantom: S::field_zero(), }, dense, ) } } -impl MultiSparseMatPolynomialAsDense { - pub fn deref(&self, row_mem_val: &[Scalar], col_mem_val: &[Scalar]) -> Derefs { +impl MultiSparseMatPolynomialAsDense { + pub fn deref(&self, row_mem_val: &[S], col_mem_val: &[S]) -> Derefs { let row_ops_val = self.row.deref(row_mem_val); let col_ops_val = self.col.deref(col_mem_val); @@ -564,39 +487,37 @@ impl MultiSparseMatPolynomialAsDense { } #[derive(Debug)] -struct ProductLayer { - init: ProductCircuit, - read_vec: Vec, - write_vec: Vec, - audit: ProductCircuit, +struct ProductLayer { + init: ProductCircuit, + read_vec: Vec>, + write_vec: Vec>, + audit: ProductCircuit, } #[derive(Debug)] -struct Layers { - prod_layer: ProductLayer, +struct Layers { + prod_layer: ProductLayer, } -impl Layers { +impl Layers { fn build_hash_layer( - eval_table: &[Scalar], - addrs_vec: &[DensePolynomial], - derefs_vec: &[DensePolynomial], - read_ts_vec: &[DensePolynomial], - audit_ts: &DensePolynomial, - r_mem_check: &(Scalar, Scalar), + eval_table: &[S], + addrs_vec: &[DensePolynomial], + derefs_vec: &[DensePolynomial], + read_ts_vec: &[DensePolynomial], + audit_ts: &DensePolynomial, + r_mem_check: &(S, S), ) -> ( - DensePolynomial, - Vec, - Vec, - DensePolynomial, + DensePolynomial, + Vec>, + Vec>, + DensePolynomial, ) { let (r_hash, r_multiset_check) = r_mem_check; //hash(addr, val, ts) = ts * r_hash_sqr + val * r_hash + addr - let r_hash_sqr = r_hash * r_hash; - let hash_func = |addr: &Scalar, val: &Scalar, ts: &Scalar| -> Scalar { - ts * r_hash_sqr + val * r_hash + addr - }; + let r_hash_sqr = *r_hash * *r_hash; + let hash_func = |addr: &S, val: &S, ts: &S| -> S { *ts * r_hash_sqr + *val * *r_hash + *addr }; // hash init and audit that does not depend on #instances let num_mem_cells = eval_table.len(); @@ -604,22 +525,22 @@ impl Layers { (0..num_mem_cells) .map(|i| { // at init time, addr is given by i, init value is given by eval_table, and ts = 0 - hash_func(&Scalar::from(i as u64), &eval_table[i], &Scalar::zero()) - r_multiset_check + hash_func(&S::from(i as u64), &eval_table[i], &S::field_zero()) - *r_multiset_check }) - .collect::>(), + .collect::>(), ); let poly_audit_hashed = DensePolynomial::new( (0..num_mem_cells) .map(|i| { // at audit time, addr is given by i, value is given by eval_table, and ts is given by audit_ts - hash_func(&Scalar::from(i as u64), &eval_table[i], &audit_ts[i]) - r_multiset_check + hash_func(&S::from(i as u64), &eval_table[i], &audit_ts[i]) - *r_multiset_check }) - .collect::>(), + .collect::>(), ); // hash read and write that depends on #instances - let mut poly_read_hashed_vec: Vec = Vec::new(); - let mut poly_write_hashed_vec: Vec = Vec::new(); + let mut poly_read_hashed_vec: Vec> = Vec::new(); + let mut poly_write_hashed_vec: Vec> = Vec::new(); for i in 0..addrs_vec.len() { let (addrs, derefs, read_ts) = (&addrs_vec[i], &derefs_vec[i], &read_ts_vec[i]); assert_eq!(addrs.len(), derefs.len()); @@ -629,9 +550,9 @@ impl Layers { (0..num_ops) .map(|i| { // at read time, addr is given by addrs, value is given by derefs, and ts is given by read_ts - hash_func(&addrs[i], &derefs[i], &read_ts[i]) - r_multiset_check + hash_func(&addrs[i], &derefs[i], &read_ts[i]) - *r_multiset_check }) - .collect::>(), + .collect::>(), ); poly_read_hashed_vec.push(poly_read_hashed); @@ -639,9 +560,9 @@ impl Layers { (0..num_ops) .map(|i| { // at write time, addr is given by addrs, value is given by derefs, and ts is given by write_ts = read_ts + 1 - hash_func(&addrs[i], &derefs[i], &(read_ts[i] + Scalar::one())) - r_multiset_check + hash_func(&addrs[i], &derefs[i], &(read_ts[i] + S::field_one())) - *r_multiset_check }) - .collect::>(), + .collect::>(), ); poly_write_hashed_vec.push(poly_write_hashed); } @@ -655,10 +576,10 @@ impl Layers { } pub fn new( - eval_table: &[Scalar], - addr_timestamps: &AddrTimestamps, - poly_ops_val: &[DensePolynomial], - r_mem_check: &(Scalar, Scalar), + eval_table: &[S], + addr_timestamps: &AddrTimestamps, + poly_ops_val: &[DensePolynomial], + r_mem_check: &(S, S), ) -> Self { let (poly_init_hashed, poly_read_hashed_vec, poly_write_hashed_vec, poly_audit_hashed) = Layers::build_hash_layer( @@ -673,22 +594,22 @@ impl Layers { let prod_init = ProductCircuit::new(&poly_init_hashed); let prod_read_vec = (0..poly_read_hashed_vec.len()) .map(|i| ProductCircuit::new(&poly_read_hashed_vec[i])) - .collect::>(); + .collect::>>(); let prod_write_vec = (0..poly_write_hashed_vec.len()) .map(|i| ProductCircuit::new(&poly_write_hashed_vec[i])) - .collect::>(); + .collect::>>(); let prod_audit = ProductCircuit::new(&poly_audit_hashed); // subset audit check - let hashed_writes: Scalar = (0..prod_write_vec.len()) + let hashed_writes: S = (0..prod_write_vec.len()) .map(|i| prod_write_vec[i].evaluate()) .product(); - let hashed_write_set: Scalar = prod_init.evaluate() * hashed_writes; + let hashed_write_set: S = prod_init.evaluate() * hashed_writes; - let hashed_reads: Scalar = (0..prod_read_vec.len()) + let hashed_reads: S = (0..prod_read_vec.len()) .map(|i| prod_read_vec[i].evaluate()) .product(); - let hashed_read_set: Scalar = hashed_reads * prod_audit.evaluate(); + let hashed_read_set: S = hashed_reads * prod_audit.evaluate(); //assert_eq!(hashed_read_set, hashed_write_set); debug_assert_eq!(hashed_read_set, hashed_write_set); @@ -705,18 +626,18 @@ impl Layers { } #[derive(Debug)] -struct PolyEvalNetwork { - row_layers: Layers, - col_layers: Layers, +struct PolyEvalNetwork { + row_layers: Layers, + col_layers: Layers, } -impl PolyEvalNetwork { +impl PolyEvalNetwork { pub fn new( - dense: &MultiSparseMatPolynomialAsDense, - derefs: &Derefs, - mem_rx: &[Scalar], - mem_ry: &[Scalar], - r_mem_check: &(Scalar, Scalar), + dense: &MultiSparseMatPolynomialAsDense, + derefs: &Derefs, + mem_rx: &[S], + mem_ry: &[S], + r_mem_check: &(S, S), ) -> Self { let row_layers = Layers::new(mem_rx, &dense.row, &derefs.row_ops_val, r_mem_check); let col_layers = Layers::new(mem_ry, &dense.col, &derefs.col_ops_val, r_mem_check); @@ -729,36 +650,36 @@ impl PolyEvalNetwork { } #[derive(Debug, Serialize, Deserialize)] -struct HashLayerProof { - eval_row: (Vec, Vec, Scalar), - eval_col: (Vec, Vec, Scalar), - eval_val: Vec, - eval_derefs: (Vec, Vec), - proof_ops: PolyEvalProof, - proof_mem: PolyEvalProof, - proof_derefs: DerefsEvalProof, +struct HashLayerProof { + eval_row: (Vec, Vec, S), + eval_col: (Vec, Vec, S), + eval_val: Vec, + eval_derefs: (Vec, Vec), + proof_ops: PolyEvalProof, + proof_mem: PolyEvalProof, + proof_derefs: DerefsEvalProof, } -impl HashLayerProof { +impl HashLayerProof { fn protocol_name() -> &'static [u8] { b"Sparse polynomial hash layer proof" } fn prove_helper( - rand: (&Vec, &Vec), - addr_timestamps: &AddrTimestamps, - ) -> (Vec, Vec, Scalar) { + rand: (&Vec, &Vec), + addr_timestamps: &AddrTimestamps, + ) -> (Vec, Vec, S) { let (rand_mem, rand_ops) = rand; // decommit ops-addr at rand_ops - let mut eval_ops_addr_vec: Vec = Vec::new(); + let mut eval_ops_addr_vec: Vec = Vec::new(); for i in 0..addr_timestamps.ops_addr.len() { let eval_ops_addr = addr_timestamps.ops_addr[i].evaluate(rand_ops); eval_ops_addr_vec.push(eval_ops_addr); } // decommit read_ts at rand_ops - let mut eval_read_ts_vec: Vec = Vec::new(); + let mut eval_read_ts_vec: Vec = Vec::new(); for i in 0..addr_timestamps.read_ts.len() { let eval_read_ts = addr_timestamps.read_ts[i].evaluate(rand_ops); eval_read_ts_vec.push(eval_read_ts); @@ -771,30 +692,31 @@ impl HashLayerProof { } fn prove( - rand: (&Vec, &Vec), - dense: &MultiSparseMatPolynomialAsDense, - derefs: &Derefs, - gens: &SparseMatPolyCommitmentGens, + rand: (&Vec, &Vec), + dense: &MultiSparseMatPolynomialAsDense, + derefs: &Derefs, transcript: &mut Transcript, - random_tape: &mut RandomTape, + random_tape: &mut RandomTape, ) -> Self { - transcript.append_protocol_name(HashLayerProof::protocol_name()); + >::append_protocol_name( + transcript, + HashLayerProof::::protocol_name(), + ); let (rand_mem, rand_ops) = rand; // decommit derefs at rand_ops let eval_row_ops_val = (0..derefs.row_ops_val.len()) .map(|i| derefs.row_ops_val[i].evaluate(rand_ops)) - .collect::>(); + .collect::>(); let eval_col_ops_val = (0..derefs.col_ops_val.len()) .map(|i| derefs.col_ops_val[i].evaluate(rand_ops)) - .collect::>(); + .collect::>(); let proof_derefs = DerefsEvalProof::prove( derefs, &eval_row_ops_val, &eval_col_ops_val, rand_ops, - &gens.gens_derefs, transcript, random_tape, ); @@ -808,17 +730,17 @@ impl HashLayerProof { HashLayerProof::prove_helper((rand_mem, rand_ops), &dense.col); let eval_val_vec = (0..dense.val.len()) .map(|i| dense.val[i].evaluate(rand_ops)) - .collect::>(); + .collect::>(); // form a single decommitment using comm_comb_ops - let mut evals_ops: Vec = Vec::new(); + let mut evals_ops: Vec = Vec::new(); evals_ops.extend(&eval_row_addr_vec); evals_ops.extend(&eval_row_read_ts_vec); evals_ops.extend(&eval_col_addr_vec); evals_ops.extend(&eval_col_read_ts_vec); evals_ops.extend(&eval_val_vec); - evals_ops.resize(evals_ops.len().next_power_of_two(), Scalar::zero()); - evals_ops.append_to_transcript(b"claim_evals_ops", transcript); + evals_ops.resize(evals_ops.len().next_power_of_two(), S::field_zero()); + S::append_field_vector_to_transcript(b"claim_evals_ops", transcript, &evals_ops); let challenges_ops = transcript.challenge_vector(b"challenge_combine_n_to_one", evals_ops.len().log_2()); @@ -831,21 +753,19 @@ impl HashLayerProof { let mut r_joint_ops = challenges_ops; r_joint_ops.extend(rand_ops); debug_assert_eq!(dense.comb_ops.evaluate(&r_joint_ops), joint_claim_eval_ops); - joint_claim_eval_ops.append_to_transcript(b"joint_claim_eval_ops", transcript); - let (proof_ops, _comm_ops_eval) = PolyEvalProof::prove( + S::append_field_to_transcript(b"joint_claim_eval_ops", transcript, joint_claim_eval_ops); + + let proof_ops = PolyEvalProof::prove( &dense.comb_ops, - None, &r_joint_ops, &joint_claim_eval_ops, - None, - &gens.gens_ops, transcript, random_tape, ); // form a single decommitment using comb_comb_mem at rand_mem - let evals_mem: Vec = vec![eval_row_audit_ts, eval_col_audit_ts]; - evals_mem.append_to_transcript(b"claim_evals_mem", transcript); + let evals_mem: Vec = vec![eval_row_audit_ts, eval_col_audit_ts]; + S::append_field_vector_to_transcript(b"claim_evals_mem", transcript, &evals_mem); let challenges_mem = transcript.challenge_vector(b"challenge_combine_two_to_one", evals_mem.len().log_2()); @@ -858,14 +778,12 @@ impl HashLayerProof { let mut r_joint_mem = challenges_mem; r_joint_mem.extend(rand_mem); debug_assert_eq!(dense.comb_mem.evaluate(&r_joint_mem), joint_claim_eval_mem); - joint_claim_eval_mem.append_to_transcript(b"joint_claim_eval_mem", transcript); - let (proof_mem, _comm_mem_eval) = PolyEvalProof::prove( + S::append_field_to_transcript(b"joint_claim_eval_mem", transcript, joint_claim_eval_mem); + + let proof_mem = PolyEvalProof::prove( &dense.comb_mem, - None, &r_joint_mem, &joint_claim_eval_mem, - None, - &gens.gens_mem, transcript, random_tape, ); @@ -882,20 +800,18 @@ impl HashLayerProof { } fn verify_helper( - rand: &(&Vec, &Vec), - claims: &(Scalar, Vec, Vec, Scalar), - eval_ops_val: &[Scalar], - eval_ops_addr: &[Scalar], - eval_read_ts: &[Scalar], - eval_audit_ts: &Scalar, - r: &[Scalar], - r_hash: &Scalar, - r_multiset_check: &Scalar, + rand: &(&Vec, &Vec), + claims: &(S, Vec, Vec, S), + eval_ops_val: &[S], + eval_ops_addr: &[S], + eval_read_ts: &[S], + eval_audit_ts: &S, + r: &[S], + r_hash: &S, + r_multiset_check: &S, ) -> Result<(), ProofVerifyError> { - let r_hash_sqr = r_hash * r_hash; - let hash_func = |addr: &Scalar, val: &Scalar, ts: &Scalar| -> Scalar { - ts * r_hash_sqr + val * r_hash + addr - }; + let r_hash_sqr = *r_hash * *r_hash; + let hash_func = |addr: &S, val: &S, ts: &S| -> S { *ts * r_hash_sqr + *val * *r_hash + *addr }; let (rand_mem, _rand_ops) = rand; let (claim_init, claim_read, claim_write, claim_audit) = claims; @@ -904,21 +820,25 @@ impl HashLayerProof { let eval_init_addr = IdentityPolynomial::new(rand_mem.len()).evaluate(rand_mem); let eval_init_val = EqPolynomial::new(r.to_vec()).evaluate(rand_mem); let hash_init_at_rand_mem = - hash_func(&eval_init_addr, &eval_init_val, &Scalar::zero()) - r_multiset_check; // verify the claim_last of init chunk + hash_func(&eval_init_addr, &eval_init_val, &S::field_zero()) - *r_multiset_check; + + // verify the claim_last of init chunk assert_eq!(&hash_init_at_rand_mem, claim_init); // read for i in 0..eval_ops_addr.len() { let hash_read_at_rand_ops = - hash_func(&eval_ops_addr[i], &eval_ops_val[i], &eval_read_ts[i]) - r_multiset_check; // verify the claim_last of init chunk + hash_func(&eval_ops_addr[i], &eval_ops_val[i], &eval_read_ts[i]) - *r_multiset_check; + // verify the claim_last of init chunk assert_eq!(&hash_read_at_rand_ops, &claim_read[i]); } // write: shares addr, val component; only decommit write_ts for i in 0..eval_ops_addr.len() { - let eval_write_ts = eval_read_ts[i] + Scalar::one(); + let eval_write_ts = eval_read_ts[i] + S::field_one(); let hash_write_at_rand_ops = - hash_func(&eval_ops_addr[i], &eval_ops_val[i], &eval_write_ts) - r_multiset_check; // verify the claim_last of init chunk + hash_func(&eval_ops_addr[i], &eval_ops_val[i], &eval_write_ts) - *r_multiset_check; + // verify the claim_last of init chunk assert_eq!(&hash_write_at_rand_ops, &claim_write[i]); } @@ -926,7 +846,7 @@ impl HashLayerProof { let eval_audit_addr = eval_init_addr; let eval_audit_val = eval_init_val; let hash_audit_at_rand_mem = - hash_func(&eval_audit_addr, &eval_audit_val, eval_audit_ts) - r_multiset_check; + hash_func(&eval_audit_addr, &eval_audit_val, eval_audit_ts) - *r_multiset_check; assert_eq!(&hash_audit_at_rand_mem, claim_audit); // verify the last step of the sum-check for audit Ok(()) @@ -934,35 +854,31 @@ impl HashLayerProof { fn verify( &self, - rand: (&Vec, &Vec), - claims_row: &(Scalar, Vec, Vec, Scalar), - claims_col: &(Scalar, Vec, Vec, Scalar), - claims_dotp: &[Scalar], - comm: &SparseMatPolyCommitment, - gens: &SparseMatPolyCommitmentGens, - comm_derefs: &DerefsCommitment, - rx: &[Scalar], - ry: &[Scalar], - r_hash: &Scalar, - r_multiset_check: &Scalar, + rand: (&Vec, &Vec), + claims_row: &(S, Vec, Vec, S), + claims_col: &(S, Vec, Vec, S), + claims_dotp: &[S], + _comm: &SparseMatPolyCommitment, + rx: &[S], + ry: &[S], + r_hash: &S, + r_multiset_check: &S, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { let timer = Timer::new("verify_hash_proof"); - transcript.append_protocol_name(HashLayerProof::protocol_name()); + >::append_protocol_name( + transcript, + HashLayerProof::::protocol_name(), + ); let (rand_mem, rand_ops) = rand; // verify derefs at rand_ops let (eval_row_ops_val, eval_col_ops_val) = &self.eval_derefs; assert_eq!(eval_row_ops_val.len(), eval_col_ops_val.len()); - self.proof_derefs.verify( - rand_ops, - eval_row_ops_val, - eval_col_ops_val, - &gens.gens_derefs, - comm_derefs, - transcript, - )?; + self + .proof_derefs + .verify(rand_ops, eval_row_ops_val, eval_col_ops_val, transcript)?; // verify the decommitments used in evaluation sum-check let eval_val_vec = &self.eval_val; @@ -981,14 +897,14 @@ impl HashLayerProof { let (eval_row_addr_vec, eval_row_read_ts_vec, eval_row_audit_ts) = &self.eval_row; let (eval_col_addr_vec, eval_col_read_ts_vec, eval_col_audit_ts) = &self.eval_col; - let mut evals_ops: Vec = Vec::new(); + let mut evals_ops: Vec = Vec::new(); evals_ops.extend(eval_row_addr_vec); evals_ops.extend(eval_row_read_ts_vec); evals_ops.extend(eval_col_addr_vec); evals_ops.extend(eval_col_read_ts_vec); evals_ops.extend(eval_val_vec); - evals_ops.resize(evals_ops.len().next_power_of_two(), Scalar::zero()); - evals_ops.append_to_transcript(b"claim_evals_ops", transcript); + evals_ops.resize(evals_ops.len().next_power_of_two(), S::field_zero()); + S::append_field_vector_to_transcript(b"claim_evals_ops", transcript, &evals_ops); let challenges_ops = transcript.challenge_vector(b"challenge_combine_n_to_one", evals_ops.len().log_2()); @@ -1000,19 +916,15 @@ impl HashLayerProof { let joint_claim_eval_ops = poly_evals_ops[0]; let mut r_joint_ops = challenges_ops; r_joint_ops.extend(rand_ops); - joint_claim_eval_ops.append_to_transcript(b"joint_claim_eval_ops", transcript); - self.proof_ops.verify_plain( - &gens.gens_ops, - transcript, - &r_joint_ops, - &joint_claim_eval_ops, - &comm.comm_comb_ops, - )?; + S::append_field_to_transcript(b"joint_claim_eval_ops", transcript, joint_claim_eval_ops); + self + .proof_ops + .verify_plain(transcript, &r_joint_ops, &joint_claim_eval_ops)?; // verify proof-mem using comm_comb_mem at rand_mem // form a single decommitment using comb_comb_mem at rand_mem - let evals_mem: Vec = vec![*eval_row_audit_ts, *eval_col_audit_ts]; - evals_mem.append_to_transcript(b"claim_evals_mem", transcript); + let evals_mem: Vec = vec![*eval_row_audit_ts, *eval_col_audit_ts]; + S::append_field_vector_to_transcript(b"claim_evals_mem", transcript, &evals_mem); let challenges_mem = transcript.challenge_vector(b"challenge_combine_two_to_one", evals_mem.len().log_2()); @@ -1024,14 +936,11 @@ impl HashLayerProof { let joint_claim_eval_mem = poly_evals_mem[0]; let mut r_joint_mem = challenges_mem; r_joint_mem.extend(rand_mem); - joint_claim_eval_mem.append_to_transcript(b"joint_claim_eval_mem", transcript); - self.proof_mem.verify_plain( - &gens.gens_mem, - transcript, - &r_joint_mem, - &joint_claim_eval_mem, - &comm.comm_comb_mem, - )?; + S::append_field_to_transcript(b"joint_claim_eval_mem", transcript, joint_claim_eval_mem); + + self + .proof_mem + .verify_plain(transcript, &r_joint_mem, &joint_claim_eval_mem)?; // verify the claims from the product layer let (eval_ops_addr, eval_read_ts, eval_audit_ts) = &self.eval_row; @@ -1066,79 +975,82 @@ impl HashLayerProof { } #[derive(Debug, Serialize, Deserialize)] -struct ProductLayerProof { - eval_row: (Scalar, Vec, Vec, Scalar), - eval_col: (Scalar, Vec, Vec, Scalar), - eval_val: (Vec, Vec), - proof_mem: ProductCircuitEvalProofBatched, - proof_ops: ProductCircuitEvalProofBatched, +struct ProductLayerProof { + eval_row: (S, Vec, Vec, S), + eval_col: (S, Vec, Vec, S), + eval_val: (Vec, Vec), + proof_mem: ProductCircuitEvalProofBatched, + proof_ops: ProductCircuitEvalProofBatched, } -impl ProductLayerProof { +impl ProductLayerProof { fn protocol_name() -> &'static [u8] { b"Sparse polynomial product layer proof" } pub fn prove( - row_prod_layer: &mut ProductLayer, - col_prod_layer: &mut ProductLayer, - dense: &MultiSparseMatPolynomialAsDense, - derefs: &Derefs, - eval: &[Scalar], + row_prod_layer: &mut ProductLayer, + col_prod_layer: &mut ProductLayer, + dense: &MultiSparseMatPolynomialAsDense, + derefs: &Derefs, + eval: &[S], transcript: &mut Transcript, - ) -> (Self, Vec, Vec) { - transcript.append_protocol_name(ProductLayerProof::protocol_name()); + ) -> (Self, Vec, Vec) { + >::append_protocol_name( + transcript, + ProductLayerProof::::protocol_name(), + ); let row_eval_init = row_prod_layer.init.evaluate(); let row_eval_audit = row_prod_layer.audit.evaluate(); let row_eval_read = (0..row_prod_layer.read_vec.len()) .map(|i| row_prod_layer.read_vec[i].evaluate()) - .collect::>(); + .collect::>(); let row_eval_write = (0..row_prod_layer.write_vec.len()) .map(|i| row_prod_layer.write_vec[i].evaluate()) - .collect::>(); + .collect::>(); // subset check - let ws: Scalar = (0..row_eval_write.len()) + let ws: S = (0..row_eval_write.len()) .map(|i| row_eval_write[i]) .product(); - let rs: Scalar = (0..row_eval_read.len()).map(|i| row_eval_read[i]).product(); + let rs: S = (0..row_eval_read.len()).map(|i| row_eval_read[i]).product(); assert_eq!(row_eval_init * ws, rs * row_eval_audit); - row_eval_init.append_to_transcript(b"claim_row_eval_init", transcript); - row_eval_read.append_to_transcript(b"claim_row_eval_read", transcript); - row_eval_write.append_to_transcript(b"claim_row_eval_write", transcript); - row_eval_audit.append_to_transcript(b"claim_row_eval_audit", transcript); + S::append_field_to_transcript(b"claim_row_eval_init", transcript, row_eval_init); + S::append_field_vector_to_transcript(b"claim_row_eval_read", transcript, &row_eval_read); + S::append_field_vector_to_transcript(b"claim_row_eval_write", transcript, &row_eval_write); + S::append_field_to_transcript(b"claim_row_eval_audit", transcript, row_eval_audit); let col_eval_init = col_prod_layer.init.evaluate(); let col_eval_audit = col_prod_layer.audit.evaluate(); - let col_eval_read: Vec = (0..col_prod_layer.read_vec.len()) + let col_eval_read: Vec = (0..col_prod_layer.read_vec.len()) .map(|i| col_prod_layer.read_vec[i].evaluate()) .collect(); - let col_eval_write: Vec = (0..col_prod_layer.write_vec.len()) + let col_eval_write: Vec = (0..col_prod_layer.write_vec.len()) .map(|i| col_prod_layer.write_vec[i].evaluate()) .collect(); // subset check - let ws: Scalar = (0..col_eval_write.len()) + let ws: S = (0..col_eval_write.len()) .map(|i| col_eval_write[i]) .product(); - let rs: Scalar = (0..col_eval_read.len()).map(|i| col_eval_read[i]).product(); + let rs: S = (0..col_eval_read.len()).map(|i| col_eval_read[i]).product(); assert_eq!(col_eval_init * ws, rs * col_eval_audit); - col_eval_init.append_to_transcript(b"claim_col_eval_init", transcript); - col_eval_read.append_to_transcript(b"claim_col_eval_read", transcript); - col_eval_write.append_to_transcript(b"claim_col_eval_write", transcript); - col_eval_audit.append_to_transcript(b"claim_col_eval_audit", transcript); + S::append_field_to_transcript(b"claim_col_eval_init", transcript, col_eval_init); + S::append_field_vector_to_transcript(b"claim_col_eval_read", transcript, &col_eval_read); + S::append_field_vector_to_transcript(b"claim_col_eval_write", transcript, &col_eval_write); + S::append_field_to_transcript(b"claim_col_eval_audit", transcript, col_eval_audit); // prepare dotproduct circuit for batching then with ops-related product circuits assert_eq!(eval.len(), derefs.row_ops_val.len()); assert_eq!(eval.len(), derefs.col_ops_val.len()); assert_eq!(eval.len(), dense.val.len()); - let mut dotp_circuit_left_vec: Vec = Vec::new(); - let mut dotp_circuit_right_vec: Vec = Vec::new(); - let mut eval_dotp_left_vec: Vec = Vec::new(); - let mut eval_dotp_right_vec: Vec = Vec::new(); + let mut dotp_circuit_left_vec: Vec> = Vec::new(); + let mut dotp_circuit_right_vec: Vec> = Vec::new(); + let mut eval_dotp_left_vec: Vec = Vec::new(); + let mut eval_dotp_right_vec: Vec = Vec::new(); for i in 0..derefs.row_ops_val.len() { // evaluate sparse polynomial evaluation using two dotp checks let left = derefs.row_ops_val[i].clone(); @@ -1152,9 +1064,11 @@ impl ProductLayerProof { let (eval_dotp_left, eval_dotp_right) = (dotp_circuit_left.evaluate(), dotp_circuit_right.evaluate()); - eval_dotp_left.append_to_transcript(b"claim_eval_dotp_left", transcript); - eval_dotp_right.append_to_transcript(b"claim_eval_dotp_right", transcript); + S::append_field_to_transcript(b"claim_eval_dotp_left", transcript, eval_dotp_left); + S::append_field_to_transcript(b"claim_eval_dotp_right", transcript, eval_dotp_right); + assert_eq!(eval_dotp_left + eval_dotp_right, eval[i]); + eval_dotp_left_vec.push(eval_dotp_left); eval_dotp_right_vec.push(eval_dotp_right); @@ -1230,20 +1144,13 @@ impl ProductLayerProof { &self, num_ops: usize, num_cells: usize, - eval: &[Scalar], + eval: &[S], transcript: &mut Transcript, - ) -> Result< - ( - Vec, - Vec, - Vec, - Vec, - Vec, - ), - ProofVerifyError, - > { - transcript.append_protocol_name(ProductLayerProof::protocol_name()); - + ) -> Result<(Vec, Vec, Vec, Vec, Vec), ProofVerifyError> { + >::append_protocol_name( + transcript, + ProductLayerProof::::protocol_name(), + ); let timer = Timer::new("verify_prod_proof"); let num_instances = eval.len(); @@ -1251,48 +1158,48 @@ impl ProductLayerProof { let (row_eval_init, row_eval_read, row_eval_write, row_eval_audit) = &self.eval_row; assert_eq!(row_eval_write.len(), num_instances); assert_eq!(row_eval_read.len(), num_instances); - let ws: Scalar = (0..row_eval_write.len()) + let ws: S = (0..row_eval_write.len()) .map(|i| row_eval_write[i]) .product(); - let rs: Scalar = (0..row_eval_read.len()).map(|i| row_eval_read[i]).product(); - assert_eq!(row_eval_init * ws, rs * row_eval_audit); + let rs: S = (0..row_eval_read.len()).map(|i| row_eval_read[i]).product(); + assert_eq!(*row_eval_init * ws, rs * *row_eval_audit); - row_eval_init.append_to_transcript(b"claim_row_eval_init", transcript); - row_eval_read.append_to_transcript(b"claim_row_eval_read", transcript); - row_eval_write.append_to_transcript(b"claim_row_eval_write", transcript); - row_eval_audit.append_to_transcript(b"claim_row_eval_audit", transcript); + S::append_field_to_transcript(b"claim_row_eval_init", transcript, *row_eval_init); + S::append_field_vector_to_transcript(b"claim_row_eval_read", transcript, &row_eval_read); + S::append_field_vector_to_transcript(b"claim_row_eval_write", transcript, &row_eval_write); + S::append_field_to_transcript(b"claim_row_eval_audit", transcript, *row_eval_audit); // subset check let (col_eval_init, col_eval_read, col_eval_write, col_eval_audit) = &self.eval_col; assert_eq!(col_eval_write.len(), num_instances); assert_eq!(col_eval_read.len(), num_instances); - let ws: Scalar = (0..col_eval_write.len()) + let ws: S = (0..col_eval_write.len()) .map(|i| col_eval_write[i]) .product(); - let rs: Scalar = (0..col_eval_read.len()).map(|i| col_eval_read[i]).product(); - assert_eq!(col_eval_init * ws, rs * col_eval_audit); + let rs: S = (0..col_eval_read.len()).map(|i| col_eval_read[i]).product(); + assert_eq!(*col_eval_init * ws, rs * *col_eval_audit); - col_eval_init.append_to_transcript(b"claim_col_eval_init", transcript); - col_eval_read.append_to_transcript(b"claim_col_eval_read", transcript); - col_eval_write.append_to_transcript(b"claim_col_eval_write", transcript); - col_eval_audit.append_to_transcript(b"claim_col_eval_audit", transcript); + S::append_field_to_transcript(b"claim_col_eval_init", transcript, *col_eval_init); + S::append_field_vector_to_transcript(b"claim_col_eval_read", transcript, &col_eval_read); + S::append_field_vector_to_transcript(b"claim_col_eval_write", transcript, &col_eval_write); + S::append_field_to_transcript(b"claim_col_eval_audit", transcript, *col_eval_audit); // verify the evaluation of the sparse polynomial let (eval_dotp_left, eval_dotp_right) = &self.eval_val; assert_eq!(eval_dotp_left.len(), eval_dotp_left.len()); assert_eq!(eval_dotp_left.len(), num_instances); - let mut claims_dotp_circuit: Vec = Vec::new(); + let mut claims_dotp_circuit: Vec = Vec::new(); for i in 0..num_instances { assert_eq!(eval_dotp_left[i] + eval_dotp_right[i], eval[i]); - eval_dotp_left[i].append_to_transcript(b"claim_eval_dotp_left", transcript); - eval_dotp_right[i].append_to_transcript(b"claim_eval_dotp_right", transcript); + S::append_field_to_transcript(b"claim_eval_dotp_left", transcript, eval_dotp_left[i]); + S::append_field_to_transcript(b"claim_eval_dotp_right", transcript, eval_dotp_right[i]); claims_dotp_circuit.push(eval_dotp_left[i]); claims_dotp_circuit.push(eval_dotp_right[i]); } // verify the correctness of claim_row_eval_read, claim_row_eval_write, claim_col_eval_read, and claim_col_eval_write - let mut claims_prod_circuit: Vec = Vec::new(); + let mut claims_prod_circuit: Vec = Vec::new(); claims_prod_circuit.extend(row_eval_read); claims_prod_circuit.extend(row_eval_write); claims_prod_circuit.extend(col_eval_read); @@ -1323,26 +1230,28 @@ impl ProductLayerProof { } #[derive(Debug, Serialize, Deserialize)] -struct PolyEvalNetworkProof { - proof_prod_layer: ProductLayerProof, - proof_hash_layer: HashLayerProof, +struct PolyEvalNetworkProof { + proof_prod_layer: ProductLayerProof, + proof_hash_layer: HashLayerProof, } -impl PolyEvalNetworkProof { +impl PolyEvalNetworkProof { fn protocol_name() -> &'static [u8] { b"Sparse polynomial evaluation proof" } pub fn prove( - network: &mut PolyEvalNetwork, - dense: &MultiSparseMatPolynomialAsDense, - derefs: &Derefs, - evals: &[Scalar], - gens: &SparseMatPolyCommitmentGens, + network: &mut PolyEvalNetwork, + dense: &MultiSparseMatPolynomialAsDense, + derefs: &Derefs, + evals: &[S], transcript: &mut Transcript, - random_tape: &mut RandomTape, + random_tape: &mut RandomTape, ) -> Self { - transcript.append_protocol_name(PolyEvalNetworkProof::protocol_name()); + >::append_protocol_name( + transcript, + PolyEvalNetworkProof::::protocol_name(), + ); let (proof_prod_layer, rand_mem, rand_ops) = ProductLayerProof::prove( &mut network.row_layers.prod_layer, @@ -1358,7 +1267,6 @@ impl PolyEvalNetworkProof { (&rand_mem, &rand_ops), dense, derefs, - gens, transcript, random_tape, ); @@ -1371,18 +1279,19 @@ impl PolyEvalNetworkProof { pub fn verify( &self, - comm: &SparseMatPolyCommitment, - comm_derefs: &DerefsCommitment, - evals: &[Scalar], - gens: &SparseMatPolyCommitmentGens, - rx: &[Scalar], - ry: &[Scalar], - r_mem_check: &(Scalar, Scalar), + comm: &SparseMatPolyCommitment, + evals: &[S], + rx: &[S], + ry: &[S], + r_mem_check: &(S, S), nz: usize, transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { let timer = Timer::new("verify_polyeval_proof"); - transcript.append_protocol_name(PolyEvalNetworkProof::protocol_name()); + >::append_protocol_name( + transcript, + PolyEvalNetworkProof::::protocol_name(), + ); let num_instances = evals.len(); let (r_hash, r_multiset_check) = r_mem_check; @@ -1419,8 +1328,6 @@ impl PolyEvalNetworkProof { ), &claims_dotp, comm, - gens, - comm_derefs, rx, ry, r_hash, @@ -1434,27 +1341,26 @@ impl PolyEvalNetworkProof { } #[derive(Debug, Serialize, Deserialize)] -pub struct SparseMatPolyEvalProof { - comm_derefs: DerefsCommitment, - poly_eval_network_proof: PolyEvalNetworkProof, +pub struct SparseMatPolyEvalProof { + poly_eval_network_proof: PolyEvalNetworkProof, } -impl SparseMatPolyEvalProof { +impl SparseMatPolyEvalProof { fn protocol_name() -> &'static [u8] { b"Sparse polynomial evaluation proof" } - fn equalize(rx: &[Scalar], ry: &[Scalar]) -> (Vec, Vec) { + fn equalize(rx: &[S], ry: &[S]) -> (Vec, Vec) { match rx.len().cmp(&ry.len()) { Ordering::Less => { let diff = ry.len() - rx.len(); - let mut rx_ext = vec![Scalar::zero(); diff]; + let mut rx_ext = vec![S::field_zero(); diff]; rx_ext.extend(rx); (rx_ext, ry.to_vec()) } Ordering::Greater => { let diff = rx.len() - ry.len(); - let mut ry_ext = vec![Scalar::zero(); diff]; + let mut ry_ext = vec![S::field_zero(); diff]; ry_ext.extend(ry); (rx.to_vec(), ry_ext) } @@ -1463,15 +1369,17 @@ impl SparseMatPolyEvalProof { } pub fn prove( - dense: &MultiSparseMatPolynomialAsDense, - rx: &[Scalar], // point at which the polynomial is evaluated - ry: &[Scalar], - evals: &[Scalar], // a vector evaluation of \widetilde{M}(r = (rx,ry)) for each M - gens: &SparseMatPolyCommitmentGens, + dense: &MultiSparseMatPolynomialAsDense, + rx: &[S], // point at which the polynomial is evaluated + ry: &[S], + evals: &[S], // a vector evaluation of \widetilde{M}(r = (rx,ry)) for each M transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> SparseMatPolyEvalProof { - transcript.append_protocol_name(SparseMatPolyEvalProof::protocol_name()); + random_tape: &mut RandomTape, + ) -> SparseMatPolyEvalProof { + >::append_protocol_name( + transcript, + SparseMatPolyEvalProof::::protocol_name(), + ); // ensure there is one eval for each polynomial in dense assert_eq!(evals.len(), dense.batch_size); @@ -1488,11 +1396,7 @@ impl SparseMatPolyEvalProof { // commit to non-deterministic choices of the prover let timer_commit = Timer::new("commit_nondet_witness"); - let comm_derefs = { - let comm = derefs.commit(&gens.gens_derefs); - comm.append_to_transcript(b"comm_poly_row_col_ops_val", transcript); - comm - }; + timer_commit.stop(); let poly_eval_network_proof = { @@ -1511,36 +1415,30 @@ impl SparseMatPolyEvalProof { timer_build_network.stop(); let timer_eval_network = Timer::new("evalproof_layered_network"); - let poly_eval_network_proof = PolyEvalNetworkProof::prove( - &mut net, - dense, - &derefs, - evals, - gens, - transcript, - random_tape, - ); + let poly_eval_network_proof = + PolyEvalNetworkProof::prove(&mut net, dense, &derefs, evals, transcript, random_tape); timer_eval_network.stop(); poly_eval_network_proof }; SparseMatPolyEvalProof { - comm_derefs, poly_eval_network_proof, } } pub fn verify( &self, - comm: &SparseMatPolyCommitment, - rx: &[Scalar], // point at which the polynomial is evaluated - ry: &[Scalar], - evals: &[Scalar], // evaluation of \widetilde{M}(r = (rx,ry)) - gens: &SparseMatPolyCommitmentGens, + comm: &SparseMatPolyCommitment, + rx: &[S], // point at which the polynomial is evaluated + ry: &[S], + evals: &[S], // evaluation of \widetilde{M}(r = (rx,ry)) transcript: &mut Transcript, ) -> Result<(), ProofVerifyError> { - transcript.append_protocol_name(SparseMatPolyEvalProof::protocol_name()); + >::append_protocol_name( + transcript, + SparseMatPolyEvalProof::::protocol_name(), + ); // equalize the lengths of rx and ry let (rx_ext, ry_ext) = SparseMatPolyEvalProof::equalize(rx, ry); @@ -1548,19 +1446,12 @@ impl SparseMatPolyEvalProof { let (nz, num_mem_cells) = (comm.num_ops, comm.num_mem_cells); assert_eq!(rx_ext.len().pow2(), num_mem_cells); - // add claims to transcript and obtain challenges for randomized mem-check circuit - self - .comm_derefs - .append_to_transcript(b"comm_poly_row_col_ops_val", transcript); - // produce a random element from the transcript for hash function let r_mem_check = transcript.challenge_vector(b"challenge_r_hash", 2); self.poly_eval_network_proof.verify( comm, - &self.comm_derefs, evals, - gens, &rx_ext, &ry_ext, &(r_mem_check[0], r_mem_check[1]), @@ -1570,56 +1461,10 @@ impl SparseMatPolyEvalProof { } } -pub struct SparsePolyEntry { - pub idx: usize, - pub val: Scalar, -} - -impl SparsePolyEntry { - pub fn new(idx: usize, val: Scalar) -> Self { - SparsePolyEntry { idx, val } - } -} - -pub struct SparsePolynomial { - num_vars: usize, - Z: Vec, -} - -impl SparsePolynomial { - pub fn new(num_vars: usize, Z: Vec) -> Self { - SparsePolynomial { num_vars, Z } - } - - fn compute_chi(a: &[bool], r: &[Scalar]) -> Scalar { - assert_eq!(a.len(), r.len()); - let mut chi_i = Scalar::one(); - for j in 0..r.len() { - if a[j] { - chi_i *= r[j]; - } else { - chi_i *= Scalar::one() - r[j]; - } - } - chi_i - } - - // Takes O(n log n). TODO: do this in O(n) where n is the number of entries in Z - pub fn evaluate(&self, r: &[Scalar]) -> Scalar { - assert_eq!(self.num_vars, r.len()); - - (0..self.Z.len()) - .map(|i| { - let bits = self.Z[i].idx.get_bits(r.len()); - SparsePolynomial::compute_chi(&bits, r) * self.Z[i].val - }) - .sum() - } -} - #[cfg(test)] mod tests { use super::*; + use crate::scalar::Scalar; use rand::rngs::OsRng; use rand::RngCore; #[test] @@ -1632,7 +1477,7 @@ mod tests { let num_vars_x: usize = num_rows.log_2(); let num_vars_y: usize = num_cols.log_2(); - let mut M: Vec = Vec::new(); + let mut M: Vec> = Vec::new(); for _i in 0..num_nz_entries { M.push(SparseMatEntry::new( @@ -1643,16 +1488,9 @@ mod tests { } let poly_M = SparseMatPolynomial::new(num_vars_x, num_vars_y, M); - let gens = SparseMatPolyCommitmentGens::new( - b"gens_sparse_poly", - num_vars_x, - num_vars_y, - num_nz_entries, - 3, - ); // commitment - let (poly_comm, dense) = SparseMatPolynomial::multi_commit(&[&poly_M, &poly_M, &poly_M], &gens); + let (poly_comm, dense) = SparseMatPolynomial::multi_commit(&[&poly_M, &poly_M, &poly_M]); // evaluation let rx: Vec = (0..num_vars_x) @@ -1671,21 +1509,13 @@ mod tests { &rx, &ry, &evals, - &gens, &mut prover_transcript, &mut random_tape, ); let mut verifier_transcript = Transcript::new(b"example"); assert!(proof - .verify( - &poly_comm, - &rx, - &ry, - &evals, - &gens, - &mut verifier_transcript, - ) + .verify(&poly_comm, &rx, &ry, &evals, &mut verifier_transcript,) .is_ok()); } } diff --git a/spartan_parallel/src/sumcheck.rs b/spartan_parallel/src/sumcheck.rs index c4f91e88..57b11cf4 100644 --- a/spartan_parallel/src/sumcheck.rs +++ b/spartan_parallel/src/sumcheck.rs @@ -2,47 +2,42 @@ #![allow(clippy::type_complexity)] use crate::custom_dense_mlpoly::DensePolynomialPqx; use crate::math::Math; +use crate::scalar::SpartanExtensionField; -use super::commitments::{Commitments, MultiCommitGens}; use super::dense_mlpoly::DensePolynomial; use super::errors::ProofVerifyError; -use super::group::{CompressedGroup, GroupElement, VartimeMultiscalarMul}; -use super::nizk::DotProductProof; use super::random::RandomTape; -use super::scalar::Scalar; use super::transcript::{AppendToTranscript, ProofTranscript}; use super::unipoly::{CompressedUniPoly, UniPoly}; -use core::iter; use itertools::izip; use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::cmp::min; -const ZERO: Scalar = Scalar::zero(); const MODE_P: usize = 1; const MODE_Q: usize = 2; const MODE_W: usize = 3; const MODE_X: usize = 4; #[derive(Serialize, Deserialize, Debug)] -pub struct SumcheckInstanceProof { - compressed_polys: Vec, +pub struct SumcheckInstanceProof { + compressed_polys: Vec>, } -impl SumcheckInstanceProof { - pub fn new(compressed_polys: Vec) -> SumcheckInstanceProof { +impl SumcheckInstanceProof { + pub fn new(compressed_polys: Vec>) -> SumcheckInstanceProof { SumcheckInstanceProof { compressed_polys } } pub fn verify( &self, - claim: Scalar, + claim: S, num_rounds: usize, degree_bound: usize, transcript: &mut Transcript, - ) -> Result<(Scalar, Vec), ProofVerifyError> { + ) -> Result<(S, Vec), ProofVerifyError> { let mut e = claim; - let mut r: Vec = Vec::new(); + let mut r: Vec = Vec::new(); // verify that there is a univariate polynomial for each round assert_eq!(self.compressed_polys.len(), num_rounds); @@ -61,6 +56,9 @@ impl SumcheckInstanceProof { // derive the verifier's challenge for the next round let r_i = transcript.challenge_scalar(b"challenge_nextround"); + // scalar_debug + // println!("=> SumcheckInstanceProof-verify, challenge round {:?} - {:?}", i, r_i); + r.push(r_i); // evaluate the claimed degree-ell polynomial at r_i @@ -71,145 +69,26 @@ impl SumcheckInstanceProof { } } -#[derive(Serialize, Deserialize, Debug)] -pub struct ZKSumcheckInstanceProof { - comm_polys: Vec, - comm_evals: Vec, - proofs: Vec, -} - -impl ZKSumcheckInstanceProof { - pub fn new( - comm_polys: Vec, - comm_evals: Vec, - proofs: Vec, - ) -> Self { - ZKSumcheckInstanceProof { - comm_polys, - comm_evals, - proofs, - } - } - - pub fn verify( - &self, - comm_claim: &CompressedGroup, - num_rounds: usize, - degree_bound: usize, - gens_1: &MultiCommitGens, - gens_n: &MultiCommitGens, - transcript: &mut Transcript, - ) -> Result<(CompressedGroup, Vec), ProofVerifyError> { - // verify degree bound - assert_eq!(gens_n.n, degree_bound + 1); - - // verify that there is a univariate polynomial for each round - assert_eq!(self.comm_polys.len(), num_rounds); - assert_eq!(self.comm_evals.len(), num_rounds); - - let mut r: Vec = Vec::new(); - - for i in 0..self.comm_polys.len() { - let comm_poly = &self.comm_polys[i]; - - // append the prover's polynomial to the transcript - comm_poly.append_to_transcript(b"comm_poly", transcript); - - // derive the verifier's challenge for the next round - let r_i = transcript.challenge_scalar(b"challenge_nextround"); - - // verify the proof of sum-check and evals - let res = { - let comm_claim_per_round = if i == 0 { - comm_claim - } else { - &self.comm_evals[i - 1] - }; - let comm_eval = &self.comm_evals[i]; - - // add two claims to transcript - comm_claim_per_round.append_to_transcript(b"comm_claim_per_round", transcript); - comm_eval.append_to_transcript(b"comm_eval", transcript); - - // produce two weights - let w = transcript.challenge_vector(b"combine_two_claims_to_one", 2); - - // compute a weighted sum of the RHS - let comm_target = GroupElement::vartime_multiscalar_mul( - w.iter(), - iter::once(&comm_claim_per_round) - .chain(iter::once(&comm_eval)) - .map(|pt| pt.decompress().unwrap()) - .collect::>(), - ) - .compress(); - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![Scalar::one(); degree_bound + 1]; - a[0] += Scalar::one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![Scalar::one(); degree_bound + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_i; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - self.proofs[i] - .verify( - gens_1, - gens_n, - transcript, - &a, - &self.comm_polys[i], - &comm_target, - ) - .is_ok() - }; - if !res { - return Err(ProofVerifyError::InternalError); - } - - r.push(r_i); - } - - Ok((self.comm_evals[self.comm_evals.len() - 1], r)) - } -} - -impl SumcheckInstanceProof { +impl SumcheckInstanceProof { pub fn prove_cubic( - claim: &Scalar, + claim: &S, num_rounds: usize, - poly_A: &mut DensePolynomial, - poly_B: &mut DensePolynomial, - poly_C: &mut DensePolynomial, + poly_A: &mut DensePolynomial, + poly_B: &mut DensePolynomial, + poly_C: &mut DensePolynomial, comb_func: F, transcript: &mut Transcript, - ) -> (Self, Vec, Vec) + ) -> (Self, Vec, Vec) where - F: Fn(&Scalar, &Scalar, &Scalar) -> Scalar, + F: Fn(&S, &S, &S) -> S, { let mut e = *claim; - let mut r: Vec = Vec::new(); - let mut cubic_polys: Vec = Vec::new(); + let mut r: Vec = Vec::new(); + let mut cubic_polys: Vec> = Vec::new(); for _j in 0..num_rounds { - let mut eval_point_0 = ZERO; - let mut eval_point_2 = ZERO; - let mut eval_point_3 = ZERO; + let mut eval_point_0 = S::field_zero(); + let mut eval_point_2 = S::field_zero(); + let mut eval_point_3 = S::field_zero(); let len = poly_A.len() / 2; for i in 0..len { @@ -220,22 +99,24 @@ impl SumcheckInstanceProof { let poly_A_bound_point = poly_A[len + i] + poly_A[len + i] - poly_A[i]; let poly_B_bound_point = poly_B[len + i] + poly_B[len + i] - poly_B[i]; let poly_C_bound_point = poly_C[len + i] + poly_C[len + i] - poly_C[i]; - eval_point_2 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) let poly_A_bound_point = poly_A_bound_point + poly_A[len + i] - poly_A[i]; let poly_B_bound_point = poly_B_bound_point + poly_B[len + i] - poly_B[i]; let poly_C_bound_point = poly_C_bound_point + poly_C[len + i] - poly_C[i]; - eval_point_3 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); } let evals = vec![eval_point_0, e - eval_point_0, eval_point_2, eval_point_3]; @@ -263,71 +144,68 @@ impl SumcheckInstanceProof { } pub fn prove_cubic_batched( - claim: &Scalar, + claim: &S, num_rounds: usize, poly_vec_par: ( - &mut Vec<&mut DensePolynomial>, - &mut Vec<&mut DensePolynomial>, - &mut DensePolynomial, + &mut Vec<&mut DensePolynomial>, + &mut Vec<&mut DensePolynomial>, + &mut DensePolynomial, ), poly_vec_seq: ( - &mut Vec<&mut DensePolynomial>, - &mut Vec<&mut DensePolynomial>, - &mut Vec<&mut DensePolynomial>, + &mut Vec<&mut DensePolynomial>, + &mut Vec<&mut DensePolynomial>, + &mut Vec<&mut DensePolynomial>, ), - coeffs: &[Scalar], + coeffs: &[S], comb_func: F, transcript: &mut Transcript, - ) -> ( - Self, - Vec, - (Vec, Vec, Scalar), - (Vec, Vec, Vec), - ) + ) -> (Self, Vec, (Vec, Vec, S), (Vec, Vec, Vec)) where - F: Fn(&Scalar, &Scalar, &Scalar) -> Scalar, + F: Fn(&S, &S, &S) -> S, { let (poly_A_vec_par, poly_B_vec_par, poly_C_par) = poly_vec_par; let (poly_A_vec_seq, poly_B_vec_seq, poly_C_vec_seq) = poly_vec_seq; //let (poly_A_vec_seq, poly_B_vec_seq, poly_C_vec_seq) = poly_vec_seq; let mut e = *claim; - let mut r: Vec = Vec::new(); - let mut cubic_polys: Vec = Vec::new(); + let mut r: Vec = Vec::new(); + let mut cubic_polys: Vec> = Vec::new(); for _j in 0..num_rounds { - let mut evals: Vec<(Scalar, Scalar, Scalar)> = Vec::new(); + let mut evals: Vec<(S, S, S)> = Vec::new(); for (poly_A, poly_B) in poly_A_vec_par.iter().zip(poly_B_vec_par.iter()) { - let mut eval_point_0 = ZERO; - let mut eval_point_2 = ZERO; - let mut eval_point_3 = ZERO; + let mut eval_point_0 = S::field_zero(); + let mut eval_point_2 = S::field_zero(); + let mut eval_point_3 = S::field_zero(); let len = poly_A.len() / 2; for i in 0..len { // eval 0: bound_func is A(low) - eval_point_0 += comb_func(&poly_A[i], &poly_B[i], &poly_C_par[i]); + eval_point_0 = eval_point_0 + comb_func(&poly_A[i], &poly_B[i], &poly_C_par[i]); // eval 2: bound_func is -A(low) + 2*A(high) let poly_A_bound_point = poly_A[len + i] + poly_A[len + i] - poly_A[i]; let poly_B_bound_point = poly_B[len + i] + poly_B[len + i] - poly_B[i]; let poly_C_bound_point = poly_C_par[len + i] + poly_C_par[len + i] - poly_C_par[i]; - eval_point_2 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) let poly_A_bound_point = poly_A_bound_point + poly_A[len + i] - poly_A[i]; let poly_B_bound_point = poly_B_bound_point + poly_B[len + i] - poly_B[i]; let poly_C_bound_point = poly_C_bound_point + poly_C_par[len + i] - poly_C_par[i]; - eval_point_3 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); } evals.push((eval_point_0, eval_point_2, eval_point_3)); @@ -338,31 +216,33 @@ impl SumcheckInstanceProof { poly_B_vec_seq.iter(), poly_C_vec_seq.iter() ) { - let mut eval_point_0 = ZERO; - let mut eval_point_2 = ZERO; - let mut eval_point_3 = ZERO; + let mut eval_point_0 = S::field_zero(); + let mut eval_point_2 = S::field_zero(); + let mut eval_point_3 = S::field_zero(); let len = poly_A.len() / 2; for i in 0..len { // eval 0: bound_func is A(low) - eval_point_0 += comb_func(&poly_A[i], &poly_B[i], &poly_C[i]); + eval_point_0 = eval_point_0 + comb_func(&poly_A[i], &poly_B[i], &poly_C[i]); // eval 2: bound_func is -A(low) + 2*A(high) let poly_A_bound_point = poly_A[len + i] + poly_A[len + i] - poly_A[i]; let poly_B_bound_point = poly_B[len + i] + poly_B[len + i] - poly_B[i]; let poly_C_bound_point = poly_C[len + i] + poly_C[len + i] - poly_C[i]; - eval_point_2 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) let poly_A_bound_point = poly_A_bound_point + poly_A[len + i] - poly_A[i]; let poly_B_bound_point = poly_B_bound_point + poly_B[len + i] - poly_B[i]; let poly_C_bound_point = poly_C_bound_point + poly_C[len + i] - poly_C[i]; - eval_point_3 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); } evals.push((eval_point_0, eval_point_2, eval_point_3)); } @@ -384,6 +264,10 @@ impl SumcheckInstanceProof { //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + + // scalar_debug + // println!("=> prove_cubic_batched, challenge round {:?} - {:?}", _j, r_j); + r.push(r_j); // bound all tables to the verifier's challenege @@ -433,12 +317,9 @@ impl SumcheckInstanceProof { claims_dotp, ) } -} -impl ZKSumcheckInstanceProof { pub fn prove_cubic_disjoint_rounds( - claim: &Scalar, - blind_claim: &Scalar, + claim: &S, num_rounds: usize, num_rounds_y_max: usize, num_rounds_w: usize, @@ -446,17 +327,14 @@ impl ZKSumcheckInstanceProof { single_inst: bool, // indicates whether poly_B only has one instance num_witness_secs: usize, mut num_inputs: Vec, - poly_A: &mut DensePolynomial, - poly_B: &mut DensePolynomialPqx, - poly_C: &mut DensePolynomialPqx, + poly_A: &mut DensePolynomial, + poly_B: &mut DensePolynomialPqx, + poly_C: &mut DensePolynomialPqx, comb_func: F, - gens_1: &MultiCommitGens, - gens_n: &MultiCommitGens, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (Self, Vec, Vec, Scalar) + ) -> (Self, Vec, Vec) where - F: Fn(&Scalar, &Scalar, &Scalar) -> Scalar, + F: Fn(&S, &S, &S) -> S, { // NOTE: if single_inst, number of instances in poly_B is 1, might not match with instance_len! // NOTE: num_proofs must be 1! @@ -464,18 +342,10 @@ impl ZKSumcheckInstanceProof { // poly_A is the EQ polynomial of size P * W * Y_max assert_eq!(num_rounds, num_rounds_y_max + num_rounds_w + num_rounds_p); - let (blinds_poly, blinds_evals) = ( - random_tape.random_vector(b"blinds_poly", num_rounds), - random_tape.random_vector(b"blinds_evals", num_rounds), - ); - let mut claim_per_round = *claim; - let mut comm_claim_per_round = claim_per_round.commit(blind_claim, gens_1).compress(); - let mut r: Vec = Vec::new(); - let mut comm_polys: Vec = Vec::new(); - let mut comm_evals: Vec = Vec::new(); - let mut proofs: Vec = Vec::new(); + let mut r: Vec = Vec::new(); + let mut polys: Vec> = Vec::new(); let mut inputs_len = num_rounds_y_max.pow2(); let mut witness_secs_len = num_rounds_w.pow2(); @@ -522,10 +392,10 @@ impl ZKSumcheckInstanceProof { instance_len /= 2 }; - let (poly, comm_poly) = { - let mut eval_point_0 = ZERO; - let mut eval_point_2 = ZERO; - let mut eval_point_3 = ZERO; + let poly = { + let mut eval_point_0 = S::field_zero(); + let mut eval_point_2 = S::field_zero(); + let mut eval_point_3 = S::field_zero(); // We are guaranteed initially instance_len < num_inputs.len() < instance_len x 2 // So min(instance_len, num_proofs.len()) suffices @@ -553,11 +423,12 @@ impl ZKSumcheckInstanceProof { }; // eval 0: bound_func is A(low) - eval_point_0 += comb_func( - &poly_A_index_p_w_y, - &poly_B.index(p_inst, 0, w, y), - &poly_C.index(p, 0, w, y), - ); // Az[0, x, x, x, ...] + eval_point_0 = eval_point_0 + + comb_func( + &poly_A_index_p_w_y, + &poly_B.index(p_inst, 0, w, y), + &poly_C.index(p, 0, w, y), + ); // Az[0, x, x, x, ...] // eval 2: bound_func is -A(low) + 2*A(high) let poly_A_bound_point = @@ -568,11 +439,12 @@ impl ZKSumcheckInstanceProof { let poly_C_bound_point = poly_C.index_high(p, 0, w, y, mode) + poly_C.index_high(p, 0, w, y, mode) - poly_C.index(p, 0, w, y); - eval_point_2 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) let poly_A_bound_point = @@ -582,11 +454,12 @@ impl ZKSumcheckInstanceProof { - poly_B.index(p_inst, 0, w, y); // Az[3, x, x, ...] let poly_C_bound_point = poly_C_bound_point + poly_C.index_high(p, 0, w, y, mode) - poly_C.index(p, 0, w, y); - eval_point_3 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - ); + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + ); } } } @@ -598,16 +471,16 @@ impl ZKSumcheckInstanceProof { eval_point_3, ]; let poly = UniPoly::from_evals(&evals); - let comm_poly = poly.commit(gens_n, &blinds_poly[j]).compress(); - (poly, comm_poly) + + poly }; // append the prover's message to the transcript - comm_poly.append_to_transcript(b"comm_poly", transcript); - comm_polys.push(comm_poly); + poly.append_to_transcript(b"poly", transcript); //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + r.push(r_j); // bound all tables to the verifier's challenege if mode == MODE_P { @@ -617,133 +490,40 @@ impl ZKSumcheckInstanceProof { poly_B.bound_poly(&r_j, mode); } poly_C.bound_poly(&r_j, mode); - - // produce a proof of sum-check and of evaluation - let (proof, claim_next_round, comm_claim_next_round) = { - let eval = poly.evaluate(&r_j); - let comm_eval = eval.commit(&blinds_evals[j], gens_1).compress(); - - // we need to prove the following under homomorphic commitments: - // (1) poly(0) + poly(1) = claim_per_round - // (2) poly(r_j) = eval - - // Our technique is to leverage dot product proofs: - // (1) we can prove: = claim_per_round - // (2) we can prove: >(), - ) - .compress(); - - let blind = { - let blind_sc = if j == 0 { - blind_claim - } else { - &blinds_evals[j - 1] - }; - - let blind_eval = &blinds_evals[j]; - - w[0] * blind_sc + w[1] * blind_eval - }; - assert_eq!(target.commit(&blind, gens_1).compress(), comm_target); - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![Scalar::one(); poly.degree() + 1]; - a[0] += Scalar::one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![Scalar::one(); poly.degree() + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_j; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - let (proof, _comm_poly, _comm_sc_eval) = DotProductProof::prove( - gens_1, - gens_n, - transcript, - random_tape, - &poly.as_vec(), - &blinds_poly[j], - &a, - &target, - &blind, - ); - - (proof, eval, comm_eval) - }; - - proofs.push(proof); - claim_per_round = claim_next_round; - comm_claim_per_round = comm_claim_next_round; - r.push(r_j); - comm_evals.push(comm_claim_per_round); + claim_per_round = poly.evaluate(&r_j); + polys.push(poly.compress()); } ( - ZKSumcheckInstanceProof::new(comm_polys, comm_evals, proofs), + SumcheckInstanceProof::new(polys), r, vec![ poly_A[0], poly_B.index(0, 0, 0, 0), poly_C.index(0, 0, 0, 0), ], - blinds_evals[num_rounds - 1], ) } pub fn prove_cubic_with_additive_term_disjoint_rounds( - claim: &Scalar, - blind_claim: &Scalar, + claim: &S, num_rounds: usize, num_rounds_x_max: usize, num_rounds_q_max: usize, num_rounds_p: usize, mut num_proofs: Vec, mut num_cons: Vec, - poly_Ap: &mut DensePolynomial, - poly_Aq: &mut DensePolynomial, - poly_Ax: &mut DensePolynomial, - poly_B: &mut DensePolynomialPqx, - poly_C: &mut DensePolynomialPqx, - poly_D: &mut DensePolynomialPqx, + poly_Ap: &mut DensePolynomial, + poly_Aq: &mut DensePolynomial, + poly_Ax: &mut DensePolynomial, + poly_B: &mut DensePolynomialPqx, + poly_C: &mut DensePolynomialPqx, + poly_D: &mut DensePolynomialPqx, comb_func: F, - gens_1: &MultiCommitGens, - gens_n: &MultiCommitGens, transcript: &mut Transcript, - random_tape: &mut RandomTape, - ) -> (Self, Vec, Vec, Scalar) + ) -> (Self, Vec, Vec) where - F: Fn(&Scalar, &Scalar, &Scalar, &Scalar) -> Scalar, + F: Fn(&S, &S, &S, &S) -> S, { // Note: num_witness_secs must be 1! // We perform sumcheck in x -> q_rev -> p order, but all polynomials have parameters (p, q, x) @@ -758,18 +538,10 @@ impl ZKSumcheckInstanceProof { assert_eq!(poly_C.num_witness_secs, 1); assert_eq!(poly_D.num_witness_secs, 1); - let (blinds_poly, blinds_evals) = ( - random_tape.random_vector(b"blinds_poly", num_rounds), - random_tape.random_vector(b"blinds_evals", num_rounds), - ); - let mut claim_per_round = *claim; - let mut comm_claim_per_round = claim_per_round.commit(blind_claim, gens_1).compress(); - let mut r: Vec = Vec::new(); - let mut comm_polys: Vec = Vec::new(); - let mut comm_evals: Vec = Vec::new(); - let mut proofs: Vec = Vec::new(); + let mut r: Vec = Vec::new(); + let mut polys: Vec> = Vec::new(); let mut cons_len = num_rounds_x_max.pow2(); let mut proof_len = num_rounds_q_max.pow2(); @@ -820,10 +592,10 @@ impl ZKSumcheckInstanceProof { instance_len /= 2 }; - let (poly, comm_poly) = { - let mut eval_point_0 = ZERO; - let mut eval_point_2 = ZERO; - let mut eval_point_3 = ZERO; + let poly = { + let mut eval_point_0 = S::field_zero(); + let mut eval_point_2 = S::field_zero(); + let mut eval_point_3 = S::field_zero(); // We are guaranteed initially instance_len < num_proofs.len() < instance_len x 2 // So min(instance_len, num_proofs.len()) suffices @@ -856,12 +628,13 @@ impl ZKSumcheckInstanceProof { }; // eval 0: bound_func is A(low) - eval_point_0 += comb_func( - &poly_A_index_p_q_x, - &poly_B.index(p, q, 0, x), - &poly_C.index(p, q, 0, x), - &poly_D.index(p, q, 0, x), - ); // Az[0, x, x, x, ...] + eval_point_0 = eval_point_0 + + comb_func( + &poly_A_index_p_q_x, + &poly_B.index(p, q, 0, x), + &poly_C.index(p, q, 0, x), + &poly_D.index(p, q, 0, x), + ); // Az[0, x, x, x, ...] // eval 2: bound_func is -A(low) + 2*A(high) let poly_A_bound_point = @@ -875,12 +648,13 @@ impl ZKSumcheckInstanceProof { let poly_D_bound_point = poly_D.index_high(p, q, 0, x, mode) + poly_D.index_high(p, q, 0, x, mode) - poly_D.index(p, q, 0, x); - eval_point_2 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - &poly_D_bound_point, - ); + eval_point_2 = eval_point_2 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + &poly_D_bound_point, + ); // eval 3: bound_func is -2A(low) + 3A(high); computed incrementally with bound_func applied to eval(2) let poly_A_bound_point = @@ -891,12 +665,13 @@ impl ZKSumcheckInstanceProof { poly_C_bound_point + poly_C.index_high(p, q, 0, x, mode) - poly_C.index(p, q, 0, x); let poly_D_bound_point = poly_D_bound_point + poly_D.index_high(p, q, 0, x, mode) - poly_D.index(p, q, 0, x); - eval_point_3 += comb_func( - &poly_A_bound_point, - &poly_B_bound_point, - &poly_C_bound_point, - &poly_D_bound_point, - ); + eval_point_3 = eval_point_3 + + comb_func( + &poly_A_bound_point, + &poly_B_bound_point, + &poly_C_bound_point, + &poly_D_bound_point, + ); } } } @@ -908,16 +683,15 @@ impl ZKSumcheckInstanceProof { eval_point_3, ]; let poly = UniPoly::from_evals(&evals); - let comm_poly = poly.commit(gens_n, &blinds_poly[j]).compress(); - (poly, comm_poly) + poly }; // append the prover's message to the transcript - comm_poly.append_to_transcript(b"comm_poly", transcript); - comm_polys.push(comm_poly); + poly.append_to_transcript(b"poly", transcript); //derive the verifier's challenge for the next round let r_j = transcript.challenge_scalar(b"challenge_nextround"); + r.push(r_j); // bound all tables to the verifier's challenege if mode == 1 { @@ -930,101 +704,12 @@ impl ZKSumcheckInstanceProof { poly_B.bound_poly(&r_j, mode); poly_C.bound_poly(&r_j, mode); poly_D.bound_poly(&r_j, mode); - - // produce a proof of sum-check and of evaluation - let (proof, claim_next_round, comm_claim_next_round) = { - let eval = poly.evaluate(&r_j); - let comm_eval = eval.commit(&blinds_evals[j], gens_1).compress(); - - // we need to prove the following under homomorphic commitments: - // (1) poly(0) + poly(1) = claim_per_round - // (2) poly(r_j) = eval - - // Our technique is to leverage dot product proofs: - // (1) we can prove: = claim_per_round - // (2) we can prove: >(), - ) - .compress(); - - let blind = { - let blind_sc = if j == 0 { - blind_claim - } else { - &blinds_evals[j - 1] - }; - - let blind_eval = &blinds_evals[j]; - - w[0] * blind_sc + w[1] * blind_eval - }; - - assert_eq!(target.commit(&blind, gens_1).compress(), comm_target); - - let a = { - // the vector to use to decommit for sum-check test - let a_sc = { - let mut a = vec![Scalar::one(); poly.degree() + 1]; - a[0] += Scalar::one(); - a - }; - - // the vector to use to decommit for evaluation - let a_eval = { - let mut a = vec![Scalar::one(); poly.degree() + 1]; - for j in 1..a.len() { - a[j] = a[j - 1] * r_j; - } - a - }; - - // take weighted sum of the two vectors using w - assert_eq!(a_sc.len(), a_eval.len()); - (0..a_sc.len()) - .map(|i| w[0] * a_sc[i] + w[1] * a_eval[i]) - .collect::>() - }; - - let (proof, _comm_poly, _comm_sc_eval) = DotProductProof::prove( - gens_1, - gens_n, - transcript, - random_tape, - &poly.as_vec(), - &blinds_poly[j], - &a, - &target, - &blind, - ); - - (proof, eval, comm_eval) - }; - - proofs.push(proof); - claim_per_round = claim_next_round; - comm_claim_per_round = comm_claim_next_round; - r.push(r_j); - comm_evals.push(comm_claim_per_round); + claim_per_round = poly.evaluate(&r_j); + polys.push(poly.compress()); } ( - ZKSumcheckInstanceProof::new(comm_polys, comm_evals, proofs), + SumcheckInstanceProof::new(polys), r, vec![ poly_Ap[0] * poly_Aq[0] * poly_Ax[0], @@ -1032,7 +717,6 @@ impl ZKSumcheckInstanceProof { poly_C.index(0, 0, 0, 0), poly_D.index(0, 0, 0, 0), ], - blinds_evals[num_rounds - 1], ) } } diff --git a/spartan_parallel/src/transcript.rs b/spartan_parallel/src/transcript.rs index a57f1507..52d794be 100644 --- a/spartan_parallel/src/transcript.rs +++ b/spartan_parallel/src/transcript.rs @@ -1,63 +1,35 @@ -use super::group::CompressedGroup; -use super::scalar::Scalar; +use super::scalar::SpartanExtensionField; use merlin::Transcript; -pub trait ProofTranscript { +pub trait ProofTranscript { fn append_protocol_name(&mut self, protocol_name: &'static [u8]); - fn append_scalar(&mut self, label: &'static [u8], scalar: &Scalar); - fn append_point(&mut self, label: &'static [u8], point: &CompressedGroup); - fn challenge_scalar(&mut self, label: &'static [u8]) -> Scalar; - fn challenge_vector(&mut self, label: &'static [u8], len: usize) -> Vec; + fn append_scalar(&mut self, label: &'static [u8], scalar: &S); + fn challenge_scalar(&mut self, label: &'static [u8]) -> S; + fn challenge_vector(&mut self, label: &'static [u8], len: usize) -> Vec; } -impl ProofTranscript for Transcript { +impl ProofTranscript for Transcript { fn append_protocol_name(&mut self, protocol_name: &'static [u8]) { self.append_message(b"protocol-name", protocol_name); } - fn append_scalar(&mut self, label: &'static [u8], scalar: &Scalar) { + fn append_scalar(&mut self, label: &'static [u8], scalar: &S) { self.append_message(label, &scalar.to_bytes()); } - fn append_point(&mut self, label: &'static [u8], point: &CompressedGroup) { - self.append_message(label, point.as_bytes()); - } - - fn challenge_scalar(&mut self, label: &'static [u8]) -> Scalar { + fn challenge_scalar(&mut self, label: &'static [u8]) -> S { let mut buf = [0u8; 64]; self.challenge_bytes(label, &mut buf); - Scalar::from_bytes_wide(&buf) + S::from_bytes_wide(&buf) } - fn challenge_vector(&mut self, label: &'static [u8], len: usize) -> Vec { + fn challenge_vector(&mut self, label: &'static [u8], len: usize) -> Vec { (0..len) .map(|_i| self.challenge_scalar(label)) - .collect::>() + .collect::>() } } pub trait AppendToTranscript { fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript); } - -impl AppendToTranscript for Scalar { - fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { - transcript.append_scalar(label, self); - } -} - -impl AppendToTranscript for [Scalar] { - fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { - transcript.append_message(label, b"begin_append_vector"); - for item in self { - transcript.append_scalar(label, item); - } - transcript.append_message(label, b"end_append_vector"); - } -} - -impl AppendToTranscript for CompressedGroup { - fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { - transcript.append_point(label, self); - } -} diff --git a/spartan_parallel/src/unipoly.rs b/spartan_parallel/src/unipoly.rs index dcc39185..281dbf27 100644 --- a/spartan_parallel/src/unipoly.rs +++ b/spartan_parallel/src/unipoly.rs @@ -1,6 +1,4 @@ -use super::commitments::{Commitments, MultiCommitGens}; -use super::group::GroupElement; -use super::scalar::{Scalar, ScalarFromPrimitives}; +use super::scalar::SpartanExtensionField; use super::transcript::{AppendToTranscript, ProofTranscript}; use merlin::Transcript; use serde::{Deserialize, Serialize}; @@ -8,24 +6,24 @@ use serde::{Deserialize, Serialize}; // ax^2 + bx + c stored as vec![c,b,a] // ax^3 + bx^2 + cx + d stored as vec![d,c,b,a] #[derive(Debug)] -pub struct UniPoly { - coeffs: Vec, +pub struct UniPoly { + coeffs: Vec, } // ax^2 + bx + c stored as vec![c,a] // ax^3 + bx^2 + cx + d stored as vec![d,b,a] #[derive(Serialize, Deserialize, Debug)] -pub struct CompressedUniPoly { - coeffs_except_linear_term: Vec, +pub struct CompressedUniPoly { + coeffs_except_linear_term: Vec, } -impl UniPoly { - pub fn from_evals(evals: &[Scalar]) -> Self { +impl UniPoly { + pub fn from_evals(evals: &[S]) -> Self { // we only support degree-2 or degree-3 univariate polynomials assert!(evals.len() == 3 || evals.len() == 4); let coeffs = if evals.len() == 3 { // ax^2 + bx + c - let two_inv = (2_usize).to_scalar().invert().unwrap(); + let two_inv = S::from(2_usize).invert().unwrap(); let c = evals[0]; let a = two_inv * (evals[2] - evals[1] - evals[1] + c); @@ -33,8 +31,8 @@ impl UniPoly { vec![c, b, a] } else { // ax^3 + bx^2 + cx + d - let two_inv = (2_usize).to_scalar().invert().unwrap(); - let six_inv = (6_usize).to_scalar().invert().unwrap(); + let two_inv = S::from(2_usize).invert().unwrap(); + let six_inv = S::from(6_usize).invert().unwrap(); let d = evals[0]; let a = six_inv @@ -57,49 +55,45 @@ impl UniPoly { self.coeffs.len() - 1 } - pub fn as_vec(&self) -> Vec { + pub fn as_vec(&self) -> Vec { self.coeffs.clone() } - pub fn eval_at_zero(&self) -> Scalar { + pub fn eval_at_zero(&self) -> S { self.coeffs[0] } - pub fn eval_at_one(&self) -> Scalar { + pub fn eval_at_one(&self) -> S { (0..self.coeffs.len()).map(|i| self.coeffs[i]).sum() } - pub fn evaluate(&self, r: &Scalar) -> Scalar { + pub fn evaluate(&self, r: &S) -> S { let mut eval = self.coeffs[0]; let mut power = *r; for i in 1..self.coeffs.len() { - eval += power * self.coeffs[i]; - power *= r; + eval = eval + power * self.coeffs[i]; + power = power * *r; } eval } - pub fn compress(&self) -> CompressedUniPoly { + pub fn compress(&self) -> CompressedUniPoly { let coeffs_except_linear_term = [&self.coeffs[..1], &self.coeffs[2..]].concat(); assert_eq!(coeffs_except_linear_term.len() + 1, self.coeffs.len()); CompressedUniPoly { coeffs_except_linear_term, } } - - pub fn commit(&self, gens: &MultiCommitGens, blind: &Scalar) -> GroupElement { - self.coeffs.commit(blind, gens) - } } -impl CompressedUniPoly { +impl CompressedUniPoly { // we require eval(0) + eval(1) = hint, so we can solve for the linear term as: // linear_term = hint - 2 * constant_term - deg2 term - deg3 term - pub fn decompress(&self, hint: &Scalar) -> UniPoly { + pub fn decompress(&self, hint: &S) -> UniPoly { let mut linear_term = - hint - self.coeffs_except_linear_term[0] - self.coeffs_except_linear_term[0]; + *hint - self.coeffs_except_linear_term[0] - self.coeffs_except_linear_term[0]; for i in 1..self.coeffs_except_linear_term.len() { - linear_term -= self.coeffs_except_linear_term[i]; + linear_term = linear_term - self.coeffs_except_linear_term[i]; } let mut coeffs = vec![self.coeffs_except_linear_term[0], linear_term]; @@ -109,7 +103,7 @@ impl CompressedUniPoly { } } -impl AppendToTranscript for UniPoly { +impl AppendToTranscript for UniPoly { fn append_to_transcript(&self, label: &'static [u8], transcript: &mut Transcript) { transcript.append_message(label, b"UniPoly_begin"); for i in 0..self.coeffs.len() { @@ -121,15 +115,15 @@ impl AppendToTranscript for UniPoly { #[cfg(test)] mod tests { - use super::*; + use crate::scalar::Scalar; #[test] fn test_from_evals_quad() { // polynomial is 2x^2 + 3x + 1 let e0 = Scalar::one(); - let e1 = (6_usize).to_scalar(); - let e2 = (15_usize).to_scalar(); + let e1 = Scalar::from(6u64); + let e2 = Scalar::from(15u64); let evals = vec![e0, e1, e2]; let poly = UniPoly::from_evals(&evals); @@ -137,8 +131,8 @@ mod tests { assert_eq!(poly.eval_at_one(), e1); assert_eq!(poly.coeffs.len(), 3); assert_eq!(poly.coeffs[0], Scalar::one()); - assert_eq!(poly.coeffs[1], (3_usize).to_scalar()); - assert_eq!(poly.coeffs[2], (2_usize).to_scalar()); + assert_eq!(poly.coeffs[1], Scalar::from(3_usize)); + assert_eq!(poly.coeffs[2], Scalar::from(2_usize)); let hint = e0 + e1; let compressed_poly = poly.compress(); @@ -147,17 +141,17 @@ mod tests { assert_eq!(decompressed_poly.coeffs[i], poly.coeffs[i]); } - let e3 = (28_usize).to_scalar(); - assert_eq!(poly.evaluate(&(3_usize).to_scalar()), e3); + let e3 = Scalar::from(28_usize); + assert_eq!(poly.evaluate(&Scalar::from(3_usize)), e3); } #[test] fn test_from_evals_cubic() { // polynomial is x^3 + 2x^2 + 3x + 1 let e0 = Scalar::one(); - let e1 = (7_usize).to_scalar(); - let e2 = (23_usize).to_scalar(); - let e3 = (55_usize).to_scalar(); + let e1 = Scalar::from(7_usize); + let e2 = Scalar::from(23_usize); + let e3 = Scalar::from(55_usize); let evals = vec![e0, e1, e2, e3]; let poly = UniPoly::from_evals(&evals); @@ -165,9 +159,9 @@ mod tests { assert_eq!(poly.eval_at_one(), e1); assert_eq!(poly.coeffs.len(), 4); assert_eq!(poly.coeffs[0], Scalar::one()); - assert_eq!(poly.coeffs[1], (3_usize).to_scalar()); - assert_eq!(poly.coeffs[2], (2_usize).to_scalar()); - assert_eq!(poly.coeffs[3], (1_usize).to_scalar()); + assert_eq!(poly.coeffs[1], Scalar::from(3_usize)); + assert_eq!(poly.coeffs[2], Scalar::from(2_usize)); + assert_eq!(poly.coeffs[3], Scalar::from(1_usize)); let hint = e0 + e1; let compressed_poly = poly.compress(); @@ -176,7 +170,7 @@ mod tests { assert_eq!(decompressed_poly.coeffs[i], poly.coeffs[i]); } - let e4 = (109_usize).to_scalar(); - assert_eq!(poly.evaluate(&(4_usize).to_scalar()), e4); + let e4 = Scalar::from(109_usize); + assert_eq!(poly.evaluate(&Scalar::from(4_usize)), e4); } } From ec3be5d9c17122ab665405d4aaaeeae9d1232cf9 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Tue, 21 Jan 2025 10:52:13 -0800 Subject: [PATCH 49/54] Incorporate new documentation --- docs/spartan_parallel.md | 368 ++++++++++++++++++++++++++++++----- docs/spartan_parallel_old.md | 75 +++++++ 2 files changed, 391 insertions(+), 52 deletions(-) create mode 100644 docs/spartan_parallel_old.md diff --git a/docs/spartan_parallel.md b/docs/spartan_parallel.md index 2225f442..efce8796 100644 --- a/docs/spartan_parallel.md +++ b/docs/spartan_parallel.md @@ -1,75 +1,339 @@ # Spartan Parallel ## Overview -`spartan_parallel` takes in circuits and witnesses of the blocks produced by `circ_blocks`, and generates and verifies a SNARK proof on the correct execution of the program code. One can treat `spartan_parallel` as a two-step process: first it emits 5 different (groups of, should really be number of blocks + 4) circuits based on the blocks and an execution trace, then it evokes a data-parallel proving process on those 5 circuits. +`spartan_parallel` takes in circuits and witnesses of the blocks produced by `circ_blocks`, and generates and verifies a SNARK proof on the correct execution of the program code. The process of `spartan_parallel` can be divided into the following stages: +- (Compile Time) Circuit preprocessing and commitment +- (Runtime) Witness preprocessing and commitment +- (Runtime) Sumcheck on all circuits and all instances +- (Runtime) Opening on witness and circuit commitments +- (Runtime) Shift and program IO proofs ## High-Level Idea -The program is executed correctly iff all of the following holds: +The program, when divided into blocks, is executed correctly iff all of the following holds: 1. All blocks of the program are executed correctly 2. All registers (including the label of the next block) are passed correctly between blocks. 3. The memory state (read-only and RAM) stays coherent throughout the execution. -Statement 1 can be checked directly through the block-specific circuits emitted by `circ_blocks`, while statement 2 and 3 can be checked by "extracting" inputs, outputs, and memory accesses out of block witnesses and check that they are pairwise consistent. `spartan_parallel` achieves so by generating "extraction circuits" and "consistency check circuits" based on compile-time metadata (number of inputs, outputs, and number of memory accesses per block). Furthermore, all three statements require witnesses to be arranged in different orders (statement 1 by block type, statement 2 by execution time, statement 3 by memory address), `spartan_parallel` inserts "permutation circuits" to verify the permutation between all three ordering: construct three univariate polynomials and test their equivalence by evaluating on a random point. [Let me know if this does not make sense!] +Statement 1 can be checked directly through the block-specific circuits emitted by `circ_blocks`, while statement 2 and 3 can be checked by "extracting" inputs, outputs, and memory accesses out of block witnesses and check that they are pairwise consistent. `spartan_parallel` achieves so by generating "extraction circuits" and "consistency check circuits" based on compile-time metadata (number of inputs, outputs, and number of memory accesses per block). Furthermore, all three statements require witnesses to be arranged in different orders (statement 1 by block type, statement 2 by execution time, statement 3 by memory address), `spartan_parallel` inserts "permutation circuits" to verify the permutation between all three ordering: construct three univariate polynomials and test their equivalence by evaluating on a random point. However, to ensure that the same set of witnesses are used by both block correctness check and permutation check, the prover needs to use the same commitment for both proofs. To prevent excessive commitment opening, `spartan_parallel` commits the overlapping witnesses of block correctness and permutation separately. -Please refer to [instance.rs](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs) for details of the circuits. +## Circuit Preprocessing and Commitment (Compile Time) +> Relevant files: `examples/interface.rs`, `src/instance.rs`, and `src/r1csinstance.rs` -## Inputs and Circuit Generation -At preprocessing stage, `spartan_parallel` reads in the following [inputs](https://github.com/Jiangkm3/spartan_parallel/blob/master/examples/interface.rs#L45): -- Circuits of each basic block -- Number of inputs, outputs, and memory operations of each block, as well as where these values are stored within the witnesses. -- Max number of registers that need to be passed from one block to another -- Max number of read-only memory accesses within a block -- Max number of RAM accesses within a block +### Inputs from `circ_blocks` +> Relevant struct: `CompileTimeKnowledge` in `examples/interface.rs` -Through the above inputs, `spartan_parallel` emits the following circuits during the preprocessing stage: -1. `BLOCK_CORRECTNESS` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L246)): verifies the correct execution of every block and "extracts" (constructs the polynomials) inputs, outputs, and all memory values out of each block. -2. `CONSIS_CHECK` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L545)): checks that when sorted in execution order, the output of the previous block matches with the input of the next block. This is performed similarly to an offline memory check. -3. `PHY_MEM_COHERE` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L545)): checks that the read-only memory accesses are coherent via an offline memory check. -4. `VIR_MEM_COHERE` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L545)): checks that all RAM accesses are coherent via an offline memory check. -5. `PERM_ROOT` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L761)): performs permutation check by constructing the polynomials of inputs and memory entries in execution / address order (block type order is handled in `BLOCK CORRECTNESS`) +At compile time, `spartan_parallel` reads in from `circ_blocks` through the struct `CompileTimeKnowledge`, including the R1CS circuit for each block (`args`) and all relevant metadata (number of inputs, witnesses, memory operations, etc. per block). -## Verify Sumcheck in Parallel -### Spartan Overview -The main idea behind Spartan is to use _two sumcheck protocols_ to assert the correctness of an R1CS equation: `Az * Bz - Cz = 0`. Let `A`, `B`, `C` be circuits of size `M * N`, and subsequently `z` be a satisfying assignment of length `N`. The goal is to prove +The circuit of each block $\mathcal{C}_i = (A, B, C)_i$ is designed to be satisfied by a witness $z_i$ of the following form: $$ -\forall_{x, y}, A(x, y)z(y) \cdot B(x, y)z(y) - C(x, y)z(y) = 0 +z_i = i_i || o_i || p_i || v_i || w_i $$ +where +* $i_i$ and $o_i$ are the inputs and outputs of the block, and should match with the outputs and inputs of the previous and next block. $i_i$ and $o_i$ also contain the block label for the current and next block to check that the prover always executes the correct block. +* $p_i$ records all stack accesses of the block through a list of $(addr_j, data_j)$. All $(addr_j, data_j)$ of all blocks are used to verify the coherence of a write-once memory. +* $v_i$ records all heap accesses of the block through a list of $(addr_j, data_j, ts_j, ls_j)$. All entries of all blocks are used to verify the coherence of a regular (write-many) memory. +* $w_i$ contains all other intermediate computations used by the block. -Sumcheck 1 invokes `m = log(M)` rounds to prove that given `Az`, `Bz`, `Cz` supplied by the prover, -$$ -\sum_{x\in \{0, 1\}^m} \tilde{eq}(\tau, x)(\tilde{Az}(x)\cdot \tilde{Bz}(x) - \tilde{Cz}(x)) = 0 -$$ -Sumcheck 1 reduces the above equation down to three claims: $v_a = \tilde{Az}(r_x)$, $v_b = \tilde{Bz}(r_x)$, $v_c = \tilde{Cz}(r_x)$. Sumcheck 2 then uses `n = log(N)` rounds to prove that `Az`, `Bz`, and `Cz` are computed correctly: -$$ -r_a v_a + r_b v_b + r_c v_c = \sum_{y\in \{0, 1\}^n} (r_a\cdot \tilde{A}(r_x, y) + r_b\cdot \tilde{B}(r_x, y) + r_c\cdot \tilde{C}(r_x, y))\cdot \tilde{z}(y) -$$ -where $r_a$, $r_b$, and $r_c$ are challenges provided by the verifier. Finally, prover opens $\tilde{A}(r_x, r_y)$, $\tilde{B}(r_x, r_y)$, $\tilde{C}(r_x, r_y)$, and $\tilde{z}(r_y)$ through polynomial commitment. +### Expanding and Generating Circuits +> Relevant struct: `Instance` in `src/instance.rs` -### Expanding Spartan to `spartan_parallel` -We expand Spartan to support `P` circuits, each with `Q_i` satisfying assignments (equivalent to `p\P` blocks, each executed `Q_i` times). The goal is now to prove -$$ -\forall_{i, j, x, y}, A_i(x, y)z_{i, j}(y) \cdot B_i(x, y)z_{i, j}(y) - C_i(x, y)z_{i, j}(y) = 0 -$$ +A prover of `spartan_parallel` needs to show the following: +1. For every block $i$, the witness generated from every execution $j$ of that block $z_{i, j}$ satisfies $\mathcal{C}_i$. (_block correctness_) +2. After permutating $(i_{i, j}, o_{i, j})$ into execution order $(i'_k, o'_k)$, we have $i'_k = o'_{k-1}$ for all $k \neq 0$. (_consistency_) +3. After permutating $p_{i, j} = \{(addr_{i, j, 0}, data_{i, j, 0}), (addr_{i, j, 1}, data_{i, j, 1}), \dots\}$ by address into $p'_k = (addr'_k, data'_k)$, $p'_k$ satisfies (_physical mem coherence_) +$$addr'_{k - 1} + 1 = addr'_k \vee (addr'_{k - 1} = addr'_k \wedge val'_{k - 1} = val'_k)$$ +4. After permutating $v_{i, j}$ into $v'_k$, $v'_k$ satisfies memory coherence (_virtual mem coherence_) -Let `Q_max = max_i Q_i`, prover provides `Az`, `Bz`, `Cz` as $P \times Q_i \times X$ tensors. Note that they are conceptually equivalent to vectors of length $P \cdot Q_{\text{max}} \cdot X$, but the special [tensor data structure](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/custom_dense_mlpoly.rs#L22) allows the prover to skip evaluations on the $Q_{\text{max}} - Q_i$ unused "zero" entries within the dense polynomial. [Sumcheck 1](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/r1csproof.rs#L320) now requires `log(P) + log(Q_max) + log(X) = p + q_max + x` rounds to prove that -$$ -\sum_{i\in \{0, 1\}^p, j\in \{0, 1\}^{q_\text{max}}, x\in \{0, 1\}^m} \tilde{eq}(\tau, i || j || x)(\tilde{Az}(i, j, x)\cdot \tilde{Bz}(i, j, x) - \tilde{Cz}(i, j, x)) = 0 -$$ -Note that to fully utilize the tensor structure and avoid the prover paying for $P\times Q_\text{max}\times X$ evaluations, this sumcheck is performed in the following order: -1. First on bits of $X$ (most significant to least significant) -2. Then on bits of $Q$ in _reverse order_ (from least significant to most significant) -3. Finally on bits of $P$ (most significant to least significant) +We note that the above steps imply the following additional procedures: -This is necessary because if the evaluation begins with bits of $P$ or the most significant bit of $Q$, then the $Q_{\text{max}} - Q_i$ unused entries are no longer zero in the next round. To accomodate for the reverse evaluation in $Q$, entries $\tilde{Az}$, $\tilde{Bz}$, and $\tilde{Cz}$ are also stored in reverse-bits-of-$Q$ order. This allows the final claims to be in the correct order: $v_a = \tilde{Az}(r_i, r_j, r_x)$, $v_b = \tilde{Bz}(r_i, r_j, r_x)$, $v_c = \tilde{Cz}(r_i, r_j, r_x)$. +5. Every $(i_{i, j}, o_{i, j}, p_{i, j}, v_{i, j})$ is correctly extracted from $z_{i, j}$ +6. The sets of $\{i_{i, j}, o_{i, j}\}$, $\{p_{i, j}\}$, $\{v_{i, j}\}$ are permutations of $\{i'_k, o'_k\}$, $\{p'_k\}$, and $\{v'_k\}$ +Permutations are checked via grand product proofs. Thus step 6 can be further divided into -[Sumcheck 2](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/r1csproof.rs#L462) now requires `log(P) + log(Y) = p + y` rounds to check `Az`, `Bz`, and `Cz` for every `A`, `B`, and `C`. To do so, the prover first computes $\tilde{z}_{r_j}(i, y) = \tilde{z}(i, r_j, y)$, then proves: -$$ -r_a v_a + r_b v_b + r_c v_c = \sum_{i\in \{0, 1\}^p, y\in \{0, 1\}^n} \tilde{eq}(r_i, i)\cdot (r_a\cdot \tilde{A}(i, y) + r_b\cdot \tilde{B}(i, y) + r_c\cdot \tilde{C}(i, y))\cdot \tilde{z}_{r_j}(i, y) -$$ -Note that we cannot directly evaluate $\tilde{A}(r_p, y)$, etc. as that results in the equation becoming quadratic in terms of $r_p$. Thus an additional `p` rounds are introduced to flatten $r_p$. This introduces `p` new challenges. We denote the challenges generated in sumcheck 2 ($r_i', r_y$). +* (6a) $RLC_{i, o} = \prod_{i, j} (\tau - f(i_{i, j}) - r\cdot f(o_{i, j}))$, where $\tau$ and $r$ are random numbers and $f$ is a random linear combination (see consistency below). Compute $RLC_p = \prod_{i, j} (\tau - f(p_{i, j}))$, $RLC_v = \prod_{i, j} (\tau - f(v_{i, j}))$. +* (6b) $RLC'_{i, o} = \prod_k (\tau - f(i'_k) - r\cdot f(o'_k))$. Compute $RLC'_p$, $RLC'_v$ as well. +* (6c) Assert that $RLC_{i, o} = RLC'_{i, o}$, $RLC_p = RLC'_p$, $RLC_v = RLC'_v$. + +Since the prover has computed $f(i'_k)$ and $f(o'_k)$ during permutation, it can use them for consistency check. We can rewrite _consistency_ as: + +2. $f(i'_k) = f(o'_{k-1})$ for all $k \neq 0$. (_consistency_) + +_Remark_: $(i'_k, o'_k)$, $p'_k$, and $v'_k$ will be padded with 0 to the next power of 2, so consistency and coherence checks will have additional constraints to handle these 0 entries. + +We can now generate all the circuits we need: + +* A set of circuits ($\mathcal{C}'_i$) that checks step 1, 5, and 6a for each block $i$. These circuits are modified from $\mathcal{C}_i$ to add the rlc function $f$ and polynomial evaluation. As a result, its satisfying assignments $z'_{i, j}$ also requires modification from $z_{i, j}$, to the following form: +$$z'_{i, j} = (z_{i, j}, r, rz_{i, j}, \pi_{i, j}, \pi'_{i, j})$$ +- where + - $r$ is the randomness used by $f$ and $\tau$ + - $rz_{i, j}$ records intermediate computations for $\tau - f(i_{i, j}) - r\cdot f(o_{i, j})$, $\tau - f(p_{i, j})$, and $\tau - f(v_{i, j})$ + - $\pi_{i, j}$ stores $\tau - f(i_{i, j}) - r\cdot f(o_{i, j})$, $\tau - f(p_{i, j})$, and $\tau - f(v_{i, j})$, as well as their cumulative product that forms $RLC_{i, o}$, $RLC_p$, $RLC_v$. + - $\pi'_{i, j}$ is a shifted version of $\pi_{i, j}$, used to help compute the cumulative product. See _shift proofs_ section. +- To allow for each segment of $z'_{i, j}$ to be committed separately, `spartan_parallel` _conceptually_ pads each segment with 0's to the same length as $z_{i, j}$. Note that these pads are never materialized and can be skipped during actual computation. Since $z'_{i, j}$ also needs to be padded to a power of 2, this implies $|z'_{i, j}| = 8 \times |z_{i, j}|$ + +* A consistency circuit $\mathcal{C}_c$ for step 2 ($f(i'_k) = f(o'_{k-1})$). +* Stack and heap verification circuits $\mathcal{C}_p$, $\mathcal{C}_v$ for step 3 and 4. +* A permutation circuit $\mathcal{C}_\pi$ for step 6b. + +Note that the verifier can check 6c efficiently without sumcheck. +Also, $\mathcal{C}'_i$ are the larger circuits while $\mathcal{C}_c$, $\mathcal{C}_p$, $\mathcal{C}_v$, $\mathcal{C}_\pi$ are small and easily parallelizable. + +### Committing Circuits through Sparse Poly Commitment +> Relevant functions: +* `next_group_size` in `src/instance.rs` +* `gen_block_inst` in `src/instance.rs` +* `SNARK::multi_encode` in `src/lib.rs` +* `R1CSInstance::multi_commit` in `src/r1csinstance.rs` +* `R1CSInstance::multi_evaluate` in `src/r1csinstance.rs` + +The previous steps generate in total $b + 4$ circuits of various sizes, where $b$ is the number of blocks. Our circuit commitment follows the existing batched sparse polynomial commitment scheme of Spartan. However, with circuits of different sizes, we want to only pay proportional to the approximate size of each circuit. The solution is to divide circuits of different sizes into groups and commit each groups separately. + +Let each circuit $\mathcal{C}_i$ be of size $M_i\times N_i$ with $L_i$ non-zero entries. We assume that $M_i$ and $N_i$ are of similar sizes and $N_i$ and $L_i$ are roughly proportional to each other. +For each commitment, the prover pays for $O(L)$ time to generate a proof of size $O(\log(N) + \log(L))$. + +Our strategy is thus to group the circuits by the size of $N_i$. For each circuit $i$, the prover rounds its $N_i$ to the nearest power of 16 (or some other adjustable value) and put it in the corresponding group. For each group $j$, the prover computes the maximum $M_j$, $N_j$ and $L_j$ within the group, and batch commits every circuit of that group as $M_j \times N_j$ with $L_j$ non-zero entries. + +There is, however, a problem with this approach with regard to the modified block circuits $\mathcal{C}'_i$. Recall that each $\mathcal{C}'_i$ matches with an assignment $z'_{i, j}$ of 5 segments: +$$z'_{i, j} = (z_{i, j}, r, rz_{i, j}, \pi_{i, j}, \pi'_{i, j})$$ +each segment padded to the length of the block witness $|z_{i, j}|$. To perform the same sumcheck across all blocks, the size of all circuits needs to be _conceptually_ equivalent. (e,g, let $z_\text{max} = \max_{i, j} |z_{i, j}|$, for every block, $r[0] \leftrightarrow z'_{i, j}[z_\text{max}]$, $rz_{i, j}[0] \leftrightarrow z'_{i, j}[2\times z_\text{max}]$, etc.). However, for blocks of a different size, the padding size is different, and thus $r[0]$ will not always be the same entry of $z'_{i, j}$. + +The solution is to provide the prover with two versions of each block circuit (toggled by `COMMIT_MODE` in `gen_block_inst`). In the _sumcheck version_, every circuit is of the same $M_{\text{max}} = \max{M}$ and $N_{\text{max}} = \max{N}$. In the _commit version_, every circuit has $M$ and $N$ according to their group. Note that the prover's time and space cost to process a circuit is linear to their number of non-zero entries, which is the same for both versions. The prover can thus use the sumcheck version to perform the sumcheck of all blocks together, and use the commit version to reduce the time size of the commitment. + +The discrepancy between the two versions requires additional handling of commitment opening. The sumcheck produces two lists of challenges corresponding to the two dimensions of the circuit: $|rx| = \log M_{\text{max}}$, $|ry| = \log N_{\text{max}}$. On the constraint side, if $M_j < M_{\text{max}}$, the prover divides $rx \to rx_\text{pad} || rx_\text{eval}$. On the witness side, if $N_j < N_{\text{max}}$, the prover divides $ry\to ry_\text{comb} || ry_\text{pad} || ry_\text{eval}$. We describe each section: +* $rx_\text{pad}$ has length $(\log M_{\text{max}} - \log M_j)$ are the "extra" challenges +* $rx_\text{eval}$ has length $\log M_j$ are evaluated on the commitment +* $ry_\text{comb}$ has length-3 is used to combine the 5 (8) different segments of witnesses +* $ry_\text{pad}$ has length $(\log N_{\text{max}} - 3 - \log N_j)$ are the "extra" challenges on each segment. By placing $ry_\text{comb}$ in front of $ry_\text{pad}$, the prover resolves the issue where witness segments are padded to a different length in the commit version and the sumcheck version. +* $ry_\text{eval}$ has length $\log N_j$ are evaluated on the commitment. + +Thus, +$$\mathcal{C}_\text{sumcheck}(rx || ry) = (\prod_{r\in rx_\text{pad} || ry_\text{pad}} 1 - r) \cdot \mathcal{C}_\text{commit}(rx_\text{eval} || ry_\text{comb} || ry_\text{eval})$$ + +So the opening is performed on $(rx_\text{eval} || ry_\text{comb} || ry_\text{eval})$, and the verifier checks the result by computing and multiplying by $\prod_{r\in rx_\text{pad} || ry_\text{pad}} (1 - r)$. + +## Witness Preprocessing and Generation +> Relevant files: `examples/interface.rs` and `src/lib.rs` + +### Inputs from `circ_blocks` +> Relevant struct: `RunTimeKnowledge` in `examples/interface.rs` + +At runtime, `spartan_parallel` reads in from `circ_blocks` through the struct `RunTimeKnowledge`, which describes all the witnesses generated from the blocks: +* `block_vars_matrix`: all the inputs, outputs, memory accesses, and intermediate computations of every block executions, grouped by type of blocks. +* `exec_inputs`: all the inputs and outputs of every block, sorted by execution time. +* `init_phy_mems_list`, `init_vir_mems_list`: memory accesses that sets up the initial memory state, in any order. +* `addr_phy_mems_list`, `addr_vir_mems_list`: memory accesses throughout the program execution (including initialization), ordered by address. +* `addr_ts_bits_list`: bit split of timestamp difference, used by memory coherence check. + +### Circuit Sorting +> Relevant sections: `BLOCK SORT` and `PAIRWISE SORT` of `src/lib.rs` + +As later illlustrated by polynomial binding, the most efficient parallel proof requires the circuits (blocks) to be sorted by decreasing order of number of instances (executions). When the circuits are generated at compile time, however, the number of executions on each block is unknown. As such, during runtime, the prover and the verifier needs to re-order the block circuits and commitments based on their number of execution. The same sort is also performed on register consistency, stack, and heap coherence circuits according to their number of instances: `consis_num_proofs`, `total_num_phy_mem_accesses`, and `total_num_vir_mem_accesses`. + +### Witness Preprocessing and Commitment +> Relevant section: `CHALLENGES AND WITNESSES FOR PERMUTATION` of `src/lib.rs` + +Apart from the witnesses provided by each block execution, the prover also needs to compute additional witnesses used by permutation and consistency checks. This includes, most notably: +* `perm_w0 = [tau, r, r^2, ...]`: the randomness used by the random linear permutation. This value is can be efficiently generated by the verifier and does not require commitment. +* `block_w2`, `perm_exec_w2`, `phy_mem_w2`, `vir_mem_w2`: intermediate values used to compute random linear combinations. +* `block_w3`, `perm_exec_w3`, `phy_mem_w3`, `vir_mem_w3`: RLC and cumulative product of RLC. Each is consisted of $w3_k = [v_k, x_k, \pi_k, D_k, ri_k, ro_k]$, where + - $v_k$ is the valid bit, set to 0 if this particular $w3$ is a pad. If $v_k$ is 0, then every entry of $w3_k$ is 0. + - $x_k$ is the random linear combination of $(i_k, o_k)$, $p_k$, or $v_k$ + - $\pi_k$ is the cumulative product $\prod_{p \geq k}x_p$, computed as $\pi_k = v_k\cdot D_k$ + - $D_k$ is an intermediate variable: $D_k = x_k \cdot (\pi_{k+1} + (1 - v_{k+1}))$ + - $ri_k$ and $ro_k$ are only used by register transition to record the RLC of $i_k$ and $o_k$ individually +* `block_w3_shifted`, `perm_exec_w3_shifted`, `phy_mem_w3_shifted`, `vir_mem_w3_shifted`: each $w3$ shifted by one row. This is so that $D_k$ can obtain $\pi_{k+1}$ and $v_{k+1}$ for its computation. See shift proofs section for more details. + +All witnesses are committed using regular dense polynomial commitment schemes. `block_vars_matrix`, `block_w2`, `block_w3`, and `block_w3_shifted` are committed by each type of block. We note that we can use tricks similar to circuit commitment above to batch commit and batch open witness commitments. + +### Summary on Commitments +In total, `spartan_parallel` needs to commmit to the following items: +#### Compile time (all sparse polynomials) +* `BLOCK_CORRECTNESS`: `num_block` circuits of size `num_cons_per_block[i] * (8 * num_vars_per_block[i])` +* `CONSIS_CHECK`: one consistency circuit of size `1 * 16` +* `PHY_MEM_COHERE`: one stack coherence circuit of size `4 * 8` +* `VIR_MEM_COHERE`: one heap coherence circuit of size `(8 + max_ts_width) * (4 * max_ts_width)`, where `max_ts_width` is the number of bits required to express the heap access timestamp +* `PERM_ROOT`: one permutation circuit of size `(num_ios + 4) * (4 * num_ios)` +#### Runtime, round 1 (commitment hash required to generate RLC challenges) +* `block_vars`: $P$ instances of `block_num_proofs[i] * num_vars_per_block[i]` +* `exec_inputs`: `consis_num_proofs * num_ios` +* `init_phy_mems_list`: `total_num_init_phy_mem_accesses * 4` +* `addr_phy_mems_list`: `total_num_phy_mem_accesses * 4` +> _XXX: we should be able to reduce the length to `total_num_phy_mem_accesses * 2`._ +* `init_vir_mems_list`: `total_num_init_vir_mem_accesses * 8` +* `addr_vir_mems_list`: `total_num_vir_mem_accesses * 8` +> _XXX: we should be able to reduce the length to `total_num_phy_mem_accesses * 4`._ +* `addr_ts_bits_list`: `total_num_vir_mem_accesses * mem_addr_ts_bits_size` +#### Runtime, round 2 (witnesses computed from RLC challenges) +* `block_w2`: $P$ instances of `block_num_proofs[i] * (num_ios + block_num_phy_ops[i] + block_num_vir_ops[i])` +* `block_w3`, `block_w3_shifted`: $P$ instances of `block_w3_shifted`: `block_num_proofs[i] * 8` +* `perm_exec_w2`: `consis_num_proofs * num_ios` +* `perm_exec_w3`, `perm_exec_w3_shifted`: `consis_num_proofs * 8` +* `phy_mem_addr_w2`: `total_num_phy_mem_accesses * 4` +> _XXX: we should be able to reduce the length to `total_num_phy_mem_accesses * 2`._ +* `phy_mem_addr_w3`, `phy_mem_addr_w3_shifted`: `total_num_phy_mem_accesses * 8` +* `vir_mem_addr_w2`: `total_num_vir_mem_accesses * 8` +> _XXX: we should be able to reduce the length to `total_num_phy_mem_accesses * 4`._ +* `vir_mem_addr_w3`, `vir_mem_addr_w3_shifted`: `total_num_vir_mem_accesses * 8` + + +## Sumcheck Proof on Circuits and Instances +> Relevant files: `src/customdensepolynomial.rs`, `src/r1csproof.rs` and `src/sumcheck.rs` + +The main section of `spartan_parallel` is consisted of three proofs, each with its own sumcheck and commitment opening. Each proof handles: +1. Block correctness and grand product on block-ordered witnesses +2. Transition state consistency and stack and heap coherence +3. Grand product on execution-ordered and memory-ordered witnesses + +_XXX: The proofs were divided due to the different sizes of the circuits. However, this problem has since been resolved and one should be able to combine all the proofs together._ + +Without loss of generosity, we use the block correctness proof (proof 1) to illustrate details of an R1CS proof. Recall that the goal of block correctness proof is to test the satisfiability of each $z'_{i, j}$ on each modified block circuit $\mathcal{C'}_i = (A', B', C')_i$, where +$$z'_{i, j} = (z_{i, j}, r, rz_{i, j}, \pi_{i, j}, \pi'_{i, j})$$ +We denote the following parameters for the proof: +* $P$ (`num_instances`): number of circuits. +* $Q_i$ (`num_proofs`): number of assignments to each circuit $i$. +* $X$ (`num_cons`): _maximum_ number of constraints of any circuit. +* $W$ (`num_witness_secs`): number of padded segments of $z'_{i, j}$. In this case, $W = 5$. +* $Y$ (`max_num_inputs`): _maximum_ number of witnesses of any circuit. + +We use the lowercase version of each variable to denote their logarithmic value rounded up (e.g. $p = \log P$). Below we walkthrough the proving process of `spartan_parallel`. + +The goal of Spartan is to prove that $Az \cdot Bz - Cz = 0$. This is separated into two sumchecks: +* Sumcheck 1 proves that given purported polynomial extensions $\tilde{Az}, \tilde{Bz}, \tilde{Cz}$, +$$\sum \tilde{\text{eq}} \cdot (\tilde{Az} \cdot \tilde{Bz} - \tilde{Cz}) = 0$$ +* Sumcheck 2 proves that given purported polynomial extensions $\tilde{A}, \tilde{B}, \tilde{C}, \tilde{z}$, + $$(r_A\cdot \tilde{A} + r_B\cdot \tilde{B} + r_C\cdot \tilde{C})\cdot \tilde{z} = r_A\cdot \tilde{Az} + r_B\cdot \tilde{Bz} + r_C\cdot \tilde{Cz}$$ +for some random $r_A$, $r_B$, $r_C$. + +To implement data-parallelism, we divide Spartan into the following steps. + +### Combining Witnesses Together +> Relevant file: `src/r1csproof.rs` + +While in regular Spartan, $Az$ is simply a length-$X$ vector, obtained by multiplication of a $X\times Y$ matrix $A$ by a length-$Y$ vector $z$, the data-paralleled version is slightly more complicated. + +The prover's first task is to construct a $P\times Q_i\times W\times Y_i$ struct `z_mat` through a 4-dimensional vector. This is, conceptually, piecing together $W$ different witnesses of size $P\times Q_i\times Y_i$ together. In the case of block correctness proof $\mathcal{C}_i$, where +$$z'_{i, j} = (z_{i, j}, r, rz_{i, j}, \pi_{i, j}, \pi'_{i, j})$$ +$z, rz, \pi, \pi'$ are different for each circuit and each instance, and thus can be naturally expressed as $P\times Q_i\times Y_i$ vectors. $r$, which is the randomness used by RLC, however, is the same across all circuits and instances, and thus needs to be copied $P\times Q_i$ times. We note that this construction presents opportunities and challenges: on one hand, since every evaluation on the $r$ polynomial is the same, bindings on the $P$ and $Q_i$ dimensions are free, and thus it does not require a commitment opening proof; on the other hand, for this binding shortcut to work, $r$ needs to be the same on all $2^{q_i}$ bases, so $Q_i$ has to be a power of 2 (technically $P$ also needs to be a power of 2, but since $P$ is small, the verifier can manually bind $p$ variables to a polynomial). + +> To provide more intuition on this problem, assume that for some circuit $i$, $Q_i$ is not a power of 2. Let $Q_\text{pad}$ be the next power of 2 of $Q_i$, the sumcheck still needs to operate for $q_\text{pad}$ rounds on a vector of size $Q_\text{pad}$. What one can do, however, is to set entries $Q_i$ to $Q_\text{pad}$ to 0. If the prover needs to access any of these entries, it already knows that they are 0, and can skip the memory access and any multiplication on it. The problem with $r$ is that every entry needs to be the same (to skip the binding), and thus entries $Q_i$ to $Q_\text{pad}$ cannot be zero. + +From the construction we can deduce that the size of $Q_i$ and $Y_i$ depends on the entry of the $P$ dimension, while the size of $W$ does not. Further, even though sumcheck requires the size of each dimension to be _conceptually_ a power of 2, `z_mat` allows vectors on the $P, W, Y_i$ dimensions to only store the non-zero entries at the front. + +> XXX: current construction pads $Y_i$ to a power of 2, pending improvements. Moreover, there are no fundamental challenges to trim the $Q_i$ dimension, except that they make the code a lot messier and hard to parallelize. + +### Obtaining $\tilde{Az}, \tilde{Bz}, \tilde{Cz}$ +> Relevant files: `src/r1csinstance.rs` and `src/customdensepolynomial.rs` + +To obtain $Az$, $Bz$, $Cz$, the prover treats `z_mat` as $P$ counts of $Q_i \times (W \cdot Y_i)$ matrices. Since $A$, $B$, $C$ can be expressed as $P$ counts of $X_i\times (W \cdot Y_i)$ matrices, this allows the prover to perform $P$ matrix multiplications to obtain $P \times Q_i \times X_i$ tensors $Az$, $Bz$, $Cz$ and their MLE $\tilde{Az}$ (`poly_Az`), $\tilde{Bz}$, $\tilde{Cz}$. This process is described in `R1CSinstance::multiply_vec_block`. Note that: +* Conceptually, `poly_Az` of every block $i$ has $p + q_\text{max} + x_\text{max}$ variables. However, the value of the variables indexed at $[p, p + q_\text{max} - q_i)$ and $[p + q_\text{max}, p + q_\text{max} + x_\text{max} - x_i)$ does not affect the evaluation for parts of the polynomial. +* Each circuit $i$ has different $Q_i$ and $X_i$, so $Az$ is expressed as a 3-dimensional vector, and the prover stores its MLE in a concise structure `DensePolynomialPqx`. + +#### Bindings on a `DensePolynomialPqx` +> Relevant function: `DensePolynomialPqx::evaluate` + +`DensePolynomialPqx` is expressed as a 4-dimensional vector `Z` ($P\times Q_i\times W\times X_i$) and its relevant metadatas. However, every invocation of `DensePolynomialPqx` in the proof only uses 3 of the 4 dimensions, which are: +* `poly_Az`, `poly_Bz`, `poly_Cz`: uses $P$, $Q_i$ and $X_i$ dimension (so $W$ dimension always have length-1) +* `ABC_poly` binded to `rx`: uses $P$, $W$ and $X_i$ dimensions. Note that the $X_i$ dimension stores the witnesses and is actually the $Y_i$ dimension, but it behaves the same way as $X_i$. +* `Z_poly` binded to `rq`: uses $P$, $W$ and $X_i$ dimensions, where $X_i$ is again $Y_i$. + +A `DensePolynomialPqx` can, however, contain all 4 dimensions. A full evaluations thus requires the binding of $p + q_\text{max} + w + x_\text{max}$ variables, which we divide into 4 sections: $r_p, r_q, r_w, r_x$. + +We first note that binding from left to right can cause inefficiencies. This is because each binding on a variable of the $P$ dimension merges two vectors on the $Q_i$ dimension, which may be of different lengths, into a single vector of the longer length. As for a toy example, assume that a polynomial $G$ only has 2 dimensions $P\times Q_i$, and let $P = 4$ and $Q_i = [4, 4, 2, 2]$. The polynomial would thus contain 4 variables: +$$\tilde{G}(x_{p, 0}, x_{p, 1}, x_{q, 0}, x_{q, 1})$$ + +Binding $x_{p, 0}$ to $r$ is equivalent to the following operations: +$$G_0 = \langle(1 - r)\cdot G_{0, 0} + r\cdot G_{2, 0}, (1 - r)\cdot G_{0, 1} + r\cdot G_{2, 1}, (1 - r)\cdot G_{0, 2}, (1 - r)\cdot G_{0, 3}\rangle$$ +$$G_1 = \langle(1 - r)\cdot G_{1, 0} + r\cdot G_{3, 0}, (1 - r)\cdot G_{1, 1} + r\cdot G_{3, 1}, (1 - r)\cdot G_{1, 2}, (1 - r)\cdot G_{1, 3}\rangle$$ + +Since $Q_2 = Q_3 = 2$, $G_{2, 2}, G_{2, 3}, G_{3, 2}, G_{3, 3}$ are all 0s, so the prover does not access nor perform operations on them. As a result, in the first round, the prover's work is $\sum_i Q_i = 12$ multiplications. However, after the first round, the prover is left with $P = 2$ and $Q_i = [4, 4]$. So its work binding $x_{p, 1}$ would be 8 multiplications. + +Now consider the alternative of binding $x_{q, 1}$ first. All bindings are performed within the $Q$ dimension: +$$G_0 = \langle(1 - r)\cdot G_{0, 0} + r\cdot G_{0, 1}, (1 - r)\cdot G_{0, 2} + r\cdot G_{0, 3}\rangle$$ +$$G_1 = \langle(1 - r)\cdot G_{1, 0} + r\cdot G_{1, 1}, (1 - r)\cdot G_{1, 2} + r\cdot G_{1, 3}\rangle$$ +$$G_2 = \langle(1 - r)\cdot G_{2, 0} + r\cdot G_{2, 1}\rangle$$ +$$G_3 = \langle(1 - r)\cdot G_{3, 0} + r\cdot G_{3, 1}\rangle$$ + +This again costs 12 multiplications. However, this time it leaves us with $P = 4$ and $Q_i = [2, 2, 1, 1]$, and the next binding of $x_{q, 0}$ costs only 6 multiplications. + +As a result, binding on `DensePolynomialPqx` is always performed from right to left. Binding on an $r_x$ variable, for instance, would translate to: +``` +max_num_inputs = max_num_inputs.div_ceil(2) +for p in 0..num_instances: + for q in 0..num_proofs[p]: + for w in 0..num_witness_secss: + num_inputs[p] = num_inputs[p].div_ceil(2) + for x in 0..num_inputs[p]: + Z[p][q][w][x] = (1 - r) * Z[p][q][w][2 * x] + if 2 * x + 1 < Z[p][q][w].len(): + Z[p][q][w][x] += r * Z[p][q][w][2 * x + 1] +``` +which merges entry $2x$ and $2x+1$ into entry $x$. Note that if `num_inputs[p] = 1`, then the binding simply multiplies the first and only entry by $1-r$. + +### Sumcheck 1 +> Relevant functions: `R1CSProof::prove_phase_one` and `SumcheckInstanceProof::prove_cubic_with_additive_term_disjoint_rounds` + +Similar to the regular Spartan, sumcheck 1 is of the following form: +$$\sum_{\tau\in\{0, 1\}^{p + q_\text{max} + x_\text{max}}} \tilde{\text{eq}}(\tau) \cdot (\tilde{Az}(\tau) \cdot \tilde{Bz}(\tau) - \tilde{Cz}(\tau)) = 0$$ + +Except that $\tilde{Az}$, $\tilde{Bz}$, and $\tilde{Cz}$ are now $(p + q_\text{max} + x_\text{max})$-variate polynomials, which means the sumcheck involves $p + q_\text{max} + x_\text{max}$ rounds and returns with the challenge $r = r_p || r_q || r_x$. However, we want the prover to only perform $\sum_i Q_i \cdot X_i$ computations (as opposed to $P \cdot Q_\text{max} \cdot X_\text{max}$). + +The solution is the same approach to the binding problem. `spartan_parallel` always performs sumcheck evaluation from right to left. Since the evaluation polynomial is of degree 3, at each round, the prover performs the following steps: +1. Bind the right-most variable in $\tilde{\text{eq}}, \tilde{Az}, \tilde{Bz}, \tilde{Cz}$ to 0, 1, 2, and 3 and form a degree-3 univariate polynomial. +2. Use the univariate polynomial to generate a challenge $r_j$. +3. Bind the right-most variable in $\tilde{\text{eq}}, \tilde{Az}, \tilde{Bz}, \tilde{Cz}$ to $r_j$. + +### Obtaining $\tilde{ABC}, \tilde{Z}$, and Sumcheck 2 +> Relevant functions: `R1CSProof::prove_phase_two` and `SumcheckInstanceProof::prove_cubic_disjoint_rounds` + +At the end of sumcheck 1, the prover generates the following claims: +$$\tilde{Az}(r_p, r_q, r_x), \tilde{Bz}(r_p, r_q, r_x), \tilde{Cz}(r_p, r_q, r_x)$$ + +Sumcheck 2 now checks that $\tilde{Az}, \tilde{Bz}, \tilde{Cz}$ are computed correctly. Similar to Spartan, `spartan_parallel` first samples random coefficients $r_A, r_B, r_C$ and computes +$$s = r_A\cdot \tilde{Az}(r) + r_B\cdot \tilde{Bz}(r) + r_C\cdot \tilde{Cz}(r)$$ +as `claim_phase2`. Next, it generates $\tilde{ABC}_{r_x}$ as $r_A\cdot \tilde{A} + r_B\cdot\tilde{B} + r_C\cdot\tilde{C}$ binded to $r_x$ and $\tilde{Z}_{r_q}$ as $\tilde{Z}$ binded to $r_q$. Note that the prover cannot bind both $\tilde{ABC}$ and $\tilde{Z}$ to $r_p$, as $\tilde{Az}$ is computed through a pairwise multiplication on the $P$ dimension, not a vector dot product. + +> In other words, $\tilde{Az}_{r_p} = \tilde{eq}_{r_p} \cdot (\tilde{A} \circ_p \tilde{Z})$, but $\tilde{A}_{r_p}\cdot \tilde{Z}_{r_p} = \tilde{eq}_{r_p} \cdot \tilde{A} \cdot \tilde{eq}_{r_p} \cdot \tilde{Z}$. The two operations are not the same. + +However, to compensate for the missing $r_p$, `spartan_parallel` inserts an additional term $\tilde{eq}_{r_p}(\tau) = \tilde{eq}(r_p, \tau[0..p])$. Since $\tilde{eq}_{r_p}(\tau)$ only depends on the first $p$ variables of $\tau$, it can be expressed using only $P$ entries. Sumcheck 2 of `spartan_parallel` is thus: +$$\sum_{\tau\in\{0, 1\}^{p + w + y}} \tilde{eq}_{r_p}(\tau)\cdot \tilde{ABC}_{r_x}(\tau)\cdot \tilde{Z}_{r_q}(\tau) = s$$ + +Is a degree-3 sumcheck with $p + w + y$ rounds. Since $\tilde{ABC}_{r_x}$ and $\tilde{Z}_{r_q}$ are $P\times W\times Y_i$ `DensePolynomialPqx`'s, the sumcheck and binding is again performed from right to left. Finally, we note that the cost of this sumcheck is independent of $Q$ and thus is independent of the size of each execution. This makes sumcheck 2 extremely cheap. + +## Opening Witness and Circuit Commitment +> Relevant structs: `PolyEvalProof` and `R1CSEvalProof` + +At the end of sumcheck 2, the prover reduces the entire proof down to just two claims: $\tilde{ABC}(r_p', r_x, r_w, r_y)$ and $\tilde{Z}(r_p', r_q, r_w, r_y)$. Note that $r_p'$ are the last $p$ challenges derived from sumcheck 2, and are different from $r_p$ in sumcheck 1. + +Finally, the prover opens all commitments on the given points, this includes: +* $3 \times P$ sparse polynomial commitments on circuits ($A$, $B$, $C$), each of size $X_i \times (W Y_i)$. +* $W\times P$ dense polynomial commitments on witnesses ($Z$), each of size $Q_i \times Y_i$. + +We leave the investigation of batched commitment opening as future work. + +## Shift and Program IO Proofs +> Relevant structs: `ShiftProofs` and `IOProofs` in `src/lib.rs` + +After all sumchecks, the prover still needs to show the following: +* Each of the shifted polynomials (`block_w3_shifted`, `perm_exec_w3_shifted`, `phy_mem_w3_shifted`, `vir_mem_w3_shifted`) are performed correctly. We first motivate the necessity of shifted polynomials, then briefly describe the shift proof process. + +> XXX: There might be ways to shift a polynomial without additional commitment. If you know any, please let me know. + +* The program inputs and outputs are correctly reflected in the witnesses. + +### Polynomial Shifts and Shift Proofs + +We recall our grand product construction: given a list of $w3_k = [v_k, x_k, \pi_k, D_k], k\in[0, Q)$, want to compute the cumulative product $\pi_k$ through $D_k = x_k \cdot (\pi_{k+1} + (1 - v_{k+1}))$ and $\pi_k = v_k\cdot D_k$. We note that the same computation is applied to every $w3_k$, and thus the computation should be easily parallelizable. Naively, one would generate a circuit $\mathcal{C}_\text{perm}$ for one instance of $w3_k$, and then execute that circuit $Q$ times. However, this problem to this approach is that the computation also involves entries of $w3_{k+1}$ ($\pi_{k+1}$, $v_{k+1}$). Alternatively, one can also construct $\mathcal{C}_\text{perm}$ to be satisfied by $w3'_k = [v_k, x_k, \pi_k, D_k, v_{k+1}, x_{k+1}, \pi_{k+1}, D_{k+1}]$, but the prover still needs to prove that the last four entries of $w3'_k$ matches with the first four entries of $w3'_{k+1}$. Our solution is to cut $w3'$ in two halves (i.e. set $W = 2, Y = 4$). This translates to two $Q\times 4$ commitments: `w3 = [v0, x0, pi0, D0, v1, x1, pi1, D1, ...]` for the left half and `w3_shifted = [v1, x1, pi1, D1, v2, x2, pi2, D2, ..., 0, 0, 0, 0]` for the right half. Finally, to prove that `w3_shifted` is `w3` shifted by 4 entries, the prover treats entries of `w3` and `w3_shifted` as coefficients to univariate polynomials $\tilde{w3}$, $\tilde{w3_s}$ and shows that for some random challenge $r$, +$$\tilde{w3}(r) = v_0 + r\cdot x_0 + r^2\cdot pi_0 + r^3\cdot D_0 + r^4\tilde{w3_s}(r)$$ + +Note that the prover also needs to show that $v_0, x_0, pi_0, D_0$ are indeed the first four entries of $\tilde{w3}$, which is quite difficult if $\tilde{w3}$ is a univariate polynomial. Instead, for these openings, $\tilde{w3}$ is re-interpreted as a multilinear polynomial. Thus $v_0 = \tilde{w3}(0, 0, \dots, 0), x_0 = \tilde{w3}(0, 0, \dots, 1)$, etc. For this strategy to work, however, `spartan_parallel` must choose a polynomial commitment scheme that allows both univariate and multilinear opening. + +Finally, we remark that the same shift strategy can be applied to verify memory and register consistency checks on consecutive states. -Finally, prover opens $\tilde{A}(r_i', r_x, r_y)$, $\tilde{B}(r_i', r_x, r_y)$, $\tilde{C}(r_i', r_x, r_y)$, and $\tilde{z}(r_i', r_j, r_y)$ through polynomial commitment. +### Proving the Correctness of Program Input and Output -## Batched Commitments -Spartan currently uses Hyrax for polynomial commitment, which is easily data-parallelizable. `spartan_parallel` commits to each circuit separately (but in batch), and commits witnesses by the type of circuit (block) they are being applied to. This allows the size and number of execution of each block to be different, but at the cost of having commitment size linear to number of circuits (blocks). Thus it is of top priority to try to reduce the number of blocks emitted. +The final step is to check that the witnesses indeed contain program inputs and outputs. The prover does so by opening corresponding entries on `exec_inputs` ($i', o'$, input and output state of each block sorted by time of execution). It performs the following opening: +1. The first execution is on block 0. +2. The final execution terminates at a designated exit block. +3. Inputs of the first block execution match program input. +4. Outputs of the final block execution match program output. \ No newline at end of file diff --git a/docs/spartan_parallel_old.md b/docs/spartan_parallel_old.md new file mode 100644 index 00000000..2225f442 --- /dev/null +++ b/docs/spartan_parallel_old.md @@ -0,0 +1,75 @@ +# Spartan Parallel + +## Overview +`spartan_parallel` takes in circuits and witnesses of the blocks produced by `circ_blocks`, and generates and verifies a SNARK proof on the correct execution of the program code. One can treat `spartan_parallel` as a two-step process: first it emits 5 different (groups of, should really be number of blocks + 4) circuits based on the blocks and an execution trace, then it evokes a data-parallel proving process on those 5 circuits. + +## High-Level Idea +The program is executed correctly iff all of the following holds: +1. All blocks of the program are executed correctly +2. All registers (including the label of the next block) are passed correctly between blocks. +3. The memory state (read-only and RAM) stays coherent throughout the execution. + +Statement 1 can be checked directly through the block-specific circuits emitted by `circ_blocks`, while statement 2 and 3 can be checked by "extracting" inputs, outputs, and memory accesses out of block witnesses and check that they are pairwise consistent. `spartan_parallel` achieves so by generating "extraction circuits" and "consistency check circuits" based on compile-time metadata (number of inputs, outputs, and number of memory accesses per block). Furthermore, all three statements require witnesses to be arranged in different orders (statement 1 by block type, statement 2 by execution time, statement 3 by memory address), `spartan_parallel` inserts "permutation circuits" to verify the permutation between all three ordering: construct three univariate polynomials and test their equivalence by evaluating on a random point. [Let me know if this does not make sense!] + +Please refer to [instance.rs](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs) for details of the circuits. + +## Inputs and Circuit Generation +At preprocessing stage, `spartan_parallel` reads in the following [inputs](https://github.com/Jiangkm3/spartan_parallel/blob/master/examples/interface.rs#L45): +- Circuits of each basic block +- Number of inputs, outputs, and memory operations of each block, as well as where these values are stored within the witnesses. +- Max number of registers that need to be passed from one block to another +- Max number of read-only memory accesses within a block +- Max number of RAM accesses within a block + +Through the above inputs, `spartan_parallel` emits the following circuits during the preprocessing stage: +1. `BLOCK_CORRECTNESS` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L246)): verifies the correct execution of every block and "extracts" (constructs the polynomials) inputs, outputs, and all memory values out of each block. +2. `CONSIS_CHECK` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L545)): checks that when sorted in execution order, the output of the previous block matches with the input of the next block. This is performed similarly to an offline memory check. +3. `PHY_MEM_COHERE` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L545)): checks that the read-only memory accesses are coherent via an offline memory check. +4. `VIR_MEM_COHERE` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L545)): checks that all RAM accesses are coherent via an offline memory check. +5. `PERM_ROOT` ([link](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/instance.rs#L761)): performs permutation check by constructing the polynomials of inputs and memory entries in execution / address order (block type order is handled in `BLOCK CORRECTNESS`) + +## Verify Sumcheck in Parallel +### Spartan Overview +The main idea behind Spartan is to use _two sumcheck protocols_ to assert the correctness of an R1CS equation: `Az * Bz - Cz = 0`. Let `A`, `B`, `C` be circuits of size `M * N`, and subsequently `z` be a satisfying assignment of length `N`. The goal is to prove +$$ +\forall_{x, y}, A(x, y)z(y) \cdot B(x, y)z(y) - C(x, y)z(y) = 0 +$$ + +Sumcheck 1 invokes `m = log(M)` rounds to prove that given `Az`, `Bz`, `Cz` supplied by the prover, +$$ +\sum_{x\in \{0, 1\}^m} \tilde{eq}(\tau, x)(\tilde{Az}(x)\cdot \tilde{Bz}(x) - \tilde{Cz}(x)) = 0 +$$ +Sumcheck 1 reduces the above equation down to three claims: $v_a = \tilde{Az}(r_x)$, $v_b = \tilde{Bz}(r_x)$, $v_c = \tilde{Cz}(r_x)$. Sumcheck 2 then uses `n = log(N)` rounds to prove that `Az`, `Bz`, and `Cz` are computed correctly: +$$ +r_a v_a + r_b v_b + r_c v_c = \sum_{y\in \{0, 1\}^n} (r_a\cdot \tilde{A}(r_x, y) + r_b\cdot \tilde{B}(r_x, y) + r_c\cdot \tilde{C}(r_x, y))\cdot \tilde{z}(y) +$$ +where $r_a$, $r_b$, and $r_c$ are challenges provided by the verifier. Finally, prover opens $\tilde{A}(r_x, r_y)$, $\tilde{B}(r_x, r_y)$, $\tilde{C}(r_x, r_y)$, and $\tilde{z}(r_y)$ through polynomial commitment. + +### Expanding Spartan to `spartan_parallel` +We expand Spartan to support `P` circuits, each with `Q_i` satisfying assignments (equivalent to `p\P` blocks, each executed `Q_i` times). The goal is now to prove +$$ +\forall_{i, j, x, y}, A_i(x, y)z_{i, j}(y) \cdot B_i(x, y)z_{i, j}(y) - C_i(x, y)z_{i, j}(y) = 0 +$$ + +Let `Q_max = max_i Q_i`, prover provides `Az`, `Bz`, `Cz` as $P \times Q_i \times X$ tensors. Note that they are conceptually equivalent to vectors of length $P \cdot Q_{\text{max}} \cdot X$, but the special [tensor data structure](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/custom_dense_mlpoly.rs#L22) allows the prover to skip evaluations on the $Q_{\text{max}} - Q_i$ unused "zero" entries within the dense polynomial. [Sumcheck 1](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/r1csproof.rs#L320) now requires `log(P) + log(Q_max) + log(X) = p + q_max + x` rounds to prove that +$$ +\sum_{i\in \{0, 1\}^p, j\in \{0, 1\}^{q_\text{max}}, x\in \{0, 1\}^m} \tilde{eq}(\tau, i || j || x)(\tilde{Az}(i, j, x)\cdot \tilde{Bz}(i, j, x) - \tilde{Cz}(i, j, x)) = 0 +$$ +Note that to fully utilize the tensor structure and avoid the prover paying for $P\times Q_\text{max}\times X$ evaluations, this sumcheck is performed in the following order: +1. First on bits of $X$ (most significant to least significant) +2. Then on bits of $Q$ in _reverse order_ (from least significant to most significant) +3. Finally on bits of $P$ (most significant to least significant) + +This is necessary because if the evaluation begins with bits of $P$ or the most significant bit of $Q$, then the $Q_{\text{max}} - Q_i$ unused entries are no longer zero in the next round. To accomodate for the reverse evaluation in $Q$, entries $\tilde{Az}$, $\tilde{Bz}$, and $\tilde{Cz}$ are also stored in reverse-bits-of-$Q$ order. This allows the final claims to be in the correct order: $v_a = \tilde{Az}(r_i, r_j, r_x)$, $v_b = \tilde{Bz}(r_i, r_j, r_x)$, $v_c = \tilde{Cz}(r_i, r_j, r_x)$. + + +[Sumcheck 2](https://github.com/Jiangkm3/spartan_parallel/blob/master/src/r1csproof.rs#L462) now requires `log(P) + log(Y) = p + y` rounds to check `Az`, `Bz`, and `Cz` for every `A`, `B`, and `C`. To do so, the prover first computes $\tilde{z}_{r_j}(i, y) = \tilde{z}(i, r_j, y)$, then proves: +$$ +r_a v_a + r_b v_b + r_c v_c = \sum_{i\in \{0, 1\}^p, y\in \{0, 1\}^n} \tilde{eq}(r_i, i)\cdot (r_a\cdot \tilde{A}(i, y) + r_b\cdot \tilde{B}(i, y) + r_c\cdot \tilde{C}(i, y))\cdot \tilde{z}_{r_j}(i, y) +$$ +Note that we cannot directly evaluate $\tilde{A}(r_p, y)$, etc. as that results in the equation becoming quadratic in terms of $r_p$. Thus an additional `p` rounds are introduced to flatten $r_p$. This introduces `p` new challenges. We denote the challenges generated in sumcheck 2 ($r_i', r_y$). + +Finally, prover opens $\tilde{A}(r_i', r_x, r_y)$, $\tilde{B}(r_i', r_x, r_y)$, $\tilde{C}(r_i', r_x, r_y)$, and $\tilde{z}(r_i', r_j, r_y)$ through polynomial commitment. + +## Batched Commitments +Spartan currently uses Hyrax for polynomial commitment, which is easily data-parallelizable. `spartan_parallel` commits to each circuit separately (but in batch), and commits witnesses by the type of circuit (block) they are being applied to. This allows the size and number of execution of each block to be different, but at the cost of having commitment size linear to number of circuits (blocks). Thus it is of top priority to try to reduce the number of blocks emitted. From 8d2336abf6238ee59e99c696467c859bbdfd72fa Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Tue, 21 Jan 2025 16:37:10 -0800 Subject: [PATCH 50/54] Update doc --- docs/spartan_parallel.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/spartan_parallel.md b/docs/spartan_parallel.md index efce8796..cd8bed61 100644 --- a/docs/spartan_parallel.md +++ b/docs/spartan_parallel.md @@ -326,7 +326,13 @@ After all sumchecks, the prover still needs to show the following: We recall our grand product construction: given a list of $w3_k = [v_k, x_k, \pi_k, D_k], k\in[0, Q)$, want to compute the cumulative product $\pi_k$ through $D_k = x_k \cdot (\pi_{k+1} + (1 - v_{k+1}))$ and $\pi_k = v_k\cdot D_k$. We note that the same computation is applied to every $w3_k$, and thus the computation should be easily parallelizable. Naively, one would generate a circuit $\mathcal{C}_\text{perm}$ for one instance of $w3_k$, and then execute that circuit $Q$ times. However, this problem to this approach is that the computation also involves entries of $w3_{k+1}$ ($\pi_{k+1}$, $v_{k+1}$). Alternatively, one can also construct $\mathcal{C}_\text{perm}$ to be satisfied by $w3'_k = [v_k, x_k, \pi_k, D_k, v_{k+1}, x_{k+1}, \pi_{k+1}, D_{k+1}]$, but the prover still needs to prove that the last four entries of $w3'_k$ matches with the first four entries of $w3'_{k+1}$. Our solution is to cut $w3'$ in two halves (i.e. set $W = 2, Y = 4$). This translates to two $Q\times 4$ commitments: `w3 = [v0, x0, pi0, D0, v1, x1, pi1, D1, ...]` for the left half and `w3_shifted = [v1, x1, pi1, D1, v2, x2, pi2, D2, ..., 0, 0, 0, 0]` for the right half. Finally, to prove that `w3_shifted` is `w3` shifted by 4 entries, the prover treats entries of `w3` and `w3_shifted` as coefficients to univariate polynomials $\tilde{w3}$, $\tilde{w3_s}$ and shows that for some random challenge $r$, $$\tilde{w3}(r) = v_0 + r\cdot x_0 + r^2\cdot pi_0 + r^3\cdot D_0 + r^4\tilde{w3_s}(r)$$ -Note that the prover also needs to show that $v_0, x_0, pi_0, D_0$ are indeed the first four entries of $\tilde{w3}$, which is quite difficult if $\tilde{w3}$ is a univariate polynomial. Instead, for these openings, $\tilde{w3}$ is re-interpreted as a multilinear polynomial. Thus $v_0 = \tilde{w3}(0, 0, \dots, 0), x_0 = \tilde{w3}(0, 0, \dots, 1)$, etc. For this strategy to work, however, `spartan_parallel` must choose a polynomial commitment scheme that allows both univariate and multilinear opening. +Thus, the protocol is as follows: +1. The prover sends the commitments $\mathcal{C}_{w3}$, $\mathcal{C}_{w3'}$, together with the purported values of $v_0, x_0, \pi_0, D_0$. +2. The verifier samples a random value $r$ and sends to the prover. +3. The prover opens the univariate commitments $\mathcal{C}_{w3}(r)$, $\mathcal{C}_{w3'}(r)$. +4. The verifier checks the relationship between $w3$ and $w3'$ using $v_0, x_0, \pi_0, D_0, \mathcal{C}_{w3}(r), \mathcal{C}_{w3'}(r)$. + +Note that the prover never proves that $v_0, x_0, \pi_0, D_0$ are the first four entries of $\tilde{w3}(r)$. This is unnecessary since the random linear combination forces it to provide the correct value. Finally, we remark that the same shift strategy can be applied to verify memory and register consistency checks on consecutive states. From e9b41474ec53f8f7d991733577cc4896bac26415 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 24 Jan 2025 10:45:26 -0800 Subject: [PATCH 51/54] Resolve merge with main --- spartan_parallel/src/lib.rs | 4 ++-- spartan_parallel/src/r1csproof.rs | 2 +- zok_tests/benchmarks/poseidon_test/poseidon_const.zok | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spartan_parallel/src/lib.rs b/spartan_parallel/src/lib.rs index 0b8ecde1..5f62cf14 100644 --- a/spartan_parallel/src/lib.rs +++ b/spartan_parallel/src/lib.rs @@ -477,7 +477,7 @@ impl ProverWitnessSecInfo { fn merge(components: Vec<&ProverWitnessSecInfo>) -> (ProverWitnessSecInfo, Vec) { // Merge algorithm with pointer on each component let mut pointers = vec![0; components.len()]; - let merged_size = components.iter().fold(0, |a, b| a + b.num_inputs.len()); + let merged_size = components.iter().map(|c| c.num_inputs.len()).sum(); // Map from instances of the merged ProverWitnessSec to each component let mut inst_map = Vec::new(); let mut merged_num_inputs = Vec::new(); @@ -571,7 +571,7 @@ impl VerifierWitnessSecInfo { fn merge(components: Vec<&VerifierWitnessSecInfo>) -> (VerifierWitnessSecInfo, Vec) { // Merge algorithm with pointer on each component let mut pointers = vec![0; components.len()]; - let merged_size = components.iter().fold(0, |a, b| a + b.num_inputs.len()); + let merged_size = components.iter().map(|c| c.num_inputs.len()).sum(); // Map from instances of the merged ProverWitnessSec to each component let mut inst_map = Vec::new(); let mut merged_num_inputs = Vec::new(); diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 742bff08..e1f2b1e7 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -200,7 +200,7 @@ impl R1CSProof { let q_w = if ws.w_mat[p_w].len() == 1 { 0 } else { q }; let r_w = if ws.num_inputs[p_w] < num_inputs[p][w] { - let padding = std::iter::repeat(S::field_zero()).take(num_inputs[p][w] - ws.num_inputs[p_w]).collect::>(); + let padding = std::iter::repeat(ZERO).take(num_inputs[p][w] - ws.num_inputs[p_w]).collect::>(); let mut r = ws.w_mat[p_w][q_w].clone(); r.extend(padding); r diff --git a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok index ac6bfc99..e7ae59fb 100644 --- a/zok_tests/benchmarks/poseidon_test/poseidon_const.zok +++ b/zok_tests/benchmarks/poseidon_test/poseidon_const.zok @@ -1 +1 @@ -const u32 REPETITION = 10000 +const u32 REPETITION = 1000 From bf6cd295ba55ef5d6174b6fe0ca9f78baf3728fd Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 24 Jan 2025 11:29:01 -0800 Subject: [PATCH 52/54] Bug fixes --- circ_blocks/examples/zxc.rs | 1 - spartan_parallel/src/r1csproof.rs | 65 ++++++++++++--------------- spartan_parallel/src/sparse_mlpoly.rs | 3 +- 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/circ_blocks/examples/zxc.rs b/circ_blocks/examples/zxc.rs index e5080e0f..af6ed5b9 100644 --- a/circ_blocks/examples/zxc.rs +++ b/circ_blocks/examples/zxc.rs @@ -34,7 +34,6 @@ use libspartan::{ use merlin::Transcript; use serde::{Deserialize, Serialize}; use std::time::*; -use std::time::*; // How many reserved variables (EXCLUDING V) are in front of the actual input / output? // %BN, %RET, %TS, %AS, %SP, %BP diff --git a/spartan_parallel/src/r1csproof.rs b/spartan_parallel/src/r1csproof.rs index 5763976f..e1f2b1e7 100644 --- a/spartan_parallel/src/r1csproof.rs +++ b/spartan_parallel/src/r1csproof.rs @@ -384,7 +384,7 @@ impl R1CSProof { } let mut ry_factors = vec![ONE; num_rounds_y + 1]; for i in 0..num_rounds_y { - ry_factors[i + 1] = ry_factors[i] * (S::field_one() - ry[i]); + ry_factors[i + 1] = ry_factors[i] * (ONE - ry[i]); } let mut poly_list = Vec::new(); @@ -438,13 +438,6 @@ impl R1CSProof { // So we need to multiply each entry by (1 - rq0)(1 - rq1) let mut eval_vars_comb_list = Vec::new(); for p in 0..num_instances { - let _wit_sec_p = |i: usize| { - if witness_secs[i].w_mat.len() == 1 { - 0 - } else { - p - } - }; let wit_sec_p = |i: usize| { if witness_secs[i].w_mat.len() == 1 { 0 @@ -455,28 +448,28 @@ impl R1CSProof { let e = |i: usize| eval_vars_at_ry_list[i][wit_sec_p(i)]; let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { - vec![S::field_one()] + vec![ONE] } 2 => { - vec![(S::field_one() - rw[0]), rw[0]] + vec![(ONE - rw[0]), rw[0]] } 4 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]), - (S::field_one() - rw[0]) * rw[1], - rw[0] * (S::field_one() - rw[1]), + (ONE - rw[0]) * (ONE - rw[1]), + (ONE - rw[0]) * rw[1], + rw[0] * (ONE - rw[1]), rw[0] * rw[1], ] } 8 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * rw[2], - (S::field_one() - rw[0]) * rw[1] * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * rw[1] * rw[2], - rw[0] * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - rw[0] * (S::field_one() - rw[1]) * rw[2], - rw[0] * rw[1] * (S::field_one() - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * (ONE - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * rw[2], + (ONE - rw[0]) * rw[1] * (ONE - rw[2]), + (ONE - rw[0]) * rw[1] * rw[2], + rw[0] * (ONE - rw[1]) * (ONE - rw[2]), + rw[0] * (ONE - rw[1]) * rw[2], + rw[0] * rw[1] * (ONE - rw[2]), rw[0] * rw[1] * rw[2], ] } @@ -514,7 +507,7 @@ impl R1CSProof { &self, num_instances: usize, max_num_proofs: usize, - _num_proofs: &Vec, + num_proofs: &Vec, max_num_inputs: usize, // NUM_WITNESS_SECS @@ -626,9 +619,9 @@ impl R1CSProof { // First by witness & by instance on ry // For every possible wit_sec.num_inputs, compute ry_factor = prodX(1 - ryX)... // If there are 2 witness secs, then ry_factors[0] = 1, ry_factors[1] = 1, ry_factors[2] = 1 - ry1, ry_factors[3] = (1 - ry1)(1 - ry2), etc. - let mut ry_factors = vec![S::field_one(); num_rounds_y + 1]; + let mut ry_factors = vec![ONE; num_rounds_y + 1]; for i in 0..num_rounds_y { - ry_factors[i + 1] = (ry_factors[i]) * (S::field_one() - ry[i]); + ry_factors[i + 1] = (ry_factors[i]) * (ONE - ry[i]); } // POLY COMMIT @@ -665,7 +658,7 @@ impl R1CSProof { // Then on rp let mut expected_eval_vars_list = Vec::new(); for p in 0..num_instances { - let _wit_sec_p = |i: usize| { + let wit_sec_p = |i: usize| { if witness_secs[i].num_proofs.len() == 1 { 0 } else { @@ -682,28 +675,28 @@ impl R1CSProof { }; let prefix_list = match num_witness_secs.next_power_of_two() { 1 => { - vec![S::field_one()] + vec![ONE] } 2 => { - vec![(S::field_one() - rw[0]), rw[0]] + vec![(ONE - rw[0]), rw[0]] } 4 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]), - (S::field_one() - rw[0]) * rw[1], - rw[0] * (S::field_one() - rw[1]), + (ONE - rw[0]) * (ONE - rw[1]), + (ONE - rw[0]) * rw[1], + rw[0] * (ONE - rw[1]), rw[0] * rw[1], ] } 8 => { vec![ - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * (S::field_one() - rw[1]) * rw[2], - (S::field_one() - rw[0]) * rw[1] * (S::field_one() - rw[2]), - (S::field_one() - rw[0]) * rw[1] * rw[2], - rw[0] * (S::field_one() - rw[1]) * (S::field_one() - rw[2]), - rw[0] * (S::field_one() - rw[1]) * rw[2], - rw[0] * rw[1] * (S::field_one() - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * (ONE - rw[2]), + (ONE - rw[0]) * (ONE - rw[1]) * rw[2], + (ONE - rw[0]) * rw[1] * (ONE - rw[2]), + (ONE - rw[0]) * rw[1] * rw[2], + rw[0] * (ONE - rw[1]) * (ONE - rw[2]), + rw[0] * (ONE - rw[1]) * rw[2], + rw[0] * rw[1] * (ONE - rw[2]), rw[0] * rw[1] * rw[2], ] } diff --git a/spartan_parallel/src/sparse_mlpoly.rs b/spartan_parallel/src/sparse_mlpoly.rs index a82ea722..ef766b1e 100644 --- a/spartan_parallel/src/sparse_mlpoly.rs +++ b/spartan_parallel/src/sparse_mlpoly.rs @@ -451,8 +451,7 @@ impl SparseMatPolynomial { for i in 0..self.M.len() { let entry = &self.M[i]; - M_evals[entry.col / max_num_cols][entry.col % max_num_cols] = - M_evals[entry.col / max_num_cols][entry.col % max_num_cols] + rx[entry.row] * entry.val; + M_evals[entry.col / max_num_cols][entry.col % max_num_cols] += rx[entry.row] * entry.val; } M_evals } From 2e11640fee158c935ec3198bd8f7b182e4663666 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 24 Jan 2025 11:45:15 -0800 Subject: [PATCH 53/54] Update tests --- manual_check | 5 +- spartan_parallel/src/r1csinstance.rs | 5 - .../tests/compact_cert/compact_cert.input | 13 + .../tests/compact_cert/compact_cert.witness | 174 + .../tests/compact_cert/compact_cert.zok | 207 + .../benchmarks/tests/compact_cert/merkle.zok | 48 + .../tests/compact_cert/poseidon2.zok | 2353 +++++++++++ .../tests/compact_cert/poseidon3.zok | 1619 ++++++++ .../tests/compact_cert/poseidon5.zok | 3661 +++++++++++++++++ .../tests/compact_cert/poseidon_struct.zok | 4 + .../tests/compact_cert/schnorr.input | 1 + .../benchmarks/tests/compact_cert/schnorr.zok | 428 ++ .../benchmarks/tests/dna_align_cobbl.input | 3 + .../benchmarks/tests/dna_align_cobbl.zok | 116 + .../benchmarks/tests/kmp_search_cobbl.input | 5 + .../benchmarks/tests/kmp_search_cobbl.zok | 69 + zok_tests/benchmarks/unit_tests/.DS_Store | Bin 6148 -> 0 bytes .../benchmarks/unit_tests/2pc_array.input | 3 - zok_tests/benchmarks/unit_tests/2pc_array.zok | 17 - zok_tests/benchmarks/unit_tests/2pc_bound.zok | 42 - .../unit_tests/2pc_cond_store.input | 3 - .../benchmarks/unit_tests/2pc_cond_store.zok | 4 - zok_tests/benchmarks/unit_tests/2pc_demo.zok | 19 - .../benchmarks/unit_tests/2pc_func_call.zok | 24 - .../benchmarks/unit_tests/2pc_func_simp.zok | 20 - .../benchmarks/unit_tests/2pc_if_else.zok | 25 - .../benchmarks/unit_tests/2pc_if_return.zok | 36 - .../unit_tests/2pc_if_return_cc.input | 4 - .../unit_tests/2pc_if_return_cc.zok | 29 - .../unit_tests/2pc_loop_addition.zok | 16 - .../benchmarks/unit_tests/2pc_loop_merge.zok | 9 - .../benchmarks/unit_tests/2pc_mult_func.zok | 17 - .../unit_tests/2pc_multi_func_call.zok | 8 - .../benchmarks/unit_tests/2pc_scope_simp.zok | 12 - .../unit_tests/2pc_type_change.input | 3 - .../benchmarks/unit_tests/2pc_type_change.zok | 13 - .../benchmarks/unit_tests/array_input.input | 4 - .../benchmarks/unit_tests/array_input.zok | 6 - .../benchmarks/unit_tests/dead_input.input | 3 - .../benchmarks/unit_tests/dead_input.zok | 2 - .../benchmarks/unit_tests/inline_func.zok | 8 - zok_tests/benchmarks/unit_tests/multi_dim.zok | 10 - .../unit_tests/read_only_array.input | 4 - .../benchmarks/unit_tests/read_only_array.zok | 11 - zok_tests/benchmarks/unit_tests/test.zok | 22 - .../benchmarks/unit_tests/test_witness.input | 2 - .../unit_tests/test_witness.witness | 5 - .../benchmarks/unit_tests/test_witness.zok | 12 - .../benchmarks/unit_tests/weird_array.input | 3 - .../benchmarks/unit_tests/weird_array.zok | 16 - 50 files changed, 8703 insertions(+), 420 deletions(-) create mode 100644 zok_tests/benchmarks/tests/compact_cert/compact_cert.input create mode 100644 zok_tests/benchmarks/tests/compact_cert/compact_cert.witness create mode 100644 zok_tests/benchmarks/tests/compact_cert/compact_cert.zok create mode 100644 zok_tests/benchmarks/tests/compact_cert/merkle.zok create mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon2.zok create mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon3.zok create mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon5.zok create mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok create mode 100644 zok_tests/benchmarks/tests/compact_cert/schnorr.input create mode 100644 zok_tests/benchmarks/tests/compact_cert/schnorr.zok create mode 100644 zok_tests/benchmarks/tests/dna_align_cobbl.input create mode 100644 zok_tests/benchmarks/tests/dna_align_cobbl.zok create mode 100644 zok_tests/benchmarks/tests/kmp_search_cobbl.input create mode 100644 zok_tests/benchmarks/tests/kmp_search_cobbl.zok delete mode 100644 zok_tests/benchmarks/unit_tests/.DS_Store delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_array.input delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_array.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_bound.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_cond_store.input delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_cond_store.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_demo.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_func_call.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_func_simp.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_if_else.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_if_return.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_if_return_cc.input delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_if_return_cc.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_loop_addition.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_loop_merge.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_mult_func.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_multi_func_call.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_scope_simp.zok delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_type_change.input delete mode 100644 zok_tests/benchmarks/unit_tests/2pc_type_change.zok delete mode 100644 zok_tests/benchmarks/unit_tests/array_input.input delete mode 100644 zok_tests/benchmarks/unit_tests/array_input.zok delete mode 100644 zok_tests/benchmarks/unit_tests/dead_input.input delete mode 100644 zok_tests/benchmarks/unit_tests/dead_input.zok delete mode 100644 zok_tests/benchmarks/unit_tests/inline_func.zok delete mode 100644 zok_tests/benchmarks/unit_tests/multi_dim.zok delete mode 100644 zok_tests/benchmarks/unit_tests/read_only_array.input delete mode 100644 zok_tests/benchmarks/unit_tests/read_only_array.zok delete mode 100644 zok_tests/benchmarks/unit_tests/test.zok delete mode 100644 zok_tests/benchmarks/unit_tests/test_witness.input delete mode 100644 zok_tests/benchmarks/unit_tests/test_witness.witness delete mode 100644 zok_tests/benchmarks/unit_tests/test_witness.zok delete mode 100644 zok_tests/benchmarks/unit_tests/weird_array.input delete mode 100644 zok_tests/benchmarks/unit_tests/weird_array.zok diff --git a/manual_check b/manual_check index 6104404b..a675d692 100755 --- a/manual_check +++ b/manual_check @@ -14,7 +14,6 @@ for cargo_toml in $(git ls-files '**/Cargo.toml'); do done ./setup.sh -./encode_ceno.sh - -# This one is expected to fail at the moment, but it's still useful to run: +# ./encode_ceno.sh # ./verify_ceno.sh +./test_poseidon.sh 1000 \ No newline at end of file diff --git a/spartan_parallel/src/r1csinstance.rs b/spartan_parallel/src/r1csinstance.rs index 8329969f..4162661a 100644 --- a/spartan_parallel/src/r1csinstance.rs +++ b/spartan_parallel/src/r1csinstance.rs @@ -492,11 +492,6 @@ impl R1CSInstance { // Group the instances based on number of variables, which are already orders of 2^4 for i in 0..self.num_instances { - println!( - "I: {}, NUM_CONS: {}, NUM_VARS: {}", - i, self.num_cons[i], self.num_vars[i] - ); - let var_len = self.num_vars[i]; // A_list, B_list, C_list if let Some(index) = vars_size.get(&var_len) { diff --git a/zok_tests/benchmarks/tests/compact_cert/compact_cert.input b/zok_tests/benchmarks/tests/compact_cert/compact_cert.input new file mode 100644 index 00000000..33194914 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/compact_cert.input @@ -0,0 +1,13 @@ +num_attestors 200000 +sig_root 2242853184699195296644565211308242465985429323786642914717382960752075916850 +signed_weight 19999900000 +t_i_list [ro 117379 179088 121137 185614 78065 129235 142346 190125 66032 107230 9662 187561 75837 184395 128008 190766 126958 137508 63066 68835 172726 111104 192796 192545 140510 172829 163123 82325 169647 161398 197790 149337 146082 75769 156403 28537 128941 194588 150128 156344 166205 179148 192953 182720 34941 105880 152660 130135 20838 87147 187082 185179 149476 177940 141497 62314 180399 191027 128492 188562 75870 79440 197168 195721 93295 61959 67197 147314 192766 171800 178350 15406 128039 61912 195745 74581 121063 101774 198011 174275 161047 57165 45686 180180 107846 181446 119752 194373 111554 170883 82239 114324 111092 134583 70456 163455 62036 181560 89282 113578 45941 123323 109914 158194 147452 161007 197983 189575 77464 179268 159139 132750 197031 107037 153723 159319 109963 113463 158537 151367 168007 132418 170854 117568 148561 134990 137588 161330 127374 184061 151923 172687 92696 173659 117148 163151 129827 150772 136284 146290 184086 180030 136661 151156 142210 179685 192072 168638 183882 172243 172593 178270 181353 19837 134530 130636 129464 159155 163976 102941 195604 138806 145590 162974 135517 101010 167918 86699 90947 38363 177267 106559 120840 ] +t_mem [ro 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2193347860049210559313346005385115884373715322607011920219043592275163468749 3760168766269400860129211731046832630961307998758632440950247780092522682641 117379 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 306800480844614605251319271311795144545963809735335711939435711214248792323 1568710477393818500170931421140545433482477858621446302115252875720882427652 179088 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5704455758917370737282028929244049269157384697414492095817782859457219610901 4378323546297634458390993745885896335605139527168385958665443726436990906387 121137 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4404504205072382109709098030745448862345432768053930883686391109941492907120 5174520850558090016550897754055665688028488947501149694032451948049985676704 185614 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6519946216095765515218656862520863401578001223199162736698378849868703858350 2896662871856371314422018415327440386298931739772205546946034411591410125526 78065 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3107696673771884696907735846717037262657084011297228327416343986266235002456 6825724847103482976050991416909214725469820784798052598726126842292197247993 129235 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3246060171286632479613871202847867102380028101424829271585886479033532498746 7055482852717354562609933354459090652232252207092931778498376564662336367701 142346 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5753770127491401441590334411966530496770539811515060431458705514836889405311 5045675349765989420032827864263248230518559590593860729984621126738559125648 190125 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6974212481704637818125417889687194892339958741573666053862907040534263872869 941230264552600186496861569611964939860832397849545845050509567592176705361 66032 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5096743620107385896873825811186058452884721263769070391196994378658322215541 1154517091423637633641791931786851451753823667743954118455692473425199752757 107230 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5301188114890651973095583387780707614834528633688012274490895689040212955831 1526268025957375899016392862547384328677782727084199560975798926489526430753 9662 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5208440062511332020190147154985783630244195550120271045153269725619505012396 6813363892651986130173612683714178287547036326260029096545995697067310477738 187561 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3909002920546014650907550256451469539971994684524880039663964621025808819947 254763108830917560842922422563694516166676056488472943068903710504625123535 75837 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4868656791109641482588863869044024659948733875884330335924775349632090879577 3696511273350020076202210197218556242950871791015282377987061831136842121188 184395 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4476667495667917462534603272138514199365941485017544739269347223587606920661 3361212120483548457237443739821878002570471104799645136907493779613362417256 128008 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 113930970702076393492583975751295293571850380887958118355417258902525525120 4836515597631710201398895674866138053717215262684502171234435219014122298895 190766 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2799072324126312414321201754387146428491901317648630585241334110159330922836 1272854895569652676663237034449916106598929565749484805446371980731553783975 126958 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2551027227468660465566986335295746286358209182361291489573906568932198723478 4241265360196504188673285530817509056528638922789445156428801771835966776063 137508 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5436275738487319789528696461508768262416760923922765457871344153830286805510 1474926412115313433807222634110916505406377544045903085030480879520911681999 63066 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2081749943504501005608975297004848861019204476554371616443056207386070590318 2069813588741801580969139424030042756045741530286661037374857171694802571064 68835 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3576938547389421026057022054487529940075306161779204486963361492286496994678 800347697341555288953519764739879509355880257399190188227127899687363338061 172726 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 221422483006020360655130260697529558600085071759131108242677615798608991817 4852513667925784522401775381265131776045916645962369566955100132952010401588 111104 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5016683547981913659059863004863637137298827326175302970564197142750180161537 6391691103484320148089733589014350714510952899743346877765446845547606969571 192796 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3591824393372546056484126865590952974760485188721286864440101167426031718632 1052495896898670824745743199212276553392913565556010435891365012249032249506 192545 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4135654097096461161421897156988528155515047644057041133315854064954362058667 2327835996582600912560058146848207639478470786692970562974998791687723491841 140510 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 307157893650861083407015187087758659963811186487458348191050288976877294539 4581592581495165576973904608177928877877020133658796195784093526229356126398 172829 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5064320314265418642024073646796492794053382241104232415679253531396339163968 1041815081354978531366001054491617973036933014729601716473053741028054792818 163123 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6443209862105214253303727184867343221649636204666409267868295852480539490529 5657906799733220798224470121059986980373366008014084314747908707463045552268 82325 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6137478534565899291653367436888024387085771619698421707076440411236373862304 2616287527696902154412165381397278926563598124208079205309479601136841560722 169647 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2745608105011008986026446477370097178136474461608117087766538529830384648631 3917223772436912878003612054537823135122965488036073820607687724993974049090 161398 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2645685922661614213799283928117250831996294650231817240568570298793744545320 342824531276915662866392558114142730265193191104998361720026127144972580514 197790 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3198212832781846990026191900332409040152058832717134029970232619035019569679 2437374532041386802969716475973429412745459790993288652157915741304609714258 149337 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5257211991000330529902898601572092427932138383923178997663180068866901056974 2086901669904860008207703896098746215459359094899871107151905072064644788247 146082 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6522646635976149411368215137274227399707914615452974702522102376192089643449 3046976328016741979520651090742264552120742446094137264901079555030946001194 75769 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6460862816920888011253771390816862247615077850443070311101349381563930014800 5383181769339238010930142577736422419455815290785725580738848198064232418739 156403 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6245450258314829786435024021394714460094501876156534747105417253552159536330 3140667287003555344405231607915369453254064635002704263808713195560604439985 28537 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6586927166511308738096193949909276042501257296522719483526381346178152646908 4352642209228767478735166578680966714077000912935662361443247152435790523608 128941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2853123201139764615220530107826674514042711052482580647292985312632284946470 170746913378308453683017350889329090244233796696776551610235261596014530597 194588 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3363658625181245542623265741682786042647987336407462059615455916886263757672 5477526935466876933863896864780423401803147887889544067866298458830418691805 150128 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6822619099344476869811089206286566349778728597175249002346692261246834100944 2530849064653438148279633145681286868137222882228644103588377747559824515438 156344 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1981905441629719177023546776687692141959247882156414894784271604873275225534 4036687712804277770210042188611524615164474859764816777458961706505230795979 166205 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2811162284558616370288404964321407472932246902808730643297718213255391161724 1492014045416126258579581371865975668626727589291999137966393053844330334020 179148 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1618962660574980988667797327860198861359626390639472213638244993395801548775 917400423003466480765491136701299637609408625763220741810699323686970099194 192953 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5326881032976696678752461666707217905567831624202404722043214988469966006294 7094284382719629848212162315334125929080643718386812608530790053407393879419 182720 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4868278251233962191377142966434401846272955656018073383622838962367597071987 2419879718322597043033867723677714183523990798824523080349477124099139211961 34941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3774139001161761107653977794016870630685113466984553607190139413891773337472 407088699655024939749131861243522532077647025333018882090342087324822947251 105880 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 7104205342797290111022268744522558929259171759500065996235164415435889292654 5357271333290499818195817110541648569975803349028912819487187735754617933884 152660 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 185964926473664397913778163686468580906278298440199312048910502183040419442 6910458421365754517858138559634788756130092416890776814121951092439949262148 130135 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2907872416310742964663677122993116545247426745764964458479471863779128365306 988485548907381622999741734808665712041319573410311727297451979109053954923 20838 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5434060976987568184393478839382339361501795825326967530241735734767841595439 4860351094514591493177713631445184028274270648911934556275413881040175024913 87147 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5263117319751245331275747825408426446235852672833366857598146709404223764094 5774641276483980524032872540070104636790159531332138852715034691259970012529 187082 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1784533230410739452461647588756890100944501514857674162772933357608004947376 3556657662618780480325254280710913092828296467406519200185981820188586699821 185179 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1524474293270343351744858664829736086745138656133217685175878564927912718761 3675369671619195112302822667481618725264023854364534203017377916640441782531 149476 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5936970471570822130830510196668139337623361157955356016811240867865182279698 3042762569983961972062728972342037370121375937024111557103472182208393378620 177940 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6363426056575440796872640682890911392377183257498925738551715166728059441812 502682155285537762101286078329296086256324808392501493291019985220643453716 141497 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 37877007158276897309143030902084737454819559170956340124021590977026063089 1912412830630711015079673213662267120829905279469606239283448584454135558491 62314 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 248440927812960258814600235396743502471269141462594246562635886397093451643 4178151191228246058437104442613645772930244731344641011040298544802358650795 180399 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3163223584268138477766834318515857365763506712942048232458530858928326026134 4416236229366541193215272014472586279151808244938070863186555082052927745287 191027 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1862342171359642188072378632232974760984715690462007178730604710488449180132 2715480856069808007370006687399469777567179843896642341797392694366658563621 128492 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5113380941477849744085867798206187514757221692180547191157292722169043067882 6959439707666685411338046456927390361584168322471760622133299828800064663674 188562 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4628030950760642913286523516367206772796064937865349263280007888395320410481 3109914313685616256767055564034437242057103173798905919320526041011693785925 75870 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4911006959582130031466234591174144680046153591802043560581984104063028241629 4978679559430934053091332109391856768208785439934486638379775908985887474970 79440 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5908472456804268793324763948227430917856737396295747183058363449110156176763 4917473880039332547666268972179534659614906943977970523865554992956230644835 197168 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1069582137228800463410159568134867505862655142551834404755949552265867146643 7192890289822132012248856622287352790894625086775005231918175367862975537001 195721 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4005436213620115357898829234076891391139169118294525861834036858158957655530 1049648428984468797185789651961132200760105826196636334345488656477583998050 93295 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6490682342099382468069766194800001465580673308261989341089428517848726930025 2804444860381270887017685067304022249605672021106495124667223482950401510765 61959 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1073601215579062222920731009513413626652521699526792883072308953753946384941 973324447901895564026652077076097554940449650006482832926428946420583167999 67197 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 429447367862418651899009558742074783292376744695964586733984442290891289099 2408736032803166032657548243532066410598761719432457163305416616117572845316 147314 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3960794933340916962772265250637842312193527531349826985590576829318441121621 3019612839208523352967956207908704082022534530509898842278724211470851785719 192766 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4641626194136592496022445368207621595839390655393304554177905464399838871637 6180906476107987061703879330677520742185585834140658295301047754958802071329 171800 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1940107622095107546514424077994397849728639944388921320963752022932895430108 4000823014610256047087871194857657262182218780824166726030567130137600856754 178350 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2340308704916011440800233816086434074969372152999139318604884797586102551081 5325648085113467366658936763498656300513282922595385335530503416981750428347 15406 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3217846417730977660718617464829475824826033697041514525844908994550842675940 2764387858396344969069733468070099384794142930224787928819290984137536113335 128039 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1479876968724288992949675553898257633562564309592166634390700997630604091260 1316012684237839641265134444047007280748101275583787013342999576281092692626 61912 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4791926630948404050974630949720382691685695959384994338535639658889129352071 1560271733568406072167962508934557120076664996383009215384121154626495918692 195745 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5023007650621900012439910719909463711107452693131533982830579177646662849345 7137502050240141584475159791086305855574285216624686239871023209151122751965 74581 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1477806189190952803627275088410220690718403292870872922713026682602203512785 609689791477181457293350551587460957794975048644336452561442869780336264767 121063 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3908954939596329828701743935560241065956594306874211331760582608425023205065 4116614438624082832673880889476637209477560075462539091164192044450462279 101774 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3393632588545630489594718240824473463828868855868972927451593336825508168200 5193793099999199902905427037006391159729173084156950356013604551700123539379 198011 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2544894763442970072122492144539980244041818725984348345776047310737597958223 5946542252348054192839967494762433136064540704452039657822977600532275366955 174275 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2732281212456662616569030910957069975486233670361203350497940985603271577048 3724302485625783733356943287085718848543659348723594323571519572347371060392 161047 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5181560054645782729081033415763307840697930072049569034843943440612453373089 1655045313106164527264578357904289448861042584087625265229644825532556412145 57165 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4465351602396015292056874315194879891120653030589382305035154611438909572199 2328654628288719120532948342768308664355732238211258657776802635442706097604 45686 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4986762531524310760287562319463827471818687026501347814014000746535530840136 194612928486803546681284448060977511951864547574123253867411748222448716243 180180 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1285560896426061877021252657327062733539305022022176986854579443763720680410 3830367206266655280440710096958415532992689845051053717853058571825255451605 107846 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5539205781924841304055055237968811040989761008593445235623337764625681906300 6015155350324543987130790024439805549041850965696391152892254592802972414862 181446 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1710823390658398675447645395325902052623108294200406366053539706595871583983 6985331441113003463024629597228374321721726800204269674032393512842557338095 119752 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2969400940741191769688767992551140136581166048968338506237049328886187962767 2683176940900483510597474691873973982961213646588915709185511832255840880376 194373 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5533201121487173677228632049860127627624141403758218052863927127446630886349 2455364555749658362695170702064411159328252367925663667208132083289253817452 111554 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6754050866246842008365854789046812605868646667599584841410107735044145405473 3982111575080654624063261985192568527681867690914748240826161124559243111542 170883 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2309956802530612661997445953955438464293109716265647928209925624828408782191 4373563444173510550514235454943182387139127940841869237135415413602557137932 82239 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3639181068503331252945070341431734570375049389821849336884802607066311646281 7226392115776883016618672960569094297817880009324818361343527717613572065277 114324 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4061786845043349253573674877371223992421608213270864572047231523575323311655 4903334930151639438573893024384099156054847236722485935782087182445834406937 111092 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3637731800251165101193297969216169551823796003425783691294517339550247908086 4224466144015730845740574953166264251703555783432064896554624818718466662916 134583 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2634389391273099278681954780184138841790235354025453371759526227237818352813 5174067057270132307467641986089106459261924211903740677506193771339845121253 70456 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1262917067943903805265609866471249021401471560549529927229713391318979556628 1613223906026349016434545272566817758794809727515523498000744115143826433817 163455 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4757878542962629511046116698316432939087736503451308638750042043870291441852 420297984069461569752759964836940838432188182035462245259077829317383075754 62036 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6833311422367910738896084910782021085371125098935830962275829591271982280243 3992056535779931790162793418201987199849934774579913624574807792739824336499 181560 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 172705581906471011364113945686837820543705408764753615306460254649000094309 4777892280376306098296686453320395360313905952753809015499729738749304118380 89282 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1971077872876028408351107169683226870778338806751440383231055053395875905026 5365652926923639427966468974485943262408962611057243850060019770524619860573 113578 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3060604347207295531425517454310347754583300617565828772887657226479178046435 6316569384195028131136546558125835122116657571779220916547917073379187464371 45941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 689941388873473329908217275241845671833312932760022316519282398675616151927 6235973111718796838683241316578410091845525679588215815015322968157655342942 123323 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2170052646190249949510993330720745356526968569092605875593492422429086573040 2385527356139742415043018006516076947049087690422088307559652525609908480407 109914 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5078716035144777890798951926697760837655952581456089486130507457694236972676 5833628759816262826376064331181127037921596877005578051638965302898741152370 158194 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2481769527867494476230239439839809937931074987435969173894151830357129756931 734804760733483974286895724451166718817824072333643759352265125148396815816 147452 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 990592039246951361982918155598660792174572656389956404404561770267723513102 3230584735896621546501794521213708949678981405442374770325039704642714285877 161007 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6354688734899267298702359789869696419210730978076330373397856279633766332202 89292950086438056063110191986101257453412077452801154293020441458301150952 197983 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6194195685587182054022169374105838598177554263600215933064765731971324130704 2859464085222665562499928528461066842370969439651548786818664445763078537616 189575 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1373590890027044373544229156762385528155771698450915549225738238887692340107 1929802980784047787524639935986695861351279384026260775243898311041945690309 77464 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4795004361380856173880603442845517434539994618547256596980333717535976941740 3437357120738912394417642775476711577019502953935025380136771237834407540159 179268 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4048252971394683197922009202375100297063521562757767261727057537171470721377 741150565144830759479416012323881831196336330204835879581894067268929019900 159139 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 258654670526346333306818407719020928113375108062200574477051574593026348796 2047213241364487698104087959470167327045977125889153987084539811516867438815 132750 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 7072701745005944827077496662037233911985628732642968249194639946411862603935 5761899775723894870302770262176579230710460082508661676373661813018370438849 197031 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5419352643890637233754661936728385158874129194162544651107640330281593961036 1355671898323530552164936817373954325831746324354829049335037019831112928725 107037 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4207051305460664983562134012786057980738517151017612269084525275627122124510 6018843580238728503311736127112127431640279947185312834300275719804254785378 153723 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 817102318068131430915425919492723750657096707890663919340286349523673745765 1339275675350312982454154121249552264192159125421429062322220850361710384386 159319 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5291151174159658916702741741167415464500839018552226478494718545172185830102 6409826530675991542589602900717288577219641943136509206267341455354728190926 109963 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4229966104024848293771752158909622603977070347031792371332054466817977594328 2849144257693068066991890561200893470072347839353834616658450115315076879334 113463 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5741761974255775956025086792914529378731899544334850423271059883184755293225 2958523214480969241174915708351949045815179766059270439419623819182277927375 158537 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5691508913232366591356139321208155343881525462774113048050599759397912818773 2168732632507361976313555617210427355156617394447374812684015077409970487117 151367 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6509997370591631724963004622763957219444721948208228806163203057331472881936 2944214572711880172239976403428052614174690390520484013318608799137412797990 168007 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5647040837500159578935509107841602479018070909401502624855182845813874585922 4480597968237861585682324656788957910534891901046661112909198360748198456626 132418 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6257626940341810058658368172042692346229464133348781451615756447742531242625 2765950501985670929342308094933551722754530465003932262886264724469968826712 170854 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6939490337590759996040010722445839027957823045200875750459992598418364378007 3532125052426108855632023373409218147992545651429202593443424601028113545677 117568 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6275837486616452802881398569734211170809365016699330766789730253470382824934 5295919443869931820233673866240338787246846686457244693966231001529671976860 148561 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1358222843835944592434391762592536677880417653488523644327259236792805255630 1632709364889517540899388843774689896209557957628920592718772698141120516743 134990 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4052692965394599559519796429930883904909093635085053485020678080912957991845 2027988896360034020606285565421888946617895811082685757902881496603385795561 137588 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3793391512961966571995343911900052057732364082423005873304152592650202178690 3438088001582585827186640163860162122651068110251324079867398718366767141590 161330 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2903916074130229536262387916585842944540919973090687581729523548216032106941 5085962195752283988670227607413257505590337120547785919093533918039293019289 127374 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4812010981125989812366131430228519615817484885856446572388813357782101715830 1247956995905577650559876182733706272423100904200329261417164048536475325160 184061 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 296386332241449456580606894379615493460738839200606465610738193169805237684 1691864988905319668511249718181549561084004707526154561224707892345183823937 151923 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 138969473006130231104096413845518327400254467774710478231913740973663506348 1586053311867535973869283876332220463223146656295132719860871477369953099388 172687 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2598376478768193046516118244742371479432990072310005489939466222967195040987 6275504116780894193937922936529313454121024916810242942322346642758931776181 92696 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6633393616703930839496157088265199398627598585799504551850499126152466157008 3917993707552250937893241429870543585820400925312201085390981501009754000700 173659 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 695268490513642387584881909816926593908997791787882063590600178579100972931 1633844700437614059161954669968763899003836172521593284312855539347130195507 117148 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2395939748334915719023511788834388570729855255072038530879712524041727020640 4450551890734273616755341731976564584945950484108188094382878136930224711940 163151 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3399285644987018639889837925709553593895424695145780938736436801385304468534 4422493067328905485299843622630836520152329496908717026181521064424583716742 129827 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5572861805079988453107283037595468802057661659224808908277321019445092997327 1110932941544423758948346778242187597592983875846569565105150593005730007334 150772 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2179294666159631593208784727713834512495212568704015486800889043480343630204 659569609193621369093907409197971327923039985598969856787628456727728580637 136284 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 936943863432451671633918862673045548017575232039705698616915701194454042182 6975427479259764798591677185190572340501607734872298787988072437034905574747 146290 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6455358747773043638163433956134751355000673714805429844303697998503948911178 1335061616486810680677676229281987133613959006941455044267395678933121742622 184086 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1743106117364477946805604150257549934845514675769816978818183199619455112237 6963711110375206692748695666488144691929514735926259440924394895360573389878 180030 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5881151095586398375008827205869082513744147867173750783900209144053385563004 4498937035807826933671822533545427911833441484099592552617213866149098486732 136661 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6295484822186171784543288765280817949655140993143091824012152478938324423501 632917059627824734950755785385114106246604115668975711743082814558016065849 151156 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3058206010758673849264443131247490887235671172868393410450127469014883645789 2735708129188610346636300762447089490823550231647900124380749308758862167154 142210 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3872361879339177972487250600625517598223511201001142690061150321343097877807 2526118547820520425240848136156075589813025996980813921818407381712131018201 179685 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2983675464436351213990978360818946677572244436090474941394256480807219617054 1734334845443437368568630074522062580732337133528579195057948387479317518658 192072 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2258298268445620467009766940231972687699402386605739088901515372138552004323 6145657216169502823219999724681122780690773816266790345305906905032042138000 168638 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1044407559660122796372434316310838135384266565101329825625817386122584553184 1593033423418300916105185673071085997739110097076731056809131300129846679609 183882 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5766053719160203673727331651381965634826396457966509581248319575763786345676 3591213735613800285056321164371056974291202176209658243218251914087368259126 172243 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5714468546976783277340417015533008685593631870719635301336880438310021678339 869757799215849979027174987004805469142696548433407711677525792633028252231 172593 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5847525005975899680057934986836565847455848759692236915266435477183369501487 7110196440476955283470679648561566850229680363373998728703403935023778263208 178270 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4425850699295129527197854571700066604016122501791012044949843157088322383244 666909542897198362106834848612147161113791941197112595207057030233541872963 181353 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 161238351135045187167043879805846145665531216726395141782467947670531456087 1679147410513931799930583434606607582315641154239732678732725244465424898227 19837 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 883494243672517933858870302581938663299337861094306383474178383226627937310 2955103162933168285993217035085931405514198399327055782624824966854053387293 134530 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1896489221781624226821768573408679389747526101946046665087406202980621573787 1608653404506304823936291619329224356899830545834755513765236703811598776250 130636 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5259948581370655342803906937547605312734984260364188762983895559503261263447 3635947750738169048216007814725808792227985687371974701122702706393036016619 129464 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3937964551517529555715571441099024938083239420459206747771217480803013044934 6699364214185804892755265598670126536748226127426540999296629057127256574634 159155 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4851699905897281296159201618737988180388739748946950495074705394223571439164 1106953510070519152489916688188705095811277914140356959503227444145302637093 163976 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6242292150545233621670237118911072750903000068120372571819603782797038226111 6832878767526769669315698059335862566870741611188706097351596390384480275074 102941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6945533498206827741693849546005985594376433144638319491429626238464171535900 591695426576256604363169777342864837584385948562058189038693201275329224497 195604 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6193004449391201688285107069700934295872712488434465981689357914711147572675 1147375758234177457123318888692724883679285283568662424321466580869529105345 138806 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6535540460850679355872514018430623271905607243526258539785863622173564040739 4284357093743577077465791487069343335993300558951796763640642479490451784989 145590 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6509679281769886790390787204926779306167226433089714223659291021622859642136 7058406702814418230643450411609986836744835447243901244499120197781533062455 162974 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 460942905789768331252296075327290326045057967586453097640813732310363151842 2617903939728044568398405022635757105286091747437689150553707838410731592576 135517 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 82303186318031840021908942528623243720472964653688466141931270077547205760 2382525037512875480012837652859019691823075505690944196806520927481783599701 101010 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6141855083828467084152874531554699931320679739196460444408886134970139957864 6438716573815419249485208647297454459617433463448686339082761933478030844002 167918 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 132827878220501438817512769810617878420702030758407329010346862607698970912 5505134255935447180346385729089201309281424508540528011860952893487309182904 86699 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4396035365220658656381500429581053046654855945892764570424733959060850844294 6043528339653102057029638171465922432049552647168206771136635096395575693785 90947 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3283318177424033834740475231437339878240361125360407396831070268609228753634 776783908389360861745964826074138746233478193055949505205142085100025853094 38363 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2237415574675759054888137015267605625546983189165932082138755952235871444169 1434075870769076360162937718139596962755195731173171596091811703437580931492 177267 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3534036208125662736929567529184779821360692217072139978258690229119953861456 5461075659863896943043977024461090178526655765959603080014541757788014569788 106559 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1193204495300679858746319592936715450593237882120118041219181399245023654254 6230771696471421632482155915404641522481222261351522581002755959721716152226 120840 ] +t_p_list [ro 173 178 183 188 193 198 203 208 213 218 223 228 233 238 243 248 253 258 263 268 273 278 283 288 293 298 303 308 313 318 323 328 333 338 343 348 353 358 363 368 373 378 383 388 393 398 403 408 413 418 423 428 433 438 443 448 453 458 463 468 473 478 483 488 493 498 503 508 513 518 523 528 533 538 543 548 553 558 563 568 573 578 583 588 593 598 603 608 613 618 623 628 633 638 643 648 653 658 663 668 673 678 683 688 693 698 703 708 713 718 723 728 733 738 743 748 753 758 763 768 773 778 783 788 793 798 803 808 813 818 823 828 833 838 843 848 853 858 863 868 873 878 883 888 893 898 903 908 913 918 923 928 933 938 943 948 953 958 963 968 973 978 983 988 993 998 1003 1008 1013 1018 1023 1028 1033 ] +proven_weight 50 +num_reveals 173 +message 6908441180828167112785246881494320159273940089327447106269949444716788494909 +merkle_depth 18 +att_root 5677453865974571887959332730001014635222590612833771461724188657255373897856 +coins [ro 6888918426 16036191708 7337137445 17226326784 3047097288 8350849921 10131150717 18073827855 2180113563 5749114901 46675186 17589617118 2875595348 17000690379 8192987733 18195809726 8059199018 9454285339 1988651335 2369153680 14917070857 6172088100 18585219294 18536842715 9871589633 14934906551 13304632146 3388728819 14390029418 13024720883 19560459077 11150738211 10670006947 2870480048 12230920882 407179601 8312850078 18932244732 11269276672 12221713879 13812088101 16047025303 18615386249 16693299694 610425005 5605309348 11652522776 8467504724 217115955 3797336827 17499929821 17145682896 11171551895 15831297184 10010641879 1941521701 16271875020 18245743981 8255090119 17777789094 2878149119 3155390015 19437687606 19153396589 4352020007 1919429383 2257738368 10850761414 18579327470 14757704060 15904417809 118677440 8197046808 1916530522 19157968519 2781148892 7328105839 5179006440 19604120789 15185822022 12968098016 1633945182 1043625786 16232402247 5815421199 16461343071 7170262231 18890461103 6222175953 14600543166 3381619255 6535037645 6170690539 9056309292 2482037378 13358737858 1924209772 16482060338 3985620065 6449953693 1055287191 7604245804 6040523032 12512708969 10871116296 12961667391 19598692868 17969418820 3000297464 16068528684 12662606645 8811297030 19410702333 5728492067 11815393509 12691292997 6045904480 6436913408 12566920922 11455937093 14113195074 8767230534 14595500178 6911137767 11035174107 9111098445 9465254645 13013693120 8112108251 16939201658 11540261859 14910314050 4296307535 15078710030 6861834029 13309103676 8427534909 11366042784 9286698285 10700331399 16943807825 16205369590 9338134681 11424087474 10111870912 16143348195 18445846796 14219377909 16906383782 14833775298 14894178855 15890062304 16444390574 196760435 9049216158 8532946547 8380448509 12665204286 13444051684 5298449668 19130411076 9633510159 10598162129 13280326854 9182405570 5101516410 14098146050 3758371541 4135686597 735861998 15711874075 5677397026 7301145199 ] +END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/compact_cert.witness b/zok_tests/benchmarks/tests/compact_cert/compact_cert.witness new file mode 100644 index 00000000..eeea5ec3 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/compact_cert.witness @@ -0,0 +1,174 @@ +4378203708522988600544993575090041412111200317862968067602471829648474237098 5150693887023362059625463075561481256683042373538519075170629033466472845895 5687389024518862040591013475183551087882901423300498686940435746938101594659 6888856131 6888973510 1 1950848368631103844394547310780700770166209371388090135150256037482736222310 1698339598225307960916652727375543807724565518387339463387302881173313826003 1 3426130274779519806936350377341322452507480781812397313653894118910425042298 5031364314191824074306709204515037201241347838302362526618363193683775867722 0 3207665382598269618706545536963116095822189016725697214504810635771419498660 4478001320583997588674589485166242126185440480401015346201501375378083719462 0 6541248575882905159207470598320104778725400363841612344720076934211121186056 3838270522824300693314359720021217003091308200119613522810251881174322896688 0 5640091186836982576267445820125477388800376674430000050540351800186056975914 528201886139371844830489348054542695661329673718150836820168631079425235098 0 4835948708454452604761994278122807838791200144893516897974230789491097696618 7003001326492890244210491735643959698769219461043255963658358774233409783785 0 2081414500972492473064886453181573262709917811294131523416236792185706599015 6859429318657289001584583734923597730853862699178349666277264489520371146834 1 3989718022770109298858993614253279070536817912217009648250578599395334089365 6956393769957564208032758686863683876124216384454015207441021063237642785367 0 4158376795995819302330813862781514057512323245854647093867137948066931220587 1691508905793690139481184142233500244813564574963607330498595865945861143094 1 1024992048347257905920964509758533614320248044819810745414580678169687570660 3791418249899210886868186535745547177754942485783105803535881153905718665943 0 4892911685640918936507415812092628174906600733410473687651092234682149603333 5433191193400283830449270445939645756530875942930903471232483101077915067842 1 6979269453309009111069036018105677771463384075446857673924331315888505530952 6415190432501433395733658264573518065023765775625781104935817327833498905927 0 7155842912162336485845305523305565491772834783313129438718163644875917614053 4323979049682445725653339279525878673266906371560474718815605130743279777072 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 1 +1539328279452366129635342403630251735934193898460924675949976280025426161135 3360857618547027283138212606545210550124594769610745200822376552699769180015 3857593046707496325838646563501672653906910629190586954781102196372811095755 16036166328 16036345416 0 5103350828419708215120408906891252236142504023317189196009574268697841681969 1981206247906033917315963518652650049727953743329131488813528300650869459069 0 4166978125545751728804632521332691389960383385489580677320099384319942759031 5136753533488311717917942117549315488295849149116273475215210904760732619634 0 2506229211928680040944881392564395307016786966165811986910046886931231050513 429976435543536209946212947822952795900030094863838959803086309091711242725 0 431816886269156108642181436117468050089693807569016641313602631025957902552 935436195004233750642581890160462489165697196618314255305054243172395171417 1 3404886590693759067880917925822420123638019465781718293909132660018700057838 1753596658864247747920129857244308150049689180084524101914305868418246854256 0 5047213473971411429491676879254701113323066856963914076519990986132493072713 4139343480952330968948766655928768831840160683988552441614143320868107016554 0 1336480460213144389536634950162519031715504025872813484529264656477145516634 5284702585541358318388570790880388344092686716150072165600433848393278010163 1 5491029446661306080146549843379601437314965472316571192292287311977388796436 98938018589040802555086423525310230702626163361179120560574057984150541629 1 5097652488396062190790876451348159733408719867388286796662590210005701559501 4033553406875459086491634879199649204683665001937295983660771361715168708154 1 5623944426946884329175591147584116194813417748977877551069736022176638922778 423777179278032922712997793116102448967507356170918585908267240595244700018 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 +1359348847262188431837128757396817484934706837340482741662327325410635829302 4989489979754578910544401326096359165119558260715425973735015092415274958576 983539666789624021590546393386335385238965656066209569475337917798188389394 7337025816 7337146953 1 2973464897889895718476501713722156498579000652788274809406027207565209317732 203996507405890723080445473710125850313765426697203234284588650775158184890 0 6078876229061660732180699394077311322933159878801654409207292108013990559609 5426184258771157249022273994365618566094096071651195187447035645493272957066 0 6385843105197983090613148261991775605244214449729913877441044509342695521781 2784449776064217036290493699465801748110483023558814094507361980167344009936 0 960410407043577291555539417417669953246727566246577842715654608895383633363 3712692236034213680243430973092450769621084195475294862084537735577903080364 1 5346806945524874205199174644017690999500092536182372872982549139386848201369 1560356731844727793804759949447512786148320431399342962426065251558721835141 1 5987820649918193332231135166092418645466699351603887004474435677754378953180 4229601980388476660694774362290249531622940586189351110154187564335741703956 0 3071613940354045186516407499073150584734189793695648756328946036806591864283 2984606004241662853915515005327878266559723677367912642581370319590602191501 0 1131193742425883183812325810388319971745289631783032442683484522965413362524 3810658320862030633836801882550672055222962702430675452960699352627109067342 1 376423024028718562050217496617825375983290683165219360749589262350173490749 4725890539547658502327347427714819122302436392923360113850878729316138039121 0 6822395443397155720468506830209035564877505182262522500369495376387610848120 4256130175362539484890043936005014293686834628190122807631270275824711161868 0 381587827077940780343700252948305267828895242687867325974328645516175905370 5076054685263388639846366083418591669610196374827711443108751702880918545735 1 2716624735279808654707628380114972718089722437294438951140070219003606061823 2863726410667765097528054096725854005399123885023985318551050900789164853757 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 +3367357519926827158318552617685840550167531291855303995456358525481385725073 5873133217569441046226878457097421501092335758209372542000833531188986621297 4438778396946916784910400955350607769528767503191797889793575064504262250748 17226185691 17226371305 0 1206681960433851716198991808549365689663008190071119807502841936948451145525 6936296331526670591793656961487871164410029319137851668632249283981051349395 1 5354882901985735275771363837219493791782248172121344258977281269983715404008 3251886607005560418308291500709130932185841846809322131452843841349494383077 1 5095642618775993895433635442322129299346942887386108431484064739492715471066 3013151603871097628632566235711918749904029255144359646964151646746854648260 1 2672832086668679624217126863940446096503179345639579306886807497820025932052 6321790357264680010689015664001248785750444404217069545940539905478737824564 0 3776484403491018514355282575586683902117904226405256424836944773031837877400 4333979550701678828812451743034235834791577959266433421493268966980437627677 0 3969452994104352393815775257409828146906647947572450836919060504858805950080 2012443557344969776059692790871922847252390917687762464122346923707438416753 0 658969739938605409543342774423207232208055999521522889716669981764133412457 6931301345503940062634888128338282587701592822265447324369927964635400628744 0 2890907082164592243597480331054613982436757527262560222374859064217657213937 4249981849937745664088451795379409377681869392910555549050169250530749190470 1 7036650560244896146869605945487591436477987779221812999875063587300300701725 5927052763381411859867284525074609724970609209289085018817966308359298795623 0 3397981181116875774268823611028109462701272807013816846278217941720131420640 2397393443844300743795736785639306826779552422666924710357188736756075331439 1 2749965368012635913817275803122883509386979135822633977225552798012903260503 1374840111942530252261392456068355963888038662069124181741917713707898276683 0 5560231319085748359065826677239299538382586759554704347812125214655086371153 177865380135004783040460998011499714074058548334027453924899064909699457502 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 +4609733962502054508240291150572320319825548446173122976456555206322815172730 3227279051444418350644002658342716190895966627663904867358906866221362520539 4262272042815190588718973032982959402071510297834777352719308758374955344045 3047033080 3047111145 1 2495495691347439341109319462595362928211078255677788010165858592229463772365 6862914658207994024914476742365357215506579530974275189799973290354072042482 0 4851607530404336020439156017421276789507583365360480534070624609469195320192 4114548525665418457657166326117361497575525640426123785198981929187175681690 0 4078052049648293732253369938513525694168608140302103877081148032191105434971 3948656348922231120057247366243461774672781215342435515795348431758615044332 0 6164063713700425414803350311174657624026001855651683533810908735341175185679 3018274657340898802387143625858791285482147726509285311619809242307418142669 1 3959070143880934949799475013378185960236177855913336298631451972755881514497 1522313621565881353452680162647253097891484155135864745950494781065870192892 1 4770198641476420028954888489332980749783726120366586317431270245340876799783 3540216141880513485084109387389621415624456458347336145570329075373973222955 1 4950250091563024378036873821373672271914526101437739376135564952423958782967 1874692862270853203468750374146037712255926760111464761425983298592727275320 1 6455589742664201721221592910901596103757557433217599758810988829946423634751 6504608031926794024677381827950241660605115040278421627705135231181654050894 0 5800618001716522660298385687637789440424629319893209729765641428768789432725 3182081678909269494797100636555048778312539553561771322126300457521083961367 0 2073557225918746737931893144106599885260664154034785113131561751394977080769 1448445341702023328824323772134769111734633160116612416932659189179479352351 0 647396879011828136652398932828472194296629219989498342359072959376163795007 3293152012997116818272844109553090053832603495595157407054725108018909332104 0 6178963790485291848484261753008527497417695452028629836382205517107813165535 2958113862062575030413585133220922540485982955264740187429450152932855445929 1 2054270892742447876736699223788912751691767605609378488840379414771350138564 2835393241416923108598374712393405131819552940731742450349474447498762024361 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 0 1 +5312414321578905869939376183070155834397130415917502702381640808430517235857 4920755110773668458486849488160046264153058792248728804516604299634995631777 4441755745320769001928447984623516244202371614591947133699662334076691821041 8350777995 8350907230 1 3687832289118238579323708473021041817005435847594634147523930452830302755314 214368810364823795216043280333553059960349333083838830484952642894026383921 1 3732213218590762133929065728122247332218088965425415780218191661962754690654 115355065639135006379246319910621630601781582976037428164347989722648977764 0 6628689683151137044938219452286090209647866060285532213222238556243033171503 5821695598083579659983698286459829304936783311457843244650166588047766217212 0 6284041499997454808825269445713523336990231302771554422060245984827053027858 2812891760432985937573699299504646834845093738002160448257783854511762580910 1 1936332360776872865915815815605388663468469433658239320141294560567364064771 5416675924133742374467258902293335110637847465720676992394710137572932407053 0 6874083190530457785456459124253375540987586610797684942564054655184011973974 5803955094676574859956643188418770849888261273572950288525451503818324450948 1 1873743321157353070490255724322582678962673052291617724924649731749981424478 6399878378624976988443832338948831100212086694604171045904276895048481213809 1 6099334744887512017160078574739130441343806328393721762737008890470110235780 5502016984553034492095462995781000960086943165553854918692706720383577273545 0 5609599601072605851629283782036459098317286618818647656289874060932356740201 1931762207055141122781202786293879392684622562049278083536273239976540476142 0 130532064112525543341947192128215321611567248117457901791079621350300363124 889633345661967576698831244896208397354127600769250851670197241075934593296 0 7173017566049627611961637667229341836912935554892773554725821389416315891716 7133448645250593764214856760768843267515783056965422435368550513826328295162 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 +2843770171540332958116882543268614918969823590871601025975389477721800531161 3806259346711088827509739896833997376617903253015855686301665981980877413650 6579821738233985317063291814152244833296688937752780473545438427522741448582 10131120685 10131263031 0 1102628272870203447754111553688286257718374536824878796512204838029832441709 2453283452946448833094323988520154733325120976032572865278529077703896451025 1 3564400410244034569336504480615022892425430814541005532206524315411142457050 5178989516927321004286619067008788889661872355858730828596120195473042858741 0 162396878656503565196865316895691164220567302858975984515139315464443195304 4596669118668095499550943782034710838903496717828068960024736143727557534302 1 7185243349345577723480373204285088000113627827439040702824823163981753511116 4053053451154272105237841078068916783624595090308542348026686842101202675858 0 2280426144127697896445366812548607063393124263370925700956500286133255025466 3348935949135586096556813281984192430775509084561425109726500433023149887147 0 4418671011933570961296775052476556587838448453974626869865504856691474024557 1528040511293036330747815932562526842627418255266107363652957190243864292201 0 4225864484418965044182587217528934579358452020314930567684491921245504966937 4460982247566419560532739507903151020703368070685738682301624130025892777530 0 5396099249871508391798214235060728270646165242893378883447213691136015712109 6250263139336203865237659424118381229282684137731556593505955419375664708710 0 7224278891332892181375648671869878892390535324048043050117802255980283825335 6435113118798480835897477469851483572169914842248675550874982720522661051214 0 414850584943649408319352595503343374101791833320596889132193681094048747488 6456886635122376527026586160930089605574793963261369090045645250784598661489 1 3792758894742702556282064790000037806105791336428378742162284927980999642723 2917031550437387971514259671167794693339856545241189122040159139022495436390 1 4120488143092829846248167395039563980310127782773428421117056740490630217427 3320697570657975296134172091862762359997279902800673094072342690677726489140 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 +657000510038071659568284603137462047641520266754183752351044694309216612830 5638407298721143370285886992823929397721644894840079079749111433736529238880 3991140478591042230159466968253931864253204707773742292180104353951348746834 18073662750 18073852875 1 2088666589620552059176551405269685120894169425572885957110341510107900590377 6825456399919395518978700108751619782942842707104529777765111837158736404280 0 1781227688281585090507116113701806748779894222020912752050175205523514898493 219019815108015762983545175489541833540695254780544062375722432683313200534 1 7103255257209101076679276721495398044747465021367023509042274254931249985385 5462323130295724950122450612318382087484108744464564816945187024727619945103 1 6206512540375287481163637612075317464958858130851905060033224301696373574680 5538901431541628123204593905443681752696995956238194173026103380780556837346 0 5092931766360040338010022132981270090265971653287365968472651100270299232539 2862283507554560495263437841272132214018871863165496125014715672067372055569 1 6555338490459843174527712604210744109282160532342277018238000882171266478846 3349214664006473313826123816806300841526929197425740779228483846220623449971 0 3810829763147571819421867973220063807165069933088887716720798964713098718730 6623118521767702660971289949854365442155243755097346635291347703059050953804 1 5582002673702838553585480608675577460419046042940648444183273996821646624354 2388451666950249190974670316491545401405073578540566165192835228527939697404 0 800583240349181117956360521180793347550664502756843829946764913582021501416 2952694200436146155460509454338326837625108883935354651520842932001456965346 1 4802976341196069067621215050777626767829284086527747408057221871193032901763 7039794682345762441505379892462866966529769751196097722098927370174862503482 1 610961996683823342847432748670245229189931288994431473943849894029693974179 4679155937159915780538742102958970404823744339356982847472512204638530081570 0 4954118771740069233454180021476303045945454933874228549215641901157120813807 1218159010811368834065923421831385722366744274385747812130026718286965530524 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 +82305639472872365382701979347740200870711853298134896890853372009267232927 646684070906328976351811091676183278817140270520498089772089767873564840269 6733854109719045923646278366652489952920575747832242710239717457126407361675 2180079496 2180145528 0 6472311487436628347139100516440831275016734909751098811637094209550637853417 6435376741053417558412508732213206668981498706442097848357965131941576350041 0 2936367049069888345687455342793352419739364505003174548643483481670802354140 3213693245952309058430067620674792389082070819156998616898448286410238622687 0 6929825202406264511793055902879460997641934989907122425361463525392104299690 6327403864059944806274126810872648065857433572918619820372694074725796619217 0 1189207026973226941418917349285152907768989134314097487161361374992115263944 3634609578252958276991263749571902377740800324169715434021472307934192921145 1 5252947495502510451787193549481367554650656087361794237991037862102744520227 5870736712591730277796074136241658302813152353713667093265870109859367019342 1 3999590443150529728398694887273701162985926793411187838237805314708678080717 918338739248341146072023545233453245131175497318889035545538998234540068068 1 217446786082289472648820559355016993404528679120293884285623688935201493774 5608333419573814890567351381913617739605198183950699123640987767636569874210 1 966835718743324222543797921415537575615026759110435321417692659736685935407 5814444099426248264216693615704038750728838555909585204464663261899388371873 1 2344473634996894347324532572876610114150849258160926254469710394824831516048 2801692439862496355299607120788469345053736050170464489839721896375418934828 0 4871086586118521939764647185124262599476955771019184951822267117303405784588 3020759443269522711957918906521930358536313048448555759044595584264687909548 0 6418503448178957419631378567832700567543684230184959476386838607298453902381 6989697551117346405231501869922422236980682035184391882461562697239908646376 0 1263487976924582745650530055539007704817321985834544259802735646675171503834 2478983756586800477896085335177274874903916731571528577378465939112067040350 0 537372104467104356370927201155403729452279447895081886338621527456019550729 2553660032204632172592376543419529739945799470022130954058558430666216764396 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 1 +4630734094668442626917973680368589728865110854154422912486420257517844115867 190754207521407053899003843423935056084719521096121004918922217467137044704 5298454168976094155262244197168382157144496776177371828503588758169424350460 5749082835 5749190065 0 3541581505817948439260717793139481043114115922619705467627835096886685355653 2438347803384822770060979456647490822889041492608014165792504907620615903483 1 4655785329762701025530507790206105713991385360992581394151162620860589391762 478351287683770510789541939206271205191853494244386959141051662656321254954 1 6316697486768005174323027096864158868448060962624762663825225453059824751396 5562293856539370522671347589765061658067035728230984317904007436769889249483 1 2062626694480972156249645076264271170798455841499439705612109827699943867755 18064148075685997366089743938324404664032316198903203302320585194580464680 1 7022327123756833214871884838671492979848282592144004058641064495559179217806 4681052962078158188119569709582954127041149690584926643276876279910698658279 0 1429811010394130120404989464412223652369262207222133845354061149283961389725 3991262912520156121359518254235908654339454199489591188028515055586251750021 1 1483105421385986889002735246816943219359443337727756513215999403873080690551 1841243662306472317031669363763324449031325173097489775556452546040413390325 1 2860158765562614000004707718600095319327247308668739430996475859360344622758 2567780284703315122730375780462438060363496530030136494536577854933878745943 0 440762013614083864702690325576740568868073824040830364972813993209590855904 7135518748396379962292564427877680506833089739685135727171246196322620241956 1 985810401081073983330013099760338873796265029844676803612342709256841550144 4473752583062219851802710356245416141451458613415297651507569172740686312314 0 2480945456196614330103532521953201989881252061956788637201872865988558651559 39083459107935642933375151291211598966667982631753820829079052597598380191 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 +3046094362262060845414868223407824276125862805997355761741047591364017160392 1367331459354302711340505338439675532184164483449380379548584202020089769858 38115158530720743546783030979286377579480848573967455187566175014864922705 46672291 46681953 0 4070896530990742584585110100966245155941547541347505075184194317986932129072 3738193462696549126326220379988355778618644106205112255714546519612344625788 1 1832559552460101510209815327573271383362725784854473135875827188557697768429 1989880921554668355783588110805669729834224552032895892889784415888428376439 1 3493351589119174123646865079471518746233467475739343110441472341377740009479 2084450736551670219782309853042929384982656127680482724417408576582163367499 1 3883816481859842201214257169803304354666261473138895353516652336991491713108 5105507648476189508157667044736859007305783516524618587782972309030604952357 1 2446827956187767868436587574831966159526170497312134143960362534089217416633 3720207891335958503570033116734180852686670431015690299086140340508652219380 1 5701155508572652904607061401327111949144892942294517435697018222778052653097 6875271760722767384214214780216937489530504776671642273132100946629761913495 0 2273530675559794638567155500404869022795036195273232971787547385145808404525 1353638309446421049269133480172564603464933993001047275001466010914052625043 1 4778383088250133077908800191972919026087407150340101868878817349848646807609 1159378011049892800211747290139374402290384246720016498354417904203456462647 1 6249310125685738957542444451537103829008526366580653854958938149728284651616 2069564779814648207921815914497337178100455719469949296214129822445000159787 0 5733776948458335505431135920777756835444218339542232177573582355702190932374 5461923103870659802695000150001935604104546401736351627687461331607116785680 1 180221399486395529487712013573814835785889781824064534904113796692615699644 647039311860984136776775306274932901251719853607431554394211350897612813082 0 6466333345016359291641229280934012104648732595555630679487624027935042161119 2092303992023618381426407081857252880133236489518219033873605695172063240166 0 5166697050479634752126716028639477242478820332177281784739791170318065914960 2799457043062172397792282327952747535941124355357519448036559251103084905880 1 5076358001873148322002447952972769939268943642505974868724355985439644595520 4106407436109705082056521589217773355847921586231929266271618944873220824565 0 1566838666653840290148503517266490486786790312633690005404814002888013416241 5371669768273597149174698983667332452143565853352447763668746512088381553229 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 +1865568079429690714783490323664084965394710594269851343236561854242149316337 3618756458434793949648268186300971997062744670722820953784127525976788345255 5839344927886652088785379699664164227933425991442747974708658445989746878374 17589470580 17589658141 1 1818873823664037119334262351998922174735945239732005300816330056174574252994 1629527408169511999869139847597946069723569782536461259163843060791576493523 0 73060290181411603908924398489089805474558125682070883482528851740341455485 1411536204741952136157361135908391694780421273625746520484110139831151584208 0 6394333216155319855677028608598166090097904167929400729571247431668716939682 2183995636224671810794051622950100701032695513096980898654465044168358329894 1 2062459621558854640683953924526490679479938303446951317975009329054525204509 1230588180392653682872562479783358958101420239805191917395690609623813884464 0 12124581436548686001466078593070099154130780682837470391240079731504804296 4729949462696849475249989352463146175084973460832358108418675747670824532815 1 56937324930197624201577538518895597204310001284835935305087243412871042751 5492001403413538821993607638440812680366780016279490890803282953687136529743 0 1872647595595425217928325356492773544090575307992830159331777657626825259421 5303468135892008061440324393105561883317264575041129475606135948405777931585 1 3396259807707924139772457030816473233612866727582619625488485028430493318797 3285595247733356994717858049734792910155977500153057306467933505278788137424 0 2855712535144297818819322830036258374479703334457222581573601041353117282098 4305732561052176917439169272963668204708626787976590416907708522606992079871 0 5289157800286976355458121161606411668590324056279052876937512463608201164004 45046525074200004062426855137178230477949287473410773360037369454492338753 1 470271398945060857551370216241048640204128787171006469150418762846714098998 6021199246809117055642288072888573590984985845281033565243907646364105457879 1 2740286081182261945218207432888813761788750625266596663213955697618590814084 2436343533840502743892411422196862265815010361190561182811091257799947812925 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 +1120209280704949719123372149153087158169680731784576547460281724327345375872 6879292414975002343668960048505582686906986261198802385360147121795428826391 6070207998772760963559863886973328400899063437677305114161477651687273435260 2875587366 2875663203 1 6161944302297459025188444330121849708272492313461929949286541699055005813844 3674099595241139434210035937193422165493469007951075741188566632094930437510 0 2861893693530113716114039498049100968070209584558653669309134523774580148264 1053927862674738011289962327575577899279628117227094978599315588389754144844 1 4002354558161007206714491447142476355131606983640098867709468183215017819300 413380377662929591424015340878468542598016047691105541160494245852697162294 1 3032303708100571518162757661773001726879084344426837946497569684252295595781 3155769357946051365889347074700281992212655527429342993968695646972314475040 1 5010391762091509962668962437329005679933739331245985537842806074541493867109 6931218007167707615699647877654981639714496840179537332967205120336292914294 1 5029050102863239299718235470497443329194739368584468919662659966948704702269 2254621956589641126932220621280969131442213798936178256797494401129973386229 0 5890027177034589194873137100567723864552927401453603096942185112078021395459 4278576231928118304344163116414769315041359575130837643632110576250073430426 0 5275736724072479441269198998183884927433864217130856049967059062009378262286 1014987897908223704318457592365181785149638798457555805449008957091044108592 0 545349073615116825070071815299239324025450617590922661232028093055488944379 5811278199565708005466886824651209854595220183013004220250595980927236201286 0 1864760019213764273369645050316744335633205960198138967501734080221856560133 954119848428133061068356164596292544257661703187772497872563915727989949077 0 3438131511756887113304362835531823055818014128037600094068858000352407282787 6942546227104968918998275572513586076314079026559043007101160604536324990266 1 636337017767903855521004994847573827015111012817337782774242594198209162816 887321707190165518761724205170388431391094422979710052592902565626708472233 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 +4510634051002712137349663593247665269030254500682072477146723556748366131974 4726589157626610235294987354098830249666745788501620400246281604277647140679 1862463443713841137004177776884269286452435950668149152741163585937843251400 17000665815 17000850210 1 4106307729006708004842493826280658809551080232612848374313144057154701533302 2480894207275750566814174665775344902103839856914391812259599875945204075883 1 5814351043326152948034321913512940037105906463262595682709505367200962950150 6561320832010775431517324453481476082482995557971498537808873994655824674884 0 5677834503697205094657550479959505059943301896782522150151099041113332933094 5686497460974118305612769776817845664409677891228298171022649928563578854661 1 7087685716508819327411501446997095682529377951399971441757949468320813791453 2111740598952877987387803966006248461412820226723231576011037568864117948105 0 1773701341741905487595786005988623767157970607654984686496014959747663292584 4185347575158184110629608261014621424963308082228158453635159937764975302790 0 6485598233420792781714700736647122409267000071333219678583772611169195181690 5589186448027350407533744043655315649748375905994629752919778857051352378449 1 606943355284792485843875351746950716108982934105359194218897231124556029099 2873431246592964983877819374547444627358548601595817678027644946491449213157 0 2141586765732092137242970695257029056753702870890911197459857480383419268773 6820029666008527308328925321349363003921483612770122957404965583498427001572 0 3664738639991941153442978880654058981347429153634301311840844884826568565514 5323283798750382161644980428840550450231347435173653967093148711960889148308 0 3581428586613293673109789135526299608364901571510517930974603559526289208822 3714836389676117808526576911237413000473969081765790653763620575415576563393 0 6689738105435081523787696274289877979050497952434140978978742763007867337952 4949904108027129624947161570788126844993378416592965720732642570205508813824 0 5560231319085748359065826677239299538382586759554704347812125214655086371153 177865380135004783040460998011499714074058548334027453924899064909699457502 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 +6585189975036957081643615360757146839286912266431404841254871784556486320386 6339389695990013556364482994743847938261795810797812938666108494846190458722 4234644092257649644454705355600759618606631628631370280065182273993730381123 8192960028 8193088036 0 75561967136654285325123065968211859584669313265806052117711777498715926774 3702353541728608203859326592307307930411929381929949486944091276921978847612 0 2743214913342814766176790621508345400629093771905773325106872962402829018534 2240217667437706633241679059513415340444374879254314104802116998009936724407 0 2919238105630277199974864135803243145739029791642070295729007181311679169532 6139956502921261218814281367958155058023996600626832247529652689125111643340 1 3543175186610232272657378755495130539891198913495557363805993233844121370339 3387820186006553093737623033402790273198637355081297446325438591378867618656 0 1178206958616660043129198469466453496846946091266939157555983293634964081417 6125242222165019018737439674472588897355297333719084641433306026762911149014 0 4616816620338994290759539204634374008208023786235640357150457976122958558479 7234840857578558191894129927257895684401239466523179564481610733090575896307 0 983442412029669647565119300487156399027109235046064379905005391131879005308 5964151450909467506185428897180855164686619595979617286257214262209927978007 0 3658647259749133473439719896725636210202294262581646683056413072208722694989 6958704132181572702380502689073991689036974457322786496427149529751025512311 0 4843561766755161080365069476305427686046261253511075928430281210938022079915 1583909946357092210830388530508579496449115908271002864475343644843087147938 0 7165571529483368224349255122436775113936047056193451621249037527755274149208 6823179708487107300636152475519599892976475704877867649060753079149946578240 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 +7029746835875347709910297855878699600817561661685226164431627100364408657992 3145068512452069635970012980058107823314097441678416409807851645583899305988 4690184568570414250828964248641158249085498990269983164630244128481871229648 18195737995 18195928761 0 6410028802297381381334596469869642208202487764683981910955603305311065442300 1614083972814146941318906637583405067419303362366884840509651722376846522626 1 223697934254984238455773746335231350908036303812436038804092536620474575611 4289259988377479999155832117003891645408312402455596744568296698621729959211 1 1333176170104380732189038945504646869912548385295414271393152400481678312633 6861295652211636669097909132283971069436782820333467685612532639510679385178 1 3119818500700612964848103022371101706248226282167043685255989455014737812992 4927970339758799694104317940115181479026854502753500282718348941986453199152 0 4300522633582700896352867962248809530835195301186650503767747903926608030385 177448133995884412641969125501303422202968665257046240897559601726572424360 1 4854964704420953336141721637600665722875628996825503988457290673041000180479 4749772724475314806165170663172725155745531804801947058405534200987727082166 0 5758684052685517738934055866750540461732123997853380868704753103479124237061 6918183509281872761666136520713736178275176240985210350965971365645415406059 0 4930601502020010830571053209569602016649814341880004214289568274931924403782 926569666400724857955496566311675718420789261417653143750129931504184773982 1 2888545149810433462380139185409430412473652396025934816442653883707738717410 3027458986600825239385266571824574866256605592393844065385714058900107652601 0 2203240266240115128047913542531318735137921244877839348862176072628274050372 3361223308923116605735583285712910181957724875815422180264776169712880808946 0 3842520623194960678645132311482324762196657918303405730596063696051067280166 5240093882508821633546671715957649179914375988411896450118104066706048146343 1 5370059975383356337657953506195486116590801669004462188384319633826615123038 3601787677204411524194356035196171378973584312891456035693278172947545740645 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 +2061555181707113494213874489502433002915850845656878466190128279665994441274 1530406493121035279824873824985978734446202007253393006951763730045138756880 2115631669791264740271525562376684513061590563904103108860394654842053357870 8059103403 8059230361 0 2652769573938496869358018472547382984575489531226172094978338150542820950892 3571768175605385337376571969672207753289375103864456282914458180716294542511 1 2185214538834360278729872754959706873921705308285917147848020132145812753384 4387005109387150918761845100129197340336982116402514663767658755477334306746 1 4653497131269326516688769358837969769252501366717345432951492747506192206742 1378124097028598102374907086174584242112215732952051345830702117188505017540 1 116577415468875990079534858720907738951866717654165586698579817543991828388 6890978190961794748066235699559958562702857775036270764945627949072223375422 0 4053254318954113120497624948775444062361139619994129500846726905117214419725 4767511024605726069289709445272012731949679599208927903669686094758727285936 1 2853651279362607827690480990110228295983570559029032763486623417477504982905 5128395434670966524033238837825407070405344493708974362106440445292280307672 1 1693559702957571429897894562402820310914004851069622471176560457427489618285 2498903185468056016667594408343689674966917992222418520570310623568709952993 1 5391851310148979383831813292651377796533811704861964984422036095056108248009 5536062146737941934608708157409112503050349933831726782375386482268238886667 1 1857886491031733589228669022808995795919307616844588261571477205651938717684 152043304517522910232072893022395950642947518858227434898168810179556988082 1 4814267993185982264220229101160424908995521766184788934858342901203695535824 2518676598468722736672087323647018388560311650202141037273268004698552693252 1 7056216420570174657767245213567396848077000168704316817346533878406549322743 5220206257666153299610299528373302082280327357069555231744702221233417255891 1 1019281274627671775073747399626249265760855070200233985223741460106927700390 4272377156560424051620383988570456033428729892952425147216065129800661207137 0 258703955954202736603435064550252515743583642500042967661110500285521204030 1943121978191481054463506213536973761124324300009761972280220028756931832708 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 +5993439021162471579306120001945673585962088277649504280119926840848696170081 1389793378545091602466810380491025984189158068118762948287387073578052952374 6964957652015353760230429659205450247063300859485519182914261744630168416706 9454156278 9454293786 0 678611718730475012836371858313745191196018792768006433373070982946245345898 6231842130771094649682431645328118841420740632413652655672768983376307358463 0 5603163163703605052611717899418168736836568983689984193377797024001487621378 1132185265142290704957667309276966419798146780469674294617252331359378441449 1 227806989485550322717501988653282176561387537280345452175643024483933654613 1791202030922532358737329776881203946292460418953947120391050163123271423818 0 1006969787620331594495975498461427731032434580910430642282647975023495240398 716237504462567902314081394907380356713991847975501015078505345558513740803 0 2132341000958686482357322228955549194955349571069489387965631322892689646579 1522534387231099359665321762711122804142544524991553767365061912053705703989 1 5545121777201119643763736656159576337848751378753322657885900461019503103134 1229505804126469547444085368823165627413674727880931565266981868056521846618 0 839534151720804644730677936399313762718060888223064597307365030231139639662 5091488299679182889068706617548991911739025996014278902047354603662100680018 0 7168741777830499926565319031285412541112655757199114134370299974068305995456 1693205717882576390017851902117212801636890448534708388704614256618159701777 1 3984231011782273273422292383667973323789490697000854758937745500167990577658 7041078260958022478066878827635483929779307894225129481782089261793715605887 0 5263458285906402043281543031790274806724860596657903025337105568122449305467 882503965795724008190593015469267369069565389426552617740297755908925830233 0 617089256775311680987273662138783573489672709301091802846122274534552911898 1922922666489256159477459030286342163904263920192467486930160479429728549892 1 2375945960944027123296314725375768316418723511640484600859380970585628079877 4157080620591651842766990831012098333360382658255042299669089469445871162108 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 +5502168850574350291966011931562736830282905619300035825541196068585088761523 167791764965416389319322209921429318172830498041088869626795509738955592094 2168642892324501867987045450244048205882064833636335810984608359648161308474 1988628645 1988691711 0 1597334699686241990004078549023319618608299261157235635675428301853954128100 4932621024427793215522423177890644324995776477499290818693640865172597030346 1 2953735326093056242331479177106758917916588817384233093143839860032642708537 1602389897620597834711663398578675259927032259067401712616142270240290334965 0 5843350017155713552858163554946152544269969045893768017941426686633504724679 2342400025500245312290712039243064994784944959972051132793999208550230240609 1 5024061040901141575034681574178286977074718266413748491351452030486374774819 161834224487742892379858349957563953591006517364122033393985909372824539372 1 894643057250683324853246854201873893663275707346154458433790962719006174181 3803497175441443860369517731718586472684695683686061488330988102143211772676 0 6799420864100018465525820572666650820406005672135792845510959089849746819153 6087709886179349081846884867652264964893202729672117094530194310149018898169 1 2319895010646126371822547183118292626123812940150982134895390479147453236320 6278116942836291461881838079157381029660507513671263397897343749502343981923 0 873459018115082015473950090968863172037769941610734130813366438517973750736 3145189002151932300772130177371657935993578954084656131026167199914081033755 0 6161909742358005308530925619942296295943571686916309548876840668315982302942 3959441870811490867045803788879638241859125193781438078956680755025070608654 1 3795461020737960717156918851338868063735823753743428021129547957211635494817 4989501831128862696776387819134619017006698348055878064025484736033201441490 1 4377541451482272345402794509954762916432440694825607616136403482552942562729 3766984225265266242834612762582685624445532039676427427491242334997854770209 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 +1947977203697818800548888002377129029795417315487050368377871453475559667976 1560749433139635538250882380707732848360116655918123126031885670516665323202 5123611244079830286610584162835919708021310678645304381072660951742749625238 2369094195 2369163030 1 2198783670289305620636059553218641353629215433344943196706001901788730987325 3885113162601926804138076852572219859943522394564511431112160322881134740881 1 2049970577632483078919639866935714950807510183063516085185542450752014038839 1884002242109740137455424792308142340320554775543180708430088369803874468385 0 1628141690350971339049103980396010033780652355778932262719581124265456303776 4280865652947079608004346177774077038972094899305631006375130989556014663818 0 3444108628719114777511812438336262510543718973342698122461589961115493172181 5656593394894677778353189203473963193023498569099075449062299092578355031595 0 4674448171892947647133447195868368385671300170680933127418138065830201957609 6938752625959157911179025797260752123685231946399280692672152881640136665573 1 4630587993847144470905081817329553241682094758624824250166475657496354807495 2323310950257680415172731491958448353451368838731730888824057153533242783763 1 2453381524978181840980553843868636454140029742757451543554913749626316570612 5095594744980337657008108575433968992216100966246626720304105929693513881423 1 674861370888077231397400092219803303139991880467917368551064485516504836904 4583133406178801127890967643012562779108995294433350801212149897530795917436 0 1359592978933100660381838362672183791982708399425721645410122071582556113735 2506902160178254674442833434709063158152224519517279001730113988859902235925 0 4428327308986871382612564822452178843846650685832915964713693171737841268776 1097720773451561401237724006183642600071351080305552548629958235942435308032 1 931916628317483672588030724839480730366472957960293164041523002900091395063 4782853063882727951792640863305635286238395633055109033645270363861793074965 1 816429346398055355844113716050805900572703438203698873225909292531242672892 5406721908095803136433618301275928800525280562113991211001878735823045295059 0 537372104467104356370927201155403729452279447895081886338621527456019550729 2553660032204632172592376543419529739945799470022130954058558430666216764396 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 1 1 0 +4194803407173050929680639129945425151489765347338503875830327739643288841207 4924363630467253631303764125467932847621340468842364119682851708642619959473 4959550743325471149892012358806670345927850997697781429113197133802435171605 14917049175 14917221901 0 5803919195054243723195836840827009696834890718172426583704254883624539317360 6656794345749591842882278043576572930069931072830795270669676432359197578670 1 3991306874503425108979784800358378769780245773626755621753277461877585886255 6081725284350277265375619058738681361079411920639808069723728996526526524255 1 3231361998190124831490791471876452013587380418616689095212509188809938740520 3507418060470830147052033116058931320412796142001511046597082362030177122883 0 2717226164225507585934836412782182349891208757366502808467945692454574214861 84799901387362933606636957563807961412090253946739279838810672514546444692 1 676446895410267664194921010119564232628416736673042831451664918531956323913 5040124858896524878011731278827834249929545804241720172267515436935815489154 1 3571832884159120212381714613123146547149621779239430620614336469311045298783 1524641697711139329746011451965353624509790088043597770744937914180364545012 0 6266451069569404024468018644615445216524889773807480608326776815771242458403 223342602664051969784250890658495217880148651575669380329597208405528111423 1 6075318603718894819637400266103254471492137828075158147806672045809983244141 3382963624734540493496399701472070816320012840167079460134406095312654768699 0 4605248575731157617117378823688632800708481904680245679919852539222782879630 4673739478423532734122772259542815535439835040390638792256246989448415164388 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 +7072393655744481225692915356683783459060985886746292602598556521822126887269 2483874046550890145057109674443111794564322057432984347761932684385534129831 1579416397363161962501809734043351026986024239901290838160714250932902094219 6171993856 6172104960 0 591904490643434949204055560467824649232874438901443948366620877399212484390 3558845776999801399072868596866716729660874011958923804367272842171752797790 0 2938919020804264028258247664762195516536202103943950973545145007678648014891 511201751247403584149754246778671300163663577320126666793313598225172553529 0 6641890930940976206339636371783676478462951988146169841193740303716326026410 7007094162745763951282596281875282350782010038535334468823721383516528361404 0 3083338316045127656207456375876285209584110974490737283933076228679209157841 6283464522637822617460646252876981839374150796479309239894511455006704109400 0 3789235587513712692932439110044190721694174800050988874725140323870945854030 4007180281295847935536032927336331458449446099825417505859179956625459241556 0 3023891722778246352264433929670708688553394910982558108063571386296394116078 1368039286502113361681871037693272773000794052096228554858194030251301819988 0 1094519833671079122107853176168761967921857962016019435632986669856726898870 3032639767253478245221507847701604354212049005508180450092262007820113364912 0 1883807808227960622544505253413779168620668050247833251808909403467344985168 2756286103590320852193952888781574440318584319463877282952508720866009977285 0 6352153777573950443312824031270793487412979469463195578056318328457004823327 5881429610561105765121081081119369894023926823675464439267519145815987892192 1 3114660823868070790040178624214267552057128245596137368003047008838858679199 6323402686526795992155666879374837112180688248015737092409711161827825798887 0 238832790677433003107571023094556285750803686940162488129549679169730048516 2023952078570061013283087806581250421699245522995436261514128563120031085742 0 4363874635593451988562759074909756991275518645475971781208192251458420266066 3630811629581125647155793592111209320529071053924093493187731932603780049360 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 1 +7184253405004703754574451552574899684076162565103112298786474422995812059496 891450977814823335049482352812571605626140859941330282162726801669365947421 3761160220805017136698380963022052083947238960840200988772346835793969432092 18585052410 18585245206 0 2156891670059837974119329387612287538980487238946563754786746783793353841969 722964833851832012296848688031943460298590532567815247472638046704598268268 0 2842915117135068707554178714640402498271835575603062731305467458949582929325 2020669420144150890036370977737914973999989692666848596634344594141039502107 1 3116769618162323545205770112991461674634056368004645624688290041646469021300 3799668594210301056232192448558354408842474239926168402649293735674067170792 1 2073133321974980909608758801773311178004601424553913638541944361517757671118 3411919772449501320352205687881713292734161739005818628331734688113344407471 1 4780162118466070843743342983031494383619141247395615957263543272771084725981 6262678555501720601651664061725792721921371282738142909000627150027348946674 0 1498090484915336171104884116378820783102901595798082527233382837041765232851 2889566169230097734300153024794380765009497261549145170155115692024898151055 0 6110085207151130980365295100596102847944706751216161493907961575750182038225 4355781729477653254531759603253656753485331641328717403374206791569695015704 0 3369507135374719314275907998743804216091118776633391457569452230776187874714 6254642102695510997715132100483894246106999847939314651491992025897903148786 1 3556470696071311389125395227477109011487332110752872564701119280215879297121 5115694335641620155265749319659985541727415963563781516811893973166517414550 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 +2353922765503256233259818906232183465619280397853510527059797870303352073710 2497708853342019240445622466092020241513370657249976023723463636676268548898 5861900119154992936651391776335345676944826475760657232793855810725253853736 18536692240 18536884785 1 2514819429373823936890020260390179382274705473881621126747704107609904537222 485241381922295683485005355197679410938218120169209630137874864064620017718 0 904024376495134458819120208889192471215661054678082984307800196442200557566 1207455320710488241977450140167454980230236296813320382833526063602109466735 0 4960550248019317131845557798363742472516929014993091019378873479914971002472 1258230465321458395956003894236572114366915238811511398883913901517205955798 0 3377512075267142487944549144600835733816612333045472024392461406977407707217 1876235605675310095424478034612808774110264676035522155814951303061656965835 0 4944050773674388880872276491943686469917538204161014629856817894747342459523 488137166054883807061625099676970062796602475142529668806768337194597931932 1 694892852878850019471471308111255268971254515431863765986706363177254326396 4995519833685175132270208982004256606211541671949493753459823017238993010962 0 2563783661083782072344021234449316696455460107373988400553103657296130505585 5708127484351303562666554256565153758262619009468073807484664503943772364663 0 3579917622816546482069419579501416753788640674790879061805097357880012569055 5530999236113438650497165916087099869465102161676830479842107211418600841428 0 96529843828559316003096390808339571280546092351914397067690496106338103730 3226060154035040558830736615963052956376744899930301784445800965542644677286 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 +5378123190510851388265535943746487212588176406478398962456013512046921398229 3839494038821843797472597827935049400363368376317828825505793083749381562667 5321769175539116326011695002359102361974192300838634081694375031926796759199 9871459795 9871600305 0 3631719728664855607418604866498542852045328720830932034149073631073837437481 844620726943544145080358211378992012960278060008445830015974151120997517821 1 4475324461399493559748772900066271772722244295992270191857619853508510134398 5126186491036650717044984484065316380014002752666468663070776715286230535516 1 805494353867472177531414479015272388998340396503652873782960116986153326472 1153607479595859295874619337152999068786958711481087539393801195280904079942 1 3029715366596272326228504258139550634081069811911026134116757533312017639256 1119113742296918997440269190752727498324203390045044490909632274144488370059 1 5416756650215200035266774505067861660667994141680326003375095335347479235245 5545618439062387617427851718923007371076744973138334996924854282203155863295 0 4087706107060010260962858888259891353070881986038501203702001135041480382017 541340748365970964842332607226097538246362976999242191814917653202356513986 1 5454419042726188071164631111695883303489696762647665013794893624704637526379 5287357904810577883401980996606752857079113323319944706206892627777959883247 1 6787340588324954566174074839946963991684699949652643501271715180406064336869 4682206839839850910034382109361425729938443133249327851173718558697917420977 0 4078187950516863149511574165478119341482155638887350112452696866848488259674 6022144858795225497425260649001409808726934290147739401524540271089151145888 0 5744805743392285167374103146737723378668969235270006356788781663207606751687 2944238790950231016950657540592301181138828491183053704398451779184365148927 1 7137286179359780087754949587270539711199985620641063612164704317619563975720 1949337346142463068380608208256791264829619082308859690140860352837183212754 0 561814237743400406542142311117148902319250382300880780368843615938841321869 2071272519431848710357747089318160795821958947302180642469064956719530915063 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 +932817422643771487121891139043056335220169524197135586240047344798214709127 4755301215187313054775115451559802849899669090929522495055898243390271737505 5095252305840255409037829769942940047274428711251311350171524180100450434673 14934845206 14935018035 1 2681106320864001997816203152399246323086158235199343163217052558932553057275 5339958450900184859323170786325274861833484570970785720342829292812871569541 0 5196857368014184955353761326915986135659329278381710662021280443156215425885 4768170216566467579816477324559537800874211731148171565136289162430896532578 1 1352414394485721133284239004211813001891290781772746938649891930726279578087 2598108833597414157489056190580071766644400425272444573124689758167646707090 1 3561316630546992133210734146492430097973805411921550854603613312539436183555 5133948284118245431894589849804663709461168116335070498249330502662080797617 1 2132466828800290797655203353328374509194831384915034462616292032615348331452 5447238903928296190687467233636629937332137210323855731488822766463630786693 0 7023298780046871159299240814383033087107917906204930843789787085532597644118 4059990388231173917510292827694938161905964839117698073878548024776633287482 0 5766020628818503235619306329587090825502763689446826703250772791917777248851 1881538633127657419721955013643022283163263108332181004103652201881265971329 0 3510416619494388930577079334320996136533076544846045067977046714442923444378 6769061921493968162340523446806729216682885564340828321928301076859573928835 1 5086631905817580030475308643809587630222467468745532269093028717522788058806 6287986407112420201055470878321817027415701267876743573552162206923281409860 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 +2085673608598939556427473018891853587002302013908979231117682873755234779956 2975191764011536043289411985928037289389659648367216167614942473025337709312 4962328364505898158687937524149730018591522851081827963801997287796177835751 13304475003 13304638126 1 3381781650657660426517606266400411495605604635974216365649819186243009320335 1238184289251207157539401338260991469149597832667084116525604774204079971632 1 4680275185522213437385643113386032040357524579772310285702959367554258027217 6747680225308801186820663076796175282676230348488628196252884812939185398946 0 1603324517437421027536687287650806864806982015329574038443393404118987819150 5559634892217668772685876595811036918611236310591689549266190925108166976861 0 6504403978370350670177027288463229276316012708459345152441442541632338516408 5167666647343551216868796963610636079981387007377945192831420197995500890625 1 157729978724255914639546208849080392861064937995143274193484216503299901223 4541092546663942694946987976221009139363556380809648787655379867545299221474 1 4901526446197630395986017806947712227136651160521127553215009417544394499027 570763913063608414290018067394308393322580903124248121927795465088044396977 0 345381861705892949212189482533525502181272822578946971523118981135249914170 4432229264287422473202638902862983791476051581490673919037321543945643152486 0 453622468996748084521107871571652473363428205605516207025366978165209401433 5196899333588776947889810894868261022087088401264719912640781839330771928773 1 3852044321776537399304691380600526192108826668008325501693051365578608566439 6834230982914423619411447789143147786616602768015213915610397403813769186863 0 7192761292420179302129579462205156909924714576978850592355619101400128850727 510733495867272632383278163124146978964317160213753708867355484243976936604 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 +6847126671662034576058564232163214542879117366803889824615966158765499935787 6341317222916346348593424451879207039567380193435914498975928001886294659959 2687149370660219099114956222164140812500194678224961996290125812671828042260 3388661650 3388743975 1 725006213919916276614015875401397909963824755885052367791192475520663253881 6559572727707258021463671073947594237051701279092552719883072937610553692188 0 4897176798874019681120031988237421388396187160888447910402165606066673252459 2210344882640715156253711221982899453155443957684512302265756557230347904261 1 5745465382790022373651759099102557636243415109276115449454823410257303510642 2332460391064345896967066623592356364478464154792672799158147635892410453388 0 3897804671231538582463216892500185786676994612438467083822518260071675038717 3387099518863278821866936968438473171237218693548726515245549482676414640756 1 3658670835342096334404056654219402491279145580252341776151305126958868955833 1215424971750937887195287115229681188543861607891858648099890002742283080849 0 2128486557057371426897783318226865584872690718107010303502460843960531193086 5783544912017060950205275895441467654134437055797877288432482003668961239831 0 2138982145990952401502878243930159279886614311506548961166369553970286240013 884035583460746225561595103914213537974668991418288838080642560145510901931 1 1104554201623660853370842103229261348081838397270263524474297236755914947121 6708527402114393164032110351361492096016848850490979413264175949782412376097 1 3914570103627056334294472268333809203031151946565209749951467670937087312547 520721429376746593930067171151099937246938358455216103089752904474376966428 0 2558148855220920067006845609458243732565247140466083833115446874069371747570 1805781388521075420230298832670331687202068273587444517710369741373121127035 0 5339599540966572208404735131460409459909016617139994042734307833367594922998 4918746698209415980365663909456157567576362410325477851762380013536270332275 0 6038409313188205470842370820311709824940400480178276867274580262473222759672 3844677783525627446231379560612454246446929379098714676834434294800995372176 0 6254660218184047799058844752312631541515721604599321052200410875955328119413 6668904853337501950893853431410192202277738315069756455363051220285845715069 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 +1953335196527100061590694228082954600820640604394119616571186644900170554164 2179285028987485713263048468671317173521291320529428414748786261568988533721 5060734637984164670903817211638605814683679781524931572379501518849955358167 14389967481 14390137128 1 882970231171546546532235197904475023003433610905340343616648907902874789871 6440400842497756303037495357894665666221916488161155194271531197665845189794 1 1437209369197126577461882696075692256147971920401722528367729252386368800019 4537261445468500431086553521860478438397979508907670212793682303037242521015 1 3167828672388708478560951884240837338829441414821904508064699277009469364821 7184281326263621444804481719763899091478739184959377169405013328496467429352 1 1360405611557135943710088962197237437092188691111630776479632883790651848340 4079116792332967405438515936601612460954796225851632352072342381051008961663 0 4386981474791048601770821757293033199924865761639650349958139432155190280085 3084414670016868494340673423142804256041897766949596745841476097060734637799 1 6025848852801220224900399380900533553656971409992359502255679093179363142810 3858712048393526351128287968051057953809983379740221498337691379936736881946 0 2308599794234779074021715781893425952929920926349934832512617587627627472493 5743063586771158934236937877888763028075559673773072119719065774768361042458 1 5302263145889217551756334268749996775056891302391182768193433338806120515751 1047349442332441437499287059070038410633306935433073758647542078269625616528 0 4686587676123955859635155376369780633517757154034127156518835582003079426305 1551177090832242547807505039312132469530975076441320767313614030089519560046 1 6500585269094957684704161854311946358228358968597450312335870952684390982620 1033313086620346643476614916777356148304923782721844335166213155637814104244 1 5940656311988660157109435944696900878621121569138637646120844700767637934081 1062430659203109350432626789134757081877724118924383120695243526019400070562 0 4146711549669107800420400725667138277685886026808096122496422698645696975173 1859597067610819320209456124366767882989255050838696794789402341679318293046 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 +5465496717067475967173985531128205134244742752475979662566986840449570082259 6871153869929936698055810907875984228910343606186853417703952896041405460739 6491809087910217138862279414141911008087828673207636884876754332330775870688 13024576503 13024737901 0 6048763770515650914840442046167712252422074351897012873076790441470177661953 3074848048354671695103249577555464665146422129256038563727141557914624020761 1 3719098891847424922383341183209803424508942757783130101686143685332951460154 741477217290069885289274231709755805162382071922698568221964184104058014040 1 6199853006026578261220478548395221085151961415164040277478633638540802092049 2168178505217287336427128593517526640250272061154269652222048296086781988003 0 7156303222923223429412287086869147803905012426022363363877696700406630359332 447631379948099532842700002506237797028592997670947740194167027615338254452 1 7072959331610564854938634136861738180426217520264845058614421309882656414803 6134542549314976035755347696149326986176206853586409374671937444127726199730 1 1381787518369382752023506918001335929992094405741236471563825756456263061861 4721424769980903960156975788370478505875793767150172392990766051910205462569 1 892691865520997199919714672885482339080658767321573326300458915547322548502 3553181850115377495795020729403684735284699345695801480601571177678859829109 0 589263050901298454981230196673811040098175128003297826681162550787816394309 7094559906859498618987564245938895406308825689735729543302085728042956846283 0 411373562121879096611411337269805140927451992377746461183476101577112876450 3007934315402179518601110350081582777752173448800224800482556413369860116239 1 3483223632234656011941594085496423002478555124901501516829842444993893601134 5005268568172935341720856150423338938769724579272343734235251078032840453684 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 0 +6627249300954642176833472629815175155370908901213953138935225341498168781627 277082950929548687388838006410149432028041252603169240758950270456357585144 1368810756220558132286461294965036921798041682037520922961817686043613456917 19560343155 19560540945 0 4638805841909679261955339097267216533343158272750304880604812383826513593286 6437443397119027781206297993972709465479333871377979464784349469221795348585 1 5869937260801708768599887896667088741495774959213567860427853958209606683063 5365748923804532374129392920394619976594852925113620056563302914221858246128 1 231214025253743791537475396592043923938286044430367203997463378234410661 7113719849999480249924558605702925969873957854311305727865099746643417625077 1 4613834207781173299286930285372979814595180272166383400699234913458123166704 900155069578846552526911854788548170094948814733505941264958671178249107355 1 1329646430975278175892871929806112947321775166913230411235578823907114909022 6501405736075051077697201615349166227537618716290317972484909371828372463950 0 5683029799857900157367045291950286325783630455156830070571561941338440597759 1820400335060171835534447043542151089103523626481749808030691426856083122456 0 7129719484513092989665219006806985622492181142404070201652226224031156317327 7128872378700144291794104588631592228222284185417167817406178348014967026662 1 887654114811466258253756269281247735882935800687230465594500669928133113187 3206798102730569918140076292943992344823609452535918850387895358135940797685 0 6175643519283092235494917497010312848979427441469395840207586910379360695597 1073047280919676853570596382665414619794508523280007612293269095191690192389 0 3263357142581932916681542629176101033397555219429250039503432750975932467040 5592207029660183081685813224902088465170117491427678443881425092998332896598 1 4253011638262720864230830152432576534084943460126541901499139599100510590368 1146857979276675086792626062165035579639717702662139747044312345445575373132 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 +5630036021974419709961798326687347872087530433162844981983411397376111843772 222426229262058059763442120345231782840381177809745187203485764281889164681 6296899523251266274132639641177962729667630893316491049842453018195367021833 11150695116 11150844453 1 7022535192182503664441822367177159657394050459332853476954138386065475815505 3392579813590192733707037791182004970903723240897778619083791471627661940034 0 4954853188700978687378345360288638088023206747799329416422349341810121559472 918519551978368446210040750470485963691690271380116896755230363130573659975 0 4021078447408420114459679145453427693660443101948805059443291316028472866353 6810701528530217183310153387878596034686339808154566060293380375775496435806 1 872525802971662537225523628765315344139460696685573833008243268796543653942 2795030627354274875914138564655791228130089361931188083257796820083529707082 1 3521030728257422101772083879934079506082180469777017450998203737816864822676 648010102392880663170929661680924140859395296481613174773637516487048451980 0 63100180711782297187326853548147857284884482573397542166854523600182423724 5216095853729514720462738312115996099028896056767273964683899586487294034312 1 7005562266003148878410448101582787433384154940097794525798526261443298580403 5955772142546444083277103028711513328813319395065774668546523203404116264943 0 3220093632631944734611100632087424665351194549160966023714741563579184635221 3355082133273027308392635174328200928687590961263028315466312640102660922566 1 5397508340347800627094915317754854122381124093348355725569907258057416694820 4031073525603713290353139596129458612861382079975079200633625463148097986478 1 309326930395172299376312213645427487888301331676319493272417892144822030550 5699550326697245405215314693788709893561290777149707417365209966941074698513 1 760574354165914697019929212944973759981490294477375834649749428548232751231 1019919171966887781941268059692136971948020054216336434990468891788398597677 0 1759277341950091234763010138876873447220611226677543304993482159971276593253 5142211569424160080694845847506554059332738466735059394651191659234064092014 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 +6106816295233075222392282050354465235186852253985953053949072402130071403907 5050943230216848412409236969121153740231153881939034134513509672925471805844 5721054377333004969289600496920171492331286789551893073344441834060277456486 10669902321 10670048403 0 3837889013220833732204914145050517201084453245623434776862110267264357322569 1160759636756896254328981486373587463956118125189175143756770433910765238310 1 6485350235961966163138866132172471410033087655027391809384441003328594641377 4614356638632307912688921093407008750242570572507758793291784796909832742512 0 6906836868005202649855255783769562181133729857016254084402931276240226636578 2835035804678827777566991575147848565291900435797949233708615472699726149225 0 6383021787142512264420613028273945748122707259714994777125715142489744149706 91717128728046597944416836891609311055756892683458440362817919994010105115 0 5711423576254441928193136138638419499625457073440568291748696658694379075943 3467912256480696262741285791617202919301179441995984914093892582990942642435 1 3684929331558422010927631502291436584825348154606051985863732783578567776310 2463865925961560599541759507467704000773519869308929751339646184688584309676 0 6921371048737090552044588222752090745898915095767147408900053002883684823584 84890545437023165442321493980913089734429554120590467774206837831926697671 1 265225641536303050988015482209328476013663930071686228004728920837411428280 3916385368547607179483137784358904019709021324342770885553087866601755921521 0 4127600798524560086408009290914665062166696900946396984939751961680367403333 498885157005572016093522221573695933792848206642887286663961981980277825288 1 4959757622923834006671189937082653611571392750507809962191419246095658178473 5790418348720339503981434979196303883881672525350699193183643115309404442954 0 4508894244391507107302268221895076860482451236397766875311087124353481401169 999626441817684424751792408388180847616038548912567819802796830089384147142 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 0 0 +502670315820777236808449893096003573890774553462613891741120794206545951084 5879308081474849798391968663003426550736279683344717826741425089481125713495 3290316016505787644955868283378578593203159470892957067598276774189033335905 2870432796 2870508565 1 177573808174947287217796826953386017677394279800190013085645715200156151085 1456215936563101767883568974092356054528037879739902359739424581961025926176 0 5586849622213180333592064060733715670835399046698178228654532516794535015472 4038165558096691370858941664401192412513204666839775720243994768080048906781 0 2613911196293119248339783259248988334442753672779296860929743666759622834225 1479753924784638209560347809633808316794812074002198203182139077819089951425 1 561620612764478513612077183360288177634624693255645831248924134815754812313 4057009338721338158863657694858919877565782662628730782474590046959419999267 1 3448647809389367407681058874058145225264610401318005731190567531044897046655 6213945589697235076952683009809324280639785379142513504692501829432425510720 1 4387105672354851589558482949153926867640836190089792786564865370222844438725 3093684947317361231114183571999569239766780715724529351489005737037219560562 1 380322077449961315453038459481713969062862762097878677083453555923448985552 2073447396003219759294522439386841909876501644996814424218482879740148726050 1 4072253116195839921187834082097898656154940159892372629816004751216602307346 2685351633355228353876931665978123758741540190329208232516264229393756681663 1 3138987664724936687243308535771566329102896758528616945665205729707634091759 1814810034293247869164982312632827262178308237170524580394056416223258201981 1 4701734545532617127636121361680924850353621586507713538499418762023069094153 5782259323572705182928198319919630414234219987145344846220990317249781041319 1 2968860389733944831773249499698196504786806249914805365255813598704563847207 2552115978066125180264627370027863114601240197023619450810139748666875352664 0 4487893186982846350820551012067497147059709308401521305616429825841605419044 6884719690353877034313254566733678255436921171944863471919089210264827088286 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 +5284934803096817478223006483217376885209868382973119895311699590386648991307 6016666209710926832607447965114278509972857337030697254095855598132515233260 3933731367045898857357035826666101138546666210273869843857966912273298925550 12230871003 12231027406 1 6827042852901888251338319645798648821178876170833656131761808229364460663608 3253581246164975585167802998893834300677213921054679727886875569474200561179 1 2816158528298499505720167487775707293403397237486100624258842387515853432049 378640638233577274626504347878540958020268737112210390230146952817437039143 0 2327498563808180254386611336139153618159217145383466237213100397077190884425 1847138837706536290409257615581416289277539740992860754393680129056927353517 0 195592914203718195358246189335565343854682853158622136591395253918240051371 6609816441459816761375792020831890330794246489418142970996056419039292961958 1 3763447920750935148110742378759610878988432229532867539278263115873174468492 878752762752943092431143579404099875438395109641607247224087843077142323005 1 1756589210551039444175957714652327339485656665589929126782957147678626371017 3149883093164911626747665846893617769664090790095748015302614535883525322821 1 2118748863995700801176950249253560710410279346598401935583972009122014358320 3529475679238351400405163309080450965504926656595546545072350783449581182952 1 3075445031765663503610467375510309260334065776306486017518572167068959330029 1027385799591963873212483609479354510840705935608620631138657117742560832617 0 6663502989012821119686632759475429537991292169592195239696161510232484749536 7005611617796442312060728466492589573727950348281736821663924590570053724166 1 1791593437210413888302159312681092240711976751584950939709822084204819968049 4133276445956962881269852475619182445796676631134861062115460081827941851820 0 6385765049570481770280180596963212466358781458092982633425901491786135929496 3963826805369936793811078052879029273180391709610479648872613587395558844493 0 3917407373839973853413832003110267497311991458621682680809036883072942833599 5939849838149456921960511576782422136571383643806594958147611326704656184527 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 +3676140574722511194591381604227532385757246506510278723849737497508316821643 4702809850075249334920646987460565299488020063641544686369246287753499404762 2296631080361270695531297018699292763484911585855902342572479911401613827109 407165916 407194453 1 4737503386556455540384951457816463032481429925805642965216632623963061058984 6122516975938277920942574152657729077187613067583108380914544146910028269520 0 2160462366316085684295896704243438055861001785693594083904457100360740349325 761832471346548484005477810239281402049207673108143998927018057318687574668 0 6508234210297008596401309967880713682926151630542757749919260155538069941903 4374596432366023798525360058862541247053493498365263300179722173975678237730 1 6717795857580481615571992388769368422172097350448932602529194069329597784702 984249672111934723326134787137737640872296384839943592587072146981144150324 1 5120183362351182093617293387405772170335073505996017530347370638440369280361 6744755516718635587698989665523897655565273365128186233791016425660755949030 1 5047572578919289346050958438646491822419748705939784130475207607984485225079 6051519224858322561339087773124633983245014878120132191734038061522691188778 1 1210213991484923178421286554584197079718830379135631114364969535564537104506 144256376796531904952666891135335747497865115050945575128017273469427816976 0 2034345890344607663677579382798992295717316122252873041870267209471730042999 3834970137028909806614662467534084213415321857982385955202233259287191924524 1 636951637873849696921320140455178108274637083170111986424487320890933406843 5824812971819335328080758930111995486810634998156164578702557163069106189124 1 5905410357453021236227723093278715958587057192657097461318383558989091483787 3154653358159321140153362856782623915871523685181125911730887143011984013745 1 1767516150050582839934391188016536298350561435376685187304172264266225539792 266803854531999786501069338148223327803764306468067875219260981178125952845 1 4017346141751600056781847005643057887209873161834708667879891487891458467632 2094345314010260765142557090536971673909351434981225576223513586745740989910 0 2613582075701165178844779093677067392261462578099999584095116366445439755776 4275407254578839960140537220454570705317638673656360384436912686841575986118 1 4869069339520244160255267464899981178086433581985431456084561898243096759861 6919529246520157605633302100274329894017836872986478700881051106665028426833 1 5964598802241963262221473266535551736452515892223232788134946931769005513760 2612385415749691871090718866042302826504706268037968605556265253011766696009 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 +850402627992378400700165847996653727832338950152484868541361041033412421367 4857609054290375220557316331938977787982690026199597862514438436485858148342 6896814227926091932727466114204594966527572610731172305930951079960472741431 8312826270 8312955211 1 3194115085817421106488469094419129868312872667769341232759371309539295370672 4594231845117929574416027518733416299297814244643225592383002001821676115632 0 2100116433476767395773816469236589603492412673850761696361051113255592645084 5014390518911047146129608117115473179103471033529116836334500681539909441666 1 1843598658810160061028800486244820838584361253805606219253647737270840316387 2870393982940401695890792269595044909216884220982614931930782303649293007505 1 2598232749358721334848156211978269181747542169649619173561038395057958483245 5164034339003984768022778076566926960640987226602530368714350184227576958863 0 257424116447420878868090909543261769669327221514626649380357707282152742748 6196358957393890998842139179684729478144855859933889430739716588886508641231 1 6026055481741881678730226387005160890568534108290696876472057368378037318365 1578263225472857420770468299421626698861245312065348062135888134769172223638 0 84359911150785426777267477256913965277644587813345467030591767503987547650 7039364354083144446972412116843855786185219931260595992972150187062780963935 1 6375953801800609550845646342454083400392742027146803706897757964459369607880 2963890766704108006613800208278902135640312454263915601266873941070010868313 1 5147995631615421762621731699296365409292687702290284445104969319734765300989 5212337509789419560215714786579064706788300299335155736637717234437764570700 1 6229300900050809554298303246385809808950234144898292777327069800637487241480 1735606544363403683272403399052540272474102714475315386539592590385841045359 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 +6951283031621984701378019834205736275199342032699637775800681911118170221993 6569382058884191827443634222861808519854029234923451773932266270116410860870 6897957893366318510335621549690920826766299030794253766242883323791495155848 18932147578 18932342166 0 3513831394850217009846643738082602675892359564638643487115596000621652607263 2856251314569748703365493644315163476181293504036245249224634130448094891221 0 5342287472922315940871940966297052671288631229735830132316622133634343569906 3739944301493170859161825446209069418009416483172329237033412129520394408694 1 6631642499754393939964165771068372625930195728804993782367552335498650271027 6843531469382251815616579104708502375129364190362367916870623841067937426690 1 994714964947345648465324484173340200041846846019403570048290881375809024842 4288442717852954809418274319328251528141843220625778324593220736679234679902 1 3756530337833600220303589685725998217235266924998055138501901027699015653174 5882380047847336597236051420252275092079177985949271379349721938786887623619 0 381888625075195312255256877376341788873599249126920705383346352601465768297 1740000112065509035733970874001654957549959764237433025478501697733581321074 0 2819344966949065074811476069059796868662638789860238393387717441687031603845 1909358190550330336808286929783468069138856668078918596183014338101514384667 0 245691515584800033740177576012109444873773322074180533662338700924293579671 4359791741759583488042119855440290839737760739990204024803362659638957995167 0 63025726426774686916221437872784239922441524244503568656984398582964734040 3442413660956174364961478113826196454434472965241975219867884432587057433071 0 2154755162332867789720357709362299548484554314933252394801833103040796320803 2734372578413934639870138314834388094724844599652587279171844379005360393656 0 373720453056473612012913262451465719058928144377183818491980339558845467181 3734025575151759021834516712522766859984455849664600707855435541905528373343 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 +671758442535415466125620236339780615067542056262097885310479568936067071298 780587597921052463906272500709930420850619093993047025647204433271553133397 3309365766662608245543220014189227531678779103797721250508517366897713065699 11269133128 11269283256 0 3170133780797688266529946571768607275019024783010252320552846765396847565221 2689290148931284892314078370444703073104156583827585059422750013958769640057 0 4561147968040666288414465209559263068196186934814748711921430292002736854026 2956638656010064439898515002620191621811806525871674371510503935716953943661 0 7027262323248055638851528548358425732874796256247288736545061146128623284794 5628713335158314728634141268754565058190357644808838403720588662597582877552 0 5390800099583770795274131828872535985396152315964897917210249741284346351975 7029569491801605357940288628270094142285299301459779511450047643967630918824 1 1216098448304912012051161935921482073980869528623554694968958148647138282992 180800843638464724797937273871834956034276002284729328525411217062984456582 1 1449136552151789905162736032562967524740211315887218103234809977310938538715 7101333680959457807703242279268901407913674447388577915500097882094009925280 1 459235058087307065443065297578809137922096111621695885639229071074044448738 6086077097545101810977696999316100915327759900322535805589116961615721530472 0 6607260867367552550133417025133573955534762434773399267242181691423646354912 6333028430040333312283134909838280185479885885098996171972220750976157273872 0 4051810752609723780249137130125503071063084256819094227450140366285387868683 1321117784357659069423802406769201829776629849277983832309786896261468800682 1 2862376251202458135549942176199114160664357628509785724014787088617072778056 4200737261423707336195761597338445575244762679204863962255121719573589870908 0 6288139297822844196482679126798833125486237302505322276535445770992967405888 6428101457033687188562992629450738912875061786612361407480279367691301035290 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 +6889518632913995598570384531037824934468142313354756468778915558133240527083 1983769773644921532092825683345067680854905618186104642635113922014920476582 1651403631722502696585835322290284306544363528840812391933253207158830050756 12221644996 12221801340 0 2005274631669452501238649335134836694961812461992068755017596200349089090860 1704634652963041356587929872910914301067718202381933472230003491092366668245 0 3584756605153477180585666799468912272135426179837417661429207948971722778805 2870410678703521080114886138234383339531747839493723191622332491693503743015 0 3306245712699929177701216630171714125514175494613213727729610889834779468195 3082057515963500567438539037529783863625739619818379679573892284209841580648 1 2566680023464911364382570792730032510362781020661429562546991320162081730041 6163007802240546788945680912717261622251130319319540083704628026507704854434 1 6980232298037433982179329376017788336084952419860726936219144638674364040550 4928519451605851240827040973110045390593381410704017881691710694145609079325 1 2948930387954571851637673360459312975999815579790690063002795594842586827226 5474417769976359541980285772736460392238843650331970312980820507130922410527 0 6824875662037442563810022482238171638958920875890206356224441993572611034148 6963865690610084808579118784933462382816180231767708541253604780930215579983 1 3075445031765663503610467375510309260334065776306486017518572167068959330029 1027385799591963873212483609479354510840705935608620631138657117742560832617 0 6663502989012821119686632759475429537991292169592195239696161510232484749536 7005611617796442312060728466492589573727950348281736821663924590570053724166 1 1791593437210413888302159312681092240711976751584950939709822084204819968049 4133276445956962881269852475619182445796676631134861062115460081827941851820 0 6385765049570481770280180596963212466358781458092982633425901491786135929496 3963826805369936793811078052879029273180391709610479648872613587395558844493 0 3917407373839973853413832003110267497311991458621682680809036883072942833599 5939849838149456921960511576782422136571383643806594958147611326704656184527 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 +846061721734992121307396346499402266004090786642480826120232671305216048404 4804439536379392871256568794034717777866290016149958730555797087566165269808 1325217885816329810770645351034006841999726598718470932609127683760684834856 13811967910 13812134115 1 7180682402093264062353412656672904669613431361509897049943551560747184618177 2117807448950077489628522816739457277707905746772332657588762423578620749752 0 5546559895982922129363123490973042808658282972345993999248016168673366904749 4100558122844233955324888129677421622349991100007349643915904013824797163571 1 1490242313818349885640889211225373814240299672574584545603246372212453069648 4370306690650593304122205489866951321117801203067861970455542187627927549462 1 5500381342339785735865975214453419047741990144661202771269231935255433256496 5216515522117231317203811148601087859165845303924484502377491006603115570488 1 1427573954949580116775245600691455220916302176946345814717222553766760778470 6601599860652908265558016674193129500284395284012436021563298530446194842379 1 3621379798724991299496217483232927353123547271094596645498304337867302779001 1413532769364136946750191924745550813368411994893367892314169796301637693835 0 6141083993269691882571768374649551955675529505332083629436109440091634803610 2400568624388103747603273624531593969331633548094877634185841665299007058914 0 3947143514188049516112143201054039709273885892128061569430960272951085936881 2428345258888214812528373550437070009473602105878224363974476054532756931211 1 3512089088351286016062460665765458342127040310564961963682447397203516417094 3339081552661346772324291617975462125624900005467782476330972844525463633544 0 727653682683973364036697181872030828983337723238147374496378981592911559551 2792205311811827306595186869562396687612526197332528333630003635738053024440 0 4019262639544317997277926354910478191804122122212392917048297084058742506641 4765483140688636870117274953724638676646930788043277645647430909199732143614 1 5938232201967491247638616546715155166566625733512424076841629684437384320514 5694422345189995789905960415844327373497012147821263043890862395233726464851 0 363696729989039724101471405674845211120094790380932977487332671287344829523 2630419048351296609434751892703656844892216977058431289200366088972077954615 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 +3919721806661566322879799193265352685717503027651420645064831235478469802866 4474588587300250697514410896182110020457316609158377365358584170193393811327 6634708500805003953314113330890862893417149142653568139247029010620598706208 16046913378 16047092526 0 3174456822557939072039434378258493196124698903856929681686593100801859728690 2982343908006179242873671858839697431644680470666791782226585340466044069588 0 5342978981462154619647260071948391135177766735509716158046194941941680028127 4766544906533393324076439237633731264800389544747201512842911974968296663173 1 5496707909188176009076517126298569808032049190387728297709279270314036162007 4580910139120288647570177338471756621940702041026419900344752968043648277182 1 3342884619763741834622832744174367270883741559356029812752250650125788619714 6779697720988452589150314058856160330767750741856716555612322184227664474295 0 1770774541702311829033362588623419500483464621224396078568231689341917095476 1244037912250801363912000263525859783152245199192046163184958568849671076621 0 1982198979397515661204402077158796523568859818654837576899175285156446216358 113129363502082134973284278736278692795498162604971515436090488128610302123 1 3931675737864896354345739368053742618691695058905212027668971059540105949298 5929227763535222937105492641501111181058167078015518063749549820626023169140 1 5491029446661306080146549843379601437314965472316571192292287311977388796436 98938018589040802555086423525310230702626163361179120560574057984150541629 1 5097652488396062190790876451348159733408719867388286796662590210005701559501 4033553406875459086491634879199649204683665001937295983660771361715168708154 1 5623944426946884329175591147584116194813417748977877551069736022176638922778 423777179278032922712997793116102448967507356170918585908267240595244700018 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 +5526439614130125592231970727846723423281660606067716314895758076758589415632 6179690403557325600312680664840151057519712846196720511429902603791178951141 6603604319438814285009773324558187806927572882179190991058103462446842022280 18615333628 18615526581 1 4338593165206033400767139853254296992975740698262169015866591651616015200780 900514322351652305723002237457125795449779369579963026397508967469731557931 0 4810245550109398935528810894323896288474521157518560646421821258115615364788 2860197054835248728646532115585822522751710847319091930975721846315267871120 0 4142475922363437710450671723004573083140041223382796130895379696491926907661 6669019335415795277251037199404592231126640858414847575302362018117535200371 1 6887229208926997251166008894734939266335018864772083451867777033465677973397 2910947440890008843622694281142353100788168236389945872488874340116024134943 1 2040714025551280250395898063057181026910144128420978600948746042177818122935 2007383331118236165648502411885608615004768429541023644485725233003715044188 1 381832326350751461180600044903260556688654136488058281768868845936843641323 1588265215529585134685078084381215762041820478986140522868393082306302411319 0 1464659426494698971033080244871699655103557602871354701075378009613199059307 12158681361022092944235510164607747297955656787709166483429432224322007999 1 933204476966210635423883805475847827622656325128881426906232970792439351468 5122553213631689263691668028682199155309396425922226885242270119054920732282 1 3556470696071311389125395227477109011487332110752872564701119280215879297121 5115694335641620155265749319659985541727415963563781516811893973166517414550 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 +3831535129872780506746303402980261668192470064414323679764590967140732928464 3257220755764218285329585955877078327350235951136418360784756806118725429181 5780925114075641472406301764240814996392840294628992760761405773352038867228 16693207840 16693390560 0 7014250669293886808175130844611306752391081479036774720931801175759233995491 3950907447789569872705183158323270273827027385302195260610141911612487942832 0 3489020288422276673443990060371716006124899601750400778545624324601302719144 2656682311261266011666770530995710475746693027361685119737906029061858325660 0 4517044263953480439532943581068696434931827310472707554706428924907757392065 3104025792155969353130252023222063737460953655087231321151371526359962332453 0 4326126633950165036430684678376256234020892726288657179751347388736108141378 5804140564630840924575686765306768333056398758494845409442256761555752460093 0 3975005715708572784577968078636063388003312540390722985819120817513721843056 3544813912272809874965174759005541747144234165225564617468988100800114501054 0 6213135264176019064964373641918547165223556108520569902719841682092828731891 602269805124879854431326331177495595726192140714717345805859573459459913916 1 3308861053124749276107231205732590970671753355583020148957599312492985262447 2909276214146981337870016672358403794407795958222195454208210360427671751774 1 2190280077894235338872416443055515906313784978256347192024707737778103257256 5007446644832314593138591154044381070342934503953141033996764692372420038888 1 248911236111575313831872460540719707903000264821755930033961506588332843682 2593807082014821606861509269004426840733628576938989305333445091474355330360 0 487829157738579950758092187229576375589748107058116973935494302512904337800 395395859885582122004854005002726076099597169766244339920654890338945580301 0 6643564045058391878483626903215548783933098411517459415210774934025515522097 3477385808399555355837788270974813686357357994375375433968698208738745724256 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 +4967474851003500754978805396622295857372234894117059489766777149045845944405 1639032820903575397389695536481059220880130450023923871208633068779734073458 6823882599558205673906070562982948375989738927884182950116051422351316808537 610419270 610454211 1 1395281163698141497567159465579453571001675318949479953321894519123434791550 4700571137263014887533975861318524095618350649451363799819833364348951330380 0 2878698181785387008903189493223324090269219958868807678961165851379897686041 4182335054232152089490983156692942929280696484391269512489494899591921985684 1 4363208857960518373692352645362876584048649026622647500674629013348989235528 2340468753737179930868178046556918270347844704121745307862515149355073771473 1 3715627303758985396529329006340183268299863620639435915618968689165026173206 2346825162430528760370822779679020145825064103207375569516622276843004383293 1 6063164965143345345130942276418343883485285567671367195115277124078565656152 6254323516397839008574510791090137999291653071810469482884830803222576863138 1 5015426214914561119434266054273238572481499746882221421075302048319696548482 2811813883918002203307365202352401478420310465654390843402146395947502058911 1 6401713712527066794844482255769794608862260007018562528254985960076821383147 4962873785788169703561049915837293973311633095699685770546024082874819781935 0 1093208240325236129461536694441220273407838290925946235225814133819211539413 1145553423309744672658894164217842783488884747966295154279298604350437558193 0 6625418681861744639455351754859774823926439166599712749997231644954496192580 4156527472036525662941747113395165503353087661229792755187043396026077720612 0 4761250131409637549022574418495320100782199164411180442532205433506498174348 5195022995263422950249881388797569905698748344271115481727411248719567690429 0 6093461999368288964486095453781034168237479266697069512232428594824411226374 6736361699342133464489883788165638054624184735711157066887478711824802732246 1 2769003824840967031017386432256106983163038476066337584605756118075863172951 399086453853513799549540577738392223426029473087774259782776516312993260220 0 4403163168874145292365049234735536965607377600969851715560809285004111564758 1422965324558787331898669789474085061106063146910721294332747553042619751255 0 4073581508767488842240973097615097844012564888019022424596994459539521427923 1379106626301444027278101436290204624862653675570837637159430865555825229013 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 +3789269626095580955620779535641613683141718557472950181388866895627332096111 4425148625375493666709998811733640044288114498340923041160130705533413595478 5458579733074516377735934848102724499408979619649690878340578762623596290349 5605234260 5605340140 0 431322743671289188735570191565087546025745391716671610554257543571795645686 3672765360052023613690516845243295649971275391747610204336240231064013062670 0 108086088879467840646636167062912845100979434658914048014905789755559762659 6382297776083049191880140304246339126911715626068625850088850388212627485589 0 4114217280831904441276581607429389529980936108922239755857919279998087208895 2017545784435753092156572646945330088513469313610824019717994500450223071703 1 1084351751387473434680860318848652270386763967242052328251424119338343056869 1290203058377509962500164170170142566000519363228302501438493654524623504493 1 2646662098387070592472365945195238483540274993119359185092600976500257483690 3297290807559761495656950719982645636298267209883893259452399118002484905907 0 478042490521125004475855258783036414496492030782468372499336075546755664704 4398573179250380426450130746231667813993809480954828677551577306526793111478 0 4674392664588826825861014163786825915912177077732432167071243255431933061970 5706499118609106573382925683118879984875468846874958858978674968074497753031 1 4882447712581581216777384054850760462496166054078548866215348697511324771903 4740475621767325111744144758455704392019717728079083931672679111684213476963 1 2477921368375187475067470212713145149156299226620068497786877384018875355697 3911486998800995113481751524519305002149532296205604214201483282162386048088 0 4354520212208149925671574210753382944239572117625612241237267536800149462049 5957891549129230248652913105950736138194919384079928923690345111631077841639 1 5147480769874345929056523387802917881072149233929233312375210608023172946029 4788214227489423431024848936776456640722711767612476105165455382099912751282 1 6121193616475637679797181908523431253331325989604613896782777983225307964167 3957240881494882974015662500807541693056435208239527577217855205175551523803 1 6253958567384896992247930099952888560372081799364766578845063495782599498927 2997934192278761596191355377522685705254246295271291961740142256451075777361 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 +1592912507820199135179527646517686012880589518258173108917040830089173127347 5695824328911309385710132076579892635131250079430574136039770709361528867757 2608222576733929892604461784581291490333396359383332394277855258972813068247 11652461470 11652614130 0 7025520804200856125695610453087826515484217847946675576646601051996672527675 2180199956681909446721186383405581533095678593355253323875859616179487151971 0 295381617424536417730097534782464815271867956774381371495571438752482734334 1079103859296010409210384704654345748042490985068030354898828990301831359529 1 3869194404462311954885047517769702257580926011552240038299148329452068341707 3423517703230005930840371606463866328682443271176617321842151375964661624264 0 6708081537709047386550950267933931644818207620305062820945127098088111541501 261654377663099574973372605680426587696635152648440796953556608579152014548 1 5510979037282590415173185047132585273864326258610218021184838584823644577643 2634825871699580669707602125628764018138129446973134132484827547053924844081 0 4201613171642925744072083778803926653773271251495358711648499758811251850849 3959086120253785810672646414007219896098023896390391623381232534979192244546 1 5119024333221991155656849949969311288297574235001342903332064681339562073789 4238289671794872614692232205605251832319042522921422673084072949388547090536 0 3337937702284927669124325067206361335396354538723977365301471121724228863678 3272886593841524353269472915676052547759612434974052552224012162795808316546 0 6397870488002275072921064638961411220705301740080727001213706284516281422361 2329744709013959705413936445075775741887279622349357996022374560605757526754 0 1577166358187823793488114662589451096155019048841483656640085965940672877224 137022853725803721348939721628472381408339509070972567565508785130720140418 1 1083639081042490927665163590214786255667416726731189373705639239048994826694 4081066720751432902335471528772320675376576783947436595018810973427300256880 0 1396442217183954557838889159506186538650343154583789092461839170558229491837 4781962828986317806776532074758947524119811976130977036673406408383791636079 1 6305321104429254115180202893886991358890524221980844740462586986036083382297 4740173989599199443966106285580870214678765488296985411344428121063784464341 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 +1529257312919117791745808983153570268377535264646219987400954200110485445348 5262568426063564002287818706679378755049048839718346249764112585925868716812 7146001634543312459196174261827821136239747281533636313668818331853959689720 8467494045 8467624180 1 2369619887059483620531650093927576779712312590212008849721796097957988294216 6049476873653184665505661431893136244543149797500004556093981281084683835658 1 5711471109209828009208573937148681238531661454814878706303852492568708093397 7188137803748561143023925535555020261669758652545954464181285397112245143272 1 4511407451037939948571703996502082261982833625917460237286467787732244136726 104757716741095952667853628137171157365370121901358181673350208179800193134 0 4360513331213779040268095110803878233280182574583281610378170616074476253789 700817929999929800419813067561328114046138393499722113275316528219097518892 1 2894289007931472972826321956097437997985145564487913313480556247662029783500 1212995631895165640118184105145928013042061882630539327960562605345128131301 0 1675780401130457832852505743205269382802025319656812397582426507734571891247 5182526061717601413588283804046031566364662684047912736173788654737670823129 1 6717973586683036992876815665835140825205284962942464062905758805176755334343 5790698551232456785025288218001827004423146845967786442866563353678989178383 0 7179535696719383012310328742787823671171555088108347574529002713679339982517 6469474746527196862665789824499586488042182626155337058606734267128542948314 0 723557558175532245173790630617356941827670351847956261170682061328447490813 3963728619416359473337667688751386434118119535574574444557975745932781372519 0 6859425482344258272305351139212641898081686594464677468238918101680111977536 2767168876512680118401915296297335606857003326486272087250795509540976414836 1 3715846102645130333420723219409904425436065819803542190499036724728235950642 105896051079522120082217188498530453003913852842205382613663908349673258491 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 +425461851327086927189449818518321074145321786698234023154061415219125635443 2390966668887043564889344221563191062269442753171490904418167143115196654206 3975262190125861905977613747108485775067733886324603471912216727554232067678 217100703 217121541 0 4582811589603099157385492451524418482120131798368567783033882098407726756294 231520160485472549843215423874754342332826125640251456542776940738309348767 1 1840698384962901105399072476592595819157043471492007305681681721153920660693 3698531135472072002048819660612118789023384314811092729068181212848772353775 1 5474106082722194305080186200249644774495956074409443084063277146191757544037 4216279076995853080033789243225362316153330066061381723424396077848621752416 0 5320253048074645852047268835677184428549005059847953427514407862596312158279 6329549994073280857526648998078971681099342887656624918299265404146439980849 0 2500050986076985573617978692360165781065600617752914973737633785855154988841 5248040542042872585610379201062966185616975921879133587853793720524729200420 1 3194663270013216124837950736780898203512013405410476693355532399544256215228 4366056644745795815458244509870316335325102015145220100230943162427828198597 1 4759708454229478720231389417145928225445702556413874982887051787139548747079 1155394963273966745229240029632464411335577079036904812166640784508874795041 0 4651056596302363727117642525472214353295275627122625754793344706444238911436 1905232209423345678125009999370126864030279394787227453515937790148140084214 1 3028186603895444004058110996023119106566843428560325434407188275355134123408 2252463855248935262316410061380092637315490055021511952231361650450992630312 0 3089296454547329103859487108044087446079374366588514107865471129727782630601 4201944227036043057658031614704566438742600284920078814246283782718435311089 0 7203223374582176386230784272477560568049201541670548595381050780145969397748 5119978985759180080829626680034130474781838985802131093832857254270323596023 0 484435229923648665400646760387899523112819241077841979809184081438220641289 5142227019423611226354155212120093747348293202992652990686570168623037040494 1 3177393954894854184990951628167933648097160193754029927312368994314623034317 930394372222018453734739224316693345519433913446570011940574114958982063761 0 1855766294186847771740257772951576919537011746844466520306430800082541613060 443174091223883654741639651476250545774718557445762380847765268975024364576 1 5964598802241963262221473266535551736452515892223232788134946931769005513760 2612385415749691871090718866042302826504706268037968605556265253011766696009 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 +2192676887183997095980578829675795137489756908343642410366679370444722290430 722853889091851675844279770208192906919988558129878302001241907210466476239 601849660204605842274085601720780351753136132295834869048128897660208136052 3797256231 3797343378 1 1526429271670926455460983160657215326239874362165609233942946306471791160263 6445666669932241229651089609727164262341266267928335456767283306008050515677 1 1487964358194278520824198764342258167818608128507540210949048400444049760418 5803308745356602901456130014219711415274878235217184812514283569137573869657 0 5771734953062070952684429078286917155575408850837497814904177266503741947581 479801243796800495864065029631082360376499069506632037877522983632417019684 1 5356146590211777561786569263052000285338021510855507648262134190835230862346 2171665248939135116665177735585828617404291961360486975821851692688421889845 0 2883367219130719458241237013928106307068397279765970870569198694578509034548 5975641977176166771808785836542650298255283351574413219708152679667487060752 1 2244882257892993638951870722893796630902675566761029101495820528664260569141 7156479058550554002758413873881343141017964315003320829254042696441683165429 1 3807701706018214285677285358649770943368423271234346757380195067965806636764 4024013666229685594698400339495922519196396702713869158745414682770572913645 0 5447787087545555365743380333829410381816483730575326428010272288501412038769 4982892450696047894215491346827590144812174502805681054257211214008577957878 0 5506253883356428437070620165005597525880804298798663247394829779263662302380 2956945874185899420368948724224224362342722755313210200251408447045386518577 0 4631338581108106059440823879507851315197117185968077507268414397025881209956 3035048467523783899630639411301152175592843475079262952061860946621630313347 1 2688788640813514074729228120398971581330267239257529126120529608672498662596 84531665278350202805875435597171355867124856975234326528942750210100085271 0 4303282446218706518828599857471996926824950562688557180143588747315714889523 2574080585760863692232652064130459736494368108692541193185808673769014362544 1 163640069797425613178011720592509129691551258434111466205497872043906326105 3115600098334398370817251574903370372248321068970469017442560378076288064858 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 +812926262535205297963622474976527741340303545155840869626587974937460445737 481233219592583032088360301178715067708271293029297613897752496048673498647 6801745827595972327293743880136010453842244629837546970239601155878984843518 17499743821 17499930903 0 4463422900134208275219321181505248904845169842955732700884539575253230086164 402576067286932922714048100711996777923735710796936215261629801584994107172 1 3499573446710830907764477348809855869332146739759210393900277778464543446557 5316241142025041917950306429166395175637786634667564089291249698690797104030 0 4358672829030130421012798778066600210612078845717407879358577896242465830238 3131860159762373515280733796961558358474114038893354957369569685369704120725 1 4379743263934687706031718903525745127444864390571150056038448006957080943531 2723073277304619110804151581214083092486442682176831449944649700731193082518 0 2484539762536633273111833224925735344280457916762618279791025889792843462651 3076659269520607347988059444784629406815938527394350253058650191502612425730 0 4546593917439218486766940886298262323630609997043710874216634806656983338839 3593820735959227235788473588914393189126252093518370592091266677482208209419 1 758131760077663592577908683898515520586693811597510061927945241210063119916 2758381040534293875718214961434323471130259156278564798137089331319149462133 1 6056651423188070401480787643111262724459987671652133172373122223069535490545 2806626375671556367981465483032000555210797611794251499308650400071646398821 0 3043958473111111621452457899795355502050556852617773711778594612675728549341 471684476051166492742798392218144157574104789694551809546264123549883537808 1 2409950843971019738678164717177829785769271449958154045902769816782789303134 1986337115638284659214093816310560658593756035076979852609747715059503661228 0 5033655698686119975540137755124017573866237331952220014156104548549401747611 5148998839326938679401310722879419675923522784112838855018404225279359991100 1 2740286081182261945218207432888813761788750625266596663213955697618590814084 2436343533840502743892411422196862265815010361190561182811091257799947812925 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 +4792874627863072319027047821988165271473584850722808593790960107022216585775 626116217076390282852584953376646176550706897426668248838906099393065995444 1954076263685043152175465482869397858320254481257461274291864710346624058442 17145538431 17145723610 1 2052966063231879583222439315537478408349934139372427320598097989476944202995 4665777738888417162345445759997134753323951389891911621086911188731618323977 1 6285805065195188383097750641118125028674690372567876267682449260694255440945 58699912480696770136969975288196068810874839827159182803438103326477152654 0 7164994759517329295186147458136080980421376129056295840716788929240258153083 2299344083488668778141666637464853383226999794507486693412988341019531836634 1 328742716827728494822012654129396825972795984109492009586715176488583387733 2378258814328727532076708529716905958036752477905630176600116809768205441160 1 5030819958945243690683579661859247408509332618936433515185276111604247884341 1110022012550512595735210503752210316590294842938381109655777473316124322984 0 1828924746298209994287609186932761980222109922173239321139979735146330756061 854061197388987955901791290954955959312094864811178086904755816831942854552 1 1686099306331914158421260429452542377099104531334414100984258801892611912838 3944658507835483976351343129717580701405531114665221822574510925551404918414 0 4205386834092475001483285806653670052807316944855901776927741063679366104845 2419527338407929401260741151526834761880283788723969842492132885865987185238 1 5772126644107254571376336749519207697716309782076476768403086944923714765620 3477553432973593173949404880666358257734253111078218527886335718778813485435 1 1425346128300568485126482949714146807425078908000095686010074441866636069318 4457080438598153281621900066216906581075123589119980010341569614787838138979 0 6689738105435081523787696274289877979050497952434140978978742763007867337952 4949904108027129624947161570788126844993378416592965720732642570205508813824 0 5560231319085748359065826677239299538382586759554704347812125214655086371153 177865380135004783040460998011499714074058548334027453924899064909699457502 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 +2724577703548244796617477667525309276371844157911482618707565957131691832010 2187037791627594610074605142107330729759421324142029268144878304729814854627 4231543455414783830207812241222768550312047468120480359822029641819995140069 11171462550 11171612026 0 525499117670462823392160090362205879818989417294897433475860155859064692455 6402512331553133789427241284755706806200176182363581532933271889914049624358 0 196922866956592385412451247864366958729928466356282206583295443659197726607 275135123150768872824175299508522809925857351438358024502666841182753535245 1 1074765195664687311116031722402640316830524371847696201678569879267990167850 1829038101543985422639119303428761831386067746190722129495107589262242599791 0 3839680149151141475956048618211966958069916550144337514431664177659317802626 5813199913493983704795064069278536621000755522377292921370109907877931663572 0 1820112065608510939105942285461596631833313406139638311078149137904898107182 1440143362339675834135977951342019425188821020798543009418485008052194275902 1 4531028000724064878267400603517424077003322360275767450282995851925121501353 574119008323027960305506078314233068683894569476344899024887201702283567838 1 1521386776670671457279295533968151377375140581404240431507437492789487285106 5772917850947720303539133011952907715394225840728742044642172531569846722968 1 2331870384928901884888436084753674048583467054094367092344694759580350231458 273433253261772371021241719467493113885451341645672516344593498291766797896 1 5397508340347800627094915317754854122381124093348355725569907258057416694820 4031073525603713290353139596129458612861382079975079200633625463148097986478 1 309326930395172299376312213645427487888301331676319493272417892144822030550 5699550326697245405215314693788709893561290777149707417365209966941074698513 1 760574354165914697019929212944973759981490294477375834649749428548232751231 1019919171966887781941268059692136971948020054216336434990468891788398597677 0 1759277341950091234763010138876873447220611226677543304993482159971276593253 5142211569424160080694845847506554059332738466735059394651191659234064092014 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 +4710363675867008977837352218448328562915549225213607118242822725115483384310 2711049535907688658175201982530491669526941099185708678990481883598641916077 38621391364014412094310865678126561835854654421527939942249011652795884733 15831232830 15831410770 0 7075005487370449088086308656592764902124979113846486660172653650858749673609 2679097069598975121337156895567678964572020696600804805158052262839770226290 0 405695562213835989371471452919254023263853336428947744108584947054324225923 803090528669471676752998363251999451395229551209696413573420181405029582577 1 3708698829802208088335041289971957013969982702591538810079653498459926338059 4260148726442633517595220856015658283694570946914920458713864388344973189872 0 1520066897245798517078377742172886371712062195033615759893453011675696045102 3007131927662496195029760890334413017969933119417734319303650299641187271708 1 4420125855272036508369919960314474242454789476824752499419326038755172143964 1002050965043617437565518309210222063972259608777643425018168050397771954231 0 6870270956645428503789069305518038986034490102960353551933698994723514558087 3392522065862966831913995725612184147273522255208896349747581510338502264723 0 3727148451346541504102158843564817968166663392309392310478616449002519760006 3350002383725200980552862390502518706729731574475268608874748876945488088575 0 1888619794800828120864551851311694510254834776265627340190082485184455722486 6558311443131794731785149948934003571122826057302402999011277572305349953009 1 140170633326795984366834291214080634305065110473567420005719121807142577384 1874830598180601873275699583348966928070815458104990088263350965612602636374 1 6032861835104814291764561213348026948839695834513285042705972190506691324906 4226643519125274544430089678607088137671567763933389442825816163267650349360 1 6505137865549212258724930735113180051914217038958288504419281055597582683715 838277864920760422237377806519091571486729097147004613343393975135452766550 0 4193356029790868430474934347338083466745554601344433669530866249804531739167 5712381951623240314459823259852882707421816755425537865452382538833337652352 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 +7011051679896712887951590175558385788440591871470187543767924803123084119228 7097351763096397908784846042164737728969584487399497466131290417310552506516 4600325736365004638640442466819906590320927789310786539675556477405703340739 10010629756 10010771253 1 5624650068286522349650106670629811809734693398331044632501690019786004171982 4282855933660946522211992737700662551703670297170695288580960272329583895969 0 5607659306302162162741542323263807926945350323010385735852254512181223718771 6060566219406613855135998911845117827515618088613774626844505209893503077666 0 1246474899296953698225270734217901985895914138430632342630742084399275808642 3947594701522820375732440912566899947000185427395549553861832339664242347737 1 4292190122574841650960315624321412240482948709046714235419572957327397009605 364397510444682361819885200469174848152749642182342086480963765119275317715 1 3509447106959900485445731597470265286380677306000105137396453636198964346263 5746843122418197420477754814340163595813965081771039238742919515688586522366 1 2157842891671466697760776402497220223522696908428031532255679016325663696145 7030489865210005199188600888736877937912362704704006808846502966624570637840 0 2912734781800083763521465291033423282229173391568881517350266132035322781905 7050463505438575288357388585542072761231973412394480216087284839038835629396 1 5498837809944815851121570929091123743674650661105928799863017944257719665486 4620245765873558500574777936653261239646502456551369731637985975878818222008 0 2195275873735098839588605933957637946839583623809829791258311726480177711326 2267145738403547479715957470079523300660540302997300753136342570435677284269 0 6856587625790569197143084719221200772736007662296241994294354178265978767930 5715288024640911805165551705738006507720819520984786816258086968630291361626 0 182470551327361884910170494545884453921113433831787466574770900407610931296 2740835501314600670286186517824821680780109828968337565224168579753381454956 1 4120488143092829846248167395039563980310127782773428421117056740490630217427 3320697570657975296134172091862762359997279902800673094072342690677726489140 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 +6830242172144931199854352895241075145540818594089770902710326533049400240740 2509477989937032381052156263596862049580599198339409758469786161768831933506 1930394110574633572428761046841941941405252642873448970826904313088918103300 1941486141 1941548455 0 1537013338795592909787501366782394455109720404116908940047104894138977477642 5454059549457983600895976665983210299766840423129606722227762825635040235559 1 5425783148738304484228075750202099752445622540423103986247759808295445468289 2006189792105048151652908514236865973969234310338467258402368246987001541298 0 2467247470220820994892701863064928880982493237144827542334939452541903173938 481641300482257084550476359347018220568966846189356258902331866671054205001 1 6138511003744987572943505263484727123464928129435304278944376986212264573584 3017905883489253466523486886016682572698501160736006069638325582126258827913 0 3402711822749921273189882113249185950817569884653403435684661335990309340244 3201939301714365023575962356231731096528879858681633669556627618577199349933 1 3532015478026804833508747556141376999061155229114723689155993466258792981646 7164655033854213229060372803564611425310725390531274758543982418693144617648 1 7221900858438294642033413501175773700887875030748626220363544259470766567047 4702242412657607016456682069653868145043779249343835888267988398882119246894 0 4104963507127627114697415479704368852755045422465752474499425345320108477493 5993634367967641959451028199989863252847815088263502273894636145663831061582 1 4456619064947288660693540530743488838873161820432069961950242289368857601524 3071748079044176437768882002102905018039826087557031544896323500680648500711 1 6360792660359952407575372679788501694338988074524531219808229767760320497675 6730241175603565522985809272538863008567297968762410552197761108336583731988 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 +603246497747149406342510495600980737824350537267314336626172749892429029296 4003742671418251940392230502704216825701811311329281067788617766890824016990 86399943825546097073905508852456507246982825755708652254199168115466879036 16271809401 16271989800 1 6237555070621316912982105366068162695712043536154097690647828871903517122054 4846586808198178804599994074196079170489981591541163195821518642471022725136 1 3719428581440538658754734837366123357285638611194912138700091769267610004870 2049897949021819427592075259175229531977439707432551777284554370982218949537 1 4260790010180379784065972679601524008586524708656479133512470657961005840573 2754864027509232991205298447018954507057846607481581736484933712156168400519 1 5848419776998150643985765837791973439989913656246077913397598464933773087875 1812378820143502780103497898216661150725272141387304734268107746092397553987 0 6904961401416683940374335915472376604972571076702535778598131576528563037777 6718002670127648327902800132802536772807460125906720174917636287774386877182 1 1065129648093795878311409956938552740769394049794873723950560224581621482537 5054502590272894250878530622779550505095955927278149632217948473527136677782 0 203752735759893390241068890796774780001293945076317117081242263550249312446 7179548532153488618490081818287471709850727693261563253753190394756896602657 1 5000227603637665373418367201878498423982847582952169368590411373207638726483 4033739280305777998115321954606815896366960574926536201818359641455814307554 0 3537129493293635906588339856420045219049607456391703801029607068109701242032 6326318030667390534399329152907140137268264631754003329977162480659861012238 0 5474560746595721312319897308229420709966645395908082417245148328571694718532 6577415122614534427367649168546961968099027213906818605740155174051410264600 0 633893982765948474054754824540720214176495802469704281533084393550110966253 549188364948144502341223943933721309619909122272178360657282176409000160897 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 +4812803295771271105555410240890953968805640812639034929058685100939773568910 2506500512640756724547011311202974490420979544689005980480393122395043593094 3795978645383801232647393245164334386719508769667002444447418650396084373132 18245561851 18245752878 1 6129899513209377702676278104738340064638908595072379785009661441741191513586 5445875117689381604643879436096000992001801753215928083442346560261199376981 1 6547525731276868545927881874356114235580580166951406116229375802252652314569 4366420000222428086497560954922823795329499878152278295264453292142582240178 0 3692679772886970971755042243455025371658060393062281881618333987277422236920 2122016927617361214911493137613249382927774372431786522305520591953992853355 0 3907895023735247194735633629521511780736605345953967851409949737840009999593 862041929411106371328926655889219266688765275804880212096401941209062203518 1 3057589129210888960773865365152483692023779330292538404075964823737016653992 4005400862844309377498472162777203651834595751505062226390075192405524682126 1 3453970976707937738396267615857424378156310065362784887947417365926173024063 6995015016659957027378921100014082286756001404992853656205139984544897249882 0 6397999565376762138570782889097451038554028123669853728837901269093119994778 6978607429384588808711507849045133388338393097005203115152623972105349819264 0 5626024032076464041510018096322909146680767140682263068911588859545681157425 3429047756491323292278983545763516572868943717610719357140932134297447843018 0 499243068832278794604010222541393433810191488416940057084690831022353762088 3112848180245797040386837521491699507876535683175131096038852998552189533281 1 6436549111639238575087256994925038710080482644701061357371756878673765247816 4604106425523816760826808788660232720543786980620276238578303458368383187054 0 3842520623194960678645132311482324762196657918303405730596063696051067280166 5240093882508821633546671715957649179914375988411896450118104066706048146343 1 5370059975383356337657953506195486116590801669004462188384319633826615123038 3601787677204411524194356035196171378973584312891456035693278172947545740645 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 +1465515154776316306057806194271284642740583793319444368929783182358652181895 3349770746357008437760011946625595931507337047153849938820714125603252398784 995109487937557501301604993752891752322802034362140326444376867195795978121 8255032786 8255161278 0 4778989786971759408422546080537777407250164316479718402826208579613102663726 4762678742479300792211526773806264625002621817788400731729932485416901953661 0 3385756625913550417949460790917495096091777417871441205123747776214019914960 3243993537322601230407746755265852450391049856929556094167183253729558436787 1 6336321798081293667841191334575479120356098798144194422100126748972507304386 6474858681352286123301177646864515356067813735531679373371497680389962710112 1 5652765275926842962931419120954715768220869663064648565406896625834022286684 388090106891943000956443912313458783908210388306246097313316483085674271841 0 3675982551532240689594525383738521809733895918103339922434060877685656007515 4501373865882866349769164046898689806253686988795302016693821375718982473571 1 403281761227526595584611936537582800438086611149754411523103689098927782737 4877969073100077313749146876556733616872406518449256006243766512715870342438 1 5154404690155590739288262958681397681551410426377634828855040327217887925435 5385666151288804258592257184142050573783183645825862783013466550058647287121 1 4600617119364816061502797110272930336307347195562221354916841341286935729268 6913681623597119210530394208276737251243216653022475042547402875189388138934 1 2594451135000218082874196217700803028528953245588967428715552621652605920764 313807170075553037441779207199569242770314031195471102411344489229653423624 0 7165571529483368224349255122436775113936047056193451621249037527755274149208 6823179708487107300636152475519599892976475704877867649060753079149946578240 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 +2069090177485105614743646687077269603374929908542970610456389935200359698198 863652868412338283958773469517444481487315784028603361679107020065003928921 3646024553399260467882376388879760051970304145995195074923120571616362888985 17777719641 17777908203 0 2308357365196930420113068532236884671786431339526285884653431188104026365498 6064215329778869971561874498002735849434761593048863136093380883980669480353 1 3309777403057750060346572384325360350511472643997453968722331893795538498072 4089500527865212542460311977448119517740122718301454539333427845559141834914 0 3183393658547268106449487411895546203995892515967175896832762217463095283621 2352073922742138715664145790137736780947843353617875642384713022148983629987 0 2461787220782903956794310528901007441506790848714326862011166806728041883076 4401036665314511326198787676084248105538279894518935855215336850949463575740 1 4341937306705181705814468535273326228584100142528385568022379434650325046481 3737580731768308016294871249658529488461876727919709536063664745060448036763 0 3175249430052558913751833333852086282968470945157691712665859178743492833536 1740257084296920198456128883418234271212003156885059692598608542735383307227 0 2339383382075704630891579882580184490861731602171160881130918573507074016434 1394509741457814606378107320257997866873469036044535532904534673813911416143 1 1175847988085787442911813554999018739479284514839249498038400690477848530419 2876066992055755548458769645765657665853275033742045599146332967226223946466 0 6262652598635456847615545236389928856482644188427944534799710809459998998280 1991473292595467769698860649548338978244431047286805777612686865315994766511 0 388032159808648892061954846427079802608944948532555104181280700206423456496 7109485686515847044777793150932678664692742914004038076926569832429229947864 0 258387264382910157364099718112789853313095135717938562591391674646039679685 1416465280190638277440403465149753513480385007081738127507278581226108748031 0 4954118771740069233454180021476303045945454933874228549215641901157120813807 1218159010811368834065923421831385722366744274385747812130026718286965530524 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 +3390585337909479575911401997319842208512125089474535441832985698323965184736 4595948339989348406482571710960032941353067668232781906031262563660551363675 6678965664121033780634460142004098569494194434868711105926878341479592235776 2878090515 2878166385 0 4788622977181373902264394022498717518684565887212256143630153619720044240959 1917664469373227845204505848680016262327315591508543831690916141465290694391 1 4980609117825401209378235211241189212064851598503489714630410635627662136201 1509185623253205847367741323076532555514537922040190116706258155242855487625 1 5707248836272134520782278515418749917135120524324013605539585395858680554312 5395801266748547088881025557102650454043313885462358589149325920449688895442 1 5519127353098078203473489974893484293927245044701349668021729282259147489977 4551165685700538786242947083582586632593726245291927717441852481716049968251 1 2407959086650198358623787970188503798575131651834728702667068116597112948422 3216688503014958683493611050016531965937006712692714112060692081713456628012 0 3877752554093182795992255161397716492870227521406356587473219362911711244003 6501156334978213048378452724121101957708579445156231616989501228718886458374 1 6114234803261453315222965350251499525266089696672376899870576424943029495944 5107409016864218620181586151656835020838614097488580006429180747729910904733 0 5275736724072479441269198998183884927433864217130856049967059062009378262286 1014987897908223704318457592365181785149638798457555805449008957091044108592 0 545349073615116825070071815299239324025450617590922661232028093055488944379 5811278199565708005466886824651209854595220183013004220250595980927236201286 0 1864760019213764273369645050316744335633205960198138967501734080221856560133 954119848428133061068356164596292544257661703187772497872563915727989949077 0 3438131511756887113304362835531823055818014128037600094068858000352407282787 6942546227104968918998275572513586076314079026559043007101160604536324990266 1 636337017767903855521004994847573827015111012817337782774242594198209162816 887321707190165518761724205170388431391094422979710052592902565626708472233 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 +695993993662423580491274921792993569171785107332044043585439422837595265721 771613261204736571360354759244868866045805719646765568488227055558703509471 1695121091118849789275514866292147571273979467106454565791786379191561246966 3155317080 3155396520 0 1221181269164684339596584803537624510892872189726057422637024477366757546810 1568912678655865845875274806615579549477380328429405230941923490039722884865 0 6280378114284684914001938961109434781226236347346247388386175746228966162460 4626880637533258571908885394764024132649344623639806905727784130483489898134 0 1214140674848929170299712277207498704487550370126181760095532518421857180220 5616861687963485131901921543292851759579995472309885104268336058821383542784 0 6232821983815911536403720495990754403593723744022647867691052842083958454026 5432788642566558227770149294772121938262393827354444599926050878006884398688 1 4541416436397950867625280863553802140728529921319701773844851681884326884606 3419892515818877189276317503299111621731611446586901755667757759026462216119 0 6274191036228202852730741825402015862353395605674128678743539479235453073042 3037448536033907254324896314214879524326230998548644357667082562917935767700 1 3194383150203497392660651162686124476648093184180844954135227815922699372417 3501491383217463938368991840975113375488060534217365096322313548452279217600 0 508351764673835869268691319317278240091471112845111999881867568472823762437 1947149575303882205243622263285895465069274938710671951107613192999302584944 0 1774528364455830332059527819206664681910418024684339676531590814214230268073 6450782901639212272527760625248591307368528822824637192803507477614047798490 1 2163568338833528541020277483895905787876644334305933180063834876185516760446 582622120077859492320736263527647282926802487452333786190866650320930162417 1 3444055840668914641665542102139044217370422957274003664585817165109400619192 357289915784881958164616997378986024844087902921059778702598823718652121949 0 6178963790485291848484261753008527497417695452028629836382205517107813165535 2958113862062575030413585133220922540485982955264740187429450152932855445929 1 2054270892742447876736699223788912751691767605609378488840379414771350138564 2835393241416923108598374712393405131819552940731742450349474447498762024361 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 +3503841141004563060015731130411473605788917286797121508944709908457273037198 6010388518366150341134065578599187776026466258025716467519453099433304020249 5061439081344969591727160991153014467623419485253082352322130236004680961428 19437511528 19437708696 0 3861220408004546706421961472301630435019059379263048946752609942878418874494 5612732932943591250104189947348092890757388776057097192081334983029034778791 0 4562053807596683690166632356145196595327390202746181134647824963914674645694 2172650902062625982004785096047918621494791736276303864425636370655269192682 0 324548273296484299729172662409050506893992975589649841936608439707605592383 913993550713301329144594802061880799980194252412590873734960308340527489172 0 87596432218415293897018767266836894668257186459045241667456576848909447169 6544778630254947151111374517359804487525295314340634704335617114127009245082 1 509619381033126715104999447725558677355103676651098016121122626269729933742 4383531094517249691554688734305912821005244434587939692252318745239843738119 1 2461185960637066386918347275935408314143669983210064659230085774286575292297 2512512388578776077656447869980590514876984779151896584853303462006781811108 0 4947121705562676726984060557122177706729094597568910736665589336268388095134 1391326933105055290142084293241997589053948856911769226773089705167053883240 0 6952044717053511821175887810018040867984068132133883624736158980780203035392 409483537668400697140827468802413545613896729236381230262539799295698024619 0 5642731075834856030954913054001785631583838498186520864459250453420844481271 2936846503638197505280433189173167569850565014983754192454410969537710793391 1 3351161308917712748676873668562290362158783398721485781869581577550706380873 6854914877825831364592410411235052600596897856197220568451337003446722762509 0 5372166020782619486546870817607249352545108557166605349412432096463215567092 1719660978613684693719625499968436195940950763687678134837977068788906423135 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 +6124040996357943787093337609142381735828343018083921282723721789740650572269 2976330653145960167532993198905221186290931735953736908705805993892272490635 2175433748585758514670666185375691465715621101036235055174993907536470635842 19153257060 19153452781 1 6970798963651234873969506206412651829878926948962300251257199765248294406285 605343473285215599326920615608234570353437278464547129727190308766594223249 0 6554677724837470448985458419338310802300940931711564761573548785917049396877 2873048750008731527294293845513373831413435209858973797592261530276785405474 0 754521393557160858567988920252108536729297704010393102287907531395951197134 6774789563399092353794991319736104155936305165111157195609306985198561744762 1 2847375163155878463132258084355859572352443947241672303577840466572426595125 1342585345857665225595121668196728673740014647588376918135304730569048373998 0 2518368348226358362072628449987122487933880086410864364201587006388491587406 4999297269362994808004572209642510861474925678283175102759304587263009374674 0 2467799208055358266665961981132140051480675003637221441754239122002918377377 1569129602809103578402522827200400763167031519173525331789966682698213676234 0 637071517216935992133007868357882812466575591893490244585123610513821057210 4334632465920247902218189327904009807105081357228143525007782938864558482555 1 707717196980616500945218311639359059162096180426946204994174164832868490993 6470100444799969326135465661670982321175936606134258468419813142014952282635 0 4570808776873354819687119696952070549202342172924725419856430106103623626367 2858698065669087547733608120033089268693494585735708990315987701961404389579 0 442848481041990105174911344799948550570870571785599227301851253298725770075 3635500992665435668856366170329174552612963842351977386749903170630962296570 1 2804634903645675484725915857782612000174507797105244734135573666066463699962 1048425412734301715638488010646250428721446056814530272591110867534211884533 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 +6275474494873654932782605240612619500755134634968205924286735138006526023756 6050062846354471446216209149767284702757735619495108518643144860983204974937 2730887468742025920527738889782027990684948698065759845168195774643482126180 4351931865 4352025160 1 2905986798629499047848156145529411447509198734318152665737974490719135242282 1459171061640910091393874466155588094405077713852280974092772148696067961594 1 4189622893006804895136939336720553390401663035846380065412942640684904941611 5664226365678590741185436789078814421308148892791682494775998445953580079078 1 3377363457769573541904891431488335862743337645814909958461877758128661970489 3454945033580846228569939238536758280756508640954166678601717790145562318480 1 2289198388600673851021909149629614943875805067983988996926984678534896897752 1563148361271293699484587541572997597500049019307031361622307947374997521348 0 6403317493305107071936289517843747404316075545148615697101239239264456707505 430635771710943759205787133054397547768055487133167230019970777735199985613 1 6993485709403282850551487482814470502566030146653734856032915857830050867156 2318099745495260581656791250262923259511704428950308515656353756939395720971 1 4263949929892185082618340873104297883295317542627546183462464586184886995823 2680319360630542452088146982521952486367274217947209046519443279380242412657 0 6598516094264506760752900432993441141835494798737573658791403433755976517905 3207415831887872959074676584006822309572071009644479167901040500303232206345 0 397678969103312119310985422858103240626717648297182242204574260763341777087 5058235502645229059577043412689835376337210620334640735410091797084470563684 0 356922130772943269484445597448930901572570603458200964684260736540101840698 873944674860394007801750948105158645143688456476378311147762053245747138280 1 4880516303850916356055420149053992092923505163635625570616537551808600603978 7173211681046260446955187370541183555975960987993891441920872549005108309125 1 1549337061202344263805668947808893912963247024426928861819402999423151292900 6851554255415253244395381294104955813522239523939837807425305078554932090267 0 246848846927257060596821434665218835332295763904111594271401788884109241681 6917423617096940902755917577082785011643411351216872803204018177392881001885 1 5090748703440058322533835386773067184446085706853048507371361765724182261898 6439320730109434853942508615259018952321623190328681292899324119434553793009 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 +3672773117803022792772491025596620738591688570349167513526026126602782584542 6450080040293823047876556453216875909551617137442484182022810643085616933923 886447465477499874629973025605485332339002692778681543733712997884424589877 1919427861 1919489820 1 3695736826039953381187998543270083432093049795159576309226611114653271831051 902149945500040991235136445027689856000175231660808805420486541098118895385 1 5448822131397269302861492767696322322599813778049672002156591720129414415385 3564793848393324904400097789779695752069216438356694597204171989451338124780 1 6670202231968453974531663582744137241402929555637833247851806648981254802760 4607613363166299120946660897961972584630481989961064196929611705850201129698 0 307913938441139684405837429971921014949255947096987346782586230162194530386 2697129957418965880593815946274127307450565053323835385245353040514765989131 0 1173242937478654573245287163678791865274412707507100612554596266258014871564 4137445761574148913709525107746501072555971181046870464492225818088550439736 0 3407605872954680442369959770213626380655524771043583215803359564627707226156 2026921164491878322346299626020128297187554551841931051772003169643099279526 0 4323997578399098641725213547890167723747519206147995167110834702348090996774 2568643127484263093949498501990681144592191968248092611123235864760983374691 0 464073266882087429609467029371567121567846268781447105220986228406947903490 6356280106576580584719885668201438663413560332327373758234484932513415331008 0 6059497410248767636887175673295835610021962186124551824058839340626533163488 4735387884073948548969320984370775942199940159190669785238999442953966536434 1 6360792660359952407575372679788501694338988074524531219808229767760320497675 6730241175603565522985809272538863008567297968762410552197761108336583731988 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 +2122703869089359476632304402854896856281308856051334510879627084107789513193 1992431241330859347314974550895889153978174937352252189821193919396151276302 415949519180371059719774384899926668647373236690050156453659984685697621147 2257684806 2257752003 1 2540351046890061150783257280006989610123392678256338040630377395914803205254 4197297606681368685261926250738916087259897622031262267908062976483594325787 0 5036935522304494653823525911150128061097779908010162622634138048372445706913 1098965500121073476722633405349296922563258835296011420127917269704203549132 1 4234424672139284549617518128112800980062346574845001761050704643910592023143 5558940248481187916986479314111126104743583486655652760287346461685519091340 1 6279833196786804926766600004780124489789876255016507367569257255589114058740 3461516366610621268004236507276590807803177128494265105575524281606983286283 1 6624253319627159026843962294507106643692473806319202104388847206322706091628 7143299584204954769212031694689976002030980242539318619867958665310092224629 1 2251759439372435298354571600995250951605891613622991413240794133386029401974 3128363584386031123176918626642251381460988370937181540436512168408004220941 1 644767727568777006451389756102638723706732945112197637736234445062028297337 6281939525214472949505638220681111649367582366374632000525097779346720831114 0 3757665576666111747553384851743821134394753704724993320568082613116189963569 6844303934689701029348499112042747378874447909096172018753037354661114636795 0 6515842168961525785726970227555878349156462950815757219243202092479503405926 2279191120152056874515391964678124155168246815975520440259677123569450056937 1 2077246600456951733421579562123797762569884175626267348129123005363203065964 1047631235749172740569891207163416993899433233002635519737700589652155040045 1 4647943554231033896732973402057866344092541594664008185557115945844332944871 6208279033895090801867605836469000571028141383297299023388317104853409919747 0 1263487976924582745650530055539007704817321985834544259802735646675171503834 2478983756586800477896085335177274874903916731571528577378465939112067040350 0 537372104467104356370927201155403729452279447895081886338621527456019550729 2553660032204632172592376543419529739945799470022130954058558430666216764396 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 +5199392404280279250750614444271912869988458329284513509216656570773097218128 403696766793894056165699588453684306640917301468183266617072739843029237607 6445608715566410489261990788422695686127634746340443367280745026576307008516 10850633641 10850780955 0 589153869748938930214329422408494531473391942559797676593065770638974204745 2128322651161350930269441921294592207397998827430383116948511145096293134514 1 2467053906817427797104256417659250754261299322104707065932846561877741529734 6793888828234793888277788458060368742771674333679427423059602169821555597490 0 5970760208329664939871319449974623550522835343303093796843407857779718439709 2594388973945650775167385135182570256923667236575439113007227966819296010426 0 1402662330255452257477724630645117674287469966350833290957525672336756856226 7012024923729909098801963523706935440422669331478685031514491215608180327740 1 6414272443569517122720890454019682075127939274053009845496640815991278159674 1009919515781081280744325871227894216167191742065338008124334981170869225482 1 4180054466602761454883988558559171860162837172452838526170732759384645462740 5620148249442620845283135358605389130604551781824099587195292905093672251984 1 5280016579111748832345828524280977011905864467219973018216935201751977122353 3009631737032458616994926959668006700309314548936942823109164111320984283658 0 3813499874023334908445829579762073936287507854036106360021542004641630804541 5345552389637243401257307123652671355118824445044514891109473086871634194769 1 3902825007188796778658183080657926248204186319563655892465553527843157999572 4779735573110020373329980775813575136396987181523984951355105754296580643768 1 3317886153594774951748904270048753517833244936315814799299367914424560133479 5941308968268163776969309828057838373349929642650310968768607487823441099708 1 4836510169821396285881859285453020657408360400380042114742068308393516400268 2890916201886136596887205143064417296593818930481230602825479012791554336640 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 +2380603931824152697226695494085084562668596566592542353616602110067148446779 5019050264978997891184800259366355644993088771348231784350762659689080439799 611306304875788094194063565155379963703141290845528140467872101656293577427 18579268995 18579461761 0 812963196537839559250355687556289378636855678230095519026597787243381472191 4194055958715963427708857713185098381626997385319818604768544419976145599016 1 1984931053343826309091187087330809104664655032760913810348996622313573773705 6978550157956285839649569230269292071344140259460562645345826076037710214166 1 2287454295854273241097123095492802811495895777331977045948913197217885041287 58663817228108332022233580959411182392636246441115563728413070043517514658 1 473495471721799289663939600406667642895124381112122661246696285613289552405 4567396758159370174315000705723925370781834673526994415242165488873728193403 1 5629515904648845847220985013950049821238724776691834155997698466488308883482 3996487945670853364041936436522090756817636410435724811168058560871833072878 1 4273641159769896774652351368437250344862055549435931721427961117493933059238 3233366843553339732249239874024579533888799199642980221900387036027721082824 1 3296325559383826672317856275842960381898876080669243528141943970617902734826 5470831958072436572455972338080230542996674849207415291549545483627187018645 1 2111652950098389128560701515107191189222085691215371979774493471528551720307 2360885931450526827405990673871694901011516026158346373639167098575316547057 0 96529843828559316003096390808339571280546092351914397067690496106338103730 3226060154035040558830736615963052956376744899930301784445800965542644677286 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 +5469205462638469184891997875955706429256170076115613637215981069295734929821 419208382840129210432253143026947362527991001908593600066992603038894511890 3056444882706478515937859103945441840080920832505827259287010871030813121634 14757534100 14757705900 0 1654493838041724083174996523312228356460806772475936275559332703593656859896 6632061082641152251570550747858558855175365272603600620022020648379346903051 0 959405508805925173308438769527849975719414179082337957430228998967135211874 5996331436967482964347277355238228670248012837366303234054834624819170971799 0 7024319659730118333349371470829277019122265943053944195850083604194053856413 5433456025219887775599788426469494625283089303110061360624826366375162391619 1 654770225557378996528103298694096567161284790175851394944484611759119719305 2228349613759765765126995808331851449758120375418140318968531330574660328782 1 1918832340554577021203039617748517451075856860123754742945287903320465211145 4692890478433698729352131014209774181794909984495383108783554840755757827064 0 95225299484906461843587316106577034287238154825863321382999924129062906316 6967989631370016429105539565852128224075559127648277662633216681392946636168 0 567382994567635585509403637460402751954224482451117504037446531507026282618 3725541825106768997132908662794246938459248230152659402560056778973657573916 0 6755534545791731485101216897591080876202103250946675503139191243236535642972 4356591063852729827683331391668471831947485202194722645911665061595960430719 1 7041492259045924010228028231025700029168339643171891978784998292499414133097 3968277799459953747078441486455821557826686245305286193970322655814440836121 1 5760398876350222386926917277716737121917186088249750836508029764375814171367 290033059558045596230112833381447028626722863357249579226678994195602011124 1 3418574433532275305191607086646058872113874344958855419408594439774031302553 1271839021926337366415057795112409256458091127347011823589617718346568015494 1 1009897218477658096454947727932521950747890918221706135326221365168217389952 4430058592968905257121640646172580644409167911276943297064514442960563374049 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 +6318095694578050960376659299916341877844189790673085125289759848217139670084 2319127980094936169686038224353839083319872861201875423833515070432503097185 1178591183513589549703220453866400290970469462378523950470052129185426340846 15904272075 15904450425 0 3455305631405448849581058840493581096835789661407585416242260847059993528162 4139460191155705189709890189185578780157883920837744419948007237669749269021 1 7060441067981112357920335562518973806979913663973039101269329287830670180593 2806080847929816980017841624193575931433975810551313461098178407058098322929 1 2937482780942068369285822218504779810925497725194078076149934961542705178935 1661399249343072566921349754430261210193122317488661536693266966102949235160 1 4030686264827015551744646798835970976082714473561704670940526422062335006245 4893069443589692731028784320690081413388455219445569406215720420801012520562 0 214624238877390878551512483290018654811558569037266754528331177206457097991 4611765144634705483837795556362796356112585660617059822092647928922152703285 1 8815503521439003502453356576987481859919115423336699215569301635817861360 1745161535294127226904800991769732980319147441242121049474254737327247738185 0 5510969735210885260594366515655247005208146388716076695223524939635183140681 2722117143877108082341041309775076038328010758757092365708089894181704904119 1 5021256835037954456742178304319158020113119877823353728606046923024676325903 1570329891790353203426664667145609389120426378934799610749457377397833494939 0 6829932253461476744215129385523279464738386570502129546912226814573637215203 6102792342080102564164765618467415152260118370859067564420071777245281949160 0 5966944064536104934815279210989845485109610520973531813131581345740192471073 1419910039747371690510718622378526607496830040331517185480907730008023087922 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 +6161199195507308429003188705008407304610355711142479295239356991143160947584 1217625595477737016085766084734225829960753405417431684419856600325689833893 3021005484380270270517940046901426537390076304864890802175594037173502153027 118664715 118680121 0 2794554657774798730727658290629423313472017380388717111644046578105299335370 693133570506070869234591050353665561844031643910681861225302312525404767025 1 3116072393744796796523204714078408737280035287168463702827209736237158084096 6018942176501940472207289960070119969904437150244332865574678442256927211087 1 3439833475339460803728775003873430451700379454814604945741220390491058260788 5898644382586531494722376339284047448175735736547578336472270644347103967226 1 1691998095153963712408394849050911597812809362379841957844733119420879554199 4590178854551768128202059892655776197255754446193202351338816553358180119367 0 7091202725987623898159901361714524289776727291623210050024214935407792893127 1473563277879849842003245973079303170007935439370006011223432922655984320734 1 4742239953106438692391072520606010233794464234722385803317752267658899615123 4645895518333603375262102188149957560704251412579139634861045439592713905374 0 962096652696446903410325203548406594492749478747774458158681381854691359058 566234110885376775901436332278461062151362880098107233203933328592861135180 0 2028213124789856192833186748451026589728448518863825818961572252795914514430 1560633713345822968623113027427371486597662670776694727990322427616270214374 0 1556664953562333312764848941009787448623778868404450875528644189928828002299 6899844210495348634905748569122884110821277390730070716578533112766952458766 0 1545040140904616693249238865530537631376216260364774120141523088728128989810 804672925933972022927339166875014279736126266396813480739418721474539450116 1 1384230104126269441977995838360322529841174304478615707725157185250382764633 5918637426011750425399440030967219352848206878566095352728263921654988893285 1 2197248421030978754061846136114026484810314103717523282272848661764077048645 226156632919157843773365612318219116841485041333054474569775620648310166970 1 172803527762816541696122674473128001777307174320004775527538962184866033734 675896143954763107399285110935153435921306904082192818097288323211527149292 1 5076358001873148322002447952972769939268943642505974868724355985439644595520 4106407436109705082056521589217773355847921586231929266271618944873220824565 0 1566838666653840290148503517266490486786790312633690005404814002888013416241 5371669768273597149174698983667332452143565853352447763668746512088381553229 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 +4416524142722107156545953749431857467119732558425679822796682067481093420762 104472320801075776392080958586955877087418136168029629391341848508552070458 6371469943679298034670074411948698368945604889059004900933514509210737969104 8196928741 8197056780 1 4961443626669220525540992469014576184605654725858463997032680617430538234678 4963266415199392741170104634050764935161987124620446997110133179805177064534 1 487117469153481807354442924971403138960047389271071852123215344961704822496 4198510169657936979953951791785973769300747657711303478734346931732437392236 1 6289017581248049461327011839812862769058064134866225614195254449659051857547 5780667641483633185103730528606845100742305097213365211035531535862070763846 0 1737234384617418883415873524035257258752925234506570975925429023076313030312 4932347976240014705192651107948332390446348838299093531812472172493640774449 0 6518580470512010339469541913772214993843678537338159150865673225434518226106 2807946543213604058060992325067906142042442292423079602146576938590834325869 1 3592721556005684684545626392812613559080011647426157956805289159383555179894 2097053589821387785648869506162858248347276763562382911709644190687917601951 0 983442412029669647565119300487156399027109235046064379905005391131879005308 5964151450909467506185428897180855164686619595979617286257214262209927978007 0 3658647259749133473439719896725636210202294262581646683056413072208722694989 6958704132181572702380502689073991689036974457322786496427149529751025512311 0 4843561766755161080365069476305427686046261253511075928430281210938022079915 1583909946357092210830388530508579496449115908271002864475343644843087147938 0 7165571529483368224349255122436775113936047056193451621249037527755274149208 6823179708487107300636152475519599892976475704877867649060753079149946578240 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 +5474693881248940775111079650786950639872720778653081449485225767678344031658 680628686894618083999519592093052513773656466073718346485595699989774587913 6076849996474443986525711539944032057350117492328097118922002054938493131658 1916516916 1916578828 0 2594467337448355912191260614531854203638440740494902428210271575332919426600 206196375913686853901287756522246046815205633090442466779674674283428504595 0 817284187148074574372894093657798123644022761222794976554144814017579030789 4858813801790703653951728957498379334713692017666872273306562400780079454580 0 1149262156577195257563266144650858239513710626616782421280291181993186309287 7026531867635017655240054623717011933907689392341867449084720399454424092173 1 1504253432105442527670279903683722515444755536053405345287812229857602758894 3029891662957240906982298990069613184472673342729474962014526479805287011096 1 6663439547291979471554218623455775327763420751101029705370724719692683610854 4108144571095625981377055297660504442914087307541254746272524232938431039566 0 6906382064521725926097373732994111672236446462426289421718182754315456065001 5802256119152398329757775904800833059812419606658374847309711400410261542553 1 1565156591422796582882401677703247423166572306395800474822201813833494837460 5772349976601612838344155728989858829059346281718856029992391135432973911223 1 2992629690549557549448686061559122970677837695702126863141870844978289545707 6519777071529504197248002685334442373944727959854308288283930222003553641130 1 3622528735015074425819121503173220361728896424779693548638145859874261983168 7098181125928235888804598093794477282686222579797301665917269635331560082117 0 4272304758280574025963000668090198126881518755956501293348272095466402595463 245884974869263310601011804663862106897750785330139200955826536779832490625 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 +3249892351783333649908177726591370173830652015579422329158239279359576953561 225839616446119885735372773046482543808518115014839778709736212712342509868 4832264434389746352596368254845684905066296948674908983035505776185589101830 19157954640 19158150385 1 5613499503656110422792763796909053731018547923665769956235375126995587421307 6317369768553631857659974799325614196267140213667754257911844247193494075845 0 284704818607081757835679007644543702284105088097095622137327195772718150335 1253007907189408927042995273399830547499866746738627808133043643093616891414 0 5719181579541253378939868057055178801228496044562801621168406838959306935583 2006763952166107159309184561691673621344800138344606164741298731978009801531 0 6172761258483735700657284671790732888444738478092788708004888944676053129249 1552090722647435994935217731567822238094542327028510325822154338597002826955 0 1456869416388134339067228568239871052261110803013067088095158806350914206941 5009043022485707601833900655945523028192271945036603146835669524189203918200 1 4025845198406473871339497241624571505816389265438708949111864585151690888656 2727805859559632083184443552808832519517501280052438626958949172739741366307 0 637071517216935992133007868357882812466575591893490244585123610513821057210 4334632465920247902218189327904009807105081357228143525007782938864558482555 1 707717196980616500945218311639359059162096180426946204994174164832868490993 6470100444799969326135465661670982321175936606134258468419813142014952282635 0 4570808776873354819687119696952070549202342172924725419856430106103623626367 2858698065669087547733608120033089268693494585735708990315987701961404389579 0 442848481041990105174911344799948550570870571785599227301851253298725770075 3635500992665435668856366170329174552612963842351977386749903170630962296570 1 2804634903645675484725915857782612000174507797105244734135573666066463699962 1048425412734301715638488010646250428721446056814530272591110867534211884533 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 +5596152162196672526050606959925217327738352028046992498213007686655977014347 3088992833149599104714287457864142263703975997078382551675792700047007717666 6440683692045783297392495715559345989621594539224679409126322521281808842787 2781125490 2781200071 1 4973467892612750853421119122556552300887448469798909686267853436778866415178 5659076850107237484117685538087602050740047476309947073813036962018396737742 0 3942871965387166581336790514322413622235077350324528875667306682677716092662 2611031802584080090259158706703334983573219880242383488543218630301188717945 1 673840301529076134071669578961754447464971205853490969846963863829197473044 4360757919601643105285469855019105872196664782281759908288799458413604316592 0 3964702102874726844506861272928875472332317473306954389503928096292907866218 6808900756548407625607471083631094186477748321190831556396890551188552368241 1 6156817618511033938911174009875010892881141739115760257817716718268256137628 5911685665174865545738335706511846407237761328537957736219541938866423984983 0 3011736933746586581341957771448883795184028045575754540574678908799355574371 1739007902703303371865073896547800517125989548397930233144101263452241484066 1 505275170989601454649334361750932127014685405847079522958334283586491029229 3926680729076147220103338125219489939045695350813764652653432648651833534617 0 5317176313905751605934976062560161484655250423637587037303044430349860867245 4816595209335107452078594311930967774518186783300964425614818427955083919072 1 6816414205979664795708845806792239804548939957453344014280143058342559549443 4773906292472101158114585262240625790448730760513789754745332059174659275928 1 3458930786335013628473492471535639253010587605971795275674369231187454166110 1211047094926683396835351694010380869012200078897675389928572636964984249760 0 3462048339534104537265459053773713269393792280013687747271326685417497865154 6487123686626288846207816417767617999135997297758621808315804163610986225252 0 4487893186982846350820551012067497147059709308401521305616429825841605419044 6884719690353877034313254566733678255436921171944863471919089210264827088286 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 +3458785831985867592813008507974966063215518529913809171030256783294854752476 6749355562687114083026982154803692125664334811591844876468115767879745512593 3881536287447063159485312228982420985245787512107857559331698230844785667222 7328064453 7328185516 1 147417823683882050313593509559695418952275247180144673561306148390718153315 7001769178252439018231023951514917406363541826546171036894870273622175729062 1 2383740097121306974845166220546411718564644179531441075991791288216572983569 3246933079953229003331236598001566168995182687155338043228842503031462967059 1 5204405544248304371152557088773774239088290822569982307663134295763798752065 7185785506885239187235300696893649595245463784893108704260273574155429280721 0 629517930720666511556814082551102838019943782587782331247160167937191112010 2173135029071334730274947187266562809769408235842279402592523494130130484351 0 6906013656971234571108359711798435199954435771676917802357764205367912187011 3426862237618601823710787298378430473202757307240445755539210424838952521223 1 6248600294762838650508546860688241533685008166683809590353662695756518584682 6196608047569952582146534774092187227493873656382395960048518356979244389837 1 6191794123044723216943223141775911429587206570372369388964353127309065135849 283639290992047365001116765868527774394568480107841454557492551726434484739 1 4777250113142179938732071378694568462156785300613299069179669207923632496818 6992338510828397836023715756186624624387696215688205814928561823752311784756 0 4502894246418282964976028667139913704763960332767200021904600078233782792650 5111376015454457396122757517136128425165516320716359777882671346295216003193 0 6822395443397155720468506830209035564877505182262522500369495376387610848120 4256130175362539484890043936005014293686834628190122807631270275824711161868 0 381587827077940780343700252948305267828895242687867325974328645516175905370 5076054685263388639846366083418591669610196374827711443108751702880918545735 1 2716624735279808654707628380114972718089722437294438951140070219003606061823 2863726410667765097528054096725854005399123885023985318551050900789164853757 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 0 +173307859199505179734500898861966729322563354069511005866705085432311548066 6060378579463301793089446851290570087346419889366013151895044774086710615273 2970189093604711646438489258573764379068099831325583312350316854385689772208 5178922651 5179024425 0 3251498940471497794772944618123056590201444752638512932204841724452062613756 240659823033818197372307879866588344856427658490331204583316794648303495138 1 992288315189799940769981442854206643495152558628505566760728134872256658924 1006142054646882411348745406547253319016171609820763468166484715428316117541 1 5265327843552148377646260363030554938769674593032798039196969282747056241688 451161910287119675413865615783377531811825464325216840455960010916790716649 1 6698641972417781077820116185002540773977624293050594849776394671389605384167 1499822910585048209347734103466144699296061333493425164595929948088798716517 0 6095383538423344818172422300633364088702024990970391763624068524906142766100 3066755033414805060997050956765834642897482715487077694041277430436820741402 0 5127319935606054703378167064767858702069889613991800580955254841116332967325 2967866970356530431357172536623447034638034301801490133267787121270153297583 0 6384596725672843858546444722145874622842159615122104864943260737647180529561 2460876107731256788954565804796825359104038546703550186626296004899372796578 1 3153179357107732763960490654987163344379055432657691734982244575969905068886 3589403307768411134428263435217072573079269748245528825322278056115649889971 1 1009927343069614094882663065849091834912196993488357063610322946858268668546 6712171680800812148071826726202656160201005688045550846596143950040779756615 0 4460091795840171882239161677025187061173620542726657229366620694787761405902 90853158438887198634452280403494875523611998194396683594386508206797353337 1 4705585708174619638930596642328685883189509024023431171575470264451796571846 4223134948913292121419579700619384733949980405557372336725282819096064364828 1 217043577718438166422368777455460925010930055391118676459785211747415037663 2035063708470147329221904279253291736747106025237471886446388557016867857029 0 5114937658768038163729885210687010456615364262749813991183066892980229567805 165983176840206393201828159622224965246990948193802823173034006122445505961 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 +774234947358526763084862529631489708185837720343775342782055821272979077640 386697665384868875803036704861574798532740235979557681599333427797385374398 5491831066525837994889943907133265733148813763237475647859662382827536655896 19604079055 19604277066 1 5112271993349379059726131103710461193994363236279902626856428337292668351217 6638047831151295311778511983762132201343747251754846293291523185338168006436 1 6515628393065269999861810135723673633508826516444384313975950496778052270156 708954000683534244950965191583639919188048659326660107167936170669769505501 0 3607352215933181602765436286276750179632463678899233042477946058951538432473 5021938860664508246442503033353880650385588102466212865092792864641881884495 1 659319741090012147078864034335415941735806487528280969371118228011040305264 2285090046232453815588109006531437831363979112633420187134695205575721981187 1 6953218280831372137324232508047212388321999394770812912692375144308636535773 6872924320080249480968703501626284177891556696733703101128393630675589701131 1 3097118660563825502141196079357844808347825190794557320152730970234272487877 4912629027183986546082681330811809959797106518006864021934601649393818319714 1 5492507184207704312595094994648672845310131439272491649321807932932964638091 3760442597798834963411617651933521813150897476270567555890766790919500499741 0 6295292003519219154647109469950961131952940783154346557915204578875155912062 2815827157113588204661417486412361422957633438802354487256322005739956776213 1 6103493440316137408474290634724502266177805673943822839250969320065813900888 3669644230453190723697333501119068214253738775464575066411950141276137925688 0 3263357142581932916681542629176101033397555219429250039503432750975932467040 5592207029660183081685813224902088465170117491427678443881425092998332896598 1 4253011638262720864230830152432576534084943460126541901499139599100510590368 1146857979276675086792626062165035579639717702662139747044312345445575373132 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 +1686825268718697233854444167379475953446260737427447850599146172533798782283 4313933901645729299588632332529170689564522711058971193010501591717681502201 5155247338326287462759268889300483426477145533227591943958449272303955612027 15185800675 15185974950 1 5447963632470622233658497006485444734709586250914089123567782907556687033409 6198175895853612144710083897716510396564877474550780611013683502969296749521 1 4298511099425091751994927577627521263220079231871345031037969325466479528604 763977540327717966788040413680689726510877900691198755312278978099243640158 0 2154018578715781135652513486351990475746682993485193185341210095404761795008 582815058279633787320760124144561481558088502915347392064078476597765976767 0 2566794143850505309169186857116857754636644773488774441109885789986330720081 2538855281504914629337508760542817195679523105617026045945055184337493343881 0 7094710578120333821531424163015990843395199506373210836821083233131958941358 5118466585148316475567650902699790756644776610014645738205402369099875930548 0 3175185488882069538098828073765523558728335362376335241051871045722101174104 6750754964526099972890074850563719092006501110313853730606829210982929590360 1 4418696119238050582852619946600511249083661060203219919084001835178024915608 2755764902485487433241961478633161712761106087095045152812783439874329447779 1 2451915071707397126839315842302513124149870558535660069832378648465567050735 3635099576146285068834370612671362374278920810379562611906784344090065334064 0 3390031230014636672359825309781183613504245118480053438840999614345638613968 1039381848531359989713482458061191388983926392400129171954950929257535648752 0 6021032527241444894102207079810747756382970090029215904823957784290835692951 3658306326902020160322115850762001532364259072189317169052508920400294702289 0 5524859911479669917618727314114366219392917601059597058003104265337771626806 7059310816779655942037342416042420373044567410196508188439493006953448567915 1 5220288122505987897243223513609984123279137833539776214109751187976182978706 4347374913327134130394918673275959974612025625076875821229243248326940521105 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 +7211908871781286746561060342807122927775206547577741284927779504041559552088 6850290691025483876001080958234713196841892007690917165402127325768363380310 4582648398091027057148962613511519461920612562641333328699694168809132318508 12967987581 12968148628 1 4928751341408186616801083507977936175452155540493670165131342083330918284785 426435572542055448774901555121815378775507353630022430811439972225384463273 1 5212520066539970778909142750648124895752303652050114190885788388000251016849 6401311709505264836531745222493052982733622177939444343907732661297165633552 1 6692071131731308949285613080722545095628386770968578839419231445317421849327 3567498008946211787763472480794999370483934006192171775876372428487920817588 0 684344546183011780887993809915854986777661857779069374020159386630511436355 3407109002510262382354103729945227583068639511230311589159473220190685726845 1 308694633241410813821734402153094858304011578245161190047913226163216076158 5830116596816829802466433737886136716017934798401073729221135763603807437140 0 2114145394817734530751368051900363015394995904434917322312865979446153494712 1043165627761140001209305890076592621683921283223365463299960270447126749103 0 1641276047385583456239848160373749209794121312419028185246171778705520643420 1434470438819906309895471340320612478913806855464946033730428151198020059228 0 5197337791393164282716905604321401948777061954047131114926870956283027718534 22209563703344038293759313163153286038454872223665417003075042332383062472 1 2327010853356925108071413281243945867760289611128633656042888259943682021652 6824275756802150606152327462304491903526590856171957445631406288714720310976 0 3170879851466275349657212441515498070250681011479397535149392808398887154328 183590928309114103433213509611357330380597129789348066752198799514522544106 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 +2697502680533862286166026865953250511023858628454760683616771414428644427896 2934704032884477119166422014193993560322865637903419018391012858462254105756 5898137401092329531973122450899188527424582717297105275312064140697533343066 1633890030 1633947195 1 335946508475626174139954305771868158496123625162760791779072222324470360536 2633478459634510753125036570853618959305855955117456692301409318104801180268 0 4793777381614044057436015677731125200262052479859286249025879002509263303700 5603399638465088865463492736334843219107369300435309463003378279574095324541 1 4414940715828922416243996062199810532599634013940780413289621789437524346775 2344999524541039256780168692542481404742654661840530192875530010519800267680 1 5135187568976642076455714742013997737196288349379856547725896279656993632509 1962468864590553867706620436850214058846227637762180738748956064330358254862 0 3569350955082483603533468588677821970626713986212161313421446616770131606257 1492935395965191325830250106040940868733377243764882406049483763492889081944 0 6385631242142521915690529513891850699060857001873572395343801876350224058516 5133558371175581428623575754868365868511726607891702143711896998141166253111 1 6992537304110996998060911948602307801512651657094267887236801665884761931137 1337726321591716553681238175024499614754924436275826762344126362583975770514 0 2566150841631708303490942764017923379785063395811714069369527873195450392784 1698511015950709635089403982546490451022481668472678361180175093022580883085 1 6439148385992932934790807813982559954608443568938159669044480615293425425853 4231878214500698865025743483946913487404111646496136115435004917839451523576 1 4922316091201398267692382975452498714776745431782647600877027633583367169580 4985830079627615153129043758999703984670285024838015342001395659584134918282 1 5720264096457893521315576340212423066277710485405554582965494576928077573514 603858627405582061991351110592926932231337654057923368390422345106875231748 1 2836873274077781198370494171065783541067677273126240835962003257999028641929 991471716645471221314040232276717729084708483290748797093538818575638608165 1 3916927548054963635479291260140066678069452497421999352001215066188401932480 1810474348310579976497191291097488449671283559323351719880014327038662416426 0 961847789905052348395639473119596628614754188021930355098071567980791518532 3155596887177169079958614944255101915993877870543881690508606166436311666145 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 +4770673773850081698721707793089114613649577984494429534245656611756496512877 5680774425267789484736294432135370106451656370729944389519817675214334114535 2434647898447554765575005632606069678796722738552906295234280072527271722232 1043582455 1043628141 0 5146038143970947990426167292539125600183290979082934885421418708441124726869 135235312896047913922621577211151769493363634345185264566599648260067886186 1 6604422098473230470891718504696374089865381221057527332731501641915364631824 3086109126684481087395677867969152254467742710688358137032740367810014183670 1 135394686606588721400325771929085447100232120593827590106866469780236148169 4173192145902862064611785934824341483130726414206023385927438123980295967116 0 869972271391022819570905574206324823638019331714716244900535670800266988922 3820603864360962631775783563973807440468960066142928528570636233212093099507 1 5832646808982356100421897617636132310442902453819250590441275618883817813112 5731352115976923656838396504754294283489320030004725812914276610784666050855 1 1541546630612668571456366814665448196088470792917457704352383812553271461334 3711373690120721173266807119575688971719547418169358209030832359616057717823 1 437599361121568393249191066452374645804276541057299596107616724287310858016 5921283472081160827845197494821899992080243480391628580687919736452496501994 0 5945945572369017224607983809693478080288168073992661727596016843376857255716 1224955992137782546939445223252019337797346955692713123139180543828015801303 0 5276159628495022014798622668437799888286502278250299915994559994111775784933 1968439424042732452169530520619085323873645557150927463235814961091770268106 1 2727206882123793933275435244996398849733757439739621795507660608103332481471 6223585642670366028897891208559798819634089715976718086297443075686592764523 0 5517092410693639187607724142245599130136848456048761921634121094461620380927 959811354467910133041112547152155923249022392849289637814029610751400385351 0 6251105421714808717340969741637791989674280359427229336518027239401122149690 3144253218099451854358241793697254282815157695281063128400865245792581919947 1 6640085835532061124625390618324627963746315050661987594745723326234314656526 6850324899277907660226346915852087935677879150895966262476662402102856931641 1 3976063325029524975622877518952453219247994073746486141672619081366988980223 1113371943430413296699004389601841184720691843086249613296135677815111482456 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 +6436522013693329254502785364190556524585966340141102949873635137497776126228 5319365221403312973495728065793088678498714368529498535346094808901500905517 4651277368967028737821051080508947507071309422861140077740746150890006473716 16232326110 16232506290 0 932716190929118700822902629839585023630388749799908378779249904311838956856 4777989406507804522909630625280097346033937966118763100347193030825398706777 0 5316497857088958516883901421429796219561630295895158595020154964348965262478 4979871282884982315540963818369036330314145511918378083556991745875012237763 1 6389513111354219442675644590737903556002177240936069335095312159015096424860 5421492002240263533477662994810854403523420549888186407572953798023828710015 0 5416129385477338194054810487547106250852252958424101596220949459121917107417 6187288915404625528295442651599778871943370226696759984305451185374621301122 1 236375648502598209684532196680932925682995993817141313968552549781852135715 4169770484346120244869916847527587433670317873198469596278591152872688737951 0 6526861266449365124428810510025966707447900867944415869482775202155171162202 3226825957004417518452037706189433879446117576313253749367844068677955890524 1 342539787755191741852543056229807255448832424747537765466671271633462965017 2187325071632464467181407967444574224564206416987803221876227322575758042716 1 1344933474715108363867304558965999666668113552494215226756051517921666449094 4518916107407658264884911747840471348341707043826713890283578027134454319552 1 3893600142064471604135980938764337390932371267959512460191826894128338989590 5310616901356084005843924058376370027433479326317120382694927963295818826322 1 1093079782114326818800348784254929366562140552339551626007917276169255238764 6090519853249702349001485330504085873028407870329592176769707795728091046852 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 +6151407227228329731312053142538777233938357609190790742667312134152480349380 3510859221913506272046204365612395854380712301952742386759599537109495271670 1380287690378099933649740875502340903876802807398122999802916962921661353199 5815325935 5815433781 0 5690822467181912431039974646708277448098365412596070936152272230541645829128 88052934509040261646873734201219196184792209240566085662090911284663523276 1 4199455840973905536807332936984134971656864243737075097054114980339768180764 762666184663314839912425962592994442764519612187757007839135619081470407073 1 2372795620237808620089184197964235972447563278871035941794692510067589333169 2302725618784851741425317570948432030844324170432591717019790892384615329771 0 3986272264139091721516436459498023319200041052452965403375527250259356063650 5093159549338781065888640553047463150028219398054929146121335486418305125523 0 3471029142340832035802054562948607419012047931503467136918931656352303669049 3526166220379173948287543468351553721679653529943844804793404824155996814003 0 3321278274820355749018264595040469359433453492627028307759352784609920758989 4068729751435877162887772652759760329550818780938004719251727701281713014883 1 5254458116807396321059801865377542199325161145855102227791941520733178251267 3849296741243100339879572483418233564395735032297130972560500305571427677346 0 2296024423664321734671725825462218425279216765705187317872770781922601281009 3149422738033636093893781999450893302284401583250963532213789802972164281839 1 3685250294519138267860428537589560510387140256157943508821567832777914784867 6137445733895271964837671118722735186786966390678375880590431527753194521220 0 3076786232287804102183556561085553877277464802985252636634275181200184267867 313418966586446215556428039029293876634878690248082182196533848701027738383 1 3250861499575446200442699978463416618314404568354464301131424232337406036498 3018219833708828297178387991016366590439906245275337674767751160764653482908 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 1 1 1 +966193750885898645032125550828856568070358009916022878427302412104737357771 1744881836684951075880630203732111391999138460760745602323758687965811306694 6147017995462848116143939837451018749337849679827238812640875408335621295657 16461234735 16461416181 0 3879769862381156126934933381425813247822229404922844074820079306095883268738 7129136695408689220827661389472623823036985050390895664522630341837938804822 1 3319510892816477835087156183751558203400882221472422318977692320060643435824 1379656182927804865537693420898060019664340934444922281199802598886650261024 1 5253053398032682529958996636007219305775932843641146929315151646356376893843 6356134771319148606006444193630882789325874567359038015764797700493555126098 0 4384569222770874154985860540649614495069366946449450153536273629004311131804 2660772602591329969733634400031264319595005851407912283960801870032763927191 0 5944180832410658380132021570910081339142911422423728655724736496999685038202 5562800787435549992574428838530524311110415661893712068378529423922962168072 0 5763851477836306333411332514652699731672638015850503992564756198430382911710 6905397879520407306693655015938130122041065857331384630982348777917153989707 1 2332540419082057443108106423237039326966661220429018927522600669601315284487 3783253377840637665448312155065638334895792064043352853814054285137247328255 1 2040822697205351620622003009740902582236364119676432357453893093212591375133 4251373053226676877075333849867734629001126662761204138943628611723762569128 0 5706262227400302313395315359700399134788994742442204447425855544889071318152 5194003754007053782605040693965079702244322258182853202937587572571178835782 0 1766983774319982538600085636406692394694835417776844993895437335316310691366 5031134736876143765230304764782835119075519793510179399098740988373563036740 1 3325021630354190836285984265800406667986861885564279001699864295199764353483 1870433000871466856397944323773107563848753775537272521376243096540394864684 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 +6164314741625258073393538305391011332020684547779667768515895899222675501297 2231827971242272098979372121069546727712212778674624151734237386713925908912 5579009843447371645574580127437346604514597123984263847477503429337732969426 7170210876 7170330628 0 6530035566349333309897650301948547793110594567493271162748723344850850382817 5369809302089541899240735672462186078967975419897442672351355556921565376405 0 427119950081355965781116914736203843473572814573929883167042018859633131557 1476069275327959293189193424166466763965396540215395442628558549107389387701 0 6307744169269217379331193271843713431938432696534986292562109379474331524131 5002335101918299580215163843906666406499862770441623130714426071386628736544 1 6407574896743525810512043868236361808517025041743552353551694915156720393611 5317648055329190483142243057515413503565073868860278831867303136158202153857 0 4320008965190266238712897316786105740299145677089732758145367669674042705410 4727538881368949067721650324443729716147693750655319914813325350159871466373 0 35114624992060299274645168557220702684375424574730184432435708121811292733 5778839030941810165236872755708405017097866647619421509390126540070019851177 1 2366445087227179679808889175752633356335365832028791219774640814281787091696 463959523393247151276232153186493895333814930319739542255633824146506325790 1 2881786397212324315223348412879379431990498686913585711351580182833370464404 310546165530047723450948953632178133601560125277582485713439392126990817349 1 6680576927182879843086488608609165485558436715217841732040570922451868670149 733912157228784322902951493726811261672108372241640427175491524465378296876 1 7003894589534395762681049531775636955021662755820306596341599343263313411118 3474093253113743770059626242497672595538454936428383200214129934876520031506 0 5079554475346507411631462413621762452614165394502350399180063273238487654291 4703909745922243062309481051040782488352901933462613492871889538981575427918 0 4379424283483138265732844645154998778751200870866000061636433748450323310511 4173440702232328189935005719912420990960224603483207292652624932636777784188 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 +4440525948761606014481360839575348561339503178293179861145706051654629236249 3605532904085360506011035084387250216373081435398839526088681945211381053841 6812145362475232435318962603284828709478080744440460751534746843369448633378 18890334378 18890528751 1 3669590718454736110485815180147274980651310215583560756447889348650395819913 3925925058071923374354220441055259003041456485768365669613002045290767938048 0 5026823939653185783089712156010589439676714726759607839554725892630939322678 1041327329764543768685446418953579831416018711012494937020249136925740125225 1 5791764265774962346367098278400857751513956346338940135608546431905802074949 1823360742530849240023426263370574320415232343947680310201766435467183128867 0 40418281379656808056705209854486402296377521465435570023350239997290683984 744427530971061160318357642424647301251660027528323509369882005268811206033 0 5794133171289146699982475689817588835789664418975548089433094788592163503755 7007117877612287455586010271904197067767429222926867218245113025837640787334 0 1066327017214240454304641976657247335217321292513625712602230905960551039728 602597428046727128141255960487203690095720489892380791556386899140030487555 1 2647832967900873321472057143843584183100099732612985392900295450102606670200 230544264768175180460119122938651925449570602274575983668476233050306209291 0 1233598637186887590908827312365591305111957558329244779150364160153426940780 1481369695944409064405249715185503858222650943192547429731829151018984120378 1 6893109057174132536169722393895887040750144942110826991332896016761069751583 2067312158177659594941023119824974375921667986916060024879688077323366917471 1 6347392118863839397231865417660956951633293950861701528243027170985620424735 1564125276356779490497109983755252251624048808713919264306195307280510878231 1 6658557435443307130360334825186573514563774078079767322789728803460625817820 5863048430670548032860007034704226053292197497726694428072910252112463311620 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 +342043057616114054277604098117266650879715231288706739603992398126593066504 3353076907114458321944132339553235632973532246091046598866752138046433874813 3254305722105566256752093532925824428974943756976623426457628562360194700875 6222091681 6222203235 0 5330175701567329884165915322052802405213067373352447190828512198853405897367 6753431826280461792028019094397715317384415912383433578540821794582238759253 1 2966336089745456940698977645419273213893805229691871752588244918623302979612 5802980464243550874787715335837498778711793103111689642413657761613059482631 0 631451331709153560881461285344288474338095122079816240088462265091484038358 2428606375217704072249732306954587073713185960841703540540057052370995533527 0 2508051396066741050207348804712644183438245450652757596110222441788059127558 6184069496446249623436443346039669091984360122828952514815216366380499627011 0 4312117071420400923372025029112341789302928253891660789640177044242296320481 1509905884713655679855490057147998425783449217426363031002712913026060111921 0 6783381769877660392282542603218724275003685634811811498999625039550336320659 3552232750514984566097110162273475958196098304337588575228711771802071818762 1 3277471444030676070016417630603374403444715620501213129505076744743402822868 2008286387256972694325056045332776935718146689126117405551675566068947772190 1 6537595608021743575333576628386408873802179860243911448230094787371492229718 2560481012507929935681745525713194110925953729920722757648801410634869484791 1 6190713307848801454066860936015521351177227215171274661266402850841796137536 3195491493796569017122357238916050343678114725919808722398210873621828852749 1 3114660823868070790040178624214267552057128245596137368003047008838858679199 6323402686526795992155666879374837112180688248015737092409711161827825798887 0 238832790677433003107571023094556285750803686940162488129549679169730048516 2023952078570061013283087806581250421699245522995436261514128563120031085742 0 4363874635593451988562759074909756991275518645475971781208192251458420266066 3630811629581125647155793592111209320529071053924093493187731932603780049360 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 +4206526130653199757401815850954383339967408657607612051104145698296447796368 5367011191036993580668916111028343334827878511237098102983560935435740618409 938332933662629189902078237939467632151712114733451666112782517510332381869 14600414403 14600585286 1 3731321065965367647688142447849625783366679518496510483139306944844819170146 2752988870602071677883002980683638786646344178500811956950629095366421998190 1 3377669449682486118224997233556513016942824215525462332454299745651253276747 6579605531462024282780641069270816794829677295136488496987965180104192342845 0 4172794385040823398305892956601575463376870622202935201033301136312488492055 2906814895011553784496372964209065962310082299504785441834035031150162512269 0 2627910603302859340581628213272505564550237016550654253047388682279550698821 4096922930542278250088047823643183090947197164395253023522723568747092115100 0 1470763451605551391161296596880333033956777207031709942581559003654512789229 851199827426667148493985142841225139264833167021296307356551410180272078118 0 1974540352032415903561859993926651860126526790101582355553830688515700876403 6955533527205841373325183123762481442622948224298604332054568158563503691741 0 3441836397240824256377696445866452112724534376323900767728284942147424690619 3566786819442054790602936686803641827133116040707523348596911929950531099913 1 6850827491908178832427193323394050871916741921476566773229730584883471458102 345506711711436574719941873836974779870671070234307957989071517545966970798 1 5016093411643849442066851793467229686348225334209412796866479055994377107452 765124079612942674298547703917863367540862161913714977751696404244679757737 1 5020907922782540877688875184404933788510299892428482630631833280099076343908 4025632305331797986685904417807501148878467468939865942501002768631553995425 0 439367202956703470817600031452446475976884204005893166450530171088590995400 1476537284409277259504580249161885502701731421187019633553789737095801687089 1 1009897218477658096454947727932521950747890918221706135326221365168217389952 4430058592968905257121640646172580644409167911276943297064514442960563374049 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1 1 +4819131015265573307415525822404666286486808879025255466556590501222719336318 117528063270547945490128819619463453642492749082005708393191520527962212982 2209702118898095264205965135553323017217715111381496062337644131511954937490 3381585441 3381667680 1 1639089832868075879892644744723996422438056864939415035091686755307077014035 558064478896070853027942405538502583638349848352990835621284961145673596623 1 4609786264664880227580403873921284056188585973245465352714276757939743757839 4105320503802829941002858918205392956811820634624907422217524863566933987113 1 3171018975514659372061410248674481546692807209220430106057711990117545289468 6096544349181248693384427634373901664787538246857804217068774388417652875283 1 893459661329229725840443855996816912036456127125480442786929643751798213161 2280720655852427082448686349548284823322149856744889342854007844667732981792 1 5005384901185052644864916830967280188045846355593437962881987738456007690980 1673398300711711960036534101784102051495344743789378448263943225904484582974 1 6892419705857442871792658923375279452501030534206102726278378775834613910648 3262998079660254610513653284237846458970095088243102721904784449795290822091 0 4063700689335234700903193148307042216490494547623643249640998343944861931143 2903557484629705750082129879956097484528699486543633986667007222601033000960 0 1448194904088476490755682494374960473036611049312201395147947148658104292513 709096545263467980681905510242186822656251670152993226148475887544371661936 1 3914570103627056334294472268333809203031151946565209749951467670937087312547 520721429376746593930067171151099937246938358455216103089752904474376966428 0 2558148855220920067006845609458243732565247140466083833115446874069371747570 1805781388521075420230298832670331687202068273587444517710369741373121127035 0 5339599540966572208404735131460409459909016617139994042734307833367594922998 4918746698209415980365663909456157567576362410325477851762380013536270332275 0 6038409313188205470842370820311709824940400480178276867274580262473222759672 3844677783525627446231379560612454246446929379098714676834434294800995372176 0 6254660218184047799058844752312631541515721604599321052200410875955328119413 6668904853337501950893853431410192202277738315069756455363051220285845715069 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 +594294953036246244500197649426417083196275282164551118137736674492439766092 518390848571393252837185546164744290283638992539620142958287430326428496038 7014279221092715592641367772128038731650492026214122721974270242314635048001 6534931326 6535045650 0 2451685182460735158603755813818695936140635715001686254002312891245563613641 3222721279314751537452656877758389244181553063145309013140530250398090127946 0 6076840547487915373236127816416406889952530879453907006171578602073322796094 1339144323651658420628883725774675229480874618705199680018247670641136403013 1 1219206167123027344801781965958866545850244232254757834128651337066358854201 3656101789064999243163974483034191386624323107490546227512316812942268289048 0 6906422388861056254733203416136321954753439877790084159943484512159783550334 6112180606490628268706188621654606122446786919235936624826105850341350905205 1 6223753049870908067260059329801703747359430046535834602684213903134532597445 5536003669282171181160044900870830103556464243707750634370180362781993427577 0 2232698395557698191746708199287262738721872351739515581480352176810406435540 5568254248400992482984361414723720601314527577433121115808107767362858950305 0 1918508118442089515381781365155066069609152077743315032327824234307204332421 1284081072197743836844339786034414226771060537411997307033226310891901529368 1 2677714787129875522197457414209557206262842871459775622301199745643956075369 2922945438045750171525139776156272071743821284771426919068708135693470507757 0 5968986483467637336333969664241195671657389045503842711245883355000259116582 2267059546244672088196688095948185043987297558188885070420883065846819336579 1 1550419860106391247515633718878016256952359414268669686493757105270373498310 7135314474095419930759092163070282622229090646416793950112287780538965449557 1 4561341452739725819463877940349380408398963023250969639610724868410547803083 42440011846289944409838055908733217944169337782085191666598589165178733332 1 1547793094312671368173265901804466758719573607158479981158767673387412231268 3726644860254875431250106643859847470794846015856272283112089807762551639896 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 +3922621028581601917349373044199784764700445446114361976997223090583909402640 4003178345490484286614644039755422452740094649563093330380779720536314238140 3343852870041966806038137704069569630517926163647091216352897245263867830279 6170660686 6170771778 0 2495537082022419756130014587374862623700862273016417149703898091762326763006 2729161846036023923144365608044427849267426486166666082851176897772453366129 0 5472276047007560458664750391151632410768544414989400394728991727417519567636 2572884008923290281892249071449688975637278501600531281787999818045074380734 1 1495403400671904780630381914463341864752129590681920964781641126350963546276 6559030992253572036274627381917035591366453242290773085777016893268254207489 0 1308676691052981937287856048885997359785584114946680340177750281419164532953 5701352443575535864961143277274848740514438242524377362876809609475828554425 1 5038415605784575272513428933930063397173101210417613126582231803590657727544 4204379303691516105104252860977310231278751368814971947850137878528096049160 1 817039371399434477953557768687609014274174327633721709474184398141423179874 5575920623630426527691617362634244729322643837359840358804374003131453275089 1 411545149704327528749843669365111065479475030657498060368047707915989438539 1807982578508218106333989542999290023515862988306361645581228297386769148609 1 1369703977299108958217412054292917381126249546217701064666490494649405973114 2018096984362564787241929274955064219081261770121211182925328912656655897506 1 5438391433969082086173560311487745423827919578431416011491028519233509645899 2776162340093381062749472790302830604691797553704018869544400667332997969947 0 6776320337927421379517900139137353262335521634858277665429804715554173619689 7016294680448693944923416017532401167678706502927510732393227567806702645371 0 238832790677433003107571023094556285750803686940162488129549679169730048516 2023952078570061013283087806581250421699245522995436261514128563120031085742 0 4363874635593451988562759074909756991275518645475971781208192251458420266066 3630811629581125647155793592111209320529071053924093493187731932603780049360 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 +1733417066971333809921436350738398749438648846671082460120033594563273665632 2841640912464344186831183524563398387108589546964104205182227265208965730345 2249426842466327849755552787392243348351446004769936914308033667564181729773 9056224653 9056359236 1 426998995542417020994882428643598111205708811171192428127129098235407200727 2460815428927737814117467835867517266327293510592074185689207499650547323021 1 3334682157754458573067368697146826200376055077069112696599613150078503001399 5437998672596612297526733680994166899830448451880046056385821671776398008094 1 4965424197935785386120091042903830872828804403776565426684447850760058494146 3959216280062279429019206500172348657217517733224006785338386528931857284844 0 2897091795312038647921534280550926468078206699864091024536270954605211171289 2427268410422521438179684315147447131243268897924214959531987440712791013839 1 1050902846898234008382532968763194120985425732259862581666053466554208456328 275405915174978328253724155717644919598195276338931654252361079664883242556 1 5262326675699347845209745074119381530605555845043629490366241684211782500145 5543926990611059650492185691010941264669865616897143623967725985862916208083 0 2246205073701700950211482467346819126197481217698686598329516961971298348396 4739583815311602168765229137508723352060831711268388975115664522202593095113 1 6055848603305205471545249831697220864066933034479307099228013892483083803029 5073821802400333091284302595734861907758544918819269893735852115796850665709 1 6246884483547227985251884909563247857029305898771295096948852706893671155549 2952939831010052012785473019291322320654975280341331710145877762905219438637 0 2809686552137753374245594107969807639908537830149467070641701282654304186684 132399833081666494755171134837238092592777034851767856135918722971021007052 1 352306719177219528179854600465739376499135804543172972373793697246339809221 374486968578388123586008650382712606498227776601181801672816435762195607167 1 6273576054011717192053617782560869896396116262990123891413061385751767028354 6586243115516158698651062044712450728893624071734887464901594244820480543046 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 +1637385091433510789514529178675362191844931113799547718271189726770675926617 1091153164994246702578070951213529897322260200436546386861259578500025492341 5777909153516749936253278649040953817908284895897358585221209791232318854337 2481988740 2482059196 0 5378433465271076808149916722918855982441372021800654692779214755673805419203 4744142155407108591037064341125690455628864708816239375310214605365504421959 0 2241167741888641483080962614817241539944963545389851368226853083081054890954 5144852698999719866712156934578488017216549725914857027293094712611734230455 0 452358057610775321931165439215768924530661005531180902858279550730419657275 5763838237148961807730175559415289749027348774308904168865769193102186806348 1 3316529932150926598097090564140616822597049075606466314786471356085432194706 4556039632692917079244752117257037705286414375811707240730566770013830696814 1 7123529965534300875414158014369152898771076116775290316114392358306710489724 5554558202885614086208912882150009798531515605257018104707865295480102865880 1 538779292390387919023130184829529730954548325810405333536529361075640602004 2262829740485062654549354229071772886285805911136034714798596093481370578452 0 3587488977092329354289984637284932030005598513090624550467872458298489086652 4446853816425286863915369902564437302005021568564143967401205196644040557399 0 5933459148121494535546192133155454442206242924782734256381864370436173421884 6335084952363439942008862690019502897348633203863472283652330301981926877615 1 4431649451803952667194732910558499259551162471712342391498072824155134129701 3140462213957713369148892635017277539707585985694229161907910203508568733797 1 4842263274904724868949155523693514959763914003345022246235183585052270464192 1167362800409222132027838254410206486225955744142904403337598563073138267295 0 4089188019155609490088524747965570617501930480011479516333969276679069327884 1800825559301242074273390219220504553821699272365727236164460042510151247995 0 3854860011887986920552117268169130645325333998597746940348331068263446906222 3103702833354020505316110971784943836479369939521094582470017476745681073823 1 3064489714147401051771637799124794076933080801222245362116309119322078940923 6725389185856588445336912285771460928111555844311124253257595692860400792151 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 +606462398697491326903327665417707941943948567775472210291723915354994420019 5780019096733082304125471800002969953138452315868332038372938950933083074119 1995661148456756946506935896941713460493725396191145102088348230167238913533 13358686785 13358850240 1 2588957462395901329629455128956534433529716301687128504116757602864808815412 4916309542773858878148961632085174180137102798552055665364002205267223276048 1 925767200759285970875901418248706587495201670224389043853021380238534540144 2390868596131441125194162261507460517734388191230765307739012179154274180408 1 2043555524306744933945756431988268127709886574874116544338306850514588398175 1656522588635803940713700521876431802976537103991666976119152203984353017170 1 1749549391847591531526153984300815173677517940717629848133273118062600606205 5323929554349842310012789363633042149276172847308990797908925504704799837000 1 5755190314719422234221591449902557868428451238604471341561984176466438662307 6226766340021433096771072272620669998352337059592102158070090022483709611587 1 4938273224563719884644567137981245423965473167654447680701015930086313972683 502846876067373883675200498611698650025829059594508260020934126282665604666 1 3769865149139892095663140981945839264424014975462788130801813138651643587922 4659444775170785434229369493355110536076989608429834016895449997518783057646 0 5485651343969149722271051841921276919462306493513852565781688258865189826145 5128114370814593187385079466930558262651912049075703950788795883726133379469 0 4895056060907142149210453777045773034569584509346859439106204346628125966159 2408938191151297696561282775517803610291486200992729801683150801859097104466 1 3205742416682377059424221978795841334440699444572388010251756750735021746222 2942730098057274211230907824698513067327034744348194025444107515674880916669 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 +5378392928343687416802707301586245003388510392637997323414878080205311634494 365070989530760330404599358566146944706476404935947298956631760777318696837 1152425057107030573316705564142254553338422984608411982124511443078402375076 1924201630 1924263666 0 1938700439249171872446759719812809481687788426757589866690402578426947376100 446941742347141511080641550293944908161810572008372314246162212657189339471 0 3030202116099421900712762884879448522510164577290720451957116275182895602151 5944409854296735755041907956690943297510517153191456913513532995528986181769 1 3972880501320609494307653045727057833632451467007587033739776750335470761106 6031025573114745204384744409350094862683067887254406292117014669982379949680 0 5036479730280921493338757900843383271339347321055638257077275454864931437421 3742521762279950195273630601017856594260364525932309043276413831792754597255 1 2155043914948389671341397563382791739802273175868659175499809871228957326646 1481049877250301978568335206092355647361568120676282144037951218761666005404 0 6180534527232462074516837405818963603752936172878424002912421567396707064756 3649091334771476274130842176471637202586736800470529466771521527853836586326 1 6981617075472715992006395545325949293817577581994606462393639394283705716252 4351537861074033993421552834215729370058853035553275575498852344295176267766 0 464073266882087429609467029371567121567846268781447105220986228406947903490 6356280106576580584719885668201438663413560332327373758234484932513415331008 0 6059497410248767636887175673295835610021962186124551824058839340626533163488 4735387884073948548969320984370775942199940159190669785238999442953966536434 1 6360792660359952407575372679788501694338988074524531219808229767760320497675 6730241175603565522985809272538863008567297968762410552197761108336583731988 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 +3405489700809484284578003376506322904477709489387555081448760901162757438041 3685676034628463561618615344286941009387729344797912159695711363891051929139 7217641849488435579403605382510392673282258755922498462361449654260033452231 16481926020 16482107580 0 311921285860460780669217416827011834336836113997769122866689556088896705388 5602035642457487660986573449464122662586047728273761478507712138915615194744 0 6814489318818263773092934201855526439106873190483354341933005765554555634668 1439028106105228055782835990025026021841376910441425415415654045481801675292 0 269963941684887343146298772481235950660612588220604945177658357626384913186 46821001899097243576202917198902928732298727277277885555453215876552146201 1 669596951626561209583909186196117558884792499595319698442947044098641323201 3012609761434191268235357994937821331195312938814410109874997119642668204909 1 2286684506102070151045270247020797894175766244281561758978850831085166379552 1685284258132565348741411795241854405647456098485094739834415305983983088563 1 5463022043631955838357631367284085437640296175598798408022645113572987012503 3166757673931609718803736942037895339145368655777399446688951715700208993886 0 3524714570494575195479568558508239736827629210276630052263514268398043168258 3900197148795408678144297379796795764821440646612418973914952218305766880256 0 3817480618017947750923523789198137060398403322012014966922634129617639872856 1662168454748693728199293703878316523360735822781163266050021509220926866311 1 6920096147895048541499798413792035016102840428400978990741536155268290886300 1702300584272029605403100548333599508124326582917958266285757143687060374098 0 1766983774319982538600085636406692394694835417776844993895437335316310691366 5031134736876143765230304764782835119075519793510179399098740988373563036740 1 3325021630354190836285984265800406667986861885564279001699864295199764353483 1870433000871466856397944323773107563848753775537272521376243096540394864684 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 +2425552360979201844957539997148270741741565761888094911528941850018101411170 6381406429962475354542128751750507756461722257392796772346402663358916835123 538915452532077587027942668198721469986808278573487302669234171847846277305 3985593121 3985682403 0 1711109162417338158523808091194328075660415940372393335365583574440224165957 2063901113923648359004892393748601966773156310064076452337342150937876482033 1 1655461842914661377667048378600155608111485047963615909736660821844632475374 1114965056923649294919991422853025012136849988176172404247797154780806475663 0 203804540866311135064205279338212785488211332743751434283257211104012805516 6706031475813837683174220384460919549330050743076986446496235882609581648721 0 4598943085517448807759317558543139874574103667354247312909567690593252159969 5215894347634286493486789422147894097233791736737339907268420568980130727339 0 3142977292451311947858479145372084725987259738146915184237636622313345537479 2423778277510368665104684644067700641759443342226611416311116361044422267599 0 4126798044035845674138749248863883596570217171597409769193084297132982707291 4796623894039142020497064192813290130590762102442769486270417335010006700377 1 7166374358725703865622907129848474984061590205926933953868960863041972498525 4947919836241457958037148985366082157691424053718132803965561698321535721276 1 25297665135911740570996684650620417473235130076916601688757184936773657763 4156659076756868879617139876339596654616115379018725902334666658316813090827 0 4986356674111049948779137840743196051444065422512008637808170406342373848263 2802798540281278085560780372943969047971945362438669916375961089728537455323 0 4206507282990491790014239395968945836450693792431286002188348661809679709261 66484074042019532452851800599934017070545732312239477503352665182564285761 1 1161473644202234724455933210846459163243840000136923412528235549650552207033 4542344473499941190634087226575210218566348939315009409670124856461980031843 1 541596440182749729507605899907080836226798805270994949986395352141562811890 1850130621800864455516877955586591764578106767303447021439320925141695232081 1 163640069797425613178011720592509129691551258434111466205497872043906326105 3115600098334398370817251574903370372248321068970469017442560378076288064858 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 1 1 +144874322475718161120346512621314189786808624749626723453503628861686884667 7072300273824162011155576711250346095484317444706376888452554569835068817995 3029348501878707734425040343158568722031919086346855034873356444653781041843 6449924253 6450037831 0 2972742727234153570125430357902694806139005939355058498243277916669190991915 893911634780199027698059504722485964978194601587331155381457767685348380966 1 2863299401717969350894208194264243171818743068535350024400124649500875230308 5900025478685853345791742449577264881082825480568906243656661654550953965471 0 5097555974886596359206641925369181444342617996248870982750361911125834582040 4876149099791646174785673488087452034399908293258446662105162430517244777551 1 3902712869707953250484827180476909867431198410548292015020750606717857572171 6846188764191726737466736323962649803179979735660350785897873475790101407727 0 3079685185800268947249244596265705066424261709765939714178506069863535647004 45540253532274827386938926614083470498643073038764874155449017946462119414 1 1533271692542718826411616365209385212187315593697729988758152405498885475652 6361135262191740096844343509778054198668554071711422229142510426493898547637 0 192377547071014275147214900668080501796215134929305923075263768715093987471 6224333702972539693212913577302425141441860247050021671544748287404755901699 1 7005082415811059402693649808610331121253606345374383751181689039452943722751 3570501333242935322644726536974307456765283583154722729113901138547947833481 1 5820844813700150582357470355083518172302165640811412261038212051094672475046 1978550332516610926721058234687772077434252155413225122145403708996666649482 1 1728043938179959378974558094235405087043797483173109486916683130911570315159 2502719624033084431398154527596347289028032073508195659308880505014782798566 0 5311650929457286644427268309549507457741486432048607427480749465090361023070 7017005242856882006086444753322140383897656664985494697997541209230771381286 1 1547793094312671368173265901804466758719573607158479981158767673387412231268 3726644860254875431250106643859847470794846015856272283112089807762551639896 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 +2972499324605303790411522452511171153049528808399439338470918620631668854950 4841452681340676694530481190773048389852210476719555296529287823420685439550 5715116029486296517985935607023806419711972669852435377937360264707876493926 1055264770 1055310711 1 1813204860750017448303762728127850995385322600338452766182610473474537766164 1411694959353570100893856326675240156759869117696868173309085472979233718070 0 912113256090305606980007662805724165459326367494372577375057717452975449575 3074128705747387644905341721894534720765717046167439517846092101447309767560 1 4159234535524611898216031448112657332835827488882159237177135698178655108600 3259529956783097838473625197453743097709606681631896532467477541785365195353 0 6921501031917316590602279443840117147396000273825594419753446379397381674035 2163962649495422379901423933755914518752316953457743687763080463729401818293 1 6518967716195526239535412876240092099922540044510226748144287797110833305521 6911160234285652679652103735867461423595506634484779606752406204789560097881 1 332330008451906559549572889034192217220841655621074906449297336865988560457 3954954754216973778796562652117036507508009640168297908480706382277266931291 1 5478315231075342952811159726442333468491556656354602202667650147102949157008 3756935409915021520414934599089436373950222362596427959452123266604788632416 0 3527534574195467958103930969535751782127897212714203504160550110851501831265 1902806061081492289918062517207850618351957146806435104648215335008674123354 1 5553519818309640420608090531408264567705161555996408586998006323181041876242 471747835952977852885656347831872188580462395688578152683244623934384021014 1 2727206882123793933275435244996398849733757439739621795507660608103332481471 6223585642670366028897891208559798819634089715976718086297443075686592764523 0 5517092410693639187607724142245599130136848456048761921634121094461620380927 959811354467910133041112547152155923249022392849289637814029610751400385351 0 6251105421714808717340969741637791989674280359427229336518027239401122149690 3144253218099451854358241793697254282815157695281063128400865245792581919947 1 6640085835532061124625390618324627963746315050661987594745723326234314656526 6850324899277907660226346915852087935677879150895966262476662402102856931641 1 3976063325029524975622877518952453219247994073746486141672619081366988980223 1113371943430413296699004389601841184720691843086249613296135677815111482456 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 +901760757107359036107313787889279873097718624059618154742476949775171855068 1411054669930673561934592081518053657690782402877144551986935075663379848861 19044505106005340979345472908112013392105388338089445112494502025247633415 7604219503 7604342826 1 3101457692014337990872680248327388214143646666606903962661410545124027667576 6921026514015889744666371240517998061362604073992127639602449266699077208401 1 2169521448917887934148044164153983215854300644005374230127034431370516543185 5063186822636666967721918122633310804017022313363297783574492379249351184110 0 430229190036660227031811883965842836174313265917844510062640676925091707833 2837418963895132988902469688330017529103481492836392119949110021094588516692 1 5809526099960985628643716027833618589631996092952573907732393320480863769911 5684529775441548642125740303178997194070249365285254686438108227289273812345 1 6422957638524735438616213362998376046746417538207870849843082278179861490608 6387367823133272748591853915055070879132332290420016709160230918581787773321 1 4359281388292227406236579385655456256942292462669702083284288748049902588366 6770866793080045906736237050540651163490188544085870340462107452084600770970 0 4249547174606107549137018985667934478810470770265840552416786979350606175215 1208028753504286700488079642247937258108709038271701419665800752708999579980 1 310247369641768659918459932867649980698570385228804622040064806068124317755 356904511685366009305446023421114019655673741595434806590633818070351369469 1 688684194044607283527613029902923967452884709833192839529495349318824083978 1824150884673891613187607360766987777589757641171522816031932036465713488986 0 4627799373689648529772568335296198196210797845699879108193454838710223592052 3587206716163335874991497974273009566345694515160982476214677597636888920328 0 4846866227244643571790397454977175023998023589552966423969057600443812874451 4990012081555674655942045755262033315226141660133035405819289678910235583602 0 2248335123033686100370389040556822958181283766618888230977602598982922694770 6606796359263912948284777494441332609322143633539417346570600596797568145563 0 258703955954202736603435064550252515743583642500042967661110500285521204030 1943121978191481054463506213536973761124324300009761972280220028756931832708 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 +7094099920360156126138523459870393950555275871799062942575511255964791322632 2042727026909490252776458236406168251682239520032485810414960646550781247535 3496707148274836520569164087260263317899676179346183768684814763857702054688 6040488741 6040598655 0 4637675639514561276594622435119536260507532628846760303802698683377081221411 2722927304474885806260010775217500349410911673961908412635253590817407288443 1 832924264680248760899084072044795646361300403941746691063176834868283490405 7172981144070894380392369127305359689547317002937446009727889019026519714893 0 76144847000938376690033085265677844231878836948486491859461307376369514282 6283118371744404191393390218813230809592285482744353802887866753728188234087 1 3654951938630080288774516691182478181940835477051132031457133911018090215816 5829952216194426062569425102841525826646291471867514579667471857450986125063 1 1093238076378024015123422781783107548549535893563987569141148526049982615034 5492984920244915680060706295183793785808124157156564310955104826508356183864 0 3914892518818150727157867755802898045421936677952040437518605798398883125032 3083549970928732970855298217653791340370425168577465105947030574006722732510 1 4313294892184932518241319303504215764333001692312267723780081406984569616037 1128410497368833385129057503199389361998196320851070813800638823793640060780 0 4671871908178213970504610827953962680579150334732304393602492736883420522666 771039137090999210523734362931375489850643927070391069739361917845146019219 1 844010319955996191265566098162315816859082831265541623377770639978098453498 2091319020081909025892951331178333063488140582584716135669538748674761139760 0 496091875206180452974861986709901251311307693042367809593737394143558535497 2167390994182747334774685928416831330411201080643116837539545633560076755314 1 4942148588316098329271493897206913789625714805492387801705210294138482912600 4620957965619409540111023851915954426354517867366476101394349202734744240178 1 1233945745847570275184894084510632027854257490624103522711035544902574201288 539577981112935813135740225241076023951806995537255673993954189732961205925 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 +4620514354392114592915960528339770566728674610572861891414617847407977265113 3129338335141252772424001952933908328509211620305618788504839329027546531581 5019162191489245349284506733548781812413791034916626248683590653602096718385 12512591721 12512749915 0 1819715293783106287220264291251639460416198757379009954125820051923674289791 40253269792564058139745839963743890965226061099264134095056756009000370505 1 1703491326861453899855837275232621575837156896865628070257784276628200506356 4126282512989816079901642562147812618219348642569671600166948644826256815782 0 6778889929231253566236558780013873121336752078628150987808245214177038969644 3357326111527611750181222091782421286917213565008832941741902537019788549216 0 6829408280527345046814937607293074222652640593197607600986062628782188014675 4585346214936470814852391807628699115935622951547653131620302849479976658695 1 5425161244881689855197647399660081736482958073485257391259476427577855166529 4641212648355938617628824069824033916258852441502685149464098695704250420310 1 2575884055240205274013957070740578399331266069483985637992162004874602948447 387884800902301386631659971876415152207518384208296595624921548190273813680 1 1543640190582142772903226844880341834801624256685801304757613192648991464446 3346778488361473732563449536512892376356714164801167236428841200507748049209 1 1242540098305616545157447270316766394012813650933888790057371329622242924218 5962792348966802681100549238278377865229792032940284168071969967497021724520 1 3052305775135289803215255807713421703611539131341920697352312138427544355195 6509207472985213633286836701524756647487625658767164798484862396984924985497 0 1194698593755967492117579224723772930579417122782498605336410570245014029324 3160212002189670614660598583979803763413039131735471604531121967715650392515 0 3604089377878314800526564657630753119882007204816571821912269317264117645187 7175462941426119557740656598510396487327094522200134795931511645101450919958 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 1 +951212243173418086741607686829854319245548901685144922002106467418696742523 2980399954945367505331055652052022054203024144533507028580471941672481199433 5608558331906962246029935954948893002441575926644991100591907926782713223176 10870972426 10871119878 0 3867983103838798381294860812821247855506537589849166285387548947650869081158 3116512516430293260915519373585919308062420971761732775828633648101448773251 0 5226696424376178280139780295297179615284526862321132446941136904658942506537 3389150114950742647820984384322607487379598318044882255233833746406128356208 1 2801507154978726425372074775982972766538993664189544017779885418522970139638 1756951885890334697824236247329074187563233077288249174567152123697224329546 1 6503264468529704558722052288725391089667714763742478897219884234845034080664 1661482995431139275634396172982587868489267590577543403916187610027525692565 1 315935545671753520626569457134196194579051017604024222364659393085755867869 3210790813030165140999365547726312909623724983507000254215043814561526470944 1 3415462043588865975282712760648231705457048757660870001667047918228886667722 4007656257731721383683295099316261977833518825341726509472931251174059559384 1 5438318926061485007872061359393130398056727685700752986438661925794737748458 4192109037884848735027992885043898813328640844674258534189456481334275756477 1 3127093019425928467450886605616370381302828161124070577531463192311008426439 842338629133909160419375156766349431669322951014043712117182152927508332563 1 3902825007188796778658183080657926248204186319563655892465553527843157999572 4779735573110020373329980775813575136396987181523984951355105754296580643768 1 3317886153594774951748904270048753517833244936315814799299367914424560133479 5941308968268163776969309828057838373349929642650310968768607487823441099708 1 4836510169821396285881859285453020657408360400380042114742068308393516400268 2890916201886136596887205143064417296593818930481230602825479012791554336640 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 +2226642056406332180099529476474349702947321913293815581903751431597301013338 318127440427110954295024621399637918089676144582901115733233328393538720668 1982813968382335341725037535809174838721596717267143097031179290360716466991 12961546521 12961707528 1 4544208669582703892125222871217341610947402291782906780877855436791675151335 4467480439647110982043766487467756264387949959153460002459863564005526793553 1 6326113362518456860457278185240279948695620703810190813561749445805828581376 6752851290274136702722316482845683817720253542900115791040740192054236347580 1 180439314195216949029235240194179836991271681174201443303540286679582374338 1690695713340659463210606489037097054252407517198581933687377902724053924040 1 4430801705957365789455765186363670097998476682369106767505134898637192753457 300731755887239167062918058954239574271493489342663363273864087160810028501 0 5571504070658946435275455277545959554530429632441895123508448459229297215892 5042323532795529901291768858623678401431766974964514916107255582792665085220 1 4729782212783810159941882756774341348027101022071270042258623045552845666827 974866288432569663892106879711072727423657929038967014750234136160994361534 1 2462673537911836114648515956007790603528107329859159133398454378710529900633 2513307844623541565779172083531932572708321931417197930569485168945910770375 1 3671656124000042631106688877367925529883709529261639811272012475555694607438 2769168264284805915828784519322723354060982404401926627269580806453756497909 0 2425518415620507149810488357548600832522234921261315758671339536159815843095 4591138913782920527259761963443653172872420667327436956600539580627143852506 0 3170879851466275349657212441515498070250681011479397535149392808398887154328 183590928309114103433213509611357330380597129789348066752198799514522544106 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 +698754417013444857111465485627990792939108765562906511917074340651390792584 1809967583965062981338825880976822352673784629811970125848084699303262785274 2489841455794399138074986482175021657554370362509256086561568501361822895806 19598535153 19598733136 1 2291465809668504416713783645645029031337264120132326010426984443544734951850 5417132828148808761747393200591021842621552791552324066850910258611131727832 1 6478886204163595352772655041043636323135705658550671130411761289486845667980 62442703615699825283161071673540695293051267222755386382981374241097504367 1 4189592578083324487911970840795246998543618586608793642115850581563628630794 1058771466008275284725338822205966356538489440239052448851027107419316960906 1 4601315098944901206129932385886896865460820211696262663189479287427715212121 4182907862188353903429317991889739780427177887607111078531238906142379591542 1 3863264801063498238850771708355987161015482604306997785463980297964376980831 1768392551070743576206301187478962347231647642656227952796269124824747713968 0 2479102374318872503937807169694294061963627613386221290479932036325282596040 931975420440797821419568343535446190658687775952315621509748843827451073590 1 5492507184207704312595094994648672845310131439272491649321807932932964638091 3760442597798834963411617651933521813150897476270567555890766790919500499741 0 6295292003519219154647109469950961131952940783154346557915204578875155912062 2815827157113588204661417486412361422957633438802354487256322005739956776213 1 6103493440316137408474290634724502266177805673943822839250969320065813900888 3669644230453190723697333501119068214253738775464575066411950141276137925688 0 3263357142581932916681542629176101033397555219429250039503432750975932467040 5592207029660183081685813224902088465170117491427678443881425092998332896598 1 4253011638262720864230830152432576534084943460126541901499139599100510590368 1146857979276675086792626062165035579639717702662139747044312345445575373132 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 +3214655522110319280939111384074464953284676604529490713542238557503928069160 2369818190018591083335712797705870982938591969173612830571157659805290997010 1614983726834539260626461149978747320002693308826330993054093830055356165205 17969245525 17969435100 1 5173591113159372701233235683741947111620510957281910904226543530024897286547 2951261482097845696739053869458790309963007158158346083532588040373376135510 1 5312546607107844433683339319055101617476279113492202673758631011843860052400 7226627093249196639825689934588214406938376761695955126424625056429414628825 1 588355555212385604345310045372789040540348878390050755778386015042749727905 1491337158550375821347792697878009705149778877108368237709581595015519361149 0 6280287219619057020147881882832360703140559498170375223040110268676987021033 4289803753455718230692957619146077803679684671261543391897399981369342132431 0 2711359250760485796084434555955697946554138325601022847914340698141688723788 1496724408581751808850347977884990861544691383049650637193218111301501958504 0 3533605055361223654274613791299669320476200622772116054749845388793208994053 2577985727698372288509986641569687260463941614995879132361538050169167484128 0 1061999022939541360350427719316620546111320674501553447950276628227570071723 2361487561560103134933532175424862229093446402925088917747743584222593354069 1 3660456267596237380133144455100157498891924273460387575886016022735546397842 3894084129439318717034311013878820710158283125968244162924796994893005930009 0 2359785513943929696629861284649806840377678218365788280512853178118838362163 3672121882835334164364850030900978949492229236766273506373258459734102092704 0 669608232809139885617428483431464783744943623528736829516785605161077658455 605030135366023986548814018823815530651797722522681654757943741694121463392 1 610961996683823342847432748670245229189931288994431473943849894029693974179 4679155937159915780538742102958970404823744339356982847472512204638530081570 0 4954118771740069233454180021476303045945454933874228549215641901157120813807 1218159010811368834065923421831385722366744274385747812130026718286965530524 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1 +2398408753842220173812017635492339037663599712968985837678071410984139326150 6655572169167068799402988500257100695302388637025229921107746882568517824137 5678213583055460902004949550632081303753025016908209911039389377745265429619 3000296916 3000374380 0 3460419986989803611878700718348552923392474620176246347760730651938217439870 2094808169642524480462765533965870026216098216005250586279566083093949611643 0 202350518312347282362739794841819419982539273558110196469594360871579853900 7110868136185101199910980252943566653183948115025027139426315144630140756833 0 272090773326009750601397745024188626831974514621734968816119807167884250242 3185695446774607024617040383921703273860937198581473086057723818531571181690 1 474118828760778853288021774349005348601907278271328028398471593106842735833 4482972386539688896720496730765714573623450142622870197649304741882658343202 1 4855434704650540956503113568250854711996154028692718354014607510949832315535 2068507583554454470539974855032433929556308022488390864929260050687654562427 0 1292915427287816850037808215698395227551663058319576787248791168528385113370 5818250498419277838622017756012920863785749516008374304479905019108628738048 0 2206874844760603627769119650429337297648843549905917674574654227985630104538 7228276044484616023017599385349760455144815631814570776618514751704539880001 1 4035230749195119329755546043151482423708909836820854903507169481722796102354 5006385476489586842999395195392687529145472463836650706563156385929086323083 0 6846828272872613849897460172292935807156809690684398285703420563105818078973 4581244489549969014506464205009592307873076613326963990056597527152202902550 1 4246521488289201373696754505714850145621472561724898239005398925420087511238 4946195890547324281427883357262971397924995612579989436261224354446714720318 1 1379245291240718618278549568017194888453210078327534222236150103383884189542 6386479525296938434536031710151564467873043190473819171196262427172291116440 1 636337017767903855521004994847573827015111012817337782774242594198209162816 887321707190165518761724205170388431391094422979710052592902565626708472233 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 +5769549796705393208330370603799955653620553460941751351189419043655162978628 6802591591363293135637063138940819046707801562484085407075738949755679256454 5349260880416277342900817573274311996129372273310678096294000724592678144963 16068418278 16068597546 0 5537897363646065835041650776996622411777211795029989202692701872914700156547 1169263088460867333488299502226705783460634674628656757498522923138481909062 0 6725950123380877425939762779917466802322961557193468882269606779300585912701 5642265821643273853160396584202434911910407636652108506386210848841695956640 1 5468129235382102382053110247459298443423170009027220139827974070284597362288 2068468455550251248656541904506499161595855271860446765004333497862755732979 0 1217161407637158855235118543241947949980379262619222633975176067972858140276 411359537718872041041436165370394699359365629674454370317554196618797849521 0 6021412798840332038249362516244743497845284651040818536896292832363313648792 2124984754609388251095654115747862429261774148603607432385622797450086190510 0 299609587933297899199501956816018902371093974897215045211321797724179248046 2875927452420677940019236176313465953629240163595708247494485620084866384065 1 2220018529235486036367687364392356176139119848827097357460472548034736383975 4919619972093897072703482470325260378186003038104992606700079403030949008941 0 3750835918730539022381562158368085252239006953548757687980319873641871802675 600993611628591424691654918185003770727904635292862817381662775017574891491 0 5571180788995832134794512096974306718757993744549027482356497203363094019428 6132731344520913409945175005109985495325101139169332069840450614660463081272 0 4043030641376911757975320002186167937504175355974738000774897683843899880077 5477764214142626071383428564901054709922189769512371686491328703204413757355 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 +5810125673217125792363812630850380812151141329144733657234868957560377165859 4877663849736777168101727097341679876460790488462893309830016165534446143522 4109010247688258797682239064632038859051128144915990181859196765327050511485 12662531091 12662690230 1 2141763455987090165564029861069243486954324665454451056781260815668025023981 4667077789161809218714966685117986911985417443816525936109998406226033470083 1 3816271293952134006008882133971712807849938852498541327997124155317728604680 239930650543903154104049352462213547389854666551107118826670859177183112311 0 4847350183791773299078582101108067607999102938423864782413063602397432420494 1311939138231629769372878592472680842364291036125070451944923357630574573631 0 1959004670557122184126986165317773979085397889622972997720061109657071304456 4710552339929467777894967333601945511125331081396839713082895953737776841937 0 4438730630577463764264247273737393620014953353395211208636794053774261027872 2527541199750666483006884996426799395490568677369395386260287281433705055507 1 134512091579560000541241295120512347432789943648053915045577037232909821746 2458723728109701109545818944001137453430964737388927838863305572766497227020 0 4432548565936804163898154217707699007534482891793839831817294984696159304748 2258585262949779691160847015249020278743006918755125341659017893999948032209 1 2744480400264938128741662742742221420791364283650029219399595564605923003295 6369441512839070167700745526635950155891740391523941252197649143800556619219 1 5850296666900631876532415647248219819115358638681954172247242151598923483977 5560643872982077388283101650168445270217554577899151565719900360520265738546 0 1644787583906885269580911154752696083381307029259109225106733202967397256522 3690820264000078446882500806060434174371396681200946813410094154400287155021 1 4347079024998122594000938178502818784315403395376759754779862439595699117989 5276358379354419603974632142426691382250808038426993488024330904882809068115 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 +1264056670639243915580008018589193079891388501247357066140297762279522307349 1308851632129693197713849567370039341699337274517756668188321936702513452028 4081408470835529389098556745730438377513562700047426584839623815217529022800 8811214875 8811347625 0 6044138840010423154961212536156060103356800296458725462878654348333703933886 4714224892527024686790267216166013462106446102392908924940725133264247944570 1 5634371704377825472897995310657185087315626027507489281438899748316947621536 4891448291149031917999713018324964915822236774018723048037889904969103237361 1 6804559076418069071114060623602567650393924365546787875448969971681829950295 5156223520314751458232022279324151456065937561249163107023358318664157382458 1 4432585320131397756579472610455448445525017754406635880089816832992113382970 847197634173434244589316828964261802974403958142846948292528594256864721668 0 7214965772371330271447865959401292672523069577377058353006438717248816190765 887015358172002982081895139532134172011113484931569999881668193739634741638 0 7219110015526315531718703229182878272978602571835204900848423778450971588799 5817176820873179298072622383523312018937713541274094569357145183927510040556 0 6688404354680860347284179269287124549580211640079696416857127613685133305281 3404256198858084967502912711051092942232371367918559632451413402183634785203 1 643791969176856562057768800193189334535440023710895857752389126479438086656 330375579117298327224845884607923154629500932157170930140393257644303425080 0 964150421300840458848323838213888782784173883850988773588796421096156098512 2210394216109655264191636012860118767265675117445254129242733380176122380551 1 5471681759435721715341134876697159248039571361174484465409354091019761301024 3199610424437744702897078713083200370559725550142069180340472964972557156630 1 5043434271442595219882935230029895649830610020993085721887281369496274526647 1503003800291769776685960053342407595504002989328997345789781149072565254038 0 3790932392259131961951115069875460035009643894512899896239240576907281049733 2951407388846313073360856896463645596589930749098100555720685900368744433548 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 +4522718044753365963492737580119033260345501242548022175124550676670045133624 5298637147043744660979155495647833729152056170396167471115751333138106856309 5980984045812882871851428228134362401740753591620338016193081055712769933409 19410508965 19410705996 1 2061194300851284439943756114790713501925398080953972745109254608577018111836 3413692924334985127748972167566875566743953183386334092073716702867135653755 1 2175212220805537377605675189203581581209214365292577457741425173523560856462 6197609727739601273877295707554816281668085505980652980430073268699806025667 1 5515198382768134605134684307383435419367479927090775728126839876307426488934 224268758431674718174590742433648113089449205050861636939920942190740909516 0 5508293092110281373305120545440268062025512869474508978608273438757300362553 4352470460612029726982462009769491496477207120065090153125360956986488549484 0 625361582930532635935239629067950129166729884149812564952843138532509364087 5121155122632582131659757961933637673047914228742643545172873898313494034109 1 1711845923666833880705197090622321370495913248302820293714143803751198071329 1698925172573356374856949201218997508540545261604716278862630977379645280822 0 708548782245402245641945589740639152514227693037516924925463660399076743806 935911734507412320167418415147108828046464296077899436723276328079311980667 1 5429415686307311270147240043338962576209574733577425660637414701924870760248 2009231959581826407638621251579336059148480691866888693602272314936394049880 1 4348093844299038281854805368898514852054097269725334517359718799252301734026 2483250113097733014034397613356665520789528219060100021899045875323324646040 0 2279539054807321286918951830972129208646965096060254060761009798848182048020 2906976226273835321822962388886863490001429887440915660596006489098107207962 0 5372166020782619486546870817607249352545108557166605349412432096463215567092 1719660978613684693719625499968436195940950763687678134837977068788906423135 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 +3930946481372330374902530778655193109288627266556260719090403689115205880026 6931756814904834121544077286291912074336112728758492229064251213876703823780 4299941634757593606293325601822635261225206211313347033431334219736970087055 5728406166 5728513203 1 5904718384726062555754885856000012142519075119023298989182606696858087280625 4092826550863013978657995250890951048169709486391534809377364215224487246609 0 704922858035013112408157874227665689842120165533308540256172624987053065765 1627439723751882969609837928646750197590082832065374560181453924577523946235 1 4879436680581755348167117636019168610646574141585520226305624793821311044693 6277818759889280350564197148498172495702658786731574553967556024362447742221 1 6430890040937024938871556818606410746151038804829725071964655790066236425224 488522112745674533957613367848258054546696222282859437010119210785133040799 1 3620091161683319843539409141318267706275099199891408401401380881622013226454 63676238113679549036574036039492624325399368823616112621549947810737177169 0 6989656866559995521307740735834687149877482501427174883212277237262373447647 1189110036282857658941112897630613246487050626544605701894709264309333291304 0 2458289100490210695399266191703599518449353738499038676580345793859838160448 625001119143200117987337735566298838549628775183984795132674460460372374970 0 4241951174868657174752456284867728044300613295087109806245862414141903376943 2569103607808686435193251620405635879262464979918391529729775691095042710564 0 440762013614083864702690325576740568868073824040830364972813993209590855904 7135518748396379962292564427877680506833089739685135727171246196322620241956 1 985810401081073983330013099760338873796265029844676803612342709256841550144 4473752583062219851802710356245416141451458613415297651507569172740686312314 0 2480945456196614330103532521953201989881252061956788637201872865988558651559 39083459107935642933375151291211598966667982631753820829079052597598380191 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 +6748102018287467144189300975460303976241232371415366681268617176713375470183 6845960823117590736042987582951565080119640935927149724938704334663696674968 225650922801784461441549135931607363587940888891924713933418937317688207235 11815303503 11815457226 1 415915295082784177090180365483286590299857337352954738296616186716274783445 2225675334088164393942427695303015780921035628321358471773228598933079538112 1 3009063134106593098910912952552320647038573987874550000223850935930383904135 5381836131763843023948639712584683596195338969032692067544360842801085201790 0 4241303422977352214142690558514824892208374844752511402507516654177831970263 721067630235753257761956165688193248567381568654140134535166573994019660377 1 6584950762019442603796026825587030331644842648653780468845313769692005183171 4299022135112663660649495260020624771705539820477053205077837075266164744795 1 6658564535545540100424463105206713067485048544532161130519326057403891730079 3090184175878590419750484464484374349286987309783461921439506774216029056602 1 4280462284564433718090892062148512245489950432524065471893959605464069148004 5721548937105094948007223571422096553224249002779547192307350715620259629893 1 2222592930562307541642635160375645185362436993729449200896107649964462407028 5107490734511032676350772087783947268013101900283746682527909851287972918385 0 5305950520405071207223494951004668338208849423003948261886175969072485625935 3285171839182356528148290745847920752869487707855975222096476827902596141094 0 1329495086621733535409600604089037803963001916646418065913785731807801736471 7151686246339419825986675119117126630709637458476397613810836611725878235064 0 91366484984068252262622425804969450083611204782420108204346869193517997520 2553465105673099990379803357958649864350710603346619825344773666356363905436 0 5564771526012641957494770172621925851699449343243385205105611583776544959155 3945673304698421363017125804461371394991696600840263480917981332569836489084 1 2835714461887112860579122266911052165801125498332061002036384376439068451528 824008201791352696808249169822774607430191604048020118734283749836730801056 1 6305321104429254115180202893886991358890524221980844740462586986036083382297 4740173989599199443966106285580870214678765488296985411344428121063784464341 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 +2447578254299427308244151582333056523007812849154080274967349950589370229294 3989176963722518837595375423983575208511084799606052168873640299604765943635 3425413222465932369707173103929363985106196825388166746513386508808268847938 12691192221 12691351540 1 6729783239142674161090314831940919808516875066942746976143402463865936659107 2586140701149110414812308178114312399339114558380875748122486465727979568627 1 5531916213113028226286078951115210990980704007007051355372567857153042853270 3247082130617435941924836965809575993372582259617756952225250424844089800725 1 3188694856058121689076281209083241003100661384397062928750232277113393716258 3891164487974049605246256758418528690478005375174651341549471246433948695924 0 4283705496461622548452663344031461120868720154989399722136793327728536644116 5848895837605209423765356457004119895740396197087447877574039210898344511965 1 3006456617237855208903011025135410012027485133972613451239782069677454190484 1999637441350598970452805605519750593834772840790898189394264808812864642907 0 271741015919188734260772412142747265926568422591277722888748290290738438264 6734795755018026867093983507800612168682233082252093552939024029481083165535 1 4333185265122218967067253634721988955340889372204883645996841767163674128912 4485019976820710127590755561378654873557860619327674576388995495231063327970 0 96926376298631809621851733364839521733810775870521461570911933174423247375 804287571264056461962444757315738863249753020161796407720013525667051126374 0 7065803066267445547754760547690087925102569283862098052660413832984839667279 1946276378422205152139705969444725740344071326429473675480488105207774876702 1 3808493106599020657913602528079724614265536674338685593595628297658413229014 5916897301629512136120490727366774878519276152201714434953963102370405912389 1 4347079024998122594000938178502818784315403395376759754779862439595699117989 5276358379354419603974632142426691382250808038426993488024330904882809068115 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 +2463700814342973183396509865982512678239334017069515147842572775661303523838 4699821490171905612376284880705943995914886991117393475834717058407825645999 5864298996580026572839425209137322116509861525819190918845502594919475587575 6045875703 6045985666 1 472056529747691954993486877109743610666838980577597956199062635356392677369 6516956992486486558982424377935879929688694358197067970897735671919413808107 1 3032793554019509177694362309372640375280593941898768094035916585975699796946 1353247781628907275024594221605628098174839667737112704248785407527447910294 0 5710397087643181005265799654475730162284209924094107820362517715813235299278 1120272234983431452047789000491824894339625191082197717117052133441760320467 1 286935573525057935121808296482504058484311976918561734795500130375964994840 5019775041512522803413419908376272375433131906695672570930973946369743646919 0 1404164033061280542121704090928454487733777499849256151952795593879850444041 1368670659694231634877504655945255443679619881883793090737139920631512470755 0 4616989270576460403586964328579235058924980039097862185712818370320016092660 1612990631653788543347501286825125645213604226327042971565330786810672416890 0 3773202667371766255689045644883867594901051803571781639667944704122294223550 1487074840448876166036254054321085733688045614002146887674881354027595127279 1 2745456605245063222709623213278029021918850828994492366835670974091154046489 5988840126173985340599282871418880501294642067180114016629445939871476359821 1 844010319955996191265566098162315816859082831265541623377770639978098453498 2091319020081909025892951331178333063488140582584716135669538748674761139760 0 496091875206180452974861986709901251311307693042367809593737394143558535497 2167390994182747334774685928416831330411201080643116837539545633560076755314 1 4942148588316098329271493897206913789625714805492387801705210294138482912600 4620957965619409540111023851915954426354517867366476101394349202734744240178 1 1233945745847570275184894084510632027854257490624103522711035544902574201288 539577981112935813135740225241076023951806995537255673993954189732961205925 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 +1926639749704992931696944487200968973869187517694848502406058472015143885328 5913225623732398246643889396165888888458316709090096859124467474278270034547 6247017744256406897419904740967617136315491077603431122567002391501850462507 6436869453 6436982916 1 334663041793738816685430317876546828001706468225599904800487973584925627783 4966321547933432328945847846769699434594382978585038719185586822679078963596 1 4132278715056390344943313205078135615051569667016498344035165737543207721506 868164690563678523105272249337690329462054024708832299369847212223831859109 1 2727014665428786442533242131989684989767248003194749184991018174205864656905 5196756836098360718857535257961000238530879135032520415460909701199729552302 0 6949371405566309944886767577867441556157279369504754393108221518931798919744 297132870163502083362384052852968544532886972051945148035700561594714375173 1 581236494265257540640919562666503591048100083745447659657211885343730866098 5460842218772073924953109605887950858926885663479436193149271044226855119327 1 3925674924470668635149530531196112218931479158440426800837999955558871434056 5099212453294893713871398707193401071983886841659394184175110708372532806808 0 6373121323167813207375812985807893814415376340657172362390583808591561868865 4994365811072713601340816660574265506548694733307638493091429718334463439948 0 672987886653666991012840745614864407916559223092461934314418634930945667225 5891477110256576129500396691113966704551171972411453666797251851318586932495 1 5820844813700150582357470355083518172302165640811412261038212051094672475046 1978550332516610926721058234687772077434252155413225122145403708996666649482 1 1728043938179959378974558094235405087043797483173109486916683130911570315159 2502719624033084431398154527596347289028032073508195659308880505014782798566 0 5311650929457286644427268309549507457741486432048607427480749465090361023070 7017005242856882006086444753322140383897656664985494697997541209230771381286 1 1547793094312671368173265901804466758719573607158479981158767673387412231268 3726644860254875431250106643859847470794846015856272283112089807762551639896 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 +994710843602743427363033586428539266711525073179842980096619815331652289711 1724066164982647051903418834763401804007515637062844762041074249942015911629 1222554929322277544072941424884917408158836815327694916248038208890343970148 12566910916 12567069453 1 820175044402609673966173744796051397582514155234228678399156553317769193 3790036769271128259030501691049598111867026198641148544170014613159708311950 0 6568371298893699960030118625271944924897829285161290511879543750149746803746 237548301086324598236915546455551657060166803328209283585804237353285295359 0 1770512935109025285266117017263560845736178637703877811677668006541362610250 6397375880569675636303063892950664196161240276756792116333937404210703468048 1 6234049458681814111935869610643227760957793787532573285206002819400594497235 2557530067855621333727153870817332899585792139537073526330941745008767382019 0 4643275718172028445748092916783791424881422062153366581281431948609682163737 153049566372995673070928326328524517695292593272537920388736439831724618319 0 3553418967159371891231629252408184137529950019018441481875425114874190771625 6789415929362547689920582463932079244843663310447337862413135676019367820972 1 5924518483705734293738503748986071732532390342946616544025882612511405182757 186567956855465011233378384569308847243574699097888246850555618752898996817 0 7107692481677245842110322607109453941736860674690769678977082898966519506426 2635526383216203338319775771460899262352610301545763563935740425527463870237 1 6031715997930419507552511890136560701966422904305034582974631016944915837199 5327163814099554095567290679860026023882889830012235883045105984002351078339 1 1023843397826412790639822803208890483300229417852438008618062632722777495397 5822205507874438119231471620233984459686507656787810944592294071928939913779 0 3604089377878314800526564657630753119882007204816571821912269317264117645187 7175462941426119557740656598510396487327094522200134795931511645101450919958 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 +1100668438306109952506443012312319285549759545598161962048444014092992449135 6662116384622304285121744200480938618889141180067558574703511784681970567557 5912447059807138198594294735286356877565251858414833684986943571342951822622 11455908661 11456060028 1 2400930153606334113368426806054975410322876478689383000304603152877372088657 5186194794392595134819214553588338382285490857837741899069456545698464771875 1 926037995237997010062515965567697017816337080945064844806674388269717548242 3649596642922358858525763879794290471045690288953370697609874641679256402607 1 601639890195413815227086405131255789486169667074675736627470726270969659938 3625533715868531650512568842243156771009946598994886517943563131693275215415 0 2866479030999286618178458865120597134374627544661573260939378879744044780580 2639758397307997739041493345354364887940227002240223546574274970248411084170 0 4027504524653484087342593904362632112298774855484747602821710063114983890746 7216172327837310799880253684999752970269218914979262612998605059754838928967 0 3391689486791940291858655687717813568020195118989038083558312909335705508225 5531410229439108973040683065164541503930554956809375836964064485012800951861 1 2399591486616219380774176645300370791135440770042843762699266632167386634763 1645687116141675979780152263772691962093804562695736744244449196089155963960 0 2164924680611517441961618341305577798478319075491576588355108666075198695855 4247916261138421527135117755562478545917468783486701416333583348432226123619 1 3992807277100322975545309440601228259745261152542750464432096510293822904942 1360445192512417059160125250438321910500071475094007796700358097732599199369 1 446450820728140407840482338990701806106377175580739513565592804661811101873 4584776691912595339770281881310509200924613489298450704604508904508117643197 1 1099657098322510201084875510828779527761256258938235615051052653695232303245 5799872061386098756571929304697188123249686927002328074778869891117251841968 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 0 +5676352129657384827948811829280608581360541626959129404272600644406948684144 520534567886482768942312521262837494900770959110993254768501336835466566253 1845212133544058062628838357379468866882155919208685147685079914776667847095 14113092021 14113260028 1 1543822219513472309699366836051706733617094837727985112747792411271479953376 2720214397656092022466371991761557541358440827012048971233263260977795227397 1 591313088725942212327299718646202209139287451703626078362794157111252732392 3889416297954448900466424999069284676442122573940163390127193162680996435764 1 448552233734401070935393473111010753926041885181664129845354380388744733852 545378444846997347285865940412102848149369881258268716988616861551590554458 0 6651010883580094854997187501903768101030742538933753608910319345297944663563 4870721870993280935313079378740941959364856550836990638858848851799824505925 0 3293163950375388340636857016415900018683773694457971917465127729807050496390 3130404403480142819238131980065489537428244467374653169391079759221455652029 0 217105189314789424430932480018982947094107304421717938459062068491341404315 6360134118363718142136224550388982982023877487884428689812549208207618510030 1 4134682655412132681528295614230301007451843462929750687252858656013611176203 6822946074287628822537231688711462136172761641534077201666574635782054128032 0 1807992002463553373409598880050001358392630507851774207767940286064097850926 7053550330568915989978570197846794742392836146592314772154050579591352259517 0 3088147049588914549582601729249517541954937349260018743332226182230456028858 4145626031844484482158680636520263301234756401331550885486147432473937745575 0 1729957491185268797896748154672237538483211544219912781731057758714556879815 4917329768735328838822210743064451053467424893262562154443272653365801973393 0 4345107310558054843809254693302961622686968829047970913676630930654713822278 4906263539489666044992124169220034516684643707604345812081476855587328358505 0 4146711549669107800420400725667138277685886026808096122496422698645696975173 1859597067610819320209456124366767882989255050838696794789402341679318293046 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 +341828313389215175980344308501327306206351165972754251622680097133888565831 5058581152439787058540066945817069766231164073617936753475117848330441363716 2057075693845424578013883365233377182800048672081699547620222063657650347088 8767197153 8767329571 0 4820428790685878198690210651277976767962787647592699674073100752295010950074 5769462398394174046831025693925975588613141278074256255780828028089682544041 1 73174975549092618296554055478669349319492233770212438300497172336327343908 2325328015370882230393048509490653223921249429779042958847799800043729063294 0 2657596848272123877833745487619243943027886538742141915160259581410400343721 1714763597311992384694343580849407186821259172079900367905946713229066602610 0 7148125572882997698822008693991701172579174394733203968286072992421046167624 2086618121959633291847996877182402848799319785627382211954278169129161192531 0 3453456170110946404296508033835321848593821844030523167765731488155684420539 3869173239241749020641508751982142997860028603411918547036095433935405504274 0 4517201542128437682333599968190036019504615414097378281334212696652421159136 6212390378677614298841168072071966633451517611776692016974845320733764246272 1 6027389418522817347491615917751271098492953736171373656499377255981233236232 6908758173318409542332776917628604355579525192995791245971176813454945357315 0 3160167862159971801249329433183830668666129017530620623472127182715472198168 2975837412876784235273081258216568947691493071739216072454978874370496908430 1 4502170923864570393878451573707983227160825865831701485407490721326905770458 3239283638913919925297088180636502404222068922962561575735291843371317818960 0 2774037210401438822482372410402287582677420022906589153037342068589716378038 4451560336279961328601084089974258632857435781997427337935251580891910691568 1 5043434271442595219882935230029895649830610020993085721887281369496274526647 1503003800291769776685960053342407595504002989328997345789781149072565254038 0 3790932392259131961951115069875460035009643894512899896239240576907281049733 2951407388846313073360856896463645596589930749098100555720685900368744433548 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 +6919798491755843659073090777675496471895424167306652759639710337948563728198 6816348134103763914444250149429867128351130571184797901353381873159188675724 2886763069269460562836783941080299736138312948271493251759905288067278535816 14595459231 14595630085 0 1211851017530604057526224363897882080700695460098659059216833607967263918038 3872242162085504304824110656595739803811896957761545050338025477457735117369 1 4656228293764566600687829333574523287554598936959549737847415219713259923360 6494690444839614991059322263872180735086896068888842852774618242260547706048 1 4313306835651836718481435878369541744213901019527527859891547803091484176314 5420532371841757342102428643124695371348474521874626330332072756812236782405 0 2536126715473720297177066178242968256777962604151800761506385995104314249291 2324184095072302795808778480021817047223066729963478878102769604309155712763 0 2370337667337926443021303183273644871872033780684886449530295758188628502490 4584213876870127198237014292127334392068729917765252626166469621105940673495 1 6053230109838490785210432753175221786583167474618079660491879166648882687722 4279814520385156083736172808830248154566138799882989302438068849645467153158 1 4160291490724019980988952618358443889317414096650189596411610936813385066663 6835390475034193092103906199538725201519391025195311442570219889610451733235 0 3229200383520078701189356817879005521513620168436095189366253510389410106869 2762130337191040393488575034864835589134628937877326996120950810896914905255 1 5016093411643849442066851793467229686348225334209412796866479055994377107452 765124079612942674298547703917863367540862161913714977751696404244679757737 1 5020907922782540877688875184404933788510299892428482630631833280099076343908 4025632305331797986685904417807501148878467468939865942501002768631553995425 0 439367202956703470817600031452446475976884204005893166450530171088590995400 1476537284409277259504580249161885502701731421187019633553789737095801687089 1 1009897218477658096454947727932521950747890918221706135326221365168217389952 4430058592968905257121640646172580644409167911276943297064514442960563374049 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 +4625680093171133824873929172930712948583641345667719440342358607444614915217 5300223931141654230384219010516750622022382426080600313046508756689354679102 5599400734185678787026758271237386447262711041298571705262392684036564666735 6911058528 6911176096 0 1138401346421568069268559858049326316247317557821052593165520366512756242511 6649729997840508666946307207514360653757502062676734216655853867002165401655 0 390867566344163233761174042741333257341643575612634141211964371563942806191 1594818607765607420035237123488437879996984191851554621258755430130833588518 0 4640144441347472616519826818489380466706020716460721422263092112106371455881 3160484391280171797425631143728006586478147302991059182116939491171078608269 0 5035367661274438128298805028070904153351728322525703108714819562409922657391 582564822253758086171576961154376392238029218851726482921234090709198054939 0 5104556436713745218639936771324380722551332647230449242648576596390135104549 3567175516365152078169208383708334977789284187543147832574700140697103185110 0 4157807827140209826422214967293026563181081674334620276442446738313096661462 4886018325465660686154505295047369844964147175094484376978977160928907318916 1 3729985657826108887434061729900495855083614105668020210152824741308625250724 7125538017459825119638550194582938796143367058702489861337693843107883557059 0 2555526393059750078038962610083509530721182230888685007243521936006481683611 1273291905410196859586786370339120911903054939499202387843017007840966026198 1 6222352875696548711613224221649351873429191693995802918095965432916633076332 6341923037196993641286249289233533648199654279149542354306158330518595676322 1 1024992048347257905920964509758533614320248044819810745414580678169687570660 3791418249899210886868186535745547177754942485783105803535881153905718665943 0 4892911685640918936507415812092628174906600733410473687651092234682149603333 5433191193400283830449270445939645756530875942930903471232483101077915067842 1 6979269453309009111069036018105677771463384075446857673924331315888505530952 6415190432501433395733658264573518065023765775625781104935817327833498905927 0 7155842912162336485845305523305565491772834783313129438718163644875917614053 4323979049682445725653339279525878673266906371560474718815605130743279777072 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 +3893779671741445588404962181937895414802740771224039914516320689486138610431 3837928217115093444928926184348317615400209548295317709689444066930894206999 652253450981085840627153482753997061429496472463213877320655722393101577897 11035111080 11035259641 1 4188086282702650235708945751492547201803919484216977169252087412100168902596 5373911442249879167042533147426831189855974600269706898192176227944454247414 0 6628288963944470007794578861288299994187548234553853306234161155637223419561 506962373427030089910982537117180056658714117716546039218494133589298282161 0 425087034722590862329110821912549787643102199851783757320837098256147840617 2332721759698132881862170663505674955515307075628552265025219490157311813244 0 3284097381824477465097968600365689134376913389210911796338443299816497907162 4261194466112333405446445667670125991568491185404277999783316556741299266421 1 6995185339180800031049111276457035167637984635827152071728191721320679064364 5630737476484879526567587052809837909708746990311159588090572301222217448434 0 3320981808625072957610383243157038655371029033036371772961865970614217056433 5214136852474981942561953206154407476426447601177509703299266656689119429623 1 6220473083198051481412796841460910204657392847574340300311749076267658223489 2002841075552184777451474559309085740782494372701769032200732566709259835863 0 4582187217213825242066036690412922817179509492963161904359808070651553639962 6310808792654654539974601841734613032889509248596352182560812382460782694211 0 1755068084797092527243537151648067578853054097598969642586683531676987692931 5154593176666053585730901223096448364709602580839547284063734894195790199864 0 4120616718385440383489558839941446903719894085148660659562446960509656751144 5429930306280754261452244557884296458504728939074762196846334218037242328405 1 760574354165914697019929212944973759981490294477375834649749428548232751231 1019919171966887781941268059692136971948020054216336434990468891788398597677 0 1759277341950091234763010138876873447220611226677543304993482159971276593253 5142211569424160080694845847506554059332738466735059394651191659234064092014 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 +6901792343447896145648244604248184958077354195005086313466747393463225632018 2038212979636644324305879267580480775211891019812781832357146096142399991581 5162468955933052450164482250658423119034278467500652272169576631195769317482 9111082555 9111217545 0 5230925476033060298742179833759975611286952364379997833976289530044055068425 5923038422057543053992953248923599956485448860227388436516126637505952634827 1 6493468213193150694318493207523051697090846278256834816014001606632432231119 6658869629946264833566391331181600726166761282960067510156336956421344466543 1 681130249783611960189501509499354535475024387095030885345640623175323081274 1878240572178826158123310667785308459662475291472966600819705638335424399631 1 4194889041675942130482659068519519981835840748683898285013456291166169895243 4387171133232620289246905760188331810496950471750633083165738443487407900758 0 4729071743692937390512922928927493763225901638084854864276432193236122826041 5331489420869916454475934119881329410900484054263649633261106085416347098535 0 1853703656238532801164655237159860154649521200050799646769248545249567970692 7214107375589942378985116374636738838667088454224011965691786775133504890627 1 1262475525243867640209335231862153043093044286978220746674877287086020750513 5810503362270671101470716622360918036483035260383060055714502120110447329382 0 4199666132871056898786623024718259109242541990920276527922300530364762232281 1905632178968733806179179223415260245163169135615201904612947744858618097580 1 6676797253131443799378580465401965331146064722671199117791417180889962214716 3924415422911909706410070641289165034534279756258561936947923786449853856542 1 1179659304308365716306355995362903727081756272485687731055774724421327872897 6241513116017526299698114764025428157854727513727536498452740077425311844700 1 352306719177219528179854600465739376499135804543172972373793697246339809221 374486968578388123586008650382712606498227776601181801672816435762195607167 1 6273576054011717192053617782560869896396116262990123891413061385751767028354 6586243115516158698651062044712450728893624071734887464901594244820480543046 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 +4609013112065101102280538765947152028924642948542250048356579361934699541910 6324100448927728386929033042040004630145596499706244400012447121417833568216 1791825754696483217992951145152173138635892755676549284619951062151848646725 9465160078 9465297666 0 5245998845680682706245551547379795128985597605721385902074468723539575521671 7193841126244836761752992203535063596263199000354448957587579911699935808568 0 477732392299512335091858964813635975475330612872781036122935679024486643605 7182352851364133340101371872827068189381739619378196288514265148181357721600 1 5551625188737111054453695142226871385314343751157849003332211174456611631414 6738508421360129114125277440941044172020446108245328938053242121471306595325 0 4417732337116001907265638209015370584518094413768873324653050371145173582221 1883233794992638774590903733780363281170078744915645725831786085001939635687 1 2389945006832047544275851715700023133917902994602018541402701599684169120622 519051018068547156426671046352154698011294900019281367036624560134722849691 1 3568626173699206172888884034984522772723310648875580341425868418764669821088 149025206147891356742562989640923458002980995544256605257843098197486345351 1 3571351352838944909210465898640954018367652305272197966440214129384230434287 4245108245610070145254957666015053459352400519292707522599857997956713801889 0 7168741777830499926565319031285412541112655757199114134370299974068305995456 1693205717882576390017851902117212801636890448534708388704614256618159701777 1 3984231011782273273422292383667973323789490697000854758937745500167990577658 7041078260958022478066878827635483929779307894225129481782089261793715605887 0 5263458285906402043281543031790274806724860596657903025337105568122449305467 882503965795724008190593015469267369069565389426552617740297755908925830233 0 617089256775311680987273662138783573489672709301091802846122274534552911898 1922922666489256159477459030286342163904263920192467486930160479429728549892 1 2375945960944027123296314725375768316418723511640484600859380970585628079877 4157080620591651842766990831012098333360382658255042299669089469445871162108 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 +956063286131780496041104252107756964597845477543095628227965094624045841895 5519713109750381348630611108330528828176226213584390108090876574426296748297 741157187526616871942409654287123932244899017094552378514846654254458904826 13013603785 13013765115 0 5303835183737158937693259584149364816859054258825797961768698633683758007704 2303980322137992862908449448176617991622139449674054910530337726263808873685 1 1120418950529963449288912437570118864339296730269501640055319131626824535400 4311252923313909806030159332064157063717564095404044811534020592643691667597 0 5024176503833032543612714166528275761714927209230083608525906210083653502499 6776427419850695345058338070420428799504390475034448364065325490891389705677 0 4412427241473814730307107488088480101989024320241620795825653121103729814244 4331169002504293707224705719513887480532087552568346968196796087858732686962 1 6110129854811694444858569508589935288149005803139916518122377258975520832313 4405264796667019336873592366335860593410403397801318085214242392710178847785 1 1492073512783526640128888816490645357776365390086864961966872876003912140946 6501638493788887028373059663153492713960368683832026795822654016820842417192 0 5405872577554554566420492967175688552683599592899048192115678743547823820019 567849616019704637470048892286724363445815190360423270625297916149868057139 0 589263050901298454981230196673811040098175128003297826681162550787816394309 7094559906859498618987564245938895406308825689735729543302085728042956846283 0 411373562121879096611411337269805140927451992377746461183476101577112876450 3007934315402179518601110350081582777752173448800224800482556413369860116239 1 3483223632234656011941594085496423002478555124901501516829842444993893601134 5005268568172935341720856150423338938769724579272343734235251078032840453684 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 +3660601335297277075808874576931757274484525372853138484310587427102421147963 4940141186032957758254051248983325036434259624910511733137143165944229455482 632824946105970253222126571744623681239375922583123711815114701239309270417 8112004251 8112131625 0 2462763827021297671612223959737422449670445255853717178647058249866197831307 2614371914566077086653307477077389342405381380004427706109380065455862664333 1 3204478066790363646353377067763519547148152965934587082091301012141346995929 2063509762872237479406255855119216792131023388613148834396825085163331449265 1 1378517221470597107963872193447401394260519327148636122733461465876538303059 2183124659782182170779896298744857744242770528712662511722227628060936994957 1 3465704960969703334134109096736355136377253171006634769618363592877157676595 2193373403793513057400601632457427986064045296829972651108398112011793326410 0 6967965420547568027623427788240397770772428300801646361047933348327251009080 6475356945169722315368228032293332122118555418956558195678835060645926118632 0 1540087184561472145668738127528308254846194057068414467120888321752169109667 5440785642738642560450771648261976161052840551015557314088806207138331628758 0 915653231456659946515194268378634890339399401928414200107221748172038540111 569363231313541636279806025260228201292508993003495135260697526266313068389 1 6208127146891438087745144420639917018079256780574044026964426662603827879970 930428019920149695429092178922186329877662683018434864246836559210464215378 1 1603383615091149860826050403665463087190715531276664780728143291460049744147 2120508310264895218039095225860334913762184266502406575198770843844224847663 0 948354180111501046233895938364843242189314018057220212571711415433616541994 7075747822188075086246742040682695038170421684716855710253252922298851818947 0 3515807377089906078912965128404170729869247982788025808173175188839865718040 2723812856406069514153128218862081225162269958719124427575477074063804059928 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 +1155023324506844678093047365753158583813506167259892959464631947863640814119 4405309256642171955539517075050274860545592573653198152158078071456355830088 6212683116965990643691535557357832040459393786661592037285698676130674308467 16939133830 16939317891 1 4011697439508896422956694872682260257728744639764652980910954035965533807049 3684938046843293318045392322047890342189914096119474827179524714399623358917 0 181378368222951762576423863568185170387773338283018677104217997198264608616 2625693656492498307246364138641330329722051701958319154329470918060662982959 1 516042356712891370328221171424383462745169658702738980662539076463145529987 3908275439982884284142878287294011262596512123912172260955464322265159136971 1 2741884783418806470377232800707309163549797711143733218523123113992399599389 7175867823936066027338096523704516148333652247824396786009954679365994539820 1 446218552797234400643996085999553981699860386819042514818065380372770284877 91887959352745282924317074510300908087328097265225905946074902448780406008 1 737244472008779141170967077350559518917433104402854588120856181312664883835 38067709119360192814366193823038073974975766990647658000134403028983107821 1 2049610144814366745800803549479538688482243130582273693885923905512954129703 2458986653910981737476883095877563712300307587398399294372313665096129739322 1 3907193427098541127309167302526898356135255901810054800090205135970415227669 3213305413659012455643572267244033300213719110022726516400937340220746970218 0 1213872069917019086903764379255393323677972579112005465983813415587968633242 2315265092263498549525265508046661204908883533579827256683231621482607004655 1 1390221405638395798609612498633692631850998839655161871969587157017612587673 3174959088822756802973902459408737155874723401190220229209928956783939202565 1 4617489889846964207493841454104369775506869647881798155792392687561910012348 1404930765557064173925016147744192656751176478236751515885561876516984132362 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 +5080924404614922397030062999617365951627868818426056550634208210196763168649 2810674508548072163925314390873296187314424119178593174746450216762119501775 4967745764483043118658528201705214671654237437383779836715632847632898051984 11540223003 11540374926 1 5347300127773534179390350752067990408882380755955558366108633770003016750375 5848891001325265431150831124627809014345051256266173991184982155859485002488 1 135333026755441371203979064168295610266338115319977750404422864854025357893 7068039385578585404696849855298657775187368011389521052269489854835197839851 0 1972759700291308463983156477226423618006679431431453044861011460888602341091 4756987696861416997168599736995619749216306235726534628660274898676555318288 0 6555114241960185281530167633848901089459741383716066953363955548468244555680 279929045635751312878965462216831584943211679618524105142309882811473441867 1 6501154961284704820984818615975976420436064134121789071549378326508786427738 5201606606945130954643700814668678568111694514563585034647869415243783731215 1 3271809438562743347720293435897100576738108267688742757025988395205850410062 5433270595725174184241836306635355955574725621842451152097865230545740231500 1 3611863356215450380715986682074691101954621953989835893883088735347773906436 4119680206896253869108037357465210862218466865884611397645151257720193537270 0 2945603354387564230625714698105425081520472578015473475668192622993812163975 3748346707693629287735879454425717435557589601670029677448816239206769951208 1 4603090699204473690327786111063881918695818490891510097891755042248871284510 4293223084591753407057838048835900557706342257928714105819237163153469709097 0 3922981961548903069590322041631134410254160191391749155207021921397754758735 814596657996524161710368929050259787363250295067908034071839468576337120198 0 897170372676896223795736683618042361722428094406904775251254483398791703058 3081665437407417897192675285339806855175578427510154574972008324128306222227 0 1396442217183954557838889159506186538650343154583789092461839170558229491837 4781962828986317806776532074758947524119811976130977036673406408383791636079 1 6305321104429254115180202893886991358890524221980844740462586986036083382297 4740173989599199443966106285580870214678765488296985411344428121063784464341 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 +6826496975769023668743650716903846279536102781108075816941690939257858055950 1011723756005997971474781769385513683580253163998511095918197749342869712433 6097890048713406227569095165625096425332449394074772153782929194215550159616 14910313641 14910486328 1 6187368020168828495684872390256743670986300725592880370128115787182145554825 2690389953061809713351548879891124934895107376309371089123556079790307190443 1 1482036842316935170339797831876304904122188136464081996859677173499808707785 938743399069168710002275965604592719039619313257112333796662350114376975855 1 6836526409903401807865816734300995181421258604822860005041497476389787439584 3778389296113342921336542402875762114026651894408099168282508842920315036955 1 4767354159193448963188302580865005580205261054776748845842147809086010428699 5458524756000197772831959852707661953166425161456556424057003516145519090965 0 85330720914470103704488599179086089261239987338796757215749820735309255661 4954702917251036406314319175580395730813870495557866256272577148758485752243 0 2150853478685459373950619818711717289674900521818089889271987975740309866954 3785851332368763679483982847085422087636599264344572036755273896794574137780 0 6266451069569404024468018644615445216524889773807480608326776815771242458403 223342602664051969784250890658495217880148651575669380329597208405528111423 1 6075318603718894819637400266103254471492137828075158147806672045809983244141 3382963624734540493496399701472070816320012840167079460134406095312654768699 0 4605248575731157617117378823688632800708481904680245679919852539222782879630 4673739478423532734122772259542815535439835040390638792256246989448415164388 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 +4072300146865151344902406321975018111806238844044304839120701166285043398880 3794097768019452294707186698199829144219794706561180802015543571294956637585 6923496489530799278041234349402874704420558736809350274920599091018466809990 4296227860 4296320556 0 6631981046409332856821175150125717065930248732732447418603240059390732174863 4311222745090810057607149952585317578626289818228868611922347739975772459096 0 3821689862115181285440190819641661616702590113063631473878765020480240312458 6030568839593339515740180454720253909187850074272046436383812821407313515281 0 145859685960074734973877805960895275434775664491688921028445307684195875201 4597055742513997609732827108468725095557097946932679233399825922166886507738 1 523742819239286235779077794444285155650109921421866914616067949203817323162 3348467468116487505042962990398260664048179855609714193351944125459437930277 1 7075729084810485074269381205532071431712221638985918604914986716878969750824 1147287447927162287163598591763229847355315467304521174242346055236556060202 0 5177048648175576539809766626043034417033183351799402160978090635616713048164 1864486389745367224018114388674409359937977156824467203203929916536485870691 0 160105999214472441135082132681254539066193423126661451533852515935365538125 6780435373158436938369580047706888252689447902542993066197623379700262470253 0 230505435235149769146010696515492872470039584803279269064167433355780207459 6518434468462062491583014927910538415596626907722102913024238981846194281782 0 7038745687726288309862612604287784425756790997237104032366779738841572554094 2713567427564772769802437904281274287151463848378647623037049794375212154809 1 5268913599231226420174676272603435184375589160176988631306052776891924013470 573619969269332393508571407873600663578204707534061927821374516699216846982 0 710757879734109228893352159991078715894294813016640383670391719383267840173 6188884002506877279385366018676494009911795537856899977155153824908140471537 1 1549337061202344263805668947808893912963247024426928861819402999423151292900 6851554255415253244395381294104955813522239523939837807425305078554932090267 0 246848846927257060596821434665218835332295763904111594271401788884109241681 6917423617096940902755917577082785011643411351216872803204018177392881001885 1 5090748703440058322533835386773067184446085706853048507371361765724182261898 6439320730109434853942508615259018952321623190328681292899324119434553793009 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 +5913171153738242764184675566958426396071694460997753166629084304449658592307 5681681942571512541739521581705552580331812104717398562305402087368513557084 2688206879613212017051314038580937390457364267847765415831308974530109143398 15078637311 15078810970 1 258041227695914450783117829810142280456810838473879311960196517662522917355 669986714962361003807975674643969198461390856717497542095618752074500524318 1 630087340421178883623496697633623294863783943349368673655841123611234241465 6106365124972311102412860353376732167185428785171255834475492169544679415163 0 748604822953682102653554399106151631893483994408948535913190689751461217979 4067932734085707282162482914739018491679792037925131779225878482308174271497 1 524678595949666932034600963828609939332077087049601416827927198413750566175 2324507624584044527606373983054401860380334691175292766836177823051568389221 1 1419944161907546570991127446623956026089018786889686872053241956106638035748 6929794075750300784487639990341852266858837830627575246171966707551530297461 0 3341698520800842114039729930222083571601558110009493596487152111085679925130 2896267547765593266954199120913441812864311574329923793516761486310698710078 1 1271148849058125663073204699662905914360503338908928287639502236303216503081 5613408129874650052477546288537311506310584264996860100242430953211810061143 0 6072503064435349786531341879562869757739005384555007780503647614886917621343 5345639754492547794666524754181801626321975351152485212878682246652604778297 0 5175798234241252614961519937885551963880968252121204361139120021135239782233 4905607881043823353645405459252163142494631064221513603985554881178385104475 1 5246454372448985584645681532255736168566607181496864847062311223857872650469 4409963463497994353721651411603681049093733194358583278198321675103452175263 1 1195947705336312367622796417642136967548045074563448680125178351629097446835 2293870464179904235934972066876219564397667946621692714888543313944744811899 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 +240044311076141314787572035937486365722325799542898776135295093682958503848 2065122206198169221998703870488767145801335647882569015414593239622019316130 2112395801230740888608868376191363442328065399858777453899652360988602215835 6861768378 6861885526 0 5212438792273336533824232862299347419249410151671686568129211397171519274641 2026657996426949064519383669616900207521928946112758367048172749076289517664 0 404548892540659436992899957931242384565725670119849640505209545881394443149 2031965518139193858461930157095730167884523052885316736587369882923028139859 1 6328043255338254362979015361908163132722048249755581804087088044276216753208 2781327064915810043108497496060883959292931088318410613983589663953147807410 1 4179870716491967610281174381316528155025979890636978960494533265062092203111 3395816478322929869874192328018289244054665602223463632014216436779544750071 1 7181086090342186184155467630896610152470721930292852766952273985952369713680 5723714811202515389854337391248456208909607353988437347357507937984470560510 0 2139803965873205443893315625000093108808998946919971829139269681262928940217 2587750070550810966364469464226120067642693310953721759527221666126648438096 0 6870922755949382456244340851016448744670423476502497040429526399399379534931 1895664979862733567526860695286140137757328758812106530571356216917162921674 1 5173049914501655341505553712607768923850425208613313078792490083673567822861 4776655768463278968774472906214292357334351036227198803357148249339233791275 1 4021549639449127593219033845837925695441419990164199770511080875660835682873 6947358063993965865367059249567153809710662678478093427914563458307266463021 0 5761060954761858408048145716773764477763822338037760938198667850254476651232 4685946986560501753476514382876365786994662329092036631254849164459245279101 0 4892911685640918936507415812092628174906600733410473687651092234682149603333 5433191193400283830449270445939645756530875942930903471232483101077915067842 1 6979269453309009111069036018105677771463384075446857673924331315888505530952 6415190432501433395733658264573518065023765775625781104935817327833498905927 0 7155842912162336485845305523305565491772834783313129438718163644875917614053 4323979049682445725653339279525878673266906371560474718815605130743279777072 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 1 +655229813363507702884199961675136536632064604184561564383538278001440883307 7052791672228942192298170699084980398389352071007393737104720896272244916711 2092494998513441331559739104370213763989331161114126576692786385243509820925 13309042825 13309205976 1 2195254503680933981610548699967014904203204202219638834620160877301184826754 1378738249028784988818726882517821264876963184871791234836853245220505073506 1 1634064730073237711820560709289232234781983353653991361971462083244325937088 3591960400452759222899060931298947720259361009988092139998670808650627619501 1 4237729018198583116528425099400208679076663013812205986656630426779218699834 3691217058301613317010500936791074570901685410744533734412694854649466621623 1 5462949244011621300206861359925473564016549478066841179941149580104498040357 4978403224525903807162858586958323692313517336274142271241128592650202500810 0 4178863217780824104488295429470175583079902244659811944276908288947356575906 3577875562525150159276791955633620250309039828314340253970613784076469745460 0 4049632696637417986054350373354232458625774910604007635350473537992206367072 6385864252701096166653462019400640730542431967767586703845708209799046713045 1 43757670154384761886814537998282998003383177088370466164569774157564691562 4003278867690767885781416339890199940739845861737183047461252034874214187131 0 453622468996748084521107871571652473363428205605516207025366978165209401433 5196899333588776947889810894868261022087088401264719912640781839330771928773 1 3852044321776537399304691380600526192108826668008325501693051365578608566439 6834230982914423619411447789143147786616602768015213915610397403813769186863 0 7192761292420179302129579462205156909924714576978850592355619101400128850727 510733495867272632383278163124146978964317160213753708867355484243976936604 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 +2134175125137714844288333427112278861642920331796215507327742688588499259368 3836335123090937556504306350455159711862342371129567265590992058715681100234 165920966958589644458412541159599329135971303335654833873159768323694864489 8427460051 8427589878 1 2674456697544833046879832703573701418598935002857063662926311712950016107100 389448373975273337916358868717403846017219912409711126061593842754219003648 1 4077048849014657449639278042908148493295696965820893986503109361300950817977 6574375249700363186980785687646288844555029135737622568287115051765984263862 0 5794934577786951027590162927072697946820209472206507366145711459424655880182 4836298000568063091558984538137181866978375121156379260888295184136695305922 0 6803564828237504111212292164521492473459830565109611691723262477541681364831 3496982280711918483221614847510177358367002781451536595341465076124020797402 0 355317876133764258440858118519623057949041320527595859856342157200555713473 5213116167162346928024172160282521372094802691814846238709015337477764521669 1 5301886448310812423111574514806394300796568831416249220782090643263105172269 5833866373056143360070346436624842546185929250390768504117636039074870097137 0 7087389527352434383271690655932297401502684051624835773706458274199517637241 652149941095617635445522231534000138040120224572282464745229813371368986597 0 2558164322440461549613309342328279217303173347948467048667961137110645319356 5907697972018899870712052084443296040753340756267117071727141030464963314752 1 2345278187897902785676390573119894775972902022095543358047067293421517528555 1238093766317226583134851085971128646472359370425988006677654198041368045363 1 5905739027350221656641948265458007078684398820498014454222987852372893852316 4687005109826431528808034663886113726930694052454267721936029189744668538179 0 7173017566049627611961637667229341836912935554892773554725821389416315891716 7133448645250593764214856760768843267515783056965422435368550513826328295162 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 +5887325100082219396812421711201475183952134150794368502730672113634740846796 2197141483821109214467603395251898306073182394197458701790116483164892443376 6156584836519053988521698860007040013577782372984085390618894527814537022862 11366022606 11366173378 0 839447108591718568634499997408421499086674134427876233128143711795916375492 4923322467305866679023152630195535249723450120328235379752505721926074685007 0 6611825922860165272843242160878358140344205003464315097435888650364814912278 5126155843983193190882097710152444148521671328417144525985421570160006845669 1 5514969336658816492356989873912474793255601497686811875218921986251188464164 2897751081665073057435095772321532404414108644223510928272397789027620014760 0 1112776337952487366485097639834663209805951685744385297965037864327398895014 6041162615816070875266218600344959224249575821137673642170977612922492313820 1 5963329075681677894584942499454356007269115748594043813128598990944189412696 5486353425400238743421276063540960924966955342200527763221368149059694455464 1 2419382079405962814376339900967407923991415736896553633289270205099729566214 908279165499228304704999878370991860533177307000027151351701035053999910505 1 2608538861900534900674522007870746019252648172020094872825082008563490152987 5451838518533980114626279396808564828551277656711682882964153060468339789220 1 3155957591306364423722005627664609613710408589471860782904561911604359410558 672895642498545966993506721848898261411779528445388095122925364361221882322 0 6836634132514641324680506914116211235856323620986870396592739453194445411454 6652097301608350016033100933342209511623427095307914463646253807886422446365 0 5452629307979286370429478294989357423061926898576489921783112689547592374298 2088148379403119104524794930582612082498119087407210012550011383232133283168 1 1099657098322510201084875510828779527761256258938235615051052653695232303245 5799872061386098756571929304697188123249686927002328074778869891117251841968 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 +3988110080928760346630914191013985424540812203748960715186845628434528409853 5653580865676881027429873285834103292927917073785679688019128180612069414674 1755073981236978917002171835788912088198472665136884080943516855159278547966 9286596186 9286732470 0 6632049247709417383207365220426290268195028546099154231293315130568043351157 305121319296864753246916907385424248911124142380725416935656539089881203231 0 5029283571075203546485352692559388346217299684231182070145709628743533584958 2613729542545567358678052178593041523270376426743625469076174761682569579625 1 5803695706196376293275004934881469304446547861563055261144638522706282730450 676182734108213172498872251095737666805246656142829676891511685282216495254 1 643582094402752855340888290545001988191198019355701740407039248819582292240 4457655146175756498745115215385399472286011865805211374628239142631828671861 1 6569197553681325066815302129534644333365936816963883554064654998720986692773 5569940345700795764431498819753070528732161396570560788050703865581500585968 0 359553734679376661914702752548448863043071484631393248288242470708491287054 1317778491249169079724144068284201641073885670710002637010084040444290861340 1 5290354496463222793229141549644813334004799299692836842452743240035054309523 6071969817017723202517256761642929934450859963402879372945406037397505354390 0 1024712711227299549478285797311967949287715785874196494617160451046266549534 5335636917752063213747186419646756060469913212740817977936108871920021098816 0 1978984775292015549909282410041967959650850118776718676080365212344828366771 3569369618765623252980410612001652357273109846276673001610625112659557023097 0 6444948983125472716187440654795039813419046043768491810276800414195209230817 4155725567421243321520087211971449105690319798013017412505470329976353906268 1 3944399605976523708698253435709897944527668634148759293143840386293422040630 2064986973532608098924459495423742838044949391133694507659843160168696748549 0 6647791568377385298418219967204907680880330151498300799943617117045338284496 4373436973967083480150830174056602623641795535203042909504871137969698769052 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 +3211145883279676536673441615959418245925207235537763150053711958518964812952 2651412052946518193431298206259928564626478697800509013068260642063195085978 2180527747643569580164663369017332048829668080576000801502475982100089628434 10700308905 10700455195 0 4253793650016119129987021588765979392678495650923701657874886056606157948098 1829215513456703480496222500904074720132689913978964913823894276166675168714 1 2884084915882905144398745479556216349338890981200031292612367902666123743592 6242536588487300600068783406726808738276671626980944721794599587485316845078 0 4878704881097626267034924907965414861519511495602943486488407585017756827717 2191262726813771099928549156362498327370424924457613712862287212940020930095 0 1651301080360513703719637905352191645121130235272504179348298834314974558578 711486905717187365876841041698521320278236715605808518208888139086624896315 1 2385665471913921384641715426132093509411016410245463352954538265209190959280 4578886626889332209076039870462190474411160287609088448302717456927837970794 1 574946491624949266720529085961299112509507095994016674061445287868396832955 3726455295880097793175872503286267261783683194251773451842839897202530886787 1 4605845439638116713437233478224224399976546767917236779448465937408233338729 5088102905785951963928120464595649827510852303062729406837682396970218962515 0 6240140472672862058274348210014859709709936049994080708615710052062455064186 4559213892555188464941967122560266863001680453977471587912554171303475804689 1 2223404408806343168057965229746349243281213775673242102061452964134005215612 3291986178436455360942871331782904595988338300093184348498619535860936948363 1 4959757622923834006671189937082653611571392750507809962191419246095658178473 5790418348720339503981434979196303883881672525350699193183643115309404442954 0 4508894244391507107302268221895076860482451236397766875311087124353481401169 999626441817684424751792408388180847616038548912567819802796830089384147142 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 +3435392768709076196661782225547729566343978553291043758446643298145299766479 60898613908993980069984256898389916548945033732120472533152688501211700458 1513156214840393926458393904783872293622590339015559213349556785908365204856 16943735655 16943919741 0 6957125195460045460172413188055889879657831748721196462003936659787030647724 5397591737328010982008148337349089820525022911179043688164546595412773963507 1 2305479903459635853656619968159635257750092754386972989534459952316451456454 5272494845409383745136362555979730157070146246836807550599960618085228890598 1 1199221365449166558921548096054990518411449973892160390059120019272243035364 6410029303268966275941569527213446753887033297864670680253878509376314584342 0 4390601991738345244242924368006755574903220567537832486903697549868249874367 4586771287488388092065054133834713274248138795198980727594995667208191516238 1 17738146451227243145603527669243371204771778070012462539378441660434008844 2118345154031948962276350117765025987061027240771074708621193173194328444003 0 5607927063922740514237865549048630635938487306066227741326733106415263459849 5664621649941654241426368457307556806783451959624232574528602961226346627278 0 644415950077702552728635763739004429275466593492631838312698806803327510661 6438266509405746643388633854799635876066856772652078501279654560480356352094 0 721163724151681324729940255243935873644679612326487176034476472385097516307 5726467971426179411495534923986155258025318509614281038878384485864465808890 1 7112553301396075083660739116800939346334251681009538100854254318871414984751 7006089277821417153725472354628281890886968721218252793374602381059383995051 1 1390221405638395798609612498633692631850998839655161871969587157017612587673 3174959088822756802973902459408737155874723401190220229209928956783939202565 1 4617489889846964207493841454104369775506869647881798155792392687561910012348 1404930765557064173925016147744192656751176478236751515885561876516984132362 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 +4772685920972122792152804017406872917244512910654910127341275186220273581258 3923223785443181486331887238565219011844678323591752736667611555071613319605 1638599275869644644906594663280546912758155616609673096386759354915764727822 16205310435 16205490465 0 5723119690147445357622427640434139565645182307764940354568709792231627292305 6599727584370120025550973523796454217515336088021614881135974961095072755360 1 600990052355364988602006879523615236104114640035912464355391377992182661610 6397231056791861513177723930612140293567432496767150911415798872390591044363 1 2537997067139018493856984456064230564533949329683482182694698298272497367613 5258390564620126761662910677127986670242914902009234847693765177432686863467 1 3203187934140079783184547275295654639006172805375848868169612727180586634459 6322639135364959226293989001129253543762530381066339385430326361268456873721 1 4417040640295870151213032480834414124030386740270603949561496767884959445001 1103040657572633979327907071217235123801277597738210793879861207059410232044 1 753946387971787209184529303887163865856191956723271351900467884883169543643 1795113279132217850396560070627796522666487911698367691379709114723869226343 0 2025499760954076708249876660131656146300222052009088655390387256420016883925 3765826512022759303407983164016864026619353814688565971629943469484786518050 0 2340553141857937773391345264871484660236025233555630673298414420356449559686 1834511689622701986181726991348706069448197382878334840947596335485292421009 1 3893600142064471604135980938764337390932371267959512460191826894128338989590 5310616901356084005843924058376370027433479326317120382694927963295818826322 1 1093079782114326818800348784254929366562140552339551626007917276169255238764 6090519853249702349001485330504085873028407870329592176769707795728091046852 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 +544289607473552064635813949963122949736751581134382761584153518595273720905 5553478137886419698492851849881731809613396554969461128509939300950337904575 4362905350157111096212648241773408795929546114600204306083920587256200013655 9338046130 9338182791 1 2341446937404038355856212469643936182632428822925881873435447337919764454781 3909086669868659246574973713040692733497992169398763296077037198686196067950 0 7114742269055779002871076577902464639700808780894986068255392520306253403438 3654887995451404457002181402767615920910626426506830285560883293526847058489 1 3108619291604412011829824557755438780612234031663459886095789131268939165465 6932036091173360935600096176223011186517594811377512454625640749777925201796 0 3105465206830257615898730373228282030747781093380996709896002637941740567218 7203068003857550145205385939918138991231177129420652629974917469424248958267 1 2400755995945210668174800872963878653798933630147016888897173885865889552644 4630418202228127405241253767284635318241565886493351463818902970508341135989 0 1711583451350926036417370996874909203098229541704893534052673044070632335680 4182900277892214025614893076370885798685657052750547793025399218434311995681 1 4660325746669369032605272198620724435693232607466852939552695476545246116202 5231681579245244474178436790315660157721355408789215083607447591879149010494 1 4019147708293946801287505579423924835228896842343657264001425009461555561204 3643809713351240288575845702087060438003251042158479827822302254410043195444 1 3155913569425310993804582739954107913683632447325210812472047215200834754449 4467371819142930152140421745408380136319059797816459675335901433937390389431 0 6444948983125472716187440654795039813419046043768491810276800414195209230817 4155725567421243321520087211971449105690319798013017412505470329976353906268 1 3944399605976523708698253435709897944527668634148759293143840386293422040630 2064986973532608098924459495423742838044949391133694507659843160168696748549 0 6647791568377385298418219967204907680880330151498300799943617117045338284496 4373436973967083480150830174056602623641795535203042909504871137969698769052 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 +484519600246392485176532102529093847029634755530245386192588024124879157285 1394782962060377351934211184759144765376826115751732117932572596949788404441 1812935228305930997818726365276101682957492043604859665148548898567163274449 11423992590 11424143746 0 400668242156045369145020046397367916527495759258487002870165827847186015035 5411330574131389312960991832065979078487463396548939791058096258258088155762 0 2952502195282408347410466669173699032818240581038225018961269937801645406153 4821048261731575932724054352290977737761321049754665468929688785447765943800 1 2240350092614388357217157067371493775563463205236551850659086590916972291655 1703781273112185932217509945648666442707128244575478518551235223687924127712 0 1704662690201586226699690131829241016190549724320530824934520811610798903554 1900708894124644063059372550335733985364973187252819886393525145408056453956 1 4443270321378801205191131495904607670859666148646832020936929982031013514288 5068124755850717689063813796440672908057190692047479343848059387196321551034 1 274328928311333306554615286439352691094761829879053605417511765676798306452 698164724756457766408963297561670385849760914848185257869062622981342223678 1 2670208124175071369883165892789288487167033930213012336603906314912905684037 1536134611475500066716946282873490175599472889691143971099329135098583001947 0 261685138184646657609754930903671519065962593960455787329607140853695379865 4673199735923953286955280853860424103368522670625696325031956466542292153299 0 5807176451472900219146928037781119674829720944350767977875764008129862377174 5987190347567056677898609148350797581475503863524391886413416327235608063626 1 446450820728140407840482338990701806106377175580739513565592804661811101873 4584776691912595339770281881310509200924613489298450704604508904508117643197 1 1099657098322510201084875510828779527761256258938235615051052653695232303245 5799872061386098756571929304697188123249686927002328074778869891117251841968 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 +5312776368585114373438254622908993782486110807849333003562993407943069769068 4353767411262495004407985882290769520367591966548601782131561830147930419455 2702057366381436608430314499069350901127092871242526632491685111165563208830 10111770945 10111913155 0 462777380948133065320987168213658028312427701657888784586858149388218156015 3857803499028837777642916904202952244721063361196731470484128858708283264507 1 3122456939173428810605953615541339239299880397245790927157312163218289836833 5251584874836526498009977307958810864746342338444150366308505908153114098746 0 4076482720843772701790210223936959246168159892143001843673875200900474029643 2167813996965937949966401944218933837336936912335503311788081001778749078755 0 6057551633351518234165310287719796524121941829778520037494880600091162138122 4416138261424226953891691527386939144357956129688171830422710559635047303053 0 3447082441319914160449720634192657130173826370094967092665566175825403348821 1355846117477769856600259061767544271673999029184684999599822957572425895787 0 3543291947196652523042674534707235635634612568409138950297859190809971656560 7198421787269795838634597313866490740657963258541005778722354777870002334359 0 6979085702029939307758197318666159646732662865570812666771538644230739987740 2924086312665029815786826604572118497613069681490322110027150608062450520667 1 6677967327377754703890134284569435478731629209048178223567424681728032402349 2312489750524385500079270426999440890680766466722979450770014448822515841241 1 2667579134821171785166327043450710141003419664095279661265665384786829731437 2088288805965957961799862243995999537367251699072756452551797842893332799369 1 3711209296188347892952536343427330045404125830457411971929711756594748180937 5090661439302782809553040821338919968802016532993913728733073779616034610461 0 182470551327361884910170494545884453921113433831787466574770900407610931296 2740835501314600670286186517824821680780109828968337565224168579753381454956 1 4120488143092829846248167395039563980310127782773428421117056740490630217427 3320697570657975296134172091862762359997279902800673094072342690677726489140 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 +7124150634948040172687358340658545070241573296811269684320812725829019484957 2922810317260081151531007318526313264215282244481560688691701515316163482234 1441129845103818099186553703914092579721524926794911265286540182186159271412 16143259770 16143439455 1 4322172231444190765503289790545083380758867558685027966043377281510577636485 4884202182711634196661661911822956817734663454745778430778327821689408508532 0 2198042452769851526832875265696145557341871751524860251852208549169679781337 2419854412666179168376836373560542912272633779101210268939689878567766025559 1 715478709269860616071105213028111736078762100769032845052872495393608531446 5586272899515580090996988858134940483839216915762152437894678457400391471609 0 3652680361400832112746649325841942767187767002247513900014084105744420122244 4284937780293377830036586818084416438312728310840995126118888657791584284541 0 2404356488594244796235444900869585904125470144060194577246738308190684297583 136350718839095399695360882221473761450857252330118094161348954877043081289 1 3612475441187375134352262819559497660293034240786503867659298433730947890792 1464280372481250634650184318836865062652647622859985072182829686017029066626 1 1090464526006063796296001905528383490889960689837986644578694862667204720278 2050634208112177910844266170397391410256928001993438086135031643912377067825 1 1156968824615368577725953022331526032550849691836366898916002613995098159140 6134968957229733336345971287034627145054626874346109385862136607073314809489 1 146405961570192318918572797552706493134805087761923318479776657459436325866 3287511554431594679391633489049637711320761334262969930535983123812004201152 0 4043030641376911757975320002186167937504175355974738000774897683843899880077 5477764214142626071383428564901054709922189769512371686491328703204413757355 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 +2898949460798357756537313332517845689017570413736178347721229964208166117999 6694545694251150109045223824157895253931368229506090202412487267323312301732 5520324067419527578188662334917017736912230445696218574160034984171509571836 18445730556 18445922628 0 997610093457667104552625558691463317821863727253436572117163812536657404235 4104507270835106543270756235091095629389164239190873211153818557633380136956 0 119010620244079145387382841576291722868615032997118324123551250719527671870 4997649243546707856594469539230330225067875719856970720094698104678162838534 0 6885994428376784606466553829342235851024745502884634440430840427219948930589 5054828028601677381951261285699333270600020228782899250865236462973387915916 1 4019879487718550675677240810655358055671524782489342313523576052286235151485 2446401522148872636332187136961985760386730631781771437649536696187649368142 0 5786098568491177555824242256676607908009292021496374383743921739556019001924 1245466449724186017188185375420991596080371011610659815425871032956687541511 0 2007371020358313994773557962765154126403919995572982367681172136185816691453 5526360489103341814475366991392238987661204480471445635293304494840685601239 1 3365562595974267713323954298067405965921148916925946543416182878373064565775 3133794951436901828222948672059826274587972257587335407172237892589388249849 0 6309373438248970633922750180905653678503970759276042360890989765590814838497 1548801180034991282355773567973277246026544435226198526744446484221140888382 0 4110858631113189277065581564307234080789848162147752794853157376397998794609 2279908908702948701274634698188161883411198665378074842977657100991610658401 1 2589288198153066805231404200178973528249900925011377947486890749955509243584 3032148959829077851087547540377102571468999536891841466129502427364441170719 1 1226028997856234802136539411928081997449172683065622442283218417781339222637 1892726071231923864138953668457350693457806102568841900686296190588461203071 1 5370059975383356337657953506195486116590801669004462188384319633826615123038 3601787677204411524194356035196171378973584312891456035693278172947545740645 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 +5179609259559078445448870090811972967540248247359062711338437682662067753924 3116764396804344188005878563797871902646264414033179571068312683669105678341 5259844681185060714945990212646775335814752175790543145046779518529764501671 14219303203 14219471841 0 227772563128568277019252219563771845338868633923022594719468885314065242699 1762785433273779722277320788652556439990916248524801212271546185064379359631 1 4363615420561130738513157027298144479913131940155231901781782016616409462357 262345545119271742564390991861305920367634400735565344202770310597807726241 1 5464726162817305728164250411673025449183224276390702865319790821606781361851 6270144518695969731227386133559937026848214525939881302297828014358832490156 1 1870045527786437384012860498992256434947900877427308597053440352113979190066 178905319973080871597738775560306684851770613024264011008750982745161598205 1 7113529782595917941160581110221734080825216435336567077674897007988103688892 3228973577992630800715625392021484448486975999970314232741505179616359378198 1 5505882538028009803121004456514014799484894128044762041913259669673279570342 5048519809790811081153351552773628361823486177110860010974395939128307378593 0 1497904405474758877630180196704019176241943918957846863282083980399152525010 6911106991877411916494888868813649334427166149593136253702831684293853255668 1 2406460462379361799658884061920077986480671781838102262743939107281628094877 3466070724699712359894030343274826410597532021694367967039243654884349066035 0 1250739718233963381175999453669799263098336162862908010277783302646184313919 2162745969781899001700078846847695947078485103438229384620789080121785078923 1 2796402827685559072009002161680921964405173556429526738185918202297288137487 292395337955228855191421534233023244740252877372593777359415107057055928514 0 4345107310558054843809254693302961622686968829047970913676630930654713822278 4906263539489666044992124169220034516684643707604345812081476855587328358505 0 4146711549669107800420400725667138277685886026808096122496422698645696975173 1859597067610819320209456124366767882989255050838696794789402341679318293046 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 +5408112536033414551245143687137592131184137261682060017384282361560821534647 1456623934382916393575592096081496626147433800287516964258816622305308451683 5206773480529102482710377298618992337892334097701870303966082442992606562112 16906203021 16906386903 0 4964310260200448049978755961686751786531413384416887552714329571543086971981 6224403500866678557731639134905900262591225116605830092469219859802865808774 1 6184403855548922560113185008878326238083950519154932470968542265615766873471 6034192708592099245737777000032865328398743039285868596170706162311500397250 0 3653752797859871267042284653311116413277212806839241968571299334697640355062 2036177279239556881393663319960149554237961654853362425705967840253307455651 1 4800081211646444623317336562803420174348091422747313105626969302338416774692 345263406766439050183483741421531672337485653313030849494368892234696222751 0 1426472289251818132939657073321697778949433092242288921321937724084980901812 5784694562936069617851752447110245227671698314756836713786662846510542794851 0 2064094336225855676786895019298749807324168272842664628055092920296011009691 1995723611001117256911193242911423507848527522625074322978753875038647975322 1 4173031239216922523709860234379304664838268317640233793158021653222808697887 4422173870383335424162676448904771170089799948307951756493782409959661179135 0 2863779502782937611055163929902328485764606820674966019711204385108968559076 2443331178085753891016224899595063797577725758137454752713945052215389338181 0 1213872069917019086903764379255393323677972579112005465983813415587968633242 2315265092263498549525265508046661204908883533579827256683231621482607004655 1 1390221405638395798609612498633692631850998839655161871969587157017612587673 3174959088822756802973902459408737155874723401190220229209928956783939202565 1 4617489889846964207493841454104369775506869647881798155792392687561910012348 1404930765557064173925016147744192656751176478236751515885561876516984132362 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 +3270174457730722090007414886442190187238074617122642461817425097360939540022 4826627687686972208190581821391356475339891271047366817943851838478959720110 7206817359963638940574838620660998263014508554848393806192213542227111555085 14833739403 14833911646 1 5703518158451988352937301086587083982297305915861416972369003028398631105699 4014637084409144568704086509292990864202341270681543800856567426316114600420 1 4500605274918509400130931184465161412642725230215633873594506296755559418659 1488739491641647680240067590420271248389170635165283362425953115446683339895 0 2982270825678184104526115729542249417137743656913140236499912214587746482717 6716923601213617595968758425340853114138188655583895579630326694189030723161 0 7187248768232952756977667251025021457324760263835475561759563053830182094823 3278521491447819862961669650111695898497182184310558360214846287710368910493 1 1334294862128776128252144304567446882069621161651336194619214158430282786832 7107265309384967131907382523172875972886578483489382034305260104279602181779 0 6888476481247279395247853924693413350759109703318999567351450299082548435451 2601543418348845168669040211691604054928198982803092170949839194632438860422 1 6250919669509971517919582885835756783032575628093805682572443494976596304646 3316056478484112456828120181603731452039275549629474419284243199890403770075 1 1428585885131515985982873653419206075521556819446841035418559158948229367803 5596290952257452986487969508346599091504283086900822002293325032444064862671 0 5574571179262221385159492846265820024331051060330109188695053896014956693721 2219507903039589927659993710054214806211757849109499372625864012623255901992 0 4755601889606972839993071880201203973251978668408926677182260145625510235605 4670762856687148042099187268628086202541215389841467580988378389726197155071 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 +3902956264792419677504482565264279529290907806486331890385643422208987872563 5206312364291737598748579453108654605840079115651689849827665783327067582843 1566778565540478424269337334369153590483415040357709891246230308966236005262 14894085528 14894258121 1 2455557803076441340807387728905870551364045402246165948922609047643242540736 1411015527454254151196165256962163154199207970450410483956914848265881805838 0 7145635826559361567004558340620441645214697907001198446966414837214526712150 5799295709766468952704777218036202504466805513254913640153284140482612212791 0 6574704266155817159034211087649632040143690719729101546407848239334309097792 5306378808999046340309158221821257237132875092290141541493371503176408276230 0 4933955397898771328407043771905994925868302120269932936893545812014493114024 1306863731033430899319533056979659667618724401311183611376864455008904854850 1 5899565866577909531246354262706661064535580976565340845419779987175140032306 5871341524277049955549657053935880879878872888670290396308783857373766833060 1 1828891263609004567064579643875010729712414669887535782995985010077166917017 2862975825476162782223404720896922735157081043452537289335381353894732127134 0 1249336315086383232932647236901958201783107472582100879423444584927057459002 4746309210062087296001573902577680429143463837691879452450502515290378060323 0 6225999248274512458373063896096857814112290271466590307099113828684401696301 1648840620615978297210739307147373603486118405376952185378745491121124745657 0 4605248575731157617117378823688632800708481904680245679919852539222782879630 4673739478423532734122772259542815535439835040390638792256246989448415164388 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 +5483091367343388427618131421939916925224697697858904410830040760670990088156 1349464619873628901844599213480018157474250074567467956076341429862236512206 2819070944218896172931876866981485974386348871163497530208271498377333173255 15890007315 15890185585 0 6254349869074761240471765373182684690121275755471345974352220474458181088071 798068944086214046342107302984248305396555075955856085121004004096915175011 1 3382054142022577944887535453122004241553373678913303460316445384998273913945 5562242576574741326149118501445557558017056770891934151002856690559690836661 1 779885337261652870001999531914845249326762749970659511753786892654558796183 604938476683733776743936468922054256923879533790401611598603066565352759971 1 2932667889130992106941036959707158070791216174487841961600524101619297565741 3632933528955869139800702550430415942821017585080353583960721647953681452093 1 2311128415347057042475810572656525358213804703479607764544923685935103361330 2660070785644143334312973397175362990529693925061856080115316566375702154653 0 6223978778735188028437612526211963410403855984247848950374964099219478895876 5458135071733903905282302975455795685655191353392694936549850433553084246975 1 3592306993603793166951046435047388971347873273682370160612576041610544676946 991970412272746169962576127541024612445901859384404395850503898453508434462 0 3093952585685921822836010360447598154699382368621722619697351747070288751883 6162198001667882621168726250858416739610129940345913649726153120693766621178 0 6829932253461476744215129385523279464738386570502129546912226814573637215203 6102792342080102564164765618467415152260118370859067564420071777245281949160 0 5966944064536104934815279210989845485109610520973531813131581345740192471073 1419910039747371690510718622378526607496830040331517185480907730008023087922 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 +4304771658784955419414713282542774407387203416078293244521089767028471411000 2194055405288552660689898441528490835488696662725194820116464259543968085715 856660321327178459074224308282961991835511589401241968631517585984365026166 16444364628 16444545981 1 4437846204666940112582595106519156730230279779307990848654903192888187621688 3295266453449830515765403882226272358914516700966616995620587727963191239205 0 1199408270714944439977079854016779152969455770308757559838057764391099771367 1544800408070963433657387603039559255301712906086848646200976118914187653992 0 4303349660601240400786099394277026304840709957834329479537645025221294762754 2762285963547721059154316203236598337496985830014534306641286496584226492131 1 3299578930243914020136758919830506206878389092416327114897317270889148093399 2929245694312505722348000926618427115376748628305880605659595048419520214871 0 3318753930322877689866677024072106138655204564487212055130830488534067659226 1739225327851720392724330837119870335227215825153009158796753856109504182059 1 5408548045543571910552507144432780350098322593118748634670673865541546958808 2111055523778679123714763829043936432767761611579939501347740452986511182371 1 4062001631775929007526087984597189189415212917210726803282009737084581369814 7057792177884422457069863119747647395241189836243228178267694628376592334794 0 6453986114401618225335486070653664884231763154182704358720069785756133693931 5909213237509354931894719292425960526742902030791036409087142915828206796607 0 5706262227400302313395315359700399134788994742442204447425855544889071318152 5194003754007053782605040693965079702244322258182853202937587572571178835782 0 1766983774319982538600085636406692394694835417776844993895437335316310691366 5031134736876143765230304764782835119075519793510179399098740988373563036740 1 3325021630354190836285984265800406667986861885564279001699864295199764353483 1870433000871466856397944323773107563848753775537272521376243096540394864684 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 0 +3177984695914059935271038654379451774043506295289551903144062222625222300250 699998868369345780587285986477503814618494199471159527769898992278545307557 2647593006138376425603004794641045752091199459914674409393756853836404257842 196743366 196763203 1 2024743219960028924755863591269397525710975506054393813952084454799743923592 686321831782661857721978382629334994014934683579571197051072717670329497800 0 5026617859990361426071967847995132342364462903917198502417712945658380305597 5012661285015255928830027862341951789077318297882760160195443974231046068328 1 5051011394996197701737660157350466744409223357792735745435442960936292293208 6264015923881349119556006201317493742359692828493894520935170950130007624185 1 904040917361700104444894528608441562817304678483953243070731070945760511553 347074656098381234254418487665629489266378386409768226951104751053567344604 1 1560591998011915212515974847575703802727149314348632427845750320822248874744 4569445323179743185790776215721659808042117779937373251873520367098772976789 1 2836130271302568502981996742197588268250608176395748450717040714816145426363 2477936992683304147025217533563923890470438720505488213610290282982049242086 1 3252273665385462055394764977698063232522496962045661636926608199411767619073 1444294477685589491310953208270990174754902169275937603444391018820875950353 0 6884851567937953881193119472382969095042639160228580425013624960716602717310 2494840396869410755564543818782205781745671481720215895114956661562493865343 1 322003649716869094540090273023979740272329764934217603521289171807792570455 5714322679113275950191761047296047344799999816304097382721355238231476825053 0 1906731157617860730258144202924259380142028792287158264299539793831916459923 401933139775026388084981346456015628411712690551317015339113531500070316558 1 6160125394476899843048252266180439369269974887310612715059904435710916009517 2650290095268592776691390636530475343678019519354510059220619664157514501633 1 3870621523316977217931994794707772493706259669737493483078900574712510176629 2485205491104065504296695969092005671818313950696012724147815554387435770846 0 3762856595238627446941113630290579869316481723198452033749276309210899434555 5349329376945283096580913835123427717376990739000915393735088190815719236781 0 1855766294186847771740257772951576919537011746844466520306430800082541613060 443174091223883654741639651476250545774718557445762380847765268975024364576 1 5964598802241963262221473266535551736452515892223232788134946931769005513760 2612385415749691871090718866042302826504706268037968605556265253011766696009 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 +6103797187898743571845963766205433971171407390852755090247986581630168063603 3176496552528898900778445769022881086872665423912439708388999772179339331923 2439419495348076403443873648007641246310976039817282605707729696055693063367 9049093185 9049227715 0 7211268669172274560513048184670312941659300462638683875073361552762096652949 1951084240233537792580709721863944013817922089044908170903903999417312722535 1 2083063212015066008334478083493359307472869850358760258234587502006109914399 6289822783235298831929319498510208222914594316232181683394247661877200606319 0 4513949315030312116836929982344100706434807053602675588278420621028807608890 457108680143483386561739618217440186075274296660130354082358026007359472401 0 1108384327026201996352613716811797309474801838501185660672016661143265121868 832991026117626931514266551357761601853387534242578200417612230619326119617 0 2388617370038820548267762919708667619902851604924077468220360631561634147460 2752900933444172526563374122315462019607371750003054799384563383251523769213 0 6107246049211887492009510678799415444891253018814566921365333093543409896179 1476586927060571471976279192047166269214383646348396844864325049519322203140 0 2246205073701700950211482467346819126197481217698686598329516961971298348396 4739583815311602168765229137508723352060831711268388975115664522202593095113 1 6055848603305205471545249831697220864066933034479307099228013892483083803029 5073821802400333091284302595734861907758544918819269893735852115796850665709 1 6246884483547227985251884909563247857029305898771295096948852706893671155549 2952939831010052012785473019291322320654975280341331710145877762905219438637 0 2809686552137753374245594107969807639908537830149467070641701282654304186684 132399833081666494755171134837238092592777034851767856135918722971021007052 1 352306719177219528179854600465739376499135804543172972373793697246339809221 374486968578388123586008650382712606498227776601181801672816435762195607167 1 6273576054011717192053617782560869896396116262990123891413061385751767028354 6586243115516158698651062044712450728893624071734887464901594244820480543046 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 +4599996861045572694075400282139003538443648114746231456405360151090619767075 5801049429091272937103683022555139436178075050573216003614276775682348310282 6375223242417785078342338067983315764723464192494607982002673161031460006868 8532816930 8532947566 0 6224360791065351708653563336127506975930315987698768057222793514152372691856 951983458771587813416583965800677077359253527541625008407119531651968370607 0 5591053084113423232075664477967382617353683547820575080429117167570051098789 2620768235806099872658079125982121188432803106698233971157149900911655771978 1 1530697214904409581778220294873843164058592237951666133754809753389285358770 6810393118582781157931109943833624066784631366238262084201491091649461016348 1 1897834144325167552235555255045187845762533450520701183321829155172683080515 4966908549088243914479064023000836890026167306679678514683955451425228654397 0 5753577846258577804535544613547983965182995270305427587090188365309799027973 1000560361166498983378903020747106162682650994115780537120758074737066952437 0 4715256441386916712576320683959375895084344420736718052415441605508112690451 3594781791617750658919004356915760161887698219107915984774048373967366219807 1 6535728432706976380087508552609803839111528183276889017357086147711306078032 6492367980894668996336924062868941416868216824123663428001262478986049548640 0 4123820546456044823987851708322539105901979284846799141002137901771185465581 4991899500985613582868718149947309377539588251987191984692297922822183423423 0 2289154944610254184849192159427471214944980769407927200793850273852865284909 6188537781679493371141760631246651137330767605543832657736316839931847430918 1 5297114001091801004868210586099483407040773574401921990532250091158483868377 6324668041411184789074815989243644876817134035483523276134417726565777614041 1 3715846102645130333420723219409904425436065819803542190499036724728235950642 105896051079522120082217188498530453003913852842205382613663908349673258491 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 0 +6572059586365493975155696931868891111076646429030958451685424461980816487115 6915847070748543718548116569774334554238587398033806031409742675519304850757 816251900728430308766582747361200342704117450005507887120683753236563634768 8380398916 8380528380 0 774022773688724906320520798994370679876563794695312718495180043364171948008 5560879783267774878579760604496663310591093296794806690171242444711930935845 0 4536370980795612668743002363442699108015765917443805625489941746835709757463 1343031024952688167534547747148224795424582213741607946421568055473699206048 0 2915408541666809641722662621608813243911694896249123841594323564469561417891 7099555106447080528053056634802416274625098583181520931433202453487840596923 1 5806584123200279547654943264803628653825623491623573047231309031029813032478 4357182111711972391105380933031709791923928387710860939843195809632530261417 1 3206818280409988230268706919667964109163991298559767373178626021044984489729 2634844369720103771190094913298644660161236346114605570908326900537028496998 1 5726536576548225856804250556629914680623616297629450303489060349170579610468 6292304278431328650905596113675451871012404438712499802382797285828506576914 0 5169567493434353177146172091280549083922289695943694181331542770882121646951 194989933564439070704799567584935354054904023230185612714802911369281556407 1 1912809713675391720841075867262349269820053682497470288806646073484925222722 5823709842838746739643782016373561394851035475326836443065032666603390807041 1 4817950227074000586580275839976548409417184766943033572946874170002619658406 3089157737929721870880138808922347208190645529217058420890861558073552976415 0 130532064112525543341947192128215321611567248117457901791079621350300363124 889633345661967576698831244896208397354127600769250851670197241075934593296 0 7173017566049627611961637667229341836912935554892773554725821389416315891716 7133448645250593764214856760768843267515783056965422435368550513826328295162 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 +1815811392024137493920240198350677464260185992797530988399036538619364779166 4579899436234413340179980779878532926713243482296568972294950678422524649934 1199311249072361194561584168454849297137658590895541466335417098929667090678 12665077435 12665236590 1 6860524795219433322801920395646045145955711902944950015287739433832668375103 4193235823791839236788301877336861577481752257572882713124808508015751328657 1 6258583066783614616788149302459560653471672661880987671260013304136222285805 4973813344866580931319222905187185201945898891158370753428724893443620761391 0 9443378106298502321772716020986043475443071090712057112845467787358044883 6370078527675592678943018922377175312483841330304473273640653509392885617753 0 6549092747876410998669021553121289802745623447335976036547526908828856833817 5863497603423286969568706786950953288509486149548967968546417300210725870398 1 1166886238388098898830429484158446566501895917501174362414992306196051065342 4703615436217509124641804875335903249812173553043851244903067414699118360661 1 134512091579560000541241295120512347432789943648053915045577037232909821746 2458723728109701109545818944001137453430964737388927838863305572766497227020 0 4432548565936804163898154217707699007534482891793839831817294984696159304748 2258585262949779691160847015249020278743006918755125341659017893999948032209 1 2744480400264938128741662742742221420791364283650029219399595564605923003295 6369441512839070167700745526635950155891740391523941252197649143800556619219 1 5850296666900631876532415647248219819115358638681954172247242151598923483977 5560643872982077388283101650168445270217554577899151565719900360520265738546 0 1644787583906885269580911154752696083381307029259109225106733202967397256522 3690820264000078446882500806060434174371396681200946813410094154400287155021 1 4347079024998122594000938178502818784315403395376759754779862439595699117989 5276358379354419603974632142426691382250808038426993488024330904882809068115 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 +4908164698534801311516428169908109616256712812355729634722926239567610881952 1832843799391574246946179049802738448151923610719745281017155457071932498573 692516504303040824511954311472561623315001570187836630551393985567331021466 13443982300 13444146276 0 632395373433836443541715550420854242966531517564333304199584995048873017592 5979337142472367435689784571090765200193031223562464265571545845073086315024 0 90263868663899094107480203571718938353671769693262534315014586742650451208 3541955138051898923257337591863299270361695827734235350701184983583245115441 0 2101834115043333230323311269792884480602391784736993449156536368262561217926 6600784302824260661845599218147172503631485985957815890816856732956092162387 1 2687368552258682625782658083949516273635299801496322211634772561566967362883 1080379439572693178205567148892967982988238225853114853658130681131524034412 0 5122294805136347344013941468008964842133784711479560722776962251612902282985 1869837242523772809870469487615332282142841489394724580649524640235652121714 0 6933872839369371174524613955901445919026699688558762804863264615034875763750 6569417726668725859896979954181255961761654850938126075103867480039570056304 0 4221217130123179952756480258096246943761480284380782717515410949395085924569 972748205726892757216327099838453150472844874100358341983404943720955388870 1 4344522782076534839680123032982490522033136565432072012824613622221541978218 2912436711532780057305037560482850680406691245455418063744359621571968568625 0 5738480679705820190063609905177040195489548552149126817677512775060473220303 980880440263698125911100092339288521093148535263096355074651423915519268125 0 1235068803279447570281188035470888479208429767128112276808502748911979735888 4242262502323642502529198096496893506145073327049978988503087947212591293507 0 2886910266674173586370172401242806691104080553494659096133762859681963208399 4354209217164820794437674952485572078775598039783384383756015952078045877719 0 59056134834214549413203335513151558566598995015085545448600627484625937669 6406782137532870959590285905735913798418459499624634964511917738035519125418 0 363696729989039724101471405674845211120094790380932977487332671287344829523 2630419048351296609434751892703656844892216977058431289200366088972077954615 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 +6709531298409271196711951945001539817806849392527776961810943637089685315365 5426715340573763460127331471564724265199455768356358524539014080937113090567 2674572877302816394907857165582601209033408806583787385046330878595841598202 5298373270 5298476211 1 2264134497748172392210290725168533897084765495291548564864512600862110323718 4852844352032993527085116124841507618889390694193103037446868162453955727190 0 27585030617552566192957940548028334151863746959204218125381261086821191131 3797782649258677341728084276676874215430194512185695208137985405105268245438 1 1732975546538436291859711990225024612649529855277087909065393510797600198811 5757957245334773725123674465714093959315960193910803944177488405170670310369 1 4997098697413822760381763887722509922426906057321372393863333043405075746362 6061452309937494346673397467142478974534555148200985941585659527851021815461 1 5678299983534262159795579322748875447917213416532295261219600661936167654919 6978726102068673351394437337039303701484213992272411889937139546079928581143 0 1763010460362694811073723410928090874618277064384632077659118758257620778233 6183461646156194484505651196719743906136828541165511537432455637149542248538 0 5946969269965202712407937944738414899265270984402918430154685535365787066071 461423087953785992558569652677872687029911249356705492455154233901058388276 0 3326972891338771469515702446292051308689812184843671035979415402688494776341 2913102629503771944708573650601364598634870940990259569752510557938002716343 0 7215270367106288173749240830785312977326748817702278778942256284336688090438 5077207119927203868568253843068897422826605526142541331907088538181597031850 1 2498531155664988585691194945742819956516059887090108743213578484470202310371 5900576203395952118418686013790972644563086626515265920685546340774563570840 0 7127639230526285957487116602631685289255615728771894623150065548199328853904 5687594671116799198923224097854015171619604665185552400670567369657911212047 0 6056950504215233301332932394913847902199206580551080096415801866582484280802 4668368024617657398105226355834762760419235666323896525934385985782107584590 1 6253958567384896992247930099952888560372081799364766578845063495782599498927 2997934192278761596191355377522685705254246295271291961740142256451075777361 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 +1937903157919453467571448522567364743408187808746531735723295682731583733526 4559141744829582134794820580827803656230207953438918310137573011011181426196 2991716690873546764268142427338634855232545182181110366891774219743907785045 19130364606 19130560210 0 2708452223146837286003539736494990187845778213227343479079025697834042671499 4671675419765519594038107126466277857474899695817069457264605503635774818894 0 856002711694891306230907645086557284989799700451679127671078437891116300731 1888099449247413451141110022916284140175006950239230160557618678753456144609 1 851318098260000162635615587736544086712584782609981432542912074400884447381 2922552112577395250366954967793130281506571932165947684410803888201476359279 0 2538817619970697633495799804983047585791833933309873290727752694446407256000 6655805017879353947460654921558127026803729829147547309344707699216913690356 1 6946201679706190497370059049412401857087038763535151594952618782646448388485 46128986660966993866872811418239733464136512890377893712779755698318098560 0 3133554837342895533398207819011449624164445411738982599903353329767757626966 1472911968016757596714415818164947744714914915947005234292538666001087349532 0 4366823479470857319969864480527562266597129016076969580223724396792468008775 323753202409392001590331437750983745478755305164828935508629808542348220411 0 331739741869077913629151669868865144890480675191496216408726275740454990275 6141262534947336347287619648423311852560261689078991980498553994372948360848 0 4570808776873354819687119696952070549202342172924725419856430106103623626367 2858698065669087547733608120033089268693494585735708990315987701961404389579 0 442848481041990105174911344799948550570870571785599227301851253298725770075 3635500992665435668856366170329174552612963842351977386749903170630962296570 1 2804634903645675484725915857782612000174507797105244734135573666066463699962 1048425412734301715638488010646250428721446056814530272591110867534211884533 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 +674185108903103112887489513390336956479644744863838054622809416810014454757 2227881494649420079779542035025295744110485079678029225401890478821522696012 4248553451162248022398498074285059809231127206956590631548217519883732507700 9633483415 9633622221 0 2633394945375758430113416367098783397906442974371744491277370243138583851702 4772012159794179188986985964157335225466519204621520427601325277167398643379 1 7214622852609163258736513486984243465501122668670971269911912749685379630990 254003399154884621110087375245918899930423385806085157569398028465519598867 1 6262560190693246035379733429473709101086026144525906852953867991818719850296 4467682278429641768547710802698829997584893901835282089066448042429243734998 0 4228785484876462078549550255243738673703288012543741729662485412479162314643 570471199188857271123211455570201690991740088689882979491117903273537075843 1 1165749928405140770760503429488811319153495397017833743478019413627803793327 879108045491085142995305812370729504829754874370667162021253958067496259292 1 7217658786760038535110308340560978960982475378595999582447111955140963103787 5965605553551989971590251432262790387415038542434506260846726310089165954196 0 2475866793098771317185398107292909683247358173078407521065576471313824346677 1521950665979181773758523094225111832375036692151433878256632717876447422700 0 3091358147686682039825542957093501296676722691807608751485525410130066149467 4461709983993630348503245924701441118299812921799915381365953050550229632699 0 6330132961674893549761165909000911272480937684913986677047981009664034214817 2981745436990518894724958181947936265589565394599544352508221624391393292626 1 3380559635488889770247232724562535237885735389926487502397778189723640111173 1801900058735212988811393696271068024417079972774029010375976755050596916403 1 2696117048974209473362404286493803540953297622121474100872183441938041397118 1182472163421627648740270505849974290882936350978645197731671514295175367576 1 2375945960944027123296314725375768316418723511640484600859380970585628079877 4157080620591651842766990831012098333360382658255042299669089469445871162108 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 +4658259730114310985976265655870956911742186528014349276118353451402997364678 61333663073342217589689118116933030938377793886908405875679180941480516513 6531976321120829481255237217309652188438558251650758231936774492987760492575 10598151255 10598296845 0 880732472656765232150063586235107852675924476755929704426415630686121093605 5765996631384579950583351635373345123701345618876805241150262499338346930447 1 6678035144245543115245104970654775932728434357622131789603387383157693002974 2239851399376040978864991882446293900507682346391700674734154246964005953997 1 6420807457481766588122598370486241675126503973592784299601621106373740154435 3731608360818979495260874287419999675162288581150536138650388542416783211758 0 3250805829749145376932422364843194219958312755283404485776207118228984797585 3601625210061823879795004833077996478023911180800338418437333019942085791880 1 4245801636124916311267685129792686466900710431083602875385467358407819936310 6997596529226001011431621149588733713798786053995545807966974240482161456999 1 1722033368349446525972746533309877806358651120222459264474231229245593507790 3402372115910083373081285518432143946212203446847319229233062043396705623405 0 6054266257526348994858892618895962462135545081754931358092747867982044004234 5811133517971255365785834177343537479390665651151225336767824547222586941675 1 3261265780095319352938147753678407419295880823341075568770155270090100006764 7038086024806769074831356253933924749413394693594172078565699261268510769684 0 2574941526212149518411935520214727713502449297424104958159139994599984652296 2862765552122267704686554859848650518927181187750272474251047631870638184995 0 6840384481562387729466601139740141187158194409340069743838294737634030600882 3342600196594920925346183360348313262173354523365721111090002705169084337684 0 4508894244391507107302268221895076860482451236397766875311087124353481401169 999626441817684424751792408388180847616038548912567819802796830089384147142 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 +2409874347594917776632483142150303586852019939317968519556603520089171145507 279837994753441401185668766171206327255500090242847292452298172532999698838 4421382318629991276782343523979059044817360320972638637948628736973875132265 13280180851 13280343825 0 4225690645707968058613918140575241322659657642227266890165033878905123830816 811835606501676291762204839886976334827689601064266974887254827899136853983 1 5245139584810904960590630149096861156052016777338522812671825076735454587654 2217194246672225392359908114727450714181269889375380729216483629711697332530 1 6395962441880018115397037536509976897249966704025483053845113814132706674764 1467199597116429247027493624178885265528991665441781587735996866401858004760 1 4357681364684989551266921029128629695234839983106223846189310017159319241857 85193415745822349177766997629186377958085149887903184239623881704056251617 1 6762419327057989355582247269391498816576030454665708307247382835262433420264 3791563159144760037363987861191016209762526587780222962747350298300873482558 0 4443094921312411792304825285692501664954770428421192650595685867033100461325 3297772059297574758265640873672592624070223542789796858424106373503913554074 0 1485568215333423988575950879564287005976753322502986200562171726147595644538 1801303522829343122957107930346965473352647984929123105307280498836423727672 1 4263693471930631205087218173846134278776637826999643569114121697594342907171 652446404433583794241472448929619684302179456679166199672959170304504046613 0 1884094393392666526343440546532783821604081706052753464443664876415773265930 4107518907015460990035608735217156417074609853787203309058115949930119534277 0 7192761292420179302129579462205156909924714576978850592355619101400128850727 510733495867272632383278163124146978964317160213753708867355484243976936604 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 +411337116099653523186377089842514077566934151710983822344179875629296587910 4988356005643813253352107034008299697963474192498202501632040369234151966713 3945994345411684374342767537836167844977698085603182300469019625949659446136 9182360886 9182496403 1 1213337269994160551089214270692260830430500556170114199902717412762111700711 4319846670098361399007428988144477419929382151727071812406680530774387555265 0 3877147953313332631267667232279541477161542755274296668979048442484562298709 4289551697083415990258893107705104859734428273399562998524307946615246738309 1 6928606959330369984986048332699371859266909713741283663284549759774933405072 3640093229604211352584781221149171827273308735646854623942155573116416166410 1 663797212330153039137453773979382730863960362732349649909804527156332875959 367973299970382626221664449806508852152871930635190838260984316941086624228 1 5908987328770759333610561409183005543505397810772574714222753902822195430617 151128881568652397356815253637002706299781774900822866101087992765325335082 0 6518312616527922555875559192870341903101908504869437108833360959026969710547 1891397105510096985723644647441165160448663924515429135701515008468065289853 1 6535935727000391714129983877725609695546258380995360506234426218709460519723 3473737149138336423188220707552693769791107603568716766239853645374633264974 0 1111398542322955275642232710685486547654994735658593121919294714873337067086 6696819176246667785247952761535213223120451616033021601169174767435893145904 1 7036001968023354550439433391363599003208459923720676837442909435006859203650 3150794029606124794773538545427090480939899774208801493659022626049846916285 0 1388902182185825231805512993408451673486087680401807869977881375195765500971 5941526024567373576733920125211690653080543792265282550156640537613232387489 0 2457658975026282651809224233462477303694065141175806977939944914877851635960 2100642754994496395952680876757782721936679170892829542068557889027966288891 0 6647791568377385298418219967204907680880330151498300799943617117045338284496 4373436973967083480150830174056602623641795535203042909504871137969698769052 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 +6494865675517456010210280267676940510853729024619587054367779076675313181045 3744694715932664532768663629234934564149885755750912076242860936832658553165 3235451428649475619506853120678724296707249736020097302655487549747753024501 5101459545 5101560555 0 6830884007558750210962993335689536388527021386486130456385031189739923215030 453512897942809122209484560274506543987648574768366873923857207360266154778 1 6768472337209294189619549850212062752768955765739056441704718179807866044162 3414757855013672661535649330338949290961138394869530489156636376868142901298 0 3251981696961580630440403746268037556528578174627781143237630456855290339687 6442003550292730556167005659125810529363105148656377593337501958990859335064 0 2864994645784789416918041045219321949396583265357365021622332230518097191998 6331526654461695711612554763621138694020706436258345935698244640251487949736 1 885200231676332735051073247998263760807669123328100158034930887555973946843 5458747846701735344232692928160493108110458872137396697859220970031588273693 0 5006209063860062715914827580623437890608644863161880213039948205288803617321 4357965400719485262237351181821081164602850635099657226104988048828380747804 0 5908127886035096974297626255752382502390691621778214485259423574173337859370 5087884418833083362941659077199345322300016519271786143901014198015349032596 1 6159337175876658216106426967903564698955559119446442702090966125951311603302 6453481017249123594877017507648278188978428176092889945681609623746788991329 0 5055580138001222808696173976333294910467263482224279244021249544237132897309 3228971508098679320324279720546207475229932857229699328215552697057146447075 1 1337355183969559149681818546425687725180148386194210987443390464428806625342 7169059106911294860999943814703183303179686129653270537669415645576743476692 0 391031883971109325940003253167870802068617724057148533649453489426020713187 4820753111141417389453571017503008015538072038924407815595903020953843701972 1 217043577718438166422368777455460925010930055391118676459785211747415037663 2035063708470147329221904279253291736747106025237471886446388557016867857029 0 5114937658768038163729885210687010456615364262749813991183066892980229567805 165983176840206393201828159622224965246990948193802823173034006122445505961 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 1 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 +4507769755287284245435572638540915248992037120585052061403396080171239627805 1181224708408794035579334900136922907273603544202005990551905841144007950952 3653756965513191241560441143228922732492533217901679935044387648971801554679 14098143403 14098311321 0 3204169997055009537410194788857184181151965472595828417342557187410027679074 5283517693215333594157412288034814152213328039274407259749478260150372276849 1 2096562085845140483652754622579274616693192225463053336941398183614045409216 1207479515519387556864672015720317954271280091854891058254897160981864143497 1 2911071441423796742798261979412195712285870363662815225205097425473519019563 2504093394221189937185212946132813245582020217622525531061863573239534820973 1 7224937407256916052187941159017779793136800853641675758464973294976488798576 4287288081599262524308103867126119624343495639963728021395311175687737344957 0 7074570072000923463088246575720562781389176197501240361306487491542412787516 3935277971632671405736416702385816050459618477981881665183686206277497535828 1 7027785649997695049911275449817388485510252293749200847687457042695786618928 2488254162290954371567349975552099514326228976420440364139349673392494378987 1 4725484567202345993908220515873766977034614473468227986813041414013349809379 3796443343062676048702766991461672193656901254698771123155218771435549789897 1 2353200464697308656546745664503341423918098014806051207650763069249637875145 1968285897829881090658690108565023717421804137485342178711743222185912086885 1 3025367246581220709907066515629865004670665250334561102152012650375987945226 641801872013878203610315441225037905044042097723906258652577991259922174328 1 6062127911699953611465772876132793688387582324819285471053652052495624457828 2948879678590908170806325944519311807450053294038861014731807996017461785640 1 433999008105754345253355389083573815322921141197893563503394093520934774052 2763412027731165150652915370342173279290073510040568723489368696934578922489 1 5938232201967491247638616546715155166566625733512424076841629684437384320514 5694422345189995789905960415844327373497012147821263043890862395233726464851 0 363696729989039724101471405674845211120094790380932977487332671287344829523 2630419048351296609434751892703656844892216977058431289200366088972077954615 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 +141749666139715570332682906386407181904235337043725718674933152487607954622 3333348711374211921102026469745881578569366964552256172642935015094024438674 1652044898383032999235907846737783609631013335899941454459008368556238402615 3758314951 3758401650 1 6402237175792995432768674101572782160764129899948650367428488196160131135100 7035418722715687657764896507760597462843809822497935196530430903503259049759 1 5539231084181863197248303908309971148940374448696262251757255165549829897306 1017916012174788930375509773772396026610656467926429375619625974920232111545 0 3306231160815781379892440310422990848624552959001612235758034308939616721819 802372745015624038532917154793455462108451897487837519765498138771661816652 1 6002383270467966960992772931553986918399217869044811438652063351921146799052 2356475130050049455566492246308990363151095007898567800603384281492328937769 0 7099787963319198676418155780869295240812343098920852435344752316573577451202 1061018844388180009549000270889689670897636616130968675985376616746584742593 1 283962964585724660120472893279704075857292898359161859527930764483407522016 1084662366651101645595287543978661401777647642384059801131598184330892725139 0 6916360314277873154643751440021692571779503060615750237113213668787929928840 2432809058784852891452845380327772008514951950825799772842227142058908356401 1 5274777238731582877395632589889055452296412339967097706608107445376022403891 6701364963434738914676836409108915738938200851328675688284265442871748654927 0 1589765706149307142076196204176084610779962361940193625993406835135963444720 1437824186653672340436829097506412069618783146151076575946052620150687329407 1 4637730955415521047667606427591573517944838418711054406169234781868447955481 6755078563501457476945225961735388442523039187540518991460794683753855673623 0 3135366521075050143482112623954662451779738000317962028576637588153573105236 4135576973833282303488485510561786267578979444094665249617963208052362975504 0 4303282446218706518828599857471996926824950562688557180143588747315714889523 2574080585760863692232652064130459736494368108692541193185808673769014362544 1 163640069797425613178011720592509129691551258434111466205497872043906326105 3115600098334398370817251574903370372248321068970469017442560378076288064858 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 +279441146498462410410732086723867344872782597670609747073771637000283059299 5966692381167310800193028302539593729301366660882159971435967098979737355839 5780671495374619121491398756250624266269653299541889714959085380814698082729 4135632931 4135723878 1 261414124426053034276151876684553730038430984343871762681797414808905272159 3960910091033578050938528246219348263417833650261190745171451599461387888627 1 1500026447978448485055083278826834484107240020740485689384170065935345242558 5301534077225858411667536439392054508529688929911594012944955903744876546527 0 2179550771499826494532629167009605868182013626978725325708529016967622403028 7217009736027799458065584063848945986933317151724625726896343100476484639273 0 6085304839268543786925949507468740440612795104545931333919553594921851024765 6937037442378861182245692031560751768714334261119104177225949104192862253920 0 1526733904699165659631456237549989060726178132911179714884676699727918063899 2539798537039258320707045442527934165691684719930221847928670976179949914189 0 2136696935499944379118241396626393990075330620393872891025524466001013060948 1453908050156035725409003827978402677516071877908408721103991559421140563959 1 1673237278310974112723430900828314741996762617739648579844810991136766818987 1416199759131816265939416729461407210381087049942593761532806089177914391328 0 5544010019953439881295223430685584968468585895609307846920021411305446043790 152262618308261061717540359687642636907783820340848537805087055064309248508 1 3073411661341192865866691548583964138989728184966499304258797234997562279213 184477375203467148864149971247161819944527598395550691899957028458471208496 1 6185936762402345796977578084676999200005301791125869425584114767579151643594 6440622631584540131973485916151884459481738284704045684156468641949242130862 0 6895738620209302281138746759447504145815111410890718900255477237032313766591 5147671081548472329144927704858738169833958656991475247014232880089902524340 0 4128881258858919183926127905455072752308185987758250449220340863634958276186 2445151746665730085137191693911106554016922471054472153293577382909543875402 0 246848846927257060596821434665218835332295763904111594271401788884109241681 6917423617096940902755917577082785011643411351216872803204018177392881001885 1 5090748703440058322533835386773067184446085706853048507371361765724182261898 6439320730109434853942508615259018952321623190328681292899324119434553793009 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 +2463814192882634761552351463485386305428611070231266507161413600633295380614 4778906830490187930215189253646428414307435489374590602970540705667264738539 6358033313713670113509879284854276922700069148689667191872065591892013460105 735840703 735879066 1 4512065812986145563941264531894313695479335967731711176418190398027491962880 4585618825582368349499745260413842980212631325421530007148608245328925141246 1 7093693253549919846553424774859122897892086068838245144109189217996740116320 6115162075500795301443710100306069364302210311550869033625039430024857616734 0 403064179756851105957547784199363621758777460547089593730669528879929613328 1180613057220425327181047919592246491095451808932492004402339068808593471129 1 2885158119546066399489944764644183924157662068467965189236390535726954371922 4169064460047428901045190182878408608704821291529294041757264628008523110874 1 356423496401006082414701770984193487292218990514739448385183066509498705689 5770813269554688072373531960653914912171156879213048212458306156543326356676 0 5413731857047685210478408313269839865661565899876748993435058618321910865617 2848368885410613343943620956747544168879620646078073752839883617235736013904 1 3318623337358983557935904062531702306375053643466027065756884396192989143931 4806091054067513868140832714045223737720118040722960566021973353441755605776 1 6324690886794011902903272373509912459577531751974863316099766992150308453881 4112508869541298507165020958889891268983678599675909056488778689809508927929 1 5907774979176326244451198049935500663344575713705219702148631491018318161987 1656270812224087025891240244947019714403423191631150747861884891504904621647 0 1751577605888498108735460156103977991312424389575876440088003157355603770819 363462346329462633371279111811508003858085681754417412435613926903196415840 1 1885354518060269076700334959349621218760822515042256908352829062876886393771 2932906257113124515027389705031142046049958301860948710482122296291299655681 0 4996119063426274032509638264605298813490634408072232325484569080398220686033 539393338901446711755805859276053253054425088158568787433590781569232207409 1 3126411290698103152078171494198189830736859833591219303996251002631133114554 2600988401240805938641258698527546666274311363547560874328379455155722590001 0 4073581508767488842240973097615097844012564888019022424596994459539521427923 1379106626301444027278101436290204624862653675570837637159430865555825229013 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 +5608567249978964933956935577203240539635572717155822739820717473313958492072 5575199646388088258281681597445059416290917824448087191577360694400633201364 2101054498738664279963901074742425894279274657248580052597303055234268156417 15711706011 15711883278 1 358996678377150844516425015445500216676596278759409456313101512349467699855 517675722670904264614507014017338276130612221250348304794881602264677673434 1 5898948687329936985435021261037024475838819577972086585488017024296604792376 2887679317114890796944762050652795819367635960441536130657376753512737948112 0 6588240577389597225443538951170623904996994032731114155142691604578549134514 4980096069309813428193077002360099948294327969330474744953310649379200484131 0 3258120603730247992086840210789448304809748525451433009930993960634444750203 1168475148193933730735649358116290231529110624554862207946919760595284206407 1 3619804300672088607357464258645585223151242307844862568450013965626797895512 1973741125903202695984182624410799279955612878496825769638089928747169260364 1 2945799992553282621812701691659521267953871238909202801965089105554740448962 5484384459521449483493927344440025387918873660982010001818176365457482845099 1 5010748015736433353239703737186480124509568508679098382343906891226618694887 2603428095128047683911410381675481396018416362510954969639725189440480399486 0 402719221760775169780360824263263050198640714331215683498971539938786273053 5815571282464605893723330370105081222273928484499556702843344299761681489237 0 625607516934213888586867713295111758923053395256753966555882286642932669719 608531790569207139268200521928140804591584179107911545361339649141085292344 0 718231667291626200124809010559220902455509669071563391472666539834822052277 4969247555659748947335484518998553409232418531743378854387013958863310732489 1 6505137865549212258724930735113180051914217038958288504419281055597582683715 838277864920760422237377806519091571486729097147004613343393975135452766550 0 4193356029790868430474934347338083466745554601344433669530866249804531739167 5712381951623240314459823259852882707421816755425537865452382538833337652352 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 +726639462345983603074180541432929429251095458347805329190886965966837323755 6924618769390453088339123042806473175496678493493444256044789288252187244194 465538450318191790449631921497270257612220156167391048841158540608532368205 5677356961 5677463520 1 2217992452175053254539050348639337486034074666902438458040182145291152134131 6340224100831406537022077953455450557181244291788396718789469719873138229561 1 6192021770369850879489793362764873978868136506758630335682195306148710175140 6917853170561700417864476212964382085300785822230116091207648622633309994891 1 674525225684926902677985814492528807396883268933200497114708002801843575341 4045001524224706703150409765025577538545091142326248159939913468496452769510 1 712503002553676451885374333409761679127067106667749142407726414733495739815 1796864304793163254066025670726940011770487223751113171714478271854392557363 1 258070336569246732459901226371814651224006482978441800553753988929090248120 4211421129415068668236863174011719399233950954358513178303097140773600750483 1 149264390041914695691418766308161056516558430647605688179576329996821481566 7027439260993284112172315195999461799876688126136168582065917630253240577620 0 6272730828280153123286303256465559818064894117617495925082380208900882049499 6031374650197103929022827405811919914711742509911552164833674416891221968564 0 4787129423994484305809255819281020222292773811843451810318465278854822642689 1533361886100286072633623837329028708371755117329317296246317608718885927848 0 3225159101065529204491749196710284975560782549809458514733322902717649238983 2013610505313703561941757762655425636954963272817303156308071181222949686016 0 4259217480452626141745368986148066316258543823809968675411726130070286144768 5353337225941023788105942628362915194097428191434766454866867669849680443375 0 2480945456196614330103532521953201989881252061956788637201872865988558651559 39083459107935642933375151291211598966667982631753820829079052597598380191 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 +7029453728397252411500109468765427644675606300588624066264012346361857758174 5821884350582681802280024642454030715477514297979153689130247741366127335706 1620121574545333832866153123005926509566403634949471224083986574853498571635 7301092380 7301213220 0 1138450458390094426112561322063251368680268882030663199810094323124555412902 3099687930727873114810793539413286489867834835527318768045833678742554144406 0 817893902928073426320055028498516173969485374002363257619443108302253183291 1706107399468601056068856852723708770816768631295579883694925864234379831985 0 4331951123543704415477238916966750641548450742275863914708318821319439887107 2240308890508888746758907737290168436693901096457783411778054330699834120261 1 3424326963759029833770039825783546074667884920946247361248121292888599766628 3410329567720119287258372499806535091649387626145389336164479355408319270492 0 2437387269011880096699081283137160204898257435523912836204087644424957306535 894485048539124860260051265978186873548451437966645282175872722261423564331 0 3192261504453142021360661306375124387076811739600097027493115852621170103982 4715214198023919569162870620261595521973606177307904244210402668787471472681 0 2781847266927822129598263169883161840041247002967548503994116908537927709105 4046885503602929468221589963692122684216483936356230053811553368892458234513 0 4071421432567568596041965283909904110079936846826540672564664838376547491787 3909486806189716730495456615284885717055890911772480684818336135225410360081 0 4502894246418282964976028667139913704763960332767200021904600078233782792650 5111376015454457396122757517136128425165516320716359777882671346295216003193 0 6822395443397155720468506830209035564877505182262522500369495376387610848120 4256130175362539484890043936005014293686834628190122807631270275824711161868 0 381587827077940780343700252948305267828895242687867325974328645516175905370 5076054685263388639846366083418591669610196374827711443108751702880918545735 1 2716624735279808654707628380114972718089722437294438951140070219003606061823 2863726410667765097528054096725854005399123885023985318551050900789164853757 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 +END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/compact_cert.zok b/zok_tests/benchmarks/tests/compact_cert/compact_cert.zok new file mode 100644 index 00000000..110b935c --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/compact_cert.zok @@ -0,0 +1,207 @@ +from "./poseidon_struct.zok" import DoubleHash +from "./poseidon2.zok" import poseidon2_batch2 +from "./poseidon3.zok" import poseidon3 +from "./poseidon5.zok" import poseidon5_batch2 +from "./merkle.zok" import MerkleProof, verify_merkle, verify_merkle_batch +from "./schnorr.zok" import WIDTH, Point, DoublePoint, QuadPoint, PublicKey, Signature, verify_signature, point_add, point_mul, point_double_add_batch, point_mul_batch + +// Reveal Proof Entry +struct T { + u32 i + field[ro 5] s // sig_r_x, sig_r_y, sig_s, l, r + field[ro 5] p // pk_p_x, pk_p_y, pk_q_x, pk_q_y, w +} + +struct CompactCertProof { + field sig_root + u64 signed_weight + u32[ro 0] t_i_list + field[ro 0][ro 5] t_p_list +} + +// Verifier of a compact certificate function +def verifier( + CompactCertProof compact_cert_proof, + u64 proven_weight, + u32 num_reveals, + field message, + u32 merkle_depth, + field att_root, + field[ro 0] coins +) -> field: + u64 signed_weight = compact_cert_proof.signed_weight + assert(signed_weight > proven_weight) + // let num_reveals: usize = (k + q).div_ceil((signed_weight / proven_weight).ilog2() as usize); + + for u32 j in 0..num_reveals do + // Reproduce coin + // field[5] inputs = [(F)j, compact_cert_proof.sig_root, (F)proven_weight, message, att_root] + // field coin_hash = poseidon(5, inputs) + // field coin = coin_hash % (F)signed_weight + field coin = coins[j] + + u32 t_i = compact_cert_proof.t_i_list[j] + field[ro 5] t_p = compact_cert_proof.t_p_list[j] + witness field sig_r_x + witness field sig_r_y + witness field sig_s + witness field l + witness field r + // Sig Opening & Att Opening + assert(verify_merkle_batch(t_i, compact_cert_proof.sig_root, sig_r_x, sig_r_y, sig_s, l, r, att_root, t_p, merkle_depth) == 1) + // Validity of signature + PublicKey pk = PublicKey { + p: Point { x: t_p[0], y: t_p[1] }, + q: Point { x: t_p[2], y: t_p[3] } + } + Signature sig = Signature { + r: Point{ x: sig_r_x, y: sig_r_y }, + s: sig_s + } + assert(verify_signature(message, pk, sig) == 1) + // L < coin <= L + Weight + field t_p_4 = t_p[4] + assert(l + t_p_4 == r) + assert(l <= coin && coin < r) + endfor + + return 1 + +// Parse out the inputs in simple register - memory form +def main( + u32 num_attestors, + // For compact_cert_proof + field sig_root, + u64 signed_weight, + u32[ro 0] t_i_list, + // All memory entries within T (p) + field[ro 0] t_mem, + // List of pointers (input format field[0]) + field[ro 0][ro 5] t_p_list, + // For others + u64 proven_weight, + u32 num_reveals, + field message, + u32 merkle_depth, + field att_root, + field[ro 0] coins +) -> field: + CompactCertProof compact_cert_proof = CompactCertProof { + sig_root: sig_root, + signed_weight: signed_weight, + t_i_list: t_i_list, + t_p_list: t_p_list + } + + return verifier( + compact_cert_proof, + proven_weight, + num_reveals, + message, + merkle_depth, + att_root, + coins + ) +/* +def main() -> u32: + field message = 6908441180828167112785246881494320159273940089327447106269949444716788494909 + + // Let all attestors use the same pk & weight, does not affect performance + u32 num_attestors = 8 + u32 weight = 5 + u32 proven_weight = num_attestors * weight - 1 + u32 signed_weight = num_attestors * weight + array_decl PublicKey[num_attestors] pk_list + array_decl Signature[num_attestors] sig_list + // Constant folding to avoid constructing new blocks + for u32 i in 0..8 do + pk_list[i] = PublicKey { + p: Point { + x: 2023776050662786605020065854616777351003832247628992350849206310281785027488, + y: 1079270832837170318396516616249394502719834190979906495690419930531357954746 + }, + q: Point { + x: 7101684830137506950821434332972100736705268320764486193269722119377250644660, + y: 1764840689618624173098512281158161439147043396136846829753116276022936136130 + } + } + sig_list[i] = Signature { + r: Point { + x: 5824293800188062938533237344790739102726705128562220570802448947038150657007, + y: 340848841123394720212279364279745606262149681372696003943728267198931244360 + }, + s: 4415915127126372096757067153593537022657929051278082364476489088715040314973 + } + endfor + // Pre-compute merkle tree + field att_l3 = 3568540802966646228682833257557760865097881745527951700421217637177394578913 + field att_l2 = 2484212816056817413898735043111201825935337234900653303346593633698983423094 + field att_l1 = 5903852974969142884799701163972075918012827147993384813454715036777418930530 + field att_root = 5370923878175693173927301385262983018969346333984379995904147798742460333298 + field[8] sig_l3 = [2143011384822392262595217693211276733745818975285573378412503830433633959080, 5158845522944913588713567773900368475672965537784145747547478088857012853666, 5894431764744941209369386797811063446586114379583965613751294306331542502696, 3667283647262791680030373214327691510807066264550220904438401348778560171091, 1932762137729700956492443572973924935698339638272997763907569306777878106609, 1418160613934592350074019113722063326372415219334378482966622875040143984418, 1123602082019234105093136610853837217580120360581368113294785447946335970166, 677162234791219704923474809188832072777286476135280817077786787139967839874] + field[4] sig_l2 = [4160497668328416341124388728115946100594341504290452585444083838585144458368, 1786009993478681170835177129397965607571769106910016212295375778662767436399, 6323428707993845638065745016939134132792346703598261115088661703160553949516, 1179006504278106626617144731083403287975523722023953894416803973871305137607] + field[2] sig_l1 = [2082031909420678479574926408191366694068435842853798548085170995138065656765, 2509162190273150374531803693747128200974026349740956653847078957273579771806] + field sig_root = 2845540671766269799140204035187166219383492292318390575781563565945781070871 + u32 merkle_depth = 3 + + u32 num_reveals = 3 + // coin = [7, 30, 34] + // entry = [1, 6, 6] + // All bits in big endian + bool[num_reveals][WIDTH] e_bits_list = [[false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, false, false, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, true, false, true, false, true, true, true, false, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true]; num_reveals] + bool[num_reveals][WIDTH] s_bits_list = [[false, true, false, false, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, false, false, true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, true, true, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, true, true, true, false, true]; num_reveals] + + CompactCertProof compact_cert_proof = CompactCertProof { + sig_root: sig_root, + signed_weight: signed_weight, + t_list: [ + T { + i: 1, + i_bits: [false, false, true], + s: [sig_list[1].r.x, sig_list[1].r.y, sig_list[1].s, 5, 10], + pi_s: MerkleProof { + path: [sig_l3[0], sig_l2[1], sig_l1[1]] + }, + p: [pk_list[1].p.x, pk_list[1].p.y, pk_list[1].q.x, pk_list[1].q.y, (F)weight], + pi_p: MerkleProof { + path: [att_l3, att_l2, att_l1] + } + }, + T { + i: 6, + i_bits: [true, true, false], + s: [sig_list[6].r.x, sig_list[6].r.y, sig_list[6].s, 30, 35], + pi_s: MerkleProof { + path: [sig_l3[7], sig_l2[2], sig_l1[0]] + }, + p: [pk_list[6].p.x, pk_list[6].p.y, pk_list[6].q.x, pk_list[6].q.y, (F)weight], + pi_p: MerkleProof { + path: [att_l3, att_l2, att_l1] + } + }, + T { + i: 6, + i_bits: [true, true, false], + s: [sig_list[6].r.x, sig_list[6].r.y, sig_list[6].s, 30, 35], + pi_s: MerkleProof { + path: [sig_l3[7], sig_l2[2], sig_l1[0]] + }, + p: [pk_list[6].p.x, pk_list[6].p.y, pk_list[6].q.x, pk_list[6].q.y, (F)weight], + pi_p: MerkleProof { + path: [att_l3, att_l2, att_l1] + } + } + ] + } + + return verifier( + compact_cert_proof, + proven_weight, + num_reveals, + message, + merkle_depth, + att_root, + e_bits_list, + s_bits_list + ) + */ \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/merkle.zok b/zok_tests/benchmarks/tests/compact_cert/merkle.zok new file mode 100644 index 00000000..6c84481e --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/merkle.zok @@ -0,0 +1,48 @@ +from "./poseidon_struct.zok" import DoubleHash +from "./poseidon2.zok" import poseidon2_batch2 +from "./poseidon5.zok" import poseidon5_batch2 + +// Merkle paths are now directly supplied as witnesses +// struct MerkleProof { +// // All internal nodes on the path +// field[ro 0] path +// } + +// Perform two merkle tree verification together +// Both tree are of the same size, opening the same index +// Specifically built for compact certificate +def verify_merkle_batch( + u32 index, + field root_0, + field sig_r_x, + field sig_r_y, + field sig_s, + field l, + field r, + field root_1, + field[ro 5] entry_1, + u32 depth +) -> field: + field index_assemb = 0 + // hash of leaf + DoubleHash cur_nodes = poseidon5_batch2(sig_r_x, sig_r_y, sig_s, l, r, entry_1[0], entry_1[1], entry_1[2], entry_1[3], entry_1[4]) + field factor = 1 + // hash of internal nodes + for u32 i in 0..depth do + // Depending on index, cur_node and proof[i] will be on two sides of the inputs + witness field next_bit + assert(next_bit * (next_bit - 1) == 0) + index_assemb = index_assemb + next_bit * factor + factor = factor * 2 + witness field next_path + field state1 = next_bit == 0 ? cur_nodes.hash0 : next_path + field state2 = next_bit == 0 ? next_path : cur_nodes.hash0 + witness field next_path + field state3 = next_bit == 0 ? cur_nodes.hash1 : next_path + field state4 = next_bit == 0 ? next_path : cur_nodes.hash1 + cur_nodes = poseidon2_batch2(state1, state2, state3, state4) + endfor + assert(index_assemb == (F)index) + assert(cur_nodes.hash0 == root_0) + assert(cur_nodes.hash1 == root_1) + return 1 \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon2.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon2.zok new file mode 100644 index 00000000..bb8b17f0 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/poseidon2.zok @@ -0,0 +1,2353 @@ +from "./poseidon_struct.zok" import DoubleHash +def poseidon2_batch2(field state1_0, field state2_0, field state1_1, field state2_1) -> DoubleHash: + field state0_0 = 0 + field state0_1 = 0 + + field c0 = 758662019503705074 + field c1 = 9958560809385864598 + field c2 = 1277576466825840593 + field c3 = 17276116445666047290 + field c4 = 8462567671021664875 + field c5 = 18311663567274789012 + field c6 = 14794487373875431679 + field c7 = 939955959186974556 + field c8 = 13578068033787386336 + field c9 = 16936160577869353999 + field c10 = 7564443307661759393 + field c11 = 5701022615025077794 + field c12 = 14898040799158503403 + field c13 = 7398753701805340846 + field c14 = 17145662177513207623 + field c15 = 15919612504434736882 + field c16 = 211911121069562741 + field c17 = 14627162831253564776 + field c18 = 3736731127424592191 + field c19 = 16164080792556653606 + field c20 = 13310103488076492265 + field c21 = 17714184600411987649 + field c22 = 13937509549526454080 + field c23 = 8467973550572764378 + field c24 = 6149415607253035464 + field c25 = 9902966326901151535 + field c26 = 2299003035066075543 + field c27 = 9361464291309771166 + field c28 = 455760044697694737 + field c29 = 18069040773191725180 + field c30 = 12156451030386903890 + field c31 = 13269466490844642616 + field c32 = 4644627377627776228 + field c33 = 11517517066878151266 + field c34 = 2085762791679771559 + field c35 = 14341814612745946357 + field c36 = 8220722365145856681 + field c37 = 13781050119424493396 + field c38 = 14130172974922698924 + field c39 = 1268378720849035897 + field c40 = 13102522127585690797 + field c41 = 6435545073175926153 + field c42 = 10680323768845634897 + field c43 = 5377035848961467433 + field c44 = 16155044248960735250 + field c45 = 3956646720460237409 + field c46 = 15192201422078376101 + field c47 = 2254261886235227853 + field c48 = 18263210726053991346 + field c49 = 14588739567027142820 + field c50 = 9572725267846457115 + field c51 = 4663609806895345720 + field c52 = 16822560014146547002 + field c53 = 12821481803562047313 + field c54 = 3027425978972870548 + field c55 = 16762600845752241175 + field c56 = 7067459971848174565 + field c57 = 15884202556186149044 + field c58 = 8501625320175123709 + field c59 = 4388367812943946907 + field c60 = 12299931046827323210 + field c61 = 7636538909023199578 + field c62 = 14046758094336955416 + field c63 = 9633246818970530654 + field c64 = 13491266525055530545 + field c65 = 5423497366234120042 + field c66 = 1751962590333377264 + field c67 = 10513677123715294214 + field c68 = 996968784189528765 + field c69 = 10448850931434990018 + field c70 = 8953917554828103116 + field c71 = 1626108945262700028 + field c72 = 5891489572384527092 + field c73 = 6643806719713918869 + field c74 = 16083801189239088971 + field c75 = 14868933033345963433 + field c76 = 11850469235653996642 + field c77 = 1324483046183023543 + field c78 = 15183755263354743993 + field c79 = 2495724238845411316 + field c80 = 8731170262888399569 + field c81 = 16304783671381988951 + field c82 = 11235544699283452233 + field c83 = 2137768936382175302 + field c84 = 16675115627845335581 + field c85 = 2963350077420008404 + field c86 = 5398589702654192916 + field c87 = 12140466249394573251 + field c88 = 11834547998206516929 + field c89 = 6177294541684099188 + field c90 = 9838863225522131903 + field c91 = 4701779667688073310 + field c92 = 12835837905699815771 + field c93 = 2968170957340817290 + field c94 = 9828791715764525853 + field c95 = 8442028361006693278 + field c96 = 17176968168399522482 + field c97 = 17999791729505949887 + field c98 = 14962719204200253756 + field c99 = 17300730933512754375 + field c100 = 4222119091375155707 + field c101 = 11298113638119509435 + field c102 = 12268859188885459376 + field c103 = 9034427714391492438 + field c104 = 5990277340027239801 + field c105 = 726299115287076863 + field c106 = 18303937711932738539 + field c107 = 8960550811937596675 + field c108 = 18420334683743066202 + field c109 = 16986003784188475276 + field c110 = 13588430238611272524 + field c111 = 18102499241351263781 + field c112 = 7476618494341797169 + field c113 = 4184084235455659562 + field c114 = 5668298044436776508 + field c115 = 17447913737721385190 + field c116 = 11088130260910156172 + field c117 = 8792531517070849900 + field c118 = 9397646851851459952 + field c119 = 5121871193730760910 + field c120 = 2168557202402322871 + field c121 = 15702569595864319029 + field c122 = 14720843552400861125 + field c123 = 8277634810410081765 + field c124 = 6233674368436885280 + field c125 = 4306433523940866942 + field c126 = 17722591435523141845 + field c127 = 13983984591359038932 + field c128 = 9195938109190900291 + field c129 = 6074479640755470700 + field c130 = 14078059641315677730 + field c131 = 10695375213011552670 + field c132 = 5573015714231677140 + field c133 = 16984666835191674642 + field c134 = 10249524339733897711 + field c135 = 3174518716637848153 + field c136 = 7188570775991726809 + field c137 = 4753011490148598290 + field c138 = 5105443631000558491 + field c139 = 15781086678953962161 + field c140 = 3458297099390436339 + field c141 = 3082524552292086 + field c142 = 10885272710257457992 + field c143 = 3236146052509314745 + field c144 = 9696124289212404307 + field c145 = 1485008535953646698 + field c146 = 1137225154782514508 + field c147 = 10514784977699897262 + field c148 = 10729284392631787423 + field c149 = 14959018802228526836 + field c150 = 5311814720150441561 + field c151 = 15855390943452519568 + field c152 = 11214465269186418739 + field c153 = 4053806423852004669 + field c154 = 11760999889540157928 + field c155 = 13155611628497688688 + field c156 = 3842739007828054055 + field c157 = 5711430659662298364 + field c158 = 13288819076998297778 + field c159 = 4820382956965774345 + field c160 = 9818136475875046170 + field c161 = 15891193043142164602 + field c162 = 11369901158293474981 + field c163 = 16014685768489088745 + field c164 = 1356361795046325322 + field c165 = 15790892392481609398 + field c166 = 14921870878617925995 + field c167 = 7687231355395058862 + field c168 = 14150434200392676099 + field c169 = 1103438709908116920 + field c170 = 6477771864968923918 + field c171 = 17883003884435853137 + field c172 = 15616808237597542650 + field c173 = 298930612681613218 + field c174 = 7783145673030144050 + field c175 = 9925877788921434933 + field c176 = 7906428066733709088 + field c177 = 9059024899257096185 + field c178 = 12128791653883821821 + field c179 = 10439342184366574094 + field c180 = 16838255109359414152 + field c181 = 16778733411203605167 + field c182 = 3209921692078731530 + field c183 = 5829411678714675631 + field c184 = 13546305324682002944 + field c185 = 14388669943129102066 + field c186 = 16955277212659953284 + field c187 = 470060073341462642 + field c188 = 9865599081512514471 + field c189 = 3450866718365881982 + field c190 = 18253332465868317974 + field c191 = 8224383463926128747 + field c192 = 130168533448866398 + field c193 = 18296913789182388911 + field c194 = 9308875868804582517 + field c195 = 6860185202164278388 + field c196 = 5870361400608292852 + field c197 = 3853169742702299288 + field c198 = 2828579906117525532 + field c199 = 8244689163068534246 + field c200 = 14622287387679457865 + field c201 = 12818724415397588863 + field c202 = 9032795459261424103 + field c203 = 8582165566672449484 + field c204 = 1212546459474121359 + field c205 = 10720339750995594781 + field c206 = 9969473243746656646 + field c207 = 11889569503442370601 + field c208 = 8693000785136236266 + field c209 = 16911102564849626327 + field c210 = 10711317080423442023 + field c211 = 4092936164155659784 + field c212 = 9444614550731573011 + field c213 = 12734967290928938181 + field c214 = 2968663829197022452 + field c215 = 2063412078139901611 + field c216 = 6756409496657354005 + field c217 = 1956289224556834622 + field c218 = 17971879772361152496 + field c219 = 11129036599170922734 + field c220 = 6015714579300332596 + field c221 = 13952747316952120325 + field c222 = 6512928506883814256 + field c223 = 15000527898579580837 + field c224 = 13438817240481151739 + field c225 = 3438974907999726212 + field c226 = 2675270561650848698 + field c227 = 10615408741625344128 + field c228 = 15097127622747154430 + field c229 = 18306211703619792030 + field c230 = 18282207759862860963 + field c231 = 3969670710369869305 + field c232 = 15355909293594283010 + field c233 = 15825197601644123886 + field c234 = 12025247290627247881 + field c235 = 9244373186029472974 + field c236 = 8111711196724032485 + field c237 = 13910625786903113352 + field c238 = 4303582664435413453 + field c239 = 3615529122737143133 + field c240 = 13220640289699986291 + field c241 = 10945048589905126881 + field c242 = 18345446024459547893 + field c243 = 15246969291153869719 + field c244 = 3339771865943361715 + field c245 = 7920776184990771299 + field c246 = 11282075447781111045 + field c247 = 10409571270584994188 + field c248 = 7215903119088030248 + field c249 = 7149080371149851697 + field c250 = 12805983536086727637 + field c251 = 11544704273904429996 + field c252 = 3056733444472163063 + field c253 = 12775412729058442397 + field c254 = 10120906816355467459 + field c255 = 8580478192693828704 + field c256 = 17569548953071784548 + field c257 = 15170454632914839133 + field c258 = 11570807611472296007 + field c259 = 10726909497040777105 + field c260 = 440756088013805182 + field c261 = 7569336675219092295 + field c262 = 10579530867946972688 + field c263 = 10974325257620388506 + field c264 = 3053362977696829619 + field c265 = 17168463938106116617 + field c266 = 13835667625615860908 + field c267 = 2095873483773389479 + field c268 = 2016987140591259174 + field c269 = 2386979931999911847 + field c270 = 2505164847016101177 + field c271 = 13627451220086273527 + field c272 = 5731572550841603667 + field c273 = 15438639334109998771 + field c274 = 12813614048997555325 + field c275 = 10186814175982828107 + field c276 = 16191184896882054112 + field c277 = 14703692647542166085 + field c278 = 12578830251623636174 + field c279 = 1883855031971540983 + field c280 = 1266038367760006278 + field c281 = 11230634812224943920 + field c282 = 11308504110418640097 + field c283 = 6328296428453151721 + field c284 = 108818186627960168 + field c285 = 15547570943643535551 + field c286 = 4315257403857009861 + field c287 = 6380448982060371429 + field c288 = 632889842882717873 + field c289 = 7687981897540030037 + field c290 = 2375004428285747026 + field c291 = 1352206380036636795 + field c292 = 2578260287095025994 + field c293 = 2465523090448545549 + field c294 = 4247285443750660784 + field c295 = 3540885980673334329 + field c296 = 3345957484484543597 + field c297 = 11380792058791615855 + field c298 = 3199862384571235298 + field c299 = 173879172622348856 + field c300 = 15209080508353549507 + field c301 = 11649978506589666631 + field c302 = 9173090522521364544 + field c303 = 17030945052114083432 + field c304 = 4591187677780222237 + field c305 = 4064474173561892218 + field c306 = 15789829170657683922 + field c307 = 18208193905710242077 + field c308 = 14715997988505596440 + field c309 = 14667972935108688793 + field c310 = 5685168615648408563 + field c311 = 5245239484537042399 + field c312 = 3667459350052205975 + field c313 = 9197423732344085415 + field c314 = 4102452659988315248 + field c315 = 6641847341527232917 + field c316 = 12480319858851986779 + field c317 = 5186375792939856127 + field c318 = 2950251364917852338 + field c319 = 14773928965023494669 + field c320 = 12693729432082377979 + field c321 = 10022034381199683741 + field c322 = 9157237748502939080 + field c323 = 9663275337098404028 + field c324 = 13452894763307783925 + field c325 = 17376241946508742183 + field c326 = 3061844045327119072 + field c327 = 16030845287947531828 + field c328 = 1329076042067568487 + field c329 = 6855142122269391811 + field c330 = 11765672489282549160 + field c331 = 16830774944875965381 + field c332 = 6521069374664264162 + field c333 = 643523635231852913 + field c334 = 17135479068108868253 + field c335 = 4691294308622704824 + field c336 = 14491408402222977368 + field c337 = 18443726244814588799 + field c338 = 3981855558016600424 + field c339 = 6519895386704965259 + field c340 = 12833833766931651330 + field c341 = 5955046055337035381 + field c342 = 12102114200670204984 + field c343 = 17975981029431378883 + field c344 = 17148695856475432045 + field c345 = 4359514157740747375 + field c346 = 4733737572453903189 + field c347 = 9216164030888884101 + field c348 = 11898192372834399996 + field c349 = 8293149570945521798 + field c350 = 5292998910181620016 + field c351 = 11065412642848915128 + field c352 = 15951602728119640232 + field c353 = 17250120023723813262 + field c354 = 4208067670865654520 + field c355 = 4170990196992221254 + field c356 = 1364275915544901155 + field c357 = 5204734139073276471 + field c358 = 1348335617598418065 + field c359 = 4844946001170596348 + field c360 = 6839747835867181919 + field c361 = 5053317630835107264 + field c362 = 11056210036248139432 + field c363 = 1381878963923170929 + field c364 = 16574699770444639361 + field c365 = 8108738101012231328 + field c366 = 5608591239825657577 + field c367 = 2655890021744410286 + field c368 = 1274076210795298659 + field c369 = 11394663484515968481 + field c370 = 10856028813008380196 + field c371 = 13953897966883300641 + field c372 = 2480138023543998637 + field c373 = 8092805429879378234 + field c374 = 15734383915406361638 + field c375 = 12606199089969720633 + field c376 = 3432862751254991632 + field c377 = 11620001581001631894 + field c378 = 600733227997580875 + field c379 = 9960515431061710391 + field c380 = 15489520790087945179 + field c381 = 9888006245836622059 + field c382 = 16555061763510382783 + field c383 = 5729882798372086417 + field c384 = 18193672778018355673 + field c385 = 1822658993478572731 + field c386 = 5003044969628961755 + field c387 = 13153107988347151430 + field c388 = 784457190336231507 + field c389 = 13520638662186896236 + field c390 = 2049546776680600500 + field c391 = 10461088023685880055 + field c392 = 14926219627271786921 + field c393 = 17417636229842539696 + field c394 = 12492153963185454352 + field c395 = 414142119733528902 + field c396 = 17193096568008516286 + field c397 = 17273750640915671574 + field c398 = 2591282858188044874 + field c399 = 1735410450107017713 + field c400 = 10687387921399705460 + field c401 = 8183629028325381283 + field c402 = 10514917847412402927 + field c403 = 3336665081692857317 + field c404 = 5051946386531163563 + field c405 = 9781529663474696061 + field c406 = 13935324224847496391 + field c407 = 12199928622022129120 + field c408 = 18046988489253129363 + field c409 = 5360148275199876436 + field c410 = 4470351170521662089 + field c411 = 4053340142176580658 + field c412 = 7099987801407623156 + field c413 = 8643889260231910466 + field c414 = 8009486459327768919 + field c415 = 14356550044319110877 + field c416 = 1414693227423376523 + field c417 = 4179767940638916940 + field c418 = 13567672199210649738 + field c419 = 13138927205843206565 + field c420 = 215760839592843100 + field c421 = 16441790535445707930 + field c422 = 11718341735146782011 + field c423 = 12912429887242802458 + field c424 = 17517646119074274016 + field c425 = 7879023854534232228 + field c426 = 8728793248242325455 + field c427 = 5947682549087889590 + field c428 = 2708204009019253719 + field c429 = 2411670237320420929 + field c430 = 13609437845180998639 + field c431 = 10111681102226214657 + field c432 = 3316234197538285735 + field c433 = 2660139758422335686 + field c434 = 12151415153659423964 + field c435 = 8951257134131846586 + field c436 = 8730277595668694550 + field c437 = 11649943321766601019 + field c438 = 446558882505765024 + field c439 = 6924831314803654178 + field c440 = 16439861000844197132 + + field m0 = 15058071544716697658 + field m1 = 9113155049989891189 + field m2 = 11350291668724975614 + field m3 = 9632313156395526262 + field m4 = 10413730688534659007 + field m5 = 3697752025371176728 + field m6 = 11885276071251709314 + field m7 = 16598884434632610234 + field m8 = 8089761759414446189 + field m9 = 16040926183245094672 + field m10 = 8904964827445835399 + field m11 = 12487570753220630667 + field m12 = 3761754934154259876 + field m13 = 10365474600392912237 + field m14 = 18215459870146304436 + field m15 = 2521867902521748797 + field m16 = 9276651354726850372 + field m17 = 2876546369175151218 + field m18 = 2535340427714539962 + field m19 = 17035695180503554455 + field m20 = 5065438235784555509 + field m21 = 16133217454234073776 + field m22 = 7083511463634692513 + field m23 = 9613984133077979495 + field m24 = 1331692021515548952 + field m25 = 12210106727545806375 + field m26 = 13648177365769586846 + field m27 = 15042137044708510189 + field m28 = 2554730408162944936 + field m29 = 16742667895331233611 + field m30 = 2494776793515665277 + field m31 = 14141966007005028685 + field m32 = 18062101036985256707 + field m33 = 755902906165376348 + field m34 = 386844847374139936 + field m35 = 12578289204908190735 + field m36 = 16474772505071285176 + field m37 = 4219412987430389417 + field m38 = 13785604981959978986 + field m39 = 6782700766578855354 + field m40 = 5027408469346314244 + field m41 = 3789778619153321757 + field m42 = 4990630321935587007 + field m43 = 13343213396420799882 + field m44 = 104089557996796214 + field m45 = 17594182424895122809 + field m46 = 1296646801898316520 + field m47 = 16927267389512340836 + field m48 = 15388042990166044599 + field m49 = 1062925035106735976 + field m50 = 6174325826189609393 + field m51 = 9654539659217203050 + field m52 = 3981669703948237017 + field m53 = 13344532373627816122 + field m54 = 9909148060180400932 + field m55 = 9832668435387834018 + field m56 = 16021044824039400858 + field m57 = 7712461657304026032 + field m58 = 7561823410587799308 + field m59 = 17083550112806683136 + field m60 = 6790038977110107895 + field m61 = 8056988792082041187 + field m62 = 6124556526406334790 + field m63 = 17224325032903033822 + field m64 = 12410794060221759964 + field m65 = 10618334591673088738 + field m66 = 3068156503820110383 + field m67 = 15231507067321079252 + field m68 = 11188165925029871979 + field m69 = 5971633157944515473 + field m70 = 2082638771837317713 + field m71 = 17302560278506804885 + field m72 = 7129447512455292844 + field m73 = 11141849528205973065 + field m74 = 15114786009406193424 + field m75 = 7449599548096808934 + field m76 = 12350858481215818754 + field m77 = 14112714168528178524 + field m78 = 16341673650923705326 + field m79 = 15739229265965988419 + field m80 = 6384637781573600052 + + // -- + // r = 0 + // ark + state0_0 = state0_0 + c0 + state1_0 = state1_0 + c1 + state2_0 = state2_0 + c2 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 1 + // ark + state0_0 = state0_0 + c3 + state1_0 = state1_0 + c4 + state2_0 = state2_0 + c5 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 2 + // ark + state0_0 = state0_0 + c6 + state1_0 = state1_0 + c7 + state2_0 = state2_0 + c8 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 3 + // ark + state0_0 = state0_0 + c9 + state1_0 = state1_0 + c10 + state2_0 = state2_0 + c11 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 4 + // ark + state0_0 = state0_0 + c12 + state1_0 = state1_0 + c13 + state2_0 = state2_0 + c14 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 5 + // ark + state0_0 = state0_0 + c15 + state1_0 = state1_0 + c16 + state2_0 = state2_0 + c17 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 6 + // ark + state0_0 = state0_0 + c18 + state1_0 = state1_0 + c19 + state2_0 = state2_0 + c20 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 7 + // ark + state0_0 = state0_0 + c21 + state1_0 = state1_0 + c22 + state2_0 = state2_0 + c23 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 8 + // ark + state0_0 = state0_0 + c24 + state1_0 = state1_0 + c25 + state2_0 = state2_0 + c26 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 9 + // ark + state0_0 = state0_0 + c27 + state1_0 = state1_0 + c28 + state2_0 = state2_0 + c29 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 10 + // ark + state0_0 = state0_0 + c30 + state1_0 = state1_0 + c31 + state2_0 = state2_0 + c32 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 11 + // ark + state0_0 = state0_0 + c33 + state1_0 = state1_0 + c34 + state2_0 = state2_0 + c35 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 12 + // ark + state0_0 = state0_0 + c36 + state1_0 = state1_0 + c37 + state2_0 = state2_0 + c38 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 13 + // ark + state0_0 = state0_0 + c39 + state1_0 = state1_0 + c40 + state2_0 = state2_0 + c41 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 14 + // ark + state0_0 = state0_0 + c42 + state1_0 = state1_0 + c43 + state2_0 = state2_0 + c44 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 15 + // ark + state0_0 = state0_0 + c45 + state1_0 = state1_0 + c46 + state2_0 = state2_0 + c47 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 16 + // ark + state0_0 = state0_0 + c48 + state1_0 = state1_0 + c49 + state2_0 = state2_0 + c50 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 17 + // ark + state0_0 = state0_0 + c51 + state1_0 = state1_0 + c52 + state2_0 = state2_0 + c53 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 18 + // ark + state0_0 = state0_0 + c54 + state1_0 = state1_0 + c55 + state2_0 = state2_0 + c56 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 19 + // ark + state0_0 = state0_0 + c57 + state1_0 = state1_0 + c58 + state2_0 = state2_0 + c59 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 20 + // ark + state0_0 = state0_0 + c60 + state1_0 = state1_0 + c61 + state2_0 = state2_0 + c62 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 21 + // ark + state0_0 = state0_0 + c63 + state1_0 = state1_0 + c64 + state2_0 = state2_0 + c65 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 22 + // ark + state0_0 = state0_0 + c66 + state1_0 = state1_0 + c67 + state2_0 = state2_0 + c68 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 23 + // ark + state0_0 = state0_0 + c69 + state1_0 = state1_0 + c70 + state2_0 = state2_0 + c71 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 24 + // ark + state0_0 = state0_0 + c72 + state1_0 = state1_0 + c73 + state2_0 = state2_0 + c74 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 25 + // ark + state0_0 = state0_0 + c75 + state1_0 = state1_0 + c76 + state2_0 = state2_0 + c77 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 26 + // ark + state0_0 = state0_0 + c78 + state1_0 = state1_0 + c79 + state2_0 = state2_0 + c80 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 27 + // ark + state0_0 = state0_0 + c81 + state1_0 = state1_0 + c82 + state2_0 = state2_0 + c83 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 28 + // ark + state0_0 = state0_0 + c84 + state1_0 = state1_0 + c85 + state2_0 = state2_0 + c86 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 29 + // ark + state0_0 = state0_0 + c87 + state1_0 = state1_0 + c88 + state2_0 = state2_0 + c89 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 30 + // ark + state0_0 = state0_0 + c90 + state1_0 = state1_0 + c91 + state2_0 = state2_0 + c92 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 31 + // ark + state0_0 = state0_0 + c93 + state1_0 = state1_0 + c94 + state2_0 = state2_0 + c95 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 32 + // ark + state0_0 = state0_0 + c96 + state1_0 = state1_0 + c97 + state2_0 = state2_0 + c98 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 33 + // ark + state0_0 = state0_0 + c99 + state1_0 = state1_0 + c100 + state2_0 = state2_0 + c101 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 34 + // ark + state0_0 = state0_0 + c102 + state1_0 = state1_0 + c103 + state2_0 = state2_0 + c104 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 35 + // ark + state0_0 = state0_0 + c105 + state1_0 = state1_0 + c106 + state2_0 = state2_0 + c107 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 36 + // ark + state0_0 = state0_0 + c108 + state1_0 = state1_0 + c109 + state2_0 = state2_0 + c110 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 37 + // ark + state0_0 = state0_0 + c111 + state1_0 = state1_0 + c112 + state2_0 = state2_0 + c113 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 38 + // ark + state0_0 = state0_0 + c114 + state1_0 = state1_0 + c115 + state2_0 = state2_0 + c116 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 39 + // ark + state0_0 = state0_0 + c117 + state1_0 = state1_0 + c118 + state2_0 = state2_0 + c119 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 40 + // ark + state0_0 = state0_0 + c120 + state1_0 = state1_0 + c121 + state2_0 = state2_0 + c122 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 41 + // ark + state0_0 = state0_0 + c123 + state1_0 = state1_0 + c124 + state2_0 = state2_0 + c125 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 42 + // ark + state0_0 = state0_0 + c126 + state1_0 = state1_0 + c127 + state2_0 = state2_0 + c128 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 43 + // ark + state0_0 = state0_0 + c129 + state1_0 = state1_0 + c130 + state2_0 = state2_0 + c131 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 44 + // ark + state0_0 = state0_0 + c132 + state1_0 = state1_0 + c133 + state2_0 = state2_0 + c134 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 45 + // ark + state0_0 = state0_0 + c135 + state1_0 = state1_0 + c136 + state2_0 = state2_0 + c137 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 46 + // ark + state0_0 = state0_0 + c138 + state1_0 = state1_0 + c139 + state2_0 = state2_0 + c140 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 47 + // ark + state0_0 = state0_0 + c141 + state1_0 = state1_0 + c142 + state2_0 = state2_0 + c143 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 48 + // ark + state0_0 = state0_0 + c144 + state1_0 = state1_0 + c145 + state2_0 = state2_0 + c146 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 49 + // ark + state0_0 = state0_0 + c147 + state1_0 = state1_0 + c148 + state2_0 = state2_0 + c149 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 50 + // ark + state0_0 = state0_0 + c150 + state1_0 = state1_0 + c151 + state2_0 = state2_0 + c152 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 51 + // ark + state0_0 = state0_0 + c153 + state1_0 = state1_0 + c154 + state2_0 = state2_0 + c155 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 52 + // ark + state0_0 = state0_0 + c156 + state1_0 = state1_0 + c157 + state2_0 = state2_0 + c158 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 53 + // ark + state0_0 = state0_0 + c159 + state1_0 = state1_0 + c160 + state2_0 = state2_0 + c161 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 54 + // ark + state0_0 = state0_0 + c162 + state1_0 = state1_0 + c163 + state2_0 = state2_0 + c164 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 55 + // ark + state0_0 = state0_0 + c165 + state1_0 = state1_0 + c166 + state2_0 = state2_0 + c167 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 56 + // ark + state0_0 = state0_0 + c168 + state1_0 = state1_0 + c169 + state2_0 = state2_0 + c170 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 57 + // ark + state0_0 = state0_0 + c171 + state1_0 = state1_0 + c172 + state2_0 = state2_0 + c173 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 58 + // ark + state0_0 = state0_0 + c174 + state1_0 = state1_0 + c175 + state2_0 = state2_0 + c176 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 59 + // ark + state0_0 = state0_0 + c177 + state1_0 = state1_0 + c178 + state2_0 = state2_0 + c179 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 60 + // ark + state0_0 = state0_0 + c180 + state1_0 = state1_0 + c181 + state2_0 = state2_0 + c182 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 61 + // ark + state0_0 = state0_0 + c183 + state1_0 = state1_0 + c184 + state2_0 = state2_0 + c185 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 62 + // ark + state0_0 = state0_0 + c186 + state1_0 = state1_0 + c187 + state2_0 = state2_0 + c188 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 63 + // ark + state0_0 = state0_0 + c189 + state1_0 = state1_0 + c190 + state2_0 = state2_0 + c191 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 64 + // ark + state0_0 = state0_0 + c192 + state1_0 = state1_0 + c193 + state2_0 = state2_0 + c194 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + // -- + // r = 0 + // ark + state0_1 = state0_1 + c0 + state1_1 = state1_1 + c1 + state2_1 = state2_1 + c2 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 1 + // ark + state0_1 = state0_1 + c3 + state1_1 = state1_1 + c4 + state2_1 = state2_1 + c5 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 2 + // ark + state0_1 = state0_1 + c6 + state1_1 = state1_1 + c7 + state2_1 = state2_1 + c8 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 3 + // ark + state0_1 = state0_1 + c9 + state1_1 = state1_1 + c10 + state2_1 = state2_1 + c11 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 4 + // ark + state0_1 = state0_1 + c12 + state1_1 = state1_1 + c13 + state2_1 = state2_1 + c14 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 5 + // ark + state0_1 = state0_1 + c15 + state1_1 = state1_1 + c16 + state2_1 = state2_1 + c17 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 6 + // ark + state0_1 = state0_1 + c18 + state1_1 = state1_1 + c19 + state2_1 = state2_1 + c20 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 7 + // ark + state0_1 = state0_1 + c21 + state1_1 = state1_1 + c22 + state2_1 = state2_1 + c23 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 8 + // ark + state0_1 = state0_1 + c24 + state1_1 = state1_1 + c25 + state2_1 = state2_1 + c26 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 9 + // ark + state0_1 = state0_1 + c27 + state1_1 = state1_1 + c28 + state2_1 = state2_1 + c29 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 10 + // ark + state0_1 = state0_1 + c30 + state1_1 = state1_1 + c31 + state2_1 = state2_1 + c32 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 11 + // ark + state0_1 = state0_1 + c33 + state1_1 = state1_1 + c34 + state2_1 = state2_1 + c35 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 12 + // ark + state0_1 = state0_1 + c36 + state1_1 = state1_1 + c37 + state2_1 = state2_1 + c38 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 13 + // ark + state0_1 = state0_1 + c39 + state1_1 = state1_1 + c40 + state2_1 = state2_1 + c41 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 14 + // ark + state0_1 = state0_1 + c42 + state1_1 = state1_1 + c43 + state2_1 = state2_1 + c44 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 15 + // ark + state0_1 = state0_1 + c45 + state1_1 = state1_1 + c46 + state2_1 = state2_1 + c47 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 16 + // ark + state0_1 = state0_1 + c48 + state1_1 = state1_1 + c49 + state2_1 = state2_1 + c50 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 17 + // ark + state0_1 = state0_1 + c51 + state1_1 = state1_1 + c52 + state2_1 = state2_1 + c53 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 18 + // ark + state0_1 = state0_1 + c54 + state1_1 = state1_1 + c55 + state2_1 = state2_1 + c56 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 19 + // ark + state0_1 = state0_1 + c57 + state1_1 = state1_1 + c58 + state2_1 = state2_1 + c59 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 20 + // ark + state0_1 = state0_1 + c60 + state1_1 = state1_1 + c61 + state2_1 = state2_1 + c62 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 21 + // ark + state0_1 = state0_1 + c63 + state1_1 = state1_1 + c64 + state2_1 = state2_1 + c65 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 22 + // ark + state0_1 = state0_1 + c66 + state1_1 = state1_1 + c67 + state2_1 = state2_1 + c68 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 23 + // ark + state0_1 = state0_1 + c69 + state1_1 = state1_1 + c70 + state2_1 = state2_1 + c71 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 24 + // ark + state0_1 = state0_1 + c72 + state1_1 = state1_1 + c73 + state2_1 = state2_1 + c74 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 25 + // ark + state0_1 = state0_1 + c75 + state1_1 = state1_1 + c76 + state2_1 = state2_1 + c77 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 26 + // ark + state0_1 = state0_1 + c78 + state1_1 = state1_1 + c79 + state2_1 = state2_1 + c80 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 27 + // ark + state0_1 = state0_1 + c81 + state1_1 = state1_1 + c82 + state2_1 = state2_1 + c83 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 28 + // ark + state0_1 = state0_1 + c84 + state1_1 = state1_1 + c85 + state2_1 = state2_1 + c86 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 29 + // ark + state0_1 = state0_1 + c87 + state1_1 = state1_1 + c88 + state2_1 = state2_1 + c89 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 30 + // ark + state0_1 = state0_1 + c90 + state1_1 = state1_1 + c91 + state2_1 = state2_1 + c92 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 31 + // ark + state0_1 = state0_1 + c93 + state1_1 = state1_1 + c94 + state2_1 = state2_1 + c95 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 32 + // ark + state0_1 = state0_1 + c96 + state1_1 = state1_1 + c97 + state2_1 = state2_1 + c98 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 33 + // ark + state0_1 = state0_1 + c99 + state1_1 = state1_1 + c100 + state2_1 = state2_1 + c101 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 34 + // ark + state0_1 = state0_1 + c102 + state1_1 = state1_1 + c103 + state2_1 = state2_1 + c104 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 35 + // ark + state0_1 = state0_1 + c105 + state1_1 = state1_1 + c106 + state2_1 = state2_1 + c107 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 36 + // ark + state0_1 = state0_1 + c108 + state1_1 = state1_1 + c109 + state2_1 = state2_1 + c110 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 37 + // ark + state0_1 = state0_1 + c111 + state1_1 = state1_1 + c112 + state2_1 = state2_1 + c113 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 38 + // ark + state0_1 = state0_1 + c114 + state1_1 = state1_1 + c115 + state2_1 = state2_1 + c116 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 39 + // ark + state0_1 = state0_1 + c117 + state1_1 = state1_1 + c118 + state2_1 = state2_1 + c119 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 40 + // ark + state0_1 = state0_1 + c120 + state1_1 = state1_1 + c121 + state2_1 = state2_1 + c122 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 41 + // ark + state0_1 = state0_1 + c123 + state1_1 = state1_1 + c124 + state2_1 = state2_1 + c125 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 42 + // ark + state0_1 = state0_1 + c126 + state1_1 = state1_1 + c127 + state2_1 = state2_1 + c128 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 43 + // ark + state0_1 = state0_1 + c129 + state1_1 = state1_1 + c130 + state2_1 = state2_1 + c131 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 44 + // ark + state0_1 = state0_1 + c132 + state1_1 = state1_1 + c133 + state2_1 = state2_1 + c134 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 45 + // ark + state0_1 = state0_1 + c135 + state1_1 = state1_1 + c136 + state2_1 = state2_1 + c137 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 46 + // ark + state0_1 = state0_1 + c138 + state1_1 = state1_1 + c139 + state2_1 = state2_1 + c140 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 47 + // ark + state0_1 = state0_1 + c141 + state1_1 = state1_1 + c142 + state2_1 = state2_1 + c143 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 48 + // ark + state0_1 = state0_1 + c144 + state1_1 = state1_1 + c145 + state2_1 = state2_1 + c146 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 49 + // ark + state0_1 = state0_1 + c147 + state1_1 = state1_1 + c148 + state2_1 = state2_1 + c149 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 50 + // ark + state0_1 = state0_1 + c150 + state1_1 = state1_1 + c151 + state2_1 = state2_1 + c152 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 51 + // ark + state0_1 = state0_1 + c153 + state1_1 = state1_1 + c154 + state2_1 = state2_1 + c155 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 52 + // ark + state0_1 = state0_1 + c156 + state1_1 = state1_1 + c157 + state2_1 = state2_1 + c158 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 53 + // ark + state0_1 = state0_1 + c159 + state1_1 = state1_1 + c160 + state2_1 = state2_1 + c161 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 54 + // ark + state0_1 = state0_1 + c162 + state1_1 = state1_1 + c163 + state2_1 = state2_1 + c164 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 55 + // ark + state0_1 = state0_1 + c165 + state1_1 = state1_1 + c166 + state2_1 = state2_1 + c167 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 56 + // ark + state0_1 = state0_1 + c168 + state1_1 = state1_1 + c169 + state2_1 = state2_1 + c170 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 57 + // ark + state0_1 = state0_1 + c171 + state1_1 = state1_1 + c172 + state2_1 = state2_1 + c173 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 58 + // ark + state0_1 = state0_1 + c174 + state1_1 = state1_1 + c175 + state2_1 = state2_1 + c176 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 59 + // ark + state0_1 = state0_1 + c177 + state1_1 = state1_1 + c178 + state2_1 = state2_1 + c179 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 60 + // ark + state0_1 = state0_1 + c180 + state1_1 = state1_1 + c181 + state2_1 = state2_1 + c182 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 61 + // ark + state0_1 = state0_1 + c183 + state1_1 = state1_1 + c184 + state2_1 = state2_1 + c185 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 62 + // ark + state0_1 = state0_1 + c186 + state1_1 = state1_1 + c187 + state2_1 = state2_1 + c188 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 63 + // ark + state0_1 = state0_1 + c189 + state1_1 = state1_1 + c190 + state2_1 = state2_1 + c191 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + // -- + // r = 64 + // ark + state0_1 = state0_1 + c192 + state1_1 = state1_1 + c193 + state2_1 = state2_1 + c194 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + return DoubleHash { + hash0: state0_0, + hash1: state0_1 + } diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon3.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon3.zok new file mode 100644 index 00000000..930cbca4 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/poseidon3.zok @@ -0,0 +1,1619 @@ +def poseidon3(field state1, field state2, field state3) -> field: + field state0 = 0 + + field c0 = 758662019503705074 + field c1 = 9958560809385864598 + field c2 = 1277576466825840593 + field c3 = 17276116445666047290 + field c4 = 8462567671021664875 + field c5 = 18311663567274789012 + field c6 = 14794487373875431679 + field c7 = 939955959186974556 + field c8 = 13578068033787386336 + field c9 = 16936160577869353999 + field c10 = 7564443307661759393 + field c11 = 5701022615025077794 + field c12 = 14898040799158503403 + field c13 = 7398753701805340846 + field c14 = 17145662177513207623 + field c15 = 15919612504434736882 + field c16 = 211911121069562741 + field c17 = 14627162831253564776 + field c18 = 3736731127424592191 + field c19 = 16164080792556653606 + field c20 = 13310103488076492265 + field c21 = 17714184600411987649 + field c22 = 13937509549526454080 + field c23 = 8467973550572764378 + field c24 = 6149415607253035464 + field c25 = 9902966326901151535 + field c26 = 2299003035066075543 + field c27 = 9361464291309771166 + field c28 = 455760044697694737 + field c29 = 18069040773191725180 + field c30 = 12156451030386903890 + field c31 = 13269466490844642616 + field c32 = 4644627377627776228 + field c33 = 11517517066878151266 + field c34 = 2085762791679771559 + field c35 = 14341814612745946357 + field c36 = 8220722365145856681 + field c37 = 13781050119424493396 + field c38 = 14130172974922698924 + field c39 = 1268378720849035897 + field c40 = 13102522127585690797 + field c41 = 6435545073175926153 + field c42 = 10680323768845634897 + field c43 = 5377035848961467433 + field c44 = 16155044248960735250 + field c45 = 3956646720460237409 + field c46 = 15192201422078376101 + field c47 = 2254261886235227853 + field c48 = 18263210726053991346 + field c49 = 14588739567027142820 + field c50 = 9572725267846457115 + field c51 = 4663609806895345720 + field c52 = 16822560014146547002 + field c53 = 12821481803562047313 + field c54 = 3027425978972870548 + field c55 = 16762600845752241175 + field c56 = 7067459971848174565 + field c57 = 15884202556186149044 + field c58 = 8501625320175123709 + field c59 = 4388367812943946907 + field c60 = 12299931046827323210 + field c61 = 7636538909023199578 + field c62 = 14046758094336955416 + field c63 = 9633246818970530654 + field c64 = 13491266525055530545 + field c65 = 5423497366234120042 + field c66 = 1751962590333377264 + field c67 = 10513677123715294214 + field c68 = 996968784189528765 + field c69 = 10448850931434990018 + field c70 = 8953917554828103116 + field c71 = 1626108945262700028 + field c72 = 5891489572384527092 + field c73 = 6643806719713918869 + field c74 = 16083801189239088971 + field c75 = 14868933033345963433 + field c76 = 11850469235653996642 + field c77 = 1324483046183023543 + field c78 = 15183755263354743993 + field c79 = 2495724238845411316 + field c80 = 8731170262888399569 + field c81 = 16304783671381988951 + field c82 = 11235544699283452233 + field c83 = 2137768936382175302 + field c84 = 16675115627845335581 + field c85 = 2963350077420008404 + field c86 = 5398589702654192916 + field c87 = 12140466249394573251 + field c88 = 11834547998206516929 + field c89 = 6177294541684099188 + field c90 = 9838863225522131903 + field c91 = 4701779667688073310 + field c92 = 12835837905699815771 + field c93 = 2968170957340817290 + field c94 = 9828791715764525853 + field c95 = 8442028361006693278 + field c96 = 17176968168399522482 + field c97 = 17999791729505949887 + field c98 = 14962719204200253756 + field c99 = 17300730933512754375 + field c100 = 4222119091375155707 + field c101 = 11298113638119509435 + field c102 = 12268859188885459376 + field c103 = 9034427714391492438 + field c104 = 5990277340027239801 + field c105 = 726299115287076863 + field c106 = 18303937711932738539 + field c107 = 8960550811937596675 + field c108 = 18420334683743066202 + field c109 = 16986003784188475276 + field c110 = 13588430238611272524 + field c111 = 18102499241351263781 + field c112 = 7476618494341797169 + field c113 = 4184084235455659562 + field c114 = 5668298044436776508 + field c115 = 17447913737721385190 + field c116 = 11088130260910156172 + field c117 = 8792531517070849900 + field c118 = 9397646851851459952 + field c119 = 5121871193730760910 + field c120 = 2168557202402322871 + field c121 = 15702569595864319029 + field c122 = 14720843552400861125 + field c123 = 8277634810410081765 + field c124 = 6233674368436885280 + field c125 = 4306433523940866942 + field c126 = 17722591435523141845 + field c127 = 13983984591359038932 + field c128 = 9195938109190900291 + field c129 = 6074479640755470700 + field c130 = 14078059641315677730 + field c131 = 10695375213011552670 + field c132 = 5573015714231677140 + field c133 = 16984666835191674642 + field c134 = 10249524339733897711 + field c135 = 3174518716637848153 + field c136 = 7188570775991726809 + field c137 = 4753011490148598290 + field c138 = 5105443631000558491 + field c139 = 15781086678953962161 + field c140 = 3458297099390436339 + field c141 = 3082524552292086 + field c142 = 10885272710257457992 + field c143 = 3236146052509314745 + field c144 = 9696124289212404307 + field c145 = 1485008535953646698 + field c146 = 1137225154782514508 + field c147 = 10514784977699897262 + field c148 = 10729284392631787423 + field c149 = 14959018802228526836 + field c150 = 5311814720150441561 + field c151 = 15855390943452519568 + field c152 = 11214465269186418739 + field c153 = 4053806423852004669 + field c154 = 11760999889540157928 + field c155 = 13155611628497688688 + field c156 = 3842739007828054055 + field c157 = 5711430659662298364 + field c158 = 13288819076998297778 + field c159 = 4820382956965774345 + field c160 = 9818136475875046170 + field c161 = 15891193043142164602 + field c162 = 11369901158293474981 + field c163 = 16014685768489088745 + field c164 = 1356361795046325322 + field c165 = 15790892392481609398 + field c166 = 14921870878617925995 + field c167 = 7687231355395058862 + field c168 = 14150434200392676099 + field c169 = 1103438709908116920 + field c170 = 6477771864968923918 + field c171 = 17883003884435853137 + field c172 = 15616808237597542650 + field c173 = 298930612681613218 + field c174 = 7783145673030144050 + field c175 = 9925877788921434933 + field c176 = 7906428066733709088 + field c177 = 9059024899257096185 + field c178 = 12128791653883821821 + field c179 = 10439342184366574094 + field c180 = 16838255109359414152 + field c181 = 16778733411203605167 + field c182 = 3209921692078731530 + field c183 = 5829411678714675631 + field c184 = 13546305324682002944 + field c185 = 14388669943129102066 + field c186 = 16955277212659953284 + field c187 = 470060073341462642 + field c188 = 9865599081512514471 + field c189 = 3450866718365881982 + field c190 = 18253332465868317974 + field c191 = 8224383463926128747 + field c192 = 130168533448866398 + field c193 = 18296913789182388911 + field c194 = 9308875868804582517 + field c195 = 6860185202164278388 + field c196 = 5870361400608292852 + field c197 = 3853169742702299288 + field c198 = 2828579906117525532 + field c199 = 8244689163068534246 + field c200 = 14622287387679457865 + field c201 = 12818724415397588863 + field c202 = 9032795459261424103 + field c203 = 8582165566672449484 + field c204 = 1212546459474121359 + field c205 = 10720339750995594781 + field c206 = 9969473243746656646 + field c207 = 11889569503442370601 + field c208 = 8693000785136236266 + field c209 = 16911102564849626327 + field c210 = 10711317080423442023 + field c211 = 4092936164155659784 + field c212 = 9444614550731573011 + field c213 = 12734967290928938181 + field c214 = 2968663829197022452 + field c215 = 2063412078139901611 + field c216 = 6756409496657354005 + field c217 = 1956289224556834622 + field c218 = 17971879772361152496 + field c219 = 11129036599170922734 + field c220 = 6015714579300332596 + field c221 = 13952747316952120325 + field c222 = 6512928506883814256 + field c223 = 15000527898579580837 + field c224 = 13438817240481151739 + field c225 = 3438974907999726212 + field c226 = 2675270561650848698 + field c227 = 10615408741625344128 + field c228 = 15097127622747154430 + field c229 = 18306211703619792030 + field c230 = 18282207759862860963 + field c231 = 3969670710369869305 + field c232 = 15355909293594283010 + field c233 = 15825197601644123886 + field c234 = 12025247290627247881 + field c235 = 9244373186029472974 + field c236 = 8111711196724032485 + field c237 = 13910625786903113352 + field c238 = 4303582664435413453 + field c239 = 3615529122737143133 + field c240 = 13220640289699986291 + field c241 = 10945048589905126881 + field c242 = 18345446024459547893 + field c243 = 15246969291153869719 + field c244 = 3339771865943361715 + field c245 = 7920776184990771299 + field c246 = 11282075447781111045 + field c247 = 10409571270584994188 + field c248 = 7215903119088030248 + field c249 = 7149080371149851697 + field c250 = 12805983536086727637 + field c251 = 11544704273904429996 + field c252 = 3056733444472163063 + field c253 = 12775412729058442397 + field c254 = 10120906816355467459 + field c255 = 8580478192693828704 + field c256 = 17569548953071784548 + field c257 = 15170454632914839133 + field c258 = 11570807611472296007 + field c259 = 10726909497040777105 + field c260 = 440756088013805182 + field c261 = 7569336675219092295 + field c262 = 10579530867946972688 + field c263 = 10974325257620388506 + field c264 = 3053362977696829619 + field c265 = 17168463938106116617 + field c266 = 13835667625615860908 + field c267 = 2095873483773389479 + field c268 = 2016987140591259174 + field c269 = 2386979931999911847 + field c270 = 2505164847016101177 + field c271 = 13627451220086273527 + field c272 = 5731572550841603667 + field c273 = 15438639334109998771 + field c274 = 12813614048997555325 + field c275 = 10186814175982828107 + field c276 = 16191184896882054112 + field c277 = 14703692647542166085 + field c278 = 12578830251623636174 + field c279 = 1883855031971540983 + field c280 = 1266038367760006278 + field c281 = 11230634812224943920 + field c282 = 11308504110418640097 + field c283 = 6328296428453151721 + field c284 = 108818186627960168 + field c285 = 15547570943643535551 + field c286 = 4315257403857009861 + field c287 = 6380448982060371429 + field c288 = 632889842882717873 + field c289 = 7687981897540030037 + field c290 = 2375004428285747026 + field c291 = 1352206380036636795 + field c292 = 2578260287095025994 + field c293 = 2465523090448545549 + field c294 = 4247285443750660784 + field c295 = 3540885980673334329 + field c296 = 3345957484484543597 + field c297 = 11380792058791615855 + field c298 = 3199862384571235298 + field c299 = 173879172622348856 + field c300 = 15209080508353549507 + field c301 = 11649978506589666631 + field c302 = 9173090522521364544 + field c303 = 17030945052114083432 + field c304 = 4591187677780222237 + field c305 = 4064474173561892218 + field c306 = 15789829170657683922 + field c307 = 18208193905710242077 + field c308 = 14715997988505596440 + field c309 = 14667972935108688793 + field c310 = 5685168615648408563 + field c311 = 5245239484537042399 + field c312 = 3667459350052205975 + field c313 = 9197423732344085415 + field c314 = 4102452659988315248 + field c315 = 6641847341527232917 + field c316 = 12480319858851986779 + field c317 = 5186375792939856127 + field c318 = 2950251364917852338 + field c319 = 14773928965023494669 + field c320 = 12693729432082377979 + field c321 = 10022034381199683741 + field c322 = 9157237748502939080 + field c323 = 9663275337098404028 + field c324 = 13452894763307783925 + field c325 = 17376241946508742183 + field c326 = 3061844045327119072 + field c327 = 16030845287947531828 + field c328 = 1329076042067568487 + field c329 = 6855142122269391811 + field c330 = 11765672489282549160 + field c331 = 16830774944875965381 + field c332 = 6521069374664264162 + field c333 = 643523635231852913 + field c334 = 17135479068108868253 + field c335 = 4691294308622704824 + field c336 = 14491408402222977368 + field c337 = 18443726244814588799 + field c338 = 3981855558016600424 + field c339 = 6519895386704965259 + field c340 = 12833833766931651330 + field c341 = 5955046055337035381 + field c342 = 12102114200670204984 + field c343 = 17975981029431378883 + field c344 = 17148695856475432045 + field c345 = 4359514157740747375 + field c346 = 4733737572453903189 + field c347 = 9216164030888884101 + field c348 = 11898192372834399996 + field c349 = 8293149570945521798 + field c350 = 5292998910181620016 + field c351 = 11065412642848915128 + field c352 = 15951602728119640232 + field c353 = 17250120023723813262 + field c354 = 4208067670865654520 + field c355 = 4170990196992221254 + field c356 = 1364275915544901155 + field c357 = 5204734139073276471 + field c358 = 1348335617598418065 + field c359 = 4844946001170596348 + field c360 = 6839747835867181919 + field c361 = 5053317630835107264 + field c362 = 11056210036248139432 + field c363 = 1381878963923170929 + field c364 = 16574699770444639361 + field c365 = 8108738101012231328 + field c366 = 5608591239825657577 + field c367 = 2655890021744410286 + field c368 = 1274076210795298659 + field c369 = 11394663484515968481 + field c370 = 10856028813008380196 + field c371 = 13953897966883300641 + field c372 = 2480138023543998637 + field c373 = 8092805429879378234 + field c374 = 15734383915406361638 + field c375 = 12606199089969720633 + field c376 = 3432862751254991632 + field c377 = 11620001581001631894 + field c378 = 600733227997580875 + field c379 = 9960515431061710391 + field c380 = 15489520790087945179 + field c381 = 9888006245836622059 + field c382 = 16555061763510382783 + field c383 = 5729882798372086417 + field c384 = 18193672778018355673 + field c385 = 1822658993478572731 + field c386 = 5003044969628961755 + field c387 = 13153107988347151430 + field c388 = 784457190336231507 + field c389 = 13520638662186896236 + field c390 = 2049546776680600500 + field c391 = 10461088023685880055 + field c392 = 14926219627271786921 + field c393 = 17417636229842539696 + field c394 = 12492153963185454352 + field c395 = 414142119733528902 + field c396 = 17193096568008516286 + field c397 = 17273750640915671574 + field c398 = 2591282858188044874 + field c399 = 1735410450107017713 + field c400 = 10687387921399705460 + field c401 = 8183629028325381283 + field c402 = 10514917847412402927 + field c403 = 3336665081692857317 + field c404 = 5051946386531163563 + field c405 = 9781529663474696061 + field c406 = 13935324224847496391 + field c407 = 12199928622022129120 + field c408 = 18046988489253129363 + field c409 = 5360148275199876436 + field c410 = 4470351170521662089 + field c411 = 4053340142176580658 + field c412 = 7099987801407623156 + field c413 = 8643889260231910466 + field c414 = 8009486459327768919 + field c415 = 14356550044319110877 + field c416 = 1414693227423376523 + field c417 = 4179767940638916940 + field c418 = 13567672199210649738 + field c419 = 13138927205843206565 + field c420 = 215760839592843100 + field c421 = 16441790535445707930 + field c422 = 11718341735146782011 + field c423 = 12912429887242802458 + field c424 = 17517646119074274016 + field c425 = 7879023854534232228 + field c426 = 8728793248242325455 + field c427 = 5947682549087889590 + field c428 = 2708204009019253719 + field c429 = 2411670237320420929 + field c430 = 13609437845180998639 + field c431 = 10111681102226214657 + field c432 = 3316234197538285735 + field c433 = 2660139758422335686 + field c434 = 12151415153659423964 + field c435 = 8951257134131846586 + field c436 = 8730277595668694550 + field c437 = 11649943321766601019 + field c438 = 446558882505765024 + field c439 = 6924831314803654178 + field c440 = 16439861000844197132 + + field m0 = 15058071544716697658 + field m1 = 9113155049989891189 + field m2 = 11350291668724975614 + field m3 = 9632313156395526262 + field m4 = 10413730688534659007 + field m5 = 3697752025371176728 + field m6 = 11885276071251709314 + field m7 = 16598884434632610234 + field m8 = 8089761759414446189 + field m9 = 16040926183245094672 + field m10 = 8904964827445835399 + field m11 = 12487570753220630667 + field m12 = 3761754934154259876 + field m13 = 10365474600392912237 + field m14 = 18215459870146304436 + field m15 = 2521867902521748797 + field m16 = 9276651354726850372 + field m17 = 2876546369175151218 + field m18 = 2535340427714539962 + field m19 = 17035695180503554455 + field m20 = 5065438235784555509 + field m21 = 16133217454234073776 + field m22 = 7083511463634692513 + field m23 = 9613984133077979495 + field m24 = 1331692021515548952 + field m25 = 12210106727545806375 + field m26 = 13648177365769586846 + field m27 = 15042137044708510189 + field m28 = 2554730408162944936 + field m29 = 16742667895331233611 + field m30 = 2494776793515665277 + field m31 = 14141966007005028685 + field m32 = 18062101036985256707 + field m33 = 755902906165376348 + field m34 = 386844847374139936 + field m35 = 12578289204908190735 + field m36 = 16474772505071285176 + field m37 = 4219412987430389417 + field m38 = 13785604981959978986 + field m39 = 6782700766578855354 + field m40 = 5027408469346314244 + field m41 = 3789778619153321757 + field m42 = 4990630321935587007 + field m43 = 13343213396420799882 + field m44 = 104089557996796214 + field m45 = 17594182424895122809 + field m46 = 1296646801898316520 + field m47 = 16927267389512340836 + field m48 = 15388042990166044599 + field m49 = 1062925035106735976 + field m50 = 6174325826189609393 + field m51 = 9654539659217203050 + field m52 = 3981669703948237017 + field m53 = 13344532373627816122 + field m54 = 9909148060180400932 + field m55 = 9832668435387834018 + field m56 = 16021044824039400858 + field m57 = 7712461657304026032 + field m58 = 7561823410587799308 + field m59 = 17083550112806683136 + field m60 = 6790038977110107895 + field m61 = 8056988792082041187 + field m62 = 6124556526406334790 + field m63 = 17224325032903033822 + field m64 = 12410794060221759964 + field m65 = 10618334591673088738 + field m66 = 3068156503820110383 + field m67 = 15231507067321079252 + field m68 = 11188165925029871979 + field m69 = 5971633157944515473 + field m70 = 2082638771837317713 + field m71 = 17302560278506804885 + field m72 = 7129447512455292844 + field m73 = 11141849528205973065 + field m74 = 15114786009406193424 + field m75 = 7449599548096808934 + field m76 = 12350858481215818754 + field m77 = 14112714168528178524 + field m78 = 16341673650923705326 + field m79 = 15739229265965988419 + field m80 = 6384637781573600052 + + // -- + // r = 0 + // ark + state0 = state0 + c0 + state1 = state1 + c1 + state2 = state2 + c2 + state3 = state3 + c3 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 1 + // ark + state0 = state0 + c4 + state1 = state1 + c5 + state2 = state2 + c6 + state3 = state3 + c7 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 2 + // ark + state0 = state0 + c8 + state1 = state1 + c9 + state2 = state2 + c10 + state3 = state3 + c11 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 3 + // ark + state0 = state0 + c12 + state1 = state1 + c13 + state2 = state2 + c14 + state3 = state3 + c15 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 4 + // ark + state0 = state0 + c16 + state1 = state1 + c17 + state2 = state2 + c18 + state3 = state3 + c19 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 5 + // ark + state0 = state0 + c20 + state1 = state1 + c21 + state2 = state2 + c22 + state3 = state3 + c23 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 6 + // ark + state0 = state0 + c24 + state1 = state1 + c25 + state2 = state2 + c26 + state3 = state3 + c27 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 7 + // ark + state0 = state0 + c28 + state1 = state1 + c29 + state2 = state2 + c30 + state3 = state3 + c31 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 8 + // ark + state0 = state0 + c32 + state1 = state1 + c33 + state2 = state2 + c34 + state3 = state3 + c35 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 9 + // ark + state0 = state0 + c36 + state1 = state1 + c37 + state2 = state2 + c38 + state3 = state3 + c39 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 10 + // ark + state0 = state0 + c40 + state1 = state1 + c41 + state2 = state2 + c42 + state3 = state3 + c43 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 11 + // ark + state0 = state0 + c44 + state1 = state1 + c45 + state2 = state2 + c46 + state3 = state3 + c47 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 12 + // ark + state0 = state0 + c48 + state1 = state1 + c49 + state2 = state2 + c50 + state3 = state3 + c51 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 13 + // ark + state0 = state0 + c52 + state1 = state1 + c53 + state2 = state2 + c54 + state3 = state3 + c55 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 14 + // ark + state0 = state0 + c56 + state1 = state1 + c57 + state2 = state2 + c58 + state3 = state3 + c59 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 15 + // ark + state0 = state0 + c60 + state1 = state1 + c61 + state2 = state2 + c62 + state3 = state3 + c63 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 16 + // ark + state0 = state0 + c64 + state1 = state1 + c65 + state2 = state2 + c66 + state3 = state3 + c67 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 17 + // ark + state0 = state0 + c68 + state1 = state1 + c69 + state2 = state2 + c70 + state3 = state3 + c71 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 18 + // ark + state0 = state0 + c72 + state1 = state1 + c73 + state2 = state2 + c74 + state3 = state3 + c75 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 19 + // ark + state0 = state0 + c76 + state1 = state1 + c77 + state2 = state2 + c78 + state3 = state3 + c79 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 20 + // ark + state0 = state0 + c80 + state1 = state1 + c81 + state2 = state2 + c82 + state3 = state3 + c83 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 21 + // ark + state0 = state0 + c84 + state1 = state1 + c85 + state2 = state2 + c86 + state3 = state3 + c87 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 22 + // ark + state0 = state0 + c88 + state1 = state1 + c89 + state2 = state2 + c90 + state3 = state3 + c91 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 23 + // ark + state0 = state0 + c92 + state1 = state1 + c93 + state2 = state2 + c94 + state3 = state3 + c95 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 24 + // ark + state0 = state0 + c96 + state1 = state1 + c97 + state2 = state2 + c98 + state3 = state3 + c99 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 25 + // ark + state0 = state0 + c100 + state1 = state1 + c101 + state2 = state2 + c102 + state3 = state3 + c103 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 26 + // ark + state0 = state0 + c104 + state1 = state1 + c105 + state2 = state2 + c106 + state3 = state3 + c107 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 27 + // ark + state0 = state0 + c108 + state1 = state1 + c109 + state2 = state2 + c110 + state3 = state3 + c111 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 28 + // ark + state0 = state0 + c112 + state1 = state1 + c113 + state2 = state2 + c114 + state3 = state3 + c115 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 29 + // ark + state0 = state0 + c116 + state1 = state1 + c117 + state2 = state2 + c118 + state3 = state3 + c119 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 30 + // ark + state0 = state0 + c120 + state1 = state1 + c121 + state2 = state2 + c122 + state3 = state3 + c123 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 31 + // ark + state0 = state0 + c124 + state1 = state1 + c125 + state2 = state2 + c126 + state3 = state3 + c127 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 32 + // ark + state0 = state0 + c128 + state1 = state1 + c129 + state2 = state2 + c130 + state3 = state3 + c131 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 33 + // ark + state0 = state0 + c132 + state1 = state1 + c133 + state2 = state2 + c134 + state3 = state3 + c135 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 34 + // ark + state0 = state0 + c136 + state1 = state1 + c137 + state2 = state2 + c138 + state3 = state3 + c139 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 35 + // ark + state0 = state0 + c140 + state1 = state1 + c141 + state2 = state2 + c142 + state3 = state3 + c143 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 36 + // ark + state0 = state0 + c144 + state1 = state1 + c145 + state2 = state2 + c146 + state3 = state3 + c147 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 37 + // ark + state0 = state0 + c148 + state1 = state1 + c149 + state2 = state2 + c150 + state3 = state3 + c151 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 38 + // ark + state0 = state0 + c152 + state1 = state1 + c153 + state2 = state2 + c154 + state3 = state3 + c155 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 39 + // ark + state0 = state0 + c156 + state1 = state1 + c157 + state2 = state2 + c158 + state3 = state3 + c159 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 40 + // ark + state0 = state0 + c160 + state1 = state1 + c161 + state2 = state2 + c162 + state3 = state3 + c163 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 41 + // ark + state0 = state0 + c164 + state1 = state1 + c165 + state2 = state2 + c166 + state3 = state3 + c167 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 42 + // ark + state0 = state0 + c168 + state1 = state1 + c169 + state2 = state2 + c170 + state3 = state3 + c171 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 43 + // ark + state0 = state0 + c172 + state1 = state1 + c173 + state2 = state2 + c174 + state3 = state3 + c175 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 44 + // ark + state0 = state0 + c176 + state1 = state1 + c177 + state2 = state2 + c178 + state3 = state3 + c179 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 45 + // ark + state0 = state0 + c180 + state1 = state1 + c181 + state2 = state2 + c182 + state3 = state3 + c183 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 46 + // ark + state0 = state0 + c184 + state1 = state1 + c185 + state2 = state2 + c186 + state3 = state3 + c187 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 47 + // ark + state0 = state0 + c188 + state1 = state1 + c189 + state2 = state2 + c190 + state3 = state3 + c191 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 48 + // ark + state0 = state0 + c192 + state1 = state1 + c193 + state2 = state2 + c194 + state3 = state3 + c195 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 49 + // ark + state0 = state0 + c196 + state1 = state1 + c197 + state2 = state2 + c198 + state3 = state3 + c199 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 50 + // ark + state0 = state0 + c200 + state1 = state1 + c201 + state2 = state2 + c202 + state3 = state3 + c203 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 51 + // ark + state0 = state0 + c204 + state1 = state1 + c205 + state2 = state2 + c206 + state3 = state3 + c207 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 52 + // ark + state0 = state0 + c208 + state1 = state1 + c209 + state2 = state2 + c210 + state3 = state3 + c211 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 53 + // ark + state0 = state0 + c212 + state1 = state1 + c213 + state2 = state2 + c214 + state3 = state3 + c215 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 54 + // ark + state0 = state0 + c216 + state1 = state1 + c217 + state2 = state2 + c218 + state3 = state3 + c219 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 55 + // ark + state0 = state0 + c220 + state1 = state1 + c221 + state2 = state2 + c222 + state3 = state3 + c223 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 56 + // ark + state0 = state0 + c224 + state1 = state1 + c225 + state2 = state2 + c226 + state3 = state3 + c227 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 57 + // ark + state0 = state0 + c228 + state1 = state1 + c229 + state2 = state2 + c230 + state3 = state3 + c231 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 58 + // ark + state0 = state0 + c232 + state1 = state1 + c233 + state2 = state2 + c234 + state3 = state3 + c235 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 59 + // ark + state0 = state0 + c236 + state1 = state1 + c237 + state2 = state2 + c238 + state3 = state3 + c239 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 + field new_state2 = state2 + field new_state3 = state3 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 60 + // ark + state0 = state0 + c240 + state1 = state1 + c241 + state2 = state2 + c242 + state3 = state3 + c243 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 61 + // ark + state0 = state0 + c244 + state1 = state1 + c245 + state2 = state2 + c246 + state3 = state3 + c247 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 62 + // ark + state0 = state0 + c248 + state1 = state1 + c249 + state2 = state2 + c250 + state3 = state3 + c251 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + // -- + // r = 63 + // ark + state0 = state0 + c252 + state1 = state1 + c253 + state2 = state2 + c254 + state3 = state3 + c255 + // sbox + field new_state0 = state0 ** 5 + field new_state1 = state1 ** 5 + field new_state2 = state2 ** 5 + field new_state3 = state3 ** 5 + // mix + state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 + state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 + state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 + state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 + return state0 + +def main() -> field: + return poseidon3(1, 2, 3) \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon5.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon5.zok new file mode 100644 index 00000000..8de30d76 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/poseidon5.zok @@ -0,0 +1,3661 @@ +from "./poseidon_struct.zok" import DoubleHash +def poseidon5_batch2(field state1_0, field state2_0, field state3_0, field state4_0, field state5_0, field state1_1, field state2_1, field state3_1, field state4_1, field state5_1) -> DoubleHash: + field state0_0 = 0 + field state0_1 = 0 + + field c0 = 758662019503705074 + field c1 = 9958560809385864598 + field c2 = 1277576466825840593 + field c3 = 17276116445666047290 + field c4 = 8462567671021664875 + field c5 = 18311663567274789012 + field c6 = 14794487373875431679 + field c7 = 939955959186974556 + field c8 = 13578068033787386336 + field c9 = 16936160577869353999 + field c10 = 7564443307661759393 + field c11 = 5701022615025077794 + field c12 = 14898040799158503403 + field c13 = 7398753701805340846 + field c14 = 17145662177513207623 + field c15 = 15919612504434736882 + field c16 = 211911121069562741 + field c17 = 14627162831253564776 + field c18 = 3736731127424592191 + field c19 = 16164080792556653606 + field c20 = 13310103488076492265 + field c21 = 17714184600411987649 + field c22 = 13937509549526454080 + field c23 = 8467973550572764378 + field c24 = 6149415607253035464 + field c25 = 9902966326901151535 + field c26 = 2299003035066075543 + field c27 = 9361464291309771166 + field c28 = 455760044697694737 + field c29 = 18069040773191725180 + field c30 = 12156451030386903890 + field c31 = 13269466490844642616 + field c32 = 4644627377627776228 + field c33 = 11517517066878151266 + field c34 = 2085762791679771559 + field c35 = 14341814612745946357 + field c36 = 8220722365145856681 + field c37 = 13781050119424493396 + field c38 = 14130172974922698924 + field c39 = 1268378720849035897 + field c40 = 13102522127585690797 + field c41 = 6435545073175926153 + field c42 = 10680323768845634897 + field c43 = 5377035848961467433 + field c44 = 16155044248960735250 + field c45 = 3956646720460237409 + field c46 = 15192201422078376101 + field c47 = 2254261886235227853 + field c48 = 18263210726053991346 + field c49 = 14588739567027142820 + field c50 = 9572725267846457115 + field c51 = 4663609806895345720 + field c52 = 16822560014146547002 + field c53 = 12821481803562047313 + field c54 = 3027425978972870548 + field c55 = 16762600845752241175 + field c56 = 7067459971848174565 + field c57 = 15884202556186149044 + field c58 = 8501625320175123709 + field c59 = 4388367812943946907 + field c60 = 12299931046827323210 + field c61 = 7636538909023199578 + field c62 = 14046758094336955416 + field c63 = 9633246818970530654 + field c64 = 13491266525055530545 + field c65 = 5423497366234120042 + field c66 = 1751962590333377264 + field c67 = 10513677123715294214 + field c68 = 996968784189528765 + field c69 = 10448850931434990018 + field c70 = 8953917554828103116 + field c71 = 1626108945262700028 + field c72 = 5891489572384527092 + field c73 = 6643806719713918869 + field c74 = 16083801189239088971 + field c75 = 14868933033345963433 + field c76 = 11850469235653996642 + field c77 = 1324483046183023543 + field c78 = 15183755263354743993 + field c79 = 2495724238845411316 + field c80 = 8731170262888399569 + field c81 = 16304783671381988951 + field c82 = 11235544699283452233 + field c83 = 2137768936382175302 + field c84 = 16675115627845335581 + field c85 = 2963350077420008404 + field c86 = 5398589702654192916 + field c87 = 12140466249394573251 + field c88 = 11834547998206516929 + field c89 = 6177294541684099188 + field c90 = 9838863225522131903 + field c91 = 4701779667688073310 + field c92 = 12835837905699815771 + field c93 = 2968170957340817290 + field c94 = 9828791715764525853 + field c95 = 8442028361006693278 + field c96 = 17176968168399522482 + field c97 = 17999791729505949887 + field c98 = 14962719204200253756 + field c99 = 17300730933512754375 + field c100 = 4222119091375155707 + field c101 = 11298113638119509435 + field c102 = 12268859188885459376 + field c103 = 9034427714391492438 + field c104 = 5990277340027239801 + field c105 = 726299115287076863 + field c106 = 18303937711932738539 + field c107 = 8960550811937596675 + field c108 = 18420334683743066202 + field c109 = 16986003784188475276 + field c110 = 13588430238611272524 + field c111 = 18102499241351263781 + field c112 = 7476618494341797169 + field c113 = 4184084235455659562 + field c114 = 5668298044436776508 + field c115 = 17447913737721385190 + field c116 = 11088130260910156172 + field c117 = 8792531517070849900 + field c118 = 9397646851851459952 + field c119 = 5121871193730760910 + field c120 = 2168557202402322871 + field c121 = 15702569595864319029 + field c122 = 14720843552400861125 + field c123 = 8277634810410081765 + field c124 = 6233674368436885280 + field c125 = 4306433523940866942 + field c126 = 17722591435523141845 + field c127 = 13983984591359038932 + field c128 = 9195938109190900291 + field c129 = 6074479640755470700 + field c130 = 14078059641315677730 + field c131 = 10695375213011552670 + field c132 = 5573015714231677140 + field c133 = 16984666835191674642 + field c134 = 10249524339733897711 + field c135 = 3174518716637848153 + field c136 = 7188570775991726809 + field c137 = 4753011490148598290 + field c138 = 5105443631000558491 + field c139 = 15781086678953962161 + field c140 = 3458297099390436339 + field c141 = 3082524552292086 + field c142 = 10885272710257457992 + field c143 = 3236146052509314745 + field c144 = 9696124289212404307 + field c145 = 1485008535953646698 + field c146 = 1137225154782514508 + field c147 = 10514784977699897262 + field c148 = 10729284392631787423 + field c149 = 14959018802228526836 + field c150 = 5311814720150441561 + field c151 = 15855390943452519568 + field c152 = 11214465269186418739 + field c153 = 4053806423852004669 + field c154 = 11760999889540157928 + field c155 = 13155611628497688688 + field c156 = 3842739007828054055 + field c157 = 5711430659662298364 + field c158 = 13288819076998297778 + field c159 = 4820382956965774345 + field c160 = 9818136475875046170 + field c161 = 15891193043142164602 + field c162 = 11369901158293474981 + field c163 = 16014685768489088745 + field c164 = 1356361795046325322 + field c165 = 15790892392481609398 + field c166 = 14921870878617925995 + field c167 = 7687231355395058862 + field c168 = 14150434200392676099 + field c169 = 1103438709908116920 + field c170 = 6477771864968923918 + field c171 = 17883003884435853137 + field c172 = 15616808237597542650 + field c173 = 298930612681613218 + field c174 = 7783145673030144050 + field c175 = 9925877788921434933 + field c176 = 7906428066733709088 + field c177 = 9059024899257096185 + field c178 = 12128791653883821821 + field c179 = 10439342184366574094 + field c180 = 16838255109359414152 + field c181 = 16778733411203605167 + field c182 = 3209921692078731530 + field c183 = 5829411678714675631 + field c184 = 13546305324682002944 + field c185 = 14388669943129102066 + field c186 = 16955277212659953284 + field c187 = 470060073341462642 + field c188 = 9865599081512514471 + field c189 = 3450866718365881982 + field c190 = 18253332465868317974 + field c191 = 8224383463926128747 + field c192 = 130168533448866398 + field c193 = 18296913789182388911 + field c194 = 9308875868804582517 + field c195 = 6860185202164278388 + field c196 = 5870361400608292852 + field c197 = 3853169742702299288 + field c198 = 2828579906117525532 + field c199 = 8244689163068534246 + field c200 = 14622287387679457865 + field c201 = 12818724415397588863 + field c202 = 9032795459261424103 + field c203 = 8582165566672449484 + field c204 = 1212546459474121359 + field c205 = 10720339750995594781 + field c206 = 9969473243746656646 + field c207 = 11889569503442370601 + field c208 = 8693000785136236266 + field c209 = 16911102564849626327 + field c210 = 10711317080423442023 + field c211 = 4092936164155659784 + field c212 = 9444614550731573011 + field c213 = 12734967290928938181 + field c214 = 2968663829197022452 + field c215 = 2063412078139901611 + field c216 = 6756409496657354005 + field c217 = 1956289224556834622 + field c218 = 17971879772361152496 + field c219 = 11129036599170922734 + field c220 = 6015714579300332596 + field c221 = 13952747316952120325 + field c222 = 6512928506883814256 + field c223 = 15000527898579580837 + field c224 = 13438817240481151739 + field c225 = 3438974907999726212 + field c226 = 2675270561650848698 + field c227 = 10615408741625344128 + field c228 = 15097127622747154430 + field c229 = 18306211703619792030 + field c230 = 18282207759862860963 + field c231 = 3969670710369869305 + field c232 = 15355909293594283010 + field c233 = 15825197601644123886 + field c234 = 12025247290627247881 + field c235 = 9244373186029472974 + field c236 = 8111711196724032485 + field c237 = 13910625786903113352 + field c238 = 4303582664435413453 + field c239 = 3615529122737143133 + field c240 = 13220640289699986291 + field c241 = 10945048589905126881 + field c242 = 18345446024459547893 + field c243 = 15246969291153869719 + field c244 = 3339771865943361715 + field c245 = 7920776184990771299 + field c246 = 11282075447781111045 + field c247 = 10409571270584994188 + field c248 = 7215903119088030248 + field c249 = 7149080371149851697 + field c250 = 12805983536086727637 + field c251 = 11544704273904429996 + field c252 = 3056733444472163063 + field c253 = 12775412729058442397 + field c254 = 10120906816355467459 + field c255 = 8580478192693828704 + field c256 = 17569548953071784548 + field c257 = 15170454632914839133 + field c258 = 11570807611472296007 + field c259 = 10726909497040777105 + field c260 = 440756088013805182 + field c261 = 7569336675219092295 + field c262 = 10579530867946972688 + field c263 = 10974325257620388506 + field c264 = 3053362977696829619 + field c265 = 17168463938106116617 + field c266 = 13835667625615860908 + field c267 = 2095873483773389479 + field c268 = 2016987140591259174 + field c269 = 2386979931999911847 + field c270 = 2505164847016101177 + field c271 = 13627451220086273527 + field c272 = 5731572550841603667 + field c273 = 15438639334109998771 + field c274 = 12813614048997555325 + field c275 = 10186814175982828107 + field c276 = 16191184896882054112 + field c277 = 14703692647542166085 + field c278 = 12578830251623636174 + field c279 = 1883855031971540983 + field c280 = 1266038367760006278 + field c281 = 11230634812224943920 + field c282 = 11308504110418640097 + field c283 = 6328296428453151721 + field c284 = 108818186627960168 + field c285 = 15547570943643535551 + field c286 = 4315257403857009861 + field c287 = 6380448982060371429 + field c288 = 632889842882717873 + field c289 = 7687981897540030037 + field c290 = 2375004428285747026 + field c291 = 1352206380036636795 + field c292 = 2578260287095025994 + field c293 = 2465523090448545549 + field c294 = 4247285443750660784 + field c295 = 3540885980673334329 + field c296 = 3345957484484543597 + field c297 = 11380792058791615855 + field c298 = 3199862384571235298 + field c299 = 173879172622348856 + field c300 = 15209080508353549507 + field c301 = 11649978506589666631 + field c302 = 9173090522521364544 + field c303 = 17030945052114083432 + field c304 = 4591187677780222237 + field c305 = 4064474173561892218 + field c306 = 15789829170657683922 + field c307 = 18208193905710242077 + field c308 = 14715997988505596440 + field c309 = 14667972935108688793 + field c310 = 5685168615648408563 + field c311 = 5245239484537042399 + field c312 = 3667459350052205975 + field c313 = 9197423732344085415 + field c314 = 4102452659988315248 + field c315 = 6641847341527232917 + field c316 = 12480319858851986779 + field c317 = 5186375792939856127 + field c318 = 2950251364917852338 + field c319 = 14773928965023494669 + field c320 = 12693729432082377979 + field c321 = 10022034381199683741 + field c322 = 9157237748502939080 + field c323 = 9663275337098404028 + field c324 = 13452894763307783925 + field c325 = 17376241946508742183 + field c326 = 3061844045327119072 + field c327 = 16030845287947531828 + field c328 = 1329076042067568487 + field c329 = 6855142122269391811 + field c330 = 11765672489282549160 + field c331 = 16830774944875965381 + field c332 = 6521069374664264162 + field c333 = 643523635231852913 + field c334 = 17135479068108868253 + field c335 = 4691294308622704824 + field c336 = 14491408402222977368 + field c337 = 18443726244814588799 + field c338 = 3981855558016600424 + field c339 = 6519895386704965259 + field c340 = 12833833766931651330 + field c341 = 5955046055337035381 + field c342 = 12102114200670204984 + field c343 = 17975981029431378883 + field c344 = 17148695856475432045 + field c345 = 4359514157740747375 + field c346 = 4733737572453903189 + field c347 = 9216164030888884101 + field c348 = 11898192372834399996 + field c349 = 8293149570945521798 + field c350 = 5292998910181620016 + field c351 = 11065412642848915128 + field c352 = 15951602728119640232 + field c353 = 17250120023723813262 + field c354 = 4208067670865654520 + field c355 = 4170990196992221254 + field c356 = 1364275915544901155 + field c357 = 5204734139073276471 + field c358 = 1348335617598418065 + field c359 = 4844946001170596348 + field c360 = 6839747835867181919 + field c361 = 5053317630835107264 + field c362 = 11056210036248139432 + field c363 = 1381878963923170929 + field c364 = 16574699770444639361 + field c365 = 8108738101012231328 + field c366 = 5608591239825657577 + field c367 = 2655890021744410286 + field c368 = 1274076210795298659 + field c369 = 11394663484515968481 + field c370 = 10856028813008380196 + field c371 = 13953897966883300641 + field c372 = 2480138023543998637 + field c373 = 8092805429879378234 + field c374 = 15734383915406361638 + field c375 = 12606199089969720633 + field c376 = 3432862751254991632 + field c377 = 11620001581001631894 + field c378 = 600733227997580875 + field c379 = 9960515431061710391 + field c380 = 15489520790087945179 + field c381 = 9888006245836622059 + field c382 = 16555061763510382783 + field c383 = 5729882798372086417 + field c384 = 18193672778018355673 + field c385 = 1822658993478572731 + field c386 = 5003044969628961755 + field c387 = 13153107988347151430 + field c388 = 784457190336231507 + field c389 = 13520638662186896236 + field c390 = 2049546776680600500 + field c391 = 10461088023685880055 + field c392 = 14926219627271786921 + field c393 = 17417636229842539696 + field c394 = 12492153963185454352 + field c395 = 414142119733528902 + field c396 = 17193096568008516286 + field c397 = 17273750640915671574 + field c398 = 2591282858188044874 + field c399 = 1735410450107017713 + field c400 = 10687387921399705460 + field c401 = 8183629028325381283 + field c402 = 10514917847412402927 + field c403 = 3336665081692857317 + field c404 = 5051946386531163563 + field c405 = 9781529663474696061 + field c406 = 13935324224847496391 + field c407 = 12199928622022129120 + field c408 = 18046988489253129363 + field c409 = 5360148275199876436 + field c410 = 4470351170521662089 + field c411 = 4053340142176580658 + field c412 = 7099987801407623156 + field c413 = 8643889260231910466 + field c414 = 8009486459327768919 + field c415 = 14356550044319110877 + field c416 = 1414693227423376523 + field c417 = 4179767940638916940 + field c418 = 13567672199210649738 + field c419 = 13138927205843206565 + field c420 = 215760839592843100 + field c421 = 16441790535445707930 + field c422 = 11718341735146782011 + field c423 = 12912429887242802458 + field c424 = 17517646119074274016 + field c425 = 7879023854534232228 + field c426 = 8728793248242325455 + field c427 = 5947682549087889590 + field c428 = 2708204009019253719 + field c429 = 2411670237320420929 + field c430 = 13609437845180998639 + field c431 = 10111681102226214657 + field c432 = 3316234197538285735 + field c433 = 2660139758422335686 + field c434 = 12151415153659423964 + field c435 = 8951257134131846586 + field c436 = 8730277595668694550 + field c437 = 11649943321766601019 + field c438 = 446558882505765024 + field c439 = 6924831314803654178 + field c440 = 16439861000844197132 + + field m0 = 15058071544716697658 + field m1 = 9113155049989891189 + field m2 = 11350291668724975614 + field m3 = 9632313156395526262 + field m4 = 10413730688534659007 + field m5 = 3697752025371176728 + field m6 = 11885276071251709314 + field m7 = 16598884434632610234 + field m8 = 8089761759414446189 + field m9 = 16040926183245094672 + field m10 = 8904964827445835399 + field m11 = 12487570753220630667 + field m12 = 3761754934154259876 + field m13 = 10365474600392912237 + field m14 = 18215459870146304436 + field m15 = 2521867902521748797 + field m16 = 9276651354726850372 + field m17 = 2876546369175151218 + field m18 = 2535340427714539962 + field m19 = 17035695180503554455 + field m20 = 5065438235784555509 + field m21 = 16133217454234073776 + field m22 = 7083511463634692513 + field m23 = 9613984133077979495 + field m24 = 1331692021515548952 + field m25 = 12210106727545806375 + field m26 = 13648177365769586846 + field m27 = 15042137044708510189 + field m28 = 2554730408162944936 + field m29 = 16742667895331233611 + field m30 = 2494776793515665277 + field m31 = 14141966007005028685 + field m32 = 18062101036985256707 + field m33 = 755902906165376348 + field m34 = 386844847374139936 + field m35 = 12578289204908190735 + field m36 = 16474772505071285176 + field m37 = 4219412987430389417 + field m38 = 13785604981959978986 + field m39 = 6782700766578855354 + field m40 = 5027408469346314244 + field m41 = 3789778619153321757 + field m42 = 4990630321935587007 + field m43 = 13343213396420799882 + field m44 = 104089557996796214 + field m45 = 17594182424895122809 + field m46 = 1296646801898316520 + field m47 = 16927267389512340836 + field m48 = 15388042990166044599 + field m49 = 1062925035106735976 + field m50 = 6174325826189609393 + field m51 = 9654539659217203050 + field m52 = 3981669703948237017 + field m53 = 13344532373627816122 + field m54 = 9909148060180400932 + field m55 = 9832668435387834018 + field m56 = 16021044824039400858 + field m57 = 7712461657304026032 + field m58 = 7561823410587799308 + field m59 = 17083550112806683136 + field m60 = 6790038977110107895 + field m61 = 8056988792082041187 + field m62 = 6124556526406334790 + field m63 = 17224325032903033822 + field m64 = 12410794060221759964 + field m65 = 10618334591673088738 + field m66 = 3068156503820110383 + field m67 = 15231507067321079252 + field m68 = 11188165925029871979 + field m69 = 5971633157944515473 + field m70 = 2082638771837317713 + field m71 = 17302560278506804885 + field m72 = 7129447512455292844 + field m73 = 11141849528205973065 + field m74 = 15114786009406193424 + field m75 = 7449599548096808934 + field m76 = 12350858481215818754 + field m77 = 14112714168528178524 + field m78 = 16341673650923705326 + field m79 = 15739229265965988419 + field m80 = 6384637781573600052 + + // -- + // r = 0 + // ark + state0_0 = state0_0 + c0 + state1_0 = state1_0 + c1 + state2_0 = state2_0 + c2 + state3_0 = state3_0 + c3 + state4_0 = state4_0 + c4 + state5_0 = state5_0 + c5 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 1 + // ark + state0_0 = state0_0 + c6 + state1_0 = state1_0 + c7 + state2_0 = state2_0 + c8 + state3_0 = state3_0 + c9 + state4_0 = state4_0 + c10 + state5_0 = state5_0 + c11 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 2 + // ark + state0_0 = state0_0 + c12 + state1_0 = state1_0 + c13 + state2_0 = state2_0 + c14 + state3_0 = state3_0 + c15 + state4_0 = state4_0 + c16 + state5_0 = state5_0 + c17 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 3 + // ark + state0_0 = state0_0 + c18 + state1_0 = state1_0 + c19 + state2_0 = state2_0 + c20 + state3_0 = state3_0 + c21 + state4_0 = state4_0 + c22 + state5_0 = state5_0 + c23 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 4 + // ark + state0_0 = state0_0 + c24 + state1_0 = state1_0 + c25 + state2_0 = state2_0 + c26 + state3_0 = state3_0 + c27 + state4_0 = state4_0 + c28 + state5_0 = state5_0 + c29 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 5 + // ark + state0_0 = state0_0 + c30 + state1_0 = state1_0 + c31 + state2_0 = state2_0 + c32 + state3_0 = state3_0 + c33 + state4_0 = state4_0 + c34 + state5_0 = state5_0 + c35 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 6 + // ark + state0_0 = state0_0 + c36 + state1_0 = state1_0 + c37 + state2_0 = state2_0 + c38 + state3_0 = state3_0 + c39 + state4_0 = state4_0 + c40 + state5_0 = state5_0 + c41 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 7 + // ark + state0_0 = state0_0 + c42 + state1_0 = state1_0 + c43 + state2_0 = state2_0 + c44 + state3_0 = state3_0 + c45 + state4_0 = state4_0 + c46 + state5_0 = state5_0 + c47 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 8 + // ark + state0_0 = state0_0 + c48 + state1_0 = state1_0 + c49 + state2_0 = state2_0 + c50 + state3_0 = state3_0 + c51 + state4_0 = state4_0 + c52 + state5_0 = state5_0 + c53 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 9 + // ark + state0_0 = state0_0 + c54 + state1_0 = state1_0 + c55 + state2_0 = state2_0 + c56 + state3_0 = state3_0 + c57 + state4_0 = state4_0 + c58 + state5_0 = state5_0 + c59 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 10 + // ark + state0_0 = state0_0 + c60 + state1_0 = state1_0 + c61 + state2_0 = state2_0 + c62 + state3_0 = state3_0 + c63 + state4_0 = state4_0 + c64 + state5_0 = state5_0 + c65 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 11 + // ark + state0_0 = state0_0 + c66 + state1_0 = state1_0 + c67 + state2_0 = state2_0 + c68 + state3_0 = state3_0 + c69 + state4_0 = state4_0 + c70 + state5_0 = state5_0 + c71 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 12 + // ark + state0_0 = state0_0 + c72 + state1_0 = state1_0 + c73 + state2_0 = state2_0 + c74 + state3_0 = state3_0 + c75 + state4_0 = state4_0 + c76 + state5_0 = state5_0 + c77 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 13 + // ark + state0_0 = state0_0 + c78 + state1_0 = state1_0 + c79 + state2_0 = state2_0 + c80 + state3_0 = state3_0 + c81 + state4_0 = state4_0 + c82 + state5_0 = state5_0 + c83 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 14 + // ark + state0_0 = state0_0 + c84 + state1_0 = state1_0 + c85 + state2_0 = state2_0 + c86 + state3_0 = state3_0 + c87 + state4_0 = state4_0 + c88 + state5_0 = state5_0 + c89 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 15 + // ark + state0_0 = state0_0 + c90 + state1_0 = state1_0 + c91 + state2_0 = state2_0 + c92 + state3_0 = state3_0 + c93 + state4_0 = state4_0 + c94 + state5_0 = state5_0 + c95 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 16 + // ark + state0_0 = state0_0 + c96 + state1_0 = state1_0 + c97 + state2_0 = state2_0 + c98 + state3_0 = state3_0 + c99 + state4_0 = state4_0 + c100 + state5_0 = state5_0 + c101 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 17 + // ark + state0_0 = state0_0 + c102 + state1_0 = state1_0 + c103 + state2_0 = state2_0 + c104 + state3_0 = state3_0 + c105 + state4_0 = state4_0 + c106 + state5_0 = state5_0 + c107 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 18 + // ark + state0_0 = state0_0 + c108 + state1_0 = state1_0 + c109 + state2_0 = state2_0 + c110 + state3_0 = state3_0 + c111 + state4_0 = state4_0 + c112 + state5_0 = state5_0 + c113 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 19 + // ark + state0_0 = state0_0 + c114 + state1_0 = state1_0 + c115 + state2_0 = state2_0 + c116 + state3_0 = state3_0 + c117 + state4_0 = state4_0 + c118 + state5_0 = state5_0 + c119 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 20 + // ark + state0_0 = state0_0 + c120 + state1_0 = state1_0 + c121 + state2_0 = state2_0 + c122 + state3_0 = state3_0 + c123 + state4_0 = state4_0 + c124 + state5_0 = state5_0 + c125 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 21 + // ark + state0_0 = state0_0 + c126 + state1_0 = state1_0 + c127 + state2_0 = state2_0 + c128 + state3_0 = state3_0 + c129 + state4_0 = state4_0 + c130 + state5_0 = state5_0 + c131 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 22 + // ark + state0_0 = state0_0 + c132 + state1_0 = state1_0 + c133 + state2_0 = state2_0 + c134 + state3_0 = state3_0 + c135 + state4_0 = state4_0 + c136 + state5_0 = state5_0 + c137 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 23 + // ark + state0_0 = state0_0 + c138 + state1_0 = state1_0 + c139 + state2_0 = state2_0 + c140 + state3_0 = state3_0 + c141 + state4_0 = state4_0 + c142 + state5_0 = state5_0 + c143 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 24 + // ark + state0_0 = state0_0 + c144 + state1_0 = state1_0 + c145 + state2_0 = state2_0 + c146 + state3_0 = state3_0 + c147 + state4_0 = state4_0 + c148 + state5_0 = state5_0 + c149 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 25 + // ark + state0_0 = state0_0 + c150 + state1_0 = state1_0 + c151 + state2_0 = state2_0 + c152 + state3_0 = state3_0 + c153 + state4_0 = state4_0 + c154 + state5_0 = state5_0 + c155 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 26 + // ark + state0_0 = state0_0 + c156 + state1_0 = state1_0 + c157 + state2_0 = state2_0 + c158 + state3_0 = state3_0 + c159 + state4_0 = state4_0 + c160 + state5_0 = state5_0 + c161 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 27 + // ark + state0_0 = state0_0 + c162 + state1_0 = state1_0 + c163 + state2_0 = state2_0 + c164 + state3_0 = state3_0 + c165 + state4_0 = state4_0 + c166 + state5_0 = state5_0 + c167 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 28 + // ark + state0_0 = state0_0 + c168 + state1_0 = state1_0 + c169 + state2_0 = state2_0 + c170 + state3_0 = state3_0 + c171 + state4_0 = state4_0 + c172 + state5_0 = state5_0 + c173 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 29 + // ark + state0_0 = state0_0 + c174 + state1_0 = state1_0 + c175 + state2_0 = state2_0 + c176 + state3_0 = state3_0 + c177 + state4_0 = state4_0 + c178 + state5_0 = state5_0 + c179 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 30 + // ark + state0_0 = state0_0 + c180 + state1_0 = state1_0 + c181 + state2_0 = state2_0 + c182 + state3_0 = state3_0 + c183 + state4_0 = state4_0 + c184 + state5_0 = state5_0 + c185 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 31 + // ark + state0_0 = state0_0 + c186 + state1_0 = state1_0 + c187 + state2_0 = state2_0 + c188 + state3_0 = state3_0 + c189 + state4_0 = state4_0 + c190 + state5_0 = state5_0 + c191 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 32 + // ark + state0_0 = state0_0 + c192 + state1_0 = state1_0 + c193 + state2_0 = state2_0 + c194 + state3_0 = state3_0 + c195 + state4_0 = state4_0 + c196 + state5_0 = state5_0 + c197 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 33 + // ark + state0_0 = state0_0 + c198 + state1_0 = state1_0 + c199 + state2_0 = state2_0 + c200 + state3_0 = state3_0 + c201 + state4_0 = state4_0 + c202 + state5_0 = state5_0 + c203 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 34 + // ark + state0_0 = state0_0 + c204 + state1_0 = state1_0 + c205 + state2_0 = state2_0 + c206 + state3_0 = state3_0 + c207 + state4_0 = state4_0 + c208 + state5_0 = state5_0 + c209 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 35 + // ark + state0_0 = state0_0 + c210 + state1_0 = state1_0 + c211 + state2_0 = state2_0 + c212 + state3_0 = state3_0 + c213 + state4_0 = state4_0 + c214 + state5_0 = state5_0 + c215 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 36 + // ark + state0_0 = state0_0 + c216 + state1_0 = state1_0 + c217 + state2_0 = state2_0 + c218 + state3_0 = state3_0 + c219 + state4_0 = state4_0 + c220 + state5_0 = state5_0 + c221 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 37 + // ark + state0_0 = state0_0 + c222 + state1_0 = state1_0 + c223 + state2_0 = state2_0 + c224 + state3_0 = state3_0 + c225 + state4_0 = state4_0 + c226 + state5_0 = state5_0 + c227 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 38 + // ark + state0_0 = state0_0 + c228 + state1_0 = state1_0 + c229 + state2_0 = state2_0 + c230 + state3_0 = state3_0 + c231 + state4_0 = state4_0 + c232 + state5_0 = state5_0 + c233 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 39 + // ark + state0_0 = state0_0 + c234 + state1_0 = state1_0 + c235 + state2_0 = state2_0 + c236 + state3_0 = state3_0 + c237 + state4_0 = state4_0 + c238 + state5_0 = state5_0 + c239 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 40 + // ark + state0_0 = state0_0 + c240 + state1_0 = state1_0 + c241 + state2_0 = state2_0 + c242 + state3_0 = state3_0 + c243 + state4_0 = state4_0 + c244 + state5_0 = state5_0 + c245 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 41 + // ark + state0_0 = state0_0 + c246 + state1_0 = state1_0 + c247 + state2_0 = state2_0 + c248 + state3_0 = state3_0 + c249 + state4_0 = state4_0 + c250 + state5_0 = state5_0 + c251 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 42 + // ark + state0_0 = state0_0 + c252 + state1_0 = state1_0 + c253 + state2_0 = state2_0 + c254 + state3_0 = state3_0 + c255 + state4_0 = state4_0 + c256 + state5_0 = state5_0 + c257 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 43 + // ark + state0_0 = state0_0 + c258 + state1_0 = state1_0 + c259 + state2_0 = state2_0 + c260 + state3_0 = state3_0 + c261 + state4_0 = state4_0 + c262 + state5_0 = state5_0 + c263 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 44 + // ark + state0_0 = state0_0 + c264 + state1_0 = state1_0 + c265 + state2_0 = state2_0 + c266 + state3_0 = state3_0 + c267 + state4_0 = state4_0 + c268 + state5_0 = state5_0 + c269 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 45 + // ark + state0_0 = state0_0 + c270 + state1_0 = state1_0 + c271 + state2_0 = state2_0 + c272 + state3_0 = state3_0 + c273 + state4_0 = state4_0 + c274 + state5_0 = state5_0 + c275 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 46 + // ark + state0_0 = state0_0 + c276 + state1_0 = state1_0 + c277 + state2_0 = state2_0 + c278 + state3_0 = state3_0 + c279 + state4_0 = state4_0 + c280 + state5_0 = state5_0 + c281 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 47 + // ark + state0_0 = state0_0 + c282 + state1_0 = state1_0 + c283 + state2_0 = state2_0 + c284 + state3_0 = state3_0 + c285 + state4_0 = state4_0 + c286 + state5_0 = state5_0 + c287 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 48 + // ark + state0_0 = state0_0 + c288 + state1_0 = state1_0 + c289 + state2_0 = state2_0 + c290 + state3_0 = state3_0 + c291 + state4_0 = state4_0 + c292 + state5_0 = state5_0 + c293 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 49 + // ark + state0_0 = state0_0 + c294 + state1_0 = state1_0 + c295 + state2_0 = state2_0 + c296 + state3_0 = state3_0 + c297 + state4_0 = state4_0 + c298 + state5_0 = state5_0 + c299 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 50 + // ark + state0_0 = state0_0 + c300 + state1_0 = state1_0 + c301 + state2_0 = state2_0 + c302 + state3_0 = state3_0 + c303 + state4_0 = state4_0 + c304 + state5_0 = state5_0 + c305 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 51 + // ark + state0_0 = state0_0 + c306 + state1_0 = state1_0 + c307 + state2_0 = state2_0 + c308 + state3_0 = state3_0 + c309 + state4_0 = state4_0 + c310 + state5_0 = state5_0 + c311 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 52 + // ark + state0_0 = state0_0 + c312 + state1_0 = state1_0 + c313 + state2_0 = state2_0 + c314 + state3_0 = state3_0 + c315 + state4_0 = state4_0 + c316 + state5_0 = state5_0 + c317 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 53 + // ark + state0_0 = state0_0 + c318 + state1_0 = state1_0 + c319 + state2_0 = state2_0 + c320 + state3_0 = state3_0 + c321 + state4_0 = state4_0 + c322 + state5_0 = state5_0 + c323 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 54 + // ark + state0_0 = state0_0 + c324 + state1_0 = state1_0 + c325 + state2_0 = state2_0 + c326 + state3_0 = state3_0 + c327 + state4_0 = state4_0 + c328 + state5_0 = state5_0 + c329 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 55 + // ark + state0_0 = state0_0 + c330 + state1_0 = state1_0 + c331 + state2_0 = state2_0 + c332 + state3_0 = state3_0 + c333 + state4_0 = state4_0 + c334 + state5_0 = state5_0 + c335 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 56 + // ark + state0_0 = state0_0 + c336 + state1_0 = state1_0 + c337 + state2_0 = state2_0 + c338 + state3_0 = state3_0 + c339 + state4_0 = state4_0 + c340 + state5_0 = state5_0 + c341 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 57 + // ark + state0_0 = state0_0 + c342 + state1_0 = state1_0 + c343 + state2_0 = state2_0 + c344 + state3_0 = state3_0 + c345 + state4_0 = state4_0 + c346 + state5_0 = state5_0 + c347 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 58 + // ark + state0_0 = state0_0 + c348 + state1_0 = state1_0 + c349 + state2_0 = state2_0 + c350 + state3_0 = state3_0 + c351 + state4_0 = state4_0 + c352 + state5_0 = state5_0 + c353 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 59 + // ark + state0_0 = state0_0 + c354 + state1_0 = state1_0 + c355 + state2_0 = state2_0 + c356 + state3_0 = state3_0 + c357 + state4_0 = state4_0 + c358 + state5_0 = state5_0 + c359 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 60 + // ark + state0_0 = state0_0 + c360 + state1_0 = state1_0 + c361 + state2_0 = state2_0 + c362 + state3_0 = state3_0 + c363 + state4_0 = state4_0 + c364 + state5_0 = state5_0 + c365 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 61 + // ark + state0_0 = state0_0 + c366 + state1_0 = state1_0 + c367 + state2_0 = state2_0 + c368 + state3_0 = state3_0 + c369 + state4_0 = state4_0 + c370 + state5_0 = state5_0 + c371 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 62 + // ark + state0_0 = state0_0 + c372 + state1_0 = state1_0 + c373 + state2_0 = state2_0 + c374 + state3_0 = state3_0 + c375 + state4_0 = state4_0 + c376 + state5_0 = state5_0 + c377 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 63 + // ark + state0_0 = state0_0 + c378 + state1_0 = state1_0 + c379 + state2_0 = state2_0 + c380 + state3_0 = state3_0 + c381 + state4_0 = state4_0 + c382 + state5_0 = state5_0 + c383 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 + field new_state2_0 = state2_0 + field new_state3_0 = state3_0 + field new_state4_0 = state4_0 + field new_state5_0 = state5_0 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 64 + // ark + state0_0 = state0_0 + c384 + state1_0 = state1_0 + c385 + state2_0 = state2_0 + c386 + state3_0 = state3_0 + c387 + state4_0 = state4_0 + c388 + state5_0 = state5_0 + c389 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 65 + // ark + state0_0 = state0_0 + c390 + state1_0 = state1_0 + c391 + state2_0 = state2_0 + c392 + state3_0 = state3_0 + c393 + state4_0 = state4_0 + c394 + state5_0 = state5_0 + c395 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 66 + // ark + state0_0 = state0_0 + c396 + state1_0 = state1_0 + c397 + state2_0 = state2_0 + c398 + state3_0 = state3_0 + c399 + state4_0 = state4_0 + c400 + state5_0 = state5_0 + c401 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 67 + // ark + state0_0 = state0_0 + c402 + state1_0 = state1_0 + c403 + state2_0 = state2_0 + c404 + state3_0 = state3_0 + c405 + state4_0 = state4_0 + c406 + state5_0 = state5_0 + c407 + // sbox + field new_state0_0 = state0_0 ** 5 + field new_state1_0 = state1_0 ** 5 + field new_state2_0 = state2_0 ** 5 + field new_state3_0 = state3_0 ** 5 + field new_state4_0 = state4_0 ** 5 + field new_state5_0 = state5_0 ** 5 + // mix + state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 + state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 + state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 + state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 + state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 + state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 + // -- + // r = 0 + // ark + state0_1 = state0_1 + c0 + state1_1 = state1_1 + c1 + state2_1 = state2_1 + c2 + state3_1 = state3_1 + c3 + state4_1 = state4_1 + c4 + state5_1 = state5_1 + c5 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 1 + // ark + state0_1 = state0_1 + c6 + state1_1 = state1_1 + c7 + state2_1 = state2_1 + c8 + state3_1 = state3_1 + c9 + state4_1 = state4_1 + c10 + state5_1 = state5_1 + c11 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 2 + // ark + state0_1 = state0_1 + c12 + state1_1 = state1_1 + c13 + state2_1 = state2_1 + c14 + state3_1 = state3_1 + c15 + state4_1 = state4_1 + c16 + state5_1 = state5_1 + c17 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 3 + // ark + state0_1 = state0_1 + c18 + state1_1 = state1_1 + c19 + state2_1 = state2_1 + c20 + state3_1 = state3_1 + c21 + state4_1 = state4_1 + c22 + state5_1 = state5_1 + c23 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 4 + // ark + state0_1 = state0_1 + c24 + state1_1 = state1_1 + c25 + state2_1 = state2_1 + c26 + state3_1 = state3_1 + c27 + state4_1 = state4_1 + c28 + state5_1 = state5_1 + c29 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 5 + // ark + state0_1 = state0_1 + c30 + state1_1 = state1_1 + c31 + state2_1 = state2_1 + c32 + state3_1 = state3_1 + c33 + state4_1 = state4_1 + c34 + state5_1 = state5_1 + c35 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 6 + // ark + state0_1 = state0_1 + c36 + state1_1 = state1_1 + c37 + state2_1 = state2_1 + c38 + state3_1 = state3_1 + c39 + state4_1 = state4_1 + c40 + state5_1 = state5_1 + c41 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 7 + // ark + state0_1 = state0_1 + c42 + state1_1 = state1_1 + c43 + state2_1 = state2_1 + c44 + state3_1 = state3_1 + c45 + state4_1 = state4_1 + c46 + state5_1 = state5_1 + c47 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 8 + // ark + state0_1 = state0_1 + c48 + state1_1 = state1_1 + c49 + state2_1 = state2_1 + c50 + state3_1 = state3_1 + c51 + state4_1 = state4_1 + c52 + state5_1 = state5_1 + c53 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 9 + // ark + state0_1 = state0_1 + c54 + state1_1 = state1_1 + c55 + state2_1 = state2_1 + c56 + state3_1 = state3_1 + c57 + state4_1 = state4_1 + c58 + state5_1 = state5_1 + c59 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 10 + // ark + state0_1 = state0_1 + c60 + state1_1 = state1_1 + c61 + state2_1 = state2_1 + c62 + state3_1 = state3_1 + c63 + state4_1 = state4_1 + c64 + state5_1 = state5_1 + c65 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 11 + // ark + state0_1 = state0_1 + c66 + state1_1 = state1_1 + c67 + state2_1 = state2_1 + c68 + state3_1 = state3_1 + c69 + state4_1 = state4_1 + c70 + state5_1 = state5_1 + c71 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 12 + // ark + state0_1 = state0_1 + c72 + state1_1 = state1_1 + c73 + state2_1 = state2_1 + c74 + state3_1 = state3_1 + c75 + state4_1 = state4_1 + c76 + state5_1 = state5_1 + c77 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 13 + // ark + state0_1 = state0_1 + c78 + state1_1 = state1_1 + c79 + state2_1 = state2_1 + c80 + state3_1 = state3_1 + c81 + state4_1 = state4_1 + c82 + state5_1 = state5_1 + c83 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 14 + // ark + state0_1 = state0_1 + c84 + state1_1 = state1_1 + c85 + state2_1 = state2_1 + c86 + state3_1 = state3_1 + c87 + state4_1 = state4_1 + c88 + state5_1 = state5_1 + c89 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 15 + // ark + state0_1 = state0_1 + c90 + state1_1 = state1_1 + c91 + state2_1 = state2_1 + c92 + state3_1 = state3_1 + c93 + state4_1 = state4_1 + c94 + state5_1 = state5_1 + c95 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 16 + // ark + state0_1 = state0_1 + c96 + state1_1 = state1_1 + c97 + state2_1 = state2_1 + c98 + state3_1 = state3_1 + c99 + state4_1 = state4_1 + c100 + state5_1 = state5_1 + c101 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 17 + // ark + state0_1 = state0_1 + c102 + state1_1 = state1_1 + c103 + state2_1 = state2_1 + c104 + state3_1 = state3_1 + c105 + state4_1 = state4_1 + c106 + state5_1 = state5_1 + c107 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 18 + // ark + state0_1 = state0_1 + c108 + state1_1 = state1_1 + c109 + state2_1 = state2_1 + c110 + state3_1 = state3_1 + c111 + state4_1 = state4_1 + c112 + state5_1 = state5_1 + c113 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 19 + // ark + state0_1 = state0_1 + c114 + state1_1 = state1_1 + c115 + state2_1 = state2_1 + c116 + state3_1 = state3_1 + c117 + state4_1 = state4_1 + c118 + state5_1 = state5_1 + c119 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 20 + // ark + state0_1 = state0_1 + c120 + state1_1 = state1_1 + c121 + state2_1 = state2_1 + c122 + state3_1 = state3_1 + c123 + state4_1 = state4_1 + c124 + state5_1 = state5_1 + c125 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 21 + // ark + state0_1 = state0_1 + c126 + state1_1 = state1_1 + c127 + state2_1 = state2_1 + c128 + state3_1 = state3_1 + c129 + state4_1 = state4_1 + c130 + state5_1 = state5_1 + c131 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 22 + // ark + state0_1 = state0_1 + c132 + state1_1 = state1_1 + c133 + state2_1 = state2_1 + c134 + state3_1 = state3_1 + c135 + state4_1 = state4_1 + c136 + state5_1 = state5_1 + c137 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 23 + // ark + state0_1 = state0_1 + c138 + state1_1 = state1_1 + c139 + state2_1 = state2_1 + c140 + state3_1 = state3_1 + c141 + state4_1 = state4_1 + c142 + state5_1 = state5_1 + c143 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 24 + // ark + state0_1 = state0_1 + c144 + state1_1 = state1_1 + c145 + state2_1 = state2_1 + c146 + state3_1 = state3_1 + c147 + state4_1 = state4_1 + c148 + state5_1 = state5_1 + c149 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 25 + // ark + state0_1 = state0_1 + c150 + state1_1 = state1_1 + c151 + state2_1 = state2_1 + c152 + state3_1 = state3_1 + c153 + state4_1 = state4_1 + c154 + state5_1 = state5_1 + c155 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 26 + // ark + state0_1 = state0_1 + c156 + state1_1 = state1_1 + c157 + state2_1 = state2_1 + c158 + state3_1 = state3_1 + c159 + state4_1 = state4_1 + c160 + state5_1 = state5_1 + c161 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 27 + // ark + state0_1 = state0_1 + c162 + state1_1 = state1_1 + c163 + state2_1 = state2_1 + c164 + state3_1 = state3_1 + c165 + state4_1 = state4_1 + c166 + state5_1 = state5_1 + c167 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 28 + // ark + state0_1 = state0_1 + c168 + state1_1 = state1_1 + c169 + state2_1 = state2_1 + c170 + state3_1 = state3_1 + c171 + state4_1 = state4_1 + c172 + state5_1 = state5_1 + c173 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 29 + // ark + state0_1 = state0_1 + c174 + state1_1 = state1_1 + c175 + state2_1 = state2_1 + c176 + state3_1 = state3_1 + c177 + state4_1 = state4_1 + c178 + state5_1 = state5_1 + c179 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 30 + // ark + state0_1 = state0_1 + c180 + state1_1 = state1_1 + c181 + state2_1 = state2_1 + c182 + state3_1 = state3_1 + c183 + state4_1 = state4_1 + c184 + state5_1 = state5_1 + c185 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 31 + // ark + state0_1 = state0_1 + c186 + state1_1 = state1_1 + c187 + state2_1 = state2_1 + c188 + state3_1 = state3_1 + c189 + state4_1 = state4_1 + c190 + state5_1 = state5_1 + c191 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 32 + // ark + state0_1 = state0_1 + c192 + state1_1 = state1_1 + c193 + state2_1 = state2_1 + c194 + state3_1 = state3_1 + c195 + state4_1 = state4_1 + c196 + state5_1 = state5_1 + c197 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 33 + // ark + state0_1 = state0_1 + c198 + state1_1 = state1_1 + c199 + state2_1 = state2_1 + c200 + state3_1 = state3_1 + c201 + state4_1 = state4_1 + c202 + state5_1 = state5_1 + c203 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 34 + // ark + state0_1 = state0_1 + c204 + state1_1 = state1_1 + c205 + state2_1 = state2_1 + c206 + state3_1 = state3_1 + c207 + state4_1 = state4_1 + c208 + state5_1 = state5_1 + c209 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 35 + // ark + state0_1 = state0_1 + c210 + state1_1 = state1_1 + c211 + state2_1 = state2_1 + c212 + state3_1 = state3_1 + c213 + state4_1 = state4_1 + c214 + state5_1 = state5_1 + c215 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 36 + // ark + state0_1 = state0_1 + c216 + state1_1 = state1_1 + c217 + state2_1 = state2_1 + c218 + state3_1 = state3_1 + c219 + state4_1 = state4_1 + c220 + state5_1 = state5_1 + c221 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 37 + // ark + state0_1 = state0_1 + c222 + state1_1 = state1_1 + c223 + state2_1 = state2_1 + c224 + state3_1 = state3_1 + c225 + state4_1 = state4_1 + c226 + state5_1 = state5_1 + c227 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 38 + // ark + state0_1 = state0_1 + c228 + state1_1 = state1_1 + c229 + state2_1 = state2_1 + c230 + state3_1 = state3_1 + c231 + state4_1 = state4_1 + c232 + state5_1 = state5_1 + c233 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 39 + // ark + state0_1 = state0_1 + c234 + state1_1 = state1_1 + c235 + state2_1 = state2_1 + c236 + state3_1 = state3_1 + c237 + state4_1 = state4_1 + c238 + state5_1 = state5_1 + c239 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 40 + // ark + state0_1 = state0_1 + c240 + state1_1 = state1_1 + c241 + state2_1 = state2_1 + c242 + state3_1 = state3_1 + c243 + state4_1 = state4_1 + c244 + state5_1 = state5_1 + c245 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 41 + // ark + state0_1 = state0_1 + c246 + state1_1 = state1_1 + c247 + state2_1 = state2_1 + c248 + state3_1 = state3_1 + c249 + state4_1 = state4_1 + c250 + state5_1 = state5_1 + c251 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 42 + // ark + state0_1 = state0_1 + c252 + state1_1 = state1_1 + c253 + state2_1 = state2_1 + c254 + state3_1 = state3_1 + c255 + state4_1 = state4_1 + c256 + state5_1 = state5_1 + c257 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 43 + // ark + state0_1 = state0_1 + c258 + state1_1 = state1_1 + c259 + state2_1 = state2_1 + c260 + state3_1 = state3_1 + c261 + state4_1 = state4_1 + c262 + state5_1 = state5_1 + c263 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 44 + // ark + state0_1 = state0_1 + c264 + state1_1 = state1_1 + c265 + state2_1 = state2_1 + c266 + state3_1 = state3_1 + c267 + state4_1 = state4_1 + c268 + state5_1 = state5_1 + c269 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 45 + // ark + state0_1 = state0_1 + c270 + state1_1 = state1_1 + c271 + state2_1 = state2_1 + c272 + state3_1 = state3_1 + c273 + state4_1 = state4_1 + c274 + state5_1 = state5_1 + c275 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 46 + // ark + state0_1 = state0_1 + c276 + state1_1 = state1_1 + c277 + state2_1 = state2_1 + c278 + state3_1 = state3_1 + c279 + state4_1 = state4_1 + c280 + state5_1 = state5_1 + c281 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 47 + // ark + state0_1 = state0_1 + c282 + state1_1 = state1_1 + c283 + state2_1 = state2_1 + c284 + state3_1 = state3_1 + c285 + state4_1 = state4_1 + c286 + state5_1 = state5_1 + c287 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 48 + // ark + state0_1 = state0_1 + c288 + state1_1 = state1_1 + c289 + state2_1 = state2_1 + c290 + state3_1 = state3_1 + c291 + state4_1 = state4_1 + c292 + state5_1 = state5_1 + c293 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 49 + // ark + state0_1 = state0_1 + c294 + state1_1 = state1_1 + c295 + state2_1 = state2_1 + c296 + state3_1 = state3_1 + c297 + state4_1 = state4_1 + c298 + state5_1 = state5_1 + c299 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 50 + // ark + state0_1 = state0_1 + c300 + state1_1 = state1_1 + c301 + state2_1 = state2_1 + c302 + state3_1 = state3_1 + c303 + state4_1 = state4_1 + c304 + state5_1 = state5_1 + c305 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 51 + // ark + state0_1 = state0_1 + c306 + state1_1 = state1_1 + c307 + state2_1 = state2_1 + c308 + state3_1 = state3_1 + c309 + state4_1 = state4_1 + c310 + state5_1 = state5_1 + c311 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 52 + // ark + state0_1 = state0_1 + c312 + state1_1 = state1_1 + c313 + state2_1 = state2_1 + c314 + state3_1 = state3_1 + c315 + state4_1 = state4_1 + c316 + state5_1 = state5_1 + c317 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 53 + // ark + state0_1 = state0_1 + c318 + state1_1 = state1_1 + c319 + state2_1 = state2_1 + c320 + state3_1 = state3_1 + c321 + state4_1 = state4_1 + c322 + state5_1 = state5_1 + c323 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 54 + // ark + state0_1 = state0_1 + c324 + state1_1 = state1_1 + c325 + state2_1 = state2_1 + c326 + state3_1 = state3_1 + c327 + state4_1 = state4_1 + c328 + state5_1 = state5_1 + c329 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 55 + // ark + state0_1 = state0_1 + c330 + state1_1 = state1_1 + c331 + state2_1 = state2_1 + c332 + state3_1 = state3_1 + c333 + state4_1 = state4_1 + c334 + state5_1 = state5_1 + c335 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 56 + // ark + state0_1 = state0_1 + c336 + state1_1 = state1_1 + c337 + state2_1 = state2_1 + c338 + state3_1 = state3_1 + c339 + state4_1 = state4_1 + c340 + state5_1 = state5_1 + c341 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 57 + // ark + state0_1 = state0_1 + c342 + state1_1 = state1_1 + c343 + state2_1 = state2_1 + c344 + state3_1 = state3_1 + c345 + state4_1 = state4_1 + c346 + state5_1 = state5_1 + c347 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 58 + // ark + state0_1 = state0_1 + c348 + state1_1 = state1_1 + c349 + state2_1 = state2_1 + c350 + state3_1 = state3_1 + c351 + state4_1 = state4_1 + c352 + state5_1 = state5_1 + c353 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 59 + // ark + state0_1 = state0_1 + c354 + state1_1 = state1_1 + c355 + state2_1 = state2_1 + c356 + state3_1 = state3_1 + c357 + state4_1 = state4_1 + c358 + state5_1 = state5_1 + c359 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 60 + // ark + state0_1 = state0_1 + c360 + state1_1 = state1_1 + c361 + state2_1 = state2_1 + c362 + state3_1 = state3_1 + c363 + state4_1 = state4_1 + c364 + state5_1 = state5_1 + c365 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 61 + // ark + state0_1 = state0_1 + c366 + state1_1 = state1_1 + c367 + state2_1 = state2_1 + c368 + state3_1 = state3_1 + c369 + state4_1 = state4_1 + c370 + state5_1 = state5_1 + c371 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 62 + // ark + state0_1 = state0_1 + c372 + state1_1 = state1_1 + c373 + state2_1 = state2_1 + c374 + state3_1 = state3_1 + c375 + state4_1 = state4_1 + c376 + state5_1 = state5_1 + c377 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 63 + // ark + state0_1 = state0_1 + c378 + state1_1 = state1_1 + c379 + state2_1 = state2_1 + c380 + state3_1 = state3_1 + c381 + state4_1 = state4_1 + c382 + state5_1 = state5_1 + c383 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 + field new_state2_1 = state2_1 + field new_state3_1 = state3_1 + field new_state4_1 = state4_1 + field new_state5_1 = state5_1 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 64 + // ark + state0_1 = state0_1 + c384 + state1_1 = state1_1 + c385 + state2_1 = state2_1 + c386 + state3_1 = state3_1 + c387 + state4_1 = state4_1 + c388 + state5_1 = state5_1 + c389 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 65 + // ark + state0_1 = state0_1 + c390 + state1_1 = state1_1 + c391 + state2_1 = state2_1 + c392 + state3_1 = state3_1 + c393 + state4_1 = state4_1 + c394 + state5_1 = state5_1 + c395 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 66 + // ark + state0_1 = state0_1 + c396 + state1_1 = state1_1 + c397 + state2_1 = state2_1 + c398 + state3_1 = state3_1 + c399 + state4_1 = state4_1 + c400 + state5_1 = state5_1 + c401 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + // -- + // r = 67 + // ark + state0_1 = state0_1 + c402 + state1_1 = state1_1 + c403 + state2_1 = state2_1 + c404 + state3_1 = state3_1 + c405 + state4_1 = state4_1 + c406 + state5_1 = state5_1 + c407 + // sbox + field new_state0_1 = state0_1 ** 5 + field new_state1_1 = state1_1 ** 5 + field new_state2_1 = state2_1 ** 5 + field new_state3_1 = state3_1 ** 5 + field new_state4_1 = state4_1 ** 5 + field new_state5_1 = state5_1 ** 5 + // mix + state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 + state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 + state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 + state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 + state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 + state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 + return DoubleHash { + hash0: state0_0, + hash1: state0_1 + } diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok new file mode 100644 index 00000000..562ea290 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok @@ -0,0 +1,4 @@ +struct DoubleHash { + field hash0 + field hash1 +} \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/schnorr.input b/zok_tests/benchmarks/tests/compact_cert/schnorr.input new file mode 100644 index 00000000..32e0a43e --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/schnorr.input @@ -0,0 +1 @@ +END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/schnorr.zok b/zok_tests/benchmarks/tests/compact_cert/schnorr.zok new file mode 100644 index 00000000..b4cd48a0 --- /dev/null +++ b/zok_tests/benchmarks/tests/compact_cert/schnorr.zok @@ -0,0 +1,428 @@ +from "./poseidon3.zok" import poseidon3 + +const field A = 526 +const field B = 265 +const u32 WIDTH = 253 + +struct Point { + field x + field y +} + +// Hack: set (0, 0) to be the identity +def point_add(Point a, Point b) -> Point: + // Compute numerator & denominator separately to avoid division by 0 + field m_num = b.y - a.y + field m_denom = b.x - a.x + field m = m_num / m_denom + field x3 = m * m - a.x - b.x + field y3 = m * (a.x - x3) - a.y + return Point { + x: x3, + y: y3 + } + +// k_bits is in big-endian of length 253 +// Use k_bits for multiplication while simultaneous check it matches k +def point_mul(Point a, field k, field[0] k_bits) -> Point: + // Hack: set (0, 0) to be the identity + Point a_k = Point { + x: 0, + y: 0 + } + field k_assemb = 0 + for u32 i in 0..WIDTH do + a_k = point_add(a_k, a_k) + k_assemb = k_assemb * 2 + field next_bit = k_bits[i] + assert(next_bit * (next_bit - 1) == 0) + if next_bit == 1 then + a_k = point_add(a_k, a) + k_assemb = k_assemb + 1 + endif + endfor + assert(k_assemb == k) + return a_k + +struct DoublePoint { + Point p0 + Point p1 +} + +struct QuadPoint { + Point p0 + Point p1 + Point p2 + Point p3 +} + +// Perform two point doubles and two point adds +// Specifically built for signature verification +// Returns: (a_0 + a_0, a_1 + a_1, a_0 + a_0 + b_0, a_1 + a_1 + b_1) +// a_0, a_1 might be (0, 0), b_0, b_1 are not +def inline point_double_add_batch( + Point a_0, + Point b_0, + Point a_1, + Point b_1 +) -> QuadPoint: + // a_0 + a_0 + field m_num = 3 * a_0.x * a_0.x + A + field m_denom = 2 * a_0.y // To avoid division by 0 + field m = m_num / m_denom + field x0 = m * m - a_0.x - a_0.x + field y0 = m * (a_0.x - x0) - a_0.y + // a_1 + a_1 + field m_num = 3 * a_1.x * a_1.x + A + field m_denom = 2 * a_1.y // To avoid division by 0 + field m = m_num / m_denom + field x1 = m * m - a_1.x - a_1.x + field y1 = m * (a_1.x - x1) - a_1.y + // (x0, y0) + b_0 + field m_num = b_0.y - y0 + field m_denom = b_0.x - x0 + field m = m_num / m_denom + field x2 = m * m - x0 - b_0.x + field y2 = m * (x0 - x2) - y0 + // (x1, y1) + b_1 + field m_num = b_1.y - y1 + field m_denom = b_1.x - x1 + field m = m_num / m_denom + field x3 = m * m - x1 - b_1.x + field y3 = m * (x1 - x3) - y1 + return QuadPoint { + p0: Point { x: x0, y: y0 }, + p1: Point { x: x1, y: y1 }, + p2: Point { x: x2, y: y2 }, + p3: Point { x: x3, y: y3 } + } + +// Specifically built for signature verification +def point_mul_batch( + Point a_0, + field k_0, + Point a_1, + field k_1 +) -> DoublePoint: + // Hack: set (0, 0) to be the identity + Point a_k_0 = a_0 + Point a_k_1 = a_1 + field k_assemb_0 = 0 + field k_assemb_1 = 0 + + // Do not start computation until after the first 1-bit + bool active_0 = false + bool active_1 = false + u32 i = 0 + for u32 it in 0..36 do + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + i = i + 1 + endfor + // Last one + k_assemb_0 = k_assemb_0 * 2 + k_assemb_1 = k_assemb_1 * 2 + witness field next_bit_0 + assert(next_bit_0 * (next_bit_0 - 1) == 0) + k_assemb_0 = k_assemb_0 + next_bit_0 + witness field next_bit_1 + assert(next_bit_1 * (next_bit_1 - 1) == 0) + k_assemb_1 = k_assemb_1 + next_bit_1 + QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) + if active_0 then + if next_bit_0 == 1 then + a_k_0 = tmp.p2 + else + a_k_0 = tmp.p0 + endif + endif + if next_bit_0 == 1 then + active_0 = true + endif + if active_1 then + if next_bit_1 == 1 then + a_k_1 = tmp.p3 + else + a_k_1 = tmp.p1 + endif + endif + if next_bit_1 == 1 then + active_1 = true + endif + assert(k_assemb_0 == k_0) + assert(k_assemb_1 == k_1) + return DoublePoint { + p0: a_k_0, + p1: a_k_1 + } + +struct PublicKey { + Point p + Point q +} + +struct Signature { + Point r + field s +} + +def verify_signature(field msg, PublicKey pk, Signature sig) -> field: + // Check all points are on the curve + assert(pk.p.y * pk.p.y == pk.p.x * pk.p.x * pk.p.x + A * pk.p.x + B) + assert(pk.q.y * pk.q.y == pk.q.x * pk.q.x * pk.q.x + A * pk.q.x + B) + assert(sig.r.y * sig.r.y == sig.r.x * sig.r.x * sig.r.x + A * sig.r.x + B) + + field e = poseidon3(msg, sig.r.x, sig.r.y) + // Point eq = point_mul(pk.q, e, e_bits) + // Point sp = point_mul(pk.p, sig.s, s_bits) + DoublePoint tmp = point_mul_batch(pk.q, e, pk.p, sig.s) + Point eq = tmp.p0 + Point sp = tmp.p1 + Point res = point_add(sig.r, eq) + assert(res.x == sp.x && res.y == sp.y) + return 1 + +/* +def main() -> u32: + field msg = 6908441180828167112785246881494320159273940089327447106269949444716788494909 + + // Generate a pk / sk pair + Point p = Point { + x: 2023776050662786605020065854616777351003832247628992350849206310281785027488, + y: 1079270832837170318396516616249394502719834190979906495690419930531357954746 + } + field a = 6663691457994429232637728556709855123400985295737706519097842870836531302493 + bool[WIDTH] a_bits = [false, true, true, true, false, true, false, true, true, true, false, true, true, true, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false, true, true, false, true, true, false, false, false, false, true, true, true, false, true, false, false, false, false, true, true, false, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, true, true, true, true, false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, false, false, false, false, false, true, true, false, false, false, true, false, true, true, false, true, false, true, true, true, true, true, true, false, true, false, true, true, true, false, false, false, false, true, true, true, true, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, true, false, false, true, false, false, true, true, true, false, false, false, true, false, false, true, false, true, true, true, false, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false, false, true, true, true, false, false, false, true, false, true, true, false, false, true, true, false, true, true, true, true, false, true, false, false, false, false, true, false, true, true, true, true, true, true, false, false, true, false, true, true, true, true, true, true, true, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, true, true, true, false, true] + Point q = point_mul(p, a, a_bits) + + // Generate a signature + field k = 3955954614002644556381158561434471324488805491866623303867037346350176036901 + bool[WIDTH] k_bits = [false, true, false, false, false, true, false, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, true, true, true, true, true, false, true, true, true, false, false, false, true, true, false, true, false, false, true, true, true, false, false, false, true, false, true, false, true, false, false, false, true, false, true, false, false, true, false, true, true, true, false, true, true, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true, false, true, true, true, false, false, false, false, false, true, true, true, true, false, false, false, true, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, false, false, false, true, false, false, false, true, true, true, false, true, true, true, true, true, false, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, false, true, false, true, false, false, true, false, true, true, false, true, false, true, false, false, false, false, true, true, true, false, false, true, false, false, false, false, false, true, true, false, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, false, true, true, true, true, true, true, true, true, false, false, false, false, true, false, true, true, true, true, true, false, false, true, false, false, true, true, false, true, false, false, false, false, false, true, false, false, true, false, true] + Point r = point_mul(p, k, k_bits) + + field[3] inputs = [msg, r.x, r.y] + field e = poseidon(3, inputs) + // e = 664131425432701962192269875939376285542062040011815922607402886695788544729 + bool[WIDTH] e_bits = [false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, false, false, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, true, false, true, false, true, true, true, false, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true] + + // s = k + a * e in (mod 7237005577332262213973186563042994240955753618821290553176770668684506720427) + field s = 4415915127126372096757067153593537022657929051278082364476489088715040314973 + bool[WIDTH] s_bits = [false, true, false, false, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, false, false, true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, true, true, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, true, true, true, false, true] + + PublicKey pk = PublicKey { + p: p, + q: q + } + Signature sig = Signature { + r: r, + s: s + } + return verify_signature(msg, pk, sig, e_bits, s_bits) +*/ \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/dna_align_cobbl.input b/zok_tests/benchmarks/tests/dna_align_cobbl.input new file mode 100644 index 00000000..31139124 --- /dev/null +++ b/zok_tests/benchmarks/tests/dna_align_cobbl.input @@ -0,0 +1,3 @@ +x 0 +n 15 +END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/dna_align_cobbl.zok b/zok_tests/benchmarks/tests/dna_align_cobbl.zok new file mode 100644 index 00000000..87f42698 --- /dev/null +++ b/zok_tests/benchmarks/tests/dna_align_cobbl.zok @@ -0,0 +1,116 @@ +/* + * Computes the Longest Common Subsequence of two strings, one of + * length m and the other of length n in O(m*n) time + */ +def main(u32 x, u32 n) -> u32: + array_decl u32[ro n] A + array_decl u32[ro n] B + u32 sum = 0 + for u32 i in 0..n do + sum = sum + i + A[i] = sum + B[i] = 60 - sum + endfor + + u32[n] LCS = [0; n] + u32 arr_size = n + + // Dynamic programming memo + u32[n * n + n + 1] LL = [0; n * n + n + 1] + // Hold choices made at each step, for use when backtracking + array_decl u32[ro n * n + n + 1] choices + + // Used when backtracking + u32 diag = 0 + u32 down = 0 + u32 right = 0 + + // Go backwards from i = n-1 downto 0 + u32 i = n - 1 + while i + 1 > 0 do + u32 j = n - 1 + while j + 1 > 0 do + if A[i] == B[j] then + if i+1 < n && j+1 < n then + diag = LL[(i+1) * arr_size + j+1] + else + diag = 0 + endif + // Diagonal jump + LL[i * arr_size + j] = 1 + diag + choices[i * arr_size + j] = 0 + else + if i+1 < n && j < n then + down = LL[(i+1) * arr_size + j] + else + down = 0 + endif + if i < n && j+1 < n then + right = LL[i * arr_size + j+1] + else + right = 0 + endif + // Assertion: down and right differ by at most 1 + if down == right + 1 then + // Jump down + LL[i * arr_size + j] = down + choices[i * arr_size + j] = 1 + else + // Jump right if down == right or right == down + 1. + LL[i * arr_size + j] = right + choices[i * arr_size + j] = 2 + endif + endif + j = j - 1 + endwhile + i = i - 1 + endwhile + + + // Construct LCS, allowing it to have intermittent zero characters + u32 iPtr = 0 + u32 jPtr = 0 // Pointers to where in LL we are with respect to backtracking + + u32 i = 0 + while i < n do + LCS[i] = 0 //If A[i] is not in the LCS, this remains 0. + u32 j = 0 + while j < n do + if i == iPtr && j == jPtr then // Loop until we meet up with the iPtr and jPtr + u32 choice = choices[i * arr_size + j] + if choice == 0 then // we made a diagonal jump here + LCS[i] = A[i] + iPtr = iPtr + 1 + jPtr = jPtr + 1 + else + if choice == 1 then // jump down + iPtr = iPtr + 1 + else // jump right + jPtr = jPtr + 1 + endif + endif + endif + j = j + 1 + endwhile + i = i + 1 + endwhile + + // Now move any string terminator (\0) characters in LCS to the end ala insertion sort + u32 i = 1 + while i < n do + u32 inserted = 0 + u32 j = 0 + while j < i do + if LCS[j] == 0 && inserted == 0 then + // Swap LCS[j] and LCS[i]. + LCS[j] = LCS[i] + LCS[i] = 0 + inserted = 1 + endif + j = j + 1 + endwhile + i = i + 1 + endwhile + + + return LCS[x] \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/kmp_search_cobbl.input b/zok_tests/benchmarks/tests/kmp_search_cobbl.input new file mode 100644 index 00000000..e06b3e3f --- /dev/null +++ b/zok_tests/benchmarks/tests/kmp_search_cobbl.input @@ -0,0 +1,5 @@ +b 0 +c 0 +n 240 +m 24 +END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/kmp_search_cobbl.zok b/zok_tests/benchmarks/tests/kmp_search_cobbl.zok new file mode 100644 index 00000000..2f65badf --- /dev/null +++ b/zok_tests/benchmarks/tests/kmp_search_cobbl.zok @@ -0,0 +1,69 @@ +def lps_gen(u32 m, u32[m] pat) -> u32[m]: + u32[m] lps = [0; m] + + u32 len = 0 + u32 i = 1 + + while i < m do + if pat[i] == pat[len] then + len = len + 1 + lps[i] = len + i = i + 1 + else + if len != 0 then + len = lps[len - 1] + else + i = i + 1 + endif + endif + endwhile + + + return lps + +def main(u32 b, u32 c, u32 n, u32 m) -> u32: + array_decl u32[n] txt + array_decl u32[m] pat + // Initialize arrays + u32 sum = 0 + for u32 i in 0..n do + sum = sum + i + txt[i] = sum + endfor + for u32 i in 0..m do + pat[i] = txt[n - m - b + i] + endfor + + // random access to ensure array is written in memory + u32 x = pat[b] + u32 y = txt[b] + + // Generate LPS + u32[m] lps = lps_gen(m, pat) + + u32 i = 0 + u32 j = 0 + u32 found = 0 + + while m - j <= n - i do + if pat[j] == txt[i] then + i = i + 1 + j = j + 1 + endif + + if j == m then + j = lps[j - 1] + found = i - j + else + if i < n && pat[j] != txt[i] then + if j != 0 then + j = lps[j - 1] + else + i = i + 1 + endif + endif + endif + endwhile + + + return found + (x + y) * c diff --git a/zok_tests/benchmarks/unit_tests/.DS_Store b/zok_tests/benchmarks/unit_tests/.DS_Store deleted file mode 100644 index d182ff86947d1e884a93dc2b052192d7333ff742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOHRWu5PdFPRD481La;%~2`a$}LRA*5IY6OFTScU#YUzem_S}Iha6VS>#x`l1 zriB$kXeP3s<9MDuFUmLuV7iO=0%!whu?RMIS=E?4m$GIJ-?K+FmScbn3p^r5XKl20 zr~<0MUsFK7-2+@=iU@s_zu#wm%MUkc77fyDz)_MSu2?!B*4P5}3(pusOz6=;o!?u< z@2Kz_*?b{$N4Q7ItCqo>|A1kRglm{?V0fu892RRxFyj0}&OK*cKmU8hdl`ZAp3(D( zvCNqLY8k9{uO;nHiuqIOmT}#EDiHHZ$ds^W6O*V}W;(86ns7Zcj5o$3dX_ns@k|&+ z$`$mfisbUBJ{}`_mKjcqReUidC64djujpH5TgEi!3PhbD*|xsn#<;@4TeU3;aL*QN zNe)m`1yli5psax8hk!*e^q4!ese_e00uY<*w#K&nD2PwsG4z-_ field: - field[4] arr = [b; 4] - for field i in 0..2 do - field sum = 0 - for field j in 0..4 do - field b = b + a - field a = a + j - field sum = sum + a - if sum == 10 then - arr[j] = arr[j] + sum - endif - arr[j] = arr[j] + sum - endfor - field a = 20 - arr[b] = a - endfor - return arr[a] + b diff --git a/zok_tests/benchmarks/unit_tests/2pc_bound.zok b/zok_tests/benchmarks/unit_tests/2pc_bound.zok deleted file mode 100644 index a14cf4c5..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_bound.zok +++ /dev/null @@ -1,42 +0,0 @@ -def add(field b, field c) -> field: - // BLK 12 -> 1 - field a = c - for field i in 0..3 do - if b == 5 then - // BLK 13 -> 3 - return b + a - else - // BLK 14 -> 3 - return b + a * a - endif - endfor - // BLK 15 -> 1 - return b - -def main(field a)-> field: - // BLK 0 -> 1 - // BLK 1 -> 1 - a = a + 1 - for field i in 0..4 do - if i == 0 then - // BLK 2 -> 4 - a = add(a, a) - // BLK 3 -> 4 - else - // BLK 4 -> 4 - a = add(a, a) - // BLK 5 -> 4 - endif - // BLK 6 -> 4 - a = add(a, a) - // BLK 7 -> 4 - endfor - // BLK 8 - for field i in 0..2 do - // BLK 9 -> 2 - a = add(a, a) - // BLK 10 -> 2 - endfor - // BLK 11 -> 1 - a = a + 1 - return a diff --git a/zok_tests/benchmarks/unit_tests/2pc_cond_store.input b/zok_tests/benchmarks/unit_tests/2pc_cond_store.input deleted file mode 100644 index 9bf69ebb..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_cond_store.input +++ /dev/null @@ -1,3 +0,0 @@ -a u32 2 -b u32 3 -END diff --git a/zok_tests/benchmarks/unit_tests/2pc_cond_store.zok b/zok_tests/benchmarks/unit_tests/2pc_cond_store.zok deleted file mode 100644 index ba4433ea..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_cond_store.zok +++ /dev/null @@ -1,4 +0,0 @@ -def main(u32 a, u32 b) -> u32: - u32[4] c = [a; 4] - cond_store(c, 1, b, a < 10) - return c[b] diff --git a/zok_tests/benchmarks/unit_tests/2pc_demo.zok b/zok_tests/benchmarks/unit_tests/2pc_demo.zok deleted file mode 100644 index faded6b0..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_demo.zok +++ /dev/null @@ -1,19 +0,0 @@ -def add(field b, field c) -> field: - // Blk 5 - field a = c - if b == 5 then - return b + a - else - return b + a * a - endif - -def main(field a, field b)-> field: - a = a + 1 - for field a in 0..400 do - b = add(a, b) - b = b == 3 ? 2 : 4 - a = a + b - endfor - // Blk 4 - a = a + 1 - return a + b diff --git a/zok_tests/benchmarks/unit_tests/2pc_func_call.zok b/zok_tests/benchmarks/unit_tests/2pc_func_call.zok deleted file mode 100644 index 495fc111..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_func_call.zok +++ /dev/null @@ -1,24 +0,0 @@ -def add_helper(field c, field b) -> field: - return c + b - -def add(field a, field b) -> field: - field c = a - field d = b - return add_helper(c, b) - -def main(field a, field b) -> field: - for field i in 0..4 do - a = a + 1 - field a = 10 - b = add(a, b) - field c = 8 - b = add(b, c) - endfor - a = add(a, 10) - for field i in 0..2 do - for field j in 0..4 do - field a = 20 - b = add(a, b) - endfor - endfor - return add(a, b) diff --git a/zok_tests/benchmarks/unit_tests/2pc_func_simp.zok b/zok_tests/benchmarks/unit_tests/2pc_func_simp.zok deleted file mode 100644 index 2946cb70..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_func_simp.zok +++ /dev/null @@ -1,20 +0,0 @@ -def add(field a, field b) -> field: - return a + b - -def main() -> field: - field a = 5 - field b = 4 - for field i in 0..4 do - field a = 10 - for field j in 0..2 do - a = a + 1 - field a = 20 - endfor - for field k in 0..2 do - a = a + 1 - field a = 40 - field b = 10 - endfor - b = a + b - endfor - return a + b diff --git a/zok_tests/benchmarks/unit_tests/2pc_if_else.zok b/zok_tests/benchmarks/unit_tests/2pc_if_else.zok deleted file mode 100644 index 1d906567..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_if_else.zok +++ /dev/null @@ -1,25 +0,0 @@ -def main(field a, field b, field c) -> field: - if a != 4 then - field b = 12 - if c == 12 then - field b = 14 - c = c + b - else - field d = 12 - c = c + d - endif - c = c + b - else - field b = 9 - if a < 6 then - b = 8 - c = b - endif - b = 6 - c = c + b - endif - a = a + 10 - if a != 1 then - c = c + 1 - endif - return a + b + c diff --git a/zok_tests/benchmarks/unit_tests/2pc_if_return.zok b/zok_tests/benchmarks/unit_tests/2pc_if_return.zok deleted file mode 100644 index 5b0925be..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_if_return.zok +++ /dev/null @@ -1,36 +0,0 @@ -def add(field a, field b) -> field: - return a + b - -def foo(field a, field b, field c) -> field: - for field i in 0..4 do - c = i - field i = 10 - if c < b then - field c = 5 - if a < c then - return add(c, i) - endif - else - if c < a then - b = b + c - else - if c == 0 then - b = b + a - else - b = b + b - endif - endif - i = i + 1 - endif - endfor - return a + b + c - -def main(field a, field b, field c) -> field: - for field i in 0..2 do - field a = 5 - if a < add(i, add(i, b)) then - return foo(a, b, c) - a = a + 10 - endif - endfor - return a diff --git a/zok_tests/benchmarks/unit_tests/2pc_if_return_cc.input b/zok_tests/benchmarks/unit_tests/2pc_if_return_cc.input deleted file mode 100644 index 50527abd..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_if_return_cc.input +++ /dev/null @@ -1,4 +0,0 @@ -a 5 -b 4 -c 3 -END diff --git a/zok_tests/benchmarks/unit_tests/2pc_if_return_cc.zok b/zok_tests/benchmarks/unit_tests/2pc_if_return_cc.zok deleted file mode 100644 index f99dd950..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_if_return_cc.zok +++ /dev/null @@ -1,29 +0,0 @@ -def add(field a, field b) -> field: - return a + b - -def foo(field a, field b, field c) -> field: - for field i in 0..4 do - c = i - if c < b then - if a < 5 then - return add(5, i) - endif - else - if c < a then - b = b + c - else - if c == 0 then - b = b + a - else - b = b + b - endif - endif - endif - endfor - return a + b + c - -def main(field a, field b, field c) -> field: - if a < add(5, add(5, b)) then - return foo(a, b, c) - endif - return a diff --git a/zok_tests/benchmarks/unit_tests/2pc_loop_addition.zok b/zok_tests/benchmarks/unit_tests/2pc_loop_addition.zok deleted file mode 100644 index 10807cef..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_loop_addition.zok +++ /dev/null @@ -1,16 +0,0 @@ -def main() -> field: - field a = 5 - field b = 4 - a = 3 - field i = 10 - for field i in 0..4 do - a = a + 1 - field a = 60 - field i = 10 - for field j in 0..6 do - field a = 80 - endfor - b = b + 1 - endfor - a = a + 10 - return a + b + i diff --git a/zok_tests/benchmarks/unit_tests/2pc_loop_merge.zok b/zok_tests/benchmarks/unit_tests/2pc_loop_merge.zok deleted file mode 100644 index a98f611a..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_loop_merge.zok +++ /dev/null @@ -1,9 +0,0 @@ -def main(field a) -> field: - a = a < 3 ? 2 : 4 - a = a < 3 ? 2 : 4 - a = a < 3 ? 2 : 4 - a = a < 3 ? 2 : 4 - for field i in 0..2 do - a = a + 1 - endfor - return a diff --git a/zok_tests/benchmarks/unit_tests/2pc_mult_func.zok b/zok_tests/benchmarks/unit_tests/2pc_mult_func.zok deleted file mode 100644 index 571696c1..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_mult_func.zok +++ /dev/null @@ -1,17 +0,0 @@ -def add(field a, field b) -> field: - return a + b - -def mult(field a, field b) -> field: - return a * b - -def main() -> field: - field a = 5 - field b = 4 - field a = 3 - for field i in 0..4 do - a = a + 1 - field a = 60 - b = add(add(a, b), b) - endfor - a = a + 10 - return add(a, mult(b, a)) diff --git a/zok_tests/benchmarks/unit_tests/2pc_multi_func_call.zok b/zok_tests/benchmarks/unit_tests/2pc_multi_func_call.zok deleted file mode 100644 index 13388ab8..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_multi_func_call.zok +++ /dev/null @@ -1,8 +0,0 @@ -def add(field a, field b) -> field: - return a + b - -def foo(field a, field c) -> field: - return add(add(a, c), add(c, a)) - -def main(field a, field b, field c, field d) -> field: - return foo(foo(a, b), foo(c, d)) diff --git a/zok_tests/benchmarks/unit_tests/2pc_scope_simp.zok b/zok_tests/benchmarks/unit_tests/2pc_scope_simp.zok deleted file mode 100644 index c8de75d1..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_scope_simp.zok +++ /dev/null @@ -1,12 +0,0 @@ -def main() -> field: - field a = 5 - field b = 4 - for field i in 0..2 do - field a = 10 - for field j in 0..2 do - field a = 20 - endfor - field a = 20 - b = a - endfor - return a + b diff --git a/zok_tests/benchmarks/unit_tests/2pc_type_change.input b/zok_tests/benchmarks/unit_tests/2pc_type_change.input deleted file mode 100644 index f50fc064..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_type_change.input +++ /dev/null @@ -1,3 +0,0 @@ -a 5 -b 4 -END diff --git a/zok_tests/benchmarks/unit_tests/2pc_type_change.zok b/zok_tests/benchmarks/unit_tests/2pc_type_change.zok deleted file mode 100644 index b802ff20..00000000 --- a/zok_tests/benchmarks/unit_tests/2pc_type_change.zok +++ /dev/null @@ -1,13 +0,0 @@ -// Test Circ_Block's behavior when a variable is shadowed in the same scope with a different type -// Test includes %RET - -def add(field a, field b) -> field: - return a + b - -def main(u32 a, u32 b) -> u32: - u32 d = a - u32 e = b - field a = 10 - field b = 20 - u32 r = add(a, b) == a + b ? d : e - return r diff --git a/zok_tests/benchmarks/unit_tests/array_input.input b/zok_tests/benchmarks/unit_tests/array_input.input deleted file mode 100644 index 40437e08..00000000 --- a/zok_tests/benchmarks/unit_tests/array_input.input +++ /dev/null @@ -1,4 +0,0 @@ -MEM [ 0 1 3 1 3 5 4 2 7 3 ] -a 0 -b [ 2 3 5 6 7 ] -END diff --git a/zok_tests/benchmarks/unit_tests/array_input.zok b/zok_tests/benchmarks/unit_tests/array_input.zok deleted file mode 100644 index 1f333528..00000000 --- a/zok_tests/benchmarks/unit_tests/array_input.zok +++ /dev/null @@ -1,6 +0,0 @@ -// Test array inputs -def main(field[10] MEM, field[6] a, field[5] b) -> field: - assert(a[2] == a[4]) - b[4] = 3 - assert(b[4] == b[1]) - return 1 diff --git a/zok_tests/benchmarks/unit_tests/dead_input.input b/zok_tests/benchmarks/unit_tests/dead_input.input deleted file mode 100644 index 85e171d9..00000000 --- a/zok_tests/benchmarks/unit_tests/dead_input.input +++ /dev/null @@ -1,3 +0,0 @@ -a 5 -b 3 -END diff --git a/zok_tests/benchmarks/unit_tests/dead_input.zok b/zok_tests/benchmarks/unit_tests/dead_input.zok deleted file mode 100644 index ea4eb7a3..00000000 --- a/zok_tests/benchmarks/unit_tests/dead_input.zok +++ /dev/null @@ -1,2 +0,0 @@ -def main(u32 a, u32 b) -> u32: - return b diff --git a/zok_tests/benchmarks/unit_tests/inline_func.zok b/zok_tests/benchmarks/unit_tests/inline_func.zok deleted file mode 100644 index 21ae3bdd..00000000 --- a/zok_tests/benchmarks/unit_tests/inline_func.zok +++ /dev/null @@ -1,8 +0,0 @@ -def bar() -> u32: - return 1 - -def inline foo() -> u32: - return bar() - -def main() -> u32: - return foo() + foo() diff --git a/zok_tests/benchmarks/unit_tests/multi_dim.zok b/zok_tests/benchmarks/unit_tests/multi_dim.zok deleted file mode 100644 index dd6f8b95..00000000 --- a/zok_tests/benchmarks/unit_tests/multi_dim.zok +++ /dev/null @@ -1,10 +0,0 @@ -// Note: when declared as [[2; b]; a], all entries of arr shares the same pointer, similar to python - -def main(u32 a, u32 b, u32 c, u32 d) -> field: - field[a][b] arr = [[2; b]; a] - field[b] tmp = [4; b] - arr[1] = tmp - // To perform multi-dimensional STORE, one need to first perform LOAD - // load = arr[0]; load[d] = 3 - arr[0][d] = 3 - return arr[c][d] diff --git a/zok_tests/benchmarks/unit_tests/read_only_array.input b/zok_tests/benchmarks/unit_tests/read_only_array.input deleted file mode 100644 index adffab2d..00000000 --- a/zok_tests/benchmarks/unit_tests/read_only_array.input +++ /dev/null @@ -1,4 +0,0 @@ -a [ 0 ] -b [ro 0 ] -c 1 -END diff --git a/zok_tests/benchmarks/unit_tests/read_only_array.zok b/zok_tests/benchmarks/unit_tests/read_only_array.zok deleted file mode 100644 index f6b968ab..00000000 --- a/zok_tests/benchmarks/unit_tests/read_only_array.zok +++ /dev/null @@ -1,11 +0,0 @@ -// Test the type check of read-only arrays -def main(field[0] a, field[ro 0] b, field c) -> field: - field x = 0 - if c == 1 then - if c == 0 then - x = a[0] - else - x = b[0] - endif - endif - return x diff --git a/zok_tests/benchmarks/unit_tests/test.zok b/zok_tests/benchmarks/unit_tests/test.zok deleted file mode 100644 index a3e76b5f..00000000 --- a/zok_tests/benchmarks/unit_tests/test.zok +++ /dev/null @@ -1,22 +0,0 @@ -// Bug report: function call that invokes %SP but no other spilling - -def bar(u32 a) -> u32: - return a - -def foo(u32 a) -> u32: - return bar(a) - -def main(u32 a, u32 b, u32 c) -> u32: - u32 ret = 0 - if a > 0 then - u32 d = a - u32 e = b - for u32 i in 0..100 do - d = d + b - e = e + c - endfor - ret = d + e - else - ret = foo(a + b + c) - endif - return ret diff --git a/zok_tests/benchmarks/unit_tests/test_witness.input b/zok_tests/benchmarks/unit_tests/test_witness.input deleted file mode 100644 index e0bd31b3..00000000 --- a/zok_tests/benchmarks/unit_tests/test_witness.input +++ /dev/null @@ -1,2 +0,0 @@ -n 3 -END diff --git a/zok_tests/benchmarks/unit_tests/test_witness.witness b/zok_tests/benchmarks/unit_tests/test_witness.witness deleted file mode 100644 index 6297d3ff..00000000 --- a/zok_tests/benchmarks/unit_tests/test_witness.witness +++ /dev/null @@ -1,5 +0,0 @@ -1 1 0 -1 1 0 -1 1 0 -1 1 0 -END diff --git a/zok_tests/benchmarks/unit_tests/test_witness.zok b/zok_tests/benchmarks/unit_tests/test_witness.zok deleted file mode 100644 index 4da450f3..00000000 --- a/zok_tests/benchmarks/unit_tests/test_witness.zok +++ /dev/null @@ -1,12 +0,0 @@ -def main(u32 n) -> u32: - witness u32 b0 - witness u32 b1 - witness u32 b2 - for u32 i in 0..n do - witness u32 b0 - witness u32 b1 - witness u32 b2 - assert(b0 * 4 + b1 * 2 + b2 * 1 == 6) - endfor - assert(b0 * 4 + b1 * 2 + b2 * 1 == 6) - return 1 diff --git a/zok_tests/benchmarks/unit_tests/weird_array.input b/zok_tests/benchmarks/unit_tests/weird_array.input deleted file mode 100644 index cd63b5b1..00000000 --- a/zok_tests/benchmarks/unit_tests/weird_array.input +++ /dev/null @@ -1,3 +0,0 @@ -a 5 -b 1 -END diff --git a/zok_tests/benchmarks/unit_tests/weird_array.zok b/zok_tests/benchmarks/unit_tests/weird_array.zok deleted file mode 100644 index 8749be6e..00000000 --- a/zok_tests/benchmarks/unit_tests/weird_array.zok +++ /dev/null @@ -1,16 +0,0 @@ -// Test array appearance in all weird locations -def foo(u32[0] arr, u32 b) -> u32[0]: - return [arr[b]; 2 * b] - -def main(u32 a, u32 b) -> u32: - u32[a] s = [0; a] - for u32 i in 0..a do - s[i] = i - endfor - u32 t = 0 - for u32 i in 0..s[1] do - u32[2 * b] tmp = foo([0, 1, 2, 3, 4, 5], b) - t = tmp[0] - endfor - - return t From 5e245948cbf0bcec3aab077614b8742ad63dcfb6 Mon Sep 17 00:00:00 2001 From: Kunming Jiang Date: Fri, 24 Jan 2025 11:59:27 -0800 Subject: [PATCH 54/54] Update CI --- .github/workflows/ci.yml | 2 +- .../tests/compact_cert/compact_cert.input | 13 - .../tests/compact_cert/compact_cert.witness | 174 - .../tests/compact_cert/compact_cert.zok | 207 - .../benchmarks/tests/compact_cert/merkle.zok | 48 - .../tests/compact_cert/poseidon2.zok | 2353 ----------- .../tests/compact_cert/poseidon3.zok | 1619 -------- .../tests/compact_cert/poseidon5.zok | 3661 ----------------- .../tests/compact_cert/poseidon_struct.zok | 4 - .../tests/compact_cert/schnorr.input | 1 - .../benchmarks/tests/compact_cert/schnorr.zok | 428 -- 11 files changed, 1 insertion(+), 8509 deletions(-) delete mode 100644 zok_tests/benchmarks/tests/compact_cert/compact_cert.input delete mode 100644 zok_tests/benchmarks/tests/compact_cert/compact_cert.witness delete mode 100644 zok_tests/benchmarks/tests/compact_cert/compact_cert.zok delete mode 100644 zok_tests/benchmarks/tests/compact_cert/merkle.zok delete mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon2.zok delete mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon3.zok delete mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon5.zok delete mode 100644 zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok delete mode 100644 zok_tests/benchmarks/tests/compact_cert/schnorr.input delete mode 100644 zok_tests/benchmarks/tests/compact_cert/schnorr.zok diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 46e7420f..eb78060d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,4 +96,4 @@ jobs: run: | set -euxo pipefail ./setup.sh - ./encode_ceno.sh + ./test_poseidon.sh 1000 diff --git a/zok_tests/benchmarks/tests/compact_cert/compact_cert.input b/zok_tests/benchmarks/tests/compact_cert/compact_cert.input deleted file mode 100644 index 33194914..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/compact_cert.input +++ /dev/null @@ -1,13 +0,0 @@ -num_attestors 200000 -sig_root 2242853184699195296644565211308242465985429323786642914717382960752075916850 -signed_weight 19999900000 -t_i_list [ro 117379 179088 121137 185614 78065 129235 142346 190125 66032 107230 9662 187561 75837 184395 128008 190766 126958 137508 63066 68835 172726 111104 192796 192545 140510 172829 163123 82325 169647 161398 197790 149337 146082 75769 156403 28537 128941 194588 150128 156344 166205 179148 192953 182720 34941 105880 152660 130135 20838 87147 187082 185179 149476 177940 141497 62314 180399 191027 128492 188562 75870 79440 197168 195721 93295 61959 67197 147314 192766 171800 178350 15406 128039 61912 195745 74581 121063 101774 198011 174275 161047 57165 45686 180180 107846 181446 119752 194373 111554 170883 82239 114324 111092 134583 70456 163455 62036 181560 89282 113578 45941 123323 109914 158194 147452 161007 197983 189575 77464 179268 159139 132750 197031 107037 153723 159319 109963 113463 158537 151367 168007 132418 170854 117568 148561 134990 137588 161330 127374 184061 151923 172687 92696 173659 117148 163151 129827 150772 136284 146290 184086 180030 136661 151156 142210 179685 192072 168638 183882 172243 172593 178270 181353 19837 134530 130636 129464 159155 163976 102941 195604 138806 145590 162974 135517 101010 167918 86699 90947 38363 177267 106559 120840 ] -t_mem [ro 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2193347860049210559313346005385115884373715322607011920219043592275163468749 3760168766269400860129211731046832630961307998758632440950247780092522682641 117379 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 306800480844614605251319271311795144545963809735335711939435711214248792323 1568710477393818500170931421140545433482477858621446302115252875720882427652 179088 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5704455758917370737282028929244049269157384697414492095817782859457219610901 4378323546297634458390993745885896335605139527168385958665443726436990906387 121137 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4404504205072382109709098030745448862345432768053930883686391109941492907120 5174520850558090016550897754055665688028488947501149694032451948049985676704 185614 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6519946216095765515218656862520863401578001223199162736698378849868703858350 2896662871856371314422018415327440386298931739772205546946034411591410125526 78065 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3107696673771884696907735846717037262657084011297228327416343986266235002456 6825724847103482976050991416909214725469820784798052598726126842292197247993 129235 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3246060171286632479613871202847867102380028101424829271585886479033532498746 7055482852717354562609933354459090652232252207092931778498376564662336367701 142346 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5753770127491401441590334411966530496770539811515060431458705514836889405311 5045675349765989420032827864263248230518559590593860729984621126738559125648 190125 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6974212481704637818125417889687194892339958741573666053862907040534263872869 941230264552600186496861569611964939860832397849545845050509567592176705361 66032 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5096743620107385896873825811186058452884721263769070391196994378658322215541 1154517091423637633641791931786851451753823667743954118455692473425199752757 107230 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5301188114890651973095583387780707614834528633688012274490895689040212955831 1526268025957375899016392862547384328677782727084199560975798926489526430753 9662 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5208440062511332020190147154985783630244195550120271045153269725619505012396 6813363892651986130173612683714178287547036326260029096545995697067310477738 187561 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3909002920546014650907550256451469539971994684524880039663964621025808819947 254763108830917560842922422563694516166676056488472943068903710504625123535 75837 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4868656791109641482588863869044024659948733875884330335924775349632090879577 3696511273350020076202210197218556242950871791015282377987061831136842121188 184395 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4476667495667917462534603272138514199365941485017544739269347223587606920661 3361212120483548457237443739821878002570471104799645136907493779613362417256 128008 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 113930970702076393492583975751295293571850380887958118355417258902525525120 4836515597631710201398895674866138053717215262684502171234435219014122298895 190766 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2799072324126312414321201754387146428491901317648630585241334110159330922836 1272854895569652676663237034449916106598929565749484805446371980731553783975 126958 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2551027227468660465566986335295746286358209182361291489573906568932198723478 4241265360196504188673285530817509056528638922789445156428801771835966776063 137508 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5436275738487319789528696461508768262416760923922765457871344153830286805510 1474926412115313433807222634110916505406377544045903085030480879520911681999 63066 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2081749943504501005608975297004848861019204476554371616443056207386070590318 2069813588741801580969139424030042756045741530286661037374857171694802571064 68835 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3576938547389421026057022054487529940075306161779204486963361492286496994678 800347697341555288953519764739879509355880257399190188227127899687363338061 172726 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 221422483006020360655130260697529558600085071759131108242677615798608991817 4852513667925784522401775381265131776045916645962369566955100132952010401588 111104 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5016683547981913659059863004863637137298827326175302970564197142750180161537 6391691103484320148089733589014350714510952899743346877765446845547606969571 192796 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3591824393372546056484126865590952974760485188721286864440101167426031718632 1052495896898670824745743199212276553392913565556010435891365012249032249506 192545 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4135654097096461161421897156988528155515047644057041133315854064954362058667 2327835996582600912560058146848207639478470786692970562974998791687723491841 140510 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 307157893650861083407015187087758659963811186487458348191050288976877294539 4581592581495165576973904608177928877877020133658796195784093526229356126398 172829 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5064320314265418642024073646796492794053382241104232415679253531396339163968 1041815081354978531366001054491617973036933014729601716473053741028054792818 163123 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6443209862105214253303727184867343221649636204666409267868295852480539490529 5657906799733220798224470121059986980373366008014084314747908707463045552268 82325 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6137478534565899291653367436888024387085771619698421707076440411236373862304 2616287527696902154412165381397278926563598124208079205309479601136841560722 169647 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2745608105011008986026446477370097178136474461608117087766538529830384648631 3917223772436912878003612054537823135122965488036073820607687724993974049090 161398 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2645685922661614213799283928117250831996294650231817240568570298793744545320 342824531276915662866392558114142730265193191104998361720026127144972580514 197790 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3198212832781846990026191900332409040152058832717134029970232619035019569679 2437374532041386802969716475973429412745459790993288652157915741304609714258 149337 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5257211991000330529902898601572092427932138383923178997663180068866901056974 2086901669904860008207703896098746215459359094899871107151905072064644788247 146082 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6522646635976149411368215137274227399707914615452974702522102376192089643449 3046976328016741979520651090742264552120742446094137264901079555030946001194 75769 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6460862816920888011253771390816862247615077850443070311101349381563930014800 5383181769339238010930142577736422419455815290785725580738848198064232418739 156403 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6245450258314829786435024021394714460094501876156534747105417253552159536330 3140667287003555344405231607915369453254064635002704263808713195560604439985 28537 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6586927166511308738096193949909276042501257296522719483526381346178152646908 4352642209228767478735166578680966714077000912935662361443247152435790523608 128941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2853123201139764615220530107826674514042711052482580647292985312632284946470 170746913378308453683017350889329090244233796696776551610235261596014530597 194588 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3363658625181245542623265741682786042647987336407462059615455916886263757672 5477526935466876933863896864780423401803147887889544067866298458830418691805 150128 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6822619099344476869811089206286566349778728597175249002346692261246834100944 2530849064653438148279633145681286868137222882228644103588377747559824515438 156344 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1981905441629719177023546776687692141959247882156414894784271604873275225534 4036687712804277770210042188611524615164474859764816777458961706505230795979 166205 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2811162284558616370288404964321407472932246902808730643297718213255391161724 1492014045416126258579581371865975668626727589291999137966393053844330334020 179148 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1618962660574980988667797327860198861359626390639472213638244993395801548775 917400423003466480765491136701299637609408625763220741810699323686970099194 192953 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5326881032976696678752461666707217905567831624202404722043214988469966006294 7094284382719629848212162315334125929080643718386812608530790053407393879419 182720 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4868278251233962191377142966434401846272955656018073383622838962367597071987 2419879718322597043033867723677714183523990798824523080349477124099139211961 34941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3774139001161761107653977794016870630685113466984553607190139413891773337472 407088699655024939749131861243522532077647025333018882090342087324822947251 105880 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 7104205342797290111022268744522558929259171759500065996235164415435889292654 5357271333290499818195817110541648569975803349028912819487187735754617933884 152660 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 185964926473664397913778163686468580906278298440199312048910502183040419442 6910458421365754517858138559634788756130092416890776814121951092439949262148 130135 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2907872416310742964663677122993116545247426745764964458479471863779128365306 988485548907381622999741734808665712041319573410311727297451979109053954923 20838 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5434060976987568184393478839382339361501795825326967530241735734767841595439 4860351094514591493177713631445184028274270648911934556275413881040175024913 87147 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5263117319751245331275747825408426446235852672833366857598146709404223764094 5774641276483980524032872540070104636790159531332138852715034691259970012529 187082 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1784533230410739452461647588756890100944501514857674162772933357608004947376 3556657662618780480325254280710913092828296467406519200185981820188586699821 185179 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1524474293270343351744858664829736086745138656133217685175878564927912718761 3675369671619195112302822667481618725264023854364534203017377916640441782531 149476 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5936970471570822130830510196668139337623361157955356016811240867865182279698 3042762569983961972062728972342037370121375937024111557103472182208393378620 177940 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6363426056575440796872640682890911392377183257498925738551715166728059441812 502682155285537762101286078329296086256324808392501493291019985220643453716 141497 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 37877007158276897309143030902084737454819559170956340124021590977026063089 1912412830630711015079673213662267120829905279469606239283448584454135558491 62314 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 248440927812960258814600235396743502471269141462594246562635886397093451643 4178151191228246058437104442613645772930244731344641011040298544802358650795 180399 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3163223584268138477766834318515857365763506712942048232458530858928326026134 4416236229366541193215272014472586279151808244938070863186555082052927745287 191027 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1862342171359642188072378632232974760984715690462007178730604710488449180132 2715480856069808007370006687399469777567179843896642341797392694366658563621 128492 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5113380941477849744085867798206187514757221692180547191157292722169043067882 6959439707666685411338046456927390361584168322471760622133299828800064663674 188562 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4628030950760642913286523516367206772796064937865349263280007888395320410481 3109914313685616256767055564034437242057103173798905919320526041011693785925 75870 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4911006959582130031466234591174144680046153591802043560581984104063028241629 4978679559430934053091332109391856768208785439934486638379775908985887474970 79440 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5908472456804268793324763948227430917856737396295747183058363449110156176763 4917473880039332547666268972179534659614906943977970523865554992956230644835 197168 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1069582137228800463410159568134867505862655142551834404755949552265867146643 7192890289822132012248856622287352790894625086775005231918175367862975537001 195721 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4005436213620115357898829234076891391139169118294525861834036858158957655530 1049648428984468797185789651961132200760105826196636334345488656477583998050 93295 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6490682342099382468069766194800001465580673308261989341089428517848726930025 2804444860381270887017685067304022249605672021106495124667223482950401510765 61959 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1073601215579062222920731009513413626652521699526792883072308953753946384941 973324447901895564026652077076097554940449650006482832926428946420583167999 67197 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 429447367862418651899009558742074783292376744695964586733984442290891289099 2408736032803166032657548243532066410598761719432457163305416616117572845316 147314 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3960794933340916962772265250637842312193527531349826985590576829318441121621 3019612839208523352967956207908704082022534530509898842278724211470851785719 192766 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4641626194136592496022445368207621595839390655393304554177905464399838871637 6180906476107987061703879330677520742185585834140658295301047754958802071329 171800 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1940107622095107546514424077994397849728639944388921320963752022932895430108 4000823014610256047087871194857657262182218780824166726030567130137600856754 178350 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2340308704916011440800233816086434074969372152999139318604884797586102551081 5325648085113467366658936763498656300513282922595385335530503416981750428347 15406 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3217846417730977660718617464829475824826033697041514525844908994550842675940 2764387858396344969069733468070099384794142930224787928819290984137536113335 128039 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1479876968724288992949675553898257633562564309592166634390700997630604091260 1316012684237839641265134444047007280748101275583787013342999576281092692626 61912 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4791926630948404050974630949720382691685695959384994338535639658889129352071 1560271733568406072167962508934557120076664996383009215384121154626495918692 195745 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5023007650621900012439910719909463711107452693131533982830579177646662849345 7137502050240141584475159791086305855574285216624686239871023209151122751965 74581 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1477806189190952803627275088410220690718403292870872922713026682602203512785 609689791477181457293350551587460957794975048644336452561442869780336264767 121063 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3908954939596329828701743935560241065956594306874211331760582608425023205065 4116614438624082832673880889476637209477560075462539091164192044450462279 101774 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3393632588545630489594718240824473463828868855868972927451593336825508168200 5193793099999199902905427037006391159729173084156950356013604551700123539379 198011 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2544894763442970072122492144539980244041818725984348345776047310737597958223 5946542252348054192839967494762433136064540704452039657822977600532275366955 174275 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2732281212456662616569030910957069975486233670361203350497940985603271577048 3724302485625783733356943287085718848543659348723594323571519572347371060392 161047 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5181560054645782729081033415763307840697930072049569034843943440612453373089 1655045313106164527264578357904289448861042584087625265229644825532556412145 57165 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4465351602396015292056874315194879891120653030589382305035154611438909572199 2328654628288719120532948342768308664355732238211258657776802635442706097604 45686 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4986762531524310760287562319463827471818687026501347814014000746535530840136 194612928486803546681284448060977511951864547574123253867411748222448716243 180180 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1285560896426061877021252657327062733539305022022176986854579443763720680410 3830367206266655280440710096958415532992689845051053717853058571825255451605 107846 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5539205781924841304055055237968811040989761008593445235623337764625681906300 6015155350324543987130790024439805549041850965696391152892254592802972414862 181446 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1710823390658398675447645395325902052623108294200406366053539706595871583983 6985331441113003463024629597228374321721726800204269674032393512842557338095 119752 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2969400940741191769688767992551140136581166048968338506237049328886187962767 2683176940900483510597474691873973982961213646588915709185511832255840880376 194373 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5533201121487173677228632049860127627624141403758218052863927127446630886349 2455364555749658362695170702064411159328252367925663667208132083289253817452 111554 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6754050866246842008365854789046812605868646667599584841410107735044145405473 3982111575080654624063261985192568527681867690914748240826161124559243111542 170883 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2309956802530612661997445953955438464293109716265647928209925624828408782191 4373563444173510550514235454943182387139127940841869237135415413602557137932 82239 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3639181068503331252945070341431734570375049389821849336884802607066311646281 7226392115776883016618672960569094297817880009324818361343527717613572065277 114324 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4061786845043349253573674877371223992421608213270864572047231523575323311655 4903334930151639438573893024384099156054847236722485935782087182445834406937 111092 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3637731800251165101193297969216169551823796003425783691294517339550247908086 4224466144015730845740574953166264251703555783432064896554624818718466662916 134583 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2634389391273099278681954780184138841790235354025453371759526227237818352813 5174067057270132307467641986089106459261924211903740677506193771339845121253 70456 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1262917067943903805265609866471249021401471560549529927229713391318979556628 1613223906026349016434545272566817758794809727515523498000744115143826433817 163455 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4757878542962629511046116698316432939087736503451308638750042043870291441852 420297984069461569752759964836940838432188182035462245259077829317383075754 62036 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6833311422367910738896084910782021085371125098935830962275829591271982280243 3992056535779931790162793418201987199849934774579913624574807792739824336499 181560 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 172705581906471011364113945686837820543705408764753615306460254649000094309 4777892280376306098296686453320395360313905952753809015499729738749304118380 89282 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1971077872876028408351107169683226870778338806751440383231055053395875905026 5365652926923639427966468974485943262408962611057243850060019770524619860573 113578 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3060604347207295531425517454310347754583300617565828772887657226479178046435 6316569384195028131136546558125835122116657571779220916547917073379187464371 45941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 689941388873473329908217275241845671833312932760022316519282398675616151927 6235973111718796838683241316578410091845525679588215815015322968157655342942 123323 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2170052646190249949510993330720745356526968569092605875593492422429086573040 2385527356139742415043018006516076947049087690422088307559652525609908480407 109914 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5078716035144777890798951926697760837655952581456089486130507457694236972676 5833628759816262826376064331181127037921596877005578051638965302898741152370 158194 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2481769527867494476230239439839809937931074987435969173894151830357129756931 734804760733483974286895724451166718817824072333643759352265125148396815816 147452 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 990592039246951361982918155598660792174572656389956404404561770267723513102 3230584735896621546501794521213708949678981405442374770325039704642714285877 161007 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6354688734899267298702359789869696419210730978076330373397856279633766332202 89292950086438056063110191986101257453412077452801154293020441458301150952 197983 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6194195685587182054022169374105838598177554263600215933064765731971324130704 2859464085222665562499928528461066842370969439651548786818664445763078537616 189575 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1373590890027044373544229156762385528155771698450915549225738238887692340107 1929802980784047787524639935986695861351279384026260775243898311041945690309 77464 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4795004361380856173880603442845517434539994618547256596980333717535976941740 3437357120738912394417642775476711577019502953935025380136771237834407540159 179268 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4048252971394683197922009202375100297063521562757767261727057537171470721377 741150565144830759479416012323881831196336330204835879581894067268929019900 159139 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 258654670526346333306818407719020928113375108062200574477051574593026348796 2047213241364487698104087959470167327045977125889153987084539811516867438815 132750 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 7072701745005944827077496662037233911985628732642968249194639946411862603935 5761899775723894870302770262176579230710460082508661676373661813018370438849 197031 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5419352643890637233754661936728385158874129194162544651107640330281593961036 1355671898323530552164936817373954325831746324354829049335037019831112928725 107037 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4207051305460664983562134012786057980738517151017612269084525275627122124510 6018843580238728503311736127112127431640279947185312834300275719804254785378 153723 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 817102318068131430915425919492723750657096707890663919340286349523673745765 1339275675350312982454154121249552264192159125421429062322220850361710384386 159319 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5291151174159658916702741741167415464500839018552226478494718545172185830102 6409826530675991542589602900717288577219641943136509206267341455354728190926 109963 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4229966104024848293771752158909622603977070347031792371332054466817977594328 2849144257693068066991890561200893470072347839353834616658450115315076879334 113463 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5741761974255775956025086792914529378731899544334850423271059883184755293225 2958523214480969241174915708351949045815179766059270439419623819182277927375 158537 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5691508913232366591356139321208155343881525462774113048050599759397912818773 2168732632507361976313555617210427355156617394447374812684015077409970487117 151367 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6509997370591631724963004622763957219444721948208228806163203057331472881936 2944214572711880172239976403428052614174690390520484013318608799137412797990 168007 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5647040837500159578935509107841602479018070909401502624855182845813874585922 4480597968237861585682324656788957910534891901046661112909198360748198456626 132418 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6257626940341810058658368172042692346229464133348781451615756447742531242625 2765950501985670929342308094933551722754530465003932262886264724469968826712 170854 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6939490337590759996040010722445839027957823045200875750459992598418364378007 3532125052426108855632023373409218147992545651429202593443424601028113545677 117568 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6275837486616452802881398569734211170809365016699330766789730253470382824934 5295919443869931820233673866240338787246846686457244693966231001529671976860 148561 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1358222843835944592434391762592536677880417653488523644327259236792805255630 1632709364889517540899388843774689896209557957628920592718772698141120516743 134990 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4052692965394599559519796429930883904909093635085053485020678080912957991845 2027988896360034020606285565421888946617895811082685757902881496603385795561 137588 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3793391512961966571995343911900052057732364082423005873304152592650202178690 3438088001582585827186640163860162122651068110251324079867398718366767141590 161330 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2903916074130229536262387916585842944540919973090687581729523548216032106941 5085962195752283988670227607413257505590337120547785919093533918039293019289 127374 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4812010981125989812366131430228519615817484885856446572388813357782101715830 1247956995905577650559876182733706272423100904200329261417164048536475325160 184061 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 296386332241449456580606894379615493460738839200606465610738193169805237684 1691864988905319668511249718181549561084004707526154561224707892345183823937 151923 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 138969473006130231104096413845518327400254467774710478231913740973663506348 1586053311867535973869283876332220463223146656295132719860871477369953099388 172687 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2598376478768193046516118244742371479432990072310005489939466222967195040987 6275504116780894193937922936529313454121024916810242942322346642758931776181 92696 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6633393616703930839496157088265199398627598585799504551850499126152466157008 3917993707552250937893241429870543585820400925312201085390981501009754000700 173659 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 695268490513642387584881909816926593908997791787882063590600178579100972931 1633844700437614059161954669968763899003836172521593284312855539347130195507 117148 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2395939748334915719023511788834388570729855255072038530879712524041727020640 4450551890734273616755341731976564584945950484108188094382878136930224711940 163151 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3399285644987018639889837925709553593895424695145780938736436801385304468534 4422493067328905485299843622630836520152329496908717026181521064424583716742 129827 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5572861805079988453107283037595468802057661659224808908277321019445092997327 1110932941544423758948346778242187597592983875846569565105150593005730007334 150772 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2179294666159631593208784727713834512495212568704015486800889043480343630204 659569609193621369093907409197971327923039985598969856787628456727728580637 136284 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 936943863432451671633918862673045548017575232039705698616915701194454042182 6975427479259764798591677185190572340501607734872298787988072437034905574747 146290 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6455358747773043638163433956134751355000673714805429844303697998503948911178 1335061616486810680677676229281987133613959006941455044267395678933121742622 184086 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1743106117364477946805604150257549934845514675769816978818183199619455112237 6963711110375206692748695666488144691929514735926259440924394895360573389878 180030 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5881151095586398375008827205869082513744147867173750783900209144053385563004 4498937035807826933671822533545427911833441484099592552617213866149098486732 136661 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6295484822186171784543288765280817949655140993143091824012152478938324423501 632917059627824734950755785385114106246604115668975711743082814558016065849 151156 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3058206010758673849264443131247490887235671172868393410450127469014883645789 2735708129188610346636300762447089490823550231647900124380749308758862167154 142210 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3872361879339177972487250600625517598223511201001142690061150321343097877807 2526118547820520425240848136156075589813025996980813921818407381712131018201 179685 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2983675464436351213990978360818946677572244436090474941394256480807219617054 1734334845443437368568630074522062580732337133528579195057948387479317518658 192072 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2258298268445620467009766940231972687699402386605739088901515372138552004323 6145657216169502823219999724681122780690773816266790345305906905032042138000 168638 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1044407559660122796372434316310838135384266565101329825625817386122584553184 1593033423418300916105185673071085997739110097076731056809131300129846679609 183882 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5766053719160203673727331651381965634826396457966509581248319575763786345676 3591213735613800285056321164371056974291202176209658243218251914087368259126 172243 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5714468546976783277340417015533008685593631870719635301336880438310021678339 869757799215849979027174987004805469142696548433407711677525792633028252231 172593 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5847525005975899680057934986836565847455848759692236915266435477183369501487 7110196440476955283470679648561566850229680363373998728703403935023778263208 178270 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4425850699295129527197854571700066604016122501791012044949843157088322383244 666909542897198362106834848612147161113791941197112595207057030233541872963 181353 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 161238351135045187167043879805846145665531216726395141782467947670531456087 1679147410513931799930583434606607582315641154239732678732725244465424898227 19837 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 883494243672517933858870302581938663299337861094306383474178383226627937310 2955103162933168285993217035085931405514198399327055782624824966854053387293 134530 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1896489221781624226821768573408679389747526101946046665087406202980621573787 1608653404506304823936291619329224356899830545834755513765236703811598776250 130636 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 5259948581370655342803906937547605312734984260364188762983895559503261263447 3635947750738169048216007814725808792227985687371974701122702706393036016619 129464 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3937964551517529555715571441099024938083239420459206747771217480803013044934 6699364214185804892755265598670126536748226127426540999296629057127256574634 159155 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4851699905897281296159201618737988180388739748946950495074705394223571439164 1106953510070519152489916688188705095811277914140356959503227444145302637093 163976 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6242292150545233621670237118911072750903000068120372571819603782797038226111 6832878767526769669315698059335862566870741611188706097351596390384480275074 102941 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6945533498206827741693849546005985594376433144638319491429626238464171535900 591695426576256604363169777342864837584385948562058189038693201275329224497 195604 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6193004449391201688285107069700934295872712488434465981689357914711147572675 1147375758234177457123318888692724883679285283568662424321466580869529105345 138806 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6535540460850679355872514018430623271905607243526258539785863622173564040739 4284357093743577077465791487069343335993300558951796763640642479490451784989 145590 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6509679281769886790390787204926779306167226433089714223659291021622859642136 7058406702814418230643450411609986836744835447243901244499120197781533062455 162974 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 460942905789768331252296075327290326045057967586453097640813732310363151842 2617903939728044568398405022635757105286091747437689150553707838410731592576 135517 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 82303186318031840021908942528623243720472964653688466141931270077547205760 2382525037512875480012837652859019691823075505690944196806520927481783599701 101010 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 6141855083828467084152874531554699931320679739196460444408886134970139957864 6438716573815419249485208647297454459617433463448686339082761933478030844002 167918 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 132827878220501438817512769810617878420702030758407329010346862607698970912 5505134255935447180346385729089201309281424508540528011860952893487309182904 86699 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 4396035365220658656381500429581053046654855945892764570424733959060850844294 6043528339653102057029638171465922432049552647168206771136635096395575693785 90947 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3283318177424033834740475231437339878240361125360407396831070268609228753634 776783908389360861745964826074138746233478193055949505205142085100025853094 38363 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 2237415574675759054888137015267605625546983189165932082138755952235871444169 1434075870769076360162937718139596962755195731173171596091811703437580931492 177267 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 3534036208125662736929567529184779821360692217072139978258690229119953861456 5461075659863896943043977024461090178526655765959603080014541757788014569788 106559 2023776050662786605020065854616777351003832247628992350849206310281785027488 1079270832837170318396516616249394502719834190979906495690419930531357954746 1193204495300679858746319592936715450593237882120118041219181399245023654254 6230771696471421632482155915404641522481222261351522581002755959721716152226 120840 ] -t_p_list [ro 173 178 183 188 193 198 203 208 213 218 223 228 233 238 243 248 253 258 263 268 273 278 283 288 293 298 303 308 313 318 323 328 333 338 343 348 353 358 363 368 373 378 383 388 393 398 403 408 413 418 423 428 433 438 443 448 453 458 463 468 473 478 483 488 493 498 503 508 513 518 523 528 533 538 543 548 553 558 563 568 573 578 583 588 593 598 603 608 613 618 623 628 633 638 643 648 653 658 663 668 673 678 683 688 693 698 703 708 713 718 723 728 733 738 743 748 753 758 763 768 773 778 783 788 793 798 803 808 813 818 823 828 833 838 843 848 853 858 863 868 873 878 883 888 893 898 903 908 913 918 923 928 933 938 943 948 953 958 963 968 973 978 983 988 993 998 1003 1008 1013 1018 1023 1028 1033 ] -proven_weight 50 -num_reveals 173 -message 6908441180828167112785246881494320159273940089327447106269949444716788494909 -merkle_depth 18 -att_root 5677453865974571887959332730001014635222590612833771461724188657255373897856 -coins [ro 6888918426 16036191708 7337137445 17226326784 3047097288 8350849921 10131150717 18073827855 2180113563 5749114901 46675186 17589617118 2875595348 17000690379 8192987733 18195809726 8059199018 9454285339 1988651335 2369153680 14917070857 6172088100 18585219294 18536842715 9871589633 14934906551 13304632146 3388728819 14390029418 13024720883 19560459077 11150738211 10670006947 2870480048 12230920882 407179601 8312850078 18932244732 11269276672 12221713879 13812088101 16047025303 18615386249 16693299694 610425005 5605309348 11652522776 8467504724 217115955 3797336827 17499929821 17145682896 11171551895 15831297184 10010641879 1941521701 16271875020 18245743981 8255090119 17777789094 2878149119 3155390015 19437687606 19153396589 4352020007 1919429383 2257738368 10850761414 18579327470 14757704060 15904417809 118677440 8197046808 1916530522 19157968519 2781148892 7328105839 5179006440 19604120789 15185822022 12968098016 1633945182 1043625786 16232402247 5815421199 16461343071 7170262231 18890461103 6222175953 14600543166 3381619255 6535037645 6170690539 9056309292 2482037378 13358737858 1924209772 16482060338 3985620065 6449953693 1055287191 7604245804 6040523032 12512708969 10871116296 12961667391 19598692868 17969418820 3000297464 16068528684 12662606645 8811297030 19410702333 5728492067 11815393509 12691292997 6045904480 6436913408 12566920922 11455937093 14113195074 8767230534 14595500178 6911137767 11035174107 9111098445 9465254645 13013693120 8112108251 16939201658 11540261859 14910314050 4296307535 15078710030 6861834029 13309103676 8427534909 11366042784 9286698285 10700331399 16943807825 16205369590 9338134681 11424087474 10111870912 16143348195 18445846796 14219377909 16906383782 14833775298 14894178855 15890062304 16444390574 196760435 9049216158 8532946547 8380448509 12665204286 13444051684 5298449668 19130411076 9633510159 10598162129 13280326854 9182405570 5101516410 14098146050 3758371541 4135686597 735861998 15711874075 5677397026 7301145199 ] -END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/compact_cert.witness b/zok_tests/benchmarks/tests/compact_cert/compact_cert.witness deleted file mode 100644 index eeea5ec3..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/compact_cert.witness +++ /dev/null @@ -1,174 +0,0 @@ -4378203708522988600544993575090041412111200317862968067602471829648474237098 5150693887023362059625463075561481256683042373538519075170629033466472845895 5687389024518862040591013475183551087882901423300498686940435746938101594659 6888856131 6888973510 1 1950848368631103844394547310780700770166209371388090135150256037482736222310 1698339598225307960916652727375543807724565518387339463387302881173313826003 1 3426130274779519806936350377341322452507480781812397313653894118910425042298 5031364314191824074306709204515037201241347838302362526618363193683775867722 0 3207665382598269618706545536963116095822189016725697214504810635771419498660 4478001320583997588674589485166242126185440480401015346201501375378083719462 0 6541248575882905159207470598320104778725400363841612344720076934211121186056 3838270522824300693314359720021217003091308200119613522810251881174322896688 0 5640091186836982576267445820125477388800376674430000050540351800186056975914 528201886139371844830489348054542695661329673718150836820168631079425235098 0 4835948708454452604761994278122807838791200144893516897974230789491097696618 7003001326492890244210491735643959698769219461043255963658358774233409783785 0 2081414500972492473064886453181573262709917811294131523416236792185706599015 6859429318657289001584583734923597730853862699178349666277264489520371146834 1 3989718022770109298858993614253279070536817912217009648250578599395334089365 6956393769957564208032758686863683876124216384454015207441021063237642785367 0 4158376795995819302330813862781514057512323245854647093867137948066931220587 1691508905793690139481184142233500244813564574963607330498595865945861143094 1 1024992048347257905920964509758533614320248044819810745414580678169687570660 3791418249899210886868186535745547177754942485783105803535881153905718665943 0 4892911685640918936507415812092628174906600733410473687651092234682149603333 5433191193400283830449270445939645756530875942930903471232483101077915067842 1 6979269453309009111069036018105677771463384075446857673924331315888505530952 6415190432501433395733658264573518065023765775625781104935817327833498905927 0 7155842912162336485845305523305565491772834783313129438718163644875917614053 4323979049682445725653339279525878673266906371560474718815605130743279777072 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 1 -1539328279452366129635342403630251735934193898460924675949976280025426161135 3360857618547027283138212606545210550124594769610745200822376552699769180015 3857593046707496325838646563501672653906910629190586954781102196372811095755 16036166328 16036345416 0 5103350828419708215120408906891252236142504023317189196009574268697841681969 1981206247906033917315963518652650049727953743329131488813528300650869459069 0 4166978125545751728804632521332691389960383385489580677320099384319942759031 5136753533488311717917942117549315488295849149116273475215210904760732619634 0 2506229211928680040944881392564395307016786966165811986910046886931231050513 429976435543536209946212947822952795900030094863838959803086309091711242725 0 431816886269156108642181436117468050089693807569016641313602631025957902552 935436195004233750642581890160462489165697196618314255305054243172395171417 1 3404886590693759067880917925822420123638019465781718293909132660018700057838 1753596658864247747920129857244308150049689180084524101914305868418246854256 0 5047213473971411429491676879254701113323066856963914076519990986132493072713 4139343480952330968948766655928768831840160683988552441614143320868107016554 0 1336480460213144389536634950162519031715504025872813484529264656477145516634 5284702585541358318388570790880388344092686716150072165600433848393278010163 1 5491029446661306080146549843379601437314965472316571192292287311977388796436 98938018589040802555086423525310230702626163361179120560574057984150541629 1 5097652488396062190790876451348159733408719867388286796662590210005701559501 4033553406875459086491634879199649204683665001937295983660771361715168708154 1 5623944426946884329175591147584116194813417748977877551069736022176638922778 423777179278032922712997793116102448967507356170918585908267240595244700018 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 -1359348847262188431837128757396817484934706837340482741662327325410635829302 4989489979754578910544401326096359165119558260715425973735015092415274958576 983539666789624021590546393386335385238965656066209569475337917798188389394 7337025816 7337146953 1 2973464897889895718476501713722156498579000652788274809406027207565209317732 203996507405890723080445473710125850313765426697203234284588650775158184890 0 6078876229061660732180699394077311322933159878801654409207292108013990559609 5426184258771157249022273994365618566094096071651195187447035645493272957066 0 6385843105197983090613148261991775605244214449729913877441044509342695521781 2784449776064217036290493699465801748110483023558814094507361980167344009936 0 960410407043577291555539417417669953246727566246577842715654608895383633363 3712692236034213680243430973092450769621084195475294862084537735577903080364 1 5346806945524874205199174644017690999500092536182372872982549139386848201369 1560356731844727793804759949447512786148320431399342962426065251558721835141 1 5987820649918193332231135166092418645466699351603887004474435677754378953180 4229601980388476660694774362290249531622940586189351110154187564335741703956 0 3071613940354045186516407499073150584734189793695648756328946036806591864283 2984606004241662853915515005327878266559723677367912642581370319590602191501 0 1131193742425883183812325810388319971745289631783032442683484522965413362524 3810658320862030633836801882550672055222962702430675452960699352627109067342 1 376423024028718562050217496617825375983290683165219360749589262350173490749 4725890539547658502327347427714819122302436392923360113850878729316138039121 0 6822395443397155720468506830209035564877505182262522500369495376387610848120 4256130175362539484890043936005014293686834628190122807631270275824711161868 0 381587827077940780343700252948305267828895242687867325974328645516175905370 5076054685263388639846366083418591669610196374827711443108751702880918545735 1 2716624735279808654707628380114972718089722437294438951140070219003606061823 2863726410667765097528054096725854005399123885023985318551050900789164853757 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 -3367357519926827158318552617685840550167531291855303995456358525481385725073 5873133217569441046226878457097421501092335758209372542000833531188986621297 4438778396946916784910400955350607769528767503191797889793575064504262250748 17226185691 17226371305 0 1206681960433851716198991808549365689663008190071119807502841936948451145525 6936296331526670591793656961487871164410029319137851668632249283981051349395 1 5354882901985735275771363837219493791782248172121344258977281269983715404008 3251886607005560418308291500709130932185841846809322131452843841349494383077 1 5095642618775993895433635442322129299346942887386108431484064739492715471066 3013151603871097628632566235711918749904029255144359646964151646746854648260 1 2672832086668679624217126863940446096503179345639579306886807497820025932052 6321790357264680010689015664001248785750444404217069545940539905478737824564 0 3776484403491018514355282575586683902117904226405256424836944773031837877400 4333979550701678828812451743034235834791577959266433421493268966980437627677 0 3969452994104352393815775257409828146906647947572450836919060504858805950080 2012443557344969776059692790871922847252390917687762464122346923707438416753 0 658969739938605409543342774423207232208055999521522889716669981764133412457 6931301345503940062634888128338282587701592822265447324369927964635400628744 0 2890907082164592243597480331054613982436757527262560222374859064217657213937 4249981849937745664088451795379409377681869392910555549050169250530749190470 1 7036650560244896146869605945487591436477987779221812999875063587300300701725 5927052763381411859867284525074609724970609209289085018817966308359298795623 0 3397981181116875774268823611028109462701272807013816846278217941720131420640 2397393443844300743795736785639306826779552422666924710357188736756075331439 1 2749965368012635913817275803122883509386979135822633977225552798012903260503 1374840111942530252261392456068355963888038662069124181741917713707898276683 0 5560231319085748359065826677239299538382586759554704347812125214655086371153 177865380135004783040460998011499714074058548334027453924899064909699457502 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 -4609733962502054508240291150572320319825548446173122976456555206322815172730 3227279051444418350644002658342716190895966627663904867358906866221362520539 4262272042815190588718973032982959402071510297834777352719308758374955344045 3047033080 3047111145 1 2495495691347439341109319462595362928211078255677788010165858592229463772365 6862914658207994024914476742365357215506579530974275189799973290354072042482 0 4851607530404336020439156017421276789507583365360480534070624609469195320192 4114548525665418457657166326117361497575525640426123785198981929187175681690 0 4078052049648293732253369938513525694168608140302103877081148032191105434971 3948656348922231120057247366243461774672781215342435515795348431758615044332 0 6164063713700425414803350311174657624026001855651683533810908735341175185679 3018274657340898802387143625858791285482147726509285311619809242307418142669 1 3959070143880934949799475013378185960236177855913336298631451972755881514497 1522313621565881353452680162647253097891484155135864745950494781065870192892 1 4770198641476420028954888489332980749783726120366586317431270245340876799783 3540216141880513485084109387389621415624456458347336145570329075373973222955 1 4950250091563024378036873821373672271914526101437739376135564952423958782967 1874692862270853203468750374146037712255926760111464761425983298592727275320 1 6455589742664201721221592910901596103757557433217599758810988829946423634751 6504608031926794024677381827950241660605115040278421627705135231181654050894 0 5800618001716522660298385687637789440424629319893209729765641428768789432725 3182081678909269494797100636555048778312539553561771322126300457521083961367 0 2073557225918746737931893144106599885260664154034785113131561751394977080769 1448445341702023328824323772134769111734633160116612416932659189179479352351 0 647396879011828136652398932828472194296629219989498342359072959376163795007 3293152012997116818272844109553090053832603495595157407054725108018909332104 0 6178963790485291848484261753008527497417695452028629836382205517107813165535 2958113862062575030413585133220922540485982955264740187429450152932855445929 1 2054270892742447876736699223788912751691767605609378488840379414771350138564 2835393241416923108598374712393405131819552940731742450349474447498762024361 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 0 1 -5312414321578905869939376183070155834397130415917502702381640808430517235857 4920755110773668458486849488160046264153058792248728804516604299634995631777 4441755745320769001928447984623516244202371614591947133699662334076691821041 8350777995 8350907230 1 3687832289118238579323708473021041817005435847594634147523930452830302755314 214368810364823795216043280333553059960349333083838830484952642894026383921 1 3732213218590762133929065728122247332218088965425415780218191661962754690654 115355065639135006379246319910621630601781582976037428164347989722648977764 0 6628689683151137044938219452286090209647866060285532213222238556243033171503 5821695598083579659983698286459829304936783311457843244650166588047766217212 0 6284041499997454808825269445713523336990231302771554422060245984827053027858 2812891760432985937573699299504646834845093738002160448257783854511762580910 1 1936332360776872865915815815605388663468469433658239320141294560567364064771 5416675924133742374467258902293335110637847465720676992394710137572932407053 0 6874083190530457785456459124253375540987586610797684942564054655184011973974 5803955094676574859956643188418770849888261273572950288525451503818324450948 1 1873743321157353070490255724322582678962673052291617724924649731749981424478 6399878378624976988443832338948831100212086694604171045904276895048481213809 1 6099334744887512017160078574739130441343806328393721762737008890470110235780 5502016984553034492095462995781000960086943165553854918692706720383577273545 0 5609599601072605851629283782036459098317286618818647656289874060932356740201 1931762207055141122781202786293879392684622562049278083536273239976540476142 0 130532064112525543341947192128215321611567248117457901791079621350300363124 889633345661967576698831244896208397354127600769250851670197241075934593296 0 7173017566049627611961637667229341836912935554892773554725821389416315891716 7133448645250593764214856760768843267515783056965422435368550513826328295162 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 -2843770171540332958116882543268614918969823590871601025975389477721800531161 3806259346711088827509739896833997376617903253015855686301665981980877413650 6579821738233985317063291814152244833296688937752780473545438427522741448582 10131120685 10131263031 0 1102628272870203447754111553688286257718374536824878796512204838029832441709 2453283452946448833094323988520154733325120976032572865278529077703896451025 1 3564400410244034569336504480615022892425430814541005532206524315411142457050 5178989516927321004286619067008788889661872355858730828596120195473042858741 0 162396878656503565196865316895691164220567302858975984515139315464443195304 4596669118668095499550943782034710838903496717828068960024736143727557534302 1 7185243349345577723480373204285088000113627827439040702824823163981753511116 4053053451154272105237841078068916783624595090308542348026686842101202675858 0 2280426144127697896445366812548607063393124263370925700956500286133255025466 3348935949135586096556813281984192430775509084561425109726500433023149887147 0 4418671011933570961296775052476556587838448453974626869865504856691474024557 1528040511293036330747815932562526842627418255266107363652957190243864292201 0 4225864484418965044182587217528934579358452020314930567684491921245504966937 4460982247566419560532739507903151020703368070685738682301624130025892777530 0 5396099249871508391798214235060728270646165242893378883447213691136015712109 6250263139336203865237659424118381229282684137731556593505955419375664708710 0 7224278891332892181375648671869878892390535324048043050117802255980283825335 6435113118798480835897477469851483572169914842248675550874982720522661051214 0 414850584943649408319352595503343374101791833320596889132193681094048747488 6456886635122376527026586160930089605574793963261369090045645250784598661489 1 3792758894742702556282064790000037806105791336428378742162284927980999642723 2917031550437387971514259671167794693339856545241189122040159139022495436390 1 4120488143092829846248167395039563980310127782773428421117056740490630217427 3320697570657975296134172091862762359997279902800673094072342690677726489140 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 -657000510038071659568284603137462047641520266754183752351044694309216612830 5638407298721143370285886992823929397721644894840079079749111433736529238880 3991140478591042230159466968253931864253204707773742292180104353951348746834 18073662750 18073852875 1 2088666589620552059176551405269685120894169425572885957110341510107900590377 6825456399919395518978700108751619782942842707104529777765111837158736404280 0 1781227688281585090507116113701806748779894222020912752050175205523514898493 219019815108015762983545175489541833540695254780544062375722432683313200534 1 7103255257209101076679276721495398044747465021367023509042274254931249985385 5462323130295724950122450612318382087484108744464564816945187024727619945103 1 6206512540375287481163637612075317464958858130851905060033224301696373574680 5538901431541628123204593905443681752696995956238194173026103380780556837346 0 5092931766360040338010022132981270090265971653287365968472651100270299232539 2862283507554560495263437841272132214018871863165496125014715672067372055569 1 6555338490459843174527712604210744109282160532342277018238000882171266478846 3349214664006473313826123816806300841526929197425740779228483846220623449971 0 3810829763147571819421867973220063807165069933088887716720798964713098718730 6623118521767702660971289949854365442155243755097346635291347703059050953804 1 5582002673702838553585480608675577460419046042940648444183273996821646624354 2388451666950249190974670316491545401405073578540566165192835228527939697404 0 800583240349181117956360521180793347550664502756843829946764913582021501416 2952694200436146155460509454338326837625108883935354651520842932001456965346 1 4802976341196069067621215050777626767829284086527747408057221871193032901763 7039794682345762441505379892462866966529769751196097722098927370174862503482 1 610961996683823342847432748670245229189931288994431473943849894029693974179 4679155937159915780538742102958970404823744339356982847472512204638530081570 0 4954118771740069233454180021476303045945454933874228549215641901157120813807 1218159010811368834065923421831385722366744274385747812130026718286965530524 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 -82305639472872365382701979347740200870711853298134896890853372009267232927 646684070906328976351811091676183278817140270520498089772089767873564840269 6733854109719045923646278366652489952920575747832242710239717457126407361675 2180079496 2180145528 0 6472311487436628347139100516440831275016734909751098811637094209550637853417 6435376741053417558412508732213206668981498706442097848357965131941576350041 0 2936367049069888345687455342793352419739364505003174548643483481670802354140 3213693245952309058430067620674792389082070819156998616898448286410238622687 0 6929825202406264511793055902879460997641934989907122425361463525392104299690 6327403864059944806274126810872648065857433572918619820372694074725796619217 0 1189207026973226941418917349285152907768989134314097487161361374992115263944 3634609578252958276991263749571902377740800324169715434021472307934192921145 1 5252947495502510451787193549481367554650656087361794237991037862102744520227 5870736712591730277796074136241658302813152353713667093265870109859367019342 1 3999590443150529728398694887273701162985926793411187838237805314708678080717 918338739248341146072023545233453245131175497318889035545538998234540068068 1 217446786082289472648820559355016993404528679120293884285623688935201493774 5608333419573814890567351381913617739605198183950699123640987767636569874210 1 966835718743324222543797921415537575615026759110435321417692659736685935407 5814444099426248264216693615704038750728838555909585204464663261899388371873 1 2344473634996894347324532572876610114150849258160926254469710394824831516048 2801692439862496355299607120788469345053736050170464489839721896375418934828 0 4871086586118521939764647185124262599476955771019184951822267117303405784588 3020759443269522711957918906521930358536313048448555759044595584264687909548 0 6418503448178957419631378567832700567543684230184959476386838607298453902381 6989697551117346405231501869922422236980682035184391882461562697239908646376 0 1263487976924582745650530055539007704817321985834544259802735646675171503834 2478983756586800477896085335177274874903916731571528577378465939112067040350 0 537372104467104356370927201155403729452279447895081886338621527456019550729 2553660032204632172592376543419529739945799470022130954058558430666216764396 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 1 -4630734094668442626917973680368589728865110854154422912486420257517844115867 190754207521407053899003843423935056084719521096121004918922217467137044704 5298454168976094155262244197168382157144496776177371828503588758169424350460 5749082835 5749190065 0 3541581505817948439260717793139481043114115922619705467627835096886685355653 2438347803384822770060979456647490822889041492608014165792504907620615903483 1 4655785329762701025530507790206105713991385360992581394151162620860589391762 478351287683770510789541939206271205191853494244386959141051662656321254954 1 6316697486768005174323027096864158868448060962624762663825225453059824751396 5562293856539370522671347589765061658067035728230984317904007436769889249483 1 2062626694480972156249645076264271170798455841499439705612109827699943867755 18064148075685997366089743938324404664032316198903203302320585194580464680 1 7022327123756833214871884838671492979848282592144004058641064495559179217806 4681052962078158188119569709582954127041149690584926643276876279910698658279 0 1429811010394130120404989464412223652369262207222133845354061149283961389725 3991262912520156121359518254235908654339454199489591188028515055586251750021 1 1483105421385986889002735246816943219359443337727756513215999403873080690551 1841243662306472317031669363763324449031325173097489775556452546040413390325 1 2860158765562614000004707718600095319327247308668739430996475859360344622758 2567780284703315122730375780462438060363496530030136494536577854933878745943 0 440762013614083864702690325576740568868073824040830364972813993209590855904 7135518748396379962292564427877680506833089739685135727171246196322620241956 1 985810401081073983330013099760338873796265029844676803612342709256841550144 4473752583062219851802710356245416141451458613415297651507569172740686312314 0 2480945456196614330103532521953201989881252061956788637201872865988558651559 39083459107935642933375151291211598966667982631753820829079052597598380191 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 -3046094362262060845414868223407824276125862805997355761741047591364017160392 1367331459354302711340505338439675532184164483449380379548584202020089769858 38115158530720743546783030979286377579480848573967455187566175014864922705 46672291 46681953 0 4070896530990742584585110100966245155941547541347505075184194317986932129072 3738193462696549126326220379988355778618644106205112255714546519612344625788 1 1832559552460101510209815327573271383362725784854473135875827188557697768429 1989880921554668355783588110805669729834224552032895892889784415888428376439 1 3493351589119174123646865079471518746233467475739343110441472341377740009479 2084450736551670219782309853042929384982656127680482724417408576582163367499 1 3883816481859842201214257169803304354666261473138895353516652336991491713108 5105507648476189508157667044736859007305783516524618587782972309030604952357 1 2446827956187767868436587574831966159526170497312134143960362534089217416633 3720207891335958503570033116734180852686670431015690299086140340508652219380 1 5701155508572652904607061401327111949144892942294517435697018222778052653097 6875271760722767384214214780216937489530504776671642273132100946629761913495 0 2273530675559794638567155500404869022795036195273232971787547385145808404525 1353638309446421049269133480172564603464933993001047275001466010914052625043 1 4778383088250133077908800191972919026087407150340101868878817349848646807609 1159378011049892800211747290139374402290384246720016498354417904203456462647 1 6249310125685738957542444451537103829008526366580653854958938149728284651616 2069564779814648207921815914497337178100455719469949296214129822445000159787 0 5733776948458335505431135920777756835444218339542232177573582355702190932374 5461923103870659802695000150001935604104546401736351627687461331607116785680 1 180221399486395529487712013573814835785889781824064534904113796692615699644 647039311860984136776775306274932901251719853607431554394211350897612813082 0 6466333345016359291641229280934012104648732595555630679487624027935042161119 2092303992023618381426407081857252880133236489518219033873605695172063240166 0 5166697050479634752126716028639477242478820332177281784739791170318065914960 2799457043062172397792282327952747535941124355357519448036559251103084905880 1 5076358001873148322002447952972769939268943642505974868724355985439644595520 4106407436109705082056521589217773355847921586231929266271618944873220824565 0 1566838666653840290148503517266490486786790312633690005404814002888013416241 5371669768273597149174698983667332452143565853352447763668746512088381553229 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 -1865568079429690714783490323664084965394710594269851343236561854242149316337 3618756458434793949648268186300971997062744670722820953784127525976788345255 5839344927886652088785379699664164227933425991442747974708658445989746878374 17589470580 17589658141 1 1818873823664037119334262351998922174735945239732005300816330056174574252994 1629527408169511999869139847597946069723569782536461259163843060791576493523 0 73060290181411603908924398489089805474558125682070883482528851740341455485 1411536204741952136157361135908391694780421273625746520484110139831151584208 0 6394333216155319855677028608598166090097904167929400729571247431668716939682 2183995636224671810794051622950100701032695513096980898654465044168358329894 1 2062459621558854640683953924526490679479938303446951317975009329054525204509 1230588180392653682872562479783358958101420239805191917395690609623813884464 0 12124581436548686001466078593070099154130780682837470391240079731504804296 4729949462696849475249989352463146175084973460832358108418675747670824532815 1 56937324930197624201577538518895597204310001284835935305087243412871042751 5492001403413538821993607638440812680366780016279490890803282953687136529743 0 1872647595595425217928325356492773544090575307992830159331777657626825259421 5303468135892008061440324393105561883317264575041129475606135948405777931585 1 3396259807707924139772457030816473233612866727582619625488485028430493318797 3285595247733356994717858049734792910155977500153057306467933505278788137424 0 2855712535144297818819322830036258374479703334457222581573601041353117282098 4305732561052176917439169272963668204708626787976590416907708522606992079871 0 5289157800286976355458121161606411668590324056279052876937512463608201164004 45046525074200004062426855137178230477949287473410773360037369454492338753 1 470271398945060857551370216241048640204128787171006469150418762846714098998 6021199246809117055642288072888573590984985845281033565243907646364105457879 1 2740286081182261945218207432888813761788750625266596663213955697618590814084 2436343533840502743892411422196862265815010361190561182811091257799947812925 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 -1120209280704949719123372149153087158169680731784576547460281724327345375872 6879292414975002343668960048505582686906986261198802385360147121795428826391 6070207998772760963559863886973328400899063437677305114161477651687273435260 2875587366 2875663203 1 6161944302297459025188444330121849708272492313461929949286541699055005813844 3674099595241139434210035937193422165493469007951075741188566632094930437510 0 2861893693530113716114039498049100968070209584558653669309134523774580148264 1053927862674738011289962327575577899279628117227094978599315588389754144844 1 4002354558161007206714491447142476355131606983640098867709468183215017819300 413380377662929591424015340878468542598016047691105541160494245852697162294 1 3032303708100571518162757661773001726879084344426837946497569684252295595781 3155769357946051365889347074700281992212655527429342993968695646972314475040 1 5010391762091509962668962437329005679933739331245985537842806074541493867109 6931218007167707615699647877654981639714496840179537332967205120336292914294 1 5029050102863239299718235470497443329194739368584468919662659966948704702269 2254621956589641126932220621280969131442213798936178256797494401129973386229 0 5890027177034589194873137100567723864552927401453603096942185112078021395459 4278576231928118304344163116414769315041359575130837643632110576250073430426 0 5275736724072479441269198998183884927433864217130856049967059062009378262286 1014987897908223704318457592365181785149638798457555805449008957091044108592 0 545349073615116825070071815299239324025450617590922661232028093055488944379 5811278199565708005466886824651209854595220183013004220250595980927236201286 0 1864760019213764273369645050316744335633205960198138967501734080221856560133 954119848428133061068356164596292544257661703187772497872563915727989949077 0 3438131511756887113304362835531823055818014128037600094068858000352407282787 6942546227104968918998275572513586076314079026559043007101160604536324990266 1 636337017767903855521004994847573827015111012817337782774242594198209162816 887321707190165518761724205170388431391094422979710052592902565626708472233 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 -4510634051002712137349663593247665269030254500682072477146723556748366131974 4726589157626610235294987354098830249666745788501620400246281604277647140679 1862463443713841137004177776884269286452435950668149152741163585937843251400 17000665815 17000850210 1 4106307729006708004842493826280658809551080232612848374313144057154701533302 2480894207275750566814174665775344902103839856914391812259599875945204075883 1 5814351043326152948034321913512940037105906463262595682709505367200962950150 6561320832010775431517324453481476082482995557971498537808873994655824674884 0 5677834503697205094657550479959505059943301896782522150151099041113332933094 5686497460974118305612769776817845664409677891228298171022649928563578854661 1 7087685716508819327411501446997095682529377951399971441757949468320813791453 2111740598952877987387803966006248461412820226723231576011037568864117948105 0 1773701341741905487595786005988623767157970607654984686496014959747663292584 4185347575158184110629608261014621424963308082228158453635159937764975302790 0 6485598233420792781714700736647122409267000071333219678583772611169195181690 5589186448027350407533744043655315649748375905994629752919778857051352378449 1 606943355284792485843875351746950716108982934105359194218897231124556029099 2873431246592964983877819374547444627358548601595817678027644946491449213157 0 2141586765732092137242970695257029056753702870890911197459857480383419268773 6820029666008527308328925321349363003921483612770122957404965583498427001572 0 3664738639991941153442978880654058981347429153634301311840844884826568565514 5323283798750382161644980428840550450231347435173653967093148711960889148308 0 3581428586613293673109789135526299608364901571510517930974603559526289208822 3714836389676117808526576911237413000473969081765790653763620575415576563393 0 6689738105435081523787696274289877979050497952434140978978742763007867337952 4949904108027129624947161570788126844993378416592965720732642570205508813824 0 5560231319085748359065826677239299538382586759554704347812125214655086371153 177865380135004783040460998011499714074058548334027453924899064909699457502 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 -6585189975036957081643615360757146839286912266431404841254871784556486320386 6339389695990013556364482994743847938261795810797812938666108494846190458722 4234644092257649644454705355600759618606631628631370280065182273993730381123 8192960028 8193088036 0 75561967136654285325123065968211859584669313265806052117711777498715926774 3702353541728608203859326592307307930411929381929949486944091276921978847612 0 2743214913342814766176790621508345400629093771905773325106872962402829018534 2240217667437706633241679059513415340444374879254314104802116998009936724407 0 2919238105630277199974864135803243145739029791642070295729007181311679169532 6139956502921261218814281367958155058023996600626832247529652689125111643340 1 3543175186610232272657378755495130539891198913495557363805993233844121370339 3387820186006553093737623033402790273198637355081297446325438591378867618656 0 1178206958616660043129198469466453496846946091266939157555983293634964081417 6125242222165019018737439674472588897355297333719084641433306026762911149014 0 4616816620338994290759539204634374008208023786235640357150457976122958558479 7234840857578558191894129927257895684401239466523179564481610733090575896307 0 983442412029669647565119300487156399027109235046064379905005391131879005308 5964151450909467506185428897180855164686619595979617286257214262209927978007 0 3658647259749133473439719896725636210202294262581646683056413072208722694989 6958704132181572702380502689073991689036974457322786496427149529751025512311 0 4843561766755161080365069476305427686046261253511075928430281210938022079915 1583909946357092210830388530508579496449115908271002864475343644843087147938 0 7165571529483368224349255122436775113936047056193451621249037527755274149208 6823179708487107300636152475519599892976475704877867649060753079149946578240 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 -7029746835875347709910297855878699600817561661685226164431627100364408657992 3145068512452069635970012980058107823314097441678416409807851645583899305988 4690184568570414250828964248641158249085498990269983164630244128481871229648 18195737995 18195928761 0 6410028802297381381334596469869642208202487764683981910955603305311065442300 1614083972814146941318906637583405067419303362366884840509651722376846522626 1 223697934254984238455773746335231350908036303812436038804092536620474575611 4289259988377479999155832117003891645408312402455596744568296698621729959211 1 1333176170104380732189038945504646869912548385295414271393152400481678312633 6861295652211636669097909132283971069436782820333467685612532639510679385178 1 3119818500700612964848103022371101706248226282167043685255989455014737812992 4927970339758799694104317940115181479026854502753500282718348941986453199152 0 4300522633582700896352867962248809530835195301186650503767747903926608030385 177448133995884412641969125501303422202968665257046240897559601726572424360 1 4854964704420953336141721637600665722875628996825503988457290673041000180479 4749772724475314806165170663172725155745531804801947058405534200987727082166 0 5758684052685517738934055866750540461732123997853380868704753103479124237061 6918183509281872761666136520713736178275176240985210350965971365645415406059 0 4930601502020010830571053209569602016649814341880004214289568274931924403782 926569666400724857955496566311675718420789261417653143750129931504184773982 1 2888545149810433462380139185409430412473652396025934816442653883707738717410 3027458986600825239385266571824574866256605592393844065385714058900107652601 0 2203240266240115128047913542531318735137921244877839348862176072628274050372 3361223308923116605735583285712910181957724875815422180264776169712880808946 0 3842520623194960678645132311482324762196657918303405730596063696051067280166 5240093882508821633546671715957649179914375988411896450118104066706048146343 1 5370059975383356337657953506195486116590801669004462188384319633826615123038 3601787677204411524194356035196171378973584312891456035693278172947545740645 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 -2061555181707113494213874489502433002915850845656878466190128279665994441274 1530406493121035279824873824985978734446202007253393006951763730045138756880 2115631669791264740271525562376684513061590563904103108860394654842053357870 8059103403 8059230361 0 2652769573938496869358018472547382984575489531226172094978338150542820950892 3571768175605385337376571969672207753289375103864456282914458180716294542511 1 2185214538834360278729872754959706873921705308285917147848020132145812753384 4387005109387150918761845100129197340336982116402514663767658755477334306746 1 4653497131269326516688769358837969769252501366717345432951492747506192206742 1378124097028598102374907086174584242112215732952051345830702117188505017540 1 116577415468875990079534858720907738951866717654165586698579817543991828388 6890978190961794748066235699559958562702857775036270764945627949072223375422 0 4053254318954113120497624948775444062361139619994129500846726905117214419725 4767511024605726069289709445272012731949679599208927903669686094758727285936 1 2853651279362607827690480990110228295983570559029032763486623417477504982905 5128395434670966524033238837825407070405344493708974362106440445292280307672 1 1693559702957571429897894562402820310914004851069622471176560457427489618285 2498903185468056016667594408343689674966917992222418520570310623568709952993 1 5391851310148979383831813292651377796533811704861964984422036095056108248009 5536062146737941934608708157409112503050349933831726782375386482268238886667 1 1857886491031733589228669022808995795919307616844588261571477205651938717684 152043304517522910232072893022395950642947518858227434898168810179556988082 1 4814267993185982264220229101160424908995521766184788934858342901203695535824 2518676598468722736672087323647018388560311650202141037273268004698552693252 1 7056216420570174657767245213567396848077000168704316817346533878406549322743 5220206257666153299610299528373302082280327357069555231744702221233417255891 1 1019281274627671775073747399626249265760855070200233985223741460106927700390 4272377156560424051620383988570456033428729892952425147216065129800661207137 0 258703955954202736603435064550252515743583642500042967661110500285521204030 1943121978191481054463506213536973761124324300009761972280220028756931832708 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 -5993439021162471579306120001945673585962088277649504280119926840848696170081 1389793378545091602466810380491025984189158068118762948287387073578052952374 6964957652015353760230429659205450247063300859485519182914261744630168416706 9454156278 9454293786 0 678611718730475012836371858313745191196018792768006433373070982946245345898 6231842130771094649682431645328118841420740632413652655672768983376307358463 0 5603163163703605052611717899418168736836568983689984193377797024001487621378 1132185265142290704957667309276966419798146780469674294617252331359378441449 1 227806989485550322717501988653282176561387537280345452175643024483933654613 1791202030922532358737329776881203946292460418953947120391050163123271423818 0 1006969787620331594495975498461427731032434580910430642282647975023495240398 716237504462567902314081394907380356713991847975501015078505345558513740803 0 2132341000958686482357322228955549194955349571069489387965631322892689646579 1522534387231099359665321762711122804142544524991553767365061912053705703989 1 5545121777201119643763736656159576337848751378753322657885900461019503103134 1229505804126469547444085368823165627413674727880931565266981868056521846618 0 839534151720804644730677936399313762718060888223064597307365030231139639662 5091488299679182889068706617548991911739025996014278902047354603662100680018 0 7168741777830499926565319031285412541112655757199114134370299974068305995456 1693205717882576390017851902117212801636890448534708388704614256618159701777 1 3984231011782273273422292383667973323789490697000854758937745500167990577658 7041078260958022478066878827635483929779307894225129481782089261793715605887 0 5263458285906402043281543031790274806724860596657903025337105568122449305467 882503965795724008190593015469267369069565389426552617740297755908925830233 0 617089256775311680987273662138783573489672709301091802846122274534552911898 1922922666489256159477459030286342163904263920192467486930160479429728549892 1 2375945960944027123296314725375768316418723511640484600859380970585628079877 4157080620591651842766990831012098333360382658255042299669089469445871162108 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 -5502168850574350291966011931562736830282905619300035825541196068585088761523 167791764965416389319322209921429318172830498041088869626795509738955592094 2168642892324501867987045450244048205882064833636335810984608359648161308474 1988628645 1988691711 0 1597334699686241990004078549023319618608299261157235635675428301853954128100 4932621024427793215522423177890644324995776477499290818693640865172597030346 1 2953735326093056242331479177106758917916588817384233093143839860032642708537 1602389897620597834711663398578675259927032259067401712616142270240290334965 0 5843350017155713552858163554946152544269969045893768017941426686633504724679 2342400025500245312290712039243064994784944959972051132793999208550230240609 1 5024061040901141575034681574178286977074718266413748491351452030486374774819 161834224487742892379858349957563953591006517364122033393985909372824539372 1 894643057250683324853246854201873893663275707346154458433790962719006174181 3803497175441443860369517731718586472684695683686061488330988102143211772676 0 6799420864100018465525820572666650820406005672135792845510959089849746819153 6087709886179349081846884867652264964893202729672117094530194310149018898169 1 2319895010646126371822547183118292626123812940150982134895390479147453236320 6278116942836291461881838079157381029660507513671263397897343749502343981923 0 873459018115082015473950090968863172037769941610734130813366438517973750736 3145189002151932300772130177371657935993578954084656131026167199914081033755 0 6161909742358005308530925619942296295943571686916309548876840668315982302942 3959441870811490867045803788879638241859125193781438078956680755025070608654 1 3795461020737960717156918851338868063735823753743428021129547957211635494817 4989501831128862696776387819134619017006698348055878064025484736033201441490 1 4377541451482272345402794509954762916432440694825607616136403482552942562729 3766984225265266242834612762582685624445532039676427427491242334997854770209 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 -1947977203697818800548888002377129029795417315487050368377871453475559667976 1560749433139635538250882380707732848360116655918123126031885670516665323202 5123611244079830286610584162835919708021310678645304381072660951742749625238 2369094195 2369163030 1 2198783670289305620636059553218641353629215433344943196706001901788730987325 3885113162601926804138076852572219859943522394564511431112160322881134740881 1 2049970577632483078919639866935714950807510183063516085185542450752014038839 1884002242109740137455424792308142340320554775543180708430088369803874468385 0 1628141690350971339049103980396010033780652355778932262719581124265456303776 4280865652947079608004346177774077038972094899305631006375130989556014663818 0 3444108628719114777511812438336262510543718973342698122461589961115493172181 5656593394894677778353189203473963193023498569099075449062299092578355031595 0 4674448171892947647133447195868368385671300170680933127418138065830201957609 6938752625959157911179025797260752123685231946399280692672152881640136665573 1 4630587993847144470905081817329553241682094758624824250166475657496354807495 2323310950257680415172731491958448353451368838731730888824057153533242783763 1 2453381524978181840980553843868636454140029742757451543554913749626316570612 5095594744980337657008108575433968992216100966246626720304105929693513881423 1 674861370888077231397400092219803303139991880467917368551064485516504836904 4583133406178801127890967643012562779108995294433350801212149897530795917436 0 1359592978933100660381838362672183791982708399425721645410122071582556113735 2506902160178254674442833434709063158152224519517279001730113988859902235925 0 4428327308986871382612564822452178843846650685832915964713693171737841268776 1097720773451561401237724006183642600071351080305552548629958235942435308032 1 931916628317483672588030724839480730366472957960293164041523002900091395063 4782853063882727951792640863305635286238395633055109033645270363861793074965 1 816429346398055355844113716050805900572703438203698873225909292531242672892 5406721908095803136433618301275928800525280562113991211001878735823045295059 0 537372104467104356370927201155403729452279447895081886338621527456019550729 2553660032204632172592376543419529739945799470022130954058558430666216764396 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 1 1 0 -4194803407173050929680639129945425151489765347338503875830327739643288841207 4924363630467253631303764125467932847621340468842364119682851708642619959473 4959550743325471149892012358806670345927850997697781429113197133802435171605 14917049175 14917221901 0 5803919195054243723195836840827009696834890718172426583704254883624539317360 6656794345749591842882278043576572930069931072830795270669676432359197578670 1 3991306874503425108979784800358378769780245773626755621753277461877585886255 6081725284350277265375619058738681361079411920639808069723728996526526524255 1 3231361998190124831490791471876452013587380418616689095212509188809938740520 3507418060470830147052033116058931320412796142001511046597082362030177122883 0 2717226164225507585934836412782182349891208757366502808467945692454574214861 84799901387362933606636957563807961412090253946739279838810672514546444692 1 676446895410267664194921010119564232628416736673042831451664918531956323913 5040124858896524878011731278827834249929545804241720172267515436935815489154 1 3571832884159120212381714613123146547149621779239430620614336469311045298783 1524641697711139329746011451965353624509790088043597770744937914180364545012 0 6266451069569404024468018644615445216524889773807480608326776815771242458403 223342602664051969784250890658495217880148651575669380329597208405528111423 1 6075318603718894819637400266103254471492137828075158147806672045809983244141 3382963624734540493496399701472070816320012840167079460134406095312654768699 0 4605248575731157617117378823688632800708481904680245679919852539222782879630 4673739478423532734122772259542815535439835040390638792256246989448415164388 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 -7072393655744481225692915356683783459060985886746292602598556521822126887269 2483874046550890145057109674443111794564322057432984347761932684385534129831 1579416397363161962501809734043351026986024239901290838160714250932902094219 6171993856 6172104960 0 591904490643434949204055560467824649232874438901443948366620877399212484390 3558845776999801399072868596866716729660874011958923804367272842171752797790 0 2938919020804264028258247664762195516536202103943950973545145007678648014891 511201751247403584149754246778671300163663577320126666793313598225172553529 0 6641890930940976206339636371783676478462951988146169841193740303716326026410 7007094162745763951282596281875282350782010038535334468823721383516528361404 0 3083338316045127656207456375876285209584110974490737283933076228679209157841 6283464522637822617460646252876981839374150796479309239894511455006704109400 0 3789235587513712692932439110044190721694174800050988874725140323870945854030 4007180281295847935536032927336331458449446099825417505859179956625459241556 0 3023891722778246352264433929670708688553394910982558108063571386296394116078 1368039286502113361681871037693272773000794052096228554858194030251301819988 0 1094519833671079122107853176168761967921857962016019435632986669856726898870 3032639767253478245221507847701604354212049005508180450092262007820113364912 0 1883807808227960622544505253413779168620668050247833251808909403467344985168 2756286103590320852193952888781574440318584319463877282952508720866009977285 0 6352153777573950443312824031270793487412979469463195578056318328457004823327 5881429610561105765121081081119369894023926823675464439267519145815987892192 1 3114660823868070790040178624214267552057128245596137368003047008838858679199 6323402686526795992155666879374837112180688248015737092409711161827825798887 0 238832790677433003107571023094556285750803686940162488129549679169730048516 2023952078570061013283087806581250421699245522995436261514128563120031085742 0 4363874635593451988562759074909756991275518645475971781208192251458420266066 3630811629581125647155793592111209320529071053924093493187731932603780049360 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 1 -7184253405004703754574451552574899684076162565103112298786474422995812059496 891450977814823335049482352812571605626140859941330282162726801669365947421 3761160220805017136698380963022052083947238960840200988772346835793969432092 18585052410 18585245206 0 2156891670059837974119329387612287538980487238946563754786746783793353841969 722964833851832012296848688031943460298590532567815247472638046704598268268 0 2842915117135068707554178714640402498271835575603062731305467458949582929325 2020669420144150890036370977737914973999989692666848596634344594141039502107 1 3116769618162323545205770112991461674634056368004645624688290041646469021300 3799668594210301056232192448558354408842474239926168402649293735674067170792 1 2073133321974980909608758801773311178004601424553913638541944361517757671118 3411919772449501320352205687881713292734161739005818628331734688113344407471 1 4780162118466070843743342983031494383619141247395615957263543272771084725981 6262678555501720601651664061725792721921371282738142909000627150027348946674 0 1498090484915336171104884116378820783102901595798082527233382837041765232851 2889566169230097734300153024794380765009497261549145170155115692024898151055 0 6110085207151130980365295100596102847944706751216161493907961575750182038225 4355781729477653254531759603253656753485331641328717403374206791569695015704 0 3369507135374719314275907998743804216091118776633391457569452230776187874714 6254642102695510997715132100483894246106999847939314651491992025897903148786 1 3556470696071311389125395227477109011487332110752872564701119280215879297121 5115694335641620155265749319659985541727415963563781516811893973166517414550 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 -2353922765503256233259818906232183465619280397853510527059797870303352073710 2497708853342019240445622466092020241513370657249976023723463636676268548898 5861900119154992936651391776335345676944826475760657232793855810725253853736 18536692240 18536884785 1 2514819429373823936890020260390179382274705473881621126747704107609904537222 485241381922295683485005355197679410938218120169209630137874864064620017718 0 904024376495134458819120208889192471215661054678082984307800196442200557566 1207455320710488241977450140167454980230236296813320382833526063602109466735 0 4960550248019317131845557798363742472516929014993091019378873479914971002472 1258230465321458395956003894236572114366915238811511398883913901517205955798 0 3377512075267142487944549144600835733816612333045472024392461406977407707217 1876235605675310095424478034612808774110264676035522155814951303061656965835 0 4944050773674388880872276491943686469917538204161014629856817894747342459523 488137166054883807061625099676970062796602475142529668806768337194597931932 1 694892852878850019471471308111255268971254515431863765986706363177254326396 4995519833685175132270208982004256606211541671949493753459823017238993010962 0 2563783661083782072344021234449316696455460107373988400553103657296130505585 5708127484351303562666554256565153758262619009468073807484664503943772364663 0 3579917622816546482069419579501416753788640674790879061805097357880012569055 5530999236113438650497165916087099869465102161676830479842107211418600841428 0 96529843828559316003096390808339571280546092351914397067690496106338103730 3226060154035040558830736615963052956376744899930301784445800965542644677286 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 -5378123190510851388265535943746487212588176406478398962456013512046921398229 3839494038821843797472597827935049400363368376317828825505793083749381562667 5321769175539116326011695002359102361974192300838634081694375031926796759199 9871459795 9871600305 0 3631719728664855607418604866498542852045328720830932034149073631073837437481 844620726943544145080358211378992012960278060008445830015974151120997517821 1 4475324461399493559748772900066271772722244295992270191857619853508510134398 5126186491036650717044984484065316380014002752666468663070776715286230535516 1 805494353867472177531414479015272388998340396503652873782960116986153326472 1153607479595859295874619337152999068786958711481087539393801195280904079942 1 3029715366596272326228504258139550634081069811911026134116757533312017639256 1119113742296918997440269190752727498324203390045044490909632274144488370059 1 5416756650215200035266774505067861660667994141680326003375095335347479235245 5545618439062387617427851718923007371076744973138334996924854282203155863295 0 4087706107060010260962858888259891353070881986038501203702001135041480382017 541340748365970964842332607226097538246362976999242191814917653202356513986 1 5454419042726188071164631111695883303489696762647665013794893624704637526379 5287357904810577883401980996606752857079113323319944706206892627777959883247 1 6787340588324954566174074839946963991684699949652643501271715180406064336869 4682206839839850910034382109361425729938443133249327851173718558697917420977 0 4078187950516863149511574165478119341482155638887350112452696866848488259674 6022144858795225497425260649001409808726934290147739401524540271089151145888 0 5744805743392285167374103146737723378668969235270006356788781663207606751687 2944238790950231016950657540592301181138828491183053704398451779184365148927 1 7137286179359780087754949587270539711199985620641063612164704317619563975720 1949337346142463068380608208256791264829619082308859690140860352837183212754 0 561814237743400406542142311117148902319250382300880780368843615938841321869 2071272519431848710357747089318160795821958947302180642469064956719530915063 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 -932817422643771487121891139043056335220169524197135586240047344798214709127 4755301215187313054775115451559802849899669090929522495055898243390271737505 5095252305840255409037829769942940047274428711251311350171524180100450434673 14934845206 14935018035 1 2681106320864001997816203152399246323086158235199343163217052558932553057275 5339958450900184859323170786325274861833484570970785720342829292812871569541 0 5196857368014184955353761326915986135659329278381710662021280443156215425885 4768170216566467579816477324559537800874211731148171565136289162430896532578 1 1352414394485721133284239004211813001891290781772746938649891930726279578087 2598108833597414157489056190580071766644400425272444573124689758167646707090 1 3561316630546992133210734146492430097973805411921550854603613312539436183555 5133948284118245431894589849804663709461168116335070498249330502662080797617 1 2132466828800290797655203353328374509194831384915034462616292032615348331452 5447238903928296190687467233636629937332137210323855731488822766463630786693 0 7023298780046871159299240814383033087107917906204930843789787085532597644118 4059990388231173917510292827694938161905964839117698073878548024776633287482 0 5766020628818503235619306329587090825502763689446826703250772791917777248851 1881538633127657419721955013643022283163263108332181004103652201881265971329 0 3510416619494388930577079334320996136533076544846045067977046714442923444378 6769061921493968162340523446806729216682885564340828321928301076859573928835 1 5086631905817580030475308643809587630222467468745532269093028717522788058806 6287986407112420201055470878321817027415701267876743573552162206923281409860 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 -2085673608598939556427473018891853587002302013908979231117682873755234779956 2975191764011536043289411985928037289389659648367216167614942473025337709312 4962328364505898158687937524149730018591522851081827963801997287796177835751 13304475003 13304638126 1 3381781650657660426517606266400411495605604635974216365649819186243009320335 1238184289251207157539401338260991469149597832667084116525604774204079971632 1 4680275185522213437385643113386032040357524579772310285702959367554258027217 6747680225308801186820663076796175282676230348488628196252884812939185398946 0 1603324517437421027536687287650806864806982015329574038443393404118987819150 5559634892217668772685876595811036918611236310591689549266190925108166976861 0 6504403978370350670177027288463229276316012708459345152441442541632338516408 5167666647343551216868796963610636079981387007377945192831420197995500890625 1 157729978724255914639546208849080392861064937995143274193484216503299901223 4541092546663942694946987976221009139363556380809648787655379867545299221474 1 4901526446197630395986017806947712227136651160521127553215009417544394499027 570763913063608414290018067394308393322580903124248121927795465088044396977 0 345381861705892949212189482533525502181272822578946971523118981135249914170 4432229264287422473202638902862983791476051581490673919037321543945643152486 0 453622468996748084521107871571652473363428205605516207025366978165209401433 5196899333588776947889810894868261022087088401264719912640781839330771928773 1 3852044321776537399304691380600526192108826668008325501693051365578608566439 6834230982914423619411447789143147786616602768015213915610397403813769186863 0 7192761292420179302129579462205156909924714576978850592355619101400128850727 510733495867272632383278163124146978964317160213753708867355484243976936604 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 -6847126671662034576058564232163214542879117366803889824615966158765499935787 6341317222916346348593424451879207039567380193435914498975928001886294659959 2687149370660219099114956222164140812500194678224961996290125812671828042260 3388661650 3388743975 1 725006213919916276614015875401397909963824755885052367791192475520663253881 6559572727707258021463671073947594237051701279092552719883072937610553692188 0 4897176798874019681120031988237421388396187160888447910402165606066673252459 2210344882640715156253711221982899453155443957684512302265756557230347904261 1 5745465382790022373651759099102557636243415109276115449454823410257303510642 2332460391064345896967066623592356364478464154792672799158147635892410453388 0 3897804671231538582463216892500185786676994612438467083822518260071675038717 3387099518863278821866936968438473171237218693548726515245549482676414640756 1 3658670835342096334404056654219402491279145580252341776151305126958868955833 1215424971750937887195287115229681188543861607891858648099890002742283080849 0 2128486557057371426897783318226865584872690718107010303502460843960531193086 5783544912017060950205275895441467654134437055797877288432482003668961239831 0 2138982145990952401502878243930159279886614311506548961166369553970286240013 884035583460746225561595103914213537974668991418288838080642560145510901931 1 1104554201623660853370842103229261348081838397270263524474297236755914947121 6708527402114393164032110351361492096016848850490979413264175949782412376097 1 3914570103627056334294472268333809203031151946565209749951467670937087312547 520721429376746593930067171151099937246938358455216103089752904474376966428 0 2558148855220920067006845609458243732565247140466083833115446874069371747570 1805781388521075420230298832670331687202068273587444517710369741373121127035 0 5339599540966572208404735131460409459909016617139994042734307833367594922998 4918746698209415980365663909456157567576362410325477851762380013536270332275 0 6038409313188205470842370820311709824940400480178276867274580262473222759672 3844677783525627446231379560612454246446929379098714676834434294800995372176 0 6254660218184047799058844752312631541515721604599321052200410875955328119413 6668904853337501950893853431410192202277738315069756455363051220285845715069 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 -1953335196527100061590694228082954600820640604394119616571186644900170554164 2179285028987485713263048468671317173521291320529428414748786261568988533721 5060734637984164670903817211638605814683679781524931572379501518849955358167 14389967481 14390137128 1 882970231171546546532235197904475023003433610905340343616648907902874789871 6440400842497756303037495357894665666221916488161155194271531197665845189794 1 1437209369197126577461882696075692256147971920401722528367729252386368800019 4537261445468500431086553521860478438397979508907670212793682303037242521015 1 3167828672388708478560951884240837338829441414821904508064699277009469364821 7184281326263621444804481719763899091478739184959377169405013328496467429352 1 1360405611557135943710088962197237437092188691111630776479632883790651848340 4079116792332967405438515936601612460954796225851632352072342381051008961663 0 4386981474791048601770821757293033199924865761639650349958139432155190280085 3084414670016868494340673423142804256041897766949596745841476097060734637799 1 6025848852801220224900399380900533553656971409992359502255679093179363142810 3858712048393526351128287968051057953809983379740221498337691379936736881946 0 2308599794234779074021715781893425952929920926349934832512617587627627472493 5743063586771158934236937877888763028075559673773072119719065774768361042458 1 5302263145889217551756334268749996775056891302391182768193433338806120515751 1047349442332441437499287059070038410633306935433073758647542078269625616528 0 4686587676123955859635155376369780633517757154034127156518835582003079426305 1551177090832242547807505039312132469530975076441320767313614030089519560046 1 6500585269094957684704161854311946358228358968597450312335870952684390982620 1033313086620346643476614916777356148304923782721844335166213155637814104244 1 5940656311988660157109435944696900878621121569138637646120844700767637934081 1062430659203109350432626789134757081877724118924383120695243526019400070562 0 4146711549669107800420400725667138277685886026808096122496422698645696975173 1859597067610819320209456124366767882989255050838696794789402341679318293046 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 -5465496717067475967173985531128205134244742752475979662566986840449570082259 6871153869929936698055810907875984228910343606186853417703952896041405460739 6491809087910217138862279414141911008087828673207636884876754332330775870688 13024576503 13024737901 0 6048763770515650914840442046167712252422074351897012873076790441470177661953 3074848048354671695103249577555464665146422129256038563727141557914624020761 1 3719098891847424922383341183209803424508942757783130101686143685332951460154 741477217290069885289274231709755805162382071922698568221964184104058014040 1 6199853006026578261220478548395221085151961415164040277478633638540802092049 2168178505217287336427128593517526640250272061154269652222048296086781988003 0 7156303222923223429412287086869147803905012426022363363877696700406630359332 447631379948099532842700002506237797028592997670947740194167027615338254452 1 7072959331610564854938634136861738180426217520264845058614421309882656414803 6134542549314976035755347696149326986176206853586409374671937444127726199730 1 1381787518369382752023506918001335929992094405741236471563825756456263061861 4721424769980903960156975788370478505875793767150172392990766051910205462569 1 892691865520997199919714672885482339080658767321573326300458915547322548502 3553181850115377495795020729403684735284699345695801480601571177678859829109 0 589263050901298454981230196673811040098175128003297826681162550787816394309 7094559906859498618987564245938895406308825689735729543302085728042956846283 0 411373562121879096611411337269805140927451992377746461183476101577112876450 3007934315402179518601110350081582777752173448800224800482556413369860116239 1 3483223632234656011941594085496423002478555124901501516829842444993893601134 5005268568172935341720856150423338938769724579272343734235251078032840453684 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 0 -6627249300954642176833472629815175155370908901213953138935225341498168781627 277082950929548687388838006410149432028041252603169240758950270456357585144 1368810756220558132286461294965036921798041682037520922961817686043613456917 19560343155 19560540945 0 4638805841909679261955339097267216533343158272750304880604812383826513593286 6437443397119027781206297993972709465479333871377979464784349469221795348585 1 5869937260801708768599887896667088741495774959213567860427853958209606683063 5365748923804532374129392920394619976594852925113620056563302914221858246128 1 231214025253743791537475396592043923938286044430367203997463378234410661 7113719849999480249924558605702925969873957854311305727865099746643417625077 1 4613834207781173299286930285372979814595180272166383400699234913458123166704 900155069578846552526911854788548170094948814733505941264958671178249107355 1 1329646430975278175892871929806112947321775166913230411235578823907114909022 6501405736075051077697201615349166227537618716290317972484909371828372463950 0 5683029799857900157367045291950286325783630455156830070571561941338440597759 1820400335060171835534447043542151089103523626481749808030691426856083122456 0 7129719484513092989665219006806985622492181142404070201652226224031156317327 7128872378700144291794104588631592228222284185417167817406178348014967026662 1 887654114811466258253756269281247735882935800687230465594500669928133113187 3206798102730569918140076292943992344823609452535918850387895358135940797685 0 6175643519283092235494917497010312848979427441469395840207586910379360695597 1073047280919676853570596382665414619794508523280007612293269095191690192389 0 3263357142581932916681542629176101033397555219429250039503432750975932467040 5592207029660183081685813224902088465170117491427678443881425092998332896598 1 4253011638262720864230830152432576534084943460126541901499139599100510590368 1146857979276675086792626062165035579639717702662139747044312345445575373132 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 -5630036021974419709961798326687347872087530433162844981983411397376111843772 222426229262058059763442120345231782840381177809745187203485764281889164681 6296899523251266274132639641177962729667630893316491049842453018195367021833 11150695116 11150844453 1 7022535192182503664441822367177159657394050459332853476954138386065475815505 3392579813590192733707037791182004970903723240897778619083791471627661940034 0 4954853188700978687378345360288638088023206747799329416422349341810121559472 918519551978368446210040750470485963691690271380116896755230363130573659975 0 4021078447408420114459679145453427693660443101948805059443291316028472866353 6810701528530217183310153387878596034686339808154566060293380375775496435806 1 872525802971662537225523628765315344139460696685573833008243268796543653942 2795030627354274875914138564655791228130089361931188083257796820083529707082 1 3521030728257422101772083879934079506082180469777017450998203737816864822676 648010102392880663170929661680924140859395296481613174773637516487048451980 0 63100180711782297187326853548147857284884482573397542166854523600182423724 5216095853729514720462738312115996099028896056767273964683899586487294034312 1 7005562266003148878410448101582787433384154940097794525798526261443298580403 5955772142546444083277103028711513328813319395065774668546523203404116264943 0 3220093632631944734611100632087424665351194549160966023714741563579184635221 3355082133273027308392635174328200928687590961263028315466312640102660922566 1 5397508340347800627094915317754854122381124093348355725569907258057416694820 4031073525603713290353139596129458612861382079975079200633625463148097986478 1 309326930395172299376312213645427487888301331676319493272417892144822030550 5699550326697245405215314693788709893561290777149707417365209966941074698513 1 760574354165914697019929212944973759981490294477375834649749428548232751231 1019919171966887781941268059692136971948020054216336434990468891788398597677 0 1759277341950091234763010138876873447220611226677543304993482159971276593253 5142211569424160080694845847506554059332738466735059394651191659234064092014 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 -6106816295233075222392282050354465235186852253985953053949072402130071403907 5050943230216848412409236969121153740231153881939034134513509672925471805844 5721054377333004969289600496920171492331286789551893073344441834060277456486 10669902321 10670048403 0 3837889013220833732204914145050517201084453245623434776862110267264357322569 1160759636756896254328981486373587463956118125189175143756770433910765238310 1 6485350235961966163138866132172471410033087655027391809384441003328594641377 4614356638632307912688921093407008750242570572507758793291784796909832742512 0 6906836868005202649855255783769562181133729857016254084402931276240226636578 2835035804678827777566991575147848565291900435797949233708615472699726149225 0 6383021787142512264420613028273945748122707259714994777125715142489744149706 91717128728046597944416836891609311055756892683458440362817919994010105115 0 5711423576254441928193136138638419499625457073440568291748696658694379075943 3467912256480696262741285791617202919301179441995984914093892582990942642435 1 3684929331558422010927631502291436584825348154606051985863732783578567776310 2463865925961560599541759507467704000773519869308929751339646184688584309676 0 6921371048737090552044588222752090745898915095767147408900053002883684823584 84890545437023165442321493980913089734429554120590467774206837831926697671 1 265225641536303050988015482209328476013663930071686228004728920837411428280 3916385368547607179483137784358904019709021324342770885553087866601755921521 0 4127600798524560086408009290914665062166696900946396984939751961680367403333 498885157005572016093522221573695933792848206642887286663961981980277825288 1 4959757622923834006671189937082653611571392750507809962191419246095658178473 5790418348720339503981434979196303883881672525350699193183643115309404442954 0 4508894244391507107302268221895076860482451236397766875311087124353481401169 999626441817684424751792408388180847616038548912567819802796830089384147142 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 0 0 -502670315820777236808449893096003573890774553462613891741120794206545951084 5879308081474849798391968663003426550736279683344717826741425089481125713495 3290316016505787644955868283378578593203159470892957067598276774189033335905 2870432796 2870508565 1 177573808174947287217796826953386017677394279800190013085645715200156151085 1456215936563101767883568974092356054528037879739902359739424581961025926176 0 5586849622213180333592064060733715670835399046698178228654532516794535015472 4038165558096691370858941664401192412513204666839775720243994768080048906781 0 2613911196293119248339783259248988334442753672779296860929743666759622834225 1479753924784638209560347809633808316794812074002198203182139077819089951425 1 561620612764478513612077183360288177634624693255645831248924134815754812313 4057009338721338158863657694858919877565782662628730782474590046959419999267 1 3448647809389367407681058874058145225264610401318005731190567531044897046655 6213945589697235076952683009809324280639785379142513504692501829432425510720 1 4387105672354851589558482949153926867640836190089792786564865370222844438725 3093684947317361231114183571999569239766780715724529351489005737037219560562 1 380322077449961315453038459481713969062862762097878677083453555923448985552 2073447396003219759294522439386841909876501644996814424218482879740148726050 1 4072253116195839921187834082097898656154940159892372629816004751216602307346 2685351633355228353876931665978123758741540190329208232516264229393756681663 1 3138987664724936687243308535771566329102896758528616945665205729707634091759 1814810034293247869164982312632827262178308237170524580394056416223258201981 1 4701734545532617127636121361680924850353621586507713538499418762023069094153 5782259323572705182928198319919630414234219987145344846220990317249781041319 1 2968860389733944831773249499698196504786806249914805365255813598704563847207 2552115978066125180264627370027863114601240197023619450810139748666875352664 0 4487893186982846350820551012067497147059709308401521305616429825841605419044 6884719690353877034313254566733678255436921171944863471919089210264827088286 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 -5284934803096817478223006483217376885209868382973119895311699590386648991307 6016666209710926832607447965114278509972857337030697254095855598132515233260 3933731367045898857357035826666101138546666210273869843857966912273298925550 12230871003 12231027406 1 6827042852901888251338319645798648821178876170833656131761808229364460663608 3253581246164975585167802998893834300677213921054679727886875569474200561179 1 2816158528298499505720167487775707293403397237486100624258842387515853432049 378640638233577274626504347878540958020268737112210390230146952817437039143 0 2327498563808180254386611336139153618159217145383466237213100397077190884425 1847138837706536290409257615581416289277539740992860754393680129056927353517 0 195592914203718195358246189335565343854682853158622136591395253918240051371 6609816441459816761375792020831890330794246489418142970996056419039292961958 1 3763447920750935148110742378759610878988432229532867539278263115873174468492 878752762752943092431143579404099875438395109641607247224087843077142323005 1 1756589210551039444175957714652327339485656665589929126782957147678626371017 3149883093164911626747665846893617769664090790095748015302614535883525322821 1 2118748863995700801176950249253560710410279346598401935583972009122014358320 3529475679238351400405163309080450965504926656595546545072350783449581182952 1 3075445031765663503610467375510309260334065776306486017518572167068959330029 1027385799591963873212483609479354510840705935608620631138657117742560832617 0 6663502989012821119686632759475429537991292169592195239696161510232484749536 7005611617796442312060728466492589573727950348281736821663924590570053724166 1 1791593437210413888302159312681092240711976751584950939709822084204819968049 4133276445956962881269852475619182445796676631134861062115460081827941851820 0 6385765049570481770280180596963212466358781458092982633425901491786135929496 3963826805369936793811078052879029273180391709610479648872613587395558844493 0 3917407373839973853413832003110267497311991458621682680809036883072942833599 5939849838149456921960511576782422136571383643806594958147611326704656184527 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 -3676140574722511194591381604227532385757246506510278723849737497508316821643 4702809850075249334920646987460565299488020063641544686369246287753499404762 2296631080361270695531297018699292763484911585855902342572479911401613827109 407165916 407194453 1 4737503386556455540384951457816463032481429925805642965216632623963061058984 6122516975938277920942574152657729077187613067583108380914544146910028269520 0 2160462366316085684295896704243438055861001785693594083904457100360740349325 761832471346548484005477810239281402049207673108143998927018057318687574668 0 6508234210297008596401309967880713682926151630542757749919260155538069941903 4374596432366023798525360058862541247053493498365263300179722173975678237730 1 6717795857580481615571992388769368422172097350448932602529194069329597784702 984249672111934723326134787137737640872296384839943592587072146981144150324 1 5120183362351182093617293387405772170335073505996017530347370638440369280361 6744755516718635587698989665523897655565273365128186233791016425660755949030 1 5047572578919289346050958438646491822419748705939784130475207607984485225079 6051519224858322561339087773124633983245014878120132191734038061522691188778 1 1210213991484923178421286554584197079718830379135631114364969535564537104506 144256376796531904952666891135335747497865115050945575128017273469427816976 0 2034345890344607663677579382798992295717316122252873041870267209471730042999 3834970137028909806614662467534084213415321857982385955202233259287191924524 1 636951637873849696921320140455178108274637083170111986424487320890933406843 5824812971819335328080758930111995486810634998156164578702557163069106189124 1 5905410357453021236227723093278715958587057192657097461318383558989091483787 3154653358159321140153362856782623915871523685181125911730887143011984013745 1 1767516150050582839934391188016536298350561435376685187304172264266225539792 266803854531999786501069338148223327803764306468067875219260981178125952845 1 4017346141751600056781847005643057887209873161834708667879891487891458467632 2094345314010260765142557090536971673909351434981225576223513586745740989910 0 2613582075701165178844779093677067392261462578099999584095116366445439755776 4275407254578839960140537220454570705317638673656360384436912686841575986118 1 4869069339520244160255267464899981178086433581985431456084561898243096759861 6919529246520157605633302100274329894017836872986478700881051106665028426833 1 5964598802241963262221473266535551736452515892223232788134946931769005513760 2612385415749691871090718866042302826504706268037968605556265253011766696009 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 -850402627992378400700165847996653727832338950152484868541361041033412421367 4857609054290375220557316331938977787982690026199597862514438436485858148342 6896814227926091932727466114204594966527572610731172305930951079960472741431 8312826270 8312955211 1 3194115085817421106488469094419129868312872667769341232759371309539295370672 4594231845117929574416027518733416299297814244643225592383002001821676115632 0 2100116433476767395773816469236589603492412673850761696361051113255592645084 5014390518911047146129608117115473179103471033529116836334500681539909441666 1 1843598658810160061028800486244820838584361253805606219253647737270840316387 2870393982940401695890792269595044909216884220982614931930782303649293007505 1 2598232749358721334848156211978269181747542169649619173561038395057958483245 5164034339003984768022778076566926960640987226602530368714350184227576958863 0 257424116447420878868090909543261769669327221514626649380357707282152742748 6196358957393890998842139179684729478144855859933889430739716588886508641231 1 6026055481741881678730226387005160890568534108290696876472057368378037318365 1578263225472857420770468299421626698861245312065348062135888134769172223638 0 84359911150785426777267477256913965277644587813345467030591767503987547650 7039364354083144446972412116843855786185219931260595992972150187062780963935 1 6375953801800609550845646342454083400392742027146803706897757964459369607880 2963890766704108006613800208278902135640312454263915601266873941070010868313 1 5147995631615421762621731699296365409292687702290284445104969319734765300989 5212337509789419560215714786579064706788300299335155736637717234437764570700 1 6229300900050809554298303246385809808950234144898292777327069800637487241480 1735606544363403683272403399052540272474102714475315386539592590385841045359 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 -6951283031621984701378019834205736275199342032699637775800681911118170221993 6569382058884191827443634222861808519854029234923451773932266270116410860870 6897957893366318510335621549690920826766299030794253766242883323791495155848 18932147578 18932342166 0 3513831394850217009846643738082602675892359564638643487115596000621652607263 2856251314569748703365493644315163476181293504036245249224634130448094891221 0 5342287472922315940871940966297052671288631229735830132316622133634343569906 3739944301493170859161825446209069418009416483172329237033412129520394408694 1 6631642499754393939964165771068372625930195728804993782367552335498650271027 6843531469382251815616579104708502375129364190362367916870623841067937426690 1 994714964947345648465324484173340200041846846019403570048290881375809024842 4288442717852954809418274319328251528141843220625778324593220736679234679902 1 3756530337833600220303589685725998217235266924998055138501901027699015653174 5882380047847336597236051420252275092079177985949271379349721938786887623619 0 381888625075195312255256877376341788873599249126920705383346352601465768297 1740000112065509035733970874001654957549959764237433025478501697733581321074 0 2819344966949065074811476069059796868662638789860238393387717441687031603845 1909358190550330336808286929783468069138856668078918596183014338101514384667 0 245691515584800033740177576012109444873773322074180533662338700924293579671 4359791741759583488042119855440290839737760739990204024803362659638957995167 0 63025726426774686916221437872784239922441524244503568656984398582964734040 3442413660956174364961478113826196454434472965241975219867884432587057433071 0 2154755162332867789720357709362299548484554314933252394801833103040796320803 2734372578413934639870138314834388094724844599652587279171844379005360393656 0 373720453056473612012913262451465719058928144377183818491980339558845467181 3734025575151759021834516712522766859984455849664600707855435541905528373343 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 -671758442535415466125620236339780615067542056262097885310479568936067071298 780587597921052463906272500709930420850619093993047025647204433271553133397 3309365766662608245543220014189227531678779103797721250508517366897713065699 11269133128 11269283256 0 3170133780797688266529946571768607275019024783010252320552846765396847565221 2689290148931284892314078370444703073104156583827585059422750013958769640057 0 4561147968040666288414465209559263068196186934814748711921430292002736854026 2956638656010064439898515002620191621811806525871674371510503935716953943661 0 7027262323248055638851528548358425732874796256247288736545061146128623284794 5628713335158314728634141268754565058190357644808838403720588662597582877552 0 5390800099583770795274131828872535985396152315964897917210249741284346351975 7029569491801605357940288628270094142285299301459779511450047643967630918824 1 1216098448304912012051161935921482073980869528623554694968958148647138282992 180800843638464724797937273871834956034276002284729328525411217062984456582 1 1449136552151789905162736032562967524740211315887218103234809977310938538715 7101333680959457807703242279268901407913674447388577915500097882094009925280 1 459235058087307065443065297578809137922096111621695885639229071074044448738 6086077097545101810977696999316100915327759900322535805589116961615721530472 0 6607260867367552550133417025133573955534762434773399267242181691423646354912 6333028430040333312283134909838280185479885885098996171972220750976157273872 0 4051810752609723780249137130125503071063084256819094227450140366285387868683 1321117784357659069423802406769201829776629849277983832309786896261468800682 1 2862376251202458135549942176199114160664357628509785724014787088617072778056 4200737261423707336195761597338445575244762679204863962255121719573589870908 0 6288139297822844196482679126798833125486237302505322276535445770992967405888 6428101457033687188562992629450738912875061786612361407480279367691301035290 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 -6889518632913995598570384531037824934468142313354756468778915558133240527083 1983769773644921532092825683345067680854905618186104642635113922014920476582 1651403631722502696585835322290284306544363528840812391933253207158830050756 12221644996 12221801340 0 2005274631669452501238649335134836694961812461992068755017596200349089090860 1704634652963041356587929872910914301067718202381933472230003491092366668245 0 3584756605153477180585666799468912272135426179837417661429207948971722778805 2870410678703521080114886138234383339531747839493723191622332491693503743015 0 3306245712699929177701216630171714125514175494613213727729610889834779468195 3082057515963500567438539037529783863625739619818379679573892284209841580648 1 2566680023464911364382570792730032510362781020661429562546991320162081730041 6163007802240546788945680912717261622251130319319540083704628026507704854434 1 6980232298037433982179329376017788336084952419860726936219144638674364040550 4928519451605851240827040973110045390593381410704017881691710694145609079325 1 2948930387954571851637673360459312975999815579790690063002795594842586827226 5474417769976359541980285772736460392238843650331970312980820507130922410527 0 6824875662037442563810022482238171638958920875890206356224441993572611034148 6963865690610084808579118784933462382816180231767708541253604780930215579983 1 3075445031765663503610467375510309260334065776306486017518572167068959330029 1027385799591963873212483609479354510840705935608620631138657117742560832617 0 6663502989012821119686632759475429537991292169592195239696161510232484749536 7005611617796442312060728466492589573727950348281736821663924590570053724166 1 1791593437210413888302159312681092240711976751584950939709822084204819968049 4133276445956962881269852475619182445796676631134861062115460081827941851820 0 6385765049570481770280180596963212466358781458092982633425901491786135929496 3963826805369936793811078052879029273180391709610479648872613587395558844493 0 3917407373839973853413832003110267497311991458621682680809036883072942833599 5939849838149456921960511576782422136571383643806594958147611326704656184527 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 -846061721734992121307396346499402266004090786642480826120232671305216048404 4804439536379392871256568794034717777866290016149958730555797087566165269808 1325217885816329810770645351034006841999726598718470932609127683760684834856 13811967910 13812134115 1 7180682402093264062353412656672904669613431361509897049943551560747184618177 2117807448950077489628522816739457277707905746772332657588762423578620749752 0 5546559895982922129363123490973042808658282972345993999248016168673366904749 4100558122844233955324888129677421622349991100007349643915904013824797163571 1 1490242313818349885640889211225373814240299672574584545603246372212453069648 4370306690650593304122205489866951321117801203067861970455542187627927549462 1 5500381342339785735865975214453419047741990144661202771269231935255433256496 5216515522117231317203811148601087859165845303924484502377491006603115570488 1 1427573954949580116775245600691455220916302176946345814717222553766760778470 6601599860652908265558016674193129500284395284012436021563298530446194842379 1 3621379798724991299496217483232927353123547271094596645498304337867302779001 1413532769364136946750191924745550813368411994893367892314169796301637693835 0 6141083993269691882571768374649551955675529505332083629436109440091634803610 2400568624388103747603273624531593969331633548094877634185841665299007058914 0 3947143514188049516112143201054039709273885892128061569430960272951085936881 2428345258888214812528373550437070009473602105878224363974476054532756931211 1 3512089088351286016062460665765458342127040310564961963682447397203516417094 3339081552661346772324291617975462125624900005467782476330972844525463633544 0 727653682683973364036697181872030828983337723238147374496378981592911559551 2792205311811827306595186869562396687612526197332528333630003635738053024440 0 4019262639544317997277926354910478191804122122212392917048297084058742506641 4765483140688636870117274953724638676646930788043277645647430909199732143614 1 5938232201967491247638616546715155166566625733512424076841629684437384320514 5694422345189995789905960415844327373497012147821263043890862395233726464851 0 363696729989039724101471405674845211120094790380932977487332671287344829523 2630419048351296609434751892703656844892216977058431289200366088972077954615 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 -3919721806661566322879799193265352685717503027651420645064831235478469802866 4474588587300250697514410896182110020457316609158377365358584170193393811327 6634708500805003953314113330890862893417149142653568139247029010620598706208 16046913378 16047092526 0 3174456822557939072039434378258493196124698903856929681686593100801859728690 2982343908006179242873671858839697431644680470666791782226585340466044069588 0 5342978981462154619647260071948391135177766735509716158046194941941680028127 4766544906533393324076439237633731264800389544747201512842911974968296663173 1 5496707909188176009076517126298569808032049190387728297709279270314036162007 4580910139120288647570177338471756621940702041026419900344752968043648277182 1 3342884619763741834622832744174367270883741559356029812752250650125788619714 6779697720988452589150314058856160330767750741856716555612322184227664474295 0 1770774541702311829033362588623419500483464621224396078568231689341917095476 1244037912250801363912000263525859783152245199192046163184958568849671076621 0 1982198979397515661204402077158796523568859818654837576899175285156446216358 113129363502082134973284278736278692795498162604971515436090488128610302123 1 3931675737864896354345739368053742618691695058905212027668971059540105949298 5929227763535222937105492641501111181058167078015518063749549820626023169140 1 5491029446661306080146549843379601437314965472316571192292287311977388796436 98938018589040802555086423525310230702626163361179120560574057984150541629 1 5097652488396062190790876451348159733408719867388286796662590210005701559501 4033553406875459086491634879199649204683665001937295983660771361715168708154 1 5623944426946884329175591147584116194813417748977877551069736022176638922778 423777179278032922712997793116102448967507356170918585908267240595244700018 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 -5526439614130125592231970727846723423281660606067716314895758076758589415632 6179690403557325600312680664840151057519712846196720511429902603791178951141 6603604319438814285009773324558187806927572882179190991058103462446842022280 18615333628 18615526581 1 4338593165206033400767139853254296992975740698262169015866591651616015200780 900514322351652305723002237457125795449779369579963026397508967469731557931 0 4810245550109398935528810894323896288474521157518560646421821258115615364788 2860197054835248728646532115585822522751710847319091930975721846315267871120 0 4142475922363437710450671723004573083140041223382796130895379696491926907661 6669019335415795277251037199404592231126640858414847575302362018117535200371 1 6887229208926997251166008894734939266335018864772083451867777033465677973397 2910947440890008843622694281142353100788168236389945872488874340116024134943 1 2040714025551280250395898063057181026910144128420978600948746042177818122935 2007383331118236165648502411885608615004768429541023644485725233003715044188 1 381832326350751461180600044903260556688654136488058281768868845936843641323 1588265215529585134685078084381215762041820478986140522868393082306302411319 0 1464659426494698971033080244871699655103557602871354701075378009613199059307 12158681361022092944235510164607747297955656787709166483429432224322007999 1 933204476966210635423883805475847827622656325128881426906232970792439351468 5122553213631689263691668028682199155309396425922226885242270119054920732282 1 3556470696071311389125395227477109011487332110752872564701119280215879297121 5115694335641620155265749319659985541727415963563781516811893973166517414550 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 -3831535129872780506746303402980261668192470064414323679764590967140732928464 3257220755764218285329585955877078327350235951136418360784756806118725429181 5780925114075641472406301764240814996392840294628992760761405773352038867228 16693207840 16693390560 0 7014250669293886808175130844611306752391081479036774720931801175759233995491 3950907447789569872705183158323270273827027385302195260610141911612487942832 0 3489020288422276673443990060371716006124899601750400778545624324601302719144 2656682311261266011666770530995710475746693027361685119737906029061858325660 0 4517044263953480439532943581068696434931827310472707554706428924907757392065 3104025792155969353130252023222063737460953655087231321151371526359962332453 0 4326126633950165036430684678376256234020892726288657179751347388736108141378 5804140564630840924575686765306768333056398758494845409442256761555752460093 0 3975005715708572784577968078636063388003312540390722985819120817513721843056 3544813912272809874965174759005541747144234165225564617468988100800114501054 0 6213135264176019064964373641918547165223556108520569902719841682092828731891 602269805124879854431326331177495595726192140714717345805859573459459913916 1 3308861053124749276107231205732590970671753355583020148957599312492985262447 2909276214146981337870016672358403794407795958222195454208210360427671751774 1 2190280077894235338872416443055515906313784978256347192024707737778103257256 5007446644832314593138591154044381070342934503953141033996764692372420038888 1 248911236111575313831872460540719707903000264821755930033961506588332843682 2593807082014821606861509269004426840733628576938989305333445091474355330360 0 487829157738579950758092187229576375589748107058116973935494302512904337800 395395859885582122004854005002726076099597169766244339920654890338945580301 0 6643564045058391878483626903215548783933098411517459415210774934025515522097 3477385808399555355837788270974813686357357994375375433968698208738745724256 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 -4967474851003500754978805396622295857372234894117059489766777149045845944405 1639032820903575397389695536481059220880130450023923871208633068779734073458 6823882599558205673906070562982948375989738927884182950116051422351316808537 610419270 610454211 1 1395281163698141497567159465579453571001675318949479953321894519123434791550 4700571137263014887533975861318524095618350649451363799819833364348951330380 0 2878698181785387008903189493223324090269219958868807678961165851379897686041 4182335054232152089490983156692942929280696484391269512489494899591921985684 1 4363208857960518373692352645362876584048649026622647500674629013348989235528 2340468753737179930868178046556918270347844704121745307862515149355073771473 1 3715627303758985396529329006340183268299863620639435915618968689165026173206 2346825162430528760370822779679020145825064103207375569516622276843004383293 1 6063164965143345345130942276418343883485285567671367195115277124078565656152 6254323516397839008574510791090137999291653071810469482884830803222576863138 1 5015426214914561119434266054273238572481499746882221421075302048319696548482 2811813883918002203307365202352401478420310465654390843402146395947502058911 1 6401713712527066794844482255769794608862260007018562528254985960076821383147 4962873785788169703561049915837293973311633095699685770546024082874819781935 0 1093208240325236129461536694441220273407838290925946235225814133819211539413 1145553423309744672658894164217842783488884747966295154279298604350437558193 0 6625418681861744639455351754859774823926439166599712749997231644954496192580 4156527472036525662941747113395165503353087661229792755187043396026077720612 0 4761250131409637549022574418495320100782199164411180442532205433506498174348 5195022995263422950249881388797569905698748344271115481727411248719567690429 0 6093461999368288964486095453781034168237479266697069512232428594824411226374 6736361699342133464489883788165638054624184735711157066887478711824802732246 1 2769003824840967031017386432256106983163038476066337584605756118075863172951 399086453853513799549540577738392223426029473087774259782776516312993260220 0 4403163168874145292365049234735536965607377600969851715560809285004111564758 1422965324558787331898669789474085061106063146910721294332747553042619751255 0 4073581508767488842240973097615097844012564888019022424596994459539521427923 1379106626301444027278101436290204624862653675570837637159430865555825229013 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 -3789269626095580955620779535641613683141718557472950181388866895627332096111 4425148625375493666709998811733640044288114498340923041160130705533413595478 5458579733074516377735934848102724499408979619649690878340578762623596290349 5605234260 5605340140 0 431322743671289188735570191565087546025745391716671610554257543571795645686 3672765360052023613690516845243295649971275391747610204336240231064013062670 0 108086088879467840646636167062912845100979434658914048014905789755559762659 6382297776083049191880140304246339126911715626068625850088850388212627485589 0 4114217280831904441276581607429389529980936108922239755857919279998087208895 2017545784435753092156572646945330088513469313610824019717994500450223071703 1 1084351751387473434680860318848652270386763967242052328251424119338343056869 1290203058377509962500164170170142566000519363228302501438493654524623504493 1 2646662098387070592472365945195238483540274993119359185092600976500257483690 3297290807559761495656950719982645636298267209883893259452399118002484905907 0 478042490521125004475855258783036414496492030782468372499336075546755664704 4398573179250380426450130746231667813993809480954828677551577306526793111478 0 4674392664588826825861014163786825915912177077732432167071243255431933061970 5706499118609106573382925683118879984875468846874958858978674968074497753031 1 4882447712581581216777384054850760462496166054078548866215348697511324771903 4740475621767325111744144758455704392019717728079083931672679111684213476963 1 2477921368375187475067470212713145149156299226620068497786877384018875355697 3911486998800995113481751524519305002149532296205604214201483282162386048088 0 4354520212208149925671574210753382944239572117625612241237267536800149462049 5957891549129230248652913105950736138194919384079928923690345111631077841639 1 5147480769874345929056523387802917881072149233929233312375210608023172946029 4788214227489423431024848936776456640722711767612476105165455382099912751282 1 6121193616475637679797181908523431253331325989604613896782777983225307964167 3957240881494882974015662500807541693056435208239527577217855205175551523803 1 6253958567384896992247930099952888560372081799364766578845063495782599498927 2997934192278761596191355377522685705254246295271291961740142256451075777361 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 -1592912507820199135179527646517686012880589518258173108917040830089173127347 5695824328911309385710132076579892635131250079430574136039770709361528867757 2608222576733929892604461784581291490333396359383332394277855258972813068247 11652461470 11652614130 0 7025520804200856125695610453087826515484217847946675576646601051996672527675 2180199956681909446721186383405581533095678593355253323875859616179487151971 0 295381617424536417730097534782464815271867956774381371495571438752482734334 1079103859296010409210384704654345748042490985068030354898828990301831359529 1 3869194404462311954885047517769702257580926011552240038299148329452068341707 3423517703230005930840371606463866328682443271176617321842151375964661624264 0 6708081537709047386550950267933931644818207620305062820945127098088111541501 261654377663099574973372605680426587696635152648440796953556608579152014548 1 5510979037282590415173185047132585273864326258610218021184838584823644577643 2634825871699580669707602125628764018138129446973134132484827547053924844081 0 4201613171642925744072083778803926653773271251495358711648499758811251850849 3959086120253785810672646414007219896098023896390391623381232534979192244546 1 5119024333221991155656849949969311288297574235001342903332064681339562073789 4238289671794872614692232205605251832319042522921422673084072949388547090536 0 3337937702284927669124325067206361335396354538723977365301471121724228863678 3272886593841524353269472915676052547759612434974052552224012162795808316546 0 6397870488002275072921064638961411220705301740080727001213706284516281422361 2329744709013959705413936445075775741887279622349357996022374560605757526754 0 1577166358187823793488114662589451096155019048841483656640085965940672877224 137022853725803721348939721628472381408339509070972567565508785130720140418 1 1083639081042490927665163590214786255667416726731189373705639239048994826694 4081066720751432902335471528772320675376576783947436595018810973427300256880 0 1396442217183954557838889159506186538650343154583789092461839170558229491837 4781962828986317806776532074758947524119811976130977036673406408383791636079 1 6305321104429254115180202893886991358890524221980844740462586986036083382297 4740173989599199443966106285580870214678765488296985411344428121063784464341 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 -1529257312919117791745808983153570268377535264646219987400954200110485445348 5262568426063564002287818706679378755049048839718346249764112585925868716812 7146001634543312459196174261827821136239747281533636313668818331853959689720 8467494045 8467624180 1 2369619887059483620531650093927576779712312590212008849721796097957988294216 6049476873653184665505661431893136244543149797500004556093981281084683835658 1 5711471109209828009208573937148681238531661454814878706303852492568708093397 7188137803748561143023925535555020261669758652545954464181285397112245143272 1 4511407451037939948571703996502082261982833625917460237286467787732244136726 104757716741095952667853628137171157365370121901358181673350208179800193134 0 4360513331213779040268095110803878233280182574583281610378170616074476253789 700817929999929800419813067561328114046138393499722113275316528219097518892 1 2894289007931472972826321956097437997985145564487913313480556247662029783500 1212995631895165640118184105145928013042061882630539327960562605345128131301 0 1675780401130457832852505743205269382802025319656812397582426507734571891247 5182526061717601413588283804046031566364662684047912736173788654737670823129 1 6717973586683036992876815665835140825205284962942464062905758805176755334343 5790698551232456785025288218001827004423146845967786442866563353678989178383 0 7179535696719383012310328742787823671171555088108347574529002713679339982517 6469474746527196862665789824499586488042182626155337058606734267128542948314 0 723557558175532245173790630617356941827670351847956261170682061328447490813 3963728619416359473337667688751386434118119535574574444557975745932781372519 0 6859425482344258272305351139212641898081686594464677468238918101680111977536 2767168876512680118401915296297335606857003326486272087250795509540976414836 1 3715846102645130333420723219409904425436065819803542190499036724728235950642 105896051079522120082217188498530453003913852842205382613663908349673258491 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 -425461851327086927189449818518321074145321786698234023154061415219125635443 2390966668887043564889344221563191062269442753171490904418167143115196654206 3975262190125861905977613747108485775067733886324603471912216727554232067678 217100703 217121541 0 4582811589603099157385492451524418482120131798368567783033882098407726756294 231520160485472549843215423874754342332826125640251456542776940738309348767 1 1840698384962901105399072476592595819157043471492007305681681721153920660693 3698531135472072002048819660612118789023384314811092729068181212848772353775 1 5474106082722194305080186200249644774495956074409443084063277146191757544037 4216279076995853080033789243225362316153330066061381723424396077848621752416 0 5320253048074645852047268835677184428549005059847953427514407862596312158279 6329549994073280857526648998078971681099342887656624918299265404146439980849 0 2500050986076985573617978692360165781065600617752914973737633785855154988841 5248040542042872585610379201062966185616975921879133587853793720524729200420 1 3194663270013216124837950736780898203512013405410476693355532399544256215228 4366056644745795815458244509870316335325102015145220100230943162427828198597 1 4759708454229478720231389417145928225445702556413874982887051787139548747079 1155394963273966745229240029632464411335577079036904812166640784508874795041 0 4651056596302363727117642525472214353295275627122625754793344706444238911436 1905232209423345678125009999370126864030279394787227453515937790148140084214 1 3028186603895444004058110996023119106566843428560325434407188275355134123408 2252463855248935262316410061380092637315490055021511952231361650450992630312 0 3089296454547329103859487108044087446079374366588514107865471129727782630601 4201944227036043057658031614704566438742600284920078814246283782718435311089 0 7203223374582176386230784272477560568049201541670548595381050780145969397748 5119978985759180080829626680034130474781838985802131093832857254270323596023 0 484435229923648665400646760387899523112819241077841979809184081438220641289 5142227019423611226354155212120093747348293202992652990686570168623037040494 1 3177393954894854184990951628167933648097160193754029927312368994314623034317 930394372222018453734739224316693345519433913446570011940574114958982063761 0 1855766294186847771740257772951576919537011746844466520306430800082541613060 443174091223883654741639651476250545774718557445762380847765268975024364576 1 5964598802241963262221473266535551736452515892223232788134946931769005513760 2612385415749691871090718866042302826504706268037968605556265253011766696009 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 -2192676887183997095980578829675795137489756908343642410366679370444722290430 722853889091851675844279770208192906919988558129878302001241907210466476239 601849660204605842274085601720780351753136132295834869048128897660208136052 3797256231 3797343378 1 1526429271670926455460983160657215326239874362165609233942946306471791160263 6445666669932241229651089609727164262341266267928335456767283306008050515677 1 1487964358194278520824198764342258167818608128507540210949048400444049760418 5803308745356602901456130014219711415274878235217184812514283569137573869657 0 5771734953062070952684429078286917155575408850837497814904177266503741947581 479801243796800495864065029631082360376499069506632037877522983632417019684 1 5356146590211777561786569263052000285338021510855507648262134190835230862346 2171665248939135116665177735585828617404291961360486975821851692688421889845 0 2883367219130719458241237013928106307068397279765970870569198694578509034548 5975641977176166771808785836542650298255283351574413219708152679667487060752 1 2244882257892993638951870722893796630902675566761029101495820528664260569141 7156479058550554002758413873881343141017964315003320829254042696441683165429 1 3807701706018214285677285358649770943368423271234346757380195067965806636764 4024013666229685594698400339495922519196396702713869158745414682770572913645 0 5447787087545555365743380333829410381816483730575326428010272288501412038769 4982892450696047894215491346827590144812174502805681054257211214008577957878 0 5506253883356428437070620165005597525880804298798663247394829779263662302380 2956945874185899420368948724224224362342722755313210200251408447045386518577 0 4631338581108106059440823879507851315197117185968077507268414397025881209956 3035048467523783899630639411301152175592843475079262952061860946621630313347 1 2688788640813514074729228120398971581330267239257529126120529608672498662596 84531665278350202805875435597171355867124856975234326528942750210100085271 0 4303282446218706518828599857471996926824950562688557180143588747315714889523 2574080585760863692232652064130459736494368108692541193185808673769014362544 1 163640069797425613178011720592509129691551258434111466205497872043906326105 3115600098334398370817251574903370372248321068970469017442560378076288064858 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 -812926262535205297963622474976527741340303545155840869626587974937460445737 481233219592583032088360301178715067708271293029297613897752496048673498647 6801745827595972327293743880136010453842244629837546970239601155878984843518 17499743821 17499930903 0 4463422900134208275219321181505248904845169842955732700884539575253230086164 402576067286932922714048100711996777923735710796936215261629801584994107172 1 3499573446710830907764477348809855869332146739759210393900277778464543446557 5316241142025041917950306429166395175637786634667564089291249698690797104030 0 4358672829030130421012798778066600210612078845717407879358577896242465830238 3131860159762373515280733796961558358474114038893354957369569685369704120725 1 4379743263934687706031718903525745127444864390571150056038448006957080943531 2723073277304619110804151581214083092486442682176831449944649700731193082518 0 2484539762536633273111833224925735344280457916762618279791025889792843462651 3076659269520607347988059444784629406815938527394350253058650191502612425730 0 4546593917439218486766940886298262323630609997043710874216634806656983338839 3593820735959227235788473588914393189126252093518370592091266677482208209419 1 758131760077663592577908683898515520586693811597510061927945241210063119916 2758381040534293875718214961434323471130259156278564798137089331319149462133 1 6056651423188070401480787643111262724459987671652133172373122223069535490545 2806626375671556367981465483032000555210797611794251499308650400071646398821 0 3043958473111111621452457899795355502050556852617773711778594612675728549341 471684476051166492742798392218144157574104789694551809546264123549883537808 1 2409950843971019738678164717177829785769271449958154045902769816782789303134 1986337115638284659214093816310560658593756035076979852609747715059503661228 0 5033655698686119975540137755124017573866237331952220014156104548549401747611 5148998839326938679401310722879419675923522784112838855018404225279359991100 1 2740286081182261945218207432888813761788750625266596663213955697618590814084 2436343533840502743892411422196862265815010361190561182811091257799947812925 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 -4792874627863072319027047821988165271473584850722808593790960107022216585775 626116217076390282852584953376646176550706897426668248838906099393065995444 1954076263685043152175465482869397858320254481257461274291864710346624058442 17145538431 17145723610 1 2052966063231879583222439315537478408349934139372427320598097989476944202995 4665777738888417162345445759997134753323951389891911621086911188731618323977 1 6285805065195188383097750641118125028674690372567876267682449260694255440945 58699912480696770136969975288196068810874839827159182803438103326477152654 0 7164994759517329295186147458136080980421376129056295840716788929240258153083 2299344083488668778141666637464853383226999794507486693412988341019531836634 1 328742716827728494822012654129396825972795984109492009586715176488583387733 2378258814328727532076708529716905958036752477905630176600116809768205441160 1 5030819958945243690683579661859247408509332618936433515185276111604247884341 1110022012550512595735210503752210316590294842938381109655777473316124322984 0 1828924746298209994287609186932761980222109922173239321139979735146330756061 854061197388987955901791290954955959312094864811178086904755816831942854552 1 1686099306331914158421260429452542377099104531334414100984258801892611912838 3944658507835483976351343129717580701405531114665221822574510925551404918414 0 4205386834092475001483285806653670052807316944855901776927741063679366104845 2419527338407929401260741151526834761880283788723969842492132885865987185238 1 5772126644107254571376336749519207697716309782076476768403086944923714765620 3477553432973593173949404880666358257734253111078218527886335718778813485435 1 1425346128300568485126482949714146807425078908000095686010074441866636069318 4457080438598153281621900066216906581075123589119980010341569614787838138979 0 6689738105435081523787696274289877979050497952434140978978742763007867337952 4949904108027129624947161570788126844993378416592965720732642570205508813824 0 5560231319085748359065826677239299538382586759554704347812125214655086371153 177865380135004783040460998011499714074058548334027453924899064909699457502 1 3320345098770737809128019429636889838844225796566630976990931474134642569099 6012617205697676357309291840319335186107410182025105796571224201482233215374 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 -2724577703548244796617477667525309276371844157911482618707565957131691832010 2187037791627594610074605142107330729759421324142029268144878304729814854627 4231543455414783830207812241222768550312047468120480359822029641819995140069 11171462550 11171612026 0 525499117670462823392160090362205879818989417294897433475860155859064692455 6402512331553133789427241284755706806200176182363581532933271889914049624358 0 196922866956592385412451247864366958729928466356282206583295443659197726607 275135123150768872824175299508522809925857351438358024502666841182753535245 1 1074765195664687311116031722402640316830524371847696201678569879267990167850 1829038101543985422639119303428761831386067746190722129495107589262242599791 0 3839680149151141475956048618211966958069916550144337514431664177659317802626 5813199913493983704795064069278536621000755522377292921370109907877931663572 0 1820112065608510939105942285461596631833313406139638311078149137904898107182 1440143362339675834135977951342019425188821020798543009418485008052194275902 1 4531028000724064878267400603517424077003322360275767450282995851925121501353 574119008323027960305506078314233068683894569476344899024887201702283567838 1 1521386776670671457279295533968151377375140581404240431507437492789487285106 5772917850947720303539133011952907715394225840728742044642172531569846722968 1 2331870384928901884888436084753674048583467054094367092344694759580350231458 273433253261772371021241719467493113885451341645672516344593498291766797896 1 5397508340347800627094915317754854122381124093348355725569907258057416694820 4031073525603713290353139596129458612861382079975079200633625463148097986478 1 309326930395172299376312213645427487888301331676319493272417892144822030550 5699550326697245405215314693788709893561290777149707417365209966941074698513 1 760574354165914697019929212944973759981490294477375834649749428548232751231 1019919171966887781941268059692136971948020054216336434990468891788398597677 0 1759277341950091234763010138876873447220611226677543304993482159971276593253 5142211569424160080694845847506554059332738466735059394651191659234064092014 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 -4710363675867008977837352218448328562915549225213607118242822725115483384310 2711049535907688658175201982530491669526941099185708678990481883598641916077 38621391364014412094310865678126561835854654421527939942249011652795884733 15831232830 15831410770 0 7075005487370449088086308656592764902124979113846486660172653650858749673609 2679097069598975121337156895567678964572020696600804805158052262839770226290 0 405695562213835989371471452919254023263853336428947744108584947054324225923 803090528669471676752998363251999451395229551209696413573420181405029582577 1 3708698829802208088335041289971957013969982702591538810079653498459926338059 4260148726442633517595220856015658283694570946914920458713864388344973189872 0 1520066897245798517078377742172886371712062195033615759893453011675696045102 3007131927662496195029760890334413017969933119417734319303650299641187271708 1 4420125855272036508369919960314474242454789476824752499419326038755172143964 1002050965043617437565518309210222063972259608777643425018168050397771954231 0 6870270956645428503789069305518038986034490102960353551933698994723514558087 3392522065862966831913995725612184147273522255208896349747581510338502264723 0 3727148451346541504102158843564817968166663392309392310478616449002519760006 3350002383725200980552862390502518706729731574475268608874748876945488088575 0 1888619794800828120864551851311694510254834776265627340190082485184455722486 6558311443131794731785149948934003571122826057302402999011277572305349953009 1 140170633326795984366834291214080634305065110473567420005719121807142577384 1874830598180601873275699583348966928070815458104990088263350965612602636374 1 6032861835104814291764561213348026948839695834513285042705972190506691324906 4226643519125274544430089678607088137671567763933389442825816163267650349360 1 6505137865549212258724930735113180051914217038958288504419281055597582683715 838277864920760422237377806519091571486729097147004613343393975135452766550 0 4193356029790868430474934347338083466745554601344433669530866249804531739167 5712381951623240314459823259852882707421816755425537865452382538833337652352 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 -7011051679896712887951590175558385788440591871470187543767924803123084119228 7097351763096397908784846042164737728969584487399497466131290417310552506516 4600325736365004638640442466819906590320927789310786539675556477405703340739 10010629756 10010771253 1 5624650068286522349650106670629811809734693398331044632501690019786004171982 4282855933660946522211992737700662551703670297170695288580960272329583895969 0 5607659306302162162741542323263807926945350323010385735852254512181223718771 6060566219406613855135998911845117827515618088613774626844505209893503077666 0 1246474899296953698225270734217901985895914138430632342630742084399275808642 3947594701522820375732440912566899947000185427395549553861832339664242347737 1 4292190122574841650960315624321412240482948709046714235419572957327397009605 364397510444682361819885200469174848152749642182342086480963765119275317715 1 3509447106959900485445731597470265286380677306000105137396453636198964346263 5746843122418197420477754814340163595813965081771039238742919515688586522366 1 2157842891671466697760776402497220223522696908428031532255679016325663696145 7030489865210005199188600888736877937912362704704006808846502966624570637840 0 2912734781800083763521465291033423282229173391568881517350266132035322781905 7050463505438575288357388585542072761231973412394480216087284839038835629396 1 5498837809944815851121570929091123743674650661105928799863017944257719665486 4620245765873558500574777936653261239646502456551369731637985975878818222008 0 2195275873735098839588605933957637946839583623809829791258311726480177711326 2267145738403547479715957470079523300660540302997300753136342570435677284269 0 6856587625790569197143084719221200772736007662296241994294354178265978767930 5715288024640911805165551705738006507720819520984786816258086968630291361626 0 182470551327361884910170494545884453921113433831787466574770900407610931296 2740835501314600670286186517824821680780109828968337565224168579753381454956 1 4120488143092829846248167395039563980310127782773428421117056740490630217427 3320697570657975296134172091862762359997279902800673094072342690677726489140 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 -6830242172144931199854352895241075145540818594089770902710326533049400240740 2509477989937032381052156263596862049580599198339409758469786161768831933506 1930394110574633572428761046841941941405252642873448970826904313088918103300 1941486141 1941548455 0 1537013338795592909787501366782394455109720404116908940047104894138977477642 5454059549457983600895976665983210299766840423129606722227762825635040235559 1 5425783148738304484228075750202099752445622540423103986247759808295445468289 2006189792105048151652908514236865973969234310338467258402368246987001541298 0 2467247470220820994892701863064928880982493237144827542334939452541903173938 481641300482257084550476359347018220568966846189356258902331866671054205001 1 6138511003744987572943505263484727123464928129435304278944376986212264573584 3017905883489253466523486886016682572698501160736006069638325582126258827913 0 3402711822749921273189882113249185950817569884653403435684661335990309340244 3201939301714365023575962356231731096528879858681633669556627618577199349933 1 3532015478026804833508747556141376999061155229114723689155993466258792981646 7164655033854213229060372803564611425310725390531274758543982418693144617648 1 7221900858438294642033413501175773700887875030748626220363544259470766567047 4702242412657607016456682069653868145043779249343835888267988398882119246894 0 4104963507127627114697415479704368852755045422465752474499425345320108477493 5993634367967641959451028199989863252847815088263502273894636145663831061582 1 4456619064947288660693540530743488838873161820432069961950242289368857601524 3071748079044176437768882002102905018039826087557031544896323500680648500711 1 6360792660359952407575372679788501694338988074524531219808229767760320497675 6730241175603565522985809272538863008567297968762410552197761108336583731988 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 -603246497747149406342510495600980737824350537267314336626172749892429029296 4003742671418251940392230502704216825701811311329281067788617766890824016990 86399943825546097073905508852456507246982825755708652254199168115466879036 16271809401 16271989800 1 6237555070621316912982105366068162695712043536154097690647828871903517122054 4846586808198178804599994074196079170489981591541163195821518642471022725136 1 3719428581440538658754734837366123357285638611194912138700091769267610004870 2049897949021819427592075259175229531977439707432551777284554370982218949537 1 4260790010180379784065972679601524008586524708656479133512470657961005840573 2754864027509232991205298447018954507057846607481581736484933712156168400519 1 5848419776998150643985765837791973439989913656246077913397598464933773087875 1812378820143502780103497898216661150725272141387304734268107746092397553987 0 6904961401416683940374335915472376604972571076702535778598131576528563037777 6718002670127648327902800132802536772807460125906720174917636287774386877182 1 1065129648093795878311409956938552740769394049794873723950560224581621482537 5054502590272894250878530622779550505095955927278149632217948473527136677782 0 203752735759893390241068890796774780001293945076317117081242263550249312446 7179548532153488618490081818287471709850727693261563253753190394756896602657 1 5000227603637665373418367201878498423982847582952169368590411373207638726483 4033739280305777998115321954606815896366960574926536201818359641455814307554 0 3537129493293635906588339856420045219049607456391703801029607068109701242032 6326318030667390534399329152907140137268264631754003329977162480659861012238 0 5474560746595721312319897308229420709966645395908082417245148328571694718532 6577415122614534427367649168546961968099027213906818605740155174051410264600 0 633893982765948474054754824540720214176495802469704281533084393550110966253 549188364948144502341223943933721309619909122272178360657282176409000160897 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 -4812803295771271105555410240890953968805640812639034929058685100939773568910 2506500512640756724547011311202974490420979544689005980480393122395043593094 3795978645383801232647393245164334386719508769667002444447418650396084373132 18245561851 18245752878 1 6129899513209377702676278104738340064638908595072379785009661441741191513586 5445875117689381604643879436096000992001801753215928083442346560261199376981 1 6547525731276868545927881874356114235580580166951406116229375802252652314569 4366420000222428086497560954922823795329499878152278295264453292142582240178 0 3692679772886970971755042243455025371658060393062281881618333987277422236920 2122016927617361214911493137613249382927774372431786522305520591953992853355 0 3907895023735247194735633629521511780736605345953967851409949737840009999593 862041929411106371328926655889219266688765275804880212096401941209062203518 1 3057589129210888960773865365152483692023779330292538404075964823737016653992 4005400862844309377498472162777203651834595751505062226390075192405524682126 1 3453970976707937738396267615857424378156310065362784887947417365926173024063 6995015016659957027378921100014082286756001404992853656205139984544897249882 0 6397999565376762138570782889097451038554028123669853728837901269093119994778 6978607429384588808711507849045133388338393097005203115152623972105349819264 0 5626024032076464041510018096322909146680767140682263068911588859545681157425 3429047756491323292278983545763516572868943717610719357140932134297447843018 0 499243068832278794604010222541393433810191488416940057084690831022353762088 3112848180245797040386837521491699507876535683175131096038852998552189533281 1 6436549111639238575087256994925038710080482644701061357371756878673765247816 4604106425523816760826808788660232720543786980620276238578303458368383187054 0 3842520623194960678645132311482324762196657918303405730596063696051067280166 5240093882508821633546671715957649179914375988411896450118104066706048146343 1 5370059975383356337657953506195486116590801669004462188384319633826615123038 3601787677204411524194356035196171378973584312891456035693278172947545740645 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 -1465515154776316306057806194271284642740583793319444368929783182358652181895 3349770746357008437760011946625595931507337047153849938820714125603252398784 995109487937557501301604993752891752322802034362140326444376867195795978121 8255032786 8255161278 0 4778989786971759408422546080537777407250164316479718402826208579613102663726 4762678742479300792211526773806264625002621817788400731729932485416901953661 0 3385756625913550417949460790917495096091777417871441205123747776214019914960 3243993537322601230407746755265852450391049856929556094167183253729558436787 1 6336321798081293667841191334575479120356098798144194422100126748972507304386 6474858681352286123301177646864515356067813735531679373371497680389962710112 1 5652765275926842962931419120954715768220869663064648565406896625834022286684 388090106891943000956443912313458783908210388306246097313316483085674271841 0 3675982551532240689594525383738521809733895918103339922434060877685656007515 4501373865882866349769164046898689806253686988795302016693821375718982473571 1 403281761227526595584611936537582800438086611149754411523103689098927782737 4877969073100077313749146876556733616872406518449256006243766512715870342438 1 5154404690155590739288262958681397681551410426377634828855040327217887925435 5385666151288804258592257184142050573783183645825862783013466550058647287121 1 4600617119364816061502797110272930336307347195562221354916841341286935729268 6913681623597119210530394208276737251243216653022475042547402875189388138934 1 2594451135000218082874196217700803028528953245588967428715552621652605920764 313807170075553037441779207199569242770314031195471102411344489229653423624 0 7165571529483368224349255122436775113936047056193451621249037527755274149208 6823179708487107300636152475519599892976475704877867649060753079149946578240 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 -2069090177485105614743646687077269603374929908542970610456389935200359698198 863652868412338283958773469517444481487315784028603361679107020065003928921 3646024553399260467882376388879760051970304145995195074923120571616362888985 17777719641 17777908203 0 2308357365196930420113068532236884671786431339526285884653431188104026365498 6064215329778869971561874498002735849434761593048863136093380883980669480353 1 3309777403057750060346572384325360350511472643997453968722331893795538498072 4089500527865212542460311977448119517740122718301454539333427845559141834914 0 3183393658547268106449487411895546203995892515967175896832762217463095283621 2352073922742138715664145790137736780947843353617875642384713022148983629987 0 2461787220782903956794310528901007441506790848714326862011166806728041883076 4401036665314511326198787676084248105538279894518935855215336850949463575740 1 4341937306705181705814468535273326228584100142528385568022379434650325046481 3737580731768308016294871249658529488461876727919709536063664745060448036763 0 3175249430052558913751833333852086282968470945157691712665859178743492833536 1740257084296920198456128883418234271212003156885059692598608542735383307227 0 2339383382075704630891579882580184490861731602171160881130918573507074016434 1394509741457814606378107320257997866873469036044535532904534673813911416143 1 1175847988085787442911813554999018739479284514839249498038400690477848530419 2876066992055755548458769645765657665853275033742045599146332967226223946466 0 6262652598635456847615545236389928856482644188427944534799710809459998998280 1991473292595467769698860649548338978244431047286805777612686865315994766511 0 388032159808648892061954846427079802608944948532555104181280700206423456496 7109485686515847044777793150932678664692742914004038076926569832429229947864 0 258387264382910157364099718112789853313095135717938562591391674646039679685 1416465280190638277440403465149753513480385007081738127507278581226108748031 0 4954118771740069233454180021476303045945454933874228549215641901157120813807 1218159010811368834065923421831385722366744274385747812130026718286965530524 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 -3390585337909479575911401997319842208512125089474535441832985698323965184736 4595948339989348406482571710960032941353067668232781906031262563660551363675 6678965664121033780634460142004098569494194434868711105926878341479592235776 2878090515 2878166385 0 4788622977181373902264394022498717518684565887212256143630153619720044240959 1917664469373227845204505848680016262327315591508543831690916141465290694391 1 4980609117825401209378235211241189212064851598503489714630410635627662136201 1509185623253205847367741323076532555514537922040190116706258155242855487625 1 5707248836272134520782278515418749917135120524324013605539585395858680554312 5395801266748547088881025557102650454043313885462358589149325920449688895442 1 5519127353098078203473489974893484293927245044701349668021729282259147489977 4551165685700538786242947083582586632593726245291927717441852481716049968251 1 2407959086650198358623787970188503798575131651834728702667068116597112948422 3216688503014958683493611050016531965937006712692714112060692081713456628012 0 3877752554093182795992255161397716492870227521406356587473219362911711244003 6501156334978213048378452724121101957708579445156231616989501228718886458374 1 6114234803261453315222965350251499525266089696672376899870576424943029495944 5107409016864218620181586151656835020838614097488580006429180747729910904733 0 5275736724072479441269198998183884927433864217130856049967059062009378262286 1014987897908223704318457592365181785149638798457555805449008957091044108592 0 545349073615116825070071815299239324025450617590922661232028093055488944379 5811278199565708005466886824651209854595220183013004220250595980927236201286 0 1864760019213764273369645050316744335633205960198138967501734080221856560133 954119848428133061068356164596292544257661703187772497872563915727989949077 0 3438131511756887113304362835531823055818014128037600094068858000352407282787 6942546227104968918998275572513586076314079026559043007101160604536324990266 1 636337017767903855521004994847573827015111012817337782774242594198209162816 887321707190165518761724205170388431391094422979710052592902565626708472233 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 -695993993662423580491274921792993569171785107332044043585439422837595265721 771613261204736571360354759244868866045805719646765568488227055558703509471 1695121091118849789275514866292147571273979467106454565791786379191561246966 3155317080 3155396520 0 1221181269164684339596584803537624510892872189726057422637024477366757546810 1568912678655865845875274806615579549477380328429405230941923490039722884865 0 6280378114284684914001938961109434781226236347346247388386175746228966162460 4626880637533258571908885394764024132649344623639806905727784130483489898134 0 1214140674848929170299712277207498704487550370126181760095532518421857180220 5616861687963485131901921543292851759579995472309885104268336058821383542784 0 6232821983815911536403720495990754403593723744022647867691052842083958454026 5432788642566558227770149294772121938262393827354444599926050878006884398688 1 4541416436397950867625280863553802140728529921319701773844851681884326884606 3419892515818877189276317503299111621731611446586901755667757759026462216119 0 6274191036228202852730741825402015862353395605674128678743539479235453073042 3037448536033907254324896314214879524326230998548644357667082562917935767700 1 3194383150203497392660651162686124476648093184180844954135227815922699372417 3501491383217463938368991840975113375488060534217365096322313548452279217600 0 508351764673835869268691319317278240091471112845111999881867568472823762437 1947149575303882205243622263285895465069274938710671951107613192999302584944 0 1774528364455830332059527819206664681910418024684339676531590814214230268073 6450782901639212272527760625248591307368528822824637192803507477614047798490 1 2163568338833528541020277483895905787876644334305933180063834876185516760446 582622120077859492320736263527647282926802487452333786190866650320930162417 1 3444055840668914641665542102139044217370422957274003664585817165109400619192 357289915784881958164616997378986024844087902921059778702598823718652121949 0 6178963790485291848484261753008527497417695452028629836382205517107813165535 2958113862062575030413585133220922540485982955264740187429450152932855445929 1 2054270892742447876736699223788912751691767605609378488840379414771350138564 2835393241416923108598374712393405131819552940731742450349474447498762024361 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 -3503841141004563060015731130411473605788917286797121508944709908457273037198 6010388518366150341134065578599187776026466258025716467519453099433304020249 5061439081344969591727160991153014467623419485253082352322130236004680961428 19437511528 19437708696 0 3861220408004546706421961472301630435019059379263048946752609942878418874494 5612732932943591250104189947348092890757388776057097192081334983029034778791 0 4562053807596683690166632356145196595327390202746181134647824963914674645694 2172650902062625982004785096047918621494791736276303864425636370655269192682 0 324548273296484299729172662409050506893992975589649841936608439707605592383 913993550713301329144594802061880799980194252412590873734960308340527489172 0 87596432218415293897018767266836894668257186459045241667456576848909447169 6544778630254947151111374517359804487525295314340634704335617114127009245082 1 509619381033126715104999447725558677355103676651098016121122626269729933742 4383531094517249691554688734305912821005244434587939692252318745239843738119 1 2461185960637066386918347275935408314143669983210064659230085774286575292297 2512512388578776077656447869980590514876984779151896584853303462006781811108 0 4947121705562676726984060557122177706729094597568910736665589336268388095134 1391326933105055290142084293241997589053948856911769226773089705167053883240 0 6952044717053511821175887810018040867984068132133883624736158980780203035392 409483537668400697140827468802413545613896729236381230262539799295698024619 0 5642731075834856030954913054001785631583838498186520864459250453420844481271 2936846503638197505280433189173167569850565014983754192454410969537710793391 1 3351161308917712748676873668562290362158783398721485781869581577550706380873 6854914877825831364592410411235052600596897856197220568451337003446722762509 0 5372166020782619486546870817607249352545108557166605349412432096463215567092 1719660978613684693719625499968436195940950763687678134837977068788906423135 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 -6124040996357943787093337609142381735828343018083921282723721789740650572269 2976330653145960167532993198905221186290931735953736908705805993892272490635 2175433748585758514670666185375691465715621101036235055174993907536470635842 19153257060 19153452781 1 6970798963651234873969506206412651829878926948962300251257199765248294406285 605343473285215599326920615608234570353437278464547129727190308766594223249 0 6554677724837470448985458419338310802300940931711564761573548785917049396877 2873048750008731527294293845513373831413435209858973797592261530276785405474 0 754521393557160858567988920252108536729297704010393102287907531395951197134 6774789563399092353794991319736104155936305165111157195609306985198561744762 1 2847375163155878463132258084355859572352443947241672303577840466572426595125 1342585345857665225595121668196728673740014647588376918135304730569048373998 0 2518368348226358362072628449987122487933880086410864364201587006388491587406 4999297269362994808004572209642510861474925678283175102759304587263009374674 0 2467799208055358266665961981132140051480675003637221441754239122002918377377 1569129602809103578402522827200400763167031519173525331789966682698213676234 0 637071517216935992133007868357882812466575591893490244585123610513821057210 4334632465920247902218189327904009807105081357228143525007782938864558482555 1 707717196980616500945218311639359059162096180426946204994174164832868490993 6470100444799969326135465661670982321175936606134258468419813142014952282635 0 4570808776873354819687119696952070549202342172924725419856430106103623626367 2858698065669087547733608120033089268693494585735708990315987701961404389579 0 442848481041990105174911344799948550570870571785599227301851253298725770075 3635500992665435668856366170329174552612963842351977386749903170630962296570 1 2804634903645675484725915857782612000174507797105244734135573666066463699962 1048425412734301715638488010646250428721446056814530272591110867534211884533 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 0 0 -6275474494873654932782605240612619500755134634968205924286735138006526023756 6050062846354471446216209149767284702757735619495108518643144860983204974937 2730887468742025920527738889782027990684948698065759845168195774643482126180 4351931865 4352025160 1 2905986798629499047848156145529411447509198734318152665737974490719135242282 1459171061640910091393874466155588094405077713852280974092772148696067961594 1 4189622893006804895136939336720553390401663035846380065412942640684904941611 5664226365678590741185436789078814421308148892791682494775998445953580079078 1 3377363457769573541904891431488335862743337645814909958461877758128661970489 3454945033580846228569939238536758280756508640954166678601717790145562318480 1 2289198388600673851021909149629614943875805067983988996926984678534896897752 1563148361271293699484587541572997597500049019307031361622307947374997521348 0 6403317493305107071936289517843747404316075545148615697101239239264456707505 430635771710943759205787133054397547768055487133167230019970777735199985613 1 6993485709403282850551487482814470502566030146653734856032915857830050867156 2318099745495260581656791250262923259511704428950308515656353756939395720971 1 4263949929892185082618340873104297883295317542627546183462464586184886995823 2680319360630542452088146982521952486367274217947209046519443279380242412657 0 6598516094264506760752900432993441141835494798737573658791403433755976517905 3207415831887872959074676584006822309572071009644479167901040500303232206345 0 397678969103312119310985422858103240626717648297182242204574260763341777087 5058235502645229059577043412689835376337210620334640735410091797084470563684 0 356922130772943269484445597448930901572570603458200964684260736540101840698 873944674860394007801750948105158645143688456476378311147762053245747138280 1 4880516303850916356055420149053992092923505163635625570616537551808600603978 7173211681046260446955187370541183555975960987993891441920872549005108309125 1 1549337061202344263805668947808893912963247024426928861819402999423151292900 6851554255415253244395381294104955813522239523939837807425305078554932090267 0 246848846927257060596821434665218835332295763904111594271401788884109241681 6917423617096940902755917577082785011643411351216872803204018177392881001885 1 5090748703440058322533835386773067184446085706853048507371361765724182261898 6439320730109434853942508615259018952321623190328681292899324119434553793009 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 -3672773117803022792772491025596620738591688570349167513526026126602782584542 6450080040293823047876556453216875909551617137442484182022810643085616933923 886447465477499874629973025605485332339002692778681543733712997884424589877 1919427861 1919489820 1 3695736826039953381187998543270083432093049795159576309226611114653271831051 902149945500040991235136445027689856000175231660808805420486541098118895385 1 5448822131397269302861492767696322322599813778049672002156591720129414415385 3564793848393324904400097789779695752069216438356694597204171989451338124780 1 6670202231968453974531663582744137241402929555637833247851806648981254802760 4607613363166299120946660897961972584630481989961064196929611705850201129698 0 307913938441139684405837429971921014949255947096987346782586230162194530386 2697129957418965880593815946274127307450565053323835385245353040514765989131 0 1173242937478654573245287163678791865274412707507100612554596266258014871564 4137445761574148913709525107746501072555971181046870464492225818088550439736 0 3407605872954680442369959770213626380655524771043583215803359564627707226156 2026921164491878322346299626020128297187554551841931051772003169643099279526 0 4323997578399098641725213547890167723747519206147995167110834702348090996774 2568643127484263093949498501990681144592191968248092611123235864760983374691 0 464073266882087429609467029371567121567846268781447105220986228406947903490 6356280106576580584719885668201438663413560332327373758234484932513415331008 0 6059497410248767636887175673295835610021962186124551824058839340626533163488 4735387884073948548969320984370775942199940159190669785238999442953966536434 1 6360792660359952407575372679788501694338988074524531219808229767760320497675 6730241175603565522985809272538863008567297968762410552197761108336583731988 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 -2122703869089359476632304402854896856281308856051334510879627084107789513193 1992431241330859347314974550895889153978174937352252189821193919396151276302 415949519180371059719774384899926668647373236690050156453659984685697621147 2257684806 2257752003 1 2540351046890061150783257280006989610123392678256338040630377395914803205254 4197297606681368685261926250738916087259897622031262267908062976483594325787 0 5036935522304494653823525911150128061097779908010162622634138048372445706913 1098965500121073476722633405349296922563258835296011420127917269704203549132 1 4234424672139284549617518128112800980062346574845001761050704643910592023143 5558940248481187916986479314111126104743583486655652760287346461685519091340 1 6279833196786804926766600004780124489789876255016507367569257255589114058740 3461516366610621268004236507276590807803177128494265105575524281606983286283 1 6624253319627159026843962294507106643692473806319202104388847206322706091628 7143299584204954769212031694689976002030980242539318619867958665310092224629 1 2251759439372435298354571600995250951605891613622991413240794133386029401974 3128363584386031123176918626642251381460988370937181540436512168408004220941 1 644767727568777006451389756102638723706732945112197637736234445062028297337 6281939525214472949505638220681111649367582366374632000525097779346720831114 0 3757665576666111747553384851743821134394753704724993320568082613116189963569 6844303934689701029348499112042747378874447909096172018753037354661114636795 0 6515842168961525785726970227555878349156462950815757219243202092479503405926 2279191120152056874515391964678124155168246815975520440259677123569450056937 1 2077246600456951733421579562123797762569884175626267348129123005363203065964 1047631235749172740569891207163416993899433233002635519737700589652155040045 1 4647943554231033896732973402057866344092541594664008185557115945844332944871 6208279033895090801867605836469000571028141383297299023388317104853409919747 0 1263487976924582745650530055539007704817321985834544259802735646675171503834 2478983756586800477896085335177274874903916731571528577378465939112067040350 0 537372104467104356370927201155403729452279447895081886338621527456019550729 2553660032204632172592376543419529739945799470022130954058558430666216764396 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 -5199392404280279250750614444271912869988458329284513509216656570773097218128 403696766793894056165699588453684306640917301468183266617072739843029237607 6445608715566410489261990788422695686127634746340443367280745026576307008516 10850633641 10850780955 0 589153869748938930214329422408494531473391942559797676593065770638974204745 2128322651161350930269441921294592207397998827430383116948511145096293134514 1 2467053906817427797104256417659250754261299322104707065932846561877741529734 6793888828234793888277788458060368742771674333679427423059602169821555597490 0 5970760208329664939871319449974623550522835343303093796843407857779718439709 2594388973945650775167385135182570256923667236575439113007227966819296010426 0 1402662330255452257477724630645117674287469966350833290957525672336756856226 7012024923729909098801963523706935440422669331478685031514491215608180327740 1 6414272443569517122720890454019682075127939274053009845496640815991278159674 1009919515781081280744325871227894216167191742065338008124334981170869225482 1 4180054466602761454883988558559171860162837172452838526170732759384645462740 5620148249442620845283135358605389130604551781824099587195292905093672251984 1 5280016579111748832345828524280977011905864467219973018216935201751977122353 3009631737032458616994926959668006700309314548936942823109164111320984283658 0 3813499874023334908445829579762073936287507854036106360021542004641630804541 5345552389637243401257307123652671355118824445044514891109473086871634194769 1 3902825007188796778658183080657926248204186319563655892465553527843157999572 4779735573110020373329980775813575136396987181523984951355105754296580643768 1 3317886153594774951748904270048753517833244936315814799299367914424560133479 5941308968268163776969309828057838373349929642650310968768607487823441099708 1 4836510169821396285881859285453020657408360400380042114742068308393516400268 2890916201886136596887205143064417296593818930481230602825479012791554336640 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 -2380603931824152697226695494085084562668596566592542353616602110067148446779 5019050264978997891184800259366355644993088771348231784350762659689080439799 611306304875788094194063565155379963703141290845528140467872101656293577427 18579268995 18579461761 0 812963196537839559250355687556289378636855678230095519026597787243381472191 4194055958715963427708857713185098381626997385319818604768544419976145599016 1 1984931053343826309091187087330809104664655032760913810348996622313573773705 6978550157956285839649569230269292071344140259460562645345826076037710214166 1 2287454295854273241097123095492802811495895777331977045948913197217885041287 58663817228108332022233580959411182392636246441115563728413070043517514658 1 473495471721799289663939600406667642895124381112122661246696285613289552405 4567396758159370174315000705723925370781834673526994415242165488873728193403 1 5629515904648845847220985013950049821238724776691834155997698466488308883482 3996487945670853364041936436522090756817636410435724811168058560871833072878 1 4273641159769896774652351368437250344862055549435931721427961117493933059238 3233366843553339732249239874024579533888799199642980221900387036027721082824 1 3296325559383826672317856275842960381898876080669243528141943970617902734826 5470831958072436572455972338080230542996674849207415291549545483627187018645 1 2111652950098389128560701515107191189222085691215371979774493471528551720307 2360885931450526827405990673871694901011516026158346373639167098575316547057 0 96529843828559316003096390808339571280546092351914397067690496106338103730 3226060154035040558830736615963052956376744899930301784445800965542644677286 0 3854150826321400985140226310140131434129945324670226026025158728008238100578 242167249631453781981495400127464192444243535842305169250429238358001972707 0 242562818936393085437936164169264802542680111635198086978319750155752613523 5453729912857793404830914627013922666353907794798717581728294839673424244340 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 -5469205462638469184891997875955706429256170076115613637215981069295734929821 419208382840129210432253143026947362527991001908593600066992603038894511890 3056444882706478515937859103945441840080920832505827259287010871030813121634 14757534100 14757705900 0 1654493838041724083174996523312228356460806772475936275559332703593656859896 6632061082641152251570550747858558855175365272603600620022020648379346903051 0 959405508805925173308438769527849975719414179082337957430228998967135211874 5996331436967482964347277355238228670248012837366303234054834624819170971799 0 7024319659730118333349371470829277019122265943053944195850083604194053856413 5433456025219887775599788426469494625283089303110061360624826366375162391619 1 654770225557378996528103298694096567161284790175851394944484611759119719305 2228349613759765765126995808331851449758120375418140318968531330574660328782 1 1918832340554577021203039617748517451075856860123754742945287903320465211145 4692890478433698729352131014209774181794909984495383108783554840755757827064 0 95225299484906461843587316106577034287238154825863321382999924129062906316 6967989631370016429105539565852128224075559127648277662633216681392946636168 0 567382994567635585509403637460402751954224482451117504037446531507026282618 3725541825106768997132908662794246938459248230152659402560056778973657573916 0 6755534545791731485101216897591080876202103250946675503139191243236535642972 4356591063852729827683331391668471831947485202194722645911665061595960430719 1 7041492259045924010228028231025700029168339643171891978784998292499414133097 3968277799459953747078441486455821557826686245305286193970322655814440836121 1 5760398876350222386926917277716737121917186088249750836508029764375814171367 290033059558045596230112833381447028626722863357249579226678994195602011124 1 3418574433532275305191607086646058872113874344958855419408594439774031302553 1271839021926337366415057795112409256458091127347011823589617718346568015494 1 1009897218477658096454947727932521950747890918221706135326221365168217389952 4430058592968905257121640646172580644409167911276943297064514442960563374049 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 -6318095694578050960376659299916341877844189790673085125289759848217139670084 2319127980094936169686038224353839083319872861201875423833515070432503097185 1178591183513589549703220453866400290970469462378523950470052129185426340846 15904272075 15904450425 0 3455305631405448849581058840493581096835789661407585416242260847059993528162 4139460191155705189709890189185578780157883920837744419948007237669749269021 1 7060441067981112357920335562518973806979913663973039101269329287830670180593 2806080847929816980017841624193575931433975810551313461098178407058098322929 1 2937482780942068369285822218504779810925497725194078076149934961542705178935 1661399249343072566921349754430261210193122317488661536693266966102949235160 1 4030686264827015551744646798835970976082714473561704670940526422062335006245 4893069443589692731028784320690081413388455219445569406215720420801012520562 0 214624238877390878551512483290018654811558569037266754528331177206457097991 4611765144634705483837795556362796356112585660617059822092647928922152703285 1 8815503521439003502453356576987481859919115423336699215569301635817861360 1745161535294127226904800991769732980319147441242121049474254737327247738185 0 5510969735210885260594366515655247005208146388716076695223524939635183140681 2722117143877108082341041309775076038328010758757092365708089894181704904119 1 5021256835037954456742178304319158020113119877823353728606046923024676325903 1570329891790353203426664667145609389120426378934799610749457377397833494939 0 6829932253461476744215129385523279464738386570502129546912226814573637215203 6102792342080102564164765618467415152260118370859067564420071777245281949160 0 5966944064536104934815279210989845485109610520973531813131581345740192471073 1419910039747371690510718622378526607496830040331517185480907730008023087922 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 -6161199195507308429003188705008407304610355711142479295239356991143160947584 1217625595477737016085766084734225829960753405417431684419856600325689833893 3021005484380270270517940046901426537390076304864890802175594037173502153027 118664715 118680121 0 2794554657774798730727658290629423313472017380388717111644046578105299335370 693133570506070869234591050353665561844031643910681861225302312525404767025 1 3116072393744796796523204714078408737280035287168463702827209736237158084096 6018942176501940472207289960070119969904437150244332865574678442256927211087 1 3439833475339460803728775003873430451700379454814604945741220390491058260788 5898644382586531494722376339284047448175735736547578336472270644347103967226 1 1691998095153963712408394849050911597812809362379841957844733119420879554199 4590178854551768128202059892655776197255754446193202351338816553358180119367 0 7091202725987623898159901361714524289776727291623210050024214935407792893127 1473563277879849842003245973079303170007935439370006011223432922655984320734 1 4742239953106438692391072520606010233794464234722385803317752267658899615123 4645895518333603375262102188149957560704251412579139634861045439592713905374 0 962096652696446903410325203548406594492749478747774458158681381854691359058 566234110885376775901436332278461062151362880098107233203933328592861135180 0 2028213124789856192833186748451026589728448518863825818961572252795914514430 1560633713345822968623113027427371486597662670776694727990322427616270214374 0 1556664953562333312764848941009787448623778868404450875528644189928828002299 6899844210495348634905748569122884110821277390730070716578533112766952458766 0 1545040140904616693249238865530537631376216260364774120141523088728128989810 804672925933972022927339166875014279736126266396813480739418721474539450116 1 1384230104126269441977995838360322529841174304478615707725157185250382764633 5918637426011750425399440030967219352848206878566095352728263921654988893285 1 2197248421030978754061846136114026484810314103717523282272848661764077048645 226156632919157843773365612318219116841485041333054474569775620648310166970 1 172803527762816541696122674473128001777307174320004775527538962184866033734 675896143954763107399285110935153435921306904082192818097288323211527149292 1 5076358001873148322002447952972769939268943642505974868724355985439644595520 4106407436109705082056521589217773355847921586231929266271618944873220824565 0 1566838666653840290148503517266490486786790312633690005404814002888013416241 5371669768273597149174698983667332452143565853352447763668746512088381553229 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 -4416524142722107156545953749431857467119732558425679822796682067481093420762 104472320801075776392080958586955877087418136168029629391341848508552070458 6371469943679298034670074411948698368945604889059004900933514509210737969104 8196928741 8197056780 1 4961443626669220525540992469014576184605654725858463997032680617430538234678 4963266415199392741170104634050764935161987124620446997110133179805177064534 1 487117469153481807354442924971403138960047389271071852123215344961704822496 4198510169657936979953951791785973769300747657711303478734346931732437392236 1 6289017581248049461327011839812862769058064134866225614195254449659051857547 5780667641483633185103730528606845100742305097213365211035531535862070763846 0 1737234384617418883415873524035257258752925234506570975925429023076313030312 4932347976240014705192651107948332390446348838299093531812472172493640774449 0 6518580470512010339469541913772214993843678537338159150865673225434518226106 2807946543213604058060992325067906142042442292423079602146576938590834325869 1 3592721556005684684545626392812613559080011647426157956805289159383555179894 2097053589821387785648869506162858248347276763562382911709644190687917601951 0 983442412029669647565119300487156399027109235046064379905005391131879005308 5964151450909467506185428897180855164686619595979617286257214262209927978007 0 3658647259749133473439719896725636210202294262581646683056413072208722694989 6958704132181572702380502689073991689036974457322786496427149529751025512311 0 4843561766755161080365069476305427686046261253511075928430281210938022079915 1583909946357092210830388530508579496449115908271002864475343644843087147938 0 7165571529483368224349255122436775113936047056193451621249037527755274149208 6823179708487107300636152475519599892976475704877867649060753079149946578240 1 4952874147997220252407830541197524762397147468824300210649777097023541517619 2316914824459978226397600824203559008574712629295750376810958591820602444367 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 0 -5474693881248940775111079650786950639872720778653081449485225767678344031658 680628686894618083999519592093052513773656466073718346485595699989774587913 6076849996474443986525711539944032057350117492328097118922002054938493131658 1916516916 1916578828 0 2594467337448355912191260614531854203638440740494902428210271575332919426600 206196375913686853901287756522246046815205633090442466779674674283428504595 0 817284187148074574372894093657798123644022761222794976554144814017579030789 4858813801790703653951728957498379334713692017666872273306562400780079454580 0 1149262156577195257563266144650858239513710626616782421280291181993186309287 7026531867635017655240054623717011933907689392341867449084720399454424092173 1 1504253432105442527670279903683722515444755536053405345287812229857602758894 3029891662957240906982298990069613184472673342729474962014526479805287011096 1 6663439547291979471554218623455775327763420751101029705370724719692683610854 4108144571095625981377055297660504442914087307541254746272524232938431039566 0 6906382064521725926097373732994111672236446462426289421718182754315456065001 5802256119152398329757775904800833059812419606658374847309711400410261542553 1 1565156591422796582882401677703247423166572306395800474822201813833494837460 5772349976601612838344155728989858829059346281718856029992391135432973911223 1 2992629690549557549448686061559122970677837695702126863141870844978289545707 6519777071529504197248002685334442373944727959854308288283930222003553641130 1 3622528735015074425819121503173220361728896424779693548638145859874261983168 7098181125928235888804598093794477282686222579797301665917269635331560082117 0 4272304758280574025963000668090198126881518755956501293348272095466402595463 245884974869263310601011804663862106897750785330139200955826536779832490625 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 -3249892351783333649908177726591370173830652015579422329158239279359576953561 225839616446119885735372773046482543808518115014839778709736212712342509868 4832264434389746352596368254845684905066296948674908983035505776185589101830 19157954640 19158150385 1 5613499503656110422792763796909053731018547923665769956235375126995587421307 6317369768553631857659974799325614196267140213667754257911844247193494075845 0 284704818607081757835679007644543702284105088097095622137327195772718150335 1253007907189408927042995273399830547499866746738627808133043643093616891414 0 5719181579541253378939868057055178801228496044562801621168406838959306935583 2006763952166107159309184561691673621344800138344606164741298731978009801531 0 6172761258483735700657284671790732888444738478092788708004888944676053129249 1552090722647435994935217731567822238094542327028510325822154338597002826955 0 1456869416388134339067228568239871052261110803013067088095158806350914206941 5009043022485707601833900655945523028192271945036603146835669524189203918200 1 4025845198406473871339497241624571505816389265438708949111864585151690888656 2727805859559632083184443552808832519517501280052438626958949172739741366307 0 637071517216935992133007868357882812466575591893490244585123610513821057210 4334632465920247902218189327904009807105081357228143525007782938864558482555 1 707717196980616500945218311639359059162096180426946204994174164832868490993 6470100444799969326135465661670982321175936606134258468419813142014952282635 0 4570808776873354819687119696952070549202342172924725419856430106103623626367 2858698065669087547733608120033089268693494585735708990315987701961404389579 0 442848481041990105174911344799948550570870571785599227301851253298725770075 3635500992665435668856366170329174552612963842351977386749903170630962296570 1 2804634903645675484725915857782612000174507797105244734135573666066463699962 1048425412734301715638488010646250428721446056814530272591110867534211884533 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 -5596152162196672526050606959925217327738352028046992498213007686655977014347 3088992833149599104714287457864142263703975997078382551675792700047007717666 6440683692045783297392495715559345989621594539224679409126322521281808842787 2781125490 2781200071 1 4973467892612750853421119122556552300887448469798909686267853436778866415178 5659076850107237484117685538087602050740047476309947073813036962018396737742 0 3942871965387166581336790514322413622235077350324528875667306682677716092662 2611031802584080090259158706703334983573219880242383488543218630301188717945 1 673840301529076134071669578961754447464971205853490969846963863829197473044 4360757919601643105285469855019105872196664782281759908288799458413604316592 0 3964702102874726844506861272928875472332317473306954389503928096292907866218 6808900756548407625607471083631094186477748321190831556396890551188552368241 1 6156817618511033938911174009875010892881141739115760257817716718268256137628 5911685665174865545738335706511846407237761328537957736219541938866423984983 0 3011736933746586581341957771448883795184028045575754540574678908799355574371 1739007902703303371865073896547800517125989548397930233144101263452241484066 1 505275170989601454649334361750932127014685405847079522958334283586491029229 3926680729076147220103338125219489939045695350813764652653432648651833534617 0 5317176313905751605934976062560161484655250423637587037303044430349860867245 4816595209335107452078594311930967774518186783300964425614818427955083919072 1 6816414205979664795708845806792239804548939957453344014280143058342559549443 4773906292472101158114585262240625790448730760513789754745332059174659275928 1 3458930786335013628473492471535639253010587605971795275674369231187454166110 1211047094926683396835351694010380869012200078897675389928572636964984249760 0 3462048339534104537265459053773713269393792280013687747271326685417497865154 6487123686626288846207816417767617999135997297758621808315804163610986225252 0 4487893186982846350820551012067497147059709308401521305616429825841605419044 6884719690353877034313254566733678255436921171944863471919089210264827088286 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 -3458785831985867592813008507974966063215518529913809171030256783294854752476 6749355562687114083026982154803692125664334811591844876468115767879745512593 3881536287447063159485312228982420985245787512107857559331698230844785667222 7328064453 7328185516 1 147417823683882050313593509559695418952275247180144673561306148390718153315 7001769178252439018231023951514917406363541826546171036894870273622175729062 1 2383740097121306974845166220546411718564644179531441075991791288216572983569 3246933079953229003331236598001566168995182687155338043228842503031462967059 1 5204405544248304371152557088773774239088290822569982307663134295763798752065 7185785506885239187235300696893649595245463784893108704260273574155429280721 0 629517930720666511556814082551102838019943782587782331247160167937191112010 2173135029071334730274947187266562809769408235842279402592523494130130484351 0 6906013656971234571108359711798435199954435771676917802357764205367912187011 3426862237618601823710787298378430473202757307240445755539210424838952521223 1 6248600294762838650508546860688241533685008166683809590353662695756518584682 6196608047569952582146534774092187227493873656382395960048518356979244389837 1 6191794123044723216943223141775911429587206570372369388964353127309065135849 283639290992047365001116765868527774394568480107841454557492551726434484739 1 4777250113142179938732071378694568462156785300613299069179669207923632496818 6992338510828397836023715756186624624387696215688205814928561823752311784756 0 4502894246418282964976028667139913704763960332767200021904600078233782792650 5111376015454457396122757517136128425165516320716359777882671346295216003193 0 6822395443397155720468506830209035564877505182262522500369495376387610848120 4256130175362539484890043936005014293686834628190122807631270275824711161868 0 381587827077940780343700252948305267828895242687867325974328645516175905370 5076054685263388639846366083418591669610196374827711443108751702880918545735 1 2716624735279808654707628380114972718089722437294438951140070219003606061823 2863726410667765097528054096725854005399123885023985318551050900789164853757 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 0 -173307859199505179734500898861966729322563354069511005866705085432311548066 6060378579463301793089446851290570087346419889366013151895044774086710615273 2970189093604711646438489258573764379068099831325583312350316854385689772208 5178922651 5179024425 0 3251498940471497794772944618123056590201444752638512932204841724452062613756 240659823033818197372307879866588344856427658490331204583316794648303495138 1 992288315189799940769981442854206643495152558628505566760728134872256658924 1006142054646882411348745406547253319016171609820763468166484715428316117541 1 5265327843552148377646260363030554938769674593032798039196969282747056241688 451161910287119675413865615783377531811825464325216840455960010916790716649 1 6698641972417781077820116185002540773977624293050594849776394671389605384167 1499822910585048209347734103466144699296061333493425164595929948088798716517 0 6095383538423344818172422300633364088702024990970391763624068524906142766100 3066755033414805060997050956765834642897482715487077694041277430436820741402 0 5127319935606054703378167064767858702069889613991800580955254841116332967325 2967866970356530431357172536623447034638034301801490133267787121270153297583 0 6384596725672843858546444722145874622842159615122104864943260737647180529561 2460876107731256788954565804796825359104038546703550186626296004899372796578 1 3153179357107732763960490654987163344379055432657691734982244575969905068886 3589403307768411134428263435217072573079269748245528825322278056115649889971 1 1009927343069614094882663065849091834912196993488357063610322946858268668546 6712171680800812148071826726202656160201005688045550846596143950040779756615 0 4460091795840171882239161677025187061173620542726657229366620694787761405902 90853158438887198634452280403494875523611998194396683594386508206797353337 1 4705585708174619638930596642328685883189509024023431171575470264451796571846 4223134948913292121419579700619384733949980405557372336725282819096064364828 1 217043577718438166422368777455460925010930055391118676459785211747415037663 2035063708470147329221904279253291736747106025237471886446388557016867857029 0 5114937658768038163729885210687010456615364262749813991183066892980229567805 165983176840206393201828159622224965246990948193802823173034006122445505961 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 -774234947358526763084862529631489708185837720343775342782055821272979077640 386697665384868875803036704861574798532740235979557681599333427797385374398 5491831066525837994889943907133265733148813763237475647859662382827536655896 19604079055 19604277066 1 5112271993349379059726131103710461193994363236279902626856428337292668351217 6638047831151295311778511983762132201343747251754846293291523185338168006436 1 6515628393065269999861810135723673633508826516444384313975950496778052270156 708954000683534244950965191583639919188048659326660107167936170669769505501 0 3607352215933181602765436286276750179632463678899233042477946058951538432473 5021938860664508246442503033353880650385588102466212865092792864641881884495 1 659319741090012147078864034335415941735806487528280969371118228011040305264 2285090046232453815588109006531437831363979112633420187134695205575721981187 1 6953218280831372137324232508047212388321999394770812912692375144308636535773 6872924320080249480968703501626284177891556696733703101128393630675589701131 1 3097118660563825502141196079357844808347825190794557320152730970234272487877 4912629027183986546082681330811809959797106518006864021934601649393818319714 1 5492507184207704312595094994648672845310131439272491649321807932932964638091 3760442597798834963411617651933521813150897476270567555890766790919500499741 0 6295292003519219154647109469950961131952940783154346557915204578875155912062 2815827157113588204661417486412361422957633438802354487256322005739956776213 1 6103493440316137408474290634724502266177805673943822839250969320065813900888 3669644230453190723697333501119068214253738775464575066411950141276137925688 0 3263357142581932916681542629176101033397555219429250039503432750975932467040 5592207029660183081685813224902088465170117491427678443881425092998332896598 1 4253011638262720864230830152432576534084943460126541901499139599100510590368 1146857979276675086792626062165035579639717702662139747044312345445575373132 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 -1686825268718697233854444167379475953446260737427447850599146172533798782283 4313933901645729299588632332529170689564522711058971193010501591717681502201 5155247338326287462759268889300483426477145533227591943958449272303955612027 15185800675 15185974950 1 5447963632470622233658497006485444734709586250914089123567782907556687033409 6198175895853612144710083897716510396564877474550780611013683502969296749521 1 4298511099425091751994927577627521263220079231871345031037969325466479528604 763977540327717966788040413680689726510877900691198755312278978099243640158 0 2154018578715781135652513486351990475746682993485193185341210095404761795008 582815058279633787320760124144561481558088502915347392064078476597765976767 0 2566794143850505309169186857116857754636644773488774441109885789986330720081 2538855281504914629337508760542817195679523105617026045945055184337493343881 0 7094710578120333821531424163015990843395199506373210836821083233131958941358 5118466585148316475567650902699790756644776610014645738205402369099875930548 0 3175185488882069538098828073765523558728335362376335241051871045722101174104 6750754964526099972890074850563719092006501110313853730606829210982929590360 1 4418696119238050582852619946600511249083661060203219919084001835178024915608 2755764902485487433241961478633161712761106087095045152812783439874329447779 1 2451915071707397126839315842302513124149870558535660069832378648465567050735 3635099576146285068834370612671362374278920810379562611906784344090065334064 0 3390031230014636672359825309781183613504245118480053438840999614345638613968 1039381848531359989713482458061191388983926392400129171954950929257535648752 0 6021032527241444894102207079810747756382970090029215904823957784290835692951 3658306326902020160322115850762001532364259072189317169052508920400294702289 0 5524859911479669917618727314114366219392917601059597058003104265337771626806 7059310816779655942037342416042420373044567410196508188439493006953448567915 1 5220288122505987897243223513609984123279137833539776214109751187976182978706 4347374913327134130394918673275959974612025625076875821229243248326940521105 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 -7211908871781286746561060342807122927775206547577741284927779504041559552088 6850290691025483876001080958234713196841892007690917165402127325768363380310 4582648398091027057148962613511519461920612562641333328699694168809132318508 12967987581 12968148628 1 4928751341408186616801083507977936175452155540493670165131342083330918284785 426435572542055448774901555121815378775507353630022430811439972225384463273 1 5212520066539970778909142750648124895752303652050114190885788388000251016849 6401311709505264836531745222493052982733622177939444343907732661297165633552 1 6692071131731308949285613080722545095628386770968578839419231445317421849327 3567498008946211787763472480794999370483934006192171775876372428487920817588 0 684344546183011780887993809915854986777661857779069374020159386630511436355 3407109002510262382354103729945227583068639511230311589159473220190685726845 1 308694633241410813821734402153094858304011578245161190047913226163216076158 5830116596816829802466433737886136716017934798401073729221135763603807437140 0 2114145394817734530751368051900363015394995904434917322312865979446153494712 1043165627761140001209305890076592621683921283223365463299960270447126749103 0 1641276047385583456239848160373749209794121312419028185246171778705520643420 1434470438819906309895471340320612478913806855464946033730428151198020059228 0 5197337791393164282716905604321401948777061954047131114926870956283027718534 22209563703344038293759313163153286038454872223665417003075042332383062472 1 2327010853356925108071413281243945867760289611128633656042888259943682021652 6824275756802150606152327462304491903526590856171957445631406288714720310976 0 3170879851466275349657212441515498070250681011479397535149392808398887154328 183590928309114103433213509611357330380597129789348066752198799514522544106 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 -2697502680533862286166026865953250511023858628454760683616771414428644427896 2934704032884477119166422014193993560322865637903419018391012858462254105756 5898137401092329531973122450899188527424582717297105275312064140697533343066 1633890030 1633947195 1 335946508475626174139954305771868158496123625162760791779072222324470360536 2633478459634510753125036570853618959305855955117456692301409318104801180268 0 4793777381614044057436015677731125200262052479859286249025879002509263303700 5603399638465088865463492736334843219107369300435309463003378279574095324541 1 4414940715828922416243996062199810532599634013940780413289621789437524346775 2344999524541039256780168692542481404742654661840530192875530010519800267680 1 5135187568976642076455714742013997737196288349379856547725896279656993632509 1962468864590553867706620436850214058846227637762180738748956064330358254862 0 3569350955082483603533468588677821970626713986212161313421446616770131606257 1492935395965191325830250106040940868733377243764882406049483763492889081944 0 6385631242142521915690529513891850699060857001873572395343801876350224058516 5133558371175581428623575754868365868511726607891702143711896998141166253111 1 6992537304110996998060911948602307801512651657094267887236801665884761931137 1337726321591716553681238175024499614754924436275826762344126362583975770514 0 2566150841631708303490942764017923379785063395811714069369527873195450392784 1698511015950709635089403982546490451022481668472678361180175093022580883085 1 6439148385992932934790807813982559954608443568938159669044480615293425425853 4231878214500698865025743483946913487404111646496136115435004917839451523576 1 4922316091201398267692382975452498714776745431782647600877027633583367169580 4985830079627615153129043758999703984670285024838015342001395659584134918282 1 5720264096457893521315576340212423066277710485405554582965494576928077573514 603858627405582061991351110592926932231337654057923368390422345106875231748 1 2836873274077781198370494171065783541067677273126240835962003257999028641929 991471716645471221314040232276717729084708483290748797093538818575638608165 1 3916927548054963635479291260140066678069452497421999352001215066188401932480 1810474348310579976497191291097488449671283559323351719880014327038662416426 0 961847789905052348395639473119596628614754188021930355098071567980791518532 3155596887177169079958614944255101915993877870543881690508606166436311666145 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 -4770673773850081698721707793089114613649577984494429534245656611756496512877 5680774425267789484736294432135370106451656370729944389519817675214334114535 2434647898447554765575005632606069678796722738552906295234280072527271722232 1043582455 1043628141 0 5146038143970947990426167292539125600183290979082934885421418708441124726869 135235312896047913922621577211151769493363634345185264566599648260067886186 1 6604422098473230470891718504696374089865381221057527332731501641915364631824 3086109126684481087395677867969152254467742710688358137032740367810014183670 1 135394686606588721400325771929085447100232120593827590106866469780236148169 4173192145902862064611785934824341483130726414206023385927438123980295967116 0 869972271391022819570905574206324823638019331714716244900535670800266988922 3820603864360962631775783563973807440468960066142928528570636233212093099507 1 5832646808982356100421897617636132310442902453819250590441275618883817813112 5731352115976923656838396504754294283489320030004725812914276610784666050855 1 1541546630612668571456366814665448196088470792917457704352383812553271461334 3711373690120721173266807119575688971719547418169358209030832359616057717823 1 437599361121568393249191066452374645804276541057299596107616724287310858016 5921283472081160827845197494821899992080243480391628580687919736452496501994 0 5945945572369017224607983809693478080288168073992661727596016843376857255716 1224955992137782546939445223252019337797346955692713123139180543828015801303 0 5276159628495022014798622668437799888286502278250299915994559994111775784933 1968439424042732452169530520619085323873645557150927463235814961091770268106 1 2727206882123793933275435244996398849733757439739621795507660608103332481471 6223585642670366028897891208559798819634089715976718086297443075686592764523 0 5517092410693639187607724142245599130136848456048761921634121094461620380927 959811354467910133041112547152155923249022392849289637814029610751400385351 0 6251105421714808717340969741637791989674280359427229336518027239401122149690 3144253218099451854358241793697254282815157695281063128400865245792581919947 1 6640085835532061124625390618324627963746315050661987594745723326234314656526 6850324899277907660226346915852087935677879150895966262476662402102856931641 1 3976063325029524975622877518952453219247994073746486141672619081366988980223 1113371943430413296699004389601841184720691843086249613296135677815111482456 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 1 0 -6436522013693329254502785364190556524585966340141102949873635137497776126228 5319365221403312973495728065793088678498714368529498535346094808901500905517 4651277368967028737821051080508947507071309422861140077740746150890006473716 16232326110 16232506290 0 932716190929118700822902629839585023630388749799908378779249904311838956856 4777989406507804522909630625280097346033937966118763100347193030825398706777 0 5316497857088958516883901421429796219561630295895158595020154964348965262478 4979871282884982315540963818369036330314145511918378083556991745875012237763 1 6389513111354219442675644590737903556002177240936069335095312159015096424860 5421492002240263533477662994810854403523420549888186407572953798023828710015 0 5416129385477338194054810487547106250852252958424101596220949459121917107417 6187288915404625528295442651599778871943370226696759984305451185374621301122 1 236375648502598209684532196680932925682995993817141313968552549781852135715 4169770484346120244869916847527587433670317873198469596278591152872688737951 0 6526861266449365124428810510025966707447900867944415869482775202155171162202 3226825957004417518452037706189433879446117576313253749367844068677955890524 1 342539787755191741852543056229807255448832424747537765466671271633462965017 2187325071632464467181407967444574224564206416987803221876227322575758042716 1 1344933474715108363867304558965999666668113552494215226756051517921666449094 4518916107407658264884911747840471348341707043826713890283578027134454319552 1 3893600142064471604135980938764337390932371267959512460191826894128338989590 5310616901356084005843924058376370027433479326317120382694927963295818826322 1 1093079782114326818800348784254929366562140552339551626007917276169255238764 6090519853249702349001485330504085873028407870329592176769707795728091046852 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 -6151407227228329731312053142538777233938357609190790742667312134152480349380 3510859221913506272046204365612395854380712301952742386759599537109495271670 1380287690378099933649740875502340903876802807398122999802916962921661353199 5815325935 5815433781 0 5690822467181912431039974646708277448098365412596070936152272230541645829128 88052934509040261646873734201219196184792209240566085662090911284663523276 1 4199455840973905536807332936984134971656864243737075097054114980339768180764 762666184663314839912425962592994442764519612187757007839135619081470407073 1 2372795620237808620089184197964235972447563278871035941794692510067589333169 2302725618784851741425317570948432030844324170432591717019790892384615329771 0 3986272264139091721516436459498023319200041052452965403375527250259356063650 5093159549338781065888640553047463150028219398054929146121335486418305125523 0 3471029142340832035802054562948607419012047931503467136918931656352303669049 3526166220379173948287543468351553721679653529943844804793404824155996814003 0 3321278274820355749018264595040469359433453492627028307759352784609920758989 4068729751435877162887772652759760329550818780938004719251727701281713014883 1 5254458116807396321059801865377542199325161145855102227791941520733178251267 3849296741243100339879572483418233564395735032297130972560500305571427677346 0 2296024423664321734671725825462218425279216765705187317872770781922601281009 3149422738033636093893781999450893302284401583250963532213789802972164281839 1 3685250294519138267860428537589560510387140256157943508821567832777914784867 6137445733895271964837671118722735186786966390678375880590431527753194521220 0 3076786232287804102183556561085553877277464802985252636634275181200184267867 313418966586446215556428039029293876634878690248082182196533848701027738383 1 3250861499575446200442699978463416618314404568354464301131424232337406036498 3018219833708828297178387991016366590439906245275337674767751160764653482908 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 1 1 1 -966193750885898645032125550828856568070358009916022878427302412104737357771 1744881836684951075880630203732111391999138460760745602323758687965811306694 6147017995462848116143939837451018749337849679827238812640875408335621295657 16461234735 16461416181 0 3879769862381156126934933381425813247822229404922844074820079306095883268738 7129136695408689220827661389472623823036985050390895664522630341837938804822 1 3319510892816477835087156183751558203400882221472422318977692320060643435824 1379656182927804865537693420898060019664340934444922281199802598886650261024 1 5253053398032682529958996636007219305775932843641146929315151646356376893843 6356134771319148606006444193630882789325874567359038015764797700493555126098 0 4384569222770874154985860540649614495069366946449450153536273629004311131804 2660772602591329969733634400031264319595005851407912283960801870032763927191 0 5944180832410658380132021570910081339142911422423728655724736496999685038202 5562800787435549992574428838530524311110415661893712068378529423922962168072 0 5763851477836306333411332514652699731672638015850503992564756198430382911710 6905397879520407306693655015938130122041065857331384630982348777917153989707 1 2332540419082057443108106423237039326966661220429018927522600669601315284487 3783253377840637665448312155065638334895792064043352853814054285137247328255 1 2040822697205351620622003009740902582236364119676432357453893093212591375133 4251373053226676877075333849867734629001126662761204138943628611723762569128 0 5706262227400302313395315359700399134788994742442204447425855544889071318152 5194003754007053782605040693965079702244322258182853202937587572571178835782 0 1766983774319982538600085636406692394694835417776844993895437335316310691366 5031134736876143765230304764782835119075519793510179399098740988373563036740 1 3325021630354190836285984265800406667986861885564279001699864295199764353483 1870433000871466856397944323773107563848753775537272521376243096540394864684 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 -6164314741625258073393538305391011332020684547779667768515895899222675501297 2231827971242272098979372121069546727712212778674624151734237386713925908912 5579009843447371645574580127437346604514597123984263847477503429337732969426 7170210876 7170330628 0 6530035566349333309897650301948547793110594567493271162748723344850850382817 5369809302089541899240735672462186078967975419897442672351355556921565376405 0 427119950081355965781116914736203843473572814573929883167042018859633131557 1476069275327959293189193424166466763965396540215395442628558549107389387701 0 6307744169269217379331193271843713431938432696534986292562109379474331524131 5002335101918299580215163843906666406499862770441623130714426071386628736544 1 6407574896743525810512043868236361808517025041743552353551694915156720393611 5317648055329190483142243057515413503565073868860278831867303136158202153857 0 4320008965190266238712897316786105740299145677089732758145367669674042705410 4727538881368949067721650324443729716147693750655319914813325350159871466373 0 35114624992060299274645168557220702684375424574730184432435708121811292733 5778839030941810165236872755708405017097866647619421509390126540070019851177 1 2366445087227179679808889175752633356335365832028791219774640814281787091696 463959523393247151276232153186493895333814930319739542255633824146506325790 1 2881786397212324315223348412879379431990498686913585711351580182833370464404 310546165530047723450948953632178133601560125277582485713439392126990817349 1 6680576927182879843086488608609165485558436715217841732040570922451868670149 733912157228784322902951493726811261672108372241640427175491524465378296876 1 7003894589534395762681049531775636955021662755820306596341599343263313411118 3474093253113743770059626242497672595538454936428383200214129934876520031506 0 5079554475346507411631462413621762452614165394502350399180063273238487654291 4703909745922243062309481051040782488352901933462613492871889538981575427918 0 4379424283483138265732844645154998778751200870866000061636433748450323310511 4173440702232328189935005719912420990960224603483207292652624932636777784188 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 -4440525948761606014481360839575348561339503178293179861145706051654629236249 3605532904085360506011035084387250216373081435398839526088681945211381053841 6812145362475232435318962603284828709478080744440460751534746843369448633378 18890334378 18890528751 1 3669590718454736110485815180147274980651310215583560756447889348650395819913 3925925058071923374354220441055259003041456485768365669613002045290767938048 0 5026823939653185783089712156010589439676714726759607839554725892630939322678 1041327329764543768685446418953579831416018711012494937020249136925740125225 1 5791764265774962346367098278400857751513956346338940135608546431905802074949 1823360742530849240023426263370574320415232343947680310201766435467183128867 0 40418281379656808056705209854486402296377521465435570023350239997290683984 744427530971061160318357642424647301251660027528323509369882005268811206033 0 5794133171289146699982475689817588835789664418975548089433094788592163503755 7007117877612287455586010271904197067767429222926867218245113025837640787334 0 1066327017214240454304641976657247335217321292513625712602230905960551039728 602597428046727128141255960487203690095720489892380791556386899140030487555 1 2647832967900873321472057143843584183100099732612985392900295450102606670200 230544264768175180460119122938651925449570602274575983668476233050306209291 0 1233598637186887590908827312365591305111957558329244779150364160153426940780 1481369695944409064405249715185503858222650943192547429731829151018984120378 1 6893109057174132536169722393895887040750144942110826991332896016761069751583 2067312158177659594941023119824974375921667986916060024879688077323366917471 1 6347392118863839397231865417660956951633293950861701528243027170985620424735 1564125276356779490497109983755252251624048808713919264306195307280510878231 1 6658557435443307130360334825186573514563774078079767322789728803460625817820 5863048430670548032860007034704226053292197497726694428072910252112463311620 0 38284609037118071691867190391257390057344597257232871599345010061802425513 6907625790363763812806110217944706018555135351433702571354191134817202753711 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 -342043057616114054277604098117266650879715231288706739603992398126593066504 3353076907114458321944132339553235632973532246091046598866752138046433874813 3254305722105566256752093532925824428974943756976623426457628562360194700875 6222091681 6222203235 0 5330175701567329884165915322052802405213067373352447190828512198853405897367 6753431826280461792028019094397715317384415912383433578540821794582238759253 1 2966336089745456940698977645419273213893805229691871752588244918623302979612 5802980464243550874787715335837498778711793103111689642413657761613059482631 0 631451331709153560881461285344288474338095122079816240088462265091484038358 2428606375217704072249732306954587073713185960841703540540057052370995533527 0 2508051396066741050207348804712644183438245450652757596110222441788059127558 6184069496446249623436443346039669091984360122828952514815216366380499627011 0 4312117071420400923372025029112341789302928253891660789640177044242296320481 1509905884713655679855490057147998425783449217426363031002712913026060111921 0 6783381769877660392282542603218724275003685634811811498999625039550336320659 3552232750514984566097110162273475958196098304337588575228711771802071818762 1 3277471444030676070016417630603374403444715620501213129505076744743402822868 2008286387256972694325056045332776935718146689126117405551675566068947772190 1 6537595608021743575333576628386408873802179860243911448230094787371492229718 2560481012507929935681745525713194110925953729920722757648801410634869484791 1 6190713307848801454066860936015521351177227215171274661266402850841796137536 3195491493796569017122357238916050343678114725919808722398210873621828852749 1 3114660823868070790040178624214267552057128245596137368003047008838858679199 6323402686526795992155666879374837112180688248015737092409711161827825798887 0 238832790677433003107571023094556285750803686940162488129549679169730048516 2023952078570061013283087806581250421699245522995436261514128563120031085742 0 4363874635593451988562759074909756991275518645475971781208192251458420266066 3630811629581125647155793592111209320529071053924093493187731932603780049360 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 -4206526130653199757401815850954383339967408657607612051104145698296447796368 5367011191036993580668916111028343334827878511237098102983560935435740618409 938332933662629189902078237939467632151712114733451666112782517510332381869 14600414403 14600585286 1 3731321065965367647688142447849625783366679518496510483139306944844819170146 2752988870602071677883002980683638786646344178500811956950629095366421998190 1 3377669449682486118224997233556513016942824215525462332454299745651253276747 6579605531462024282780641069270816794829677295136488496987965180104192342845 0 4172794385040823398305892956601575463376870622202935201033301136312488492055 2906814895011553784496372964209065962310082299504785441834035031150162512269 0 2627910603302859340581628213272505564550237016550654253047388682279550698821 4096922930542278250088047823643183090947197164395253023522723568747092115100 0 1470763451605551391161296596880333033956777207031709942581559003654512789229 851199827426667148493985142841225139264833167021296307356551410180272078118 0 1974540352032415903561859993926651860126526790101582355553830688515700876403 6955533527205841373325183123762481442622948224298604332054568158563503691741 0 3441836397240824256377696445866452112724534376323900767728284942147424690619 3566786819442054790602936686803641827133116040707523348596911929950531099913 1 6850827491908178832427193323394050871916741921476566773229730584883471458102 345506711711436574719941873836974779870671070234307957989071517545966970798 1 5016093411643849442066851793467229686348225334209412796866479055994377107452 765124079612942674298547703917863367540862161913714977751696404244679757737 1 5020907922782540877688875184404933788510299892428482630631833280099076343908 4025632305331797986685904417807501148878467468939865942501002768631553995425 0 439367202956703470817600031452446475976884204005893166450530171088590995400 1476537284409277259504580249161885502701731421187019633553789737095801687089 1 1009897218477658096454947727932521950747890918221706135326221365168217389952 4430058592968905257121640646172580644409167911276943297064514442960563374049 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1 1 -4819131015265573307415525822404666286486808879025255466556590501222719336318 117528063270547945490128819619463453642492749082005708393191520527962212982 2209702118898095264205965135553323017217715111381496062337644131511954937490 3381585441 3381667680 1 1639089832868075879892644744723996422438056864939415035091686755307077014035 558064478896070853027942405538502583638349848352990835621284961145673596623 1 4609786264664880227580403873921284056188585973245465352714276757939743757839 4105320503802829941002858918205392956811820634624907422217524863566933987113 1 3171018975514659372061410248674481546692807209220430106057711990117545289468 6096544349181248693384427634373901664787538246857804217068774388417652875283 1 893459661329229725840443855996816912036456127125480442786929643751798213161 2280720655852427082448686349548284823322149856744889342854007844667732981792 1 5005384901185052644864916830967280188045846355593437962881987738456007690980 1673398300711711960036534101784102051495344743789378448263943225904484582974 1 6892419705857442871792658923375279452501030534206102726278378775834613910648 3262998079660254610513653284237846458970095088243102721904784449795290822091 0 4063700689335234700903193148307042216490494547623643249640998343944861931143 2903557484629705750082129879956097484528699486543633986667007222601033000960 0 1448194904088476490755682494374960473036611049312201395147947148658104292513 709096545263467980681905510242186822656251670152993226148475887544371661936 1 3914570103627056334294472268333809203031151946565209749951467670937087312547 520721429376746593930067171151099937246938358455216103089752904474376966428 0 2558148855220920067006845609458243732565247140466083833115446874069371747570 1805781388521075420230298832670331687202068273587444517710369741373121127035 0 5339599540966572208404735131460409459909016617139994042734307833367594922998 4918746698209415980365663909456157567576362410325477851762380013536270332275 0 6038409313188205470842370820311709824940400480178276867274580262473222759672 3844677783525627446231379560612454246446929379098714676834434294800995372176 0 6254660218184047799058844752312631541515721604599321052200410875955328119413 6668904853337501950893853431410192202277738315069756455363051220285845715069 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 -594294953036246244500197649426417083196275282164551118137736674492439766092 518390848571393252837185546164744290283638992539620142958287430326428496038 7014279221092715592641367772128038731650492026214122721974270242314635048001 6534931326 6535045650 0 2451685182460735158603755813818695936140635715001686254002312891245563613641 3222721279314751537452656877758389244181553063145309013140530250398090127946 0 6076840547487915373236127816416406889952530879453907006171578602073322796094 1339144323651658420628883725774675229480874618705199680018247670641136403013 1 1219206167123027344801781965958866545850244232254757834128651337066358854201 3656101789064999243163974483034191386624323107490546227512316812942268289048 0 6906422388861056254733203416136321954753439877790084159943484512159783550334 6112180606490628268706188621654606122446786919235936624826105850341350905205 1 6223753049870908067260059329801703747359430046535834602684213903134532597445 5536003669282171181160044900870830103556464243707750634370180362781993427577 0 2232698395557698191746708199287262738721872351739515581480352176810406435540 5568254248400992482984361414723720601314527577433121115808107767362858950305 0 1918508118442089515381781365155066069609152077743315032327824234307204332421 1284081072197743836844339786034414226771060537411997307033226310891901529368 1 2677714787129875522197457414209557206262842871459775622301199745643956075369 2922945438045750171525139776156272071743821284771426919068708135693470507757 0 5968986483467637336333969664241195671657389045503842711245883355000259116582 2267059546244672088196688095948185043987297558188885070420883065846819336579 1 1550419860106391247515633718878016256952359414268669686493757105270373498310 7135314474095419930759092163070282622229090646416793950112287780538965449557 1 4561341452739725819463877940349380408398963023250969639610724868410547803083 42440011846289944409838055908733217944169337782085191666598589165178733332 1 1547793094312671368173265901804466758719573607158479981158767673387412231268 3726644860254875431250106643859847470794846015856272283112089807762551639896 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 -3922621028581601917349373044199784764700445446114361976997223090583909402640 4003178345490484286614644039755422452740094649563093330380779720536314238140 3343852870041966806038137704069569630517926163647091216352897245263867830279 6170660686 6170771778 0 2495537082022419756130014587374862623700862273016417149703898091762326763006 2729161846036023923144365608044427849267426486166666082851176897772453366129 0 5472276047007560458664750391151632410768544414989400394728991727417519567636 2572884008923290281892249071449688975637278501600531281787999818045074380734 1 1495403400671904780630381914463341864752129590681920964781641126350963546276 6559030992253572036274627381917035591366453242290773085777016893268254207489 0 1308676691052981937287856048885997359785584114946680340177750281419164532953 5701352443575535864961143277274848740514438242524377362876809609475828554425 1 5038415605784575272513428933930063397173101210417613126582231803590657727544 4204379303691516105104252860977310231278751368814971947850137878528096049160 1 817039371399434477953557768687609014274174327633721709474184398141423179874 5575920623630426527691617362634244729322643837359840358804374003131453275089 1 411545149704327528749843669365111065479475030657498060368047707915989438539 1807982578508218106333989542999290023515862988306361645581228297386769148609 1 1369703977299108958217412054292917381126249546217701064666490494649405973114 2018096984362564787241929274955064219081261770121211182925328912656655897506 1 5438391433969082086173560311487745423827919578431416011491028519233509645899 2776162340093381062749472790302830604691797553704018869544400667332997969947 0 6776320337927421379517900139137353262335521634858277665429804715554173619689 7016294680448693944923416017532401167678706502927510732393227567806702645371 0 238832790677433003107571023094556285750803686940162488129549679169730048516 2023952078570061013283087806581250421699245522995436261514128563120031085742 0 4363874635593451988562759074909756991275518645475971781208192251458420266066 3630811629581125647155793592111209320529071053924093493187731932603780049360 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 1 -1733417066971333809921436350738398749438648846671082460120033594563273665632 2841640912464344186831183524563398387108589546964104205182227265208965730345 2249426842466327849755552787392243348351446004769936914308033667564181729773 9056224653 9056359236 1 426998995542417020994882428643598111205708811171192428127129098235407200727 2460815428927737814117467835867517266327293510592074185689207499650547323021 1 3334682157754458573067368697146826200376055077069112696599613150078503001399 5437998672596612297526733680994166899830448451880046056385821671776398008094 1 4965424197935785386120091042903830872828804403776565426684447850760058494146 3959216280062279429019206500172348657217517733224006785338386528931857284844 0 2897091795312038647921534280550926468078206699864091024536270954605211171289 2427268410422521438179684315147447131243268897924214959531987440712791013839 1 1050902846898234008382532968763194120985425732259862581666053466554208456328 275405915174978328253724155717644919598195276338931654252361079664883242556 1 5262326675699347845209745074119381530605555845043629490366241684211782500145 5543926990611059650492185691010941264669865616897143623967725985862916208083 0 2246205073701700950211482467346819126197481217698686598329516961971298348396 4739583815311602168765229137508723352060831711268388975115664522202593095113 1 6055848603305205471545249831697220864066933034479307099228013892483083803029 5073821802400333091284302595734861907758544918819269893735852115796850665709 1 6246884483547227985251884909563247857029305898771295096948852706893671155549 2952939831010052012785473019291322320654975280341331710145877762905219438637 0 2809686552137753374245594107969807639908537830149467070641701282654304186684 132399833081666494755171134837238092592777034851767856135918722971021007052 1 352306719177219528179854600465739376499135804543172972373793697246339809221 374486968578388123586008650382712606498227776601181801672816435762195607167 1 6273576054011717192053617782560869896396116262990123891413061385751767028354 6586243115516158698651062044712450728893624071734887464901594244820480543046 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 -1637385091433510789514529178675362191844931113799547718271189726770675926617 1091153164994246702578070951213529897322260200436546386861259578500025492341 5777909153516749936253278649040953817908284895897358585221209791232318854337 2481988740 2482059196 0 5378433465271076808149916722918855982441372021800654692779214755673805419203 4744142155407108591037064341125690455628864708816239375310214605365504421959 0 2241167741888641483080962614817241539944963545389851368226853083081054890954 5144852698999719866712156934578488017216549725914857027293094712611734230455 0 452358057610775321931165439215768924530661005531180902858279550730419657275 5763838237148961807730175559415289749027348774308904168865769193102186806348 1 3316529932150926598097090564140616822597049075606466314786471356085432194706 4556039632692917079244752117257037705286414375811707240730566770013830696814 1 7123529965534300875414158014369152898771076116775290316114392358306710489724 5554558202885614086208912882150009798531515605257018104707865295480102865880 1 538779292390387919023130184829529730954548325810405333536529361075640602004 2262829740485062654549354229071772886285805911136034714798596093481370578452 0 3587488977092329354289984637284932030005598513090624550467872458298489086652 4446853816425286863915369902564437302005021568564143967401205196644040557399 0 5933459148121494535546192133155454442206242924782734256381864370436173421884 6335084952363439942008862690019502897348633203863472283652330301981926877615 1 4431649451803952667194732910558499259551162471712342391498072824155134129701 3140462213957713369148892635017277539707585985694229161907910203508568733797 1 4842263274904724868949155523693514959763914003345022246235183585052270464192 1167362800409222132027838254410206486225955744142904403337598563073138267295 0 4089188019155609490088524747965570617501930480011479516333969276679069327884 1800825559301242074273390219220504553821699272365727236164460042510151247995 0 3854860011887986920552117268169130645325333998597746940348331068263446906222 3103702833354020505316110971784943836479369939521094582470017476745681073823 1 3064489714147401051771637799124794076933080801222245362116309119322078940923 6725389185856588445336912285771460928111555844311124253257595692860400792151 0 600710676109795566077549970103488575821004360290046391024219823682625412611 1449008786592669982053749263853971718253966809964723036582812678689078446335 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 0 1 -606462398697491326903327665417707941943948567775472210291723915354994420019 5780019096733082304125471800002969953138452315868332038372938950933083074119 1995661148456756946506935896941713460493725396191145102088348230167238913533 13358686785 13358850240 1 2588957462395901329629455128956534433529716301687128504116757602864808815412 4916309542773858878148961632085174180137102798552055665364002205267223276048 1 925767200759285970875901418248706587495201670224389043853021380238534540144 2390868596131441125194162261507460517734388191230765307739012179154274180408 1 2043555524306744933945756431988268127709886574874116544338306850514588398175 1656522588635803940713700521876431802976537103991666976119152203984353017170 1 1749549391847591531526153984300815173677517940717629848133273118062600606205 5323929554349842310012789363633042149276172847308990797908925504704799837000 1 5755190314719422234221591449902557868428451238604471341561984176466438662307 6226766340021433096771072272620669998352337059592102158070090022483709611587 1 4938273224563719884644567137981245423965473167654447680701015930086313972683 502846876067373883675200498611698650025829059594508260020934126282665604666 1 3769865149139892095663140981945839264424014975462788130801813138651643587922 4659444775170785434229369493355110536076989608429834016895449997518783057646 0 5485651343969149722271051841921276919462306493513852565781688258865189826145 5128114370814593187385079466930558262651912049075703950788795883726133379469 0 4895056060907142149210453777045773034569584509346859439106204346628125966159 2408938191151297696561282775517803610291486200992729801683150801859097104466 1 3205742416682377059424221978795841334440699444572388010251756750735021746222 2942730098057274211230907824698513067327034744348194025444107515674880916669 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 1 -5378392928343687416802707301586245003388510392637997323414878080205311634494 365070989530760330404599358566146944706476404935947298956631760777318696837 1152425057107030573316705564142254553338422984608411982124511443078402375076 1924201630 1924263666 0 1938700439249171872446759719812809481687788426757589866690402578426947376100 446941742347141511080641550293944908161810572008372314246162212657189339471 0 3030202116099421900712762884879448522510164577290720451957116275182895602151 5944409854296735755041907956690943297510517153191456913513532995528986181769 1 3972880501320609494307653045727057833632451467007587033739776750335470761106 6031025573114745204384744409350094862683067887254406292117014669982379949680 0 5036479730280921493338757900843383271339347321055638257077275454864931437421 3742521762279950195273630601017856594260364525932309043276413831792754597255 1 2155043914948389671341397563382791739802273175868659175499809871228957326646 1481049877250301978568335206092355647361568120676282144037951218761666005404 0 6180534527232462074516837405818963603752936172878424002912421567396707064756 3649091334771476274130842176471637202586736800470529466771521527853836586326 1 6981617075472715992006395545325949293817577581994606462393639394283705716252 4351537861074033993421552834215729370058853035553275575498852344295176267766 0 464073266882087429609467029371567121567846268781447105220986228406947903490 6356280106576580584719885668201438663413560332327373758234484932513415331008 0 6059497410248767636887175673295835610021962186124551824058839340626533163488 4735387884073948548969320984370775942199940159190669785238999442953966536434 1 6360792660359952407575372679788501694338988074524531219808229767760320497675 6730241175603565522985809272538863008567297968762410552197761108336583731988 0 5940656739183043133071848509564962156071921142498041739573707367193128697746 1259002160347142241955724053903388788861349960393893741639742439566640517315 0 4028030330644063383005711853113732860575448929102665188611205817186180403383 128753744354237368475564129151391092773207365977723302206073505336870312832 1 436987153473968357403747465567489074694124289120852241479741144152720826222 5175648649719760315076885935457316900620933592922641967314089439863491770219 1 6343895426102395610690241271511911098524137797727993274975279337538850025739 4833038535833411771637799318004650885481395464473198428006676215397345560333 1 2667554257964072352852111346537010491977274846916915134682184640917920383695 4814133523112851712147330356655372207531143441965077387952267004890712536259 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 -3405489700809484284578003376506322904477709489387555081448760901162757438041 3685676034628463561618615344286941009387729344797912159695711363891051929139 7217641849488435579403605382510392673282258755922498462361449654260033452231 16481926020 16482107580 0 311921285860460780669217416827011834336836113997769122866689556088896705388 5602035642457487660986573449464122662586047728273761478507712138915615194744 0 6814489318818263773092934201855526439106873190483354341933005765554555634668 1439028106105228055782835990025026021841376910441425415415654045481801675292 0 269963941684887343146298772481235950660612588220604945177658357626384913186 46821001899097243576202917198902928732298727277277885555453215876552146201 1 669596951626561209583909186196117558884792499595319698442947044098641323201 3012609761434191268235357994937821331195312938814410109874997119642668204909 1 2286684506102070151045270247020797894175766244281561758978850831085166379552 1685284258132565348741411795241854405647456098485094739834415305983983088563 1 5463022043631955838357631367284085437640296175598798408022645113572987012503 3166757673931609718803736942037895339145368655777399446688951715700208993886 0 3524714570494575195479568558508239736827629210276630052263514268398043168258 3900197148795408678144297379796795764821440646612418973914952218305766880256 0 3817480618017947750923523789198137060398403322012014966922634129617639872856 1662168454748693728199293703878316523360735822781163266050021509220926866311 1 6920096147895048541499798413792035016102840428400978990741536155268290886300 1702300584272029605403100548333599508124326582917958266285757143687060374098 0 1766983774319982538600085636406692394694835417776844993895437335316310691366 5031134736876143765230304764782835119075519793510179399098740988373563036740 1 3325021630354190836285984265800406667986861885564279001699864295199764353483 1870433000871466856397944323773107563848753775537272521376243096540394864684 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 -2425552360979201844957539997148270741741565761888094911528941850018101411170 6381406429962475354542128751750507756461722257392796772346402663358916835123 538915452532077587027942668198721469986808278573487302669234171847846277305 3985593121 3985682403 0 1711109162417338158523808091194328075660415940372393335365583574440224165957 2063901113923648359004892393748601966773156310064076452337342150937876482033 1 1655461842914661377667048378600155608111485047963615909736660821844632475374 1114965056923649294919991422853025012136849988176172404247797154780806475663 0 203804540866311135064205279338212785488211332743751434283257211104012805516 6706031475813837683174220384460919549330050743076986446496235882609581648721 0 4598943085517448807759317558543139874574103667354247312909567690593252159969 5215894347634286493486789422147894097233791736737339907268420568980130727339 0 3142977292451311947858479145372084725987259738146915184237636622313345537479 2423778277510368665104684644067700641759443342226611416311116361044422267599 0 4126798044035845674138749248863883596570217171597409769193084297132982707291 4796623894039142020497064192813290130590762102442769486270417335010006700377 1 7166374358725703865622907129848474984061590205926933953868960863041972498525 4947919836241457958037148985366082157691424053718132803965561698321535721276 1 25297665135911740570996684650620417473235130076916601688757184936773657763 4156659076756868879617139876339596654616115379018725902334666658316813090827 0 4986356674111049948779137840743196051444065422512008637808170406342373848263 2802798540281278085560780372943969047971945362438669916375961089728537455323 0 4206507282990491790014239395968945836450693792431286002188348661809679709261 66484074042019532452851800599934017070545732312239477503352665182564285761 1 1161473644202234724455933210846459163243840000136923412528235549650552207033 4542344473499941190634087226575210218566348939315009409670124856461980031843 1 541596440182749729507605899907080836226798805270994949986395352141562811890 1850130621800864455516877955586591764578106767303447021439320925141695232081 1 163640069797425613178011720592509129691551258434111466205497872043906326105 3115600098334398370817251574903370372248321068970469017442560378076288064858 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 1 1 -144874322475718161120346512621314189786808624749626723453503628861686884667 7072300273824162011155576711250346095484317444706376888452554569835068817995 3029348501878707734425040343158568722031919086346855034873356444653781041843 6449924253 6450037831 0 2972742727234153570125430357902694806139005939355058498243277916669190991915 893911634780199027698059504722485964978194601587331155381457767685348380966 1 2863299401717969350894208194264243171818743068535350024400124649500875230308 5900025478685853345791742449577264881082825480568906243656661654550953965471 0 5097555974886596359206641925369181444342617996248870982750361911125834582040 4876149099791646174785673488087452034399908293258446662105162430517244777551 1 3902712869707953250484827180476909867431198410548292015020750606717857572171 6846188764191726737466736323962649803179979735660350785897873475790101407727 0 3079685185800268947249244596265705066424261709765939714178506069863535647004 45540253532274827386938926614083470498643073038764874155449017946462119414 1 1533271692542718826411616365209385212187315593697729988758152405498885475652 6361135262191740096844343509778054198668554071711422229142510426493898547637 0 192377547071014275147214900668080501796215134929305923075263768715093987471 6224333702972539693212913577302425141441860247050021671544748287404755901699 1 7005082415811059402693649808610331121253606345374383751181689039452943722751 3570501333242935322644726536974307456765283583154722729113901138547947833481 1 5820844813700150582357470355083518172302165640811412261038212051094672475046 1978550332516610926721058234687772077434252155413225122145403708996666649482 1 1728043938179959378974558094235405087043797483173109486916683130911570315159 2502719624033084431398154527596347289028032073508195659308880505014782798566 0 5311650929457286644427268309549507457741486432048607427480749465090361023070 7017005242856882006086444753322140383897656664985494697997541209230771381286 1 1547793094312671368173265901804466758719573607158479981158767673387412231268 3726644860254875431250106643859847470794846015856272283112089807762551639896 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 -2972499324605303790411522452511171153049528808399439338470918620631668854950 4841452681340676694530481190773048389852210476719555296529287823420685439550 5715116029486296517985935607023806419711972669852435377937360264707876493926 1055264770 1055310711 1 1813204860750017448303762728127850995385322600338452766182610473474537766164 1411694959353570100893856326675240156759869117696868173309085472979233718070 0 912113256090305606980007662805724165459326367494372577375057717452975449575 3074128705747387644905341721894534720765717046167439517846092101447309767560 1 4159234535524611898216031448112657332835827488882159237177135698178655108600 3259529956783097838473625197453743097709606681631896532467477541785365195353 0 6921501031917316590602279443840117147396000273825594419753446379397381674035 2163962649495422379901423933755914518752316953457743687763080463729401818293 1 6518967716195526239535412876240092099922540044510226748144287797110833305521 6911160234285652679652103735867461423595506634484779606752406204789560097881 1 332330008451906559549572889034192217220841655621074906449297336865988560457 3954954754216973778796562652117036507508009640168297908480706382277266931291 1 5478315231075342952811159726442333468491556656354602202667650147102949157008 3756935409915021520414934599089436373950222362596427959452123266604788632416 0 3527534574195467958103930969535751782127897212714203504160550110851501831265 1902806061081492289918062517207850618351957146806435104648215335008674123354 1 5553519818309640420608090531408264567705161555996408586998006323181041876242 471747835952977852885656347831872188580462395688578152683244623934384021014 1 2727206882123793933275435244996398849733757439739621795507660608103332481471 6223585642670366028897891208559798819634089715976718086297443075686592764523 0 5517092410693639187607724142245599130136848456048761921634121094461620380927 959811354467910133041112547152155923249022392849289637814029610751400385351 0 6251105421714808717340969741637791989674280359427229336518027239401122149690 3144253218099451854358241793697254282815157695281063128400865245792581919947 1 6640085835532061124625390618324627963746315050661987594745723326234314656526 6850324899277907660226346915852087935677879150895966262476662402102856931641 1 3976063325029524975622877518952453219247994073746486141672619081366988980223 1113371943430413296699004389601841184720691843086249613296135677815111482456 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 -901760757107359036107313787889279873097718624059618154742476949775171855068 1411054669930673561934592081518053657690782402877144551986935075663379848861 19044505106005340979345472908112013392105388338089445112494502025247633415 7604219503 7604342826 1 3101457692014337990872680248327388214143646666606903962661410545124027667576 6921026514015889744666371240517998061362604073992127639602449266699077208401 1 2169521448917887934148044164153983215854300644005374230127034431370516543185 5063186822636666967721918122633310804017022313363297783574492379249351184110 0 430229190036660227031811883965842836174313265917844510062640676925091707833 2837418963895132988902469688330017529103481492836392119949110021094588516692 1 5809526099960985628643716027833618589631996092952573907732393320480863769911 5684529775441548642125740303178997194070249365285254686438108227289273812345 1 6422957638524735438616213362998376046746417538207870849843082278179861490608 6387367823133272748591853915055070879132332290420016709160230918581787773321 1 4359281388292227406236579385655456256942292462669702083284288748049902588366 6770866793080045906736237050540651163490188544085870340462107452084600770970 0 4249547174606107549137018985667934478810470770265840552416786979350606175215 1208028753504286700488079642247937258108709038271701419665800752708999579980 1 310247369641768659918459932867649980698570385228804622040064806068124317755 356904511685366009305446023421114019655673741595434806590633818070351369469 1 688684194044607283527613029902923967452884709833192839529495349318824083978 1824150884673891613187607360766987777589757641171522816031932036465713488986 0 4627799373689648529772568335296198196210797845699879108193454838710223592052 3587206716163335874991497974273009566345694515160982476214677597636888920328 0 4846866227244643571790397454977175023998023589552966423969057600443812874451 4990012081555674655942045755262033315226141660133035405819289678910235583602 0 2248335123033686100370389040556822958181283766618888230977602598982922694770 6606796359263912948284777494441332609322143633539417346570600596797568145563 0 258703955954202736603435064550252515743583642500042967661110500285521204030 1943121978191481054463506213536973761124324300009761972280220028756931832708 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 -7094099920360156126138523459870393950555275871799062942575511255964791322632 2042727026909490252776458236406168251682239520032485810414960646550781247535 3496707148274836520569164087260263317899676179346183768684814763857702054688 6040488741 6040598655 0 4637675639514561276594622435119536260507532628846760303802698683377081221411 2722927304474885806260010775217500349410911673961908412635253590817407288443 1 832924264680248760899084072044795646361300403941746691063176834868283490405 7172981144070894380392369127305359689547317002937446009727889019026519714893 0 76144847000938376690033085265677844231878836948486491859461307376369514282 6283118371744404191393390218813230809592285482744353802887866753728188234087 1 3654951938630080288774516691182478181940835477051132031457133911018090215816 5829952216194426062569425102841525826646291471867514579667471857450986125063 1 1093238076378024015123422781783107548549535893563987569141148526049982615034 5492984920244915680060706295183793785808124157156564310955104826508356183864 0 3914892518818150727157867755802898045421936677952040437518605798398883125032 3083549970928732970855298217653791340370425168577465105947030574006722732510 1 4313294892184932518241319303504215764333001692312267723780081406984569616037 1128410497368833385129057503199389361998196320851070813800638823793640060780 0 4671871908178213970504610827953962680579150334732304393602492736883420522666 771039137090999210523734362931375489850643927070391069739361917845146019219 1 844010319955996191265566098162315816859082831265541623377770639978098453498 2091319020081909025892951331178333063488140582584716135669538748674761139760 0 496091875206180452974861986709901251311307693042367809593737394143558535497 2167390994182747334774685928416831330411201080643116837539545633560076755314 1 4942148588316098329271493897206913789625714805492387801705210294138482912600 4620957965619409540111023851915954426354517867366476101394349202734744240178 1 1233945745847570275184894084510632027854257490624103522711035544902574201288 539577981112935813135740225241076023951806995537255673993954189732961205925 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 -4620514354392114592915960528339770566728674610572861891414617847407977265113 3129338335141252772424001952933908328509211620305618788504839329027546531581 5019162191489245349284506733548781812413791034916626248683590653602096718385 12512591721 12512749915 0 1819715293783106287220264291251639460416198757379009954125820051923674289791 40253269792564058139745839963743890965226061099264134095056756009000370505 1 1703491326861453899855837275232621575837156896865628070257784276628200506356 4126282512989816079901642562147812618219348642569671600166948644826256815782 0 6778889929231253566236558780013873121336752078628150987808245214177038969644 3357326111527611750181222091782421286917213565008832941741902537019788549216 0 6829408280527345046814937607293074222652640593197607600986062628782188014675 4585346214936470814852391807628699115935622951547653131620302849479976658695 1 5425161244881689855197647399660081736482958073485257391259476427577855166529 4641212648355938617628824069824033916258852441502685149464098695704250420310 1 2575884055240205274013957070740578399331266069483985637992162004874602948447 387884800902301386631659971876415152207518384208296595624921548190273813680 1 1543640190582142772903226844880341834801624256685801304757613192648991464446 3346778488361473732563449536512892376356714164801167236428841200507748049209 1 1242540098305616545157447270316766394012813650933888790057371329622242924218 5962792348966802681100549238278377865229792032940284168071969967497021724520 1 3052305775135289803215255807713421703611539131341920697352312138427544355195 6509207472985213633286836701524756647487625658767164798484862396984924985497 0 1194698593755967492117579224723772930579417122782498605336410570245014029324 3160212002189670614660598583979803763413039131735471604531121967715650392515 0 3604089377878314800526564657630753119882007204816571821912269317264117645187 7175462941426119557740656598510396487327094522200134795931511645101450919958 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 0 0 0 1 -951212243173418086741607686829854319245548901685144922002106467418696742523 2980399954945367505331055652052022054203024144533507028580471941672481199433 5608558331906962246029935954948893002441575926644991100591907926782713223176 10870972426 10871119878 0 3867983103838798381294860812821247855506537589849166285387548947650869081158 3116512516430293260915519373585919308062420971761732775828633648101448773251 0 5226696424376178280139780295297179615284526862321132446941136904658942506537 3389150114950742647820984384322607487379598318044882255233833746406128356208 1 2801507154978726425372074775982972766538993664189544017779885418522970139638 1756951885890334697824236247329074187563233077288249174567152123697224329546 1 6503264468529704558722052288725391089667714763742478897219884234845034080664 1661482995431139275634396172982587868489267590577543403916187610027525692565 1 315935545671753520626569457134196194579051017604024222364659393085755867869 3210790813030165140999365547726312909623724983507000254215043814561526470944 1 3415462043588865975282712760648231705457048757660870001667047918228886667722 4007656257731721383683295099316261977833518825341726509472931251174059559384 1 5438318926061485007872061359393130398056727685700752986438661925794737748458 4192109037884848735027992885043898813328640844674258534189456481334275756477 1 3127093019425928467450886605616370381302828161124070577531463192311008426439 842338629133909160419375156766349431669322951014043712117182152927508332563 1 3902825007188796778658183080657926248204186319563655892465553527843157999572 4779735573110020373329980775813575136396987181523984951355105754296580643768 1 3317886153594774951748904270048753517833244936315814799299367914424560133479 5941308968268163776969309828057838373349929642650310968768607487823441099708 1 4836510169821396285881859285453020657408360400380042114742068308393516400268 2890916201886136596887205143064417296593818930481230602825479012791554336640 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 0 -2226642056406332180099529476474349702947321913293815581903751431597301013338 318127440427110954295024621399637918089676144582901115733233328393538720668 1982813968382335341725037535809174838721596717267143097031179290360716466991 12961546521 12961707528 1 4544208669582703892125222871217341610947402291782906780877855436791675151335 4467480439647110982043766487467756264387949959153460002459863564005526793553 1 6326113362518456860457278185240279948695620703810190813561749445805828581376 6752851290274136702722316482845683817720253542900115791040740192054236347580 1 180439314195216949029235240194179836991271681174201443303540286679582374338 1690695713340659463210606489037097054252407517198581933687377902724053924040 1 4430801705957365789455765186363670097998476682369106767505134898637192753457 300731755887239167062918058954239574271493489342663363273864087160810028501 0 5571504070658946435275455277545959554530429632441895123508448459229297215892 5042323532795529901291768858623678401431766974964514916107255582792665085220 1 4729782212783810159941882756774341348027101022071270042258623045552845666827 974866288432569663892106879711072727423657929038967014750234136160994361534 1 2462673537911836114648515956007790603528107329859159133398454378710529900633 2513307844623541565779172083531932572708321931417197930569485168945910770375 1 3671656124000042631106688877367925529883709529261639811272012475555694607438 2769168264284805915828784519322723354060982404401926627269580806453756497909 0 2425518415620507149810488357548600832522234921261315758671339536159815843095 4591138913782920527259761963443653172872420667327436956600539580627143852506 0 3170879851466275349657212441515498070250681011479397535149392808398887154328 183590928309114103433213509611357330380597129789348066752198799514522544106 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 -698754417013444857111465485627990792939108765562906511917074340651390792584 1809967583965062981338825880976822352673784629811970125848084699303262785274 2489841455794399138074986482175021657554370362509256086561568501361822895806 19598535153 19598733136 1 2291465809668504416713783645645029031337264120132326010426984443544734951850 5417132828148808761747393200591021842621552791552324066850910258611131727832 1 6478886204163595352772655041043636323135705658550671130411761289486845667980 62442703615699825283161071673540695293051267222755386382981374241097504367 1 4189592578083324487911970840795246998543618586608793642115850581563628630794 1058771466008275284725338822205966356538489440239052448851027107419316960906 1 4601315098944901206129932385886896865460820211696262663189479287427715212121 4182907862188353903429317991889739780427177887607111078531238906142379591542 1 3863264801063498238850771708355987161015482604306997785463980297964376980831 1768392551070743576206301187478962347231647642656227952796269124824747713968 0 2479102374318872503937807169694294061963627613386221290479932036325282596040 931975420440797821419568343535446190658687775952315621509748843827451073590 1 5492507184207704312595094994648672845310131439272491649321807932932964638091 3760442597798834963411617651933521813150897476270567555890766790919500499741 0 6295292003519219154647109469950961131952940783154346557915204578875155912062 2815827157113588204661417486412361422957633438802354487256322005739956776213 1 6103493440316137408474290634724502266177805673943822839250969320065813900888 3669644230453190723697333501119068214253738775464575066411950141276137925688 0 3263357142581932916681542629176101033397555219429250039503432750975932467040 5592207029660183081685813224902088465170117491427678443881425092998332896598 1 4253011638262720864230830152432576534084943460126541901499139599100510590368 1146857979276675086792626062165035579639717702662139747044312345445575373132 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 -3214655522110319280939111384074464953284676604529490713542238557503928069160 2369818190018591083335712797705870982938591969173612830571157659805290997010 1614983726834539260626461149978747320002693308826330993054093830055356165205 17969245525 17969435100 1 5173591113159372701233235683741947111620510957281910904226543530024897286547 2951261482097845696739053869458790309963007158158346083532588040373376135510 1 5312546607107844433683339319055101617476279113492202673758631011843860052400 7226627093249196639825689934588214406938376761695955126424625056429414628825 1 588355555212385604345310045372789040540348878390050755778386015042749727905 1491337158550375821347792697878009705149778877108368237709581595015519361149 0 6280287219619057020147881882832360703140559498170375223040110268676987021033 4289803753455718230692957619146077803679684671261543391897399981369342132431 0 2711359250760485796084434555955697946554138325601022847914340698141688723788 1496724408581751808850347977884990861544691383049650637193218111301501958504 0 3533605055361223654274613791299669320476200622772116054749845388793208994053 2577985727698372288509986641569687260463941614995879132361538050169167484128 0 1061999022939541360350427719316620546111320674501553447950276628227570071723 2361487561560103134933532175424862229093446402925088917747743584222593354069 1 3660456267596237380133144455100157498891924273460387575886016022735546397842 3894084129439318717034311013878820710158283125968244162924796994893005930009 0 2359785513943929696629861284649806840377678218365788280512853178118838362163 3672121882835334164364850030900978949492229236766273506373258459734102092704 0 669608232809139885617428483431464783744943623528736829516785605161077658455 605030135366023986548814018823815530651797722522681654757943741694121463392 1 610961996683823342847432748670245229189931288994431473943849894029693974179 4679155937159915780538742102958970404823744339356982847472512204638530081570 0 4954118771740069233454180021476303045945454933874228549215641901157120813807 1218159010811368834065923421831385722366744274385747812130026718286965530524 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1 -2398408753842220173812017635492339037663599712968985837678071410984139326150 6655572169167068799402988500257100695302388637025229921107746882568517824137 5678213583055460902004949550632081303753025016908209911039389377745265429619 3000296916 3000374380 0 3460419986989803611878700718348552923392474620176246347760730651938217439870 2094808169642524480462765533965870026216098216005250586279566083093949611643 0 202350518312347282362739794841819419982539273558110196469594360871579853900 7110868136185101199910980252943566653183948115025027139426315144630140756833 0 272090773326009750601397745024188626831974514621734968816119807167884250242 3185695446774607024617040383921703273860937198581473086057723818531571181690 1 474118828760778853288021774349005348601907278271328028398471593106842735833 4482972386539688896720496730765714573623450142622870197649304741882658343202 1 4855434704650540956503113568250854711996154028692718354014607510949832315535 2068507583554454470539974855032433929556308022488390864929260050687654562427 0 1292915427287816850037808215698395227551663058319576787248791168528385113370 5818250498419277838622017756012920863785749516008374304479905019108628738048 0 2206874844760603627769119650429337297648843549905917674574654227985630104538 7228276044484616023017599385349760455144815631814570776618514751704539880001 1 4035230749195119329755546043151482423708909836820854903507169481722796102354 5006385476489586842999395195392687529145472463836650706563156385929086323083 0 6846828272872613849897460172292935807156809690684398285703420563105818078973 4581244489549969014506464205009592307873076613326963990056597527152202902550 1 4246521488289201373696754505714850145621472561724898239005398925420087511238 4946195890547324281427883357262971397924995612579989436261224354446714720318 1 1379245291240718618278549568017194888453210078327534222236150103383884189542 6386479525296938434536031710151564467873043190473819171196262427172291116440 1 636337017767903855521004994847573827015111012817337782774242594198209162816 887321707190165518761724205170388431391094422979710052592902565626708472233 0 6944802912520851806114106814917190479189867623973444947340490659638666761169 1942812298608090540700976197933568559562489265491263247931604202099085869715 1 2922727855009860056928643434698986574921373672504606229994676311020856601633 2859557397849835967555023598782223704366710997148190910533959623974845054379 0 2048902136087246807625699466323556893620829941430340518355235580107855455782 89900236859138416274515200082139471057454295209302105959801617368195576303 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 -5769549796705393208330370603799955653620553460941751351189419043655162978628 6802591591363293135637063138940819046707801562484085407075738949755679256454 5349260880416277342900817573274311996129372273310678096294000724592678144963 16068418278 16068597546 0 5537897363646065835041650776996622411777211795029989202692701872914700156547 1169263088460867333488299502226705783460634674628656757498522923138481909062 0 6725950123380877425939762779917466802322961557193468882269606779300585912701 5642265821643273853160396584202434911910407636652108506386210848841695956640 1 5468129235382102382053110247459298443423170009027220139827974070284597362288 2068468455550251248656541904506499161595855271860446765004333497862755732979 0 1217161407637158855235118543241947949980379262619222633975176067972858140276 411359537718872041041436165370394699359365629674454370317554196618797849521 0 6021412798840332038249362516244743497845284651040818536896292832363313648792 2124984754609388251095654115747862429261774148603607432385622797450086190510 0 299609587933297899199501956816018902371093974897215045211321797724179248046 2875927452420677940019236176313465953629240163595708247494485620084866384065 1 2220018529235486036367687364392356176139119848827097357460472548034736383975 4919619972093897072703482470325260378186003038104992606700079403030949008941 0 3750835918730539022381562158368085252239006953548757687980319873641871802675 600993611628591424691654918185003770727904635292862817381662775017574891491 0 5571180788995832134794512096974306718757993744549027482356497203363094019428 6132731344520913409945175005109985495325101139169332069840450614660463081272 0 4043030641376911757975320002186167937504175355974738000774897683843899880077 5477764214142626071383428564901054709922189769512371686491328703204413757355 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 -5810125673217125792363812630850380812151141329144733657234868957560377165859 4877663849736777168101727097341679876460790488462893309830016165534446143522 4109010247688258797682239064632038859051128144915990181859196765327050511485 12662531091 12662690230 1 2141763455987090165564029861069243486954324665454451056781260815668025023981 4667077789161809218714966685117986911985417443816525936109998406226033470083 1 3816271293952134006008882133971712807849938852498541327997124155317728604680 239930650543903154104049352462213547389854666551107118826670859177183112311 0 4847350183791773299078582101108067607999102938423864782413063602397432420494 1311939138231629769372878592472680842364291036125070451944923357630574573631 0 1959004670557122184126986165317773979085397889622972997720061109657071304456 4710552339929467777894967333601945511125331081396839713082895953737776841937 0 4438730630577463764264247273737393620014953353395211208636794053774261027872 2527541199750666483006884996426799395490568677369395386260287281433705055507 1 134512091579560000541241295120512347432789943648053915045577037232909821746 2458723728109701109545818944001137453430964737388927838863305572766497227020 0 4432548565936804163898154217707699007534482891793839831817294984696159304748 2258585262949779691160847015249020278743006918755125341659017893999948032209 1 2744480400264938128741662742742221420791364283650029219399595564605923003295 6369441512839070167700745526635950155891740391523941252197649143800556619219 1 5850296666900631876532415647248219819115358638681954172247242151598923483977 5560643872982077388283101650168445270217554577899151565719900360520265738546 0 1644787583906885269580911154752696083381307029259109225106733202967397256522 3690820264000078446882500806060434174371396681200946813410094154400287155021 1 4347079024998122594000938178502818784315403395376759754779862439595699117989 5276358379354419603974632142426691382250808038426993488024330904882809068115 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 1 1 -1264056670639243915580008018589193079891388501247357066140297762279522307349 1308851632129693197713849567370039341699337274517756668188321936702513452028 4081408470835529389098556745730438377513562700047426584839623815217529022800 8811214875 8811347625 0 6044138840010423154961212536156060103356800296458725462878654348333703933886 4714224892527024686790267216166013462106446102392908924940725133264247944570 1 5634371704377825472897995310657185087315626027507489281438899748316947621536 4891448291149031917999713018324964915822236774018723048037889904969103237361 1 6804559076418069071114060623602567650393924365546787875448969971681829950295 5156223520314751458232022279324151456065937561249163107023358318664157382458 1 4432585320131397756579472610455448445525017754406635880089816832992113382970 847197634173434244589316828964261802974403958142846948292528594256864721668 0 7214965772371330271447865959401292672523069577377058353006438717248816190765 887015358172002982081895139532134172011113484931569999881668193739634741638 0 7219110015526315531718703229182878272978602571835204900848423778450971588799 5817176820873179298072622383523312018937713541274094569357145183927510040556 0 6688404354680860347284179269287124549580211640079696416857127613685133305281 3404256198858084967502912711051092942232371367918559632451413402183634785203 1 643791969176856562057768800193189334535440023710895857752389126479438086656 330375579117298327224845884607923154629500932157170930140393257644303425080 0 964150421300840458848323838213888782784173883850988773588796421096156098512 2210394216109655264191636012860118767265675117445254129242733380176122380551 1 5471681759435721715341134876697159248039571361174484465409354091019761301024 3199610424437744702897078713083200370559725550142069180340472964972557156630 1 5043434271442595219882935230029895649830610020993085721887281369496274526647 1503003800291769776685960053342407595504002989328997345789781149072565254038 0 3790932392259131961951115069875460035009643894512899896239240576907281049733 2951407388846313073360856896463645596589930749098100555720685900368744433548 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 -4522718044753365963492737580119033260345501242548022175124550676670045133624 5298637147043744660979155495647833729152056170396167471115751333138106856309 5980984045812882871851428228134362401740753591620338016193081055712769933409 19410508965 19410705996 1 2061194300851284439943756114790713501925398080953972745109254608577018111836 3413692924334985127748972167566875566743953183386334092073716702867135653755 1 2175212220805537377605675189203581581209214365292577457741425173523560856462 6197609727739601273877295707554816281668085505980652980430073268699806025667 1 5515198382768134605134684307383435419367479927090775728126839876307426488934 224268758431674718174590742433648113089449205050861636939920942190740909516 0 5508293092110281373305120545440268062025512869474508978608273438757300362553 4352470460612029726982462009769491496477207120065090153125360956986488549484 0 625361582930532635935239629067950129166729884149812564952843138532509364087 5121155122632582131659757961933637673047914228742643545172873898313494034109 1 1711845923666833880705197090622321370495913248302820293714143803751198071329 1698925172573356374856949201218997508540545261604716278862630977379645280822 0 708548782245402245641945589740639152514227693037516924925463660399076743806 935911734507412320167418415147108828046464296077899436723276328079311980667 1 5429415686307311270147240043338962576209574733577425660637414701924870760248 2009231959581826407638621251579336059148480691866888693602272314936394049880 1 4348093844299038281854805368898514852054097269725334517359718799252301734026 2483250113097733014034397613356665520789528219060100021899045875323324646040 0 2279539054807321286918951830972129208646965096060254060761009798848182048020 2906976226273835321822962388886863490001429887440915660596006489098107207962 0 5372166020782619486546870817607249352545108557166605349412432096463215567092 1719660978613684693719625499968436195940950763687678134837977068788906423135 0 2181344699769824056303505908269880178899607224405565367551217658786505135905 2460360621412740659626390245682885065706822148884521958407178050779981805325 0 2614493830036925136726102638966785980841833204459808799331764717957106145012 2614493830036925136726102638966785980841833204459808799331764717957106145012 0 6900187291411525388526666507760380048358426442323955213687419225969998634531 6900187291411525388526666507760380048358426442323955213687419225969998634531 0 2943117096839923716261140226564514294579451607632091614776938401097807740847 2943117096839923716261140226564514294579451607632091614776938401097807740847 0 6105476805765141619860837833504432576745316894730610132734675485955736229686 6105476805765141619860837833504432576745316894730610132734675485955736229686 1 1288583642100570319859184203330665068659584170426793619235034945694636525076 849775847171454878550926179136234313268559670001169444550475643415299666878 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 -3930946481372330374902530778655193109288627266556260719090403689115205880026 6931756814904834121544077286291912074336112728758492229064251213876703823780 4299941634757593606293325601822635261225206211313347033431334219736970087055 5728406166 5728513203 1 5904718384726062555754885856000012142519075119023298989182606696858087280625 4092826550863013978657995250890951048169709486391534809377364215224487246609 0 704922858035013112408157874227665689842120165533308540256172624987053065765 1627439723751882969609837928646750197590082832065374560181453924577523946235 1 4879436680581755348167117636019168610646574141585520226305624793821311044693 6277818759889280350564197148498172495702658786731574553967556024362447742221 1 6430890040937024938871556818606410746151038804829725071964655790066236425224 488522112745674533957613367848258054546696222282859437010119210785133040799 1 3620091161683319843539409141318267706275099199891408401401380881622013226454 63676238113679549036574036039492624325399368823616112621549947810737177169 0 6989656866559995521307740735834687149877482501427174883212277237262373447647 1189110036282857658941112897630613246487050626544605701894709264309333291304 0 2458289100490210695399266191703599518449353738499038676580345793859838160448 625001119143200117987337735566298838549628775183984795132674460460372374970 0 4241951174868657174752456284867728044300613295087109806245862414141903376943 2569103607808686435193251620405635879262464979918391529729775691095042710564 0 440762013614083864702690325576740568868073824040830364972813993209590855904 7135518748396379962292564427877680506833089739685135727171246196322620241956 1 985810401081073983330013099760338873796265029844676803612342709256841550144 4473752583062219851802710356245416141451458613415297651507569172740686312314 0 2480945456196614330103532521953201989881252061956788637201872865988558651559 39083459107935642933375151291211598966667982631753820829079052597598380191 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 1 1 1 1 1 -6748102018287467144189300975460303976241232371415366681268617176713375470183 6845960823117590736042987582951565080119640935927149724938704334663696674968 225650922801784461441549135931607363587940888891924713933418937317688207235 11815303503 11815457226 1 415915295082784177090180365483286590299857337352954738296616186716274783445 2225675334088164393942427695303015780921035628321358471773228598933079538112 1 3009063134106593098910912952552320647038573987874550000223850935930383904135 5381836131763843023948639712584683596195338969032692067544360842801085201790 0 4241303422977352214142690558514824892208374844752511402507516654177831970263 721067630235753257761956165688193248567381568654140134535166573994019660377 1 6584950762019442603796026825587030331644842648653780468845313769692005183171 4299022135112663660649495260020624771705539820477053205077837075266164744795 1 6658564535545540100424463105206713067485048544532161130519326057403891730079 3090184175878590419750484464484374349286987309783461921439506774216029056602 1 4280462284564433718090892062148512245489950432524065471893959605464069148004 5721548937105094948007223571422096553224249002779547192307350715620259629893 1 2222592930562307541642635160375645185362436993729449200896107649964462407028 5107490734511032676350772087783947268013101900283746682527909851287972918385 0 5305950520405071207223494951004668338208849423003948261886175969072485625935 3285171839182356528148290745847920752869487707855975222096476827902596141094 0 1329495086621733535409600604089037803963001916646418065913785731807801736471 7151686246339419825986675119117126630709637458476397613810836611725878235064 0 91366484984068252262622425804969450083611204782420108204346869193517997520 2553465105673099990379803357958649864350710603346619825344773666356363905436 0 5564771526012641957494770172621925851699449343243385205105611583776544959155 3945673304698421363017125804461371394991696600840263480917981332569836489084 1 2835714461887112860579122266911052165801125498332061002036384376439068451528 824008201791352696808249169822774607430191604048020118734283749836730801056 1 6305321104429254115180202893886991358890524221980844740462586986036083382297 4740173989599199443966106285580870214678765488296985411344428121063784464341 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 -2447578254299427308244151582333056523007812849154080274967349950589370229294 3989176963722518837595375423983575208511084799606052168873640299604765943635 3425413222465932369707173103929363985106196825388166746513386508808268847938 12691192221 12691351540 1 6729783239142674161090314831940919808516875066942746976143402463865936659107 2586140701149110414812308178114312399339114558380875748122486465727979568627 1 5531916213113028226286078951115210990980704007007051355372567857153042853270 3247082130617435941924836965809575993372582259617756952225250424844089800725 1 3188694856058121689076281209083241003100661384397062928750232277113393716258 3891164487974049605246256758418528690478005375174651341549471246433948695924 0 4283705496461622548452663344031461120868720154989399722136793327728536644116 5848895837605209423765356457004119895740396197087447877574039210898344511965 1 3006456617237855208903011025135410012027485133972613451239782069677454190484 1999637441350598970452805605519750593834772840790898189394264808812864642907 0 271741015919188734260772412142747265926568422591277722888748290290738438264 6734795755018026867093983507800612168682233082252093552939024029481083165535 1 4333185265122218967067253634721988955340889372204883645996841767163674128912 4485019976820710127590755561378654873557860619327674576388995495231063327970 0 96926376298631809621851733364839521733810775870521461570911933174423247375 804287571264056461962444757315738863249753020161796407720013525667051126374 0 7065803066267445547754760547690087925102569283862098052660413832984839667279 1946276378422205152139705969444725740344071326429473675480488105207774876702 1 3808493106599020657913602528079724614265536674338685593595628297658413229014 5916897301629512136120490727366774878519276152201714434953963102370405912389 1 4347079024998122594000938178502818784315403395376759754779862439595699117989 5276358379354419603974632142426691382250808038426993488024330904882809068115 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 -2463700814342973183396509865982512678239334017069515147842572775661303523838 4699821490171905612376284880705943995914886991117393475834717058407825645999 5864298996580026572839425209137322116509861525819190918845502594919475587575 6045875703 6045985666 1 472056529747691954993486877109743610666838980577597956199062635356392677369 6516956992486486558982424377935879929688694358197067970897735671919413808107 1 3032793554019509177694362309372640375280593941898768094035916585975699796946 1353247781628907275024594221605628098174839667737112704248785407527447910294 0 5710397087643181005265799654475730162284209924094107820362517715813235299278 1120272234983431452047789000491824894339625191082197717117052133441760320467 1 286935573525057935121808296482504058484311976918561734795500130375964994840 5019775041512522803413419908376272375433131906695672570930973946369743646919 0 1404164033061280542121704090928454487733777499849256151952795593879850444041 1368670659694231634877504655945255443679619881883793090737139920631512470755 0 4616989270576460403586964328579235058924980039097862185712818370320016092660 1612990631653788543347501286825125645213604226327042971565330786810672416890 0 3773202667371766255689045644883867594901051803571781639667944704122294223550 1487074840448876166036254054321085733688045614002146887674881354027595127279 1 2745456605245063222709623213278029021918850828994492366835670974091154046489 5988840126173985340599282871418880501294642067180114016629445939871476359821 1 844010319955996191265566098162315816859082831265541623377770639978098453498 2091319020081909025892951331178333063488140582584716135669538748674761139760 0 496091875206180452974861986709901251311307693042367809593737394143558535497 2167390994182747334774685928416831330411201080643116837539545633560076755314 1 4942148588316098329271493897206913789625714805492387801705210294138482912600 4620957965619409540111023851915954426354517867366476101394349202734744240178 1 1233945745847570275184894084510632027854257490624103522711035544902574201288 539577981112935813135740225241076023951806995537255673993954189732961205925 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 -1926639749704992931696944487200968973869187517694848502406058472015143885328 5913225623732398246643889396165888888458316709090096859124467474278270034547 6247017744256406897419904740967617136315491077603431122567002391501850462507 6436869453 6436982916 1 334663041793738816685430317876546828001706468225599904800487973584925627783 4966321547933432328945847846769699434594382978585038719185586822679078963596 1 4132278715056390344943313205078135615051569667016498344035165737543207721506 868164690563678523105272249337690329462054024708832299369847212223831859109 1 2727014665428786442533242131989684989767248003194749184991018174205864656905 5196756836098360718857535257961000238530879135032520415460909701199729552302 0 6949371405566309944886767577867441556157279369504754393108221518931798919744 297132870163502083362384052852968544532886972051945148035700561594714375173 1 581236494265257540640919562666503591048100083745447659657211885343730866098 5460842218772073924953109605887950858926885663479436193149271044226855119327 1 3925674924470668635149530531196112218931479158440426800837999955558871434056 5099212453294893713871398707193401071983886841659394184175110708372532806808 0 6373121323167813207375812985807893814415376340657172362390583808591561868865 4994365811072713601340816660574265506548694733307638493091429718334463439948 0 672987886653666991012840745614864407916559223092461934314418634930945667225 5891477110256576129500396691113966704551171972411453666797251851318586932495 1 5820844813700150582357470355083518172302165640811412261038212051094672475046 1978550332516610926721058234687772077434252155413225122145403708996666649482 1 1728043938179959378974558094235405087043797483173109486916683130911570315159 2502719624033084431398154527596347289028032073508195659308880505014782798566 0 5311650929457286644427268309549507457741486432048607427480749465090361023070 7017005242856882006086444753322140383897656664985494697997541209230771381286 1 1547793094312671368173265901804466758719573607158479981158767673387412231268 3726644860254875431250106643859847470794846015856272283112089807762551639896 1 6886785709249203809164917443164695200745450692497626405589893321848214706294 6822227178939112764229291461970509851655857330435434115564334518909162250058 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 -994710843602743427363033586428539266711525073179842980096619815331652289711 1724066164982647051903418834763401804007515637062844762041074249942015911629 1222554929322277544072941424884917408158836815327694916248038208890343970148 12566910916 12567069453 1 820175044402609673966173744796051397582514155234228678399156553317769193 3790036769271128259030501691049598111867026198641148544170014613159708311950 0 6568371298893699960030118625271944924897829285161290511879543750149746803746 237548301086324598236915546455551657060166803328209283585804237353285295359 0 1770512935109025285266117017263560845736178637703877811677668006541362610250 6397375880569675636303063892950664196161240276756792116333937404210703468048 1 6234049458681814111935869610643227760957793787532573285206002819400594497235 2557530067855621333727153870817332899585792139537073526330941745008767382019 0 4643275718172028445748092916783791424881422062153366581281431948609682163737 153049566372995673070928326328524517695292593272537920388736439831724618319 0 3553418967159371891231629252408184137529950019018441481875425114874190771625 6789415929362547689920582463932079244843663310447337862413135676019367820972 1 5924518483705734293738503748986071732532390342946616544025882612511405182757 186567956855465011233378384569308847243574699097888246850555618752898996817 0 7107692481677245842110322607109453941736860674690769678977082898966519506426 2635526383216203338319775771460899262352610301545763563935740425527463870237 1 6031715997930419507552511890136560701966422904305034582974631016944915837199 5327163814099554095567290679860026023882889830012235883045105984002351078339 1 1023843397826412790639822803208890483300229417852438008618062632722777495397 5822205507874438119231471620233984459686507656787810944592294071928939913779 0 3604089377878314800526564657630753119882007204816571821912269317264117645187 7175462941426119557740656598510396487327094522200134795931511645101450919958 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 0 -1100668438306109952506443012312319285549759545598161962048444014092992449135 6662116384622304285121744200480938618889141180067558574703511784681970567557 5912447059807138198594294735286356877565251858414833684986943571342951822622 11455908661 11456060028 1 2400930153606334113368426806054975410322876478689383000304603152877372088657 5186194794392595134819214553588338382285490857837741899069456545698464771875 1 926037995237997010062515965567697017816337080945064844806674388269717548242 3649596642922358858525763879794290471045690288953370697609874641679256402607 1 601639890195413815227086405131255789486169667074675736627470726270969659938 3625533715868531650512568842243156771009946598994886517943563131693275215415 0 2866479030999286618178458865120597134374627544661573260939378879744044780580 2639758397307997739041493345354364887940227002240223546574274970248411084170 0 4027504524653484087342593904362632112298774855484747602821710063114983890746 7216172327837310799880253684999752970269218914979262612998605059754838928967 0 3391689486791940291858655687717813568020195118989038083558312909335705508225 5531410229439108973040683065164541503930554956809375836964064485012800951861 1 2399591486616219380774176645300370791135440770042843762699266632167386634763 1645687116141675979780152263772691962093804562695736744244449196089155963960 0 2164924680611517441961618341305577798478319075491576588355108666075198695855 4247916261138421527135117755562478545917468783486701416333583348432226123619 1 3992807277100322975545309440601228259745261152542750464432096510293822904942 1360445192512417059160125250438321910500071475094007796700358097732599199369 1 446450820728140407840482338990701806106377175580739513565592804661811101873 4584776691912595339770281881310509200924613489298450704604508904508117643197 1 1099657098322510201084875510828779527761256258938235615051052653695232303245 5799872061386098756571929304697188123249686927002328074778869891117251841968 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 0 -5676352129657384827948811829280608581360541626959129404272600644406948684144 520534567886482768942312521262837494900770959110993254768501336835466566253 1845212133544058062628838357379468866882155919208685147685079914776667847095 14113092021 14113260028 1 1543822219513472309699366836051706733617094837727985112747792411271479953376 2720214397656092022466371991761557541358440827012048971233263260977795227397 1 591313088725942212327299718646202209139287451703626078362794157111252732392 3889416297954448900466424999069284676442122573940163390127193162680996435764 1 448552233734401070935393473111010753926041885181664129845354380388744733852 545378444846997347285865940412102848149369881258268716988616861551590554458 0 6651010883580094854997187501903768101030742538933753608910319345297944663563 4870721870993280935313079378740941959364856550836990638858848851799824505925 0 3293163950375388340636857016415900018683773694457971917465127729807050496390 3130404403480142819238131980065489537428244467374653169391079759221455652029 0 217105189314789424430932480018982947094107304421717938459062068491341404315 6360134118363718142136224550388982982023877487884428689812549208207618510030 1 4134682655412132681528295614230301007451843462929750687252858656013611176203 6822946074287628822537231688711462136172761641534077201666574635782054128032 0 1807992002463553373409598880050001358392630507851774207767940286064097850926 7053550330568915989978570197846794742392836146592314772154050579591352259517 0 3088147049588914549582601729249517541954937349260018743332226182230456028858 4145626031844484482158680636520263301234756401331550885486147432473937745575 0 1729957491185268797896748154672237538483211544219912781731057758714556879815 4917329768735328838822210743064451053467424893262562154443272653365801973393 0 4345107310558054843809254693302961622686968829047970913676630930654713822278 4906263539489666044992124169220034516684643707604345812081476855587328358505 0 4146711549669107800420400725667138277685886026808096122496422698645696975173 1859597067610819320209456124366767882989255050838696794789402341679318293046 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 -341828313389215175980344308501327306206351165972754251622680097133888565831 5058581152439787058540066945817069766231164073617936753475117848330441363716 2057075693845424578013883365233377182800048672081699547620222063657650347088 8767197153 8767329571 0 4820428790685878198690210651277976767962787647592699674073100752295010950074 5769462398394174046831025693925975588613141278074256255780828028089682544041 1 73174975549092618296554055478669349319492233770212438300497172336327343908 2325328015370882230393048509490653223921249429779042958847799800043729063294 0 2657596848272123877833745487619243943027886538742141915160259581410400343721 1714763597311992384694343580849407186821259172079900367905946713229066602610 0 7148125572882997698822008693991701172579174394733203968286072992421046167624 2086618121959633291847996877182402848799319785627382211954278169129161192531 0 3453456170110946404296508033835321848593821844030523167765731488155684420539 3869173239241749020641508751982142997860028603411918547036095433935405504274 0 4517201542128437682333599968190036019504615414097378281334212696652421159136 6212390378677614298841168072071966633451517611776692016974845320733764246272 1 6027389418522817347491615917751271098492953736171373656499377255981233236232 6908758173318409542332776917628604355579525192995791245971176813454945357315 0 3160167862159971801249329433183830668666129017530620623472127182715472198168 2975837412876784235273081258216568947691493071739216072454978874370496908430 1 4502170923864570393878451573707983227160825865831701485407490721326905770458 3239283638913919925297088180636502404222068922962561575735291843371317818960 0 2774037210401438822482372410402287582677420022906589153037342068589716378038 4451560336279961328601084089974258632857435781997427337935251580891910691568 1 5043434271442595219882935230029895649830610020993085721887281369496274526647 1503003800291769776685960053342407595504002989328997345789781149072565254038 0 3790932392259131961951115069875460035009643894512899896239240576907281049733 2951407388846313073360856896463645596589930749098100555720685900368744433548 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 -6919798491755843659073090777675496471895424167306652759639710337948563728198 6816348134103763914444250149429867128351130571184797901353381873159188675724 2886763069269460562836783941080299736138312948271493251759905288067278535816 14595459231 14595630085 0 1211851017530604057526224363897882080700695460098659059216833607967263918038 3872242162085504304824110656595739803811896957761545050338025477457735117369 1 4656228293764566600687829333574523287554598936959549737847415219713259923360 6494690444839614991059322263872180735086896068888842852774618242260547706048 1 4313306835651836718481435878369541744213901019527527859891547803091484176314 5420532371841757342102428643124695371348474521874626330332072756812236782405 0 2536126715473720297177066178242968256777962604151800761506385995104314249291 2324184095072302795808778480021817047223066729963478878102769604309155712763 0 2370337667337926443021303183273644871872033780684886449530295758188628502490 4584213876870127198237014292127334392068729917765252626166469621105940673495 1 6053230109838490785210432753175221786583167474618079660491879166648882687722 4279814520385156083736172808830248154566138799882989302438068849645467153158 1 4160291490724019980988952618358443889317414096650189596411610936813385066663 6835390475034193092103906199538725201519391025195311442570219889610451733235 0 3229200383520078701189356817879005521513620168436095189366253510389410106869 2762130337191040393488575034864835589134628937877326996120950810896914905255 1 5016093411643849442066851793467229686348225334209412796866479055994377107452 765124079612942674298547703917863367540862161913714977751696404244679757737 1 5020907922782540877688875184404933788510299892428482630631833280099076343908 4025632305331797986685904417807501148878467468939865942501002768631553995425 0 439367202956703470817600031452446475976884204005893166450530171088590995400 1476537284409277259504580249161885502701731421187019633553789737095801687089 1 1009897218477658096454947727932521950747890918221706135326221365168217389952 4430058592968905257121640646172580644409167911276943297064514442960563374049 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 0 0 -4625680093171133824873929172930712948583641345667719440342358607444614915217 5300223931141654230384219010516750622022382426080600313046508756689354679102 5599400734185678787026758271237386447262711041298571705262392684036564666735 6911058528 6911176096 0 1138401346421568069268559858049326316247317557821052593165520366512756242511 6649729997840508666946307207514360653757502062676734216655853867002165401655 0 390867566344163233761174042741333257341643575612634141211964371563942806191 1594818607765607420035237123488437879996984191851554621258755430130833588518 0 4640144441347472616519826818489380466706020716460721422263092112106371455881 3160484391280171797425631143728006586478147302991059182116939491171078608269 0 5035367661274438128298805028070904153351728322525703108714819562409922657391 582564822253758086171576961154376392238029218851726482921234090709198054939 0 5104556436713745218639936771324380722551332647230449242648576596390135104549 3567175516365152078169208383708334977789284187543147832574700140697103185110 0 4157807827140209826422214967293026563181081674334620276442446738313096661462 4886018325465660686154505295047369844964147175094484376978977160928907318916 1 3729985657826108887434061729900495855083614105668020210152824741308625250724 7125538017459825119638550194582938796143367058702489861337693843107883557059 0 2555526393059750078038962610083509530721182230888685007243521936006481683611 1273291905410196859586786370339120911903054939499202387843017007840966026198 1 6222352875696548711613224221649351873429191693995802918095965432916633076332 6341923037196993641286249289233533648199654279149542354306158330518595676322 1 1024992048347257905920964509758533614320248044819810745414580678169687570660 3791418249899210886868186535745547177754942485783105803535881153905718665943 0 4892911685640918936507415812092628174906600733410473687651092234682149603333 5433191193400283830449270445939645756530875942930903471232483101077915067842 1 6979269453309009111069036018105677771463384075446857673924331315888505530952 6415190432501433395733658264573518065023765775625781104935817327833498905927 0 7155842912162336485845305523305565491772834783313129438718163644875917614053 4323979049682445725653339279525878673266906371560474718815605130743279777072 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 -3893779671741445588404962181937895414802740771224039914516320689486138610431 3837928217115093444928926184348317615400209548295317709689444066930894206999 652253450981085840627153482753997061429496472463213877320655722393101577897 11035111080 11035259641 1 4188086282702650235708945751492547201803919484216977169252087412100168902596 5373911442249879167042533147426831189855974600269706898192176227944454247414 0 6628288963944470007794578861288299994187548234553853306234161155637223419561 506962373427030089910982537117180056658714117716546039218494133589298282161 0 425087034722590862329110821912549787643102199851783757320837098256147840617 2332721759698132881862170663505674955515307075628552265025219490157311813244 0 3284097381824477465097968600365689134376913389210911796338443299816497907162 4261194466112333405446445667670125991568491185404277999783316556741299266421 1 6995185339180800031049111276457035167637984635827152071728191721320679064364 5630737476484879526567587052809837909708746990311159588090572301222217448434 0 3320981808625072957610383243157038655371029033036371772961865970614217056433 5214136852474981942561953206154407476426447601177509703299266656689119429623 1 6220473083198051481412796841460910204657392847574340300311749076267658223489 2002841075552184777451474559309085740782494372701769032200732566709259835863 0 4582187217213825242066036690412922817179509492963161904359808070651553639962 6310808792654654539974601841734613032889509248596352182560812382460782694211 0 1755068084797092527243537151648067578853054097598969642586683531676987692931 5154593176666053585730901223096448364709602580839547284063734894195790199864 0 4120616718385440383489558839941446903719894085148660659562446960509656751144 5429930306280754261452244557884296458504728939074762196846334218037242328405 1 760574354165914697019929212944973759981490294477375834649749428548232751231 1019919171966887781941268059692136971948020054216336434990468891788398597677 0 1759277341950091234763010138876873447220611226677543304993482159971276593253 5142211569424160080694845847506554059332738466735059394651191659234064092014 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 -6901792343447896145648244604248184958077354195005086313466747393463225632018 2038212979636644324305879267580480775211891019812781832357146096142399991581 5162468955933052450164482250658423119034278467500652272169576631195769317482 9111082555 9111217545 0 5230925476033060298742179833759975611286952364379997833976289530044055068425 5923038422057543053992953248923599956485448860227388436516126637505952634827 1 6493468213193150694318493207523051697090846278256834816014001606632432231119 6658869629946264833566391331181600726166761282960067510156336956421344466543 1 681130249783611960189501509499354535475024387095030885345640623175323081274 1878240572178826158123310667785308459662475291472966600819705638335424399631 1 4194889041675942130482659068519519981835840748683898285013456291166169895243 4387171133232620289246905760188331810496950471750633083165738443487407900758 0 4729071743692937390512922928927493763225901638084854864276432193236122826041 5331489420869916454475934119881329410900484054263649633261106085416347098535 0 1853703656238532801164655237159860154649521200050799646769248545249567970692 7214107375589942378985116374636738838667088454224011965691786775133504890627 1 1262475525243867640209335231862153043093044286978220746674877287086020750513 5810503362270671101470716622360918036483035260383060055714502120110447329382 0 4199666132871056898786623024718259109242541990920276527922300530364762232281 1905632178968733806179179223415260245163169135615201904612947744858618097580 1 6676797253131443799378580465401965331146064722671199117791417180889962214716 3924415422911909706410070641289165034534279756258561936947923786449853856542 1 1179659304308365716306355995362903727081756272485687731055774724421327872897 6241513116017526299698114764025428157854727513727536498452740077425311844700 1 352306719177219528179854600465739376499135804543172972373793697246339809221 374486968578388123586008650382712606498227776601181801672816435762195607167 1 6273576054011717192053617782560869896396116262990123891413061385751767028354 6586243115516158698651062044712450728893624071734887464901594244820480543046 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 -4609013112065101102280538765947152028924642948542250048356579361934699541910 6324100448927728386929033042040004630145596499706244400012447121417833568216 1791825754696483217992951145152173138635892755676549284619951062151848646725 9465160078 9465297666 0 5245998845680682706245551547379795128985597605721385902074468723539575521671 7193841126244836761752992203535063596263199000354448957587579911699935808568 0 477732392299512335091858964813635975475330612872781036122935679024486643605 7182352851364133340101371872827068189381739619378196288514265148181357721600 1 5551625188737111054453695142226871385314343751157849003332211174456611631414 6738508421360129114125277440941044172020446108245328938053242121471306595325 0 4417732337116001907265638209015370584518094413768873324653050371145173582221 1883233794992638774590903733780363281170078744915645725831786085001939635687 1 2389945006832047544275851715700023133917902994602018541402701599684169120622 519051018068547156426671046352154698011294900019281367036624560134722849691 1 3568626173699206172888884034984522772723310648875580341425868418764669821088 149025206147891356742562989640923458002980995544256605257843098197486345351 1 3571351352838944909210465898640954018367652305272197966440214129384230434287 4245108245610070145254957666015053459352400519292707522599857997956713801889 0 7168741777830499926565319031285412541112655757199114134370299974068305995456 1693205717882576390017851902117212801636890448534708388704614256618159701777 1 3984231011782273273422292383667973323789490697000854758937745500167990577658 7041078260958022478066878827635483929779307894225129481782089261793715605887 0 5263458285906402043281543031790274806724860596657903025337105568122449305467 882503965795724008190593015469267369069565389426552617740297755908925830233 0 617089256775311680987273662138783573489672709301091802846122274534552911898 1922922666489256159477459030286342163904263920192467486930160479429728549892 1 2375945960944027123296314725375768316418723511640484600859380970585628079877 4157080620591651842766990831012098333360382658255042299669089469445871162108 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 -956063286131780496041104252107756964597845477543095628227965094624045841895 5519713109750381348630611108330528828176226213584390108090876574426296748297 741157187526616871942409654287123932244899017094552378514846654254458904826 13013603785 13013765115 0 5303835183737158937693259584149364816859054258825797961768698633683758007704 2303980322137992862908449448176617991622139449674054910530337726263808873685 1 1120418950529963449288912437570118864339296730269501640055319131626824535400 4311252923313909806030159332064157063717564095404044811534020592643691667597 0 5024176503833032543612714166528275761714927209230083608525906210083653502499 6776427419850695345058338070420428799504390475034448364065325490891389705677 0 4412427241473814730307107488088480101989024320241620795825653121103729814244 4331169002504293707224705719513887480532087552568346968196796087858732686962 1 6110129854811694444858569508589935288149005803139916518122377258975520832313 4405264796667019336873592366335860593410403397801318085214242392710178847785 1 1492073512783526640128888816490645357776365390086864961966872876003912140946 6501638493788887028373059663153492713960368683832026795822654016820842417192 0 5405872577554554566420492967175688552683599592899048192115678743547823820019 567849616019704637470048892286724363445815190360423270625297916149868057139 0 589263050901298454981230196673811040098175128003297826681162550787816394309 7094559906859498618987564245938895406308825689735729543302085728042956846283 0 411373562121879096611411337269805140927451992377746461183476101577112876450 3007934315402179518601110350081582777752173448800224800482556413369860116239 1 3483223632234656011941594085496423002478555124901501516829842444993893601134 5005268568172935341720856150423338938769724579272343734235251078032840453684 1 4505501951870151654816584717184940801901761227800061545469142712660578966762 2287973768910355280467559304714607154976861151531483288364066687191444601812 0 3670771870311560844390020801995547552051242533344672401515297833608741113880 6468868736799812198796606503752143303796742241816440972282438819792234447954 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 -3660601335297277075808874576931757274484525372853138484310587427102421147963 4940141186032957758254051248983325036434259624910511733137143165944229455482 632824946105970253222126571744623681239375922583123711815114701239309270417 8112004251 8112131625 0 2462763827021297671612223959737422449670445255853717178647058249866197831307 2614371914566077086653307477077389342405381380004427706109380065455862664333 1 3204478066790363646353377067763519547148152965934587082091301012141346995929 2063509762872237479406255855119216792131023388613148834396825085163331449265 1 1378517221470597107963872193447401394260519327148636122733461465876538303059 2183124659782182170779896298744857744242770528712662511722227628060936994957 1 3465704960969703334134109096736355136377253171006634769618363592877157676595 2193373403793513057400601632457427986064045296829972651108398112011793326410 0 6967965420547568027623427788240397770772428300801646361047933348327251009080 6475356945169722315368228032293332122118555418956558195678835060645926118632 0 1540087184561472145668738127528308254846194057068414467120888321752169109667 5440785642738642560450771648261976161052840551015557314088806207138331628758 0 915653231456659946515194268378634890339399401928414200107221748172038540111 569363231313541636279806025260228201292508993003495135260697526266313068389 1 6208127146891438087745144420639917018079256780574044026964426662603827879970 930428019920149695429092178922186329877662683018434864246836559210464215378 1 1603383615091149860826050403665463087190715531276664780728143291460049744147 2120508310264895218039095225860334913762184266502406575198770843844224847663 0 948354180111501046233895938364843242189314018057220212571711415433616541994 7075747822188075086246742040682695038170421684716855710253252922298851818947 0 3515807377089906078912965128404170729869247982788025808173175188839865718040 2723812856406069514153128218862081225162269958719124427575477074063804059928 0 1270980735990918880463694407786785698704885369849022527693307170494920626655 3814740801669036832448809756372026641930096410050502507255189339757677178354 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 1 -1155023324506844678093047365753158583813506167259892959464631947863640814119 4405309256642171955539517075050274860545592573653198152158078071456355830088 6212683116965990643691535557357832040459393786661592037285698676130674308467 16939133830 16939317891 1 4011697439508896422956694872682260257728744639764652980910954035965533807049 3684938046843293318045392322047890342189914096119474827179524714399623358917 0 181378368222951762576423863568185170387773338283018677104217997198264608616 2625693656492498307246364138641330329722051701958319154329470918060662982959 1 516042356712891370328221171424383462745169658702738980662539076463145529987 3908275439982884284142878287294011262596512123912172260955464322265159136971 1 2741884783418806470377232800707309163549797711143733218523123113992399599389 7175867823936066027338096523704516148333652247824396786009954679365994539820 1 446218552797234400643996085999553981699860386819042514818065380372770284877 91887959352745282924317074510300908087328097265225905946074902448780406008 1 737244472008779141170967077350559518917433104402854588120856181312664883835 38067709119360192814366193823038073974975766990647658000134403028983107821 1 2049610144814366745800803549479538688482243130582273693885923905512954129703 2458986653910981737476883095877563712300307587398399294372313665096129739322 1 3907193427098541127309167302526898356135255901810054800090205135970415227669 3213305413659012455643572267244033300213719110022726516400937340220746970218 0 1213872069917019086903764379255393323677972579112005465983813415587968633242 2315265092263498549525265508046661204908883533579827256683231621482607004655 1 1390221405638395798609612498633692631850998839655161871969587157017612587673 3174959088822756802973902459408737155874723401190220229209928956783939202565 1 4617489889846964207493841454104369775506869647881798155792392687561910012348 1404930765557064173925016147744192656751176478236751515885561876516984132362 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 -5080924404614922397030062999617365951627868818426056550634208210196763168649 2810674508548072163925314390873296187314424119178593174746450216762119501775 4967745764483043118658528201705214671654237437383779836715632847632898051984 11540223003 11540374926 1 5347300127773534179390350752067990408882380755955558366108633770003016750375 5848891001325265431150831124627809014345051256266173991184982155859485002488 1 135333026755441371203979064168295610266338115319977750404422864854025357893 7068039385578585404696849855298657775187368011389521052269489854835197839851 0 1972759700291308463983156477226423618006679431431453044861011460888602341091 4756987696861416997168599736995619749216306235726534628660274898676555318288 0 6555114241960185281530167633848901089459741383716066953363955548468244555680 279929045635751312878965462216831584943211679618524105142309882811473441867 1 6501154961284704820984818615975976420436064134121789071549378326508786427738 5201606606945130954643700814668678568111694514563585034647869415243783731215 1 3271809438562743347720293435897100576738108267688742757025988395205850410062 5433270595725174184241836306635355955574725621842451152097865230545740231500 1 3611863356215450380715986682074691101954621953989835893883088735347773906436 4119680206896253869108037357465210862218466865884611397645151257720193537270 0 2945603354387564230625714698105425081520472578015473475668192622993812163975 3748346707693629287735879454425717435557589601670029677448816239206769951208 1 4603090699204473690327786111063881918695818490891510097891755042248871284510 4293223084591753407057838048835900557706342257928714105819237163153469709097 0 3922981961548903069590322041631134410254160191391749155207021921397754758735 814596657996524161710368929050259787363250295067908034071839468576337120198 0 897170372676896223795736683618042361722428094406904775251254483398791703058 3081665437407417897192675285339806855175578427510154574972008324128306222227 0 1396442217183954557838889159506186538650343154583789092461839170558229491837 4781962828986317806776532074758947524119811976130977036673406408383791636079 1 6305321104429254115180202893886991358890524221980844740462586986036083382297 4740173989599199443966106285580870214678765488296985411344428121063784464341 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 0 -6826496975769023668743650716903846279536102781108075816941690939257858055950 1011723756005997971474781769385513683580253163998511095918197749342869712433 6097890048713406227569095165625096425332449394074772153782929194215550159616 14910313641 14910486328 1 6187368020168828495684872390256743670986300725592880370128115787182145554825 2690389953061809713351548879891124934895107376309371089123556079790307190443 1 1482036842316935170339797831876304904122188136464081996859677173499808707785 938743399069168710002275965604592719039619313257112333796662350114376975855 1 6836526409903401807865816734300995181421258604822860005041497476389787439584 3778389296113342921336542402875762114026651894408099168282508842920315036955 1 4767354159193448963188302580865005580205261054776748845842147809086010428699 5458524756000197772831959852707661953166425161456556424057003516145519090965 0 85330720914470103704488599179086089261239987338796757215749820735309255661 4954702917251036406314319175580395730813870495557866256272577148758485752243 0 2150853478685459373950619818711717289674900521818089889271987975740309866954 3785851332368763679483982847085422087636599264344572036755273896794574137780 0 6266451069569404024468018644615445216524889773807480608326776815771242458403 223342602664051969784250890658495217880148651575669380329597208405528111423 1 6075318603718894819637400266103254471492137828075158147806672045809983244141 3382963624734540493496399701472070816320012840167079460134406095312654768699 0 4605248575731157617117378823688632800708481904680245679919852539222782879630 4673739478423532734122772259542815535439835040390638792256246989448415164388 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 1 1 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 -4072300146865151344902406321975018111806238844044304839120701166285043398880 3794097768019452294707186698199829144219794706561180802015543571294956637585 6923496489530799278041234349402874704420558736809350274920599091018466809990 4296227860 4296320556 0 6631981046409332856821175150125717065930248732732447418603240059390732174863 4311222745090810057607149952585317578626289818228868611922347739975772459096 0 3821689862115181285440190819641661616702590113063631473878765020480240312458 6030568839593339515740180454720253909187850074272046436383812821407313515281 0 145859685960074734973877805960895275434775664491688921028445307684195875201 4597055742513997609732827108468725095557097946932679233399825922166886507738 1 523742819239286235779077794444285155650109921421866914616067949203817323162 3348467468116487505042962990398260664048179855609714193351944125459437930277 1 7075729084810485074269381205532071431712221638985918604914986716878969750824 1147287447927162287163598591763229847355315467304521174242346055236556060202 0 5177048648175576539809766626043034417033183351799402160978090635616713048164 1864486389745367224018114388674409359937977156824467203203929916536485870691 0 160105999214472441135082132681254539066193423126661451533852515935365538125 6780435373158436938369580047706888252689447902542993066197623379700262470253 0 230505435235149769146010696515492872470039584803279269064167433355780207459 6518434468462062491583014927910538415596626907722102913024238981846194281782 0 7038745687726288309862612604287784425756790997237104032366779738841572554094 2713567427564772769802437904281274287151463848378647623037049794375212154809 1 5268913599231226420174676272603435184375589160176988631306052776891924013470 573619969269332393508571407873600663578204707534061927821374516699216846982 0 710757879734109228893352159991078715894294813016640383670391719383267840173 6188884002506877279385366018676494009911795537856899977155153824908140471537 1 1549337061202344263805668947808893912963247024426928861819402999423151292900 6851554255415253244395381294104955813522239523939837807425305078554932090267 0 246848846927257060596821434665218835332295763904111594271401788884109241681 6917423617096940902755917577082785011643411351216872803204018177392881001885 1 5090748703440058322533835386773067184446085706853048507371361765724182261898 6439320730109434853942508615259018952321623190328681292899324119434553793009 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 -5913171153738242764184675566958426396071694460997753166629084304449658592307 5681681942571512541739521581705552580331812104717398562305402087368513557084 2688206879613212017051314038580937390457364267847765415831308974530109143398 15078637311 15078810970 1 258041227695914450783117829810142280456810838473879311960196517662522917355 669986714962361003807975674643969198461390856717497542095618752074500524318 1 630087340421178883623496697633623294863783943349368673655841123611234241465 6106365124972311102412860353376732167185428785171255834475492169544679415163 0 748604822953682102653554399106151631893483994408948535913190689751461217979 4067932734085707282162482914739018491679792037925131779225878482308174271497 1 524678595949666932034600963828609939332077087049601416827927198413750566175 2324507624584044527606373983054401860380334691175292766836177823051568389221 1 1419944161907546570991127446623956026089018786889686872053241956106638035748 6929794075750300784487639990341852266858837830627575246171966707551530297461 0 3341698520800842114039729930222083571601558110009493596487152111085679925130 2896267547765593266954199120913441812864311574329923793516761486310698710078 1 1271148849058125663073204699662905914360503338908928287639502236303216503081 5613408129874650052477546288537311506310584264996860100242430953211810061143 0 6072503064435349786531341879562869757739005384555007780503647614886917621343 5345639754492547794666524754181801626321975351152485212878682246652604778297 0 5175798234241252614961519937885551963880968252121204361139120021135239782233 4905607881043823353645405459252163142494631064221513603985554881178385104475 1 5246454372448985584645681532255736168566607181496864847062311223857872650469 4409963463497994353721651411603681049093733194358583278198321675103452175263 1 1195947705336312367622796417642136967548045074563448680125178351629097446835 2293870464179904235934972066876219564397667946621692714888543313944744811899 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 -240044311076141314787572035937486365722325799542898776135295093682958503848 2065122206198169221998703870488767145801335647882569015414593239622019316130 2112395801230740888608868376191363442328065399858777453899652360988602215835 6861768378 6861885526 0 5212438792273336533824232862299347419249410151671686568129211397171519274641 2026657996426949064519383669616900207521928946112758367048172749076289517664 0 404548892540659436992899957931242384565725670119849640505209545881394443149 2031965518139193858461930157095730167884523052885316736587369882923028139859 1 6328043255338254362979015361908163132722048249755581804087088044276216753208 2781327064915810043108497496060883959292931088318410613983589663953147807410 1 4179870716491967610281174381316528155025979890636978960494533265062092203111 3395816478322929869874192328018289244054665602223463632014216436779544750071 1 7181086090342186184155467630896610152470721930292852766952273985952369713680 5723714811202515389854337391248456208909607353988437347357507937984470560510 0 2139803965873205443893315625000093108808998946919971829139269681262928940217 2587750070550810966364469464226120067642693310953721759527221666126648438096 0 6870922755949382456244340851016448744670423476502497040429526399399379534931 1895664979862733567526860695286140137757328758812106530571356216917162921674 1 5173049914501655341505553712607768923850425208613313078792490083673567822861 4776655768463278968774472906214292357334351036227198803357148249339233791275 1 4021549639449127593219033845837925695441419990164199770511080875660835682873 6947358063993965865367059249567153809710662678478093427914563458307266463021 0 5761060954761858408048145716773764477763822338037760938198667850254476651232 4685946986560501753476514382876365786994662329092036631254849164459245279101 0 4892911685640918936507415812092628174906600733410473687651092234682149603333 5433191193400283830449270445939645756530875942930903471232483101077915067842 1 6979269453309009111069036018105677771463384075446857673924331315888505530952 6415190432501433395733658264573518065023765775625781104935817327833498905927 0 7155842912162336485845305523305565491772834783313129438718163644875917614053 4323979049682445725653339279525878673266906371560474718815605130743279777072 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 1 1 1 -655229813363507702884199961675136536632064604184561564383538278001440883307 7052791672228942192298170699084980398389352071007393737104720896272244916711 2092494998513441331559739104370213763989331161114126576692786385243509820925 13309042825 13309205976 1 2195254503680933981610548699967014904203204202219638834620160877301184826754 1378738249028784988818726882517821264876963184871791234836853245220505073506 1 1634064730073237711820560709289232234781983353653991361971462083244325937088 3591960400452759222899060931298947720259361009988092139998670808650627619501 1 4237729018198583116528425099400208679076663013812205986656630426779218699834 3691217058301613317010500936791074570901685410744533734412694854649466621623 1 5462949244011621300206861359925473564016549478066841179941149580104498040357 4978403224525903807162858586958323692313517336274142271241128592650202500810 0 4178863217780824104488295429470175583079902244659811944276908288947356575906 3577875562525150159276791955633620250309039828314340253970613784076469745460 0 4049632696637417986054350373354232458625774910604007635350473537992206367072 6385864252701096166653462019400640730542431967767586703845708209799046713045 1 43757670154384761886814537998282998003383177088370466164569774157564691562 4003278867690767885781416339890199940739845861737183047461252034874214187131 0 453622468996748084521107871571652473363428205605516207025366978165209401433 5196899333588776947889810894868261022087088401264719912640781839330771928773 1 3852044321776537399304691380600526192108826668008325501693051365578608566439 6834230982914423619411447789143147786616602768015213915610397403813769186863 0 7192761292420179302129579462205156909924714576978850592355619101400128850727 510733495867272632383278163124146978964317160213753708867355484243976936604 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 -2134175125137714844288333427112278861642920331796215507327742688588499259368 3836335123090937556504306350455159711862342371129567265590992058715681100234 165920966958589644458412541159599329135971303335654833873159768323694864489 8427460051 8427589878 1 2674456697544833046879832703573701418598935002857063662926311712950016107100 389448373975273337916358868717403846017219912409711126061593842754219003648 1 4077048849014657449639278042908148493295696965820893986503109361300950817977 6574375249700363186980785687646288844555029135737622568287115051765984263862 0 5794934577786951027590162927072697946820209472206507366145711459424655880182 4836298000568063091558984538137181866978375121156379260888295184136695305922 0 6803564828237504111212292164521492473459830565109611691723262477541681364831 3496982280711918483221614847510177358367002781451536595341465076124020797402 0 355317876133764258440858118519623057949041320527595859856342157200555713473 5213116167162346928024172160282521372094802691814846238709015337477764521669 1 5301886448310812423111574514806394300796568831416249220782090643263105172269 5833866373056143360070346436624842546185929250390768504117636039074870097137 0 7087389527352434383271690655932297401502684051624835773706458274199517637241 652149941095617635445522231534000138040120224572282464745229813371368986597 0 2558164322440461549613309342328279217303173347948467048667961137110645319356 5907697972018899870712052084443296040753340756267117071727141030464963314752 1 2345278187897902785676390573119894775972902022095543358047067293421517528555 1238093766317226583134851085971128646472359370425988006677654198041368045363 1 5905739027350221656641948265458007078684398820498014454222987852372893852316 4687005109826431528808034663886113726930694052454267721936029189744668538179 0 7173017566049627611961637667229341836912935554892773554725821389416315891716 7133448645250593764214856760768843267515783056965422435368550513826328295162 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 -5887325100082219396812421711201475183952134150794368502730672113634740846796 2197141483821109214467603395251898306073182394197458701790116483164892443376 6156584836519053988521698860007040013577782372984085390618894527814537022862 11366022606 11366173378 0 839447108591718568634499997408421499086674134427876233128143711795916375492 4923322467305866679023152630195535249723450120328235379752505721926074685007 0 6611825922860165272843242160878358140344205003464315097435888650364814912278 5126155843983193190882097710152444148521671328417144525985421570160006845669 1 5514969336658816492356989873912474793255601497686811875218921986251188464164 2897751081665073057435095772321532404414108644223510928272397789027620014760 0 1112776337952487366485097639834663209805951685744385297965037864327398895014 6041162615816070875266218600344959224249575821137673642170977612922492313820 1 5963329075681677894584942499454356007269115748594043813128598990944189412696 5486353425400238743421276063540960924966955342200527763221368149059694455464 1 2419382079405962814376339900967407923991415736896553633289270205099729566214 908279165499228304704999878370991860533177307000027151351701035053999910505 1 2608538861900534900674522007870746019252648172020094872825082008563490152987 5451838518533980114626279396808564828551277656711682882964153060468339789220 1 3155957591306364423722005627664609613710408589471860782904561911604359410558 672895642498545966993506721848898261411779528445388095122925364361221882322 0 6836634132514641324680506914116211235856323620986870396592739453194445411454 6652097301608350016033100933342209511623427095307914463646253807886422446365 0 5452629307979286370429478294989357423061926898576489921783112689547592374298 2088148379403119104524794930582612082498119087407210012550011383232133283168 1 1099657098322510201084875510828779527761256258938235615051052653695232303245 5799872061386098756571929304697188123249686927002328074778869891117251841968 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 0 0 -3988110080928760346630914191013985424540812203748960715186845628434528409853 5653580865676881027429873285834103292927917073785679688019128180612069414674 1755073981236978917002171835788912088198472665136884080943516855159278547966 9286596186 9286732470 0 6632049247709417383207365220426290268195028546099154231293315130568043351157 305121319296864753246916907385424248911124142380725416935656539089881203231 0 5029283571075203546485352692559388346217299684231182070145709628743533584958 2613729542545567358678052178593041523270376426743625469076174761682569579625 1 5803695706196376293275004934881469304446547861563055261144638522706282730450 676182734108213172498872251095737666805246656142829676891511685282216495254 1 643582094402752855340888290545001988191198019355701740407039248819582292240 4457655146175756498745115215385399472286011865805211374628239142631828671861 1 6569197553681325066815302129534644333365936816963883554064654998720986692773 5569940345700795764431498819753070528732161396570560788050703865581500585968 0 359553734679376661914702752548448863043071484631393248288242470708491287054 1317778491249169079724144068284201641073885670710002637010084040444290861340 1 5290354496463222793229141549644813334004799299692836842452743240035054309523 6071969817017723202517256761642929934450859963402879372945406037397505354390 0 1024712711227299549478285797311967949287715785874196494617160451046266549534 5335636917752063213747186419646756060469913212740817977936108871920021098816 0 1978984775292015549909282410041967959650850118776718676080365212344828366771 3569369618765623252980410612001652357273109846276673001610625112659557023097 0 6444948983125472716187440654795039813419046043768491810276800414195209230817 4155725567421243321520087211971449105690319798013017412505470329976353906268 1 3944399605976523708698253435709897944527668634148759293143840386293422040630 2064986973532608098924459495423742838044949391133694507659843160168696748549 0 6647791568377385298418219967204907680880330151498300799943617117045338284496 4373436973967083480150830174056602623641795535203042909504871137969698769052 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 1 0 -3211145883279676536673441615959418245925207235537763150053711958518964812952 2651412052946518193431298206259928564626478697800509013068260642063195085978 2180527747643569580164663369017332048829668080576000801502475982100089628434 10700308905 10700455195 0 4253793650016119129987021588765979392678495650923701657874886056606157948098 1829215513456703480496222500904074720132689913978964913823894276166675168714 1 2884084915882905144398745479556216349338890981200031292612367902666123743592 6242536588487300600068783406726808738276671626980944721794599587485316845078 0 4878704881097626267034924907965414861519511495602943486488407585017756827717 2191262726813771099928549156362498327370424924457613712862287212940020930095 0 1651301080360513703719637905352191645121130235272504179348298834314974558578 711486905717187365876841041698521320278236715605808518208888139086624896315 1 2385665471913921384641715426132093509411016410245463352954538265209190959280 4578886626889332209076039870462190474411160287609088448302717456927837970794 1 574946491624949266720529085961299112509507095994016674061445287868396832955 3726455295880097793175872503286267261783683194251773451842839897202530886787 1 4605845439638116713437233478224224399976546767917236779448465937408233338729 5088102905785951963928120464595649827510852303062729406837682396970218962515 0 6240140472672862058274348210014859709709936049994080708615710052062455064186 4559213892555188464941967122560266863001680453977471587912554171303475804689 1 2223404408806343168057965229746349243281213775673242102061452964134005215612 3291986178436455360942871331782904595988338300093184348498619535860936948363 1 4959757622923834006671189937082653611571392750507809962191419246095658178473 5790418348720339503981434979196303883881672525350699193183643115309404442954 0 4508894244391507107302268221895076860482451236397766875311087124353481401169 999626441817684424751792408388180847616038548912567819802796830089384147142 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 0 -3435392768709076196661782225547729566343978553291043758446643298145299766479 60898613908993980069984256898389916548945033732120472533152688501211700458 1513156214840393926458393904783872293622590339015559213349556785908365204856 16943735655 16943919741 0 6957125195460045460172413188055889879657831748721196462003936659787030647724 5397591737328010982008148337349089820525022911179043688164546595412773963507 1 2305479903459635853656619968159635257750092754386972989534459952316451456454 5272494845409383745136362555979730157070146246836807550599960618085228890598 1 1199221365449166558921548096054990518411449973892160390059120019272243035364 6410029303268966275941569527213446753887033297864670680253878509376314584342 0 4390601991738345244242924368006755574903220567537832486903697549868249874367 4586771287488388092065054133834713274248138795198980727594995667208191516238 1 17738146451227243145603527669243371204771778070012462539378441660434008844 2118345154031948962276350117765025987061027240771074708621193173194328444003 0 5607927063922740514237865549048630635938487306066227741326733106415263459849 5664621649941654241426368457307556806783451959624232574528602961226346627278 0 644415950077702552728635763739004429275466593492631838312698806803327510661 6438266509405746643388633854799635876066856772652078501279654560480356352094 0 721163724151681324729940255243935873644679612326487176034476472385097516307 5726467971426179411495534923986155258025318509614281038878384485864465808890 1 7112553301396075083660739116800939346334251681009538100854254318871414984751 7006089277821417153725472354628281890886968721218252793374602381059383995051 1 1390221405638395798609612498633692631850998839655161871969587157017612587673 3174959088822756802973902459408737155874723401190220229209928956783939202565 1 4617489889846964207493841454104369775506869647881798155792392687561910012348 1404930765557064173925016147744192656751176478236751515885561876516984132362 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 0 -4772685920972122792152804017406872917244512910654910127341275186220273581258 3923223785443181486331887238565219011844678323591752736667611555071613319605 1638599275869644644906594663280546912758155616609673096386759354915764727822 16205310435 16205490465 0 5723119690147445357622427640434139565645182307764940354568709792231627292305 6599727584370120025550973523796454217515336088021614881135974961095072755360 1 600990052355364988602006879523615236104114640035912464355391377992182661610 6397231056791861513177723930612140293567432496767150911415798872390591044363 1 2537997067139018493856984456064230564533949329683482182694698298272497367613 5258390564620126761662910677127986670242914902009234847693765177432686863467 1 3203187934140079783184547275295654639006172805375848868169612727180586634459 6322639135364959226293989001129253543762530381066339385430326361268456873721 1 4417040640295870151213032480834414124030386740270603949561496767884959445001 1103040657572633979327907071217235123801277597738210793879861207059410232044 1 753946387971787209184529303887163865856191956723271351900467884883169543643 1795113279132217850396560070627796522666487911698367691379709114723869226343 0 2025499760954076708249876660131656146300222052009088655390387256420016883925 3765826512022759303407983164016864026619353814688565971629943469484786518050 0 2340553141857937773391345264871484660236025233555630673298414420356449559686 1834511689622701986181726991348706069448197382878334840947596335485292421009 1 3893600142064471604135980938764337390932371267959512460191826894128338989590 5310616901356084005843924058376370027433479326317120382694927963295818826322 1 1093079782114326818800348784254929366562140552339551626007917276169255238764 6090519853249702349001485330504085873028407870329592176769707795728091046852 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 -544289607473552064635813949963122949736751581134382761584153518595273720905 5553478137886419698492851849881731809613396554969461128509939300950337904575 4362905350157111096212648241773408795929546114600204306083920587256200013655 9338046130 9338182791 1 2341446937404038355856212469643936182632428822925881873435447337919764454781 3909086669868659246574973713040692733497992169398763296077037198686196067950 0 7114742269055779002871076577902464639700808780894986068255392520306253403438 3654887995451404457002181402767615920910626426506830285560883293526847058489 1 3108619291604412011829824557755438780612234031663459886095789131268939165465 6932036091173360935600096176223011186517594811377512454625640749777925201796 0 3105465206830257615898730373228282030747781093380996709896002637941740567218 7203068003857550145205385939918138991231177129420652629974917469424248958267 1 2400755995945210668174800872963878653798933630147016888897173885865889552644 4630418202228127405241253767284635318241565886493351463818902970508341135989 0 1711583451350926036417370996874909203098229541704893534052673044070632335680 4182900277892214025614893076370885798685657052750547793025399218434311995681 1 4660325746669369032605272198620724435693232607466852939552695476545246116202 5231681579245244474178436790315660157721355408789215083607447591879149010494 1 4019147708293946801287505579423924835228896842343657264001425009461555561204 3643809713351240288575845702087060438003251042158479827822302254410043195444 1 3155913569425310993804582739954107913683632447325210812472047215200834754449 4467371819142930152140421745408380136319059797816459675335901433937390389431 0 6444948983125472716187440654795039813419046043768491810276800414195209230817 4155725567421243321520087211971449105690319798013017412505470329976353906268 1 3944399605976523708698253435709897944527668634148759293143840386293422040630 2064986973532608098924459495423742838044949391133694507659843160168696748549 0 6647791568377385298418219967204907680880330151498300799943617117045338284496 4373436973967083480150830174056602623641795535203042909504871137969698769052 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 1 -484519600246392485176532102529093847029634755530245386192588024124879157285 1394782962060377351934211184759144765376826115751732117932572596949788404441 1812935228305930997818726365276101682957492043604859665148548898567163274449 11423992590 11424143746 0 400668242156045369145020046397367916527495759258487002870165827847186015035 5411330574131389312960991832065979078487463396548939791058096258258088155762 0 2952502195282408347410466669173699032818240581038225018961269937801645406153 4821048261731575932724054352290977737761321049754665468929688785447765943800 1 2240350092614388357217157067371493775563463205236551850659086590916972291655 1703781273112185932217509945648666442707128244575478518551235223687924127712 0 1704662690201586226699690131829241016190549724320530824934520811610798903554 1900708894124644063059372550335733985364973187252819886393525145408056453956 1 4443270321378801205191131495904607670859666148646832020936929982031013514288 5068124755850717689063813796440672908057190692047479343848059387196321551034 1 274328928311333306554615286439352691094761829879053605417511765676798306452 698164724756457766408963297561670385849760914848185257869062622981342223678 1 2670208124175071369883165892789288487167033930213012336603906314912905684037 1536134611475500066716946282873490175599472889691143971099329135098583001947 0 261685138184646657609754930903671519065962593960455787329607140853695379865 4673199735923953286955280853860424103368522670625696325031956466542292153299 0 5807176451472900219146928037781119674829720944350767977875764008129862377174 5987190347567056677898609148350797581475503863524391886413416327235608063626 1 446450820728140407840482338990701806106377175580739513565592804661811101873 4584776691912595339770281881310509200924613489298450704604508904508117643197 1 1099657098322510201084875510828779527761256258938235615051052653695232303245 5799872061386098756571929304697188123249686927002328074778869891117251841968 1 2276767304504686944331768728264023407452081082747202597142431128694032310951 626574829184194000947627271607974485982564064064081564939446770333616412537 0 7137335452845793444824588279077865186640638775419949980841312255778025270695 3751933115884994595218571504056492965961264718636934902582781857131413534461 0 282270196267251279138544075020142195183447493958883645191645242598624499173 464250706806459789059251458133893734500238997860823223482107562877127546740 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 -5312776368585114373438254622908993782486110807849333003562993407943069769068 4353767411262495004407985882290769520367591966548601782131561830147930419455 2702057366381436608430314499069350901127092871242526632491685111165563208830 10111770945 10111913155 0 462777380948133065320987168213658028312427701657888784586858149388218156015 3857803499028837777642916904202952244721063361196731470484128858708283264507 1 3122456939173428810605953615541339239299880397245790927157312163218289836833 5251584874836526498009977307958810864746342338444150366308505908153114098746 0 4076482720843772701790210223936959246168159892143001843673875200900474029643 2167813996965937949966401944218933837336936912335503311788081001778749078755 0 6057551633351518234165310287719796524121941829778520037494880600091162138122 4416138261424226953891691527386939144357956129688171830422710559635047303053 0 3447082441319914160449720634192657130173826370094967092665566175825403348821 1355846117477769856600259061767544271673999029184684999599822957572425895787 0 3543291947196652523042674534707235635634612568409138950297859190809971656560 7198421787269795838634597313866490740657963258541005778722354777870002334359 0 6979085702029939307758197318666159646732662865570812666771538644230739987740 2924086312665029815786826604572118497613069681490322110027150608062450520667 1 6677967327377754703890134284569435478731629209048178223567424681728032402349 2312489750524385500079270426999440890680766466722979450770014448822515841241 1 2667579134821171785166327043450710141003419664095279661265665384786829731437 2088288805965957961799862243995999537367251699072756452551797842893332799369 1 3711209296188347892952536343427330045404125830457411971929711756594748180937 5090661439302782809553040821338919968802016532993913728733073779616034610461 0 182470551327361884910170494545884453921113433831787466574770900407610931296 2740835501314600670286186517824821680780109828968337565224168579753381454956 1 4120488143092829846248167395039563980310127782773428421117056740490630217427 3320697570657975296134172091862762359997279902800673094072342690677726489140 0 2686344002633831330408782544842225593457361362689278520346756590474650629770 6213290992828395281610429782411675485576028200946649774535403709026184014708 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 -7124150634948040172687358340658545070241573296811269684320812725829019484957 2922810317260081151531007318526313264215282244481560688691701515316163482234 1441129845103818099186553703914092579721524926794911265286540182186159271412 16143259770 16143439455 1 4322172231444190765503289790545083380758867558685027966043377281510577636485 4884202182711634196661661911822956817734663454745778430778327821689408508532 0 2198042452769851526832875265696145557341871751524860251852208549169679781337 2419854412666179168376836373560542912272633779101210268939689878567766025559 1 715478709269860616071105213028111736078762100769032845052872495393608531446 5586272899515580090996988858134940483839216915762152437894678457400391471609 0 3652680361400832112746649325841942767187767002247513900014084105744420122244 4284937780293377830036586818084416438312728310840995126118888657791584284541 0 2404356488594244796235444900869585904125470144060194577246738308190684297583 136350718839095399695360882221473761450857252330118094161348954877043081289 1 3612475441187375134352262819559497660293034240786503867659298433730947890792 1464280372481250634650184318836865062652647622859985072182829686017029066626 1 1090464526006063796296001905528383490889960689837986644578694862667204720278 2050634208112177910844266170397391410256928001993438086135031643912377067825 1 1156968824615368577725953022331526032550849691836366898916002613995098159140 6134968957229733336345971287034627145054626874346109385862136607073314809489 1 146405961570192318918572797552706493134805087761923318479776657459436325866 3287511554431594679391633489049637711320761334262969930535983123812004201152 0 4043030641376911757975320002186167937504175355974738000774897683843899880077 5477764214142626071383428564901054709922189769512371686491328703204413757355 1 4130045347680686604918104020395385604075080955025415986396418200744264200499 6874381055267584606979032657253025167144537289144989035484808434594502047205 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 1 1 1 1 1 1 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 1 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 0 0 0 0 -2898949460798357756537313332517845689017570413736178347721229964208166117999 6694545694251150109045223824157895253931368229506090202412487267323312301732 5520324067419527578188662334917017736912230445696218574160034984171509571836 18445730556 18445922628 0 997610093457667104552625558691463317821863727253436572117163812536657404235 4104507270835106543270756235091095629389164239190873211153818557633380136956 0 119010620244079145387382841576291722868615032997118324123551250719527671870 4997649243546707856594469539230330225067875719856970720094698104678162838534 0 6885994428376784606466553829342235851024745502884634440430840427219948930589 5054828028601677381951261285699333270600020228782899250865236462973387915916 1 4019879487718550675677240810655358055671524782489342313523576052286235151485 2446401522148872636332187136961985760386730631781771437649536696187649368142 0 5786098568491177555824242256676607908009292021496374383743921739556019001924 1245466449724186017188185375420991596080371011610659815425871032956687541511 0 2007371020358313994773557962765154126403919995572982367681172136185816691453 5526360489103341814475366991392238987661204480471445635293304494840685601239 1 3365562595974267713323954298067405965921148916925946543416182878373064565775 3133794951436901828222948672059826274587972257587335407172237892589388249849 0 6309373438248970633922750180905653678503970759276042360890989765590814838497 1548801180034991282355773567973277246026544435226198526744446484221140888382 0 4110858631113189277065581564307234080789848162147752794853157376397998794609 2279908908702948701274634698188161883411198665378074842977657100991610658401 1 2589288198153066805231404200178973528249900925011377947486890749955509243584 3032148959829077851087547540377102571468999536891841466129502427364441170719 1 1226028997856234802136539411928081997449172683065622442283218417781339222637 1892726071231923864138953668457350693457806102568841900686296190588461203071 1 5370059975383356337657953506195486116590801669004462188384319633826615123038 3601787677204411524194356035196171378973584312891456035693278172947545740645 0 2122788682384134180520696644534134185797588324835974739755791676997302399409 1132476666185688745466947329453645709897990211709771813233786701223241496668 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 -5179609259559078445448870090811972967540248247359062711338437682662067753924 3116764396804344188005878563797871902646264414033179571068312683669105678341 5259844681185060714945990212646775335814752175790543145046779518529764501671 14219303203 14219471841 0 227772563128568277019252219563771845338868633923022594719468885314065242699 1762785433273779722277320788652556439990916248524801212271546185064379359631 1 4363615420561130738513157027298144479913131940155231901781782016616409462357 262345545119271742564390991861305920367634400735565344202770310597807726241 1 5464726162817305728164250411673025449183224276390702865319790821606781361851 6270144518695969731227386133559937026848214525939881302297828014358832490156 1 1870045527786437384012860498992256434947900877427308597053440352113979190066 178905319973080871597738775560306684851770613024264011008750982745161598205 1 7113529782595917941160581110221734080825216435336567077674897007988103688892 3228973577992630800715625392021484448486975999970314232741505179616359378198 1 5505882538028009803121004456514014799484894128044762041913259669673279570342 5048519809790811081153351552773628361823486177110860010974395939128307378593 0 1497904405474758877630180196704019176241943918957846863282083980399152525010 6911106991877411916494888868813649334427166149593136253702831684293853255668 1 2406460462379361799658884061920077986480671781838102262743939107281628094877 3466070724699712359894030343274826410597532021694367967039243654884349066035 0 1250739718233963381175999453669799263098336162862908010277783302646184313919 2162745969781899001700078846847695947078485103438229384620789080121785078923 1 2796402827685559072009002161680921964405173556429526738185918202297288137487 292395337955228855191421534233023244740252877372593777359415107057055928514 0 4345107310558054843809254693302961622686968829047970913676630930654713822278 4906263539489666044992124169220034516684643707604345812081476855587328358505 0 4146711549669107800420400725667138277685886026808096122496422698645696975173 1859597067610819320209456124366767882989255050838696794789402341679318293046 1 3149341583859387741105768884956304933408141014036606256638404286087835610770 5441429969785408914797813316885339022120606097797907674563538643089553967199 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 1 -5408112536033414551245143687137592131184137261682060017384282361560821534647 1456623934382916393575592096081496626147433800287516964258816622305308451683 5206773480529102482710377298618992337892334097701870303966082442992606562112 16906203021 16906386903 0 4964310260200448049978755961686751786531413384416887552714329571543086971981 6224403500866678557731639134905900262591225116605830092469219859802865808774 1 6184403855548922560113185008878326238083950519154932470968542265615766873471 6034192708592099245737777000032865328398743039285868596170706162311500397250 0 3653752797859871267042284653311116413277212806839241968571299334697640355062 2036177279239556881393663319960149554237961654853362425705967840253307455651 1 4800081211646444623317336562803420174348091422747313105626969302338416774692 345263406766439050183483741421531672337485653313030849494368892234696222751 0 1426472289251818132939657073321697778949433092242288921321937724084980901812 5784694562936069617851752447110245227671698314756836713786662846510542794851 0 2064094336225855676786895019298749807324168272842664628055092920296011009691 1995723611001117256911193242911423507848527522625074322978753875038647975322 1 4173031239216922523709860234379304664838268317640233793158021653222808697887 4422173870383335424162676448904771170089799948307951756493782409959661179135 0 2863779502782937611055163929902328485764606820674966019711204385108968559076 2443331178085753891016224899595063797577725758137454752713945052215389338181 0 1213872069917019086903764379255393323677972579112005465983813415587968633242 2315265092263498549525265508046661204908883533579827256683231621482607004655 1 1390221405638395798609612498633692631850998839655161871969587157017612587673 3174959088822756802973902459408737155874723401190220229209928956783939202565 1 4617489889846964207493841454104369775506869647881798155792392687561910012348 1404930765557064173925016147744192656751176478236751515885561876516984132362 1 664039710698850498635728493450916097764114342919527287045521948643925179270 6671566441391968955501474763362596317477187932831874207199113308235896328171 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 -3270174457730722090007414886442190187238074617122642461817425097360939540022 4826627687686972208190581821391356475339891271047366817943851838478959720110 7206817359963638940574838620660998263014508554848393806192213542227111555085 14833739403 14833911646 1 5703518158451988352937301086587083982297305915861416972369003028398631105699 4014637084409144568704086509292990864202341270681543800856567426316114600420 1 4500605274918509400130931184465161412642725230215633873594506296755559418659 1488739491641647680240067590420271248389170635165283362425953115446683339895 0 2982270825678184104526115729542249417137743656913140236499912214587746482717 6716923601213617595968758425340853114138188655583895579630326694189030723161 0 7187248768232952756977667251025021457324760263835475561759563053830182094823 3278521491447819862961669650111695898497182184310558360214846287710368910493 1 1334294862128776128252144304567446882069621161651336194619214158430282786832 7107265309384967131907382523172875972886578483489382034305260104279602181779 0 6888476481247279395247853924693413350759109703318999567351450299082548435451 2601543418348845168669040211691604054928198982803092170949839194632438860422 1 6250919669509971517919582885835756783032575628093805682572443494976596304646 3316056478484112456828120181603731452039275549629474419284243199890403770075 1 1428585885131515985982873653419206075521556819446841035418559158948229367803 5596290952257452986487969508346599091504283086900822002293325032444064862671 0 5574571179262221385159492846265820024331051060330109188695053896014956693721 2219507903039589927659993710054214806211757849109499372625864012623255901992 0 4755601889606972839993071880201203973251978668408926677182260145625510235605 4670762856687148042099187268628086202541215389841467580988378389726197155071 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 -3902956264792419677504482565264279529290907806486331890385643422208987872563 5206312364291737598748579453108654605840079115651689849827665783327067582843 1566778565540478424269337334369153590483415040357709891246230308966236005262 14894085528 14894258121 1 2455557803076441340807387728905870551364045402246165948922609047643242540736 1411015527454254151196165256962163154199207970450410483956914848265881805838 0 7145635826559361567004558340620441645214697907001198446966414837214526712150 5799295709766468952704777218036202504466805513254913640153284140482612212791 0 6574704266155817159034211087649632040143690719729101546407848239334309097792 5306378808999046340309158221821257237132875092290141541493371503176408276230 0 4933955397898771328407043771905994925868302120269932936893545812014493114024 1306863731033430899319533056979659667618724401311183611376864455008904854850 1 5899565866577909531246354262706661064535580976565340845419779987175140032306 5871341524277049955549657053935880879878872888670290396308783857373766833060 1 1828891263609004567064579643875010729712414669887535782995985010077166917017 2862975825476162782223404720896922735157081043452537289335381353894732127134 0 1249336315086383232932647236901958201783107472582100879423444584927057459002 4746309210062087296001573902577680429143463837691879452450502515290378060323 0 6225999248274512458373063896096857814112290271466590307099113828684401696301 1648840620615978297210739307147373603486118405376952185378745491121124745657 0 4605248575731157617117378823688632800708481904680245679919852539222782879630 4673739478423532734122772259542815535439835040390638792256246989448415164388 1 2075823617994772586560672588891066619011970755633515971108251811689582503421 5155021279907312841848820757741898358870080798723833502256335908262425605555 0 5894326767823622121707281911312673472518981304832597565058350078378305753509 3900665503532515855864536642841889153192838543814554819186934888280151880445 0 6678853804254761831731178005783455542582232412351401495322724903184507266017 6156086939298139333552108644851447364084226007194784327258885211031558758140 0 4594860477481252422045730018997972314225738636292694355496625791251792984564 4365790103326887009433072308715065683565684351741904133959780754317252909740 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 1 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 0 1 1 0 1 0 1 0 0 -5483091367343388427618131421939916925224697697858904410830040760670990088156 1349464619873628901844599213480018157474250074567467956076341429862236512206 2819070944218896172931876866981485974386348871163497530208271498377333173255 15890007315 15890185585 0 6254349869074761240471765373182684690121275755471345974352220474458181088071 798068944086214046342107302984248305396555075955856085121004004096915175011 1 3382054142022577944887535453122004241553373678913303460316445384998273913945 5562242576574741326149118501445557558017056770891934151002856690559690836661 1 779885337261652870001999531914845249326762749970659511753786892654558796183 604938476683733776743936468922054256923879533790401611598603066565352759971 1 2932667889130992106941036959707158070791216174487841961600524101619297565741 3632933528955869139800702550430415942821017585080353583960721647953681452093 1 2311128415347057042475810572656525358213804703479607764544923685935103361330 2660070785644143334312973397175362990529693925061856080115316566375702154653 0 6223978778735188028437612526211963410403855984247848950374964099219478895876 5458135071733903905282302975455795685655191353392694936549850433553084246975 1 3592306993603793166951046435047388971347873273682370160612576041610544676946 991970412272746169962576127541024612445901859384404395850503898453508434462 0 3093952585685921822836010360447598154699382368621722619697351747070288751883 6162198001667882621168726250858416739610129940345913649726153120693766621178 0 6829932253461476744215129385523279464738386570502129546912226814573637215203 6102792342080102564164765618467415152260118370859067564420071777245281949160 0 5966944064536104934815279210989845485109610520973531813131581345740192471073 1419910039747371690510718622378526607496830040331517185480907730008023087922 0 4651573725624120785180209165473413064143276924840219124912326240589476555995 5907807794314433813142053622915182058637518105725619661310972341250342871069 1 1943895299616306327167930201725276586385220861801622327443884097858453430162 4688028705835997320836017499179004248909773893442957938073713982250200980387 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 -4304771658784955419414713282542774407387203416078293244521089767028471411000 2194055405288552660689898441528490835488696662725194820116464259543968085715 856660321327178459074224308282961991835511589401241968631517585984365026166 16444364628 16444545981 1 4437846204666940112582595106519156730230279779307990848654903192888187621688 3295266453449830515765403882226272358914516700966616995620587727963191239205 0 1199408270714944439977079854016779152969455770308757559838057764391099771367 1544800408070963433657387603039559255301712906086848646200976118914187653992 0 4303349660601240400786099394277026304840709957834329479537645025221294762754 2762285963547721059154316203236598337496985830014534306641286496584226492131 1 3299578930243914020136758919830506206878389092416327114897317270889148093399 2929245694312505722348000926618427115376748628305880605659595048419520214871 0 3318753930322877689866677024072106138655204564487212055130830488534067659226 1739225327851720392724330837119870335227215825153009158796753856109504182059 1 5408548045543571910552507144432780350098322593118748634670673865541546958808 2111055523778679123714763829043936432767761611579939501347740452986511182371 1 4062001631775929007526087984597189189415212917210726803282009737084581369814 7057792177884422457069863119747647395241189836243228178267694628376592334794 0 6453986114401618225335486070653664884231763154182704358720069785756133693931 5909213237509354931894719292425960526742902030791036409087142915828206796607 0 5706262227400302313395315359700399134788994742442204447425855544889071318152 5194003754007053782605040693965079702244322258182853202937587572571178835782 0 1766983774319982538600085636406692394694835417776844993895437335316310691366 5031134736876143765230304764782835119075519793510179399098740988373563036740 1 3325021630354190836285984265800406667986861885564279001699864295199764353483 1870433000871466856397944323773107563848753775537272521376243096540394864684 0 2256929753152477431662569481456954086737059111617538805168807732745193782573 935137127334807269694994368166534031198076887606713505146890993295146862148 0 6762805279450379200642644407529613344280894196219288218954760482626457814669 1757850296264109634751938882590203235008611683281025240150648694986617816898 0 1401058034729874562942034775504353276956880685366994338201929287463082355854 2799398633085104661886568150725253501907890322893275150738588089430550094258 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 0 -3177984695914059935271038654379451774043506295289551903144062222625222300250 699998868369345780587285986477503814618494199471159527769898992278545307557 2647593006138376425603004794641045752091199459914674409393756853836404257842 196743366 196763203 1 2024743219960028924755863591269397525710975506054393813952084454799743923592 686321831782661857721978382629334994014934683579571197051072717670329497800 0 5026617859990361426071967847995132342364462903917198502417712945658380305597 5012661285015255928830027862341951789077318297882760160195443974231046068328 1 5051011394996197701737660157350466744409223357792735745435442960936292293208 6264015923881349119556006201317493742359692828493894520935170950130007624185 1 904040917361700104444894528608441562817304678483953243070731070945760511553 347074656098381234254418487665629489266378386409768226951104751053567344604 1 1560591998011915212515974847575703802727149314348632427845750320822248874744 4569445323179743185790776215721659808042117779937373251873520367098772976789 1 2836130271302568502981996742197588268250608176395748450717040714816145426363 2477936992683304147025217533563923890470438720505488213610290282982049242086 1 3252273665385462055394764977698063232522496962045661636926608199411767619073 1444294477685589491310953208270990174754902169275937603444391018820875950353 0 6884851567937953881193119472382969095042639160228580425013624960716602717310 2494840396869410755564543818782205781745671481720215895114956661562493865343 1 322003649716869094540090273023979740272329764934217603521289171807792570455 5714322679113275950191761047296047344799999816304097382721355238231476825053 0 1906731157617860730258144202924259380142028792287158264299539793831916459923 401933139775026388084981346456015628411712690551317015339113531500070316558 1 6160125394476899843048252266180439369269974887310612715059904435710916009517 2650290095268592776691390636530475343678019519354510059220619664157514501633 1 3870621523316977217931994794707772493706259669737493483078900574712510176629 2485205491104065504296695969092005671818313950696012724147815554387435770846 0 3762856595238627446941113630290579869316481723198452033749276309210899434555 5349329376945283096580913835123427717376990739000915393735088190815719236781 0 1855766294186847771740257772951576919537011746844466520306430800082541613060 443174091223883654741639651476250545774718557445762380847765268975024364576 1 5964598802241963262221473266535551736452515892223232788134946931769005513760 2612385415749691871090718866042302826504706268037968605556265253011766696009 0 3949196515116061641576333171505577755202257874600161789469014031700450345021 5160224174547304049781799134617330813473230704935999381437318929621305586829 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 1 1 0 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 0 0 -6103797187898743571845963766205433971171407390852755090247986581630168063603 3176496552528898900778445769022881086872665423912439708388999772179339331923 2439419495348076403443873648007641246310976039817282605707729696055693063367 9049093185 9049227715 0 7211268669172274560513048184670312941659300462638683875073361552762096652949 1951084240233537792580709721863944013817922089044908170903903999417312722535 1 2083063212015066008334478083493359307472869850358760258234587502006109914399 6289822783235298831929319498510208222914594316232181683394247661877200606319 0 4513949315030312116836929982344100706434807053602675588278420621028807608890 457108680143483386561739618217440186075274296660130354082358026007359472401 0 1108384327026201996352613716811797309474801838501185660672016661143265121868 832991026117626931514266551357761601853387534242578200417612230619326119617 0 2388617370038820548267762919708667619902851604924077468220360631561634147460 2752900933444172526563374122315462019607371750003054799384563383251523769213 0 6107246049211887492009510678799415444891253018814566921365333093543409896179 1476586927060571471976279192047166269214383646348396844864325049519322203140 0 2246205073701700950211482467346819126197481217698686598329516961971298348396 4739583815311602168765229137508723352060831711268388975115664522202593095113 1 6055848603305205471545249831697220864066933034479307099228013892483083803029 5073821802400333091284302595734861907758544918819269893735852115796850665709 1 6246884483547227985251884909563247857029305898771295096948852706893671155549 2952939831010052012785473019291322320654975280341331710145877762905219438637 0 2809686552137753374245594107969807639908537830149467070641701282654304186684 132399833081666494755171134837238092592777034851767856135918722971021007052 1 352306719177219528179854600465739376499135804543172972373793697246339809221 374486968578388123586008650382712606498227776601181801672816435762195607167 1 6273576054011717192053617782560869896396116262990123891413061385751767028354 6586243115516158698651062044712450728893624071734887464901594244820480543046 0 1512118834161978836538152197146701845546306096931215633560769457149322453231 5002916874536749762631302521735387046727971502961742605484891604924640893069 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 -4599996861045572694075400282139003538443648114746231456405360151090619767075 5801049429091272937103683022555139436178075050573216003614276775682348310282 6375223242417785078342338067983315764723464192494607982002673161031460006868 8532816930 8532947566 0 6224360791065351708653563336127506975930315987698768057222793514152372691856 951983458771587813416583965800677077359253527541625008407119531651968370607 0 5591053084113423232075664477967382617353683547820575080429117167570051098789 2620768235806099872658079125982121188432803106698233971157149900911655771978 1 1530697214904409581778220294873843164058592237951666133754809753389285358770 6810393118582781157931109943833624066784631366238262084201491091649461016348 1 1897834144325167552235555255045187845762533450520701183321829155172683080515 4966908549088243914479064023000836890026167306679678514683955451425228654397 0 5753577846258577804535544613547983965182995270305427587090188365309799027973 1000560361166498983378903020747106162682650994115780537120758074737066952437 0 4715256441386916712576320683959375895084344420736718052415441605508112690451 3594781791617750658919004356915760161887698219107915984774048373967366219807 1 6535728432706976380087508552609803839111528183276889017357086147711306078032 6492367980894668996336924062868941416868216824123663428001262478986049548640 0 4123820546456044823987851708322539105901979284846799141002137901771185465581 4991899500985613582868718149947309377539588251987191984692297922822183423423 0 2289154944610254184849192159427471214944980769407927200793850273852865284909 6188537781679493371141760631246651137330767605543832657736316839931847430918 1 5297114001091801004868210586099483407040773574401921990532250091158483868377 6324668041411184789074815989243644876817134035483523276134417726565777614041 1 3715846102645130333420723219409904425436065819803542190499036724728235950642 105896051079522120082217188498530453003913852842205382613663908349673258491 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 1 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 0 -6572059586365493975155696931868891111076646429030958451685424461980816487115 6915847070748543718548116569774334554238587398033806031409742675519304850757 816251900728430308766582747361200342704117450005507887120683753236563634768 8380398916 8380528380 0 774022773688724906320520798994370679876563794695312718495180043364171948008 5560879783267774878579760604496663310591093296794806690171242444711930935845 0 4536370980795612668743002363442699108015765917443805625489941746835709757463 1343031024952688167534547747148224795424582213741607946421568055473699206048 0 2915408541666809641722662621608813243911694896249123841594323564469561417891 7099555106447080528053056634802416274625098583181520931433202453487840596923 1 5806584123200279547654943264803628653825623491623573047231309031029813032478 4357182111711972391105380933031709791923928387710860939843195809632530261417 1 3206818280409988230268706919667964109163991298559767373178626021044984489729 2634844369720103771190094913298644660161236346114605570908326900537028496998 1 5726536576548225856804250556629914680623616297629450303489060349170579610468 6292304278431328650905596113675451871012404438712499802382797285828506576914 0 5169567493434353177146172091280549083922289695943694181331542770882121646951 194989933564439070704799567584935354054904023230185612714802911369281556407 1 1912809713675391720841075867262349269820053682497470288806646073484925222722 5823709842838746739643782016373561394851035475326836443065032666603390807041 1 4817950227074000586580275839976548409417184766943033572946874170002619658406 3089157737929721870880138808922347208190645529217058420890861558073552976415 0 130532064112525543341947192128215321611567248117457901791079621350300363124 889633345661967576698831244896208397354127600769250851670197241075934593296 0 7173017566049627611961637667229341836912935554892773554725821389416315891716 7133448645250593764214856760768843267515783056965422435368550513826328295162 1 1784258366829883063081251261387002726123105246810365671074376354560773674892 2241401785370668641431687546840082246951528748395215139191786936049017298931 1 7058214912937661229374657825113193432653769130344334932673468614027641308511 4196501044768119970207032864653665274464562557262523150853667333384856391068 1 71137541361318450017298180027779953959853139108125038343461070207673236877 4912438239790402074181700476986182307010261516543961549424483247234885608059 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 0 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 0 0 0 0 1 0 1 1 0 1 1 0 0 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 -1815811392024137493920240198350677464260185992797530988399036538619364779166 4579899436234413340179980779878532926713243482296568972294950678422524649934 1199311249072361194561584168454849297137658590895541466335417098929667090678 12665077435 12665236590 1 6860524795219433322801920395646045145955711902944950015287739433832668375103 4193235823791839236788301877336861577481752257572882713124808508015751328657 1 6258583066783614616788149302459560653471672661880987671260013304136222285805 4973813344866580931319222905187185201945898891158370753428724893443620761391 0 9443378106298502321772716020986043475443071090712057112845467787358044883 6370078527675592678943018922377175312483841330304473273640653509392885617753 0 6549092747876410998669021553121289802745623447335976036547526908828856833817 5863497603423286969568706786950953288509486149548967968546417300210725870398 1 1166886238388098898830429484158446566501895917501174362414992306196051065342 4703615436217509124641804875335903249812173553043851244903067414699118360661 1 134512091579560000541241295120512347432789943648053915045577037232909821746 2458723728109701109545818944001137453430964737388927838863305572766497227020 0 4432548565936804163898154217707699007534482891793839831817294984696159304748 2258585262949779691160847015249020278743006918755125341659017893999948032209 1 2744480400264938128741662742742221420791364283650029219399595564605923003295 6369441512839070167700745526635950155891740391523941252197649143800556619219 1 5850296666900631876532415647248219819115358638681954172247242151598923483977 5560643872982077388283101650168445270217554577899151565719900360520265738546 0 1644787583906885269580911154752696083381307029259109225106733202967397256522 3690820264000078446882500806060434174371396681200946813410094154400287155021 1 4347079024998122594000938178502818784315403395376759754779862439595699117989 5276358379354419603974632142426691382250808038426993488024330904882809068115 1 1734189297771557838735943695805463487537218048798311068289071963710022632113 6901804210102437674674012667767219043436164961554257099532246925374818570430 0 1218675231482104411134057182692103659987145907189888468788317164506418844812 1497595433499524053569106343136922931425466984227525569108610834208383828486 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 1 0 -4908164698534801311516428169908109616256712812355729634722926239567610881952 1832843799391574246946179049802738448151923610719745281017155457071932498573 692516504303040824511954311472561623315001570187836630551393985567331021466 13443982300 13444146276 0 632395373433836443541715550420854242966531517564333304199584995048873017592 5979337142472367435689784571090765200193031223562464265571545845073086315024 0 90263868663899094107480203571718938353671769693262534315014586742650451208 3541955138051898923257337591863299270361695827734235350701184983583245115441 0 2101834115043333230323311269792884480602391784736993449156536368262561217926 6600784302824260661845599218147172503631485985957815890816856732956092162387 1 2687368552258682625782658083949516273635299801496322211634772561566967362883 1080379439572693178205567148892967982988238225853114853658130681131524034412 0 5122294805136347344013941468008964842133784711479560722776962251612902282985 1869837242523772809870469487615332282142841489394724580649524640235652121714 0 6933872839369371174524613955901445919026699688558762804863264615034875763750 6569417726668725859896979954181255961761654850938126075103867480039570056304 0 4221217130123179952756480258096246943761480284380782717515410949395085924569 972748205726892757216327099838453150472844874100358341983404943720955388870 1 4344522782076534839680123032982490522033136565432072012824613622221541978218 2912436711532780057305037560482850680406691245455418063744359621571968568625 0 5738480679705820190063609905177040195489548552149126817677512775060473220303 980880440263698125911100092339288521093148535263096355074651423915519268125 0 1235068803279447570281188035470888479208429767128112276808502748911979735888 4242262502323642502529198096496893506145073327049978988503087947212591293507 0 2886910266674173586370172401242806691104080553494659096133762859681963208399 4354209217164820794437674952485572078775598039783384383756015952078045877719 0 59056134834214549413203335513151558566598995015085545448600627484625937669 6406782137532870959590285905735913798418459499624634964511917738035519125418 0 363696729989039724101471405674845211120094790380932977487332671287344829523 2630419048351296609434751892703656844892216977058431289200366088972077954615 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 -6709531298409271196711951945001539817806849392527776961810943637089685315365 5426715340573763460127331471564724265199455768356358524539014080937113090567 2674572877302816394907857165582601209033408806583787385046330878595841598202 5298373270 5298476211 1 2264134497748172392210290725168533897084765495291548564864512600862110323718 4852844352032993527085116124841507618889390694193103037446868162453955727190 0 27585030617552566192957940548028334151863746959204218125381261086821191131 3797782649258677341728084276676874215430194512185695208137985405105268245438 1 1732975546538436291859711990225024612649529855277087909065393510797600198811 5757957245334773725123674465714093959315960193910803944177488405170670310369 1 4997098697413822760381763887722509922426906057321372393863333043405075746362 6061452309937494346673397467142478974534555148200985941585659527851021815461 1 5678299983534262159795579322748875447917213416532295261219600661936167654919 6978726102068673351394437337039303701484213992272411889937139546079928581143 0 1763010460362694811073723410928090874618277064384632077659118758257620778233 6183461646156194484505651196719743906136828541165511537432455637149542248538 0 5946969269965202712407937944738414899265270984402918430154685535365787066071 461423087953785992558569652677872687029911249356705492455154233901058388276 0 3326972891338771469515702446292051308689812184843671035979415402688494776341 2913102629503771944708573650601364598634870940990259569752510557938002716343 0 7215270367106288173749240830785312977326748817702278778942256284336688090438 5077207119927203868568253843068897422826605526142541331907088538181597031850 1 2498531155664988585691194945742819956516059887090108743213578484470202310371 5900576203395952118418686013790972644563086626515265920685546340774563570840 0 7127639230526285957487116602631685289255615728771894623150065548199328853904 5687594671116799198923224097854015171619604665185552400670567369657911212047 0 6056950504215233301332932394913847902199206580551080096415801866582484280802 4668368024617657398105226355834762760419235666323896525934385985782107584590 1 6253958567384896992247930099952888560372081799364766578845063495782599498927 2997934192278761596191355377522685705254246295271291961740142256451075777361 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 1 0 0 1 1 0 -1937903157919453467571448522567364743408187808746531735723295682731583733526 4559141744829582134794820580827803656230207953438918310137573011011181426196 2991716690873546764268142427338634855232545182181110366891774219743907785045 19130364606 19130560210 0 2708452223146837286003539736494990187845778213227343479079025697834042671499 4671675419765519594038107126466277857474899695817069457264605503635774818894 0 856002711694891306230907645086557284989799700451679127671078437891116300731 1888099449247413451141110022916284140175006950239230160557618678753456144609 1 851318098260000162635615587736544086712584782609981432542912074400884447381 2922552112577395250366954967793130281506571932165947684410803888201476359279 0 2538817619970697633495799804983047585791833933309873290727752694446407256000 6655805017879353947460654921558127026803729829147547309344707699216913690356 1 6946201679706190497370059049412401857087038763535151594952618782646448388485 46128986660966993866872811418239733464136512890377893712779755698318098560 0 3133554837342895533398207819011449624164445411738982599903353329767757626966 1472911968016757596714415818164947744714914915947005234292538666001087349532 0 4366823479470857319969864480527562266597129016076969580223724396792468008775 323753202409392001590331437750983745478755305164828935508629808542348220411 0 331739741869077913629151669868865144890480675191496216408726275740454990275 6141262534947336347287619648423311852560261689078991980498553994372948360848 0 4570808776873354819687119696952070549202342172924725419856430106103623626367 2858698065669087547733608120033089268693494585735708990315987701961404389579 0 442848481041990105174911344799948550570870571785599227301851253298725770075 3635500992665435668856366170329174552612963842351977386749903170630962296570 1 2804634903645675484725915857782612000174507797105244734135573666066463699962 1048425412734301715638488010646250428721446056814530272591110867534211884533 1 2956850421663771206731694609011451840604289864819878858321388496306560923651 5184272727208009560599380008008165038991056080458164597501356048323037783641 1 700061197183133840820741619179355827895138030348057423838260932947665771866 6689892611043318519145529956099619542782713082039918510009147156586130151317 1 6291866043870333876250739067355377942956609078710462787778547671545982305129 2043507685536366145265024797767420149967339850091096534268453346696013403899 1 1545701116687548827834561440683317552964057415345250846734341902523110127374 678300680084853350046842317430926386701124144496452510631132979638584920267 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 1 0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 1 1 0 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 1 1 0 1 1 -674185108903103112887489513390336956479644744863838054622809416810014454757 2227881494649420079779542035025295744110485079678029225401890478821522696012 4248553451162248022398498074285059809231127206956590631548217519883732507700 9633483415 9633622221 0 2633394945375758430113416367098783397906442974371744491277370243138583851702 4772012159794179188986985964157335225466519204621520427601325277167398643379 1 7214622852609163258736513486984243465501122668670971269911912749685379630990 254003399154884621110087375245918899930423385806085157569398028465519598867 1 6262560190693246035379733429473709101086026144525906852953867991818719850296 4467682278429641768547710802698829997584893901835282089066448042429243734998 0 4228785484876462078549550255243738673703288012543741729662485412479162314643 570471199188857271123211455570201690991740088689882979491117903273537075843 1 1165749928405140770760503429488811319153495397017833743478019413627803793327 879108045491085142995305812370729504829754874370667162021253958067496259292 1 7217658786760038535110308340560978960982475378595999582447111955140963103787 5965605553551989971590251432262790387415038542434506260846726310089165954196 0 2475866793098771317185398107292909683247358173078407521065576471313824346677 1521950665979181773758523094225111832375036692151433878256632717876447422700 0 3091358147686682039825542957093501296676722691807608751485525410130066149467 4461709983993630348503245924701441118299812921799915381365953050550229632699 0 6330132961674893549761165909000911272480937684913986677047981009664034214817 2981745436990518894724958181947936265589565394599544352508221624391393292626 1 3380559635488889770247232724562535237885735389926487502397778189723640111173 1801900058735212988811393696271068024417079972774029010375976755050596916403 1 2696117048974209473362404286493803540953297622121474100872183441938041397118 1182472163421627648740270505849974290882936350978645197731671514295175367576 1 2375945960944027123296314725375768316418723511640484600859380970585628079877 4157080620591651842766990831012098333360382658255042299669089469445871162108 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0 -4658259730114310985976265655870956911742186528014349276118353451402997364678 61333663073342217589689118116933030938377793886908405875679180941480516513 6531976321120829481255237217309652188438558251650758231936774492987760492575 10598151255 10598296845 0 880732472656765232150063586235107852675924476755929704426415630686121093605 5765996631384579950583351635373345123701345618876805241150262499338346930447 1 6678035144245543115245104970654775932728434357622131789603387383157693002974 2239851399376040978864991882446293900507682346391700674734154246964005953997 1 6420807457481766588122598370486241675126503973592784299601621106373740154435 3731608360818979495260874287419999675162288581150536138650388542416783211758 0 3250805829749145376932422364843194219958312755283404485776207118228984797585 3601625210061823879795004833077996478023911180800338418437333019942085791880 1 4245801636124916311267685129792686466900710431083602875385467358407819936310 6997596529226001011431621149588733713798786053995545807966974240482161456999 1 1722033368349446525972746533309877806358651120222459264474231229245593507790 3402372115910083373081285518432143946212203446847319229233062043396705623405 0 6054266257526348994858892618895962462135545081754931358092747867982044004234 5811133517971255365785834177343537479390665651151225336767824547222586941675 1 3261265780095319352938147753678407419295880823341075568770155270090100006764 7038086024806769074831356253933924749413394693594172078565699261268510769684 0 2574941526212149518411935520214727713502449297424104958159139994599984652296 2862765552122267704686554859848650518927181187750272474251047631870638184995 0 6840384481562387729466601139740141187158194409340069743838294737634030600882 3342600196594920925346183360348313262173354523365721111090002705169084337684 0 4508894244391507107302268221895076860482451236397766875311087124353481401169 999626441817684424751792408388180847616038548912567819802796830089384147142 1 7013763237634563022995673621091490314696092809466562274876399869062574574444 4406780501122264780591324464179933018800014291091943784170064245846378469468 1 5476697102785968886800146499008342838771108538945661778488633043491674045986 2017426160693751763707579505693011966232507394506508519121892318542021540988 1 2070682005279394947875864824563071777984732050608609670796463142446641852603 483674146561508957213621209236374080402966617666688126042630835341465157647 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 -2409874347594917776632483142150303586852019939317968519556603520089171145507 279837994753441401185668766171206327255500090242847292452298172532999698838 4421382318629991276782343523979059044817360320972638637948628736973875132265 13280180851 13280343825 0 4225690645707968058613918140575241322659657642227266890165033878905123830816 811835606501676291762204839886976334827689601064266974887254827899136853983 1 5245139584810904960590630149096861156052016777338522812671825076735454587654 2217194246672225392359908114727450714181269889375380729216483629711697332530 1 6395962441880018115397037536509976897249966704025483053845113814132706674764 1467199597116429247027493624178885265528991665441781587735996866401858004760 1 4357681364684989551266921029128629695234839983106223846189310017159319241857 85193415745822349177766997629186377958085149887903184239623881704056251617 1 6762419327057989355582247269391498816576030454665708307247382835262433420264 3791563159144760037363987861191016209762526587780222962747350298300873482558 0 4443094921312411792304825285692501664954770428421192650595685867033100461325 3297772059297574758265640873672592624070223542789796858424106373503913554074 0 1485568215333423988575950879564287005976753322502986200562171726147595644538 1801303522829343122957107930346965473352647984929123105307280498836423727672 1 4263693471930631205087218173846134278776637826999643569114121697594342907171 652446404433583794241472448929619684302179456679166199672959170304504046613 0 1884094393392666526343440546532783821604081706052753464443664876415773265930 4107518907015460990035608735217156417074609853787203309058115949930119534277 0 7192761292420179302129579462205156909924714576978850592355619101400128850727 510733495867272632383278163124146978964317160213753708867355484243976936604 1 6564024581746333259477250439970184376063447332457237603588186997103535802263 5080833605617385429867629761808247575730402057538327758776966978719897481058 1 2350149632135770749649016668801725868998659361499036096540029136370470292012 1183010222404141671052780632925486980667005315773723436072157674534076733182 1 5665553631183337204673413554478383245100216706115452649557305260201834406148 605471103183383640672848747192429876510880929838367509739214750961268890095 1 1780912399771381811483312605993294454895512135058219298627706671262539041179 5992492458022734307538433951037864420079330099745473003841728142016917493783 1 1658927578740696568071674413137971459263103707451136177681407689499939647512 3206428679489754598887677426646488688139759747470418331850111513140620049347 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 0 1 -411337116099653523186377089842514077566934151710983822344179875629296587910 4988356005643813253352107034008299697963474192498202501632040369234151966713 3945994345411684374342767537836167844977698085603182300469019625949659446136 9182360886 9182496403 1 1213337269994160551089214270692260830430500556170114199902717412762111700711 4319846670098361399007428988144477419929382151727071812406680530774387555265 0 3877147953313332631267667232279541477161542755274296668979048442484562298709 4289551697083415990258893107705104859734428273399562998524307946615246738309 1 6928606959330369984986048332699371859266909713741283663284549759774933405072 3640093229604211352584781221149171827273308735646854623942155573116416166410 1 663797212330153039137453773979382730863960362732349649909804527156332875959 367973299970382626221664449806508852152871930635190838260984316941086624228 1 5908987328770759333610561409183005543505397810772574714222753902822195430617 151128881568652397356815253637002706299781774900822866101087992765325335082 0 6518312616527922555875559192870341903101908504869437108833360959026969710547 1891397105510096985723644647441165160448663924515429135701515008468065289853 1 6535935727000391714129983877725609695546258380995360506234426218709460519723 3473737149138336423188220707552693769791107603568716766239853645374633264974 0 1111398542322955275642232710685486547654994735658593121919294714873337067086 6696819176246667785247952761535213223120451616033021601169174767435893145904 1 7036001968023354550439433391363599003208459923720676837442909435006859203650 3150794029606124794773538545427090480939899774208801493659022626049846916285 0 1388902182185825231805512993408451673486087680401807869977881375195765500971 5941526024567373576733920125211690653080543792265282550156640537613232387489 0 2457658975026282651809224233462477303694065141175806977939944914877851635960 2100642754994496395952680876757782721936679170892829542068557889027966288891 0 6647791568377385298418219967204907680880330151498300799943617117045338284496 4373436973967083480150830174056602623641795535203042909504871137969698769052 1 1510469825820036715208935464809764669109970848870869309500191969940825308385 2861643400565793366070798356418477203225484705450683741358362194811898607883 0 2501422940994904432150887419770765538185239679509968849430385048332415919948 1393679202632231182819567638921296106566750639907177749042661439560409384053 0 2495424635388399758419410888646206349846780936581117974553708863617119697128 5359066432409153250186137785775960714084114478558618922695735368110806255991 0 1916842964207775825044963018501075664036259045944087036997397150292705726719 4315138817677403780011367405005149778084469950211496601419332102738778224372 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 -6494865675517456010210280267676940510853729024619587054367779076675313181045 3744694715932664532768663629234934564149885755750912076242860936832658553165 3235451428649475619506853120678724296707249736020097302655487549747753024501 5101459545 5101560555 0 6830884007558750210962993335689536388527021386486130456385031189739923215030 453512897942809122209484560274506543987648574768366873923857207360266154778 1 6768472337209294189619549850212062752768955765739056441704718179807866044162 3414757855013672661535649330338949290961138394869530489156636376868142901298 0 3251981696961580630440403746268037556528578174627781143237630456855290339687 6442003550292730556167005659125810529363105148656377593337501958990859335064 0 2864994645784789416918041045219321949396583265357365021622332230518097191998 6331526654461695711612554763621138694020706436258345935698244640251487949736 1 885200231676332735051073247998263760807669123328100158034930887555973946843 5458747846701735344232692928160493108110458872137396697859220970031588273693 0 5006209063860062715914827580623437890608644863161880213039948205288803617321 4357965400719485262237351181821081164602850635099657226104988048828380747804 0 5908127886035096974297626255752382502390691621778214485259423574173337859370 5087884418833083362941659077199345322300016519271786143901014198015349032596 1 6159337175876658216106426967903564698955559119446442702090966125951311603302 6453481017249123594877017507648278188978428176092889945681609623746788991329 0 5055580138001222808696173976333294910467263482224279244021249544237132897309 3228971508098679320324279720546207475229932857229699328215552697057146447075 1 1337355183969559149681818546425687725180148386194210987443390464428806625342 7169059106911294860999943814703183303179686129653270537669415645576743476692 0 391031883971109325940003253167870802068617724057148533649453489426020713187 4820753111141417389453571017503008015538072038924407815595903020953843701972 1 217043577718438166422368777455460925010930055391118676459785211747415037663 2035063708470147329221904279253291736747106025237471886446388557016867857029 0 5114937658768038163729885210687010456615364262749813991183066892980229567805 165983176840206393201828159622224965246990948193802823173034006122445505961 0 5724931612338501690074967073565710652538058094729767880245705844012041177984 4099556744633997663012014195002538839319935317035897426477857186765173227460 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 0 1 1 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 1 1 0 1 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 1 -4507769755287284245435572638540915248992037120585052061403396080171239627805 1181224708408794035579334900136922907273603544202005990551905841144007950952 3653756965513191241560441143228922732492533217901679935044387648971801554679 14098143403 14098311321 0 3204169997055009537410194788857184181151965472595828417342557187410027679074 5283517693215333594157412288034814152213328039274407259749478260150372276849 1 2096562085845140483652754622579274616693192225463053336941398183614045409216 1207479515519387556864672015720317954271280091854891058254897160981864143497 1 2911071441423796742798261979412195712285870363662815225205097425473519019563 2504093394221189937185212946132813245582020217622525531061863573239534820973 1 7224937407256916052187941159017779793136800853641675758464973294976488798576 4287288081599262524308103867126119624343495639963728021395311175687737344957 0 7074570072000923463088246575720562781389176197501240361306487491542412787516 3935277971632671405736416702385816050459618477981881665183686206277497535828 1 7027785649997695049911275449817388485510252293749200847687457042695786618928 2488254162290954371567349975552099514326228976420440364139349673392494378987 1 4725484567202345993908220515873766977034614473468227986813041414013349809379 3796443343062676048702766991461672193656901254698771123155218771435549789897 1 2353200464697308656546745664503341423918098014806051207650763069249637875145 1968285897829881090658690108565023717421804137485342178711743222185912086885 1 3025367246581220709907066515629865004670665250334561102152012650375987945226 641801872013878203610315441225037905044042097723906258652577991259922174328 1 6062127911699953611465772876132793688387582324819285471053652052495624457828 2948879678590908170806325944519311807450053294038861014731807996017461785640 1 433999008105754345253355389083573815322921141197893563503394093520934774052 2763412027731165150652915370342173279290073510040568723489368696934578922489 1 5938232201967491247638616546715155166566625733512424076841629684437384320514 5694422345189995789905960415844327373497012147821263043890862395233726464851 0 363696729989039724101471405674845211120094790380932977487332671287344829523 2630419048351296609434751892703656844892216977058431289200366088972077954615 0 255318790323108805651161911215868491649022655036302486952727166583136635871 2579829847306130374388816304669507165640187567989715293261257129428809777515 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 1 1 0 1 -141749666139715570332682906386407181904235337043725718674933152487607954622 3333348711374211921102026469745881578569366964552256172642935015094024438674 1652044898383032999235907846737783609631013335899941454459008368556238402615 3758314951 3758401650 1 6402237175792995432768674101572782160764129899948650367428488196160131135100 7035418722715687657764896507760597462843809822497935196530430903503259049759 1 5539231084181863197248303908309971148940374448696262251757255165549829897306 1017916012174788930375509773772396026610656467926429375619625974920232111545 0 3306231160815781379892440310422990848624552959001612235758034308939616721819 802372745015624038532917154793455462108451897487837519765498138771661816652 1 6002383270467966960992772931553986918399217869044811438652063351921146799052 2356475130050049455566492246308990363151095007898567800603384281492328937769 0 7099787963319198676418155780869295240812343098920852435344752316573577451202 1061018844388180009549000270889689670897636616130968675985376616746584742593 1 283962964585724660120472893279704075857292898359161859527930764483407522016 1084662366651101645595287543978661401777647642384059801131598184330892725139 0 6916360314277873154643751440021692571779503060615750237113213668787929928840 2432809058784852891452845380327772008514951950825799772842227142058908356401 1 5274777238731582877395632589889055452296412339967097706608107445376022403891 6701364963434738914676836409108915738938200851328675688284265442871748654927 0 1589765706149307142076196204176084610779962361940193625993406835135963444720 1437824186653672340436829097506412069618783146151076575946052620150687329407 1 4637730955415521047667606427591573517944838418711054406169234781868447955481 6755078563501457476945225961735388442523039187540518991460794683753855673623 0 3135366521075050143482112623954662451779738000317962028576637588153573105236 4135576973833282303488485510561786267578979444094665249617963208052362975504 0 4303282446218706518828599857471996926824950562688557180143588747315714889523 2574080585760863692232652064130459736494368108692541193185808673769014362544 1 163640069797425613178011720592509129691551258434111466205497872043906326105 3115600098334398370817251574903370372248321068970469017442560378076288064858 0 3008681916458812276446858367200972896798164983198556567414033910665771509612 1674006644208828868114335309912129518012300077780447250235242756633583649517 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 1 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 1 1 0 1 -279441146498462410410732086723867344872782597670609747073771637000283059299 5966692381167310800193028302539593729301366660882159971435967098979737355839 5780671495374619121491398756250624266269653299541889714959085380814698082729 4135632931 4135723878 1 261414124426053034276151876684553730038430984343871762681797414808905272159 3960910091033578050938528246219348263417833650261190745171451599461387888627 1 1500026447978448485055083278826834484107240020740485689384170065935345242558 5301534077225858411667536439392054508529688929911594012944955903744876546527 0 2179550771499826494532629167009605868182013626978725325708529016967622403028 7217009736027799458065584063848945986933317151724625726896343100476484639273 0 6085304839268543786925949507468740440612795104545931333919553594921851024765 6937037442378861182245692031560751768714334261119104177225949104192862253920 0 1526733904699165659631456237549989060726178132911179714884676699727918063899 2539798537039258320707045442527934165691684719930221847928670976179949914189 0 2136696935499944379118241396626393990075330620393872891025524466001013060948 1453908050156035725409003827978402677516071877908408721103991559421140563959 1 1673237278310974112723430900828314741996762617739648579844810991136766818987 1416199759131816265939416729461407210381087049942593761532806089177914391328 0 5544010019953439881295223430685584968468585895609307846920021411305446043790 152262618308261061717540359687642636907783820340848537805087055064309248508 1 3073411661341192865866691548583964138989728184966499304258797234997562279213 184477375203467148864149971247161819944527598395550691899957028458471208496 1 6185936762402345796977578084676999200005301791125869425584114767579151643594 6440622631584540131973485916151884459481738284704045684156468641949242130862 0 6895738620209302281138746759447504145815111410890718900255477237032313766591 5147671081548472329144927704858738169833958656991475247014232880089902524340 0 4128881258858919183926127905455072752308185987758250449220340863634958276186 2445151746665730085137191693911106554016922471054472153293577382909543875402 0 246848846927257060596821434665218835332295763904111594271401788884109241681 6917423617096940902755917577082785011643411351216872803204018177392881001885 1 5090748703440058322533835386773067184446085706853048507371361765724182261898 6439320730109434853942508615259018952321623190328681292899324119434553793009 1 7140754668647272112814493990049054825140096114627930483270802526092735937413 4286859464591635620256202196776981414836550551572455967846750943009981185655 0 4120647068958415441355964321817471767720696877661389539060775384324417133112 6007532523085163487285207176715458994419724587222413607140366354245965693715 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 1 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 1 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 1 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 0 1 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 -2463814192882634761552351463485386305428611070231266507161413600633295380614 4778906830490187930215189253646428414307435489374590602970540705667264738539 6358033313713670113509879284854276922700069148689667191872065591892013460105 735840703 735879066 1 4512065812986145563941264531894313695479335967731711176418190398027491962880 4585618825582368349499745260413842980212631325421530007148608245328925141246 1 7093693253549919846553424774859122897892086068838245144109189217996740116320 6115162075500795301443710100306069364302210311550869033625039430024857616734 0 403064179756851105957547784199363621758777460547089593730669528879929613328 1180613057220425327181047919592246491095451808932492004402339068808593471129 1 2885158119546066399489944764644183924157662068467965189236390535726954371922 4169064460047428901045190182878408608704821291529294041757264628008523110874 1 356423496401006082414701770984193487292218990514739448385183066509498705689 5770813269554688072373531960653914912171156879213048212458306156543326356676 0 5413731857047685210478408313269839865661565899876748993435058618321910865617 2848368885410613343943620956747544168879620646078073752839883617235736013904 1 3318623337358983557935904062531702306375053643466027065756884396192989143931 4806091054067513868140832714045223737720118040722960566021973353441755605776 1 6324690886794011902903272373509912459577531751974863316099766992150308453881 4112508869541298507165020958889891268983678599675909056488778689809508927929 1 5907774979176326244451198049935500663344575713705219702148631491018318161987 1656270812224087025891240244947019714403423191631150747861884891504904621647 0 1751577605888498108735460156103977991312424389575876440088003157355603770819 363462346329462633371279111811508003858085681754417412435613926903196415840 1 1885354518060269076700334959349621218760822515042256908352829062876886393771 2932906257113124515027389705031142046049958301860948710482122296291299655681 0 4996119063426274032509638264605298813490634408072232325484569080398220686033 539393338901446711755805859276053253054425088158568787433590781569232207409 1 3126411290698103152078171494198189830736859833591219303996251002631133114554 2600988401240805938641258698527546666274311363547560874328379455155722590001 0 4073581508767488842240973097615097844012564888019022424596994459539521427923 1379106626301444027278101436290204624862653675570837637159430865555825229013 0 1879948875049732352402425508537100304637309461937316525100040799062026578473 1127368655285229970033601759114879106945293120520632450112665130960966991620 1 5687077116396397826992470528241329582976409354198675425667564437714246767414 5506790747056644037789332934887656180084394399472322694498284333761029089786 0 3247389887705450882167352921043714928904659539755936783959374747148226959863 5921410316512711889341162314115430891706855995706351049184251181111310276219 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 1 1 0 0 1 0 0 1 1 1 0 0 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 0 1 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 -5608567249978964933956935577203240539635572717155822739820717473313958492072 5575199646388088258281681597445059416290917824448087191577360694400633201364 2101054498738664279963901074742425894279274657248580052597303055234268156417 15711706011 15711883278 1 358996678377150844516425015445500216676596278759409456313101512349467699855 517675722670904264614507014017338276130612221250348304794881602264677673434 1 5898948687329936985435021261037024475838819577972086585488017024296604792376 2887679317114890796944762050652795819367635960441536130657376753512737948112 0 6588240577389597225443538951170623904996994032731114155142691604578549134514 4980096069309813428193077002360099948294327969330474744953310649379200484131 0 3258120603730247992086840210789448304809748525451433009930993960634444750203 1168475148193933730735649358116290231529110624554862207946919760595284206407 1 3619804300672088607357464258645585223151242307844862568450013965626797895512 1973741125903202695984182624410799279955612878496825769638089928747169260364 1 2945799992553282621812701691659521267953871238909202801965089105554740448962 5484384459521449483493927344440025387918873660982010001818176365457482845099 1 5010748015736433353239703737186480124509568508679098382343906891226618694887 2603428095128047683911410381675481396018416362510954969639725189440480399486 0 402719221760775169780360824263263050198640714331215683498971539938786273053 5815571282464605893723330370105081222273928484499556702843344299761681489237 0 625607516934213888586867713295111758923053395256753966555882286642932669719 608531790569207139268200521928140804591584179107911545361339649141085292344 0 718231667291626200124809010559220902455509669071563391472666539834822052277 4969247555659748947335484518998553409232418531743378854387013958863310732489 1 6505137865549212258724930735113180051914217038958288504419281055597582683715 838277864920760422237377806519091571486729097147004613343393975135452766550 0 4193356029790868430474934347338083466745554601344433669530866249804531739167 5712381951623240314459823259852882707421816755425537865452382538833337652352 1 473268395377376761198012209907354324655198812631736740265192409770312040813 1236326527038895752332094204078221645686040746261398992921591940269921258818 1 6038150597466503369600859833092551400476629935931206428693873629821454489211 6647681684354920969875870513793160965360903853074782372081224845788271027182 0 5960979632833988802937413847709367291336547235979650555453936790001355462736 6027713273041049461933592398892456728821229452636308529941602039910340636822 1 75714175783114813136904921773885234165189823926251183275198764271215918303 5705024172562245063456460723162279959446371916563533835098336468004872801678 0 5126049682554723507111977801477248181561277505625738726318844642093929402141 4688699182515655385219672515850617454332904917031393771911107446842791350069 1 7124350266952138735816264580499014098861237119227558187297421883717028704285 7093180249346056219327646265352227358900445421947854833375022172940260534946 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 0 1 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 -726639462345983603074180541432929429251095458347805329190886965966837323755 6924618769390453088339123042806473175496678493493444256044789288252187244194 465538450318191790449631921497270257612220156167391048841158540608532368205 5677356961 5677463520 1 2217992452175053254539050348639337486034074666902438458040182145291152134131 6340224100831406537022077953455450557181244291788396718789469719873138229561 1 6192021770369850879489793362764873978868136506758630335682195306148710175140 6917853170561700417864476212964382085300785822230116091207648622633309994891 1 674525225684926902677985814492528807396883268933200497114708002801843575341 4045001524224706703150409765025577538545091142326248159939913468496452769510 1 712503002553676451885374333409761679127067106667749142407726414733495739815 1796864304793163254066025670726940011770487223751113171714478271854392557363 1 258070336569246732459901226371814651224006482978441800553753988929090248120 4211421129415068668236863174011719399233950954358513178303097140773600750483 1 149264390041914695691418766308161056516558430647605688179576329996821481566 7027439260993284112172315195999461799876688126136168582065917630253240577620 0 6272730828280153123286303256465559818064894117617495925082380208900882049499 6031374650197103929022827405811919914711742509911552164833674416891221968564 0 4787129423994484305809255819281020222292773811843451810318465278854822642689 1533361886100286072633623837329028708371755117329317296246317608718885927848 0 3225159101065529204491749196710284975560782549809458514733322902717649238983 2013610505313703561941757762655425636954963272817303156308071181222949686016 0 4259217480452626141745368986148066316258543823809968675411726130070286144768 5353337225941023788105942628362915194097428191434766454866867669849680443375 0 2480945456196614330103532521953201989881252061956788637201872865988558651559 39083459107935642933375151291211598966667982631753820829079052597598380191 0 2932369671720069498715063191105555094155520568073095591586875204345936848338 6473491870862772662490624101018703060189694364252318935833577644019563114494 0 970727682095270793542453601054198594642133672474803627230815467125757168618 1626030508205881518883397498794858497334624947301139991060396608225368938582 1 4517530083434949385376530900178327874585108935095421502889777199488373553386 4240163637356486857838355974595222790952632573925583891109355319561975649329 0 7222079828717537808258446986763174540294714214521950185703748874700958249712 4821240364401574144123367192928818425962552414356524386102911813520765562377 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 0 1 1 1 0 0 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 -7029453728397252411500109468765427644675606300588624066264012346361857758174 5821884350582681802280024642454030715477514297979153689130247741366127335706 1620121574545333832866153123005926509566403634949471224083986574853498571635 7301092380 7301213220 0 1138450458390094426112561322063251368680268882030663199810094323124555412902 3099687930727873114810793539413286489867834835527318768045833678742554144406 0 817893902928073426320055028498516173969485374002363257619443108302253183291 1706107399468601056068856852723708770816768631295579883694925864234379831985 0 4331951123543704415477238916966750641548450742275863914708318821319439887107 2240308890508888746758907737290168436693901096457783411778054330699834120261 1 3424326963759029833770039825783546074667884920946247361248121292888599766628 3410329567720119287258372499806535091649387626145389336164479355408319270492 0 2437387269011880096699081283137160204898257435523912836204087644424957306535 894485048539124860260051265978186873548451437966645282175872722261423564331 0 3192261504453142021360661306375124387076811739600097027493115852621170103982 4715214198023919569162870620261595521973606177307904244210402668787471472681 0 2781847266927822129598263169883161840041247002967548503994116908537927709105 4046885503602929468221589963692122684216483936356230053811553368892458234513 0 4071421432567568596041965283909904110079936846826540672564664838376547491787 3909486806189716730495456615284885717055890911772480684818336135225410360081 0 4502894246418282964976028667139913704763960332767200021904600078233782792650 5111376015454457396122757517136128425165516320716359777882671346295216003193 0 6822395443397155720468506830209035564877505182262522500369495376387610848120 4256130175362539484890043936005014293686834628190122807631270275824711161868 0 381587827077940780343700252948305267828895242687867325974328645516175905370 5076054685263388639846366083418591669610196374827711443108751702880918545735 1 2716624735279808654707628380114972718089722437294438951140070219003606061823 2863726410667765097528054096725854005399123885023985318551050900789164853757 1 5313004094960577382992851982178553950416349496888046876389477001925623392135 5267829154976129502243133106035728806461221322527992056725885796947152992349 0 5237768513081485929680295634090445556444284522998767037852659028663994480220 739650949362967681988921534216202599535680091186704834048995498400083888142 1 3388195810939638304236486121314022447228506760618789468489466365245798428999 1069676685171082688990493113514212495090067053651893182805338305263889712162 1 1004585010581123867780194833033094458602609503603787482665564173044305814333 5790843170025655156958204732740846789731340874343368609759822119700439156535 1 6292354128544809545369846299531964688956128622955546927896938429127055121775 1547298233859411349976501480036411272553118875289508802571766961487440857133 0 1914472455159853473875563097218525265907707749578633168565813639999495447836 52185757959044640363679501691450091417107090845051481940491163679957092722 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 -END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/compact_cert.zok b/zok_tests/benchmarks/tests/compact_cert/compact_cert.zok deleted file mode 100644 index 110b935c..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/compact_cert.zok +++ /dev/null @@ -1,207 +0,0 @@ -from "./poseidon_struct.zok" import DoubleHash -from "./poseidon2.zok" import poseidon2_batch2 -from "./poseidon3.zok" import poseidon3 -from "./poseidon5.zok" import poseidon5_batch2 -from "./merkle.zok" import MerkleProof, verify_merkle, verify_merkle_batch -from "./schnorr.zok" import WIDTH, Point, DoublePoint, QuadPoint, PublicKey, Signature, verify_signature, point_add, point_mul, point_double_add_batch, point_mul_batch - -// Reveal Proof Entry -struct T { - u32 i - field[ro 5] s // sig_r_x, sig_r_y, sig_s, l, r - field[ro 5] p // pk_p_x, pk_p_y, pk_q_x, pk_q_y, w -} - -struct CompactCertProof { - field sig_root - u64 signed_weight - u32[ro 0] t_i_list - field[ro 0][ro 5] t_p_list -} - -// Verifier of a compact certificate function -def verifier( - CompactCertProof compact_cert_proof, - u64 proven_weight, - u32 num_reveals, - field message, - u32 merkle_depth, - field att_root, - field[ro 0] coins -) -> field: - u64 signed_weight = compact_cert_proof.signed_weight - assert(signed_weight > proven_weight) - // let num_reveals: usize = (k + q).div_ceil((signed_weight / proven_weight).ilog2() as usize); - - for u32 j in 0..num_reveals do - // Reproduce coin - // field[5] inputs = [(F)j, compact_cert_proof.sig_root, (F)proven_weight, message, att_root] - // field coin_hash = poseidon(5, inputs) - // field coin = coin_hash % (F)signed_weight - field coin = coins[j] - - u32 t_i = compact_cert_proof.t_i_list[j] - field[ro 5] t_p = compact_cert_proof.t_p_list[j] - witness field sig_r_x - witness field sig_r_y - witness field sig_s - witness field l - witness field r - // Sig Opening & Att Opening - assert(verify_merkle_batch(t_i, compact_cert_proof.sig_root, sig_r_x, sig_r_y, sig_s, l, r, att_root, t_p, merkle_depth) == 1) - // Validity of signature - PublicKey pk = PublicKey { - p: Point { x: t_p[0], y: t_p[1] }, - q: Point { x: t_p[2], y: t_p[3] } - } - Signature sig = Signature { - r: Point{ x: sig_r_x, y: sig_r_y }, - s: sig_s - } - assert(verify_signature(message, pk, sig) == 1) - // L < coin <= L + Weight - field t_p_4 = t_p[4] - assert(l + t_p_4 == r) - assert(l <= coin && coin < r) - endfor - - return 1 - -// Parse out the inputs in simple register - memory form -def main( - u32 num_attestors, - // For compact_cert_proof - field sig_root, - u64 signed_weight, - u32[ro 0] t_i_list, - // All memory entries within T (p) - field[ro 0] t_mem, - // List of pointers (input format field[0]) - field[ro 0][ro 5] t_p_list, - // For others - u64 proven_weight, - u32 num_reveals, - field message, - u32 merkle_depth, - field att_root, - field[ro 0] coins -) -> field: - CompactCertProof compact_cert_proof = CompactCertProof { - sig_root: sig_root, - signed_weight: signed_weight, - t_i_list: t_i_list, - t_p_list: t_p_list - } - - return verifier( - compact_cert_proof, - proven_weight, - num_reveals, - message, - merkle_depth, - att_root, - coins - ) -/* -def main() -> u32: - field message = 6908441180828167112785246881494320159273940089327447106269949444716788494909 - - // Let all attestors use the same pk & weight, does not affect performance - u32 num_attestors = 8 - u32 weight = 5 - u32 proven_weight = num_attestors * weight - 1 - u32 signed_weight = num_attestors * weight - array_decl PublicKey[num_attestors] pk_list - array_decl Signature[num_attestors] sig_list - // Constant folding to avoid constructing new blocks - for u32 i in 0..8 do - pk_list[i] = PublicKey { - p: Point { - x: 2023776050662786605020065854616777351003832247628992350849206310281785027488, - y: 1079270832837170318396516616249394502719834190979906495690419930531357954746 - }, - q: Point { - x: 7101684830137506950821434332972100736705268320764486193269722119377250644660, - y: 1764840689618624173098512281158161439147043396136846829753116276022936136130 - } - } - sig_list[i] = Signature { - r: Point { - x: 5824293800188062938533237344790739102726705128562220570802448947038150657007, - y: 340848841123394720212279364279745606262149681372696003943728267198931244360 - }, - s: 4415915127126372096757067153593537022657929051278082364476489088715040314973 - } - endfor - // Pre-compute merkle tree - field att_l3 = 3568540802966646228682833257557760865097881745527951700421217637177394578913 - field att_l2 = 2484212816056817413898735043111201825935337234900653303346593633698983423094 - field att_l1 = 5903852974969142884799701163972075918012827147993384813454715036777418930530 - field att_root = 5370923878175693173927301385262983018969346333984379995904147798742460333298 - field[8] sig_l3 = [2143011384822392262595217693211276733745818975285573378412503830433633959080, 5158845522944913588713567773900368475672965537784145747547478088857012853666, 5894431764744941209369386797811063446586114379583965613751294306331542502696, 3667283647262791680030373214327691510807066264550220904438401348778560171091, 1932762137729700956492443572973924935698339638272997763907569306777878106609, 1418160613934592350074019113722063326372415219334378482966622875040143984418, 1123602082019234105093136610853837217580120360581368113294785447946335970166, 677162234791219704923474809188832072777286476135280817077786787139967839874] - field[4] sig_l2 = [4160497668328416341124388728115946100594341504290452585444083838585144458368, 1786009993478681170835177129397965607571769106910016212295375778662767436399, 6323428707993845638065745016939134132792346703598261115088661703160553949516, 1179006504278106626617144731083403287975523722023953894416803973871305137607] - field[2] sig_l1 = [2082031909420678479574926408191366694068435842853798548085170995138065656765, 2509162190273150374531803693747128200974026349740956653847078957273579771806] - field sig_root = 2845540671766269799140204035187166219383492292318390575781563565945781070871 - u32 merkle_depth = 3 - - u32 num_reveals = 3 - // coin = [7, 30, 34] - // entry = [1, 6, 6] - // All bits in big endian - bool[num_reveals][WIDTH] e_bits_list = [[false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, false, false, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, true, false, true, false, true, true, true, false, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true]; num_reveals] - bool[num_reveals][WIDTH] s_bits_list = [[false, true, false, false, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, false, false, true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, true, true, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, true, true, true, false, true]; num_reveals] - - CompactCertProof compact_cert_proof = CompactCertProof { - sig_root: sig_root, - signed_weight: signed_weight, - t_list: [ - T { - i: 1, - i_bits: [false, false, true], - s: [sig_list[1].r.x, sig_list[1].r.y, sig_list[1].s, 5, 10], - pi_s: MerkleProof { - path: [sig_l3[0], sig_l2[1], sig_l1[1]] - }, - p: [pk_list[1].p.x, pk_list[1].p.y, pk_list[1].q.x, pk_list[1].q.y, (F)weight], - pi_p: MerkleProof { - path: [att_l3, att_l2, att_l1] - } - }, - T { - i: 6, - i_bits: [true, true, false], - s: [sig_list[6].r.x, sig_list[6].r.y, sig_list[6].s, 30, 35], - pi_s: MerkleProof { - path: [sig_l3[7], sig_l2[2], sig_l1[0]] - }, - p: [pk_list[6].p.x, pk_list[6].p.y, pk_list[6].q.x, pk_list[6].q.y, (F)weight], - pi_p: MerkleProof { - path: [att_l3, att_l2, att_l1] - } - }, - T { - i: 6, - i_bits: [true, true, false], - s: [sig_list[6].r.x, sig_list[6].r.y, sig_list[6].s, 30, 35], - pi_s: MerkleProof { - path: [sig_l3[7], sig_l2[2], sig_l1[0]] - }, - p: [pk_list[6].p.x, pk_list[6].p.y, pk_list[6].q.x, pk_list[6].q.y, (F)weight], - pi_p: MerkleProof { - path: [att_l3, att_l2, att_l1] - } - } - ] - } - - return verifier( - compact_cert_proof, - proven_weight, - num_reveals, - message, - merkle_depth, - att_root, - e_bits_list, - s_bits_list - ) - */ \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/merkle.zok b/zok_tests/benchmarks/tests/compact_cert/merkle.zok deleted file mode 100644 index 6c84481e..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/merkle.zok +++ /dev/null @@ -1,48 +0,0 @@ -from "./poseidon_struct.zok" import DoubleHash -from "./poseidon2.zok" import poseidon2_batch2 -from "./poseidon5.zok" import poseidon5_batch2 - -// Merkle paths are now directly supplied as witnesses -// struct MerkleProof { -// // All internal nodes on the path -// field[ro 0] path -// } - -// Perform two merkle tree verification together -// Both tree are of the same size, opening the same index -// Specifically built for compact certificate -def verify_merkle_batch( - u32 index, - field root_0, - field sig_r_x, - field sig_r_y, - field sig_s, - field l, - field r, - field root_1, - field[ro 5] entry_1, - u32 depth -) -> field: - field index_assemb = 0 - // hash of leaf - DoubleHash cur_nodes = poseidon5_batch2(sig_r_x, sig_r_y, sig_s, l, r, entry_1[0], entry_1[1], entry_1[2], entry_1[3], entry_1[4]) - field factor = 1 - // hash of internal nodes - for u32 i in 0..depth do - // Depending on index, cur_node and proof[i] will be on two sides of the inputs - witness field next_bit - assert(next_bit * (next_bit - 1) == 0) - index_assemb = index_assemb + next_bit * factor - factor = factor * 2 - witness field next_path - field state1 = next_bit == 0 ? cur_nodes.hash0 : next_path - field state2 = next_bit == 0 ? next_path : cur_nodes.hash0 - witness field next_path - field state3 = next_bit == 0 ? cur_nodes.hash1 : next_path - field state4 = next_bit == 0 ? next_path : cur_nodes.hash1 - cur_nodes = poseidon2_batch2(state1, state2, state3, state4) - endfor - assert(index_assemb == (F)index) - assert(cur_nodes.hash0 == root_0) - assert(cur_nodes.hash1 == root_1) - return 1 \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon2.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon2.zok deleted file mode 100644 index bb8b17f0..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/poseidon2.zok +++ /dev/null @@ -1,2353 +0,0 @@ -from "./poseidon_struct.zok" import DoubleHash -def poseidon2_batch2(field state1_0, field state2_0, field state1_1, field state2_1) -> DoubleHash: - field state0_0 = 0 - field state0_1 = 0 - - field c0 = 758662019503705074 - field c1 = 9958560809385864598 - field c2 = 1277576466825840593 - field c3 = 17276116445666047290 - field c4 = 8462567671021664875 - field c5 = 18311663567274789012 - field c6 = 14794487373875431679 - field c7 = 939955959186974556 - field c8 = 13578068033787386336 - field c9 = 16936160577869353999 - field c10 = 7564443307661759393 - field c11 = 5701022615025077794 - field c12 = 14898040799158503403 - field c13 = 7398753701805340846 - field c14 = 17145662177513207623 - field c15 = 15919612504434736882 - field c16 = 211911121069562741 - field c17 = 14627162831253564776 - field c18 = 3736731127424592191 - field c19 = 16164080792556653606 - field c20 = 13310103488076492265 - field c21 = 17714184600411987649 - field c22 = 13937509549526454080 - field c23 = 8467973550572764378 - field c24 = 6149415607253035464 - field c25 = 9902966326901151535 - field c26 = 2299003035066075543 - field c27 = 9361464291309771166 - field c28 = 455760044697694737 - field c29 = 18069040773191725180 - field c30 = 12156451030386903890 - field c31 = 13269466490844642616 - field c32 = 4644627377627776228 - field c33 = 11517517066878151266 - field c34 = 2085762791679771559 - field c35 = 14341814612745946357 - field c36 = 8220722365145856681 - field c37 = 13781050119424493396 - field c38 = 14130172974922698924 - field c39 = 1268378720849035897 - field c40 = 13102522127585690797 - field c41 = 6435545073175926153 - field c42 = 10680323768845634897 - field c43 = 5377035848961467433 - field c44 = 16155044248960735250 - field c45 = 3956646720460237409 - field c46 = 15192201422078376101 - field c47 = 2254261886235227853 - field c48 = 18263210726053991346 - field c49 = 14588739567027142820 - field c50 = 9572725267846457115 - field c51 = 4663609806895345720 - field c52 = 16822560014146547002 - field c53 = 12821481803562047313 - field c54 = 3027425978972870548 - field c55 = 16762600845752241175 - field c56 = 7067459971848174565 - field c57 = 15884202556186149044 - field c58 = 8501625320175123709 - field c59 = 4388367812943946907 - field c60 = 12299931046827323210 - field c61 = 7636538909023199578 - field c62 = 14046758094336955416 - field c63 = 9633246818970530654 - field c64 = 13491266525055530545 - field c65 = 5423497366234120042 - field c66 = 1751962590333377264 - field c67 = 10513677123715294214 - field c68 = 996968784189528765 - field c69 = 10448850931434990018 - field c70 = 8953917554828103116 - field c71 = 1626108945262700028 - field c72 = 5891489572384527092 - field c73 = 6643806719713918869 - field c74 = 16083801189239088971 - field c75 = 14868933033345963433 - field c76 = 11850469235653996642 - field c77 = 1324483046183023543 - field c78 = 15183755263354743993 - field c79 = 2495724238845411316 - field c80 = 8731170262888399569 - field c81 = 16304783671381988951 - field c82 = 11235544699283452233 - field c83 = 2137768936382175302 - field c84 = 16675115627845335581 - field c85 = 2963350077420008404 - field c86 = 5398589702654192916 - field c87 = 12140466249394573251 - field c88 = 11834547998206516929 - field c89 = 6177294541684099188 - field c90 = 9838863225522131903 - field c91 = 4701779667688073310 - field c92 = 12835837905699815771 - field c93 = 2968170957340817290 - field c94 = 9828791715764525853 - field c95 = 8442028361006693278 - field c96 = 17176968168399522482 - field c97 = 17999791729505949887 - field c98 = 14962719204200253756 - field c99 = 17300730933512754375 - field c100 = 4222119091375155707 - field c101 = 11298113638119509435 - field c102 = 12268859188885459376 - field c103 = 9034427714391492438 - field c104 = 5990277340027239801 - field c105 = 726299115287076863 - field c106 = 18303937711932738539 - field c107 = 8960550811937596675 - field c108 = 18420334683743066202 - field c109 = 16986003784188475276 - field c110 = 13588430238611272524 - field c111 = 18102499241351263781 - field c112 = 7476618494341797169 - field c113 = 4184084235455659562 - field c114 = 5668298044436776508 - field c115 = 17447913737721385190 - field c116 = 11088130260910156172 - field c117 = 8792531517070849900 - field c118 = 9397646851851459952 - field c119 = 5121871193730760910 - field c120 = 2168557202402322871 - field c121 = 15702569595864319029 - field c122 = 14720843552400861125 - field c123 = 8277634810410081765 - field c124 = 6233674368436885280 - field c125 = 4306433523940866942 - field c126 = 17722591435523141845 - field c127 = 13983984591359038932 - field c128 = 9195938109190900291 - field c129 = 6074479640755470700 - field c130 = 14078059641315677730 - field c131 = 10695375213011552670 - field c132 = 5573015714231677140 - field c133 = 16984666835191674642 - field c134 = 10249524339733897711 - field c135 = 3174518716637848153 - field c136 = 7188570775991726809 - field c137 = 4753011490148598290 - field c138 = 5105443631000558491 - field c139 = 15781086678953962161 - field c140 = 3458297099390436339 - field c141 = 3082524552292086 - field c142 = 10885272710257457992 - field c143 = 3236146052509314745 - field c144 = 9696124289212404307 - field c145 = 1485008535953646698 - field c146 = 1137225154782514508 - field c147 = 10514784977699897262 - field c148 = 10729284392631787423 - field c149 = 14959018802228526836 - field c150 = 5311814720150441561 - field c151 = 15855390943452519568 - field c152 = 11214465269186418739 - field c153 = 4053806423852004669 - field c154 = 11760999889540157928 - field c155 = 13155611628497688688 - field c156 = 3842739007828054055 - field c157 = 5711430659662298364 - field c158 = 13288819076998297778 - field c159 = 4820382956965774345 - field c160 = 9818136475875046170 - field c161 = 15891193043142164602 - field c162 = 11369901158293474981 - field c163 = 16014685768489088745 - field c164 = 1356361795046325322 - field c165 = 15790892392481609398 - field c166 = 14921870878617925995 - field c167 = 7687231355395058862 - field c168 = 14150434200392676099 - field c169 = 1103438709908116920 - field c170 = 6477771864968923918 - field c171 = 17883003884435853137 - field c172 = 15616808237597542650 - field c173 = 298930612681613218 - field c174 = 7783145673030144050 - field c175 = 9925877788921434933 - field c176 = 7906428066733709088 - field c177 = 9059024899257096185 - field c178 = 12128791653883821821 - field c179 = 10439342184366574094 - field c180 = 16838255109359414152 - field c181 = 16778733411203605167 - field c182 = 3209921692078731530 - field c183 = 5829411678714675631 - field c184 = 13546305324682002944 - field c185 = 14388669943129102066 - field c186 = 16955277212659953284 - field c187 = 470060073341462642 - field c188 = 9865599081512514471 - field c189 = 3450866718365881982 - field c190 = 18253332465868317974 - field c191 = 8224383463926128747 - field c192 = 130168533448866398 - field c193 = 18296913789182388911 - field c194 = 9308875868804582517 - field c195 = 6860185202164278388 - field c196 = 5870361400608292852 - field c197 = 3853169742702299288 - field c198 = 2828579906117525532 - field c199 = 8244689163068534246 - field c200 = 14622287387679457865 - field c201 = 12818724415397588863 - field c202 = 9032795459261424103 - field c203 = 8582165566672449484 - field c204 = 1212546459474121359 - field c205 = 10720339750995594781 - field c206 = 9969473243746656646 - field c207 = 11889569503442370601 - field c208 = 8693000785136236266 - field c209 = 16911102564849626327 - field c210 = 10711317080423442023 - field c211 = 4092936164155659784 - field c212 = 9444614550731573011 - field c213 = 12734967290928938181 - field c214 = 2968663829197022452 - field c215 = 2063412078139901611 - field c216 = 6756409496657354005 - field c217 = 1956289224556834622 - field c218 = 17971879772361152496 - field c219 = 11129036599170922734 - field c220 = 6015714579300332596 - field c221 = 13952747316952120325 - field c222 = 6512928506883814256 - field c223 = 15000527898579580837 - field c224 = 13438817240481151739 - field c225 = 3438974907999726212 - field c226 = 2675270561650848698 - field c227 = 10615408741625344128 - field c228 = 15097127622747154430 - field c229 = 18306211703619792030 - field c230 = 18282207759862860963 - field c231 = 3969670710369869305 - field c232 = 15355909293594283010 - field c233 = 15825197601644123886 - field c234 = 12025247290627247881 - field c235 = 9244373186029472974 - field c236 = 8111711196724032485 - field c237 = 13910625786903113352 - field c238 = 4303582664435413453 - field c239 = 3615529122737143133 - field c240 = 13220640289699986291 - field c241 = 10945048589905126881 - field c242 = 18345446024459547893 - field c243 = 15246969291153869719 - field c244 = 3339771865943361715 - field c245 = 7920776184990771299 - field c246 = 11282075447781111045 - field c247 = 10409571270584994188 - field c248 = 7215903119088030248 - field c249 = 7149080371149851697 - field c250 = 12805983536086727637 - field c251 = 11544704273904429996 - field c252 = 3056733444472163063 - field c253 = 12775412729058442397 - field c254 = 10120906816355467459 - field c255 = 8580478192693828704 - field c256 = 17569548953071784548 - field c257 = 15170454632914839133 - field c258 = 11570807611472296007 - field c259 = 10726909497040777105 - field c260 = 440756088013805182 - field c261 = 7569336675219092295 - field c262 = 10579530867946972688 - field c263 = 10974325257620388506 - field c264 = 3053362977696829619 - field c265 = 17168463938106116617 - field c266 = 13835667625615860908 - field c267 = 2095873483773389479 - field c268 = 2016987140591259174 - field c269 = 2386979931999911847 - field c270 = 2505164847016101177 - field c271 = 13627451220086273527 - field c272 = 5731572550841603667 - field c273 = 15438639334109998771 - field c274 = 12813614048997555325 - field c275 = 10186814175982828107 - field c276 = 16191184896882054112 - field c277 = 14703692647542166085 - field c278 = 12578830251623636174 - field c279 = 1883855031971540983 - field c280 = 1266038367760006278 - field c281 = 11230634812224943920 - field c282 = 11308504110418640097 - field c283 = 6328296428453151721 - field c284 = 108818186627960168 - field c285 = 15547570943643535551 - field c286 = 4315257403857009861 - field c287 = 6380448982060371429 - field c288 = 632889842882717873 - field c289 = 7687981897540030037 - field c290 = 2375004428285747026 - field c291 = 1352206380036636795 - field c292 = 2578260287095025994 - field c293 = 2465523090448545549 - field c294 = 4247285443750660784 - field c295 = 3540885980673334329 - field c296 = 3345957484484543597 - field c297 = 11380792058791615855 - field c298 = 3199862384571235298 - field c299 = 173879172622348856 - field c300 = 15209080508353549507 - field c301 = 11649978506589666631 - field c302 = 9173090522521364544 - field c303 = 17030945052114083432 - field c304 = 4591187677780222237 - field c305 = 4064474173561892218 - field c306 = 15789829170657683922 - field c307 = 18208193905710242077 - field c308 = 14715997988505596440 - field c309 = 14667972935108688793 - field c310 = 5685168615648408563 - field c311 = 5245239484537042399 - field c312 = 3667459350052205975 - field c313 = 9197423732344085415 - field c314 = 4102452659988315248 - field c315 = 6641847341527232917 - field c316 = 12480319858851986779 - field c317 = 5186375792939856127 - field c318 = 2950251364917852338 - field c319 = 14773928965023494669 - field c320 = 12693729432082377979 - field c321 = 10022034381199683741 - field c322 = 9157237748502939080 - field c323 = 9663275337098404028 - field c324 = 13452894763307783925 - field c325 = 17376241946508742183 - field c326 = 3061844045327119072 - field c327 = 16030845287947531828 - field c328 = 1329076042067568487 - field c329 = 6855142122269391811 - field c330 = 11765672489282549160 - field c331 = 16830774944875965381 - field c332 = 6521069374664264162 - field c333 = 643523635231852913 - field c334 = 17135479068108868253 - field c335 = 4691294308622704824 - field c336 = 14491408402222977368 - field c337 = 18443726244814588799 - field c338 = 3981855558016600424 - field c339 = 6519895386704965259 - field c340 = 12833833766931651330 - field c341 = 5955046055337035381 - field c342 = 12102114200670204984 - field c343 = 17975981029431378883 - field c344 = 17148695856475432045 - field c345 = 4359514157740747375 - field c346 = 4733737572453903189 - field c347 = 9216164030888884101 - field c348 = 11898192372834399996 - field c349 = 8293149570945521798 - field c350 = 5292998910181620016 - field c351 = 11065412642848915128 - field c352 = 15951602728119640232 - field c353 = 17250120023723813262 - field c354 = 4208067670865654520 - field c355 = 4170990196992221254 - field c356 = 1364275915544901155 - field c357 = 5204734139073276471 - field c358 = 1348335617598418065 - field c359 = 4844946001170596348 - field c360 = 6839747835867181919 - field c361 = 5053317630835107264 - field c362 = 11056210036248139432 - field c363 = 1381878963923170929 - field c364 = 16574699770444639361 - field c365 = 8108738101012231328 - field c366 = 5608591239825657577 - field c367 = 2655890021744410286 - field c368 = 1274076210795298659 - field c369 = 11394663484515968481 - field c370 = 10856028813008380196 - field c371 = 13953897966883300641 - field c372 = 2480138023543998637 - field c373 = 8092805429879378234 - field c374 = 15734383915406361638 - field c375 = 12606199089969720633 - field c376 = 3432862751254991632 - field c377 = 11620001581001631894 - field c378 = 600733227997580875 - field c379 = 9960515431061710391 - field c380 = 15489520790087945179 - field c381 = 9888006245836622059 - field c382 = 16555061763510382783 - field c383 = 5729882798372086417 - field c384 = 18193672778018355673 - field c385 = 1822658993478572731 - field c386 = 5003044969628961755 - field c387 = 13153107988347151430 - field c388 = 784457190336231507 - field c389 = 13520638662186896236 - field c390 = 2049546776680600500 - field c391 = 10461088023685880055 - field c392 = 14926219627271786921 - field c393 = 17417636229842539696 - field c394 = 12492153963185454352 - field c395 = 414142119733528902 - field c396 = 17193096568008516286 - field c397 = 17273750640915671574 - field c398 = 2591282858188044874 - field c399 = 1735410450107017713 - field c400 = 10687387921399705460 - field c401 = 8183629028325381283 - field c402 = 10514917847412402927 - field c403 = 3336665081692857317 - field c404 = 5051946386531163563 - field c405 = 9781529663474696061 - field c406 = 13935324224847496391 - field c407 = 12199928622022129120 - field c408 = 18046988489253129363 - field c409 = 5360148275199876436 - field c410 = 4470351170521662089 - field c411 = 4053340142176580658 - field c412 = 7099987801407623156 - field c413 = 8643889260231910466 - field c414 = 8009486459327768919 - field c415 = 14356550044319110877 - field c416 = 1414693227423376523 - field c417 = 4179767940638916940 - field c418 = 13567672199210649738 - field c419 = 13138927205843206565 - field c420 = 215760839592843100 - field c421 = 16441790535445707930 - field c422 = 11718341735146782011 - field c423 = 12912429887242802458 - field c424 = 17517646119074274016 - field c425 = 7879023854534232228 - field c426 = 8728793248242325455 - field c427 = 5947682549087889590 - field c428 = 2708204009019253719 - field c429 = 2411670237320420929 - field c430 = 13609437845180998639 - field c431 = 10111681102226214657 - field c432 = 3316234197538285735 - field c433 = 2660139758422335686 - field c434 = 12151415153659423964 - field c435 = 8951257134131846586 - field c436 = 8730277595668694550 - field c437 = 11649943321766601019 - field c438 = 446558882505765024 - field c439 = 6924831314803654178 - field c440 = 16439861000844197132 - - field m0 = 15058071544716697658 - field m1 = 9113155049989891189 - field m2 = 11350291668724975614 - field m3 = 9632313156395526262 - field m4 = 10413730688534659007 - field m5 = 3697752025371176728 - field m6 = 11885276071251709314 - field m7 = 16598884434632610234 - field m8 = 8089761759414446189 - field m9 = 16040926183245094672 - field m10 = 8904964827445835399 - field m11 = 12487570753220630667 - field m12 = 3761754934154259876 - field m13 = 10365474600392912237 - field m14 = 18215459870146304436 - field m15 = 2521867902521748797 - field m16 = 9276651354726850372 - field m17 = 2876546369175151218 - field m18 = 2535340427714539962 - field m19 = 17035695180503554455 - field m20 = 5065438235784555509 - field m21 = 16133217454234073776 - field m22 = 7083511463634692513 - field m23 = 9613984133077979495 - field m24 = 1331692021515548952 - field m25 = 12210106727545806375 - field m26 = 13648177365769586846 - field m27 = 15042137044708510189 - field m28 = 2554730408162944936 - field m29 = 16742667895331233611 - field m30 = 2494776793515665277 - field m31 = 14141966007005028685 - field m32 = 18062101036985256707 - field m33 = 755902906165376348 - field m34 = 386844847374139936 - field m35 = 12578289204908190735 - field m36 = 16474772505071285176 - field m37 = 4219412987430389417 - field m38 = 13785604981959978986 - field m39 = 6782700766578855354 - field m40 = 5027408469346314244 - field m41 = 3789778619153321757 - field m42 = 4990630321935587007 - field m43 = 13343213396420799882 - field m44 = 104089557996796214 - field m45 = 17594182424895122809 - field m46 = 1296646801898316520 - field m47 = 16927267389512340836 - field m48 = 15388042990166044599 - field m49 = 1062925035106735976 - field m50 = 6174325826189609393 - field m51 = 9654539659217203050 - field m52 = 3981669703948237017 - field m53 = 13344532373627816122 - field m54 = 9909148060180400932 - field m55 = 9832668435387834018 - field m56 = 16021044824039400858 - field m57 = 7712461657304026032 - field m58 = 7561823410587799308 - field m59 = 17083550112806683136 - field m60 = 6790038977110107895 - field m61 = 8056988792082041187 - field m62 = 6124556526406334790 - field m63 = 17224325032903033822 - field m64 = 12410794060221759964 - field m65 = 10618334591673088738 - field m66 = 3068156503820110383 - field m67 = 15231507067321079252 - field m68 = 11188165925029871979 - field m69 = 5971633157944515473 - field m70 = 2082638771837317713 - field m71 = 17302560278506804885 - field m72 = 7129447512455292844 - field m73 = 11141849528205973065 - field m74 = 15114786009406193424 - field m75 = 7449599548096808934 - field m76 = 12350858481215818754 - field m77 = 14112714168528178524 - field m78 = 16341673650923705326 - field m79 = 15739229265965988419 - field m80 = 6384637781573600052 - - // -- - // r = 0 - // ark - state0_0 = state0_0 + c0 - state1_0 = state1_0 + c1 - state2_0 = state2_0 + c2 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 1 - // ark - state0_0 = state0_0 + c3 - state1_0 = state1_0 + c4 - state2_0 = state2_0 + c5 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 2 - // ark - state0_0 = state0_0 + c6 - state1_0 = state1_0 + c7 - state2_0 = state2_0 + c8 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 3 - // ark - state0_0 = state0_0 + c9 - state1_0 = state1_0 + c10 - state2_0 = state2_0 + c11 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 4 - // ark - state0_0 = state0_0 + c12 - state1_0 = state1_0 + c13 - state2_0 = state2_0 + c14 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 5 - // ark - state0_0 = state0_0 + c15 - state1_0 = state1_0 + c16 - state2_0 = state2_0 + c17 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 6 - // ark - state0_0 = state0_0 + c18 - state1_0 = state1_0 + c19 - state2_0 = state2_0 + c20 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 7 - // ark - state0_0 = state0_0 + c21 - state1_0 = state1_0 + c22 - state2_0 = state2_0 + c23 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 8 - // ark - state0_0 = state0_0 + c24 - state1_0 = state1_0 + c25 - state2_0 = state2_0 + c26 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 9 - // ark - state0_0 = state0_0 + c27 - state1_0 = state1_0 + c28 - state2_0 = state2_0 + c29 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 10 - // ark - state0_0 = state0_0 + c30 - state1_0 = state1_0 + c31 - state2_0 = state2_0 + c32 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 11 - // ark - state0_0 = state0_0 + c33 - state1_0 = state1_0 + c34 - state2_0 = state2_0 + c35 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 12 - // ark - state0_0 = state0_0 + c36 - state1_0 = state1_0 + c37 - state2_0 = state2_0 + c38 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 13 - // ark - state0_0 = state0_0 + c39 - state1_0 = state1_0 + c40 - state2_0 = state2_0 + c41 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 14 - // ark - state0_0 = state0_0 + c42 - state1_0 = state1_0 + c43 - state2_0 = state2_0 + c44 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 15 - // ark - state0_0 = state0_0 + c45 - state1_0 = state1_0 + c46 - state2_0 = state2_0 + c47 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 16 - // ark - state0_0 = state0_0 + c48 - state1_0 = state1_0 + c49 - state2_0 = state2_0 + c50 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 17 - // ark - state0_0 = state0_0 + c51 - state1_0 = state1_0 + c52 - state2_0 = state2_0 + c53 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 18 - // ark - state0_0 = state0_0 + c54 - state1_0 = state1_0 + c55 - state2_0 = state2_0 + c56 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 19 - // ark - state0_0 = state0_0 + c57 - state1_0 = state1_0 + c58 - state2_0 = state2_0 + c59 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 20 - // ark - state0_0 = state0_0 + c60 - state1_0 = state1_0 + c61 - state2_0 = state2_0 + c62 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 21 - // ark - state0_0 = state0_0 + c63 - state1_0 = state1_0 + c64 - state2_0 = state2_0 + c65 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 22 - // ark - state0_0 = state0_0 + c66 - state1_0 = state1_0 + c67 - state2_0 = state2_0 + c68 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 23 - // ark - state0_0 = state0_0 + c69 - state1_0 = state1_0 + c70 - state2_0 = state2_0 + c71 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 24 - // ark - state0_0 = state0_0 + c72 - state1_0 = state1_0 + c73 - state2_0 = state2_0 + c74 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 25 - // ark - state0_0 = state0_0 + c75 - state1_0 = state1_0 + c76 - state2_0 = state2_0 + c77 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 26 - // ark - state0_0 = state0_0 + c78 - state1_0 = state1_0 + c79 - state2_0 = state2_0 + c80 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 27 - // ark - state0_0 = state0_0 + c81 - state1_0 = state1_0 + c82 - state2_0 = state2_0 + c83 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 28 - // ark - state0_0 = state0_0 + c84 - state1_0 = state1_0 + c85 - state2_0 = state2_0 + c86 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 29 - // ark - state0_0 = state0_0 + c87 - state1_0 = state1_0 + c88 - state2_0 = state2_0 + c89 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 30 - // ark - state0_0 = state0_0 + c90 - state1_0 = state1_0 + c91 - state2_0 = state2_0 + c92 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 31 - // ark - state0_0 = state0_0 + c93 - state1_0 = state1_0 + c94 - state2_0 = state2_0 + c95 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 32 - // ark - state0_0 = state0_0 + c96 - state1_0 = state1_0 + c97 - state2_0 = state2_0 + c98 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 33 - // ark - state0_0 = state0_0 + c99 - state1_0 = state1_0 + c100 - state2_0 = state2_0 + c101 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 34 - // ark - state0_0 = state0_0 + c102 - state1_0 = state1_0 + c103 - state2_0 = state2_0 + c104 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 35 - // ark - state0_0 = state0_0 + c105 - state1_0 = state1_0 + c106 - state2_0 = state2_0 + c107 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 36 - // ark - state0_0 = state0_0 + c108 - state1_0 = state1_0 + c109 - state2_0 = state2_0 + c110 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 37 - // ark - state0_0 = state0_0 + c111 - state1_0 = state1_0 + c112 - state2_0 = state2_0 + c113 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 38 - // ark - state0_0 = state0_0 + c114 - state1_0 = state1_0 + c115 - state2_0 = state2_0 + c116 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 39 - // ark - state0_0 = state0_0 + c117 - state1_0 = state1_0 + c118 - state2_0 = state2_0 + c119 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 40 - // ark - state0_0 = state0_0 + c120 - state1_0 = state1_0 + c121 - state2_0 = state2_0 + c122 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 41 - // ark - state0_0 = state0_0 + c123 - state1_0 = state1_0 + c124 - state2_0 = state2_0 + c125 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 42 - // ark - state0_0 = state0_0 + c126 - state1_0 = state1_0 + c127 - state2_0 = state2_0 + c128 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 43 - // ark - state0_0 = state0_0 + c129 - state1_0 = state1_0 + c130 - state2_0 = state2_0 + c131 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 44 - // ark - state0_0 = state0_0 + c132 - state1_0 = state1_0 + c133 - state2_0 = state2_0 + c134 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 45 - // ark - state0_0 = state0_0 + c135 - state1_0 = state1_0 + c136 - state2_0 = state2_0 + c137 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 46 - // ark - state0_0 = state0_0 + c138 - state1_0 = state1_0 + c139 - state2_0 = state2_0 + c140 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 47 - // ark - state0_0 = state0_0 + c141 - state1_0 = state1_0 + c142 - state2_0 = state2_0 + c143 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 48 - // ark - state0_0 = state0_0 + c144 - state1_0 = state1_0 + c145 - state2_0 = state2_0 + c146 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 49 - // ark - state0_0 = state0_0 + c147 - state1_0 = state1_0 + c148 - state2_0 = state2_0 + c149 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 50 - // ark - state0_0 = state0_0 + c150 - state1_0 = state1_0 + c151 - state2_0 = state2_0 + c152 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 51 - // ark - state0_0 = state0_0 + c153 - state1_0 = state1_0 + c154 - state2_0 = state2_0 + c155 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 52 - // ark - state0_0 = state0_0 + c156 - state1_0 = state1_0 + c157 - state2_0 = state2_0 + c158 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 53 - // ark - state0_0 = state0_0 + c159 - state1_0 = state1_0 + c160 - state2_0 = state2_0 + c161 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 54 - // ark - state0_0 = state0_0 + c162 - state1_0 = state1_0 + c163 - state2_0 = state2_0 + c164 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 55 - // ark - state0_0 = state0_0 + c165 - state1_0 = state1_0 + c166 - state2_0 = state2_0 + c167 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 56 - // ark - state0_0 = state0_0 + c168 - state1_0 = state1_0 + c169 - state2_0 = state2_0 + c170 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 57 - // ark - state0_0 = state0_0 + c171 - state1_0 = state1_0 + c172 - state2_0 = state2_0 + c173 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 58 - // ark - state0_0 = state0_0 + c174 - state1_0 = state1_0 + c175 - state2_0 = state2_0 + c176 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 59 - // ark - state0_0 = state0_0 + c177 - state1_0 = state1_0 + c178 - state2_0 = state2_0 + c179 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 60 - // ark - state0_0 = state0_0 + c180 - state1_0 = state1_0 + c181 - state2_0 = state2_0 + c182 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 61 - // ark - state0_0 = state0_0 + c183 - state1_0 = state1_0 + c184 - state2_0 = state2_0 + c185 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 62 - // ark - state0_0 = state0_0 + c186 - state1_0 = state1_0 + c187 - state2_0 = state2_0 + c188 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 63 - // ark - state0_0 = state0_0 + c189 - state1_0 = state1_0 + c190 - state2_0 = state2_0 + c191 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 64 - // ark - state0_0 = state0_0 + c192 - state1_0 = state1_0 + c193 - state2_0 = state2_0 + c194 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 - // -- - // r = 0 - // ark - state0_1 = state0_1 + c0 - state1_1 = state1_1 + c1 - state2_1 = state2_1 + c2 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 1 - // ark - state0_1 = state0_1 + c3 - state1_1 = state1_1 + c4 - state2_1 = state2_1 + c5 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 2 - // ark - state0_1 = state0_1 + c6 - state1_1 = state1_1 + c7 - state2_1 = state2_1 + c8 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 3 - // ark - state0_1 = state0_1 + c9 - state1_1 = state1_1 + c10 - state2_1 = state2_1 + c11 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 4 - // ark - state0_1 = state0_1 + c12 - state1_1 = state1_1 + c13 - state2_1 = state2_1 + c14 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 5 - // ark - state0_1 = state0_1 + c15 - state1_1 = state1_1 + c16 - state2_1 = state2_1 + c17 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 6 - // ark - state0_1 = state0_1 + c18 - state1_1 = state1_1 + c19 - state2_1 = state2_1 + c20 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 7 - // ark - state0_1 = state0_1 + c21 - state1_1 = state1_1 + c22 - state2_1 = state2_1 + c23 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 8 - // ark - state0_1 = state0_1 + c24 - state1_1 = state1_1 + c25 - state2_1 = state2_1 + c26 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 9 - // ark - state0_1 = state0_1 + c27 - state1_1 = state1_1 + c28 - state2_1 = state2_1 + c29 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 10 - // ark - state0_1 = state0_1 + c30 - state1_1 = state1_1 + c31 - state2_1 = state2_1 + c32 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 11 - // ark - state0_1 = state0_1 + c33 - state1_1 = state1_1 + c34 - state2_1 = state2_1 + c35 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 12 - // ark - state0_1 = state0_1 + c36 - state1_1 = state1_1 + c37 - state2_1 = state2_1 + c38 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 13 - // ark - state0_1 = state0_1 + c39 - state1_1 = state1_1 + c40 - state2_1 = state2_1 + c41 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 14 - // ark - state0_1 = state0_1 + c42 - state1_1 = state1_1 + c43 - state2_1 = state2_1 + c44 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 15 - // ark - state0_1 = state0_1 + c45 - state1_1 = state1_1 + c46 - state2_1 = state2_1 + c47 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 16 - // ark - state0_1 = state0_1 + c48 - state1_1 = state1_1 + c49 - state2_1 = state2_1 + c50 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 17 - // ark - state0_1 = state0_1 + c51 - state1_1 = state1_1 + c52 - state2_1 = state2_1 + c53 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 18 - // ark - state0_1 = state0_1 + c54 - state1_1 = state1_1 + c55 - state2_1 = state2_1 + c56 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 19 - // ark - state0_1 = state0_1 + c57 - state1_1 = state1_1 + c58 - state2_1 = state2_1 + c59 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 20 - // ark - state0_1 = state0_1 + c60 - state1_1 = state1_1 + c61 - state2_1 = state2_1 + c62 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 21 - // ark - state0_1 = state0_1 + c63 - state1_1 = state1_1 + c64 - state2_1 = state2_1 + c65 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 22 - // ark - state0_1 = state0_1 + c66 - state1_1 = state1_1 + c67 - state2_1 = state2_1 + c68 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 23 - // ark - state0_1 = state0_1 + c69 - state1_1 = state1_1 + c70 - state2_1 = state2_1 + c71 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 24 - // ark - state0_1 = state0_1 + c72 - state1_1 = state1_1 + c73 - state2_1 = state2_1 + c74 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 25 - // ark - state0_1 = state0_1 + c75 - state1_1 = state1_1 + c76 - state2_1 = state2_1 + c77 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 26 - // ark - state0_1 = state0_1 + c78 - state1_1 = state1_1 + c79 - state2_1 = state2_1 + c80 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 27 - // ark - state0_1 = state0_1 + c81 - state1_1 = state1_1 + c82 - state2_1 = state2_1 + c83 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 28 - // ark - state0_1 = state0_1 + c84 - state1_1 = state1_1 + c85 - state2_1 = state2_1 + c86 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 29 - // ark - state0_1 = state0_1 + c87 - state1_1 = state1_1 + c88 - state2_1 = state2_1 + c89 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 30 - // ark - state0_1 = state0_1 + c90 - state1_1 = state1_1 + c91 - state2_1 = state2_1 + c92 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 31 - // ark - state0_1 = state0_1 + c93 - state1_1 = state1_1 + c94 - state2_1 = state2_1 + c95 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 32 - // ark - state0_1 = state0_1 + c96 - state1_1 = state1_1 + c97 - state2_1 = state2_1 + c98 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 33 - // ark - state0_1 = state0_1 + c99 - state1_1 = state1_1 + c100 - state2_1 = state2_1 + c101 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 34 - // ark - state0_1 = state0_1 + c102 - state1_1 = state1_1 + c103 - state2_1 = state2_1 + c104 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 35 - // ark - state0_1 = state0_1 + c105 - state1_1 = state1_1 + c106 - state2_1 = state2_1 + c107 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 36 - // ark - state0_1 = state0_1 + c108 - state1_1 = state1_1 + c109 - state2_1 = state2_1 + c110 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 37 - // ark - state0_1 = state0_1 + c111 - state1_1 = state1_1 + c112 - state2_1 = state2_1 + c113 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 38 - // ark - state0_1 = state0_1 + c114 - state1_1 = state1_1 + c115 - state2_1 = state2_1 + c116 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 39 - // ark - state0_1 = state0_1 + c117 - state1_1 = state1_1 + c118 - state2_1 = state2_1 + c119 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 40 - // ark - state0_1 = state0_1 + c120 - state1_1 = state1_1 + c121 - state2_1 = state2_1 + c122 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 41 - // ark - state0_1 = state0_1 + c123 - state1_1 = state1_1 + c124 - state2_1 = state2_1 + c125 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 42 - // ark - state0_1 = state0_1 + c126 - state1_1 = state1_1 + c127 - state2_1 = state2_1 + c128 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 43 - // ark - state0_1 = state0_1 + c129 - state1_1 = state1_1 + c130 - state2_1 = state2_1 + c131 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 44 - // ark - state0_1 = state0_1 + c132 - state1_1 = state1_1 + c133 - state2_1 = state2_1 + c134 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 45 - // ark - state0_1 = state0_1 + c135 - state1_1 = state1_1 + c136 - state2_1 = state2_1 + c137 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 46 - // ark - state0_1 = state0_1 + c138 - state1_1 = state1_1 + c139 - state2_1 = state2_1 + c140 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 47 - // ark - state0_1 = state0_1 + c141 - state1_1 = state1_1 + c142 - state2_1 = state2_1 + c143 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 48 - // ark - state0_1 = state0_1 + c144 - state1_1 = state1_1 + c145 - state2_1 = state2_1 + c146 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 49 - // ark - state0_1 = state0_1 + c147 - state1_1 = state1_1 + c148 - state2_1 = state2_1 + c149 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 50 - // ark - state0_1 = state0_1 + c150 - state1_1 = state1_1 + c151 - state2_1 = state2_1 + c152 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 51 - // ark - state0_1 = state0_1 + c153 - state1_1 = state1_1 + c154 - state2_1 = state2_1 + c155 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 52 - // ark - state0_1 = state0_1 + c156 - state1_1 = state1_1 + c157 - state2_1 = state2_1 + c158 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 53 - // ark - state0_1 = state0_1 + c159 - state1_1 = state1_1 + c160 - state2_1 = state2_1 + c161 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 54 - // ark - state0_1 = state0_1 + c162 - state1_1 = state1_1 + c163 - state2_1 = state2_1 + c164 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 55 - // ark - state0_1 = state0_1 + c165 - state1_1 = state1_1 + c166 - state2_1 = state2_1 + c167 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 56 - // ark - state0_1 = state0_1 + c168 - state1_1 = state1_1 + c169 - state2_1 = state2_1 + c170 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 57 - // ark - state0_1 = state0_1 + c171 - state1_1 = state1_1 + c172 - state2_1 = state2_1 + c173 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 58 - // ark - state0_1 = state0_1 + c174 - state1_1 = state1_1 + c175 - state2_1 = state2_1 + c176 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 59 - // ark - state0_1 = state0_1 + c177 - state1_1 = state1_1 + c178 - state2_1 = state2_1 + c179 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 60 - // ark - state0_1 = state0_1 + c180 - state1_1 = state1_1 + c181 - state2_1 = state2_1 + c182 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 61 - // ark - state0_1 = state0_1 + c183 - state1_1 = state1_1 + c184 - state2_1 = state2_1 + c185 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 62 - // ark - state0_1 = state0_1 + c186 - state1_1 = state1_1 + c187 - state2_1 = state2_1 + c188 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 63 - // ark - state0_1 = state0_1 + c189 - state1_1 = state1_1 + c190 - state2_1 = state2_1 + c191 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - // -- - // r = 64 - // ark - state0_1 = state0_1 + c192 - state1_1 = state1_1 + c193 - state2_1 = state2_1 + c194 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 - return DoubleHash { - hash0: state0_0, - hash1: state0_1 - } diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon3.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon3.zok deleted file mode 100644 index 930cbca4..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/poseidon3.zok +++ /dev/null @@ -1,1619 +0,0 @@ -def poseidon3(field state1, field state2, field state3) -> field: - field state0 = 0 - - field c0 = 758662019503705074 - field c1 = 9958560809385864598 - field c2 = 1277576466825840593 - field c3 = 17276116445666047290 - field c4 = 8462567671021664875 - field c5 = 18311663567274789012 - field c6 = 14794487373875431679 - field c7 = 939955959186974556 - field c8 = 13578068033787386336 - field c9 = 16936160577869353999 - field c10 = 7564443307661759393 - field c11 = 5701022615025077794 - field c12 = 14898040799158503403 - field c13 = 7398753701805340846 - field c14 = 17145662177513207623 - field c15 = 15919612504434736882 - field c16 = 211911121069562741 - field c17 = 14627162831253564776 - field c18 = 3736731127424592191 - field c19 = 16164080792556653606 - field c20 = 13310103488076492265 - field c21 = 17714184600411987649 - field c22 = 13937509549526454080 - field c23 = 8467973550572764378 - field c24 = 6149415607253035464 - field c25 = 9902966326901151535 - field c26 = 2299003035066075543 - field c27 = 9361464291309771166 - field c28 = 455760044697694737 - field c29 = 18069040773191725180 - field c30 = 12156451030386903890 - field c31 = 13269466490844642616 - field c32 = 4644627377627776228 - field c33 = 11517517066878151266 - field c34 = 2085762791679771559 - field c35 = 14341814612745946357 - field c36 = 8220722365145856681 - field c37 = 13781050119424493396 - field c38 = 14130172974922698924 - field c39 = 1268378720849035897 - field c40 = 13102522127585690797 - field c41 = 6435545073175926153 - field c42 = 10680323768845634897 - field c43 = 5377035848961467433 - field c44 = 16155044248960735250 - field c45 = 3956646720460237409 - field c46 = 15192201422078376101 - field c47 = 2254261886235227853 - field c48 = 18263210726053991346 - field c49 = 14588739567027142820 - field c50 = 9572725267846457115 - field c51 = 4663609806895345720 - field c52 = 16822560014146547002 - field c53 = 12821481803562047313 - field c54 = 3027425978972870548 - field c55 = 16762600845752241175 - field c56 = 7067459971848174565 - field c57 = 15884202556186149044 - field c58 = 8501625320175123709 - field c59 = 4388367812943946907 - field c60 = 12299931046827323210 - field c61 = 7636538909023199578 - field c62 = 14046758094336955416 - field c63 = 9633246818970530654 - field c64 = 13491266525055530545 - field c65 = 5423497366234120042 - field c66 = 1751962590333377264 - field c67 = 10513677123715294214 - field c68 = 996968784189528765 - field c69 = 10448850931434990018 - field c70 = 8953917554828103116 - field c71 = 1626108945262700028 - field c72 = 5891489572384527092 - field c73 = 6643806719713918869 - field c74 = 16083801189239088971 - field c75 = 14868933033345963433 - field c76 = 11850469235653996642 - field c77 = 1324483046183023543 - field c78 = 15183755263354743993 - field c79 = 2495724238845411316 - field c80 = 8731170262888399569 - field c81 = 16304783671381988951 - field c82 = 11235544699283452233 - field c83 = 2137768936382175302 - field c84 = 16675115627845335581 - field c85 = 2963350077420008404 - field c86 = 5398589702654192916 - field c87 = 12140466249394573251 - field c88 = 11834547998206516929 - field c89 = 6177294541684099188 - field c90 = 9838863225522131903 - field c91 = 4701779667688073310 - field c92 = 12835837905699815771 - field c93 = 2968170957340817290 - field c94 = 9828791715764525853 - field c95 = 8442028361006693278 - field c96 = 17176968168399522482 - field c97 = 17999791729505949887 - field c98 = 14962719204200253756 - field c99 = 17300730933512754375 - field c100 = 4222119091375155707 - field c101 = 11298113638119509435 - field c102 = 12268859188885459376 - field c103 = 9034427714391492438 - field c104 = 5990277340027239801 - field c105 = 726299115287076863 - field c106 = 18303937711932738539 - field c107 = 8960550811937596675 - field c108 = 18420334683743066202 - field c109 = 16986003784188475276 - field c110 = 13588430238611272524 - field c111 = 18102499241351263781 - field c112 = 7476618494341797169 - field c113 = 4184084235455659562 - field c114 = 5668298044436776508 - field c115 = 17447913737721385190 - field c116 = 11088130260910156172 - field c117 = 8792531517070849900 - field c118 = 9397646851851459952 - field c119 = 5121871193730760910 - field c120 = 2168557202402322871 - field c121 = 15702569595864319029 - field c122 = 14720843552400861125 - field c123 = 8277634810410081765 - field c124 = 6233674368436885280 - field c125 = 4306433523940866942 - field c126 = 17722591435523141845 - field c127 = 13983984591359038932 - field c128 = 9195938109190900291 - field c129 = 6074479640755470700 - field c130 = 14078059641315677730 - field c131 = 10695375213011552670 - field c132 = 5573015714231677140 - field c133 = 16984666835191674642 - field c134 = 10249524339733897711 - field c135 = 3174518716637848153 - field c136 = 7188570775991726809 - field c137 = 4753011490148598290 - field c138 = 5105443631000558491 - field c139 = 15781086678953962161 - field c140 = 3458297099390436339 - field c141 = 3082524552292086 - field c142 = 10885272710257457992 - field c143 = 3236146052509314745 - field c144 = 9696124289212404307 - field c145 = 1485008535953646698 - field c146 = 1137225154782514508 - field c147 = 10514784977699897262 - field c148 = 10729284392631787423 - field c149 = 14959018802228526836 - field c150 = 5311814720150441561 - field c151 = 15855390943452519568 - field c152 = 11214465269186418739 - field c153 = 4053806423852004669 - field c154 = 11760999889540157928 - field c155 = 13155611628497688688 - field c156 = 3842739007828054055 - field c157 = 5711430659662298364 - field c158 = 13288819076998297778 - field c159 = 4820382956965774345 - field c160 = 9818136475875046170 - field c161 = 15891193043142164602 - field c162 = 11369901158293474981 - field c163 = 16014685768489088745 - field c164 = 1356361795046325322 - field c165 = 15790892392481609398 - field c166 = 14921870878617925995 - field c167 = 7687231355395058862 - field c168 = 14150434200392676099 - field c169 = 1103438709908116920 - field c170 = 6477771864968923918 - field c171 = 17883003884435853137 - field c172 = 15616808237597542650 - field c173 = 298930612681613218 - field c174 = 7783145673030144050 - field c175 = 9925877788921434933 - field c176 = 7906428066733709088 - field c177 = 9059024899257096185 - field c178 = 12128791653883821821 - field c179 = 10439342184366574094 - field c180 = 16838255109359414152 - field c181 = 16778733411203605167 - field c182 = 3209921692078731530 - field c183 = 5829411678714675631 - field c184 = 13546305324682002944 - field c185 = 14388669943129102066 - field c186 = 16955277212659953284 - field c187 = 470060073341462642 - field c188 = 9865599081512514471 - field c189 = 3450866718365881982 - field c190 = 18253332465868317974 - field c191 = 8224383463926128747 - field c192 = 130168533448866398 - field c193 = 18296913789182388911 - field c194 = 9308875868804582517 - field c195 = 6860185202164278388 - field c196 = 5870361400608292852 - field c197 = 3853169742702299288 - field c198 = 2828579906117525532 - field c199 = 8244689163068534246 - field c200 = 14622287387679457865 - field c201 = 12818724415397588863 - field c202 = 9032795459261424103 - field c203 = 8582165566672449484 - field c204 = 1212546459474121359 - field c205 = 10720339750995594781 - field c206 = 9969473243746656646 - field c207 = 11889569503442370601 - field c208 = 8693000785136236266 - field c209 = 16911102564849626327 - field c210 = 10711317080423442023 - field c211 = 4092936164155659784 - field c212 = 9444614550731573011 - field c213 = 12734967290928938181 - field c214 = 2968663829197022452 - field c215 = 2063412078139901611 - field c216 = 6756409496657354005 - field c217 = 1956289224556834622 - field c218 = 17971879772361152496 - field c219 = 11129036599170922734 - field c220 = 6015714579300332596 - field c221 = 13952747316952120325 - field c222 = 6512928506883814256 - field c223 = 15000527898579580837 - field c224 = 13438817240481151739 - field c225 = 3438974907999726212 - field c226 = 2675270561650848698 - field c227 = 10615408741625344128 - field c228 = 15097127622747154430 - field c229 = 18306211703619792030 - field c230 = 18282207759862860963 - field c231 = 3969670710369869305 - field c232 = 15355909293594283010 - field c233 = 15825197601644123886 - field c234 = 12025247290627247881 - field c235 = 9244373186029472974 - field c236 = 8111711196724032485 - field c237 = 13910625786903113352 - field c238 = 4303582664435413453 - field c239 = 3615529122737143133 - field c240 = 13220640289699986291 - field c241 = 10945048589905126881 - field c242 = 18345446024459547893 - field c243 = 15246969291153869719 - field c244 = 3339771865943361715 - field c245 = 7920776184990771299 - field c246 = 11282075447781111045 - field c247 = 10409571270584994188 - field c248 = 7215903119088030248 - field c249 = 7149080371149851697 - field c250 = 12805983536086727637 - field c251 = 11544704273904429996 - field c252 = 3056733444472163063 - field c253 = 12775412729058442397 - field c254 = 10120906816355467459 - field c255 = 8580478192693828704 - field c256 = 17569548953071784548 - field c257 = 15170454632914839133 - field c258 = 11570807611472296007 - field c259 = 10726909497040777105 - field c260 = 440756088013805182 - field c261 = 7569336675219092295 - field c262 = 10579530867946972688 - field c263 = 10974325257620388506 - field c264 = 3053362977696829619 - field c265 = 17168463938106116617 - field c266 = 13835667625615860908 - field c267 = 2095873483773389479 - field c268 = 2016987140591259174 - field c269 = 2386979931999911847 - field c270 = 2505164847016101177 - field c271 = 13627451220086273527 - field c272 = 5731572550841603667 - field c273 = 15438639334109998771 - field c274 = 12813614048997555325 - field c275 = 10186814175982828107 - field c276 = 16191184896882054112 - field c277 = 14703692647542166085 - field c278 = 12578830251623636174 - field c279 = 1883855031971540983 - field c280 = 1266038367760006278 - field c281 = 11230634812224943920 - field c282 = 11308504110418640097 - field c283 = 6328296428453151721 - field c284 = 108818186627960168 - field c285 = 15547570943643535551 - field c286 = 4315257403857009861 - field c287 = 6380448982060371429 - field c288 = 632889842882717873 - field c289 = 7687981897540030037 - field c290 = 2375004428285747026 - field c291 = 1352206380036636795 - field c292 = 2578260287095025994 - field c293 = 2465523090448545549 - field c294 = 4247285443750660784 - field c295 = 3540885980673334329 - field c296 = 3345957484484543597 - field c297 = 11380792058791615855 - field c298 = 3199862384571235298 - field c299 = 173879172622348856 - field c300 = 15209080508353549507 - field c301 = 11649978506589666631 - field c302 = 9173090522521364544 - field c303 = 17030945052114083432 - field c304 = 4591187677780222237 - field c305 = 4064474173561892218 - field c306 = 15789829170657683922 - field c307 = 18208193905710242077 - field c308 = 14715997988505596440 - field c309 = 14667972935108688793 - field c310 = 5685168615648408563 - field c311 = 5245239484537042399 - field c312 = 3667459350052205975 - field c313 = 9197423732344085415 - field c314 = 4102452659988315248 - field c315 = 6641847341527232917 - field c316 = 12480319858851986779 - field c317 = 5186375792939856127 - field c318 = 2950251364917852338 - field c319 = 14773928965023494669 - field c320 = 12693729432082377979 - field c321 = 10022034381199683741 - field c322 = 9157237748502939080 - field c323 = 9663275337098404028 - field c324 = 13452894763307783925 - field c325 = 17376241946508742183 - field c326 = 3061844045327119072 - field c327 = 16030845287947531828 - field c328 = 1329076042067568487 - field c329 = 6855142122269391811 - field c330 = 11765672489282549160 - field c331 = 16830774944875965381 - field c332 = 6521069374664264162 - field c333 = 643523635231852913 - field c334 = 17135479068108868253 - field c335 = 4691294308622704824 - field c336 = 14491408402222977368 - field c337 = 18443726244814588799 - field c338 = 3981855558016600424 - field c339 = 6519895386704965259 - field c340 = 12833833766931651330 - field c341 = 5955046055337035381 - field c342 = 12102114200670204984 - field c343 = 17975981029431378883 - field c344 = 17148695856475432045 - field c345 = 4359514157740747375 - field c346 = 4733737572453903189 - field c347 = 9216164030888884101 - field c348 = 11898192372834399996 - field c349 = 8293149570945521798 - field c350 = 5292998910181620016 - field c351 = 11065412642848915128 - field c352 = 15951602728119640232 - field c353 = 17250120023723813262 - field c354 = 4208067670865654520 - field c355 = 4170990196992221254 - field c356 = 1364275915544901155 - field c357 = 5204734139073276471 - field c358 = 1348335617598418065 - field c359 = 4844946001170596348 - field c360 = 6839747835867181919 - field c361 = 5053317630835107264 - field c362 = 11056210036248139432 - field c363 = 1381878963923170929 - field c364 = 16574699770444639361 - field c365 = 8108738101012231328 - field c366 = 5608591239825657577 - field c367 = 2655890021744410286 - field c368 = 1274076210795298659 - field c369 = 11394663484515968481 - field c370 = 10856028813008380196 - field c371 = 13953897966883300641 - field c372 = 2480138023543998637 - field c373 = 8092805429879378234 - field c374 = 15734383915406361638 - field c375 = 12606199089969720633 - field c376 = 3432862751254991632 - field c377 = 11620001581001631894 - field c378 = 600733227997580875 - field c379 = 9960515431061710391 - field c380 = 15489520790087945179 - field c381 = 9888006245836622059 - field c382 = 16555061763510382783 - field c383 = 5729882798372086417 - field c384 = 18193672778018355673 - field c385 = 1822658993478572731 - field c386 = 5003044969628961755 - field c387 = 13153107988347151430 - field c388 = 784457190336231507 - field c389 = 13520638662186896236 - field c390 = 2049546776680600500 - field c391 = 10461088023685880055 - field c392 = 14926219627271786921 - field c393 = 17417636229842539696 - field c394 = 12492153963185454352 - field c395 = 414142119733528902 - field c396 = 17193096568008516286 - field c397 = 17273750640915671574 - field c398 = 2591282858188044874 - field c399 = 1735410450107017713 - field c400 = 10687387921399705460 - field c401 = 8183629028325381283 - field c402 = 10514917847412402927 - field c403 = 3336665081692857317 - field c404 = 5051946386531163563 - field c405 = 9781529663474696061 - field c406 = 13935324224847496391 - field c407 = 12199928622022129120 - field c408 = 18046988489253129363 - field c409 = 5360148275199876436 - field c410 = 4470351170521662089 - field c411 = 4053340142176580658 - field c412 = 7099987801407623156 - field c413 = 8643889260231910466 - field c414 = 8009486459327768919 - field c415 = 14356550044319110877 - field c416 = 1414693227423376523 - field c417 = 4179767940638916940 - field c418 = 13567672199210649738 - field c419 = 13138927205843206565 - field c420 = 215760839592843100 - field c421 = 16441790535445707930 - field c422 = 11718341735146782011 - field c423 = 12912429887242802458 - field c424 = 17517646119074274016 - field c425 = 7879023854534232228 - field c426 = 8728793248242325455 - field c427 = 5947682549087889590 - field c428 = 2708204009019253719 - field c429 = 2411670237320420929 - field c430 = 13609437845180998639 - field c431 = 10111681102226214657 - field c432 = 3316234197538285735 - field c433 = 2660139758422335686 - field c434 = 12151415153659423964 - field c435 = 8951257134131846586 - field c436 = 8730277595668694550 - field c437 = 11649943321766601019 - field c438 = 446558882505765024 - field c439 = 6924831314803654178 - field c440 = 16439861000844197132 - - field m0 = 15058071544716697658 - field m1 = 9113155049989891189 - field m2 = 11350291668724975614 - field m3 = 9632313156395526262 - field m4 = 10413730688534659007 - field m5 = 3697752025371176728 - field m6 = 11885276071251709314 - field m7 = 16598884434632610234 - field m8 = 8089761759414446189 - field m9 = 16040926183245094672 - field m10 = 8904964827445835399 - field m11 = 12487570753220630667 - field m12 = 3761754934154259876 - field m13 = 10365474600392912237 - field m14 = 18215459870146304436 - field m15 = 2521867902521748797 - field m16 = 9276651354726850372 - field m17 = 2876546369175151218 - field m18 = 2535340427714539962 - field m19 = 17035695180503554455 - field m20 = 5065438235784555509 - field m21 = 16133217454234073776 - field m22 = 7083511463634692513 - field m23 = 9613984133077979495 - field m24 = 1331692021515548952 - field m25 = 12210106727545806375 - field m26 = 13648177365769586846 - field m27 = 15042137044708510189 - field m28 = 2554730408162944936 - field m29 = 16742667895331233611 - field m30 = 2494776793515665277 - field m31 = 14141966007005028685 - field m32 = 18062101036985256707 - field m33 = 755902906165376348 - field m34 = 386844847374139936 - field m35 = 12578289204908190735 - field m36 = 16474772505071285176 - field m37 = 4219412987430389417 - field m38 = 13785604981959978986 - field m39 = 6782700766578855354 - field m40 = 5027408469346314244 - field m41 = 3789778619153321757 - field m42 = 4990630321935587007 - field m43 = 13343213396420799882 - field m44 = 104089557996796214 - field m45 = 17594182424895122809 - field m46 = 1296646801898316520 - field m47 = 16927267389512340836 - field m48 = 15388042990166044599 - field m49 = 1062925035106735976 - field m50 = 6174325826189609393 - field m51 = 9654539659217203050 - field m52 = 3981669703948237017 - field m53 = 13344532373627816122 - field m54 = 9909148060180400932 - field m55 = 9832668435387834018 - field m56 = 16021044824039400858 - field m57 = 7712461657304026032 - field m58 = 7561823410587799308 - field m59 = 17083550112806683136 - field m60 = 6790038977110107895 - field m61 = 8056988792082041187 - field m62 = 6124556526406334790 - field m63 = 17224325032903033822 - field m64 = 12410794060221759964 - field m65 = 10618334591673088738 - field m66 = 3068156503820110383 - field m67 = 15231507067321079252 - field m68 = 11188165925029871979 - field m69 = 5971633157944515473 - field m70 = 2082638771837317713 - field m71 = 17302560278506804885 - field m72 = 7129447512455292844 - field m73 = 11141849528205973065 - field m74 = 15114786009406193424 - field m75 = 7449599548096808934 - field m76 = 12350858481215818754 - field m77 = 14112714168528178524 - field m78 = 16341673650923705326 - field m79 = 15739229265965988419 - field m80 = 6384637781573600052 - - // -- - // r = 0 - // ark - state0 = state0 + c0 - state1 = state1 + c1 - state2 = state2 + c2 - state3 = state3 + c3 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 1 - // ark - state0 = state0 + c4 - state1 = state1 + c5 - state2 = state2 + c6 - state3 = state3 + c7 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 2 - // ark - state0 = state0 + c8 - state1 = state1 + c9 - state2 = state2 + c10 - state3 = state3 + c11 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 3 - // ark - state0 = state0 + c12 - state1 = state1 + c13 - state2 = state2 + c14 - state3 = state3 + c15 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 4 - // ark - state0 = state0 + c16 - state1 = state1 + c17 - state2 = state2 + c18 - state3 = state3 + c19 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 5 - // ark - state0 = state0 + c20 - state1 = state1 + c21 - state2 = state2 + c22 - state3 = state3 + c23 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 6 - // ark - state0 = state0 + c24 - state1 = state1 + c25 - state2 = state2 + c26 - state3 = state3 + c27 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 7 - // ark - state0 = state0 + c28 - state1 = state1 + c29 - state2 = state2 + c30 - state3 = state3 + c31 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 8 - // ark - state0 = state0 + c32 - state1 = state1 + c33 - state2 = state2 + c34 - state3 = state3 + c35 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 9 - // ark - state0 = state0 + c36 - state1 = state1 + c37 - state2 = state2 + c38 - state3 = state3 + c39 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 10 - // ark - state0 = state0 + c40 - state1 = state1 + c41 - state2 = state2 + c42 - state3 = state3 + c43 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 11 - // ark - state0 = state0 + c44 - state1 = state1 + c45 - state2 = state2 + c46 - state3 = state3 + c47 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 12 - // ark - state0 = state0 + c48 - state1 = state1 + c49 - state2 = state2 + c50 - state3 = state3 + c51 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 13 - // ark - state0 = state0 + c52 - state1 = state1 + c53 - state2 = state2 + c54 - state3 = state3 + c55 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 14 - // ark - state0 = state0 + c56 - state1 = state1 + c57 - state2 = state2 + c58 - state3 = state3 + c59 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 15 - // ark - state0 = state0 + c60 - state1 = state1 + c61 - state2 = state2 + c62 - state3 = state3 + c63 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 16 - // ark - state0 = state0 + c64 - state1 = state1 + c65 - state2 = state2 + c66 - state3 = state3 + c67 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 17 - // ark - state0 = state0 + c68 - state1 = state1 + c69 - state2 = state2 + c70 - state3 = state3 + c71 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 18 - // ark - state0 = state0 + c72 - state1 = state1 + c73 - state2 = state2 + c74 - state3 = state3 + c75 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 19 - // ark - state0 = state0 + c76 - state1 = state1 + c77 - state2 = state2 + c78 - state3 = state3 + c79 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 20 - // ark - state0 = state0 + c80 - state1 = state1 + c81 - state2 = state2 + c82 - state3 = state3 + c83 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 21 - // ark - state0 = state0 + c84 - state1 = state1 + c85 - state2 = state2 + c86 - state3 = state3 + c87 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 22 - // ark - state0 = state0 + c88 - state1 = state1 + c89 - state2 = state2 + c90 - state3 = state3 + c91 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 23 - // ark - state0 = state0 + c92 - state1 = state1 + c93 - state2 = state2 + c94 - state3 = state3 + c95 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 24 - // ark - state0 = state0 + c96 - state1 = state1 + c97 - state2 = state2 + c98 - state3 = state3 + c99 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 25 - // ark - state0 = state0 + c100 - state1 = state1 + c101 - state2 = state2 + c102 - state3 = state3 + c103 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 26 - // ark - state0 = state0 + c104 - state1 = state1 + c105 - state2 = state2 + c106 - state3 = state3 + c107 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 27 - // ark - state0 = state0 + c108 - state1 = state1 + c109 - state2 = state2 + c110 - state3 = state3 + c111 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 28 - // ark - state0 = state0 + c112 - state1 = state1 + c113 - state2 = state2 + c114 - state3 = state3 + c115 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 29 - // ark - state0 = state0 + c116 - state1 = state1 + c117 - state2 = state2 + c118 - state3 = state3 + c119 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 30 - // ark - state0 = state0 + c120 - state1 = state1 + c121 - state2 = state2 + c122 - state3 = state3 + c123 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 31 - // ark - state0 = state0 + c124 - state1 = state1 + c125 - state2 = state2 + c126 - state3 = state3 + c127 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 32 - // ark - state0 = state0 + c128 - state1 = state1 + c129 - state2 = state2 + c130 - state3 = state3 + c131 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 33 - // ark - state0 = state0 + c132 - state1 = state1 + c133 - state2 = state2 + c134 - state3 = state3 + c135 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 34 - // ark - state0 = state0 + c136 - state1 = state1 + c137 - state2 = state2 + c138 - state3 = state3 + c139 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 35 - // ark - state0 = state0 + c140 - state1 = state1 + c141 - state2 = state2 + c142 - state3 = state3 + c143 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 36 - // ark - state0 = state0 + c144 - state1 = state1 + c145 - state2 = state2 + c146 - state3 = state3 + c147 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 37 - // ark - state0 = state0 + c148 - state1 = state1 + c149 - state2 = state2 + c150 - state3 = state3 + c151 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 38 - // ark - state0 = state0 + c152 - state1 = state1 + c153 - state2 = state2 + c154 - state3 = state3 + c155 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 39 - // ark - state0 = state0 + c156 - state1 = state1 + c157 - state2 = state2 + c158 - state3 = state3 + c159 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 40 - // ark - state0 = state0 + c160 - state1 = state1 + c161 - state2 = state2 + c162 - state3 = state3 + c163 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 41 - // ark - state0 = state0 + c164 - state1 = state1 + c165 - state2 = state2 + c166 - state3 = state3 + c167 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 42 - // ark - state0 = state0 + c168 - state1 = state1 + c169 - state2 = state2 + c170 - state3 = state3 + c171 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 43 - // ark - state0 = state0 + c172 - state1 = state1 + c173 - state2 = state2 + c174 - state3 = state3 + c175 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 44 - // ark - state0 = state0 + c176 - state1 = state1 + c177 - state2 = state2 + c178 - state3 = state3 + c179 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 45 - // ark - state0 = state0 + c180 - state1 = state1 + c181 - state2 = state2 + c182 - state3 = state3 + c183 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 46 - // ark - state0 = state0 + c184 - state1 = state1 + c185 - state2 = state2 + c186 - state3 = state3 + c187 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 47 - // ark - state0 = state0 + c188 - state1 = state1 + c189 - state2 = state2 + c190 - state3 = state3 + c191 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 48 - // ark - state0 = state0 + c192 - state1 = state1 + c193 - state2 = state2 + c194 - state3 = state3 + c195 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 49 - // ark - state0 = state0 + c196 - state1 = state1 + c197 - state2 = state2 + c198 - state3 = state3 + c199 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 50 - // ark - state0 = state0 + c200 - state1 = state1 + c201 - state2 = state2 + c202 - state3 = state3 + c203 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 51 - // ark - state0 = state0 + c204 - state1 = state1 + c205 - state2 = state2 + c206 - state3 = state3 + c207 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 52 - // ark - state0 = state0 + c208 - state1 = state1 + c209 - state2 = state2 + c210 - state3 = state3 + c211 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 53 - // ark - state0 = state0 + c212 - state1 = state1 + c213 - state2 = state2 + c214 - state3 = state3 + c215 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 54 - // ark - state0 = state0 + c216 - state1 = state1 + c217 - state2 = state2 + c218 - state3 = state3 + c219 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 55 - // ark - state0 = state0 + c220 - state1 = state1 + c221 - state2 = state2 + c222 - state3 = state3 + c223 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 56 - // ark - state0 = state0 + c224 - state1 = state1 + c225 - state2 = state2 + c226 - state3 = state3 + c227 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 57 - // ark - state0 = state0 + c228 - state1 = state1 + c229 - state2 = state2 + c230 - state3 = state3 + c231 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 58 - // ark - state0 = state0 + c232 - state1 = state1 + c233 - state2 = state2 + c234 - state3 = state3 + c235 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 59 - // ark - state0 = state0 + c236 - state1 = state1 + c237 - state2 = state2 + c238 - state3 = state3 + c239 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 - field new_state2 = state2 - field new_state3 = state3 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 60 - // ark - state0 = state0 + c240 - state1 = state1 + c241 - state2 = state2 + c242 - state3 = state3 + c243 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 61 - // ark - state0 = state0 + c244 - state1 = state1 + c245 - state2 = state2 + c246 - state3 = state3 + c247 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 62 - // ark - state0 = state0 + c248 - state1 = state1 + c249 - state2 = state2 + c250 - state3 = state3 + c251 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - // -- - // r = 63 - // ark - state0 = state0 + c252 - state1 = state1 + c253 - state2 = state2 + c254 - state3 = state3 + c255 - // sbox - field new_state0 = state0 ** 5 - field new_state1 = state1 ** 5 - field new_state2 = state2 ** 5 - field new_state3 = state3 ** 5 - // mix - state0 = new_state0 * m0 + new_state1 * m1 + new_state2 * m2 + new_state3 * m3 - state1 = new_state0 * m9 + new_state1 * m10 + new_state2 * m11 + new_state3 * m12 - state2 = new_state0 * m18 + new_state1 * m19 + new_state2 * m20 + new_state3 * m21 - state3 = new_state0 * m27 + new_state1 * m28 + new_state2 * m29 + new_state3 * m30 - return state0 - -def main() -> field: - return poseidon3(1, 2, 3) \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon5.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon5.zok deleted file mode 100644 index 8de30d76..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/poseidon5.zok +++ /dev/null @@ -1,3661 +0,0 @@ -from "./poseidon_struct.zok" import DoubleHash -def poseidon5_batch2(field state1_0, field state2_0, field state3_0, field state4_0, field state5_0, field state1_1, field state2_1, field state3_1, field state4_1, field state5_1) -> DoubleHash: - field state0_0 = 0 - field state0_1 = 0 - - field c0 = 758662019503705074 - field c1 = 9958560809385864598 - field c2 = 1277576466825840593 - field c3 = 17276116445666047290 - field c4 = 8462567671021664875 - field c5 = 18311663567274789012 - field c6 = 14794487373875431679 - field c7 = 939955959186974556 - field c8 = 13578068033787386336 - field c9 = 16936160577869353999 - field c10 = 7564443307661759393 - field c11 = 5701022615025077794 - field c12 = 14898040799158503403 - field c13 = 7398753701805340846 - field c14 = 17145662177513207623 - field c15 = 15919612504434736882 - field c16 = 211911121069562741 - field c17 = 14627162831253564776 - field c18 = 3736731127424592191 - field c19 = 16164080792556653606 - field c20 = 13310103488076492265 - field c21 = 17714184600411987649 - field c22 = 13937509549526454080 - field c23 = 8467973550572764378 - field c24 = 6149415607253035464 - field c25 = 9902966326901151535 - field c26 = 2299003035066075543 - field c27 = 9361464291309771166 - field c28 = 455760044697694737 - field c29 = 18069040773191725180 - field c30 = 12156451030386903890 - field c31 = 13269466490844642616 - field c32 = 4644627377627776228 - field c33 = 11517517066878151266 - field c34 = 2085762791679771559 - field c35 = 14341814612745946357 - field c36 = 8220722365145856681 - field c37 = 13781050119424493396 - field c38 = 14130172974922698924 - field c39 = 1268378720849035897 - field c40 = 13102522127585690797 - field c41 = 6435545073175926153 - field c42 = 10680323768845634897 - field c43 = 5377035848961467433 - field c44 = 16155044248960735250 - field c45 = 3956646720460237409 - field c46 = 15192201422078376101 - field c47 = 2254261886235227853 - field c48 = 18263210726053991346 - field c49 = 14588739567027142820 - field c50 = 9572725267846457115 - field c51 = 4663609806895345720 - field c52 = 16822560014146547002 - field c53 = 12821481803562047313 - field c54 = 3027425978972870548 - field c55 = 16762600845752241175 - field c56 = 7067459971848174565 - field c57 = 15884202556186149044 - field c58 = 8501625320175123709 - field c59 = 4388367812943946907 - field c60 = 12299931046827323210 - field c61 = 7636538909023199578 - field c62 = 14046758094336955416 - field c63 = 9633246818970530654 - field c64 = 13491266525055530545 - field c65 = 5423497366234120042 - field c66 = 1751962590333377264 - field c67 = 10513677123715294214 - field c68 = 996968784189528765 - field c69 = 10448850931434990018 - field c70 = 8953917554828103116 - field c71 = 1626108945262700028 - field c72 = 5891489572384527092 - field c73 = 6643806719713918869 - field c74 = 16083801189239088971 - field c75 = 14868933033345963433 - field c76 = 11850469235653996642 - field c77 = 1324483046183023543 - field c78 = 15183755263354743993 - field c79 = 2495724238845411316 - field c80 = 8731170262888399569 - field c81 = 16304783671381988951 - field c82 = 11235544699283452233 - field c83 = 2137768936382175302 - field c84 = 16675115627845335581 - field c85 = 2963350077420008404 - field c86 = 5398589702654192916 - field c87 = 12140466249394573251 - field c88 = 11834547998206516929 - field c89 = 6177294541684099188 - field c90 = 9838863225522131903 - field c91 = 4701779667688073310 - field c92 = 12835837905699815771 - field c93 = 2968170957340817290 - field c94 = 9828791715764525853 - field c95 = 8442028361006693278 - field c96 = 17176968168399522482 - field c97 = 17999791729505949887 - field c98 = 14962719204200253756 - field c99 = 17300730933512754375 - field c100 = 4222119091375155707 - field c101 = 11298113638119509435 - field c102 = 12268859188885459376 - field c103 = 9034427714391492438 - field c104 = 5990277340027239801 - field c105 = 726299115287076863 - field c106 = 18303937711932738539 - field c107 = 8960550811937596675 - field c108 = 18420334683743066202 - field c109 = 16986003784188475276 - field c110 = 13588430238611272524 - field c111 = 18102499241351263781 - field c112 = 7476618494341797169 - field c113 = 4184084235455659562 - field c114 = 5668298044436776508 - field c115 = 17447913737721385190 - field c116 = 11088130260910156172 - field c117 = 8792531517070849900 - field c118 = 9397646851851459952 - field c119 = 5121871193730760910 - field c120 = 2168557202402322871 - field c121 = 15702569595864319029 - field c122 = 14720843552400861125 - field c123 = 8277634810410081765 - field c124 = 6233674368436885280 - field c125 = 4306433523940866942 - field c126 = 17722591435523141845 - field c127 = 13983984591359038932 - field c128 = 9195938109190900291 - field c129 = 6074479640755470700 - field c130 = 14078059641315677730 - field c131 = 10695375213011552670 - field c132 = 5573015714231677140 - field c133 = 16984666835191674642 - field c134 = 10249524339733897711 - field c135 = 3174518716637848153 - field c136 = 7188570775991726809 - field c137 = 4753011490148598290 - field c138 = 5105443631000558491 - field c139 = 15781086678953962161 - field c140 = 3458297099390436339 - field c141 = 3082524552292086 - field c142 = 10885272710257457992 - field c143 = 3236146052509314745 - field c144 = 9696124289212404307 - field c145 = 1485008535953646698 - field c146 = 1137225154782514508 - field c147 = 10514784977699897262 - field c148 = 10729284392631787423 - field c149 = 14959018802228526836 - field c150 = 5311814720150441561 - field c151 = 15855390943452519568 - field c152 = 11214465269186418739 - field c153 = 4053806423852004669 - field c154 = 11760999889540157928 - field c155 = 13155611628497688688 - field c156 = 3842739007828054055 - field c157 = 5711430659662298364 - field c158 = 13288819076998297778 - field c159 = 4820382956965774345 - field c160 = 9818136475875046170 - field c161 = 15891193043142164602 - field c162 = 11369901158293474981 - field c163 = 16014685768489088745 - field c164 = 1356361795046325322 - field c165 = 15790892392481609398 - field c166 = 14921870878617925995 - field c167 = 7687231355395058862 - field c168 = 14150434200392676099 - field c169 = 1103438709908116920 - field c170 = 6477771864968923918 - field c171 = 17883003884435853137 - field c172 = 15616808237597542650 - field c173 = 298930612681613218 - field c174 = 7783145673030144050 - field c175 = 9925877788921434933 - field c176 = 7906428066733709088 - field c177 = 9059024899257096185 - field c178 = 12128791653883821821 - field c179 = 10439342184366574094 - field c180 = 16838255109359414152 - field c181 = 16778733411203605167 - field c182 = 3209921692078731530 - field c183 = 5829411678714675631 - field c184 = 13546305324682002944 - field c185 = 14388669943129102066 - field c186 = 16955277212659953284 - field c187 = 470060073341462642 - field c188 = 9865599081512514471 - field c189 = 3450866718365881982 - field c190 = 18253332465868317974 - field c191 = 8224383463926128747 - field c192 = 130168533448866398 - field c193 = 18296913789182388911 - field c194 = 9308875868804582517 - field c195 = 6860185202164278388 - field c196 = 5870361400608292852 - field c197 = 3853169742702299288 - field c198 = 2828579906117525532 - field c199 = 8244689163068534246 - field c200 = 14622287387679457865 - field c201 = 12818724415397588863 - field c202 = 9032795459261424103 - field c203 = 8582165566672449484 - field c204 = 1212546459474121359 - field c205 = 10720339750995594781 - field c206 = 9969473243746656646 - field c207 = 11889569503442370601 - field c208 = 8693000785136236266 - field c209 = 16911102564849626327 - field c210 = 10711317080423442023 - field c211 = 4092936164155659784 - field c212 = 9444614550731573011 - field c213 = 12734967290928938181 - field c214 = 2968663829197022452 - field c215 = 2063412078139901611 - field c216 = 6756409496657354005 - field c217 = 1956289224556834622 - field c218 = 17971879772361152496 - field c219 = 11129036599170922734 - field c220 = 6015714579300332596 - field c221 = 13952747316952120325 - field c222 = 6512928506883814256 - field c223 = 15000527898579580837 - field c224 = 13438817240481151739 - field c225 = 3438974907999726212 - field c226 = 2675270561650848698 - field c227 = 10615408741625344128 - field c228 = 15097127622747154430 - field c229 = 18306211703619792030 - field c230 = 18282207759862860963 - field c231 = 3969670710369869305 - field c232 = 15355909293594283010 - field c233 = 15825197601644123886 - field c234 = 12025247290627247881 - field c235 = 9244373186029472974 - field c236 = 8111711196724032485 - field c237 = 13910625786903113352 - field c238 = 4303582664435413453 - field c239 = 3615529122737143133 - field c240 = 13220640289699986291 - field c241 = 10945048589905126881 - field c242 = 18345446024459547893 - field c243 = 15246969291153869719 - field c244 = 3339771865943361715 - field c245 = 7920776184990771299 - field c246 = 11282075447781111045 - field c247 = 10409571270584994188 - field c248 = 7215903119088030248 - field c249 = 7149080371149851697 - field c250 = 12805983536086727637 - field c251 = 11544704273904429996 - field c252 = 3056733444472163063 - field c253 = 12775412729058442397 - field c254 = 10120906816355467459 - field c255 = 8580478192693828704 - field c256 = 17569548953071784548 - field c257 = 15170454632914839133 - field c258 = 11570807611472296007 - field c259 = 10726909497040777105 - field c260 = 440756088013805182 - field c261 = 7569336675219092295 - field c262 = 10579530867946972688 - field c263 = 10974325257620388506 - field c264 = 3053362977696829619 - field c265 = 17168463938106116617 - field c266 = 13835667625615860908 - field c267 = 2095873483773389479 - field c268 = 2016987140591259174 - field c269 = 2386979931999911847 - field c270 = 2505164847016101177 - field c271 = 13627451220086273527 - field c272 = 5731572550841603667 - field c273 = 15438639334109998771 - field c274 = 12813614048997555325 - field c275 = 10186814175982828107 - field c276 = 16191184896882054112 - field c277 = 14703692647542166085 - field c278 = 12578830251623636174 - field c279 = 1883855031971540983 - field c280 = 1266038367760006278 - field c281 = 11230634812224943920 - field c282 = 11308504110418640097 - field c283 = 6328296428453151721 - field c284 = 108818186627960168 - field c285 = 15547570943643535551 - field c286 = 4315257403857009861 - field c287 = 6380448982060371429 - field c288 = 632889842882717873 - field c289 = 7687981897540030037 - field c290 = 2375004428285747026 - field c291 = 1352206380036636795 - field c292 = 2578260287095025994 - field c293 = 2465523090448545549 - field c294 = 4247285443750660784 - field c295 = 3540885980673334329 - field c296 = 3345957484484543597 - field c297 = 11380792058791615855 - field c298 = 3199862384571235298 - field c299 = 173879172622348856 - field c300 = 15209080508353549507 - field c301 = 11649978506589666631 - field c302 = 9173090522521364544 - field c303 = 17030945052114083432 - field c304 = 4591187677780222237 - field c305 = 4064474173561892218 - field c306 = 15789829170657683922 - field c307 = 18208193905710242077 - field c308 = 14715997988505596440 - field c309 = 14667972935108688793 - field c310 = 5685168615648408563 - field c311 = 5245239484537042399 - field c312 = 3667459350052205975 - field c313 = 9197423732344085415 - field c314 = 4102452659988315248 - field c315 = 6641847341527232917 - field c316 = 12480319858851986779 - field c317 = 5186375792939856127 - field c318 = 2950251364917852338 - field c319 = 14773928965023494669 - field c320 = 12693729432082377979 - field c321 = 10022034381199683741 - field c322 = 9157237748502939080 - field c323 = 9663275337098404028 - field c324 = 13452894763307783925 - field c325 = 17376241946508742183 - field c326 = 3061844045327119072 - field c327 = 16030845287947531828 - field c328 = 1329076042067568487 - field c329 = 6855142122269391811 - field c330 = 11765672489282549160 - field c331 = 16830774944875965381 - field c332 = 6521069374664264162 - field c333 = 643523635231852913 - field c334 = 17135479068108868253 - field c335 = 4691294308622704824 - field c336 = 14491408402222977368 - field c337 = 18443726244814588799 - field c338 = 3981855558016600424 - field c339 = 6519895386704965259 - field c340 = 12833833766931651330 - field c341 = 5955046055337035381 - field c342 = 12102114200670204984 - field c343 = 17975981029431378883 - field c344 = 17148695856475432045 - field c345 = 4359514157740747375 - field c346 = 4733737572453903189 - field c347 = 9216164030888884101 - field c348 = 11898192372834399996 - field c349 = 8293149570945521798 - field c350 = 5292998910181620016 - field c351 = 11065412642848915128 - field c352 = 15951602728119640232 - field c353 = 17250120023723813262 - field c354 = 4208067670865654520 - field c355 = 4170990196992221254 - field c356 = 1364275915544901155 - field c357 = 5204734139073276471 - field c358 = 1348335617598418065 - field c359 = 4844946001170596348 - field c360 = 6839747835867181919 - field c361 = 5053317630835107264 - field c362 = 11056210036248139432 - field c363 = 1381878963923170929 - field c364 = 16574699770444639361 - field c365 = 8108738101012231328 - field c366 = 5608591239825657577 - field c367 = 2655890021744410286 - field c368 = 1274076210795298659 - field c369 = 11394663484515968481 - field c370 = 10856028813008380196 - field c371 = 13953897966883300641 - field c372 = 2480138023543998637 - field c373 = 8092805429879378234 - field c374 = 15734383915406361638 - field c375 = 12606199089969720633 - field c376 = 3432862751254991632 - field c377 = 11620001581001631894 - field c378 = 600733227997580875 - field c379 = 9960515431061710391 - field c380 = 15489520790087945179 - field c381 = 9888006245836622059 - field c382 = 16555061763510382783 - field c383 = 5729882798372086417 - field c384 = 18193672778018355673 - field c385 = 1822658993478572731 - field c386 = 5003044969628961755 - field c387 = 13153107988347151430 - field c388 = 784457190336231507 - field c389 = 13520638662186896236 - field c390 = 2049546776680600500 - field c391 = 10461088023685880055 - field c392 = 14926219627271786921 - field c393 = 17417636229842539696 - field c394 = 12492153963185454352 - field c395 = 414142119733528902 - field c396 = 17193096568008516286 - field c397 = 17273750640915671574 - field c398 = 2591282858188044874 - field c399 = 1735410450107017713 - field c400 = 10687387921399705460 - field c401 = 8183629028325381283 - field c402 = 10514917847412402927 - field c403 = 3336665081692857317 - field c404 = 5051946386531163563 - field c405 = 9781529663474696061 - field c406 = 13935324224847496391 - field c407 = 12199928622022129120 - field c408 = 18046988489253129363 - field c409 = 5360148275199876436 - field c410 = 4470351170521662089 - field c411 = 4053340142176580658 - field c412 = 7099987801407623156 - field c413 = 8643889260231910466 - field c414 = 8009486459327768919 - field c415 = 14356550044319110877 - field c416 = 1414693227423376523 - field c417 = 4179767940638916940 - field c418 = 13567672199210649738 - field c419 = 13138927205843206565 - field c420 = 215760839592843100 - field c421 = 16441790535445707930 - field c422 = 11718341735146782011 - field c423 = 12912429887242802458 - field c424 = 17517646119074274016 - field c425 = 7879023854534232228 - field c426 = 8728793248242325455 - field c427 = 5947682549087889590 - field c428 = 2708204009019253719 - field c429 = 2411670237320420929 - field c430 = 13609437845180998639 - field c431 = 10111681102226214657 - field c432 = 3316234197538285735 - field c433 = 2660139758422335686 - field c434 = 12151415153659423964 - field c435 = 8951257134131846586 - field c436 = 8730277595668694550 - field c437 = 11649943321766601019 - field c438 = 446558882505765024 - field c439 = 6924831314803654178 - field c440 = 16439861000844197132 - - field m0 = 15058071544716697658 - field m1 = 9113155049989891189 - field m2 = 11350291668724975614 - field m3 = 9632313156395526262 - field m4 = 10413730688534659007 - field m5 = 3697752025371176728 - field m6 = 11885276071251709314 - field m7 = 16598884434632610234 - field m8 = 8089761759414446189 - field m9 = 16040926183245094672 - field m10 = 8904964827445835399 - field m11 = 12487570753220630667 - field m12 = 3761754934154259876 - field m13 = 10365474600392912237 - field m14 = 18215459870146304436 - field m15 = 2521867902521748797 - field m16 = 9276651354726850372 - field m17 = 2876546369175151218 - field m18 = 2535340427714539962 - field m19 = 17035695180503554455 - field m20 = 5065438235784555509 - field m21 = 16133217454234073776 - field m22 = 7083511463634692513 - field m23 = 9613984133077979495 - field m24 = 1331692021515548952 - field m25 = 12210106727545806375 - field m26 = 13648177365769586846 - field m27 = 15042137044708510189 - field m28 = 2554730408162944936 - field m29 = 16742667895331233611 - field m30 = 2494776793515665277 - field m31 = 14141966007005028685 - field m32 = 18062101036985256707 - field m33 = 755902906165376348 - field m34 = 386844847374139936 - field m35 = 12578289204908190735 - field m36 = 16474772505071285176 - field m37 = 4219412987430389417 - field m38 = 13785604981959978986 - field m39 = 6782700766578855354 - field m40 = 5027408469346314244 - field m41 = 3789778619153321757 - field m42 = 4990630321935587007 - field m43 = 13343213396420799882 - field m44 = 104089557996796214 - field m45 = 17594182424895122809 - field m46 = 1296646801898316520 - field m47 = 16927267389512340836 - field m48 = 15388042990166044599 - field m49 = 1062925035106735976 - field m50 = 6174325826189609393 - field m51 = 9654539659217203050 - field m52 = 3981669703948237017 - field m53 = 13344532373627816122 - field m54 = 9909148060180400932 - field m55 = 9832668435387834018 - field m56 = 16021044824039400858 - field m57 = 7712461657304026032 - field m58 = 7561823410587799308 - field m59 = 17083550112806683136 - field m60 = 6790038977110107895 - field m61 = 8056988792082041187 - field m62 = 6124556526406334790 - field m63 = 17224325032903033822 - field m64 = 12410794060221759964 - field m65 = 10618334591673088738 - field m66 = 3068156503820110383 - field m67 = 15231507067321079252 - field m68 = 11188165925029871979 - field m69 = 5971633157944515473 - field m70 = 2082638771837317713 - field m71 = 17302560278506804885 - field m72 = 7129447512455292844 - field m73 = 11141849528205973065 - field m74 = 15114786009406193424 - field m75 = 7449599548096808934 - field m76 = 12350858481215818754 - field m77 = 14112714168528178524 - field m78 = 16341673650923705326 - field m79 = 15739229265965988419 - field m80 = 6384637781573600052 - - // -- - // r = 0 - // ark - state0_0 = state0_0 + c0 - state1_0 = state1_0 + c1 - state2_0 = state2_0 + c2 - state3_0 = state3_0 + c3 - state4_0 = state4_0 + c4 - state5_0 = state5_0 + c5 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 1 - // ark - state0_0 = state0_0 + c6 - state1_0 = state1_0 + c7 - state2_0 = state2_0 + c8 - state3_0 = state3_0 + c9 - state4_0 = state4_0 + c10 - state5_0 = state5_0 + c11 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 2 - // ark - state0_0 = state0_0 + c12 - state1_0 = state1_0 + c13 - state2_0 = state2_0 + c14 - state3_0 = state3_0 + c15 - state4_0 = state4_0 + c16 - state5_0 = state5_0 + c17 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 3 - // ark - state0_0 = state0_0 + c18 - state1_0 = state1_0 + c19 - state2_0 = state2_0 + c20 - state3_0 = state3_0 + c21 - state4_0 = state4_0 + c22 - state5_0 = state5_0 + c23 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 4 - // ark - state0_0 = state0_0 + c24 - state1_0 = state1_0 + c25 - state2_0 = state2_0 + c26 - state3_0 = state3_0 + c27 - state4_0 = state4_0 + c28 - state5_0 = state5_0 + c29 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 5 - // ark - state0_0 = state0_0 + c30 - state1_0 = state1_0 + c31 - state2_0 = state2_0 + c32 - state3_0 = state3_0 + c33 - state4_0 = state4_0 + c34 - state5_0 = state5_0 + c35 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 6 - // ark - state0_0 = state0_0 + c36 - state1_0 = state1_0 + c37 - state2_0 = state2_0 + c38 - state3_0 = state3_0 + c39 - state4_0 = state4_0 + c40 - state5_0 = state5_0 + c41 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 7 - // ark - state0_0 = state0_0 + c42 - state1_0 = state1_0 + c43 - state2_0 = state2_0 + c44 - state3_0 = state3_0 + c45 - state4_0 = state4_0 + c46 - state5_0 = state5_0 + c47 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 8 - // ark - state0_0 = state0_0 + c48 - state1_0 = state1_0 + c49 - state2_0 = state2_0 + c50 - state3_0 = state3_0 + c51 - state4_0 = state4_0 + c52 - state5_0 = state5_0 + c53 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 9 - // ark - state0_0 = state0_0 + c54 - state1_0 = state1_0 + c55 - state2_0 = state2_0 + c56 - state3_0 = state3_0 + c57 - state4_0 = state4_0 + c58 - state5_0 = state5_0 + c59 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 10 - // ark - state0_0 = state0_0 + c60 - state1_0 = state1_0 + c61 - state2_0 = state2_0 + c62 - state3_0 = state3_0 + c63 - state4_0 = state4_0 + c64 - state5_0 = state5_0 + c65 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 11 - // ark - state0_0 = state0_0 + c66 - state1_0 = state1_0 + c67 - state2_0 = state2_0 + c68 - state3_0 = state3_0 + c69 - state4_0 = state4_0 + c70 - state5_0 = state5_0 + c71 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 12 - // ark - state0_0 = state0_0 + c72 - state1_0 = state1_0 + c73 - state2_0 = state2_0 + c74 - state3_0 = state3_0 + c75 - state4_0 = state4_0 + c76 - state5_0 = state5_0 + c77 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 13 - // ark - state0_0 = state0_0 + c78 - state1_0 = state1_0 + c79 - state2_0 = state2_0 + c80 - state3_0 = state3_0 + c81 - state4_0 = state4_0 + c82 - state5_0 = state5_0 + c83 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 14 - // ark - state0_0 = state0_0 + c84 - state1_0 = state1_0 + c85 - state2_0 = state2_0 + c86 - state3_0 = state3_0 + c87 - state4_0 = state4_0 + c88 - state5_0 = state5_0 + c89 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 15 - // ark - state0_0 = state0_0 + c90 - state1_0 = state1_0 + c91 - state2_0 = state2_0 + c92 - state3_0 = state3_0 + c93 - state4_0 = state4_0 + c94 - state5_0 = state5_0 + c95 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 16 - // ark - state0_0 = state0_0 + c96 - state1_0 = state1_0 + c97 - state2_0 = state2_0 + c98 - state3_0 = state3_0 + c99 - state4_0 = state4_0 + c100 - state5_0 = state5_0 + c101 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 17 - // ark - state0_0 = state0_0 + c102 - state1_0 = state1_0 + c103 - state2_0 = state2_0 + c104 - state3_0 = state3_0 + c105 - state4_0 = state4_0 + c106 - state5_0 = state5_0 + c107 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 18 - // ark - state0_0 = state0_0 + c108 - state1_0 = state1_0 + c109 - state2_0 = state2_0 + c110 - state3_0 = state3_0 + c111 - state4_0 = state4_0 + c112 - state5_0 = state5_0 + c113 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 19 - // ark - state0_0 = state0_0 + c114 - state1_0 = state1_0 + c115 - state2_0 = state2_0 + c116 - state3_0 = state3_0 + c117 - state4_0 = state4_0 + c118 - state5_0 = state5_0 + c119 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 20 - // ark - state0_0 = state0_0 + c120 - state1_0 = state1_0 + c121 - state2_0 = state2_0 + c122 - state3_0 = state3_0 + c123 - state4_0 = state4_0 + c124 - state5_0 = state5_0 + c125 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 21 - // ark - state0_0 = state0_0 + c126 - state1_0 = state1_0 + c127 - state2_0 = state2_0 + c128 - state3_0 = state3_0 + c129 - state4_0 = state4_0 + c130 - state5_0 = state5_0 + c131 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 22 - // ark - state0_0 = state0_0 + c132 - state1_0 = state1_0 + c133 - state2_0 = state2_0 + c134 - state3_0 = state3_0 + c135 - state4_0 = state4_0 + c136 - state5_0 = state5_0 + c137 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 23 - // ark - state0_0 = state0_0 + c138 - state1_0 = state1_0 + c139 - state2_0 = state2_0 + c140 - state3_0 = state3_0 + c141 - state4_0 = state4_0 + c142 - state5_0 = state5_0 + c143 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 24 - // ark - state0_0 = state0_0 + c144 - state1_0 = state1_0 + c145 - state2_0 = state2_0 + c146 - state3_0 = state3_0 + c147 - state4_0 = state4_0 + c148 - state5_0 = state5_0 + c149 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 25 - // ark - state0_0 = state0_0 + c150 - state1_0 = state1_0 + c151 - state2_0 = state2_0 + c152 - state3_0 = state3_0 + c153 - state4_0 = state4_0 + c154 - state5_0 = state5_0 + c155 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 26 - // ark - state0_0 = state0_0 + c156 - state1_0 = state1_0 + c157 - state2_0 = state2_0 + c158 - state3_0 = state3_0 + c159 - state4_0 = state4_0 + c160 - state5_0 = state5_0 + c161 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 27 - // ark - state0_0 = state0_0 + c162 - state1_0 = state1_0 + c163 - state2_0 = state2_0 + c164 - state3_0 = state3_0 + c165 - state4_0 = state4_0 + c166 - state5_0 = state5_0 + c167 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 28 - // ark - state0_0 = state0_0 + c168 - state1_0 = state1_0 + c169 - state2_0 = state2_0 + c170 - state3_0 = state3_0 + c171 - state4_0 = state4_0 + c172 - state5_0 = state5_0 + c173 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 29 - // ark - state0_0 = state0_0 + c174 - state1_0 = state1_0 + c175 - state2_0 = state2_0 + c176 - state3_0 = state3_0 + c177 - state4_0 = state4_0 + c178 - state5_0 = state5_0 + c179 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 30 - // ark - state0_0 = state0_0 + c180 - state1_0 = state1_0 + c181 - state2_0 = state2_0 + c182 - state3_0 = state3_0 + c183 - state4_0 = state4_0 + c184 - state5_0 = state5_0 + c185 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 31 - // ark - state0_0 = state0_0 + c186 - state1_0 = state1_0 + c187 - state2_0 = state2_0 + c188 - state3_0 = state3_0 + c189 - state4_0 = state4_0 + c190 - state5_0 = state5_0 + c191 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 32 - // ark - state0_0 = state0_0 + c192 - state1_0 = state1_0 + c193 - state2_0 = state2_0 + c194 - state3_0 = state3_0 + c195 - state4_0 = state4_0 + c196 - state5_0 = state5_0 + c197 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 33 - // ark - state0_0 = state0_0 + c198 - state1_0 = state1_0 + c199 - state2_0 = state2_0 + c200 - state3_0 = state3_0 + c201 - state4_0 = state4_0 + c202 - state5_0 = state5_0 + c203 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 34 - // ark - state0_0 = state0_0 + c204 - state1_0 = state1_0 + c205 - state2_0 = state2_0 + c206 - state3_0 = state3_0 + c207 - state4_0 = state4_0 + c208 - state5_0 = state5_0 + c209 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 35 - // ark - state0_0 = state0_0 + c210 - state1_0 = state1_0 + c211 - state2_0 = state2_0 + c212 - state3_0 = state3_0 + c213 - state4_0 = state4_0 + c214 - state5_0 = state5_0 + c215 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 36 - // ark - state0_0 = state0_0 + c216 - state1_0 = state1_0 + c217 - state2_0 = state2_0 + c218 - state3_0 = state3_0 + c219 - state4_0 = state4_0 + c220 - state5_0 = state5_0 + c221 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 37 - // ark - state0_0 = state0_0 + c222 - state1_0 = state1_0 + c223 - state2_0 = state2_0 + c224 - state3_0 = state3_0 + c225 - state4_0 = state4_0 + c226 - state5_0 = state5_0 + c227 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 38 - // ark - state0_0 = state0_0 + c228 - state1_0 = state1_0 + c229 - state2_0 = state2_0 + c230 - state3_0 = state3_0 + c231 - state4_0 = state4_0 + c232 - state5_0 = state5_0 + c233 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 39 - // ark - state0_0 = state0_0 + c234 - state1_0 = state1_0 + c235 - state2_0 = state2_0 + c236 - state3_0 = state3_0 + c237 - state4_0 = state4_0 + c238 - state5_0 = state5_0 + c239 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 40 - // ark - state0_0 = state0_0 + c240 - state1_0 = state1_0 + c241 - state2_0 = state2_0 + c242 - state3_0 = state3_0 + c243 - state4_0 = state4_0 + c244 - state5_0 = state5_0 + c245 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 41 - // ark - state0_0 = state0_0 + c246 - state1_0 = state1_0 + c247 - state2_0 = state2_0 + c248 - state3_0 = state3_0 + c249 - state4_0 = state4_0 + c250 - state5_0 = state5_0 + c251 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 42 - // ark - state0_0 = state0_0 + c252 - state1_0 = state1_0 + c253 - state2_0 = state2_0 + c254 - state3_0 = state3_0 + c255 - state4_0 = state4_0 + c256 - state5_0 = state5_0 + c257 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 43 - // ark - state0_0 = state0_0 + c258 - state1_0 = state1_0 + c259 - state2_0 = state2_0 + c260 - state3_0 = state3_0 + c261 - state4_0 = state4_0 + c262 - state5_0 = state5_0 + c263 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 44 - // ark - state0_0 = state0_0 + c264 - state1_0 = state1_0 + c265 - state2_0 = state2_0 + c266 - state3_0 = state3_0 + c267 - state4_0 = state4_0 + c268 - state5_0 = state5_0 + c269 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 45 - // ark - state0_0 = state0_0 + c270 - state1_0 = state1_0 + c271 - state2_0 = state2_0 + c272 - state3_0 = state3_0 + c273 - state4_0 = state4_0 + c274 - state5_0 = state5_0 + c275 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 46 - // ark - state0_0 = state0_0 + c276 - state1_0 = state1_0 + c277 - state2_0 = state2_0 + c278 - state3_0 = state3_0 + c279 - state4_0 = state4_0 + c280 - state5_0 = state5_0 + c281 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 47 - // ark - state0_0 = state0_0 + c282 - state1_0 = state1_0 + c283 - state2_0 = state2_0 + c284 - state3_0 = state3_0 + c285 - state4_0 = state4_0 + c286 - state5_0 = state5_0 + c287 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 48 - // ark - state0_0 = state0_0 + c288 - state1_0 = state1_0 + c289 - state2_0 = state2_0 + c290 - state3_0 = state3_0 + c291 - state4_0 = state4_0 + c292 - state5_0 = state5_0 + c293 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 49 - // ark - state0_0 = state0_0 + c294 - state1_0 = state1_0 + c295 - state2_0 = state2_0 + c296 - state3_0 = state3_0 + c297 - state4_0 = state4_0 + c298 - state5_0 = state5_0 + c299 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 50 - // ark - state0_0 = state0_0 + c300 - state1_0 = state1_0 + c301 - state2_0 = state2_0 + c302 - state3_0 = state3_0 + c303 - state4_0 = state4_0 + c304 - state5_0 = state5_0 + c305 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 51 - // ark - state0_0 = state0_0 + c306 - state1_0 = state1_0 + c307 - state2_0 = state2_0 + c308 - state3_0 = state3_0 + c309 - state4_0 = state4_0 + c310 - state5_0 = state5_0 + c311 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 52 - // ark - state0_0 = state0_0 + c312 - state1_0 = state1_0 + c313 - state2_0 = state2_0 + c314 - state3_0 = state3_0 + c315 - state4_0 = state4_0 + c316 - state5_0 = state5_0 + c317 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 53 - // ark - state0_0 = state0_0 + c318 - state1_0 = state1_0 + c319 - state2_0 = state2_0 + c320 - state3_0 = state3_0 + c321 - state4_0 = state4_0 + c322 - state5_0 = state5_0 + c323 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 54 - // ark - state0_0 = state0_0 + c324 - state1_0 = state1_0 + c325 - state2_0 = state2_0 + c326 - state3_0 = state3_0 + c327 - state4_0 = state4_0 + c328 - state5_0 = state5_0 + c329 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 55 - // ark - state0_0 = state0_0 + c330 - state1_0 = state1_0 + c331 - state2_0 = state2_0 + c332 - state3_0 = state3_0 + c333 - state4_0 = state4_0 + c334 - state5_0 = state5_0 + c335 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 56 - // ark - state0_0 = state0_0 + c336 - state1_0 = state1_0 + c337 - state2_0 = state2_0 + c338 - state3_0 = state3_0 + c339 - state4_0 = state4_0 + c340 - state5_0 = state5_0 + c341 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 57 - // ark - state0_0 = state0_0 + c342 - state1_0 = state1_0 + c343 - state2_0 = state2_0 + c344 - state3_0 = state3_0 + c345 - state4_0 = state4_0 + c346 - state5_0 = state5_0 + c347 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 58 - // ark - state0_0 = state0_0 + c348 - state1_0 = state1_0 + c349 - state2_0 = state2_0 + c350 - state3_0 = state3_0 + c351 - state4_0 = state4_0 + c352 - state5_0 = state5_0 + c353 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 59 - // ark - state0_0 = state0_0 + c354 - state1_0 = state1_0 + c355 - state2_0 = state2_0 + c356 - state3_0 = state3_0 + c357 - state4_0 = state4_0 + c358 - state5_0 = state5_0 + c359 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 60 - // ark - state0_0 = state0_0 + c360 - state1_0 = state1_0 + c361 - state2_0 = state2_0 + c362 - state3_0 = state3_0 + c363 - state4_0 = state4_0 + c364 - state5_0 = state5_0 + c365 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 61 - // ark - state0_0 = state0_0 + c366 - state1_0 = state1_0 + c367 - state2_0 = state2_0 + c368 - state3_0 = state3_0 + c369 - state4_0 = state4_0 + c370 - state5_0 = state5_0 + c371 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 62 - // ark - state0_0 = state0_0 + c372 - state1_0 = state1_0 + c373 - state2_0 = state2_0 + c374 - state3_0 = state3_0 + c375 - state4_0 = state4_0 + c376 - state5_0 = state5_0 + c377 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 63 - // ark - state0_0 = state0_0 + c378 - state1_0 = state1_0 + c379 - state2_0 = state2_0 + c380 - state3_0 = state3_0 + c381 - state4_0 = state4_0 + c382 - state5_0 = state5_0 + c383 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 - field new_state2_0 = state2_0 - field new_state3_0 = state3_0 - field new_state4_0 = state4_0 - field new_state5_0 = state5_0 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 64 - // ark - state0_0 = state0_0 + c384 - state1_0 = state1_0 + c385 - state2_0 = state2_0 + c386 - state3_0 = state3_0 + c387 - state4_0 = state4_0 + c388 - state5_0 = state5_0 + c389 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 65 - // ark - state0_0 = state0_0 + c390 - state1_0 = state1_0 + c391 - state2_0 = state2_0 + c392 - state3_0 = state3_0 + c393 - state4_0 = state4_0 + c394 - state5_0 = state5_0 + c395 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 66 - // ark - state0_0 = state0_0 + c396 - state1_0 = state1_0 + c397 - state2_0 = state2_0 + c398 - state3_0 = state3_0 + c399 - state4_0 = state4_0 + c400 - state5_0 = state5_0 + c401 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 67 - // ark - state0_0 = state0_0 + c402 - state1_0 = state1_0 + c403 - state2_0 = state2_0 + c404 - state3_0 = state3_0 + c405 - state4_0 = state4_0 + c406 - state5_0 = state5_0 + c407 - // sbox - field new_state0_0 = state0_0 ** 5 - field new_state1_0 = state1_0 ** 5 - field new_state2_0 = state2_0 ** 5 - field new_state3_0 = state3_0 ** 5 - field new_state4_0 = state4_0 ** 5 - field new_state5_0 = state5_0 ** 5 - // mix - state0_0 = new_state0_0 * m0 + new_state1_0 * m1 + new_state2_0 * m2 + new_state3_0 * m3 + new_state4_0 * m4 + new_state5_0 * m5 - state1_0 = new_state0_0 * m9 + new_state1_0 * m10 + new_state2_0 * m11 + new_state3_0 * m12 + new_state4_0 * m13 + new_state5_0 * m14 - state2_0 = new_state0_0 * m18 + new_state1_0 * m19 + new_state2_0 * m20 + new_state3_0 * m21 + new_state4_0 * m22 + new_state5_0 * m23 - state3_0 = new_state0_0 * m27 + new_state1_0 * m28 + new_state2_0 * m29 + new_state3_0 * m30 + new_state4_0 * m31 + new_state5_0 * m32 - state4_0 = new_state0_0 * m36 + new_state1_0 * m37 + new_state2_0 * m38 + new_state3_0 * m39 + new_state4_0 * m40 + new_state5_0 * m41 - state5_0 = new_state0_0 * m45 + new_state1_0 * m46 + new_state2_0 * m47 + new_state3_0 * m48 + new_state4_0 * m49 + new_state5_0 * m50 - // -- - // r = 0 - // ark - state0_1 = state0_1 + c0 - state1_1 = state1_1 + c1 - state2_1 = state2_1 + c2 - state3_1 = state3_1 + c3 - state4_1 = state4_1 + c4 - state5_1 = state5_1 + c5 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 1 - // ark - state0_1 = state0_1 + c6 - state1_1 = state1_1 + c7 - state2_1 = state2_1 + c8 - state3_1 = state3_1 + c9 - state4_1 = state4_1 + c10 - state5_1 = state5_1 + c11 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 2 - // ark - state0_1 = state0_1 + c12 - state1_1 = state1_1 + c13 - state2_1 = state2_1 + c14 - state3_1 = state3_1 + c15 - state4_1 = state4_1 + c16 - state5_1 = state5_1 + c17 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 3 - // ark - state0_1 = state0_1 + c18 - state1_1 = state1_1 + c19 - state2_1 = state2_1 + c20 - state3_1 = state3_1 + c21 - state4_1 = state4_1 + c22 - state5_1 = state5_1 + c23 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 4 - // ark - state0_1 = state0_1 + c24 - state1_1 = state1_1 + c25 - state2_1 = state2_1 + c26 - state3_1 = state3_1 + c27 - state4_1 = state4_1 + c28 - state5_1 = state5_1 + c29 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 5 - // ark - state0_1 = state0_1 + c30 - state1_1 = state1_1 + c31 - state2_1 = state2_1 + c32 - state3_1 = state3_1 + c33 - state4_1 = state4_1 + c34 - state5_1 = state5_1 + c35 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 6 - // ark - state0_1 = state0_1 + c36 - state1_1 = state1_1 + c37 - state2_1 = state2_1 + c38 - state3_1 = state3_1 + c39 - state4_1 = state4_1 + c40 - state5_1 = state5_1 + c41 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 7 - // ark - state0_1 = state0_1 + c42 - state1_1 = state1_1 + c43 - state2_1 = state2_1 + c44 - state3_1 = state3_1 + c45 - state4_1 = state4_1 + c46 - state5_1 = state5_1 + c47 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 8 - // ark - state0_1 = state0_1 + c48 - state1_1 = state1_1 + c49 - state2_1 = state2_1 + c50 - state3_1 = state3_1 + c51 - state4_1 = state4_1 + c52 - state5_1 = state5_1 + c53 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 9 - // ark - state0_1 = state0_1 + c54 - state1_1 = state1_1 + c55 - state2_1 = state2_1 + c56 - state3_1 = state3_1 + c57 - state4_1 = state4_1 + c58 - state5_1 = state5_1 + c59 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 10 - // ark - state0_1 = state0_1 + c60 - state1_1 = state1_1 + c61 - state2_1 = state2_1 + c62 - state3_1 = state3_1 + c63 - state4_1 = state4_1 + c64 - state5_1 = state5_1 + c65 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 11 - // ark - state0_1 = state0_1 + c66 - state1_1 = state1_1 + c67 - state2_1 = state2_1 + c68 - state3_1 = state3_1 + c69 - state4_1 = state4_1 + c70 - state5_1 = state5_1 + c71 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 12 - // ark - state0_1 = state0_1 + c72 - state1_1 = state1_1 + c73 - state2_1 = state2_1 + c74 - state3_1 = state3_1 + c75 - state4_1 = state4_1 + c76 - state5_1 = state5_1 + c77 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 13 - // ark - state0_1 = state0_1 + c78 - state1_1 = state1_1 + c79 - state2_1 = state2_1 + c80 - state3_1 = state3_1 + c81 - state4_1 = state4_1 + c82 - state5_1 = state5_1 + c83 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 14 - // ark - state0_1 = state0_1 + c84 - state1_1 = state1_1 + c85 - state2_1 = state2_1 + c86 - state3_1 = state3_1 + c87 - state4_1 = state4_1 + c88 - state5_1 = state5_1 + c89 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 15 - // ark - state0_1 = state0_1 + c90 - state1_1 = state1_1 + c91 - state2_1 = state2_1 + c92 - state3_1 = state3_1 + c93 - state4_1 = state4_1 + c94 - state5_1 = state5_1 + c95 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 16 - // ark - state0_1 = state0_1 + c96 - state1_1 = state1_1 + c97 - state2_1 = state2_1 + c98 - state3_1 = state3_1 + c99 - state4_1 = state4_1 + c100 - state5_1 = state5_1 + c101 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 17 - // ark - state0_1 = state0_1 + c102 - state1_1 = state1_1 + c103 - state2_1 = state2_1 + c104 - state3_1 = state3_1 + c105 - state4_1 = state4_1 + c106 - state5_1 = state5_1 + c107 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 18 - // ark - state0_1 = state0_1 + c108 - state1_1 = state1_1 + c109 - state2_1 = state2_1 + c110 - state3_1 = state3_1 + c111 - state4_1 = state4_1 + c112 - state5_1 = state5_1 + c113 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 19 - // ark - state0_1 = state0_1 + c114 - state1_1 = state1_1 + c115 - state2_1 = state2_1 + c116 - state3_1 = state3_1 + c117 - state4_1 = state4_1 + c118 - state5_1 = state5_1 + c119 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 20 - // ark - state0_1 = state0_1 + c120 - state1_1 = state1_1 + c121 - state2_1 = state2_1 + c122 - state3_1 = state3_1 + c123 - state4_1 = state4_1 + c124 - state5_1 = state5_1 + c125 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 21 - // ark - state0_1 = state0_1 + c126 - state1_1 = state1_1 + c127 - state2_1 = state2_1 + c128 - state3_1 = state3_1 + c129 - state4_1 = state4_1 + c130 - state5_1 = state5_1 + c131 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 22 - // ark - state0_1 = state0_1 + c132 - state1_1 = state1_1 + c133 - state2_1 = state2_1 + c134 - state3_1 = state3_1 + c135 - state4_1 = state4_1 + c136 - state5_1 = state5_1 + c137 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 23 - // ark - state0_1 = state0_1 + c138 - state1_1 = state1_1 + c139 - state2_1 = state2_1 + c140 - state3_1 = state3_1 + c141 - state4_1 = state4_1 + c142 - state5_1 = state5_1 + c143 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 24 - // ark - state0_1 = state0_1 + c144 - state1_1 = state1_1 + c145 - state2_1 = state2_1 + c146 - state3_1 = state3_1 + c147 - state4_1 = state4_1 + c148 - state5_1 = state5_1 + c149 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 25 - // ark - state0_1 = state0_1 + c150 - state1_1 = state1_1 + c151 - state2_1 = state2_1 + c152 - state3_1 = state3_1 + c153 - state4_1 = state4_1 + c154 - state5_1 = state5_1 + c155 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 26 - // ark - state0_1 = state0_1 + c156 - state1_1 = state1_1 + c157 - state2_1 = state2_1 + c158 - state3_1 = state3_1 + c159 - state4_1 = state4_1 + c160 - state5_1 = state5_1 + c161 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 27 - // ark - state0_1 = state0_1 + c162 - state1_1 = state1_1 + c163 - state2_1 = state2_1 + c164 - state3_1 = state3_1 + c165 - state4_1 = state4_1 + c166 - state5_1 = state5_1 + c167 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 28 - // ark - state0_1 = state0_1 + c168 - state1_1 = state1_1 + c169 - state2_1 = state2_1 + c170 - state3_1 = state3_1 + c171 - state4_1 = state4_1 + c172 - state5_1 = state5_1 + c173 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 29 - // ark - state0_1 = state0_1 + c174 - state1_1 = state1_1 + c175 - state2_1 = state2_1 + c176 - state3_1 = state3_1 + c177 - state4_1 = state4_1 + c178 - state5_1 = state5_1 + c179 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 30 - // ark - state0_1 = state0_1 + c180 - state1_1 = state1_1 + c181 - state2_1 = state2_1 + c182 - state3_1 = state3_1 + c183 - state4_1 = state4_1 + c184 - state5_1 = state5_1 + c185 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 31 - // ark - state0_1 = state0_1 + c186 - state1_1 = state1_1 + c187 - state2_1 = state2_1 + c188 - state3_1 = state3_1 + c189 - state4_1 = state4_1 + c190 - state5_1 = state5_1 + c191 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 32 - // ark - state0_1 = state0_1 + c192 - state1_1 = state1_1 + c193 - state2_1 = state2_1 + c194 - state3_1 = state3_1 + c195 - state4_1 = state4_1 + c196 - state5_1 = state5_1 + c197 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 33 - // ark - state0_1 = state0_1 + c198 - state1_1 = state1_1 + c199 - state2_1 = state2_1 + c200 - state3_1 = state3_1 + c201 - state4_1 = state4_1 + c202 - state5_1 = state5_1 + c203 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 34 - // ark - state0_1 = state0_1 + c204 - state1_1 = state1_1 + c205 - state2_1 = state2_1 + c206 - state3_1 = state3_1 + c207 - state4_1 = state4_1 + c208 - state5_1 = state5_1 + c209 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 35 - // ark - state0_1 = state0_1 + c210 - state1_1 = state1_1 + c211 - state2_1 = state2_1 + c212 - state3_1 = state3_1 + c213 - state4_1 = state4_1 + c214 - state5_1 = state5_1 + c215 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 36 - // ark - state0_1 = state0_1 + c216 - state1_1 = state1_1 + c217 - state2_1 = state2_1 + c218 - state3_1 = state3_1 + c219 - state4_1 = state4_1 + c220 - state5_1 = state5_1 + c221 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 37 - // ark - state0_1 = state0_1 + c222 - state1_1 = state1_1 + c223 - state2_1 = state2_1 + c224 - state3_1 = state3_1 + c225 - state4_1 = state4_1 + c226 - state5_1 = state5_1 + c227 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 38 - // ark - state0_1 = state0_1 + c228 - state1_1 = state1_1 + c229 - state2_1 = state2_1 + c230 - state3_1 = state3_1 + c231 - state4_1 = state4_1 + c232 - state5_1 = state5_1 + c233 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 39 - // ark - state0_1 = state0_1 + c234 - state1_1 = state1_1 + c235 - state2_1 = state2_1 + c236 - state3_1 = state3_1 + c237 - state4_1 = state4_1 + c238 - state5_1 = state5_1 + c239 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 40 - // ark - state0_1 = state0_1 + c240 - state1_1 = state1_1 + c241 - state2_1 = state2_1 + c242 - state3_1 = state3_1 + c243 - state4_1 = state4_1 + c244 - state5_1 = state5_1 + c245 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 41 - // ark - state0_1 = state0_1 + c246 - state1_1 = state1_1 + c247 - state2_1 = state2_1 + c248 - state3_1 = state3_1 + c249 - state4_1 = state4_1 + c250 - state5_1 = state5_1 + c251 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 42 - // ark - state0_1 = state0_1 + c252 - state1_1 = state1_1 + c253 - state2_1 = state2_1 + c254 - state3_1 = state3_1 + c255 - state4_1 = state4_1 + c256 - state5_1 = state5_1 + c257 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 43 - // ark - state0_1 = state0_1 + c258 - state1_1 = state1_1 + c259 - state2_1 = state2_1 + c260 - state3_1 = state3_1 + c261 - state4_1 = state4_1 + c262 - state5_1 = state5_1 + c263 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 44 - // ark - state0_1 = state0_1 + c264 - state1_1 = state1_1 + c265 - state2_1 = state2_1 + c266 - state3_1 = state3_1 + c267 - state4_1 = state4_1 + c268 - state5_1 = state5_1 + c269 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 45 - // ark - state0_1 = state0_1 + c270 - state1_1 = state1_1 + c271 - state2_1 = state2_1 + c272 - state3_1 = state3_1 + c273 - state4_1 = state4_1 + c274 - state5_1 = state5_1 + c275 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 46 - // ark - state0_1 = state0_1 + c276 - state1_1 = state1_1 + c277 - state2_1 = state2_1 + c278 - state3_1 = state3_1 + c279 - state4_1 = state4_1 + c280 - state5_1 = state5_1 + c281 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 47 - // ark - state0_1 = state0_1 + c282 - state1_1 = state1_1 + c283 - state2_1 = state2_1 + c284 - state3_1 = state3_1 + c285 - state4_1 = state4_1 + c286 - state5_1 = state5_1 + c287 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 48 - // ark - state0_1 = state0_1 + c288 - state1_1 = state1_1 + c289 - state2_1 = state2_1 + c290 - state3_1 = state3_1 + c291 - state4_1 = state4_1 + c292 - state5_1 = state5_1 + c293 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 49 - // ark - state0_1 = state0_1 + c294 - state1_1 = state1_1 + c295 - state2_1 = state2_1 + c296 - state3_1 = state3_1 + c297 - state4_1 = state4_1 + c298 - state5_1 = state5_1 + c299 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 50 - // ark - state0_1 = state0_1 + c300 - state1_1 = state1_1 + c301 - state2_1 = state2_1 + c302 - state3_1 = state3_1 + c303 - state4_1 = state4_1 + c304 - state5_1 = state5_1 + c305 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 51 - // ark - state0_1 = state0_1 + c306 - state1_1 = state1_1 + c307 - state2_1 = state2_1 + c308 - state3_1 = state3_1 + c309 - state4_1 = state4_1 + c310 - state5_1 = state5_1 + c311 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 52 - // ark - state0_1 = state0_1 + c312 - state1_1 = state1_1 + c313 - state2_1 = state2_1 + c314 - state3_1 = state3_1 + c315 - state4_1 = state4_1 + c316 - state5_1 = state5_1 + c317 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 53 - // ark - state0_1 = state0_1 + c318 - state1_1 = state1_1 + c319 - state2_1 = state2_1 + c320 - state3_1 = state3_1 + c321 - state4_1 = state4_1 + c322 - state5_1 = state5_1 + c323 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 54 - // ark - state0_1 = state0_1 + c324 - state1_1 = state1_1 + c325 - state2_1 = state2_1 + c326 - state3_1 = state3_1 + c327 - state4_1 = state4_1 + c328 - state5_1 = state5_1 + c329 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 55 - // ark - state0_1 = state0_1 + c330 - state1_1 = state1_1 + c331 - state2_1 = state2_1 + c332 - state3_1 = state3_1 + c333 - state4_1 = state4_1 + c334 - state5_1 = state5_1 + c335 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 56 - // ark - state0_1 = state0_1 + c336 - state1_1 = state1_1 + c337 - state2_1 = state2_1 + c338 - state3_1 = state3_1 + c339 - state4_1 = state4_1 + c340 - state5_1 = state5_1 + c341 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 57 - // ark - state0_1 = state0_1 + c342 - state1_1 = state1_1 + c343 - state2_1 = state2_1 + c344 - state3_1 = state3_1 + c345 - state4_1 = state4_1 + c346 - state5_1 = state5_1 + c347 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 58 - // ark - state0_1 = state0_1 + c348 - state1_1 = state1_1 + c349 - state2_1 = state2_1 + c350 - state3_1 = state3_1 + c351 - state4_1 = state4_1 + c352 - state5_1 = state5_1 + c353 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 59 - // ark - state0_1 = state0_1 + c354 - state1_1 = state1_1 + c355 - state2_1 = state2_1 + c356 - state3_1 = state3_1 + c357 - state4_1 = state4_1 + c358 - state5_1 = state5_1 + c359 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 60 - // ark - state0_1 = state0_1 + c360 - state1_1 = state1_1 + c361 - state2_1 = state2_1 + c362 - state3_1 = state3_1 + c363 - state4_1 = state4_1 + c364 - state5_1 = state5_1 + c365 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 61 - // ark - state0_1 = state0_1 + c366 - state1_1 = state1_1 + c367 - state2_1 = state2_1 + c368 - state3_1 = state3_1 + c369 - state4_1 = state4_1 + c370 - state5_1 = state5_1 + c371 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 62 - // ark - state0_1 = state0_1 + c372 - state1_1 = state1_1 + c373 - state2_1 = state2_1 + c374 - state3_1 = state3_1 + c375 - state4_1 = state4_1 + c376 - state5_1 = state5_1 + c377 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 63 - // ark - state0_1 = state0_1 + c378 - state1_1 = state1_1 + c379 - state2_1 = state2_1 + c380 - state3_1 = state3_1 + c381 - state4_1 = state4_1 + c382 - state5_1 = state5_1 + c383 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 - field new_state2_1 = state2_1 - field new_state3_1 = state3_1 - field new_state4_1 = state4_1 - field new_state5_1 = state5_1 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 64 - // ark - state0_1 = state0_1 + c384 - state1_1 = state1_1 + c385 - state2_1 = state2_1 + c386 - state3_1 = state3_1 + c387 - state4_1 = state4_1 + c388 - state5_1 = state5_1 + c389 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 65 - // ark - state0_1 = state0_1 + c390 - state1_1 = state1_1 + c391 - state2_1 = state2_1 + c392 - state3_1 = state3_1 + c393 - state4_1 = state4_1 + c394 - state5_1 = state5_1 + c395 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 66 - // ark - state0_1 = state0_1 + c396 - state1_1 = state1_1 + c397 - state2_1 = state2_1 + c398 - state3_1 = state3_1 + c399 - state4_1 = state4_1 + c400 - state5_1 = state5_1 + c401 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - // -- - // r = 67 - // ark - state0_1 = state0_1 + c402 - state1_1 = state1_1 + c403 - state2_1 = state2_1 + c404 - state3_1 = state3_1 + c405 - state4_1 = state4_1 + c406 - state5_1 = state5_1 + c407 - // sbox - field new_state0_1 = state0_1 ** 5 - field new_state1_1 = state1_1 ** 5 - field new_state2_1 = state2_1 ** 5 - field new_state3_1 = state3_1 ** 5 - field new_state4_1 = state4_1 ** 5 - field new_state5_1 = state5_1 ** 5 - // mix - state0_1 = new_state0_1 * m0 + new_state1_1 * m1 + new_state2_1 * m2 + new_state3_1 * m3 + new_state4_1 * m4 + new_state5_1 * m5 - state1_1 = new_state0_1 * m9 + new_state1_1 * m10 + new_state2_1 * m11 + new_state3_1 * m12 + new_state4_1 * m13 + new_state5_1 * m14 - state2_1 = new_state0_1 * m18 + new_state1_1 * m19 + new_state2_1 * m20 + new_state3_1 * m21 + new_state4_1 * m22 + new_state5_1 * m23 - state3_1 = new_state0_1 * m27 + new_state1_1 * m28 + new_state2_1 * m29 + new_state3_1 * m30 + new_state4_1 * m31 + new_state5_1 * m32 - state4_1 = new_state0_1 * m36 + new_state1_1 * m37 + new_state2_1 * m38 + new_state3_1 * m39 + new_state4_1 * m40 + new_state5_1 * m41 - state5_1 = new_state0_1 * m45 + new_state1_1 * m46 + new_state2_1 * m47 + new_state3_1 * m48 + new_state4_1 * m49 + new_state5_1 * m50 - return DoubleHash { - hash0: state0_0, - hash1: state0_1 - } diff --git a/zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok b/zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok deleted file mode 100644 index 562ea290..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/poseidon_struct.zok +++ /dev/null @@ -1,4 +0,0 @@ -struct DoubleHash { - field hash0 - field hash1 -} \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/schnorr.input b/zok_tests/benchmarks/tests/compact_cert/schnorr.input deleted file mode 100644 index 32e0a43e..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/schnorr.input +++ /dev/null @@ -1 +0,0 @@ -END \ No newline at end of file diff --git a/zok_tests/benchmarks/tests/compact_cert/schnorr.zok b/zok_tests/benchmarks/tests/compact_cert/schnorr.zok deleted file mode 100644 index b4cd48a0..00000000 --- a/zok_tests/benchmarks/tests/compact_cert/schnorr.zok +++ /dev/null @@ -1,428 +0,0 @@ -from "./poseidon3.zok" import poseidon3 - -const field A = 526 -const field B = 265 -const u32 WIDTH = 253 - -struct Point { - field x - field y -} - -// Hack: set (0, 0) to be the identity -def point_add(Point a, Point b) -> Point: - // Compute numerator & denominator separately to avoid division by 0 - field m_num = b.y - a.y - field m_denom = b.x - a.x - field m = m_num / m_denom - field x3 = m * m - a.x - b.x - field y3 = m * (a.x - x3) - a.y - return Point { - x: x3, - y: y3 - } - -// k_bits is in big-endian of length 253 -// Use k_bits for multiplication while simultaneous check it matches k -def point_mul(Point a, field k, field[0] k_bits) -> Point: - // Hack: set (0, 0) to be the identity - Point a_k = Point { - x: 0, - y: 0 - } - field k_assemb = 0 - for u32 i in 0..WIDTH do - a_k = point_add(a_k, a_k) - k_assemb = k_assemb * 2 - field next_bit = k_bits[i] - assert(next_bit * (next_bit - 1) == 0) - if next_bit == 1 then - a_k = point_add(a_k, a) - k_assemb = k_assemb + 1 - endif - endfor - assert(k_assemb == k) - return a_k - -struct DoublePoint { - Point p0 - Point p1 -} - -struct QuadPoint { - Point p0 - Point p1 - Point p2 - Point p3 -} - -// Perform two point doubles and two point adds -// Specifically built for signature verification -// Returns: (a_0 + a_0, a_1 + a_1, a_0 + a_0 + b_0, a_1 + a_1 + b_1) -// a_0, a_1 might be (0, 0), b_0, b_1 are not -def inline point_double_add_batch( - Point a_0, - Point b_0, - Point a_1, - Point b_1 -) -> QuadPoint: - // a_0 + a_0 - field m_num = 3 * a_0.x * a_0.x + A - field m_denom = 2 * a_0.y // To avoid division by 0 - field m = m_num / m_denom - field x0 = m * m - a_0.x - a_0.x - field y0 = m * (a_0.x - x0) - a_0.y - // a_1 + a_1 - field m_num = 3 * a_1.x * a_1.x + A - field m_denom = 2 * a_1.y // To avoid division by 0 - field m = m_num / m_denom - field x1 = m * m - a_1.x - a_1.x - field y1 = m * (a_1.x - x1) - a_1.y - // (x0, y0) + b_0 - field m_num = b_0.y - y0 - field m_denom = b_0.x - x0 - field m = m_num / m_denom - field x2 = m * m - x0 - b_0.x - field y2 = m * (x0 - x2) - y0 - // (x1, y1) + b_1 - field m_num = b_1.y - y1 - field m_denom = b_1.x - x1 - field m = m_num / m_denom - field x3 = m * m - x1 - b_1.x - field y3 = m * (x1 - x3) - y1 - return QuadPoint { - p0: Point { x: x0, y: y0 }, - p1: Point { x: x1, y: y1 }, - p2: Point { x: x2, y: y2 }, - p3: Point { x: x3, y: y3 } - } - -// Specifically built for signature verification -def point_mul_batch( - Point a_0, - field k_0, - Point a_1, - field k_1 -) -> DoublePoint: - // Hack: set (0, 0) to be the identity - Point a_k_0 = a_0 - Point a_k_1 = a_1 - field k_assemb_0 = 0 - field k_assemb_1 = 0 - - // Do not start computation until after the first 1-bit - bool active_0 = false - bool active_1 = false - u32 i = 0 - for u32 it in 0..36 do - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - i = i + 1 - endfor - // Last one - k_assemb_0 = k_assemb_0 * 2 - k_assemb_1 = k_assemb_1 * 2 - witness field next_bit_0 - assert(next_bit_0 * (next_bit_0 - 1) == 0) - k_assemb_0 = k_assemb_0 + next_bit_0 - witness field next_bit_1 - assert(next_bit_1 * (next_bit_1 - 1) == 0) - k_assemb_1 = k_assemb_1 + next_bit_1 - QuadPoint tmp = point_double_add_batch(a_k_0, a_0, a_k_1, a_1) - if active_0 then - if next_bit_0 == 1 then - a_k_0 = tmp.p2 - else - a_k_0 = tmp.p0 - endif - endif - if next_bit_0 == 1 then - active_0 = true - endif - if active_1 then - if next_bit_1 == 1 then - a_k_1 = tmp.p3 - else - a_k_1 = tmp.p1 - endif - endif - if next_bit_1 == 1 then - active_1 = true - endif - assert(k_assemb_0 == k_0) - assert(k_assemb_1 == k_1) - return DoublePoint { - p0: a_k_0, - p1: a_k_1 - } - -struct PublicKey { - Point p - Point q -} - -struct Signature { - Point r - field s -} - -def verify_signature(field msg, PublicKey pk, Signature sig) -> field: - // Check all points are on the curve - assert(pk.p.y * pk.p.y == pk.p.x * pk.p.x * pk.p.x + A * pk.p.x + B) - assert(pk.q.y * pk.q.y == pk.q.x * pk.q.x * pk.q.x + A * pk.q.x + B) - assert(sig.r.y * sig.r.y == sig.r.x * sig.r.x * sig.r.x + A * sig.r.x + B) - - field e = poseidon3(msg, sig.r.x, sig.r.y) - // Point eq = point_mul(pk.q, e, e_bits) - // Point sp = point_mul(pk.p, sig.s, s_bits) - DoublePoint tmp = point_mul_batch(pk.q, e, pk.p, sig.s) - Point eq = tmp.p0 - Point sp = tmp.p1 - Point res = point_add(sig.r, eq) - assert(res.x == sp.x && res.y == sp.y) - return 1 - -/* -def main() -> u32: - field msg = 6908441180828167112785246881494320159273940089327447106269949444716788494909 - - // Generate a pk / sk pair - Point p = Point { - x: 2023776050662786605020065854616777351003832247628992350849206310281785027488, - y: 1079270832837170318396516616249394502719834190979906495690419930531357954746 - } - field a = 6663691457994429232637728556709855123400985295737706519097842870836531302493 - bool[WIDTH] a_bits = [false, true, true, true, false, true, false, true, true, true, false, true, true, true, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true, false, true, true, false, true, true, false, false, false, false, true, true, true, false, true, false, false, false, false, true, true, false, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, true, true, true, true, false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, false, false, false, false, false, true, true, false, false, false, true, false, true, true, false, true, false, true, true, true, true, true, true, false, true, false, true, true, true, false, false, false, false, true, true, true, true, false, false, false, false, false, true, true, true, false, false, true, false, true, false, false, true, true, false, false, true, false, false, true, true, true, false, false, false, true, false, false, true, false, true, true, true, false, false, false, false, true, true, false, false, false, false, false, true, false, false, true, false, true, false, false, false, false, true, true, true, false, false, false, true, false, true, true, false, false, true, true, false, true, true, true, true, false, true, false, false, false, false, true, false, true, true, true, true, true, true, false, false, true, false, true, true, true, true, true, true, true, false, true, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, true, false, true, true, true, false, true] - Point q = point_mul(p, a, a_bits) - - // Generate a signature - field k = 3955954614002644556381158561434471324488805491866623303867037346350176036901 - bool[WIDTH] k_bits = [false, true, false, false, false, true, false, true, true, true, true, true, false, true, true, true, true, true, true, false, true, true, false, true, false, true, true, true, true, true, true, false, true, true, true, false, false, false, true, true, false, true, false, false, true, true, true, false, false, false, true, false, true, false, true, false, false, false, true, false, true, false, false, true, false, true, true, true, false, true, true, false, false, false, false, true, false, true, false, false, true, false, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true, false, true, true, true, false, false, false, false, false, true, true, true, true, false, false, false, true, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, false, false, false, true, false, false, false, true, true, true, false, true, true, true, true, true, false, false, false, true, true, true, false, false, false, false, true, false, false, false, true, true, false, true, false, true, false, false, true, false, true, true, false, true, false, true, false, false, false, false, true, true, true, false, false, true, false, false, false, false, false, true, true, false, true, true, true, true, false, false, false, false, false, false, false, true, true, false, true, false, false, true, false, true, false, true, true, true, true, true, true, true, true, false, false, false, false, true, false, true, true, true, true, true, false, false, true, false, false, true, true, false, true, false, false, false, false, false, true, false, false, true, false, true] - Point r = point_mul(p, k, k_bits) - - field[3] inputs = [msg, r.x, r.y] - field e = poseidon(3, inputs) - // e = 664131425432701962192269875939376285542062040011815922607402886695788544729 - bool[WIDTH] e_bits = [false, false, false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, true, true, true, false, true, false, true, true, true, false, false, true, false, false, true, false, false, false, true, true, false, false, false, true, false, false, false, false, true, true, false, false, false, true, false, false, false, false, true, false, false, true, true, true, true, false, true, false, true, false, false, true, true, false, true, false, false, false, true, false, true, false, false, false, false, true, false, true, true, false, false, false, false, true, false, true, false, true, false, false, false, true, true, false, false, true, true, false, true, true, false, true, false, true, true, true, false, true, false, true, false, true, true, true, true, true, true, false, false, false, true, false, true, false, false, true, false, false, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, true, false, false, true, true, true, false, false, false, true, true, true, false, false, false, false, false, true, true, true, false, true, true, false, true, false, true, false, true, false, true, false, false, true, true, false, false, false, false, true, true, false, false, false, false, true, false, true, true, false, true, false, false, true, true, true, false, true, false, true, true, true, true, false, true, true, false, false, true, false, false, true, false, false, false, true, false, false, false, false, false, false, true, false, true, true, false, true, true, false, false, true] - - // s = k + a * e in (mod 7237005577332262213973186563042994240955753618821290553176770668684506720427) - field s = 4415915127126372096757067153593537022657929051278082364476489088715040314973 - bool[WIDTH] s_bits = [false, true, false, false, true, true, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, true, false, false, false, false, true, true, true, false, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, true, true, false, true, false, false, true, true, true, true, false, true, true, true, true, true, false, false, true, false, true, true, false, false, true, false, true, true, true, true, true, true, false, false, true, false, false, true, true, true, false, true, false, false, true, false, false, false, false, true, true, true, false, true, true, false, false, true, true, true, true, true, false, false, false, true, false, true, true, true, true, false, true, false, true, true, false, false, true, false, false, false, false, true, false, false, false, true, true, true, true, false, true, true, false, false, false, true, true, false, false, false, true, false, true, true, true, false, true, true, true, false, true, false, false, true, true, false, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, true, true, false, true, true, false, true, true, false, true, true, true, false, true, true, false, true, false, true, true, false, true, true, true, false, true, true, false, false, true, true, false, false, true, false, true, false, false, false, false, true, false, false, true, false, true, true, true, true, true, false, false, false, true, false, false, false, true, false, true, false, true, false, true, true, false, false, true, false, true, true, true, false, true] - - PublicKey pk = PublicKey { - p: p, - q: q - } - Signature sig = Signature { - r: r, - s: s - } - return verify_signature(msg, pk, sig, e_bits, s_bits) -*/ \ No newline at end of file