diff --git a/Cargo.lock b/Cargo.lock index 40b84807..cc523c9e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -32,9 +32,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -47,15 +47,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -158,9 +158,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.59" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -168,9 +168,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.59" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -180,9 +180,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", @@ -192,9 +192,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cobs" @@ -207,9 +207,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "cpufeatures" @@ -433,6 +433,7 @@ dependencies = [ "lean_vm", "rand", "rec_aggregation", + "serde_json", "sub_protocols", "utils", "xmss", @@ -496,9 +497,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] name = "lock_api" @@ -517,9 +518,9 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "lz4_flex" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6473172471198271ff72e9379150e9dfd70d8e533e0752a27e515b48dd375e" +checksum = "db9a0d582c2874f68138a16ce1867e0ffde6c0bb0a0df85e1f36d04146db488a" dependencies = [ "twox-hash", ] @@ -688,9 +689,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -749,9 +750,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "postcard" @@ -787,9 +788,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -869,9 +870,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rustc_version" @@ -997,9 +998,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.116" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -1093,9 +1094,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -1350,6 +1351,7 @@ name = "xmss" version = "0.1.0" dependencies = [ "backend", + "lz4_flex", "postcard", "rand", "serde", diff --git a/Cargo.toml b/Cargo.toml index 05b4631f..cd82d84a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,6 @@ members = [ "crates/backend/air", "crates/backend/fiat-shamir", "crates/backend/sumcheck", - "crates/whir", ] [workspace.lints] @@ -60,10 +59,11 @@ sub_protocols = { path = "crates/sub_protocols" } lean_compiler = { path = "crates/lean_compiler" } lean_prover = { path = "crates/lean_prover" } rec_aggregation = { path = "crates/rec_aggregation" } +backend = { path = "crates/backend" } # External clap = { version = "4.5.59", features = ["derive"] } -rand = "0.10" +rand = "0.10.0" rayon = "1.11.0" pest = "2.7" pest_derive = "2.7" @@ -71,12 +71,12 @@ itertools = "0.14.0" tracing = "0.1.26" serde_json = "1.0.145" serde = { version = "1.0.228", features = ["derive"] } -tracing-subscriber = { version = "0.3.19", features = ["std", "env-filter"] } +tracing-subscriber = { version = "0.3.23", features = ["std", "env-filter"] } tracing-forest = { version = "0.3.0", features = ["ansi", "smallvec"] } postcard = { version = "1.1.3", features = ["alloc"] } -lz4_flex = "0.12.0" - -backend = { path = "crates/backend" } +lz4_flex = "0.13.0" +leansig = { git = "https://github.com/leanEthereum/leanSig", branch = "devnet4" } +leansig_fast_keygen = { git = "https://github.com/TomWambsgans/leanSig", branch = "devnet4-fast-keygen" } [features] prox-gaps-conjecture = ["rec_aggregation/prox-gaps-conjecture"] @@ -84,15 +84,17 @@ prox-gaps-conjecture = ["rec_aggregation/prox-gaps-conjecture"] [dependencies] clap.workspace = true rec_aggregation.workspace = true -xmss.workspace = true air.workspace = true rand.workspace = true sub_protocols.workspace = true utils.workspace = true - lean_vm.workspace = true +xmss.workspace = true backend.workspace = true +[dev-dependencies] +serde_json.workspace = true + [profile.release] lto = "thin" diff --git a/README.md b/README.md index 829ba102..0cbc2fdd 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ cargo run --release -- recursion --n 2 | Proven | Conjectured | | --------------- | --------------- | -| 0.75s - 188 KiB | 0.57s - 116 KiB | +| 0.8s - 188 KiB | 0.57s - 116 KiB | ### Bonus: unbounded recursive aggregation diff --git a/crates/backend/fiat-shamir/src/verifier.rs b/crates/backend/fiat-shamir/src/verifier.rs index 8d00966f..9bbc26bd 100644 --- a/crates/backend/fiat-shamir/src/verifier.rs +++ b/crates/backend/fiat-shamir/src/verifier.rs @@ -9,7 +9,7 @@ use crate::{ }; use field::PrimeCharacteristicRing; use field::{ExtensionField, PrimeField64}; -use koala_bear::{KoalaBear, default_koalabear_poseidon2_16}; +use koala_bear::{KoalaBear, default_koalabear_poseidon1_16}; use symetric::Compression; pub struct VerifierState>, P> { @@ -71,7 +71,7 @@ where assert_eq!(TypeId::of::>(), TypeId::of::()); // SAFETY: We've confirmed PF == KoalaBear let paths: PrunedMerklePaths = unsafe { std::mem::transmute(paths) }; - let perm = default_koalabear_poseidon2_16(); + let perm = default_koalabear_poseidon1_16(); let hash_fn = |data: &[KoalaBear]| symetric::hash_slice::<_, _, 16, 8, DIGEST_LEN_FE>(&perm, data); let combine_fn = |left: &[KoalaBear; DIGEST_LEN_FE], right: &[KoalaBear; DIGEST_LEN_FE]| { symetric::compress(&perm, [*left, *right]) diff --git a/crates/backend/fiat-shamir/tests/grinding.rs b/crates/backend/fiat-shamir/tests/grinding.rs index 36622538..b45d336c 100644 --- a/crates/backend/fiat-shamir/tests/grinding.rs +++ b/crates/backend/fiat-shamir/tests/grinding.rs @@ -1,7 +1,4 @@ -use koala_bear::{ - ExternalLayerConstants, KOALABEAR_RC16_EXTERNAL_FINAL, KOALABEAR_RC16_EXTERNAL_INITIAL, KOALABEAR_RC16_INTERNAL, - Poseidon2KoalaBear, QuinticExtensionFieldKB, -}; +use koala_bear::{QuinticExtensionFieldKB, default_koalabear_poseidon1_16}; use mt_fiat_shamir::{FSProver, FSVerifier, ProverState, VerifierState}; use std::time::Instant; @@ -11,25 +8,18 @@ type EF = QuinticExtensionFieldKB; #[ignore] fn bench_grinding() { let n_reps = 100; - for grinding_bits in 10..=20 { - let mut prover_state = ProverState::::new(get_poseidon16()); + for grinding_bits in 20..=20 { + let mut prover_state = ProverState::::new(default_koalabear_poseidon1_16()); let time = Instant::now(); for _ in 0..n_reps { prover_state.pow_grinding(grinding_bits); } let elapsed = time.elapsed(); - let mut verifier_state = VerifierState::::new(prover_state.into_proof(), get_poseidon16()).unwrap(); + let mut verifier_state = + VerifierState::::new(prover_state.into_proof(), default_koalabear_poseidon1_16()).unwrap(); for _ in 0..n_reps { verifier_state.check_pow_grinding(grinding_bits).unwrap() } println!("Grinding {grinding_bits} bits: {:?}", elapsed / n_reps); } } - -pub fn get_poseidon16() -> Poseidon2KoalaBear<16> { - let external_constants = ExternalLayerConstants::new( - KOALABEAR_RC16_EXTERNAL_INITIAL.to_vec(), - KOALABEAR_RC16_EXTERNAL_FINAL.to_vec(), - ); - Poseidon2KoalaBear::new(external_constants, KOALABEAR_RC16_INTERNAL.to_vec()) -} diff --git a/crates/backend/field/src/field.rs b/crates/backend/field/src/field.rs index 3a111bba..aa20e3f2 100644 --- a/crates/backend/field/src/field.rs +++ b/crates/backend/field/src/field.rs @@ -337,7 +337,7 @@ pub trait PrimeCharacteristicRing: // For `N <= 8` we implement a tree sum structure and for `N > 8` we break the input into // chunks of `8`, perform a tree sum on each chunk and sum the results. The parameter `8` - // was determined experimentally by testing the speed of the poseidon2 internal layer computations. + // was determined experimentally by testing the speed of the poseidon internal layer computations. // This is a useful benchmark as we have a mix of summations of size 15, 23 with other work in between. // I only tested this on `AVX2` though so there might be a better value for other architectures. match N { diff --git a/crates/backend/koala-bear/src/aarch64_neon/mod.rs b/crates/backend/koala-bear/src/aarch64_neon/mod.rs index 88f8fcf8..730a8675 100644 --- a/crates/backend/koala-bear/src/aarch64_neon/mod.rs +++ b/crates/backend/koala-bear/src/aarch64_neon/mod.rs @@ -1,6 +1,5 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). mod packing; -mod poseidon2; pub use packing::*; diff --git a/crates/backend/koala-bear/src/aarch64_neon/poseidon2.rs b/crates/backend/koala-bear/src/aarch64_neon/poseidon2.rs deleted file mode 100644 index 2a9cde4d..00000000 --- a/crates/backend/koala-bear/src/aarch64_neon/poseidon2.rs +++ /dev/null @@ -1,99 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -use core::arch::aarch64::uint32x4_t; - -use crate::{InternalLayerParametersNeon, mul_2exp_neg_n_neon, mul_2exp_neg_two_adicity_neon}; - -use crate::{KoalaBearInternalLayerParameters, KoalaBearParameters}; - -impl InternalLayerParametersNeon for KoalaBearInternalLayerParameters { - type ArrayLike = [uint32x4_t; 15]; - - /// For the KoalaBear field and width 16 we multiply by the diagonal matrix: - /// D = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/8, 1/2^24, -1/2^8, -1/8, -1/16, -1/2^24]. - /// - /// The inputs must be in canonical form, otherwise the result is undefined. - /// - /// Even when the inputs are in canonical form, we make no guarantees on the output except that, provided - /// the output is piped directly into add_sum the vector will be modified such that x[i] = D[i]*x[i] + sum. - #[inline(always)] - unsafe fn diagonal_mul_remainder(input: &mut [uint32x4_t; 15]) { - unsafe { - // These multiplications are for positive coefficients. The results are added to the - // sum in the `add_sum` function. - // input[8] -> input[8] / 2^8 - input[8] = mul_2exp_neg_n_neon::(input[8]); - // input[9] -> input[9] / 8 - input[9] = mul_2exp_neg_n_neon::(input[9]); - // input[10] -> input[10] / 2^24 - input[10] = mul_2exp_neg_two_adicity_neon::(input[10]); - - // These multiplications are for negative coefficients. We compute the multiplication - // by the positive value, and the result is later subtracted from the sum in `add_sum`. - // input[11] -> input[11] / 2^8 - input[11] = mul_2exp_neg_n_neon::(input[11]); - // input[12] -> input[12] / 8 - input[12] = mul_2exp_neg_n_neon::(input[12]); - // input[13] -> input[13] / 16 - input[13] = mul_2exp_neg_n_neon::(input[13]); - // input[14] -> input[14] / 2^24 - input[14] = mul_2exp_neg_two_adicity_neon::(input[14]); - } - } - - /// There are 3 positive inverse powers of two after the -4: 1/2^8, 1/8, 1/2^24, - const NUM_POS: usize = 3; -} - -impl InternalLayerParametersNeon for KoalaBearInternalLayerParameters { - type ArrayLike = [uint32x4_t; 23]; - - /// For the KoalaBear field and width 24 we multiply by the diagonal matrix: - /// D = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24, -1/2^8, -1/8, -1/16, -1/32, -1/64, -1/2^7, -1/2^9, -1/2^24] - /// - /// The inputs must be in canonical form, otherwise the result is undefined. - /// - /// Even when the inputs are in canonical form, we make no guarantees on the output except that, provided - /// the output is piped directly into add_sum, the vector will be modified such that x[i] = D[i]*x[i] + sum. - #[inline(always)] - unsafe fn diagonal_mul_remainder(input: &mut [uint32x4_t; 23]) { - unsafe { - // Positive coefficients - // input[8] -> sum + input[8]/2**8 - input[8] = mul_2exp_neg_n_neon::(input[8]); - // input[9] -> sum + input[9]/2**2 - input[9] = mul_2exp_neg_n_neon::(input[9]); - // input[10] -> sum + input[10]/2**3 - input[10] = mul_2exp_neg_n_neon::(input[10]); - // input[11] -> sum + input[11]/2**4 - input[11] = mul_2exp_neg_n_neon::(input[11]); - // input[12] -> sum + input[12]/2**5 - input[12] = mul_2exp_neg_n_neon::(input[12]); - // input[13] -> sum + input[13]/2**6 - input[13] = mul_2exp_neg_n_neon::(input[13]); - // input[14] -> sum + input[14]/2**24 - input[14] = mul_2exp_neg_two_adicity_neon::(input[14]); - - // Negative coefficients - // input[15] -> sum - input[15]/2**8 - input[15] = mul_2exp_neg_n_neon::(input[15]); - // input[16] -> sum - input[16]/2**3 - input[16] = mul_2exp_neg_n_neon::(input[16]); - // input[17] -> sum - input[17]/2**4 - input[17] = mul_2exp_neg_n_neon::(input[17]); - // input[18] -> sum - input[18]/2**5 - input[18] = mul_2exp_neg_n_neon::(input[18]); - // input[19] -> sum - input[19]/2**6 - input[19] = mul_2exp_neg_n_neon::(input[19]); - // input[20] -> sum - input[20]/2**7 - input[20] = mul_2exp_neg_n_neon::(input[20]); - // input[21] -> sum - input[21]/2**9 - input[21] = mul_2exp_neg_n_neon::(input[21]); - // input[22] -> sum - input[22]/2**24 - input[22] = mul_2exp_neg_two_adicity_neon::(input[22]); - } - } - - /// There are 7 positive inverse powers of two after the -4: 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24; - const NUM_POS: usize = 7; -} diff --git a/crates/backend/koala-bear/src/benchmark_poseidons.rs b/crates/backend/koala-bear/src/benchmark_poseidons.rs new file mode 100644 index 00000000..66c6a5a0 --- /dev/null +++ b/crates/backend/koala-bear/src/benchmark_poseidons.rs @@ -0,0 +1,39 @@ +use std::hint::black_box; +use std::time::Instant; + +use field::Field; +use field::PackedValue; +use field::PrimeCharacteristicRing; + +use crate::{KoalaBear, default_koalabear_poseidon1_16}; + +type FPacking = ::Packing; +const PACKING_WIDTH: usize = ::WIDTH; + +#[test] +#[ignore] +fn bench_poseidon() { + // cargo test --release --package mt-koala-bear --lib -- benchmark_poseidons::bench_poseidon --exact --nocapture --ignored + + let n = 1 << 23; + let poseidon1_16 = default_koalabear_poseidon1_16(); + + // warming + let mut state_16: [FPacking; 16] = [FPacking::ZERO; 16]; + for _ in 0..1 << 15 { + poseidon1_16.compress_in_place(&mut state_16); + } + let _ = black_box(state_16); + + let time = Instant::now(); + for _ in 0..n / PACKING_WIDTH { + poseidon1_16.compress_in_place(&mut state_16); + } + let _ = black_box(state_16); + let time_p1_simd = time.elapsed(); + println!( + "Poseidon1 16 SIMD (width {}): {:.2}M hashes/s", + PACKING_WIDTH, + (n as f64 / time_p1_simd.as_secs_f64() / 1_000_000.0) + ); +} diff --git a/crates/backend/koala-bear/src/lib.rs b/crates/backend/koala-bear/src/lib.rs index 29914724..959ed3ad 100644 --- a/crates/backend/koala-bear/src/lib.rs +++ b/crates/backend/koala-bear/src/lib.rs @@ -6,11 +6,13 @@ extern crate alloc; mod koala_bear; pub mod monty_31; -pub mod poseidon2; -mod poseidon2_koalabear; +mod poseidon1_koalabear_16; pub mod quintic_extension; pub mod symmetric; +#[cfg(test)] +mod benchmark_poseidons; + #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] mod aarch64_neon; @@ -20,27 +22,11 @@ mod x86_64_avx2; #[cfg(all(target_arch = "x86_64", target_feature = "avx512f"))] mod x86_64_avx512; -// Re-export everything from monty_31 -pub use monty_31::*; - -// Re-export koala bear specific types pub use koala_bear::*; - -// Re-export koala bear poseidon2 constants and types -pub use poseidon2_koalabear::*; - -// Re-export key poseidon2 types -pub use poseidon2::{ - ExternalLayer, ExternalLayerConstants, ExternalLayerConstructor, GenericPoseidon2LinearLayers, HLMDSMat4, - InternalLayer, InternalLayerConstructor, MDSMat4, Poseidon2, add_rc_and_sbox_generic, - external_initial_permute_state, external_terminal_permute_state, mds_light_permutation, - poseidon2_round_numbers_128, -}; - -// Re-export quintic extension types +pub use monty_31::*; +pub use poseidon1_koalabear_16::*; pub use quintic_extension::*; -// Re-export arch-specific types #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] pub use aarch64_neon::*; diff --git a/crates/backend/koala-bear/src/monty_31/aarch64_neon/mod.rs b/crates/backend/koala-bear/src/monty_31/aarch64_neon/mod.rs index 23251862..993e232b 100644 --- a/crates/backend/koala-bear/src/monty_31/aarch64_neon/mod.rs +++ b/crates/backend/koala-bear/src/monty_31/aarch64_neon/mod.rs @@ -1,9 +1,9 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). mod packing; -mod poseidon2; +pub(crate) mod poseidon_helpers; mod utils; pub use packing::*; -pub use poseidon2::*; +pub(crate) use poseidon_helpers::*; pub use utils::*; diff --git a/crates/backend/koala-bear/src/monty_31/aarch64_neon/packing.rs b/crates/backend/koala-bear/src/monty_31/aarch64_neon/packing.rs index 50393798..f235f902 100644 --- a/crates/backend/koala-bear/src/monty_31/aarch64_neon/packing.rs +++ b/crates/backend/koala-bear/src/monty_31/aarch64_neon/packing.rs @@ -108,7 +108,7 @@ impl PackedMontyField31Neon { /// Copy `value` to all positions in a packed vector. This is the same as /// `From::from`, but `const`. #[inline] - const fn broadcast(value: MontyField31) -> Self { + pub(crate) const fn broadcast(value: MontyField31) -> Self { Self([value; WIDTH]) } } @@ -265,6 +265,18 @@ impl_sum_prod_base_field!(PackedMontyField31Neon, MontyField31, (FieldParameters impl Algebra> for PackedMontyField31Neon {} +impl PackedMontyField31Neon { + /// Compute the dot product of a packed vector with a scalar vector. + /// + /// This is more efficient than broadcasting the scalars first, because the + /// Karatsuba recursion can keep the constant (rhs) side as cheap scalar + /// operations while only the lhs/output side uses SIMD. + #[inline(always)] + pub fn mixed_dot_product(lhs: &[Self; N], rhs: &[MontyField31; N]) -> Self { + general_dot_product::<_, _, _, N>(lhs, rhs) + } +} + impl, const D: u64> InjectiveMonomial for PackedMontyField31Neon {} impl, const D: u64> PermutationMonomial diff --git a/crates/backend/koala-bear/src/monty_31/aarch64_neon/poseidon2.rs b/crates/backend/koala-bear/src/monty_31/aarch64_neon/poseidon2.rs deleted file mode 100644 index 879931b9..00000000 --- a/crates/backend/koala-bear/src/monty_31/aarch64_neon/poseidon2.rs +++ /dev/null @@ -1,520 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! Vectorized Neon implementation of Poseidon2 for MontyField31 - -use alloc::vec::Vec; -use core::arch::aarch64::{self, int32x4_t, uint32x4_t}; -use core::marker::PhantomData; -use core::mem::transmute; - -use crate::poseidon2::{ - ExternalLayer, ExternalLayerConstants, ExternalLayerConstructor, InternalLayer, InternalLayerConstructor, MDSMat4, - external_initial_permute_state, external_terminal_permute_state, -}; -use field::{PrimeCharacteristicRing, uint32x4_mod_add, uint32x4_mod_sub}; - -use super::exp_small; -use super::utils::halve_neon; -use crate::{ - FieldParameters, MontyField31, MontyParameters, PackedMontyField31Neon, PackedMontyParameters, RelativelyPrimePower, -}; - -/// A specialized representation of the Poseidon2 state for a width of 16. -/// -/// The primary purpose of this struct is to optimize the internal rounds by separating the state -/// into two distinct parts: -/// -/// 1. `s0`: The first element, which is the only one to undergo the S-box operation. -/// 2. `s_hi`: The remaining 15 elements, which only undergo the linear layer transformation. -/// -/// By splitting the state in this way, we provide a strong hint to the compiler that the S-box -/// on `s0` and the linear operations on `s_hi` are independent data paths. This allows the CPU's -/// out-of-order execution engine to run these operations in parallel, effectively hiding the S-box latency -/// and significantly improving performance. -#[derive(Clone, Copy)] -#[repr(C)] // This is needed to make `transmute`s safe. -pub struct InternalLayer16 { - /// The first element of the state, which undergoes the S-box transformation. - s0: PackedMontyField31Neon, - /// The remaining 15 elements of the state, which undergo the linear layer transformation. - s_hi: [uint32x4_t; 15], -} - -impl InternalLayer16 { - /// Converts the specialized `InternalLayer16` representation into a standard array `[PackedMontyField31Neon; 16]`. - /// - /// This is a zero-cost conversion that leverages the `#[repr(C)]` layout of the struct. - /// - /// # Safety - /// The caller *must* ensure that every raw `uint32x4_t` vector within `self.s_hi` contains - /// valid `MontyField31` elements in canonical form `[0, P)`. - #[inline] - unsafe fn to_packed_field_array(self) -> [PackedMontyField31Neon; 16] { - unsafe { - // This `transmute` is safe because `InternalLayer16` is `#[repr(C)]` and is guaranteed - // to have the exact same memory layout as the target array `[PackedMontyField31Neon; 16]`. - transmute(self) - } - } - - /// Converts a standard array `[PackedMontyField31Neon; 16]` into the specialized `InternalLayer16` representation. - /// - /// This is a zero-cost conversion that leverages the `#[repr(C)]` layout of the struct. - #[inline] - #[must_use] - fn from_packed_field_array(vector: [PackedMontyField31Neon; 16]) -> Self { - unsafe { - // This `transmute` is safe because `InternalLayer16` is `#[repr(C)]` and so is guaranteed - // to have the exact same memory layout as `[PackedMontyField31Neon; 16]`. - transmute(vector) - } - } -} - -/// A specialized representation of the Poseidon2 state for a width of 24. -/// -/// The primary purpose of this struct is to optimize the internal rounds by separating the state -/// into two distinct parts: -/// -/// 1. `s0`: The first element, which is the only one to undergo the S-box operation. -/// 2. `s_hi`: The remaining 23 elements, which only undergo the linear layer transformation. -/// -/// By splitting the state in this way, we provide a strong hint to the compiler that the S-box -/// on `s0` and the linear operations on `s_hi` are independent data paths. This allows the CPU's -/// out-of-order execution engine to run these operations in parallel, effectively hiding the S-box latency -/// and significantly improving performance. -#[derive(Clone, Copy)] -#[repr(C)] // This is needed to make `transmute`s safe. -pub struct InternalLayer24 { - /// The first element of the state, which undergoes the S-box transformation. - s0: PackedMontyField31Neon, - /// The remaining 23 elements of the state, which undergo the linear layer transformation. - s_hi: [uint32x4_t; 23], -} - -impl InternalLayer24 { - /// Converts the specialized `InternalLayer24` representation into a standard array `[PackedMontyField31Neon; 24]`. - /// - /// This is a zero-cost conversion that leverages the `#[repr(C)]` layout of the struct. - /// - /// # Safety - /// The caller *must* ensure that every raw `uint32x4_t` vector within `self.s_hi` contains - /// valid `MontyField31` elements in canonical form `[0, P)`. - #[inline] - unsafe fn to_packed_field_array(self) -> [PackedMontyField31Neon; 24] { - unsafe { - // This `transmute` is safe because `InternalLayer24` is `#[repr(C)]` and is guaranteed - // to have the exact same memory layout as the target array `[PackedMontyField31Neon; 24]`. - transmute(self) - } - } - - /// Converts a standard array `[PackedMontyField31Neon; 24]` into the specialized `InternalLayer24` representation. - /// - /// This is a zero-cost conversion that leverages the `#[repr(C)]` layout of the struct. - #[inline] - #[must_use] - fn from_packed_field_array(vector: [PackedMontyField31Neon; 24]) -> Self { - unsafe { - // This `transmute` is safe because `InternalLayer24` is `#[repr(C)]` and so is guaranteed - // to have the exact same memory layout as `[PackedMontyField31Neon; 24]`. - transmute(vector) - } - } -} - -/// Represents the internal layers of the Poseidon2 permutation for NEON-accelerated operations. -#[derive(Debug, Clone)] -pub struct Poseidon2InternalLayerMonty31< - PMP: PackedMontyParameters, - const WIDTH: usize, - ILP: InternalLayerParametersNeon, -> { - /// The original, scalar round constants for each internal round. - pub(crate) internal_constants: Vec>, - /// The pre-processed round constants, packed into NEON vectors in negative form (`c - P`). - /// - /// This format is optimized for the vectorized permutation loop. - packed_internal_constants: Vec, - _phantom: PhantomData, -} - -impl> - InternalLayerConstructor> for Poseidon2InternalLayerMonty31 -{ - fn new_from_constants(internal_constants: Vec>) -> Self { - let packed_internal_constants = internal_constants - .iter() - .map(|c| convert_to_vec_neg_form_neon::(c.value as i32)) - .collect(); - Self { - internal_constants, - packed_internal_constants, - _phantom: PhantomData, - } - } -} - -impl InternalLayer, 16, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, - ILP: InternalLayerParametersNeon, -{ - fn permute_state(&self, state: &mut [PackedMontyField31Neon; 16]) { - unsafe { - // Safety: This returns values in canonical form when given values in canonical form. - /* - Fix a vector v and let Diag(v) denote the diagonal matrix with diagonal given by v. - Additionally, let 1 denote the matrix with all elements equal to 1. - The internal layer consists of an sbox operation then a matrix multiplication by 1 + Diag(v). - Explicitly the internal layer consists of the following 2 operations: - - s0 -> (s0 + rc)^d - s -> (1 + Diag(v))s - - Note that this matrix multiplication can be implemented as: - sum = sum_i s_i - s_i -> sum + s_iv_i - - which is essentially how we implement it. - */ - - // Convert the state array into the specialized `InternalLayer16` representation - // for optimized processing. - let mut internal_state = InternalLayer16::from_packed_field_array(*state); - - self.packed_internal_constants.iter().for_each(|&rc| { - // Apply AddRoundConstant and the S-Box to the first state element (`s0`). - add_rc_and_sbox::(&mut internal_state.s0, rc); - - // Compute the sum of all other state elements (`s_hi`). - // - // This can execute in parallel with the S-box operation on `s0`. - let s_hi_transmuted: &[PackedMontyField31Neon; 15] = transmute(&internal_state.s_hi); - let sum_tail = PackedMontyField31Neon::::sum_array::<15>(s_hi_transmuted); - - // Perform the diagonal multiplication on `s_hi`. - // - // This can also execute in parallel with the S-box. - ILP::diagonal_mul(&mut internal_state.s_hi); - - // Compute the total sum of the entire state (`s0` + `sum_tail`) - // after the S-box on `s0` is complete. - let sum = sum_tail + internal_state.s0; - - // Update `s0`. The transformation is `s0_new = sum + v_0*s0`. - // - // Since the diagonal element `v_0` is always -2, this becomes `sum - 2*s0`. - // - // For efficiency, this is calculated as `(sum - s0) - s0`, which is `sum_tail - s0`. - internal_state.s0 = sum_tail - internal_state.s0; - - // Update the rest of the state. For each `s_i` (where `i > 0`), the - // transformation is `s_i_new = (v_i * s_i) + sum`. The `v_i * s_i` part - // was already computed in `diagonal_mul`. - ILP::add_sum( - &mut internal_state.s_hi, - transmute::, uint32x4_t>(sum), - ); - }); - - // Convert the specialized state representation back to a standard array before returning. - *state = InternalLayer16::to_packed_field_array(internal_state); - } - } -} - -impl InternalLayer, 24, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, - ILP: InternalLayerParametersNeon, -{ - fn permute_state(&self, state: &mut [PackedMontyField31Neon; 24]) { - unsafe { - // Safety: This returns values in canonical form when given values in canonical form. - - /* - Fix a vector v and let Diag(v) denote the diagonal matrix with diagonal given by v. - Additionally, let 1 denote the matrix with all elements equal to 1. - The internal layer consists of an sbox operation then a matrix multiplication by 1 + Diag(v). - Explicitly the internal layer consists of the following 2 operations: - - s0 -> (s0 + rc)^d - s -> (1 + Diag(v))s - - Note that this matrix multiplication is implemented as: - sum = sum_i s_i - s_i -> sum + s_iv_i. - */ - - // Convert the state array into the specialized `InternalLayer24` representation - // for optimized processing. - let mut internal_state = InternalLayer24::from_packed_field_array(*state); - - self.packed_internal_constants.iter().for_each(|&rc| { - // Apply AddRoundConstant and the S-Box to the first state element (`s0`). - add_rc_and_sbox::(&mut internal_state.s0, rc); - - // Compute the sum of all other state elements (`s_hi`). - // - // This can execute in parallel with the S-box operation on `s0`. - let s_hi_transmuted: &[PackedMontyField31Neon; 23] = transmute(&internal_state.s_hi); - let sum_tail = PackedMontyField31Neon::::sum_array::<23>(s_hi_transmuted); - - // Perform the diagonal multiplication on `s_hi`. - // - // This can also execute in parallel with the S-box. - ILP::diagonal_mul(&mut internal_state.s_hi); - - // Compute the total sum of the entire state (`s0` + `sum_tail`) - // after the S-box on `s0` is complete. - let sum = sum_tail + internal_state.s0; - - // Update `s0`. The transformation is `s0_new = sum + v_0*s0`. - // - // Since the diagonal element `v_0` is always -2, this becomes `sum - 2*s0`. - // - // For efficiency, this is calculated as `(sum - s0) - s0`, which is `sum_tail - s0`. - internal_state.s0 = sum_tail - internal_state.s0; - - // Update the rest of the state. For each `s_i` (where `i > 0`), the - // transformation is `s_i_new = (v_i * s_i) + sum`. The `v_i * s_i` part - // was already computed in `diagonal_mul`. - ILP::add_sum( - &mut internal_state.s_hi, - transmute::, uint32x4_t>(sum), - ); - }); - - // Convert the specialized state representation back to a standard array before returning. - *state = InternalLayer24::to_packed_field_array(internal_state); - } - } -} - -/// Represents the external layers (initial and terminal) of the Poseidon2 permutation for NEON-accelerated operations. -#[derive(Debug, Clone)] -pub struct Poseidon2ExternalLayerMonty31 { - /// The original, scalar round constants for both initial and terminal external rounds. - pub(crate) external_constants: ExternalLayerConstants, WIDTH>, - /// Pre-processed constants for the initial external rounds, packed into NEON vectors in negative form (`c - P`). - packed_initial_external_constants: Vec<[int32x4_t; WIDTH]>, - /// Pre-processed constants for the terminal external rounds, packed into NEON vectors in negative form (`c - P`). - packed_terminal_external_constants: Vec<[int32x4_t; WIDTH]>, -} - -impl ExternalLayerConstructor, WIDTH> - for Poseidon2ExternalLayerMonty31 -{ - fn new_from_constants(external_constants: ExternalLayerConstants, WIDTH>) -> Self { - let packed_initial_external_constants = external_constants - .get_initial_constants() - .iter() - .map(|arr| arr.map(|c| convert_to_vec_neg_form_neon::(c.value as i32))) - .collect(); - let packed_terminal_external_constants = external_constants - .get_terminal_constants() - .iter() - .map(|arr| arr.map(|c| convert_to_vec_neg_form_neon::(c.value as i32))) - .collect(); - Self { - external_constants, - packed_initial_external_constants, - packed_terminal_external_constants, - } - } -} - -impl ExternalLayer, WIDTH, D> - for Poseidon2ExternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, -{ - /// Perform the initial external layers of the Poseidon2 permutation on the given state. - fn permute_state_initial(&self, state: &mut [PackedMontyField31Neon; WIDTH]) { - external_initial_permute_state( - state, - &self.packed_initial_external_constants, - add_rc_and_sbox::, - &MDSMat4, - ); - } - - /// Perform the terminal external layers of the Poseidon2 permutation on the given state. - fn permute_state_terminal(&self, state: &mut [PackedMontyField31Neon; WIDTH]) { - external_terminal_permute_state( - state, - &self.packed_terminal_external_constants, - add_rc_and_sbox::, - &MDSMat4, - ); - } -} - -/// Converts a scalar constant into a packed NEON vector in "negative form". -/// -/// Instead of storing a constant `c`, we pre-compute `c' = c - P` and store it as a packed vector. -#[inline(always)] -fn convert_to_vec_neg_form_neon(input: i32) -> int32x4_t { - unsafe { - let input_sub_p = input - (MP::PRIME as i32); - - // Broadcast (duplicate) the scalar result into all four lanes of a 128-bit NEON vector. - aarch64::vdupq_n_s32(input_sub_p) - } -} - -/// Performs the fused AddRoundConstant and S-Box operation `x -> (x + c)^D`. -/// -/// # Safety -/// - `val` must contain elements in canonical form `[0, P)`. -/// - `rc` must contain round constants saved in negative form, i.e. as elements in `[-P, 0)`. -fn add_rc_and_sbox(val: &mut PackedMontyField31Neon, rc: int32x4_t) -where - PMP: PackedMontyParameters + FieldParameters, -{ - unsafe { - // Convert the field element vector to its raw signed i32 representation. - let vec_val_s = val.to_signed_vector(); - - // Add the round constant. As it is saved in negative form the result is - // guaranteed to be in the range `[-P, P)`. - let val_plus_rc = aarch64::vaddq_s32(vec_val_s, rc); - - // Apply the power S-box `x -> x^D`. - // - // The `exp_small` function: - // - accepts inputs in `[-P, P]`, - // - returns a canonical result in `[0, P)`. - let output = exp_small::(val_plus_rc); - - *val = PackedMontyField31Neon::::from_vector(output); - } -} - -/// Trait for NEON-specific parameters and operations for the Poseidon2 internal layer. -pub trait InternalLayerParametersNeon: Clone + Sync { - /// The state array type used in this implementation, which holds NEON vectors. - type ArrayLike: AsMut<[uint32x4_t]>; - - // The internal layer linear transformation is `M = I + Diag(V)`, where `I` is the all-ones matrix. - // The operation `x -> M * x` can be split into two parts: - // 1. `diagonal_mul`: A cheap, element-wise multiplication `x_i -> v_i * x_i`. - // 2. `add_sum`: An expensive sum of all elements, added back to each element. - // - // This split is a key performance optimization. The S-box `(s0 + rc)^D` has high latency. - // By splitting the linear layer, we can execute the cheap `diagonal_mul` operation on the rest - // of the state `s_hi` in parallel with the S-box operation on `s0`, effectively hiding its latency. - // Only after both are complete do we compute the sum and perform the final additions. - // - // For these reasons, `diagonal_mul` and `add_sum` are marked `unsafe` as they are only - // guaranteed to be correct when used together in the permutation's internal loop. - - /// Performs the element-wise multiplication part of the internal layer's linear transformation. - /// - /// The diagonal matrix used in Poseidon2 has a common structure for the first 9 elements: - /// `V = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, ...]`. - /// This function is composed of two sub-routines that handle different parts of this multiplication. - /// - /// # Safety - /// This function is only safe to call as part of the internal layer permutation. - /// Its output is not guaranteed to be in canonical form and must be passed directly to `add_sum`. - #[inline(always)] - unsafe fn diagonal_mul(input: &mut Self::ArrayLike) { - // The `unsafe` block is for clarity, as both sub-functions are unsafe. - unsafe { - Self::diagonal_mul_first_eight(input); - Self::diagonal_mul_remainder(input); - } - } - - /// Multiplies the first 8 elements of `input` (from index 1 to 8 of the state) by the diagonal vector. - /// - /// This default implementation handles the common prefix of the diagonal matrix `[1, 2, 1/2, 3, 4, -1/2, -3, -4]`. - /// - /// Note that for negative coefficients (e.g., -1/2), this function computes the positive equivalent (1/2). - /// This irregularity is cheaper to compute and is corrected later in the `add_sum` function, which - /// will perform a subtraction instead of an addition for these elements. - /// - /// # Safety - /// This function's output must be passed directly to `add_sum` for the result to be correct. - #[inline(always)] - unsafe fn diagonal_mul_first_eight(input: &mut Self::ArrayLike) { - let input = input.as_mut(); - - // The first element `input[0]` (state `s_1`) is multiplied by 1, which is a no-op. - - // Multiply `input[1]` (state `s_2`) by 2. - input[1] = uint32x4_mod_add(input[1], input[1], PMP::PACKED_P); - // Multiply `input[2]` (state `s_3`) by 1/2. - input[2] = halve_neon::(input[2]); - - // Multiply `input[3]` (state `s_4`) by 3. - let acc3 = uint32x4_mod_add(input[3], input[3], PMP::PACKED_P); - input[3] = uint32x4_mod_add(acc3, input[3], PMP::PACKED_P); - - // Multiply `input[4]` (state `s_5`) by 4. - let acc4 = uint32x4_mod_add(input[4], input[4], PMP::PACKED_P); - input[4] = uint32x4_mod_add(acc4, acc4, PMP::PACKED_P); - - // For the next 3 elements, we multiply by the positive value (e.g., 1/2 instead of -1/2). - // `add_sum` will correct this by subtracting the result instead of adding. - - // Multiply `input[5]` (state `s_6`) by 1/2. - input[5] = halve_neon::(input[5]); - // Multiply `input[6]` (state `s_7`) by 3. - let acc6 = uint32x4_mod_add(input[6], input[6], PMP::PACKED_P); - input[6] = uint32x4_mod_add(acc6, input[6], PMP::PACKED_P); - // Multiply `input[7]` (state `s_8`) by 4. - let acc7 = uint32x4_mod_add(input[7], input[7], PMP::PACKED_P); - input[7] = uint32x4_mod_add(acc7, acc7, PMP::PACKED_P); - } - - /// Multiplies the remaining elements of the state by the rest of the diagonal matrix. - /// - /// This function is implemented by each concrete field. - /// - /// # Safety - /// This function must not touch the first 8 elements of `input`. - unsafe fn diagonal_mul_remainder(input: &mut Self::ArrayLike); - - /// The number of *positive* inverse powers of two in the diagonal matrix after the first 8 elements. - /// - /// This constant is used by `add_sum` to know how many elements require correction (subtraction). - const NUM_POS: usize; - - /// Adds the state sum to each element, completing the linear layer transformation. - /// - /// Morally, this function computes `x_i -> x_i + sum`. However, it also corrects for the - /// irregularities introduced in `diagonal_mul` for efficiency. Where `diagonal_mul` computed `k*x` - /// instead of `-k*x`, this function computes `sum - (k*x)` to get the correct result. - /// - /// # Safety - /// `sum` must be in canonical form, and `input` must be the immediate output of `diagonal_mul`. - #[inline(always)] - unsafe fn add_sum(input: &mut Self::ArrayLike, sum: uint32x4_t) { - // For the first 5 elements (s_1 to s_5), the diagonal coefficients are positive, so we add the sum. - input.as_mut()[..5] - .iter_mut() - .for_each(|x| *x = uint32x4_mod_add(sum, *x, PMP::PACKED_P)); - - // For the next 3 elements (s_6 to s_8), the diagonal coefficients are negative, so we - // subtract the result from the sum. - input.as_mut()[5..8] - .iter_mut() - .for_each(|x| *x = uint32x4_mod_sub(sum, *x, PMP::PACKED_P)); - - // For the next block of elements, the diagonal coefficients are positive, so we add the sum. - input.as_mut()[8..(8 + Self::NUM_POS)] - .iter_mut() - .for_each(|x| *x = uint32x4_mod_add(sum, *x, PMP::PACKED_P)); - - // For the final block of elements, the diagonal coefficients are negative, so we - // subtract the result from the sum. - input.as_mut()[8 + Self::NUM_POS..] - .iter_mut() - .for_each(|x| *x = uint32x4_mod_sub(sum, *x, PMP::PACKED_P)); - } -} diff --git a/crates/backend/koala-bear/src/monty_31/aarch64_neon/poseidon_helpers.rs b/crates/backend/koala-bear/src/monty_31/aarch64_neon/poseidon_helpers.rs new file mode 100644 index 00000000..1a92e9d9 --- /dev/null +++ b/crates/backend/koala-bear/src/monty_31/aarch64_neon/poseidon_helpers.rs @@ -0,0 +1,58 @@ +// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). + +//! NEON helpers shared by Poseidon1 permutations. + +use core::arch::aarch64::{self, int32x4_t, uint32x4_t}; +use core::mem::transmute; + +use super::exp_small; +use crate::{FieldParameters, MontyParameters, PackedMontyField31Neon, PackedMontyParameters, RelativelyPrimePower}; + +/// A specialized representation of the Poseidon state for a width of 16. +/// +/// Splits the state into `s0` (undergoes S-box) and `s_hi` (undergoes only linear transforms), +/// enabling instruction-level parallelism between the two independent data paths. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct InternalLayer16 { + pub(crate) s0: PackedMontyField31Neon, + pub(crate) s_hi: [uint32x4_t; 15], +} + +impl InternalLayer16 { + #[inline] + pub(crate) unsafe fn to_packed_field_array(self) -> [PackedMontyField31Neon; 16] { + unsafe { transmute(self) } + } + + #[inline] + #[must_use] + pub(crate) fn from_packed_field_array(vector: [PackedMontyField31Neon; 16]) -> Self { + unsafe { transmute(vector) } + } +} + +/// Converts a scalar constant into a packed NEON vector in "negative form" (`c - P`). +#[inline(always)] +pub(crate) fn convert_to_vec_neg_form_neon(input: i32) -> int32x4_t { + unsafe { + let input_sub_p = input - (MP::PRIME as i32); + aarch64::vdupq_n_s32(input_sub_p) + } +} + +/// Performs the fused AddRoundConstant and S-Box operation `x -> (x + c)^D`. +/// +/// `val` must contain elements in canonical form `[0, P)`. +/// `rc` must contain round constants in negative form `[-P, 0)`. +pub(crate) fn add_rc_and_sbox(val: &mut PackedMontyField31Neon, rc: int32x4_t) +where + PMP: PackedMontyParameters + FieldParameters + RelativelyPrimePower, +{ + unsafe { + let vec_val_s = val.to_signed_vector(); + let val_plus_rc = aarch64::vaddq_s32(vec_val_s, rc); + let output = exp_small::(val_plus_rc); + *val = PackedMontyField31Neon::::from_vector(output); + } +} diff --git a/crates/backend/koala-bear/src/monty_31/aarch64_neon/utils.rs b/crates/backend/koala-bear/src/monty_31/aarch64_neon/utils.rs index 7c9b9e64..5a3ceb33 100644 --- a/crates/backend/koala-bear/src/monty_31/aarch64_neon/utils.rs +++ b/crates/backend/koala-bear/src/monty_31/aarch64_neon/utils.rs @@ -1,8 +1,6 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). -use core::arch::aarch64::{ - self, uint32x4_t, vaddq_u32, vandq_u32, vdupq_n_u32, vhaddq_u32, vminq_u32, vmlsq_n_u32, vtstq_u32, -}; +use core::arch::aarch64::{self, uint32x4_t, vaddq_u32, vandq_u32, vdupq_n_u32, vhaddq_u32, vminq_u32, vmlsq_n_u32}; use crate::{PackedMontyParameters, TwoAdicData}; @@ -16,9 +14,18 @@ pub(crate) fn halve_neon(input: uint32x4_t) -> uint3 let one = vdupq_n_u32(1); // Check if the least significant bit is set (i.e., if the number is odd). + // CMTST returns a mask of all 1s if (input AND one) != 0, all 0s otherwise. // - // vtstq_u32 returns a mask of all 1s if the bit is set, and all 0s otherwise. - let is_odd_mask = vtstq_u32(input, one); + // We use inline asm because LLVM decomposes vtstq_u32 into AND+CMEQ#0 + // (2 instructions) instead of emitting the single CMTST instruction. + let is_odd_mask: uint32x4_t; + core::arch::asm!( + "cmtst {0:v}.4s, {1:v}.4s, {2:v}.4s", + out(vreg) is_odd_mask, + in(vreg) input, + in(vreg) one, + options(pure, nomem, nostack, preserves_flags), + ); // Select `P` if the corresponding input is odd, or `0` if it's even. let to_add = vandq_u32(PMP::PACKED_P, is_odd_mask); diff --git a/crates/backend/koala-bear/src/monty_31/mod.rs b/crates/backend/koala-bear/src/monty_31/mod.rs index 9f3f6daf..d7d917f4 100644 --- a/crates/backend/koala-bear/src/monty_31/mod.rs +++ b/crates/backend/koala-bear/src/monty_31/mod.rs @@ -5,7 +5,6 @@ mod data_traits; #[allow(clippy::module_inception)] mod monty_31; -pub(crate) mod poseidon2_monty; pub(crate) mod utils; // Skip mds.rs for now - requires karatsuba_convolution dependency @@ -39,5 +38,4 @@ pub use x86_64_avx512::*; pub use data_traits::*; pub use monty_31::*; -pub use poseidon2_monty::*; pub use utils::{monty_add, monty_sub}; diff --git a/crates/backend/koala-bear/src/monty_31/no_packing/mod.rs b/crates/backend/koala-bear/src/monty_31/no_packing/mod.rs index d6edb829..c7ba9668 100644 --- a/crates/backend/koala-bear/src/monty_31/no_packing/mod.rs +++ b/crates/backend/koala-bear/src/monty_31/no_packing/mod.rs @@ -2,10 +2,6 @@ //! A couple of simple functions needed in the case that this is compiled without architecture optimizations available. -mod poseidon2; - -pub use poseidon2::*; - use crate::{FieldParameters, MontyField31}; /// Multiplication by a base field element in a binomial extension field. diff --git a/crates/backend/koala-bear/src/monty_31/no_packing/poseidon2.rs b/crates/backend/koala-bear/src/monty_31/no_packing/poseidon2.rs deleted file mode 100644 index ad6bedb1..00000000 --- a/crates/backend/koala-bear/src/monty_31/no_packing/poseidon2.rs +++ /dev/null @@ -1,48 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! These are just simple wrapper structs allowing us to implement Poseidon2 Internal/ExternalLayer on top of them. -//! -//! They are used only in the case that none of the vectorization architectures (AVX2/AVX512/NEON) are available. - -use alloc::vec::Vec; -use core::marker::PhantomData; - -use crate::poseidon2::{ExternalLayerConstants, ExternalLayerConstructor, InternalLayerConstructor}; - -use crate::{FieldParameters, InternalLayerBaseParameters, MontyField31, MontyParameters}; - -/// The internal layers of the Poseidon2 permutation for Monty31 fields. -#[derive(Debug, Clone)] -pub struct Poseidon2InternalLayerMonty31< - MP: MontyParameters, - const WIDTH: usize, - ILP: InternalLayerBaseParameters, -> { - pub(crate) internal_constants: Vec>, - _phantom: PhantomData, -} - -/// The external layers of the Poseidon2 permutation for Monty31 fields. -#[derive(Debug, Clone)] -pub struct Poseidon2ExternalLayerMonty31 { - pub(crate) external_constants: ExternalLayerConstants, WIDTH>, -} - -impl> - InternalLayerConstructor> for Poseidon2InternalLayerMonty31 -{ - fn new_from_constants(internal_constants: Vec>) -> Self { - Self { - internal_constants, - _phantom: PhantomData, - } - } -} - -impl ExternalLayerConstructor, WIDTH> - for Poseidon2ExternalLayerMonty31 -{ - fn new_from_constants(external_constants: ExternalLayerConstants, WIDTH>) -> Self { - Self { external_constants } - } -} diff --git a/crates/backend/koala-bear/src/monty_31/poseidon2_monty.rs b/crates/backend/koala-bear/src/monty_31/poseidon2_monty.rs deleted file mode 100644 index 4e7839da..00000000 --- a/crates/backend/koala-bear/src/monty_31/poseidon2_monty.rs +++ /dev/null @@ -1,127 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -use core::marker::PhantomData; - -use crate::poseidon2::{ - ExternalLayer, GenericPoseidon2LinearLayers, InternalLayer, MDSMat4, add_rc_and_sbox_generic, - external_initial_permute_state, external_terminal_permute_state, -}; -use field::{InjectiveMonomial, PrimeCharacteristicRing}; - -use crate::{ - FieldParameters, MontyField31, MontyParameters, Poseidon2ExternalLayerMonty31, Poseidon2InternalLayerMonty31, - RelativelyPrimePower, -}; - -/// Trait which handles the Poseidon2 internal layers. -/// -/// Everything needed to compute multiplication by a `WIDTH x WIDTH` diffusion matrix whose monty form is `1 + Diag(vec)`. -/// vec is assumed to be of the form `[-2, ...]` with all entries after the first being small powers of `2`. -pub trait InternalLayerBaseParameters: Clone + Sync { - /// Perform the internal matrix multiplication: s -> (1 + Diag(V))s. - /// We ignore `state[0]` as it is handled separately. - fn internal_layer_mat_mul(state: &mut [R; WIDTH], sum: R); - - /// Perform the matrix multiplication corresponding to the internal linear - /// layer. - #[inline(always)] - fn generic_internal_linear_layer(state: &mut [R; WIDTH]) { - // We mostly delegate to internal_layer_mat_mul but have to handle state[0] separately. - let part_sum: R = state[1..].iter().copied().sum(); - let full_sum = part_sum + state[0]; - state[0] = part_sum - state[0]; - Self::internal_layer_mat_mul(state, full_sum); - } -} - -#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] -pub trait InternalLayerParameters: - InternalLayerBaseParameters + crate::InternalLayerParametersNeon -{ -} -#[cfg(all(target_arch = "x86_64", target_feature = "avx2", not(target_feature = "avx512f")))] -pub trait InternalLayerParameters: - InternalLayerBaseParameters + crate::InternalLayerParametersAVX2 -{ -} -#[cfg(all(target_arch = "x86_64", target_feature = "avx512f"))] -pub trait InternalLayerParameters: - InternalLayerBaseParameters + crate::InternalLayerParametersAVX512 -{ -} -#[cfg(not(any( - all(target_arch = "aarch64", target_feature = "neon"), - all(target_arch = "x86_64", target_feature = "avx2", not(target_feature = "avx512f")), - all(target_arch = "x86_64", target_feature = "avx512f"), -)))] -pub trait InternalLayerParameters: - InternalLayerBaseParameters -{ -} - -impl InternalLayer, WIDTH, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, - P2P: InternalLayerParameters, -{ - /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [MontyField31; WIDTH]) { - self.internal_constants.iter().for_each(|rc| { - state[0] += *rc; - state[0] = state[0].injective_exp_n(); - let part_sum: MontyField31 = state[1..].iter().copied().sum(); - let full_sum = part_sum + state[0]; - state[0] = part_sum - state[0]; - P2P::internal_layer_mat_mul(state, full_sum); - }) - } -} - -impl ExternalLayer, WIDTH, D> - for Poseidon2ExternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, -{ - /// Perform the initial external layers of the Poseidon2 permutation on the given state. - fn permute_state_initial(&self, state: &mut [MontyField31; WIDTH]) { - external_initial_permute_state( - state, - self.external_constants.get_initial_constants(), - add_rc_and_sbox_generic, - &MDSMat4, - ); - } - - /// Perform the terminal external layers of the Poseidon2 permutation on the given state. - fn permute_state_terminal(&self, state: &mut [MontyField31; WIDTH]) { - external_terminal_permute_state( - state, - self.external_constants.get_terminal_constants(), - add_rc_and_sbox_generic, - &MDSMat4, - ); - } -} - -/// An implementation of the matrix multiplications in the internal and external layers of Poseidon2. -/// -/// This can act on `[A; WIDTH]` for any ring implementing `Algebra>`. -/// This will usually be slower than the Poseidon2 permutation built from `Poseidon2InternalLayerMonty31` and -/// `Poseidon2ExternalLayerMonty31` but it does work in more cases. -#[derive(Clone)] -pub struct GenericPoseidon2LinearLayersMonty31 { - _phantom1: PhantomData, - _phantom2: PhantomData, -} - -impl GenericPoseidon2LinearLayers for GenericPoseidon2LinearLayersMonty31 -where - FP: FieldParameters, - ILBP: InternalLayerBaseParameters, -{ - #[inline(always)] - fn internal_linear_layer(state: &mut [R; WIDTH]) { - ILBP::generic_internal_linear_layer(state); - } -} diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/mod.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/mod.rs index 23251862..993e232b 100644 --- a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/mod.rs +++ b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/mod.rs @@ -1,9 +1,9 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). mod packing; -mod poseidon2; +pub(crate) mod poseidon_helpers; mod utils; pub use packing::*; -pub use poseidon2::*; +pub(crate) use poseidon_helpers::*; pub use utils::*; diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/packing.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/packing.rs index f86cdfb3..7eff533e 100644 --- a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/packing.rs +++ b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/packing.rs @@ -70,7 +70,7 @@ impl PackedMontyField31AVX2 { /// Copy `value` to all positions in a packed vector. This is the same as /// `From>::from`, but `const`. #[inline] - const fn broadcast(value: MontyField31) -> Self { + pub(crate) const fn broadcast(value: MontyField31) -> Self { Self([value; WIDTH]) } } diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/poseidon2.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/poseidon2.rs deleted file mode 100644 index 30f4b650..00000000 --- a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/poseidon2.rs +++ /dev/null @@ -1,463 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! Vectorized AVX2 implementation of Poseidon2 for MontyField31 - -use alloc::vec::Vec; -use core::arch::x86_64::{self, __m256i}; -use core::marker::PhantomData; -use core::mem::transmute; - -use crate::poseidon2::{ - ExternalLayer, ExternalLayerConstants, ExternalLayerConstructor, InternalLayer, InternalLayerConstructor, MDSMat4, - external_initial_permute_state, external_terminal_permute_state, -}; -use field::{PrimeCharacteristicRing, mm256_mod_add, mm256_mod_sub}; - -use crate::{ - FieldParameters, InternalLayerBaseParameters, MontyField31, MontyParameters, PackedMontyField31AVX2, - PackedMontyParameters, RelativelyPrimePower, apply_func_to_even_odd, halve_avx2, packed_exp_3, packed_exp_5, - packed_exp_7, signed_add_avx2, -}; - -// In the internal layers, it is valuable to treat the first entry of the state differently -// as it is the only entry to which we apply s-box. -// It seems to help the compiler if we introduce a different data structure for these layers. -// Note that we use this structure instead of a tuple so we can force the memory layout to align for transmutes. -#[derive(Clone, Copy)] -#[repr(C)] // This is needed to make `transmute`s safe. -pub struct InternalLayer16 { - s0: PackedMontyField31AVX2, - s_hi: [__m256i; 15], -} - -impl InternalLayer16 { - #[inline] - /// Convert from `InternalLayer16` to `[PackedMontyField31AVX2; 16]` - /// - /// SAFETY: The caller must ensure that each element of `s_hi` represents a valid `MontyField31`. - /// In particular, each element of each vector must be in `[0, P)` (canonical form). - unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX2; 16] { - unsafe { - // Safety: It is up to the user to ensure that elements of `s_hi` represent valid - // `MontyField31` values. We must only reason about memory representations. - // As described in packing.rs, PackedMontyField31AVX2 can be transmuted to and from `__m256i`. - - // `InternalLayer16` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX2, __m256i, ..., __m256i]` - // Thus as `__m256i` can be can be transmuted to `PackedMontyField31AVX2`, - // `InternalLayer16` can be transmuted to `[PackedMontyField31AVX2; 16]`. - transmute(self) - } - } - - #[inline] - #[must_use] - /// Convert from `[PackedMontyField31AVX2; 16]` to `InternalLayer16` - fn from_packed_field_array(vector: [PackedMontyField31AVX2; 16]) -> Self { - unsafe { - // Safety: As described in packing.rs, PackedMontyField31AVX2 can be transmuted to and from `__m256i`. - - // `InternalLayer16` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX2, __m256i, ..., __m256i]` - // Thus as `PackedMontyField31AVX2` can be can be transmuted to `__m256i`, - // `[PackedMontyField31AVX2; 16]` can be transmuted to `InternalLayer16`. - transmute(vector) - } - } -} - -#[derive(Clone, Copy)] -#[repr(C)] // This is needed to make `transmute`s safe. -pub struct InternalLayer24 { - s0: PackedMontyField31AVX2, - s_hi: [__m256i; 23], -} - -impl InternalLayer24 { - #[inline] - /// Convert from `InternalLayer24` to `[PackedMontyField31AVX2; 24]` - /// - /// SAFETY: The caller must ensure that each element of `s_hi` represents a valid `MontyField31`. - /// In particular, each element of each vector must be in `[0, P)` (canonical form). - unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX2; 24] { - unsafe { - // Safety: As described in packing.rs, PackedMontyField31AVX2 can be transmuted to and from `__m256i`. - - // `InternalLayer24` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX2, __m256i, ..., __m256i]` - // Thus as `__m256i` can be can be transmuted to `PackedMontyField31AVX2`, - // `InternalLayer24` can be transmuted to `[PackedMontyField31AVX2; 24]`. - transmute(self) - } - } - - #[inline] - #[must_use] - /// Convert from `[PackedMontyField31AVX2; 24]` to `InternalLayer24` - fn from_packed_field_array(vector: [PackedMontyField31AVX2; 24]) -> Self { - unsafe { - // Safety: As described in packing.rs, PackedMontyField31AVX2 can be transmuted to and from `__m256i`. - - // `InternalLayer24` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX2, __m256i, ..., __m256i]` - // Thus as `PackedMontyField31AVX2` can be can be transmuted to `__m256i`, - // `[PackedMontyField31AVX2; 24]` can be transmuted to `InternalLayer24`. - transmute(vector) - } - } -} - -/// The internal layers of the Poseidon2 permutation for Monty31 fields. -/// -/// The packed constants are stored in negative form as this allows some optimizations. -/// This means given a constant `x`, we treat it as an `i32` and -/// pack 8 copies of `x - P` into the corresponding `__m256i` packed constant. -#[derive(Debug, Clone)] -pub struct Poseidon2InternalLayerMonty31< - PMP: PackedMontyParameters, - const WIDTH: usize, - ILP: InternalLayerParametersAVX2, -> { - pub(crate) internal_constants: Vec>, - packed_internal_constants: Vec<__m256i>, - _phantom: PhantomData, -} - -impl> - InternalLayerConstructor> for Poseidon2InternalLayerMonty31 -{ - /// Construct an instance of Poseidon2InternalLayerMersenne31AVX2 from a vector containing - /// the constants for each round. Internally, the constants are transformed into the - /// {-P, ..., 0} representation instead of the standard {0, ..., P} one. - fn new_from_constants(internal_constants: Vec>) -> Self { - let packed_internal_constants = internal_constants - .iter() - .map(|constant| convert_to_vec_neg_form::(constant.value as i32)) - .collect(); - Self { - internal_constants, - packed_internal_constants, - _phantom: PhantomData, - } - } -} - -/// The external layers of the Poseidon2 permutation for Monty31 fields. -/// -/// The packed constants are stored in negative form as this allows some optimizations. -/// This means given a constant `x`, we treat it as an `i32` and -/// pack 8 copies of `x - P` into the corresponding `__m256i` packed constant. -#[derive(Debug, Clone)] -pub struct Poseidon2ExternalLayerMonty31 { - pub(crate) external_constants: ExternalLayerConstants, WIDTH>, - packed_initial_external_constants: Vec<[__m256i; WIDTH]>, - packed_terminal_external_constants: Vec<[__m256i; WIDTH]>, -} - -impl ExternalLayerConstructor, WIDTH> - for Poseidon2ExternalLayerMonty31 -{ - /// Construct an instance of Poseidon2ExternalLayerMersenne31AVX2 from an array of - /// vectors containing the constants for each round. Internally, the constants - /// are transformed into the {-P, ..., 0} representation instead of the standard {0, ..., P} one. - fn new_from_constants(external_constants: ExternalLayerConstants, WIDTH>) -> Self { - let packed_initial_external_constants = external_constants - .get_initial_constants() - .iter() - .map(|array| array.map(|constant| convert_to_vec_neg_form::(constant.value as i32))) - .collect(); - let packed_terminal_external_constants = external_constants - .get_terminal_constants() - .iter() - .map(|array| array.map(|constant| convert_to_vec_neg_form::(constant.value as i32))) - .collect(); - Self { - external_constants, - packed_initial_external_constants, - packed_terminal_external_constants, - } - } -} - -/// Use hard coded methods to compute `x -> x^D` for the even index entries and small `D`. -/// Inputs should be signed 32-bit integers in `[-P, ..., P]`. -/// Outputs will also be signed integers in `(-P, ..., P)` stored in the odd indices. -/// -/// # Panics -/// This function will panic if `D` is not `3, 5` or `7`. -#[inline(always)] -#[must_use] -fn exp_small(val: __m256i) -> __m256i { - match D { - 3 => packed_exp_3::(val), - 5 => packed_exp_5::(val), - 7 => packed_exp_7::(val), - _ => panic!("No exp function for given D"), - } -} - -/// Compute val -> (val + rc)^D. Each entry of val should be represented in canonical form. -/// Each entry of rc should be represented by an element in [-P, 0]. -/// Each entry of the output will be represented by an element in canonical form. -/// If the inputs do not conform to this representation, the result is undefined. -#[inline(always)] -fn add_rc_and_sbox(val: &mut PackedMontyField31AVX2, rc: __m256i) { - unsafe { - // As our exponential functions simply assume that - // the input lies in [-P, P] we do not need to perform a reduction provided - // rc is represented by an element in [-P, 0] - let vec_val = val.to_vector(); - let val_plus_rc = x86_64::_mm256_add_epi32(vec_val, rc); - let output = apply_func_to_even_odd::(val_plus_rc, exp_small::); - - *val = PackedMontyField31AVX2::::from_vector(output) - } -} - -/// A trait containing the specific information needed to -/// implement the Poseidon2 Permutation for Monty31 Fields. -pub trait InternalLayerParametersAVX2: Clone + Sync { - type ArrayLike: AsMut<[__m256i]>; - - // diagonal_mul and add_sum morally should be one function but are split because diagonal_mul can happen simultaneously to - // the sbox being applied to the first element of the state which is advantageous as this s-box has very high latency. - // However these functions should only ever be used together and we only make safety guarantees about the output - // of the combined function add_sum(diagonal_mul(state), sum) which will output field elements - // in canonical form provided inputs are in canonical form. - - // For these reason we mark both functions as unsafe. - - // All 4 implementation of this trait (Field = BabyBear/KoalaBear, WIDTH = 16/24) have a similarly structured - // diagonal matrix. The first 9 elements of this matrix are always: [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4] and the remainder - // are all positive or negative inverse powers of two. This common structure lets us write some default implementations. - - /// # Safety - /// - /// This function assumes its output is piped directly into `add_sum`. - /// - /// It might not output field elements in canonical form and indeed may even - /// output incorrect values in places where it is efficient to correct for - /// the computation in `add_sum`. For example it might output `3*x` instead of `-3*x` - /// and have `add_sum` compute `sum - x` instead of `x + sum`. - #[inline(always)] - unsafe fn diagonal_mul(input: &mut Self::ArrayLike) { - unsafe { - Self::diagonal_mul_first_eight(input); // This only affects the first 8 elements. - - Self::diagonal_mul_remainder(input); // This leaves the first 8 elements unchanged. - } - } - - /// # Safety - /// - /// Multiply the first 8 elements of input by the vector `[1, 2, 1/2, 3, 4, 1/2, 3, 4]`. - /// - /// In all implementations of this trait, the first 9 elements of the diagonal matrix are - /// `[-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4]`. The -2 is handled separately and this function handles - /// the remainder. Note that for the last three elements we multiply by `1/2, 3, 4` and not - /// `-1/2, -3, -4`. Hence the value in this location will be the negative of what is desired. - /// This will be handled by `add_sum` and so it is important these elements are not touched - /// before input is passed into `add_sum`. - #[inline(always)] - unsafe fn diagonal_mul_first_eight(input: &mut Self::ArrayLike) { - let input = input.as_mut(); - // The first 5 elements should be multiplied by: 1, 2, 1/2, 3, 4 - - // input[0] is being multiplied by 1 so we ignore it. - - input[1] = mm256_mod_add(input[1], input[1], PMP::PACKED_P); - input[2] = halve_avx2::(input[2]); - - let acc3 = mm256_mod_add(input[3], input[3], PMP::PACKED_P); - input[3] = mm256_mod_add(acc3, input[3], PMP::PACKED_P); - - let acc4 = mm256_mod_add(input[4], input[4], PMP::PACKED_P); - input[4] = mm256_mod_add(acc4, acc4, PMP::PACKED_P); - - // For the final 3 elements we multiply by 1/2, 3, 4. - // This gives the negative of the correct answer which - // will be handled by add_sum(). - - input[5] = halve_avx2::(input[5]); - - let acc6 = mm256_mod_add(input[6], input[6], PMP::PACKED_P); - input[6] = mm256_mod_add(acc6, input[6], PMP::PACKED_P); - - let acc7 = mm256_mod_add(input[7], input[7], PMP::PACKED_P); - input[7] = mm256_mod_add(acc7, acc7, PMP::PACKED_P); - } - - /// # Safety - /// - /// This function must not touch the first 8 elements of input. - /// It may output values which might not be in canonical form or - /// will be the negative of the expected value. This will be - /// handled by `add_sum` so it is important these elements are - /// not touched before input is passed into `add_sum`. - unsafe fn diagonal_mul_remainder(input: &mut Self::ArrayLike); - - /// # Safety - /// - /// Sum must be in canonical form and input must be exactly the output of `diagonal_mul`. - /// If either of these does not hold, the result is undefined. - /// - /// Morally this function is computing `x -> x + sum` however there are some places where - /// the output of `diagonal_mul` is the negative of the expected value or not canonical. - /// It is the job of add_sum to correct for these irregularities. Where the output is negative - /// we compute `x -> sum - x` instead and when not in canonical form we use `signed_add_avx2` - /// where acts as add where one input is allowed to lie in `(-P, P)`. - #[inline(always)] - unsafe fn add_sum(input: &mut Self::ArrayLike, sum: __m256i) { - unsafe { - // Diagonal mul multiplied these by 1, 2, 1/2, 3, 4 so we simply need to add the sum. - input.as_mut()[..5] - .iter_mut() - .for_each(|x| *x = mm256_mod_add(sum, *x, PMP::PACKED_P)); - - // Diagonal mul multiplied these by 1/2, 3, 4 instead of -1/2, -3, -4 so we need to subtract instead of adding. - input.as_mut()[5..8] - .iter_mut() - .for_each(|x| *x = mm256_mod_sub(sum, *x, PMP::PACKED_P)); - - // Diagonal mul output a signed value in (-P, P) so we need to do a signed add. - // Note that signed add's parameters are not interchangeable. The first parameter must be positive. - input.as_mut()[8..] - .iter_mut() - .for_each(|x| *x = signed_add_avx2::(sum, *x)); - } - } -} - -/// Convert elements from canonical form [0, P) to a negative form in [-P, ..., 0) and copy into a vector. -#[inline(always)] -fn convert_to_vec_neg_form(input: i32) -> __m256i { - let input_sub_p = input - (MP::PRIME as i32); - unsafe { - // Safety: If this code got compiled then AVX2 intrinsics are available. - x86_64::_mm256_set1_epi32(input_sub_p) - } -} - -impl InternalLayer, 16, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters, - ILP: InternalLayerParametersAVX2 + InternalLayerBaseParameters, -{ - /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [PackedMontyField31AVX2; 16]) { - unsafe { - // Safety: This return values in canonical form when given values in canonical form. - - /* - Fix a vector v and let Diag(v) denote the diagonal matrix with diagonal given by v. - Additionally, let 1 denote the matrix with all elements equal to 1. - The internal layer consists of an sbox operation then a matrix multiplication by 1 + Diag(v). - Explicitly the internal layer consists of the following 2 operations: - - s0 -> (s0 + rc)^d - s -> (1 + Diag(v))s - - Note that this matrix multiplication is implemented as: - sum = sum_i s_i - s_i -> sum + s_iv_i. - */ - - let mut internal_state = InternalLayer16::from_packed_field_array(*state); - - self.packed_internal_constants.iter().for_each(|&rc| { - add_rc_and_sbox::(&mut internal_state.s0, rc); // s0 -> (s0 + rc)^D - let sum_tail = PackedMontyField31AVX2::::sum_array::<15>(&transmute::< - [__m256i; 15], - [PackedMontyField31AVX2; 15], - >(internal_state.s_hi)); // Get the sum of all elements other than s0. - ILP::diagonal_mul(&mut internal_state.s_hi); // si -> vi * si for all i > 0. - let sum = sum_tail + internal_state.s0; // Get the full sum. - internal_state.s0 = sum_tail - internal_state.s0; // s0 -> sum - 2*s0 = sum_tail - s0. - ILP::add_sum( - &mut internal_state.s_hi, - transmute::, __m256i>(sum), - ); // si -> si + sum for all i > 0. - }); - - // This transformation is safe as the above function returns elements - // in canonical form when given elements in canonical form. - *state = InternalLayer16::to_packed_field_array(internal_state); - } - } -} - -impl InternalLayer, 24, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, - ILP: InternalLayerParametersAVX2 + InternalLayerBaseParameters, -{ - /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [PackedMontyField31AVX2; 24]) { - unsafe { - // Safety: This return values in canonical form when given values in canonical form. - - /* - Fix a vector v and let Diag(v) denote the diagonal matrix with diagonal given by v. - Additionally, let 1 denote the matrix with all elements equal to 1. - The internal layer consists of an sbox operation then a matrix multiplication by 1 + Diag(v). - Explicitly the internal layer consists of the following 2 operations: - - s0 -> (s0 + rc)^d - s -> (1 + Diag(v))s - - Note that this matrix multiplication is implemented as: - sum = sum_i s_i - s_i -> sum + s_iv_i. - */ - - let mut internal_state = InternalLayer24::from_packed_field_array(*state); - - self.packed_internal_constants.iter().for_each(|&rc| { - add_rc_and_sbox::(&mut internal_state.s0, rc); // s0 -> (s0 + rc)^D - let sum_tail = PackedMontyField31AVX2::::sum_array::<23>(&transmute::< - [__m256i; 23], - [PackedMontyField31AVX2; 23], - >(internal_state.s_hi)); // Get the sum of all elements other than s0. - ILP::diagonal_mul(&mut internal_state.s_hi); // si -> vi * si for all i > 0. - let sum = sum_tail + internal_state.s0; // Get the full sum. - internal_state.s0 = sum_tail - internal_state.s0; // s0 -> sum - 2*s0 = sum_tail - s0. - ILP::add_sum( - &mut internal_state.s_hi, - transmute::, __m256i>(sum), - ); // si -> si + sum for all i > 0. - }); - - // This transformation is safe as the above function returns elements - // in canonical form when given elements in canonical form. - *state = InternalLayer24::to_packed_field_array(internal_state); - } - } -} - -impl ExternalLayer, WIDTH, D> - for Poseidon2ExternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, -{ - /// Perform the initial external layers of the Poseidon2 permutation on the given state. - fn permute_state_initial(&self, state: &mut [PackedMontyField31AVX2; WIDTH]) { - external_initial_permute_state( - state, - &self.packed_initial_external_constants, - add_rc_and_sbox::, - &MDSMat4, - ); - } - - /// Perform the terminal external layers of the Poseidon2 permutation on the given state. - fn permute_state_terminal(&self, state: &mut [PackedMontyField31AVX2; WIDTH]) { - external_terminal_permute_state( - state, - &self.packed_terminal_external_constants, - add_rc_and_sbox::, - &MDSMat4, - ); - } -} diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx2/poseidon_helpers.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/poseidon_helpers.rs new file mode 100644 index 00000000..526a4793 --- /dev/null +++ b/crates/backend/koala-bear/src/monty_31/x86_64_avx2/poseidon_helpers.rs @@ -0,0 +1,96 @@ +// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). + +//! AVX2 helpers shared by Poseidon1 permutations. + +use core::arch::x86_64::{self, __m256i}; +use core::mem::transmute; + +use crate::{ + MontyParameters, PackedMontyField31AVX2, PackedMontyParameters, apply_func_to_even_odd, packed_exp_3, packed_exp_5, + packed_exp_7, +}; + +/// A specialized representation of the Poseidon state for a width of 16. +/// +/// Splits the state into `s0` (undergoes S-box) and `s_hi` (undergoes only linear transforms), +/// enabling instruction-level parallelism between the two independent data paths. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct InternalLayer16 { + pub(crate) s0: PackedMontyField31AVX2, + pub(crate) s_hi: [__m256i; 15], +} + +impl InternalLayer16 { + #[inline] + pub(crate) unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX2; 16] { + unsafe { transmute(self) } + } + + #[inline] + #[must_use] + pub(crate) fn from_packed_field_array(vector: [PackedMontyField31AVX2; 16]) -> Self { + unsafe { transmute(vector) } + } +} + +/// A specialized representation of the Poseidon state for a width of 24. +/// +/// Same split as `InternalLayer16` but for width 24. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct InternalLayer24 { + pub(crate) s0: PackedMontyField31AVX2, + pub(crate) s_hi: [__m256i; 23], +} + +impl InternalLayer24 { + #[inline] + pub(crate) unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX2; 24] { + unsafe { transmute(self) } + } + + #[inline] + #[must_use] + pub(crate) fn from_packed_field_array(vector: [PackedMontyField31AVX2; 24]) -> Self { + unsafe { transmute(vector) } + } +} + +/// Use hard coded methods to compute `x -> x^D` for the even index entries and small `D`. +/// Inputs should be signed 32-bit integers in `[-P, ..., P]`. +/// Outputs will also be signed integers in `(-P, ..., P)` stored in the odd indices. +#[inline(always)] +#[must_use] +pub(crate) fn exp_small(val: __m256i) -> __m256i { + match D { + 3 => packed_exp_3::(val), + 5 => packed_exp_5::(val), + 7 => packed_exp_7::(val), + _ => panic!("No exp function for given D"), + } +} + +/// Converts a scalar constant into a packed AVX2 vector in "negative form" (`c - P`). +#[inline(always)] +pub(crate) fn convert_to_vec_neg_form(input: i32) -> __m256i { + let input_sub_p = input - (MP::PRIME as i32); + unsafe { x86_64::_mm256_set1_epi32(input_sub_p) } +} + +/// Performs the fused AddRoundConstant and S-Box operation `x -> (x + c)^D`. +/// +/// `val` must contain elements in canonical form `[0, P)`. +/// `rc` must contain round constants in negative form `[-P, 0)`. +#[inline(always)] +pub(crate) fn add_rc_and_sbox( + val: &mut PackedMontyField31AVX2, + rc: __m256i, +) { + unsafe { + let vec_val = val.to_vector(); + let val_plus_rc = x86_64::_mm256_add_epi32(vec_val, rc); + let output = apply_func_to_even_odd::(val_plus_rc, exp_small::); + *val = PackedMontyField31AVX2::::from_vector(output); + } +} diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/mod.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/mod.rs index 23251862..993e232b 100644 --- a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/mod.rs +++ b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/mod.rs @@ -1,9 +1,9 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). mod packing; -mod poseidon2; +pub(crate) mod poseidon_helpers; mod utils; pub use packing::*; -pub use poseidon2::*; +pub(crate) use poseidon_helpers::*; pub use utils::*; diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/packing.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/packing.rs index 5fe33629..76683350 100644 --- a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/packing.rs +++ b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/packing.rs @@ -79,7 +79,7 @@ impl PackedMontyField31AVX512 { /// Copy `value` to all positions in a packed vector. This is the same as /// `From::from`, but `const`. #[inline] - const fn broadcast(value: MontyField31) -> Self { + pub(crate) const fn broadcast(value: MontyField31) -> Self { Self([value; WIDTH]) } diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/poseidon2.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/poseidon2.rs deleted file mode 100644 index 2778d9cf..00000000 --- a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/poseidon2.rs +++ /dev/null @@ -1,470 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! Vectorized AVX512 implementation of Poseidon2 for MontyField31 - -use alloc::vec::Vec; -use core::arch::x86_64::{self, __m512i}; -use core::marker::PhantomData; -use core::mem::transmute; - -use crate::poseidon2::{ - ExternalLayer, ExternalLayerConstants, ExternalLayerConstructor, InternalLayer, InternalLayerConstructor, MDSMat4, - external_initial_permute_state, external_terminal_permute_state, -}; -use field::{PrimeCharacteristicRing, mm512_mod_add, mm512_mod_sub}; - -use super::halve_avx512; -use crate::{ - FieldParameters, MontyField31, MontyParameters, PackedMontyField31AVX512, PackedMontyParameters, - RelativelyPrimePower, apply_func_to_even_odd, packed_exp_3, packed_exp_5, packed_exp_7, -}; - -// In the internal layers, it is valuable to treat the first entry of the state differently -// as it is the only entry to which we apply s-box. -// It seems to help the compiler if we introduce a different data structure for these layers. -// Note that we use this structure instead of a tuple so we can force the memory layout to align for transmutes. -#[derive(Clone, Copy)] -#[repr(C)] // This is needed to make `transmute`s safe. -pub struct InternalLayer16 { - s0: PackedMontyField31AVX512, - s_hi: [__m512i; 15], -} - -impl InternalLayer16 { - #[inline] - /// Convert from `InternalLayer16` to `[PackedMontyField31AVX512; 16]` - /// - /// SAFETY: The caller must ensure that each element of `s_hi` represents a valid `MontyField31`. - /// In particular, each element of each vector must be in `[0, P)` (canonical form). - unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX512; 16] { - unsafe { - // Safety: It is up to the user to ensure that elements of `s_hi` represent valid - // `MontyField31` values. We must only reason about memory representations. - // As described in packing.rs, PackedMontyField31AVX512 can be transmuted to and from `__m512i`. - - // `InternalLayer16` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX512, __m512i, ..., __m512i]` - // Thus as `__m512i` can be can be transmuted to `PackedMontyField31AVX512`, - // `InternalLayer16` can be transmuted to `[PackedMontyField31AVX512; 16]`. - transmute(self) - } - } - - #[inline] - #[must_use] - /// Convert from `[PackedMontyField31AVX512; 16]` to `InternalLayer16` - fn from_packed_field_array(vector: [PackedMontyField31AVX512; 16]) -> Self { - unsafe { - // Safety: As described in packing.rs, PackedMontyField31AVX512 can be transmuted to and from `__m512i`. - - // `InternalLayer16` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX512, __m512i, ..., __m512i]` - // Thus as `PackedMontyField31AVX512` can be can be transmuted to `__m512i`, - // `[PackedMontyField31AVX512; 16]` can be transmuted to `InternalLayer16`. - transmute(vector) - } - } -} - -#[derive(Clone, Copy)] -#[repr(C)] // This is needed to make `transmute`s safe. -pub struct InternalLayer24 { - s0: PackedMontyField31AVX512, - s_hi: [__m512i; 23], -} - -impl InternalLayer24 { - #[inline] - /// Convert from `InternalLayer24` to `[PackedMontyField31AVX512; 24]` - /// - /// SAFETY: The caller must ensure that each element of `s_hi` represents a valid `MontyField31`. - /// In particular, each element of each vector must be in `[0, P)` (canonical form). - unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX512; 24] { - unsafe { - // Safety: As described in packing.rs, PackedMontyField31AVX512 can be transmuted to and from `__m512i`. - - // `InternalLayer24` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX512, __m512i, ..., __m512i]` - // Thus as `__m512i` can be can be transmuted to `PackedMontyField31AVX512`, - // `InternalLayer24` can be transmuted to `[PackedMontyField31AVX512; 24]`. - transmute(self) - } - } - - #[inline] - #[must_use] - /// Convert from `[PackedMontyField31AVX512; 24]` to `InternalLayer24` - fn from_packed_field_array(vector: [PackedMontyField31AVX512; 24]) -> Self { - unsafe { - // Safety: As described in packing.rs, PackedMontyField31AVX512 can be transmuted to and from `__m512i`. - - // `InternalLayer24` is `repr(C)` so its memory layout looks like: - // `[PackedMontyField31AVX512, __m512i, ..., __m512i]` - // Thus as `PackedMontyField31AVX512` can be can be transmuted to `__m512i`, - // `[PackedMontyField31AVX512; 24]` can be transmuted to `InternalLayer24`. - transmute(vector) - } - } -} - -/// The internal layers of the Poseidon2 permutation for Monty31 fields. -/// -/// The packed constants are stored in negative form as this allows some optimizations. -/// This means given a constant `x`, we treat it as an `i32` and -/// pack 16 copies of `x - P` into the corresponding `__m512i` packed constant. -#[derive(Debug, Clone)] -pub struct Poseidon2InternalLayerMonty31< - PMP: PackedMontyParameters, - const WIDTH: usize, - ILP: InternalLayerParametersAVX512, -> { - pub(crate) internal_constants: Vec>, - packed_internal_constants: Vec<__m512i>, - _phantom: PhantomData, -} - -impl> - InternalLayerConstructor> for Poseidon2InternalLayerMonty31 -{ - /// Construct an instance of Poseidon2InternalLayerMersenne31AVX2 from a vector containing - /// the constants for each round. Internally, the constants are transformed into the - /// {-P, ..., 0} representation instead of the standard {0, ..., P} one. - fn new_from_constants(internal_constants: Vec>) -> Self { - let packed_internal_constants = internal_constants - .iter() - .map(|constant| convert_to_vec_neg_form::(constant.value as i32)) - .collect(); - Self { - internal_constants, - packed_internal_constants, - _phantom: PhantomData, - } - } -} - -/// The external layers of the Poseidon2 permutation for Monty31 fields. -/// -/// The packed constants are stored in negative form as this allows some optimizations. -/// This means given a constant `x`, we treat it as an `i32` and -/// pack 16 copies of `x - P` into the corresponding `__m512i` packed constant. -#[derive(Debug, Clone)] -pub struct Poseidon2ExternalLayerMonty31 { - pub(crate) external_constants: ExternalLayerConstants, WIDTH>, - packed_initial_external_constants: Vec<[__m512i; WIDTH]>, - packed_terminal_external_constants: Vec<[__m512i; WIDTH]>, -} - -impl ExternalLayerConstructor, WIDTH> - for Poseidon2ExternalLayerMonty31 -{ - /// Construct an instance of Poseidon2ExternalLayerMersenne31AVX2 from an array of - /// vectors containing the constants for each round. Internally, the constants - /// are transformed into the {-P, ..., 0} representation instead of the standard {0, ..., P} one. - fn new_from_constants(external_constants: ExternalLayerConstants, WIDTH>) -> Self { - let packed_initial_external_constants = external_constants - .get_initial_constants() - .iter() - .map(|array| array.map(|constant| convert_to_vec_neg_form::(constant.value as i32))) - .collect(); - let packed_terminal_external_constants = external_constants - .get_terminal_constants() - .iter() - .map(|array| array.map(|constant| convert_to_vec_neg_form::(constant.value as i32))) - .collect(); - Self { - external_constants, - packed_initial_external_constants, - packed_terminal_external_constants, - } - } -} - -/// Use hard coded methods to compute `x -> x^D` for the even index entries and small `D`. -/// Inputs should be signed 32-bit integers in `[-P, ..., P]`. -/// Outputs will also be signed integers in `(-P, ..., P)` stored in the odd indices. -/// -/// # Panics -/// This function will panic if `D` is not `3, 5` or `7`. -#[inline(always)] -#[must_use] -fn exp_small(val: __m512i) -> __m512i { - match D { - 3 => packed_exp_3::(val), - 5 => packed_exp_5::(val), - 7 => packed_exp_7::(val), - _ => panic!("No exp function for given D"), - } -} - -/// Compute val -> (val + rc)^D. Each entry of val should be represented in canonical form. -/// Each entry of rc should be represented by an element in [-P, 0]. -/// Each entry of the output will be represented by an element in canonical form. -/// If the inputs do not conform to this representation, the result is undefined. -#[inline(always)] -fn add_rc_and_sbox(val: &mut PackedMontyField31AVX512, rc: __m512i) { - unsafe { - // As our exponential functions simply assume that - // the input lies in [-P, P] we do not need to perform a reduction provided - // rc is represented by an element in [-P, 0] - let vec_val = val.to_vector(); - let val_plus_rc = x86_64::_mm512_add_epi32(vec_val, rc); - let output = apply_func_to_even_odd::(val_plus_rc, exp_small::); - - *val = PackedMontyField31AVX512::::from_vector(output); - } -} - -/// A trait containing the specific information needed to -/// implement the Poseidon2 Permutation for Monty31 Fields. -pub trait InternalLayerParametersAVX512: Clone + Sync { - type ArrayLike: AsMut<[__m512i]>; - - // diagonal_mul and add_sum morally should be one function but are split because diagonal_mul can happen simultaneously to - // the sbox being applied to the first element of the state which is advantageous as this s-box has very high latency. - // However these functions should only ever be used together and we only make safety guarantees about the output - // of the combined function add_sum(diagonal_mul(state), sum) which will output field elements - // in canonical form provided inputs are in canonical form. - - // For these reason we mark both functions as unsafe. - - // All 4 implementation of this trait (Field = BabyBear/KoalaBear, WIDTH = 16/24) have a similarly structured - // diagonal matrix. The first 9 elements of this matrix are: [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4] and the remainder - // are all positive or negative inverse powers of two. This common structure lets us write some default implementations. - - /// # Safety - /// - /// This function assumes its output is piped directly into `add_sum`. - /// - /// It might not output field elements in canonical form and indeed may even - /// output incorrect values in places where it is efficient to correct for - /// the computation in `add_sum`. For example it might output `3*x` instead of `-3*x` - /// and have `add_sum` compute `sum - x` instead of `x + sum`. - #[inline(always)] - unsafe fn diagonal_mul(input: &mut Self::ArrayLike) { - unsafe { - Self::diagonal_mul_first_eight(input); - Self::diagonal_mul_remainder(input); - } - } - - /// # Safety - /// - /// Multiply the first 8 elements of input by the vector `[1, 2, 1/2, 3, 4, 1/2, 3, 4]`. - /// - /// In all implementations of this trait, the first 9 elements of the diagonal matrix are - /// `[-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4]`. The -2 is handled separately and this function handles - /// the remainder. Note that for the last three elements we multiply by `1/2, 3, 4` and not - /// `-1/2, -3, -4`. Hence the value in this location will be the negative of what is desired. - /// This will be handled by `add_sum` and so it is important these elements are not touched - /// before input is passed into `add_sum`. - #[inline(always)] - unsafe fn diagonal_mul_first_eight(input: &mut Self::ArrayLike) { - let input = input.as_mut(); - // The first 5 elements should be multiplied by: 1, 2, 1/2, 3, 4 - - // input[0] is being multiplied by 1 so we ignore it. - - input[1] = mm512_mod_add(input[1], input[1], PMP::PACKED_P); - input[2] = halve_avx512::(input[2]); - - let acc3 = mm512_mod_add(input[3], input[3], PMP::PACKED_P); - input[3] = mm512_mod_add(acc3, input[3], PMP::PACKED_P); - - let acc4 = mm512_mod_add(input[4], input[4], PMP::PACKED_P); - input[4] = mm512_mod_add(acc4, acc4, PMP::PACKED_P); - - // For the final 3 elements we multiply by 1/2, 3, 4. - // This gives the negative of the correct answer which - // will be handled by add_sum(). - - input[5] = halve_avx512::(input[5]); - - let acc6 = mm512_mod_add(input[6], input[6], PMP::PACKED_P); - input[6] = mm512_mod_add(acc6, input[6], PMP::PACKED_P); - - let acc7 = mm512_mod_add(input[7], input[7], PMP::PACKED_P); - input[7] = mm512_mod_add(acc7, acc7, PMP::PACKED_P); - } - - /// # Safety - /// - /// This function must not touch the first 8 elements of input. - /// It may output values which are the negative of the expected - /// value in some places. This will be handled by `add_sum` so - /// it is important these elements are not touched - /// before input is passed into `add_sum`. - unsafe fn diagonal_mul_remainder(input: &mut Self::ArrayLike); - - /// The number of positive inverse powers of two in the diagonal matrix after the 4. - const NUM_POS: usize; - - /// # Safety - /// - /// Sum must be in canonical form and input must be exactly the output of `diagonal_mul`. - /// If either of these does not hold, the result is undefined. - /// - /// Morally this function is computing `x -> x + sum` however there are some places where - /// the output of `diagonal_mul` is the negative of the expected value and might lie - /// in [0, P] instead of being in canonical form. - /// - /// It is the job of add_sum to correct for these irregularities. Where the output is negative - /// we compute `x -> sum - x` instead. - #[inline(always)] - unsafe fn add_sum(input: &mut Self::ArrayLike, sum: __m512i) { - // Both mm512_mod_add and mm512_mod_sub will return correct values in [0, P) when one - // input is in [0, P) and the other is in [0, P]. - - // Diagonal mul multiplied these by 1, 2, 1/2, 3, 4 so we simply need to add the sum. - input.as_mut()[..5] - .iter_mut() - .for_each(|x| *x = mm512_mod_add(sum, *x, PMP::PACKED_P)); - - // Diagonal mul multiplied these by 1/2, 3, 4 instead of -1/2, -3, -4 so we need to subtract instead of adding. - // Similarly we can only cheaply multiply by negative inverse powers of two so we also need to subtract for all - // the positive powers of two. - input.as_mut()[5..(8 + Self::NUM_POS)] - .iter_mut() - .for_each(|x| *x = mm512_mod_sub(sum, *x, PMP::PACKED_P)); - - // The remainder are all correctly multiplied by negative inverse powers of two so - // we just need to add the sum. - input.as_mut()[8 + Self::NUM_POS..] - .iter_mut() - .for_each(|x| *x = mm512_mod_add(sum, *x, PMP::PACKED_P)); - } -} - -/// Convert elements from canonical form [0, P) to a negative form in [-P, ..., 0) and copy into a vector. -#[inline(always)] -fn convert_to_vec_neg_form(input: i32) -> __m512i { - let input_sub_p = input - (MP::PRIME as i32); - unsafe { - // Safety: If this code got compiled then AVX512-F intrinsics are available. - x86_64::_mm512_set1_epi32(input_sub_p) - } -} - -impl InternalLayer, 16, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, - ILP: InternalLayerParametersAVX512, -{ - /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [PackedMontyField31AVX512; 16]) { - unsafe { - // Safety: This return values in canonical form when given values in canonical form. - /* - Fix a vector v and let Diag(v) denote the diagonal matrix with diagonal given by v. - Additionally, let 1 denote the matrix with all elements equal to 1. - The internal layer consists of an sbox operation then a matrix multiplication by 1 + Diag(v). - Explicitly the internal layer consists of the following 2 operations: - - s0 -> (s0 + rc)^d - s -> (1 + Diag(v))s - - Note that this matrix multiplication can be implemented as: - sum = sum_i s_i - s_i -> sum + s_iv_i - - which is essentially how we implement it. - */ - - let mut internal_state = InternalLayer16::from_packed_field_array(*state); - - self.packed_internal_constants.iter().for_each(|&rc| { - add_rc_and_sbox::(&mut internal_state.s0, rc); // s0 -> (s0 + rc)^D - let sum_tail = PackedMontyField31AVX512::::sum_array::<15>(&transmute::< - [__m512i; 15], - [PackedMontyField31AVX512; 15], - >(internal_state.s_hi)); // Get the sum of all elements other than s0. - ILP::diagonal_mul(&mut internal_state.s_hi); // si -> vi * si for all i > 0. - let sum = sum_tail + internal_state.s0; // Get the full sum. - internal_state.s0 = sum_tail - internal_state.s0; // s0 -> sum - 2*s0 = sum_tail - s0. - ILP::add_sum( - &mut internal_state.s_hi, - transmute::, __m512i>(sum), - ); // si -> si + sum for all i > 0. - }); - - // This transformation is safe as the above function returns elements - // in canonical form when given elements in canonical form. - *state = InternalLayer16::to_packed_field_array(internal_state); - } - } -} - -impl InternalLayer, 24, D> - for Poseidon2InternalLayerMonty31 -where - FP: FieldParameters, - ILP: InternalLayerParametersAVX512, -{ - /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [PackedMontyField31AVX512; 24]) { - unsafe { - // Safety: This return values in canonical form when given values in canonical form. - - /* - Fix a vector v and let Diag(v) denote the diagonal matrix with diagonal given by v. - Additionally, let 1 denote the matrix with all elements equal to 1. - The internal layer consists of an sbox operation then a matrix multiplication by 1 + Diag(v). - Explicitly the internal layer consists of the following 2 operations: - - s0 -> (s0 + rc)^d - s -> (1 + Diag(v))s - - Note that this matrix multiplication is implemented as: - sum = sum_i s_i - s_i -> sum + s_iv_i. - */ - - let mut internal_state = InternalLayer24::from_packed_field_array(*state); - - self.packed_internal_constants.iter().for_each(|&rc| { - add_rc_and_sbox::(&mut internal_state.s0, rc); // s0 -> (s0 + rc)^D - let sum_tail = PackedMontyField31AVX512::::sum_array::<23>(&transmute::< - [__m512i; 23], - [PackedMontyField31AVX512; 23], - >(internal_state.s_hi)); // Get the sum of all elements other than s0. - ILP::diagonal_mul(&mut internal_state.s_hi); // si -> vi * si for all i > 0. - let sum = sum_tail + internal_state.s0; // Get the full sum. - internal_state.s0 = sum_tail - internal_state.s0; // s0 -> sum - 2*s0 = sum_tail - s0. - ILP::add_sum( - &mut internal_state.s_hi, - transmute::, __m512i>(sum), - ); // si -> si + sum for all i > 0. - }); - - // This transformation is safe as the above function returns elements - // in canonical form when given elements in canonical form. - *state = InternalLayer24::to_packed_field_array(internal_state); - } - } -} - -impl ExternalLayer, WIDTH, D> - for Poseidon2ExternalLayerMonty31 -where - FP: FieldParameters + RelativelyPrimePower, -{ - /// Perform the initial external layers of the Poseidon2 permutation on the given state. - fn permute_state_initial(&self, state: &mut [PackedMontyField31AVX512; WIDTH]) { - external_initial_permute_state( - state, - &self.packed_initial_external_constants, - add_rc_and_sbox::, - &MDSMat4, - ); - } - - /// Perform the terminal external layers of the Poseidon2 permutation on the given state. - fn permute_state_terminal(&self, state: &mut [PackedMontyField31AVX512; WIDTH]) { - external_terminal_permute_state( - state, - &self.packed_terminal_external_constants, - add_rc_and_sbox::, - &MDSMat4, - ); - } -} diff --git a/crates/backend/koala-bear/src/monty_31/x86_64_avx512/poseidon_helpers.rs b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/poseidon_helpers.rs new file mode 100644 index 00000000..3c590e6e --- /dev/null +++ b/crates/backend/koala-bear/src/monty_31/x86_64_avx512/poseidon_helpers.rs @@ -0,0 +1,96 @@ +// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). + +//! AVX512 helpers shared by Poseidon1 permutations. + +use core::arch::x86_64::{self, __m512i}; +use core::mem::transmute; + +use crate::{ + MontyParameters, PackedMontyField31AVX512, PackedMontyParameters, apply_func_to_even_odd, packed_exp_3, + packed_exp_5, packed_exp_7, +}; + +/// A specialized representation of the Poseidon state for a width of 16. +/// +/// Splits the state into `s0` (undergoes S-box) and `s_hi` (undergoes only linear transforms), +/// enabling instruction-level parallelism between the two independent data paths. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct InternalLayer16 { + pub(crate) s0: PackedMontyField31AVX512, + pub(crate) s_hi: [__m512i; 15], +} + +impl InternalLayer16 { + #[inline] + pub(crate) unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX512; 16] { + unsafe { transmute(self) } + } + + #[inline] + #[must_use] + pub(crate) fn from_packed_field_array(vector: [PackedMontyField31AVX512; 16]) -> Self { + unsafe { transmute(vector) } + } +} + +/// A specialized representation of the Poseidon state for a width of 24. +/// +/// Same split as `InternalLayer16` but for width 24. +#[derive(Clone, Copy)] +#[repr(C)] +pub struct InternalLayer24 { + pub(crate) s0: PackedMontyField31AVX512, + pub(crate) s_hi: [__m512i; 23], +} + +impl InternalLayer24 { + #[inline] + pub(crate) unsafe fn to_packed_field_array(self) -> [PackedMontyField31AVX512; 24] { + unsafe { transmute(self) } + } + + #[inline] + #[must_use] + pub(crate) fn from_packed_field_array(vector: [PackedMontyField31AVX512; 24]) -> Self { + unsafe { transmute(vector) } + } +} + +/// Use hard coded methods to compute `x -> x^D` for the even index entries and small `D`. +/// Inputs should be signed 32-bit integers in `[-P, ..., P]`. +/// Outputs will also be signed integers in `(-P, ..., P)` stored in the odd indices. +#[inline(always)] +#[must_use] +pub(crate) fn exp_small(val: __m512i) -> __m512i { + match D { + 3 => packed_exp_3::(val), + 5 => packed_exp_5::(val), + 7 => packed_exp_7::(val), + _ => panic!("No exp function for given D"), + } +} + +/// Converts a scalar constant into a packed AVX512 vector in "negative form" (`c - P`). +#[inline(always)] +pub(crate) fn convert_to_vec_neg_form(input: i32) -> __m512i { + let input_sub_p = input - (MP::PRIME as i32); + unsafe { x86_64::_mm512_set1_epi32(input_sub_p) } +} + +/// Performs the fused AddRoundConstant and S-Box operation `x -> (x + c)^D`. +/// +/// `val` must contain elements in canonical form `[0, P)`. +/// `rc` must contain round constants in negative form `[-P, 0)`. +#[inline(always)] +pub(crate) fn add_rc_and_sbox( + val: &mut PackedMontyField31AVX512, + rc: __m512i, +) { + unsafe { + let vec_val = val.to_vector(); + let val_plus_rc = x86_64::_mm512_add_epi32(vec_val, rc); + let output = apply_func_to_even_odd::(val_plus_rc, exp_small::); + *val = PackedMontyField31AVX512::::from_vector(output); + } +} diff --git a/crates/backend/koala-bear/src/poseidon1_koalabear_16.rs b/crates/backend/koala-bear/src/poseidon1_koalabear_16.rs new file mode 100644 index 00000000..23a839a1 --- /dev/null +++ b/crates/backend/koala-bear/src/poseidon1_koalabear_16.rs @@ -0,0 +1,1043 @@ +// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). + +use std::sync::OnceLock; + +use core::ops::Mul; + +use crate::KoalaBear; +use crate::symmetric::Permutation; +use field::{Algebra, Field, InjectiveMonomial, PrimeCharacteristicRing}; + +pub const POSEIDON1_WIDTH: usize = 16; +pub const POSEIDON1_HALF_FULL_ROUNDS: usize = 4; +pub const POSEIDON1_PARTIAL_ROUNDS: usize = 20; +pub const POSEIDON1_SBOX_DEGREE: u64 = 3; +const POSEIDON1_N_ROUNDS: usize = 2 * POSEIDON1_HALF_FULL_ROUNDS + POSEIDON1_PARTIAL_ROUNDS; + +// ========================================================================= +// MDS circulant matrix +// ========================================================================= + +/// First column of the circulant MDS matrix. +const MDS_CIRC_COL: [KoalaBear; 16] = KoalaBear::new_array([1, 3, 13, 22, 67, 2, 15, 63, 101, 1, 2, 17, 11, 1, 51, 1]); + +// ========================================================================= +// Forward twiddles for 16-point FFT: W_k = omega^k +// ========================================================================= + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W1: KoalaBear = KoalaBear::new(0x08dbd69c); +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W2: KoalaBear = KoalaBear::new(0x6832fe4a); +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W3: KoalaBear = KoalaBear::new(0x27ae21e2); +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W4: KoalaBear = KoalaBear::new(0x7e010002); +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W5: KoalaBear = KoalaBear::new(0x3a89a025); +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W6: KoalaBear = KoalaBear::new(0x174e3650); +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +const W7: KoalaBear = KoalaBear::new(0x27dfce22); + +// ========================================================================= +// 16-point FFT / IFFT (radix-2, fully unrolled, in-place) +// ========================================================================= + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +#[inline(always)] +fn bt>(v: &mut [R; 16], lo: usize, hi: usize) { + let (a, b) = (v[lo], v[hi]); + v[lo] = a + b; + v[hi] = a - b; +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +#[inline(always)] +fn dit>(v: &mut [R; 16], lo: usize, hi: usize, t: KoalaBear) { + let a = v[lo]; + let tb = v[hi] * t; + v[lo] = a + tb; + v[hi] = a - tb; +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +#[inline(always)] +fn neg_dif>(v: &mut [R; 16], lo: usize, hi: usize, t: KoalaBear) { + let (a, b) = (v[lo], v[hi]); + v[lo] = a + b; + v[hi] = (b - a) * t; +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +#[inline(always)] +fn dif_ifft_16_mut>(f: &mut [R; 16]) { + bt(f, 0, 8); + neg_dif(f, 1, 9, W7); + neg_dif(f, 2, 10, W6); + neg_dif(f, 3, 11, W5); + neg_dif(f, 4, 12, W4); + neg_dif(f, 5, 13, W3); + neg_dif(f, 6, 14, W2); + neg_dif(f, 7, 15, W1); + bt(f, 0, 4); + neg_dif(f, 1, 5, W6); + neg_dif(f, 2, 6, W4); + neg_dif(f, 3, 7, W2); + bt(f, 8, 12); + neg_dif(f, 9, 13, W6); + neg_dif(f, 10, 14, W4); + neg_dif(f, 11, 15, W2); + bt(f, 0, 2); + neg_dif(f, 1, 3, W4); + bt(f, 4, 6); + neg_dif(f, 5, 7, W4); + bt(f, 8, 10); + neg_dif(f, 9, 11, W4); + bt(f, 12, 14); + neg_dif(f, 13, 15, W4); + bt(f, 0, 1); + bt(f, 2, 3); + bt(f, 4, 5); + bt(f, 6, 7); + bt(f, 8, 9); + bt(f, 10, 11); + bt(f, 12, 13); + bt(f, 14, 15); +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +#[inline(always)] +fn dit_fft_16_mut>(f: &mut [R; 16]) { + bt(f, 0, 1); + bt(f, 2, 3); + bt(f, 4, 5); + bt(f, 6, 7); + bt(f, 8, 9); + bt(f, 10, 11); + bt(f, 12, 13); + bt(f, 14, 15); + bt(f, 0, 2); + dit(f, 1, 3, W4); + bt(f, 4, 6); + dit(f, 5, 7, W4); + bt(f, 8, 10); + dit(f, 9, 11, W4); + bt(f, 12, 14); + dit(f, 13, 15, W4); + bt(f, 0, 4); + dit(f, 1, 5, W2); + dit(f, 2, 6, W4); + dit(f, 3, 7, W6); + bt(f, 8, 12); + dit(f, 9, 13, W2); + dit(f, 10, 14, W4); + dit(f, 11, 15, W6); + bt(f, 0, 8); + dit(f, 1, 9, W1); + dit(f, 2, 10, W2); + dit(f, 3, 11, W3); + dit(f, 4, 12, W4); + dit(f, 5, 13, W5); + dit(f, 6, 14, W6); + dit(f, 7, 15, W7); +} + +// ========================================================================= +// Circulant MDS via Karatsuba convolution (used for full rounds) +// +// Ported from Plonky3 mds/src/karatsuba_convolution.rs. +// Uses field arithmetic (halve + mixed dot product). +// Exploits small MDS column entries (1, 2, 3 = cheap muls). +// ========================================================================= + +#[inline(always)] +fn parity_dot, const N: usize>( + lhs: [R; N], + rhs: [KoalaBear; N], +) -> R { + let mut acc = lhs[0] * rhs[0]; + for i in 1..N { + acc += lhs[i] * rhs[i]; + } + acc +} + +#[inline(always)] +fn conv4>(lhs: [R; 4], rhs: [KoalaBear; 4], output: &mut [R]) { + let u_p = [lhs[0] + lhs[2], lhs[1] + lhs[3]]; + let u_m = [lhs[0] - lhs[2], lhs[1] - lhs[3]]; + let v_p = [rhs[0] + rhs[2], rhs[1] + rhs[3]]; + let v_m = [rhs[0] - rhs[2], rhs[1] - rhs[3]]; + output[0] = parity_dot(u_m, [v_m[0], -v_m[1]]); + output[1] = parity_dot(u_m, [v_m[1], v_m[0]]); + output[2] = parity_dot(u_p, v_p); + output[3] = parity_dot(u_p, [v_p[1], v_p[0]]); + output[0] += output[2]; + output[1] += output[3]; + output[0] = output[0].halve(); + output[1] = output[1].halve(); + output[2] -= output[0]; + output[3] -= output[1]; +} + +#[inline(always)] +fn negacyclic_conv4>( + lhs: [R; 4], + rhs: [KoalaBear; 4], + output: &mut [R], +) { + output[0] = parity_dot(lhs, [rhs[0], -rhs[3], -rhs[2], -rhs[1]]); + output[1] = parity_dot(lhs, [rhs[1], rhs[0], -rhs[3], -rhs[2]]); + output[2] = parity_dot(lhs, [rhs[2], rhs[1], rhs[0], -rhs[3]]); + output[3] = parity_dot(lhs, [rhs[3], rhs[2], rhs[1], rhs[0]]); +} + +#[inline(always)] +fn conv_n_recursive, const N: usize, const H: usize>( + lhs: [R; N], + rhs: [KoalaBear; N], + output: &mut [R], + inner_conv: fn([R; H], [KoalaBear; H], &mut [R]), + inner_neg: fn([R; H], [KoalaBear; H], &mut [R]), +) { + let mut lp = [R::ZERO; H]; + let mut ln = [R::ZERO; H]; + let mut rp = [KoalaBear::ZERO; H]; + let mut rn = [KoalaBear::ZERO; H]; + for i in 0..H { + lp[i] = lhs[i] + lhs[i + H]; + ln[i] = lhs[i] - lhs[i + H]; + rp[i] = rhs[i] + rhs[i + H]; + rn[i] = rhs[i] - rhs[i + H]; + } + let (left, right) = output.split_at_mut(H); + inner_neg(ln, rn, left); + inner_conv(lp, rp, right); + for i in 0..H { + left[i] += right[i]; + left[i] = left[i].halve(); + right[i] -= left[i]; + } +} + +#[inline(always)] +fn negacyclic_conv_n_recursive< + R: PrimeCharacteristicRing + Mul, + const N: usize, + const H: usize, +>( + lhs: [R; N], + rhs: [KoalaBear; N], + output: &mut [R], + inner_neg: fn([R; H], [KoalaBear; H], &mut [R]), +) { + let mut le = [R::ZERO; H]; + let mut lo = [R::ZERO; H]; + let mut ls = [R::ZERO; H]; + let mut re = [KoalaBear::ZERO; H]; + let mut ro = [KoalaBear::ZERO; H]; + let mut rs = [KoalaBear::ZERO; H]; + for i in 0..H { + le[i] = lhs[2 * i]; + lo[i] = lhs[2 * i + 1]; + ls[i] = le[i] + lo[i]; + re[i] = rhs[2 * i]; + ro[i] = rhs[2 * i + 1]; + rs[i] = re[i] + ro[i]; + } + let mut es = [R::ZERO; H]; + let (left, right) = output.split_at_mut(H); + inner_neg(le, re, &mut es); + inner_neg(lo, ro, left); + inner_neg(ls, rs, right); + right[0] -= es[0] + left[0]; + es[0] -= left[H - 1]; + for i in 1..H { + right[i] -= es[i] + left[i]; + es[i] += left[i - 1]; + } + for i in 0..H { + output[2 * i] = es[i]; + output[2 * i + 1] = output[i + H]; + } +} + +#[inline(always)] +fn conv8>(lhs: [R; 8], rhs: [KoalaBear; 8], output: &mut [R]) { + conv_n_recursive(lhs, rhs, output, conv4::, negacyclic_conv4::); +} + +#[inline(always)] +fn negacyclic_conv8>( + lhs: [R; 8], + rhs: [KoalaBear; 8], + output: &mut [R], +) { + negacyclic_conv_n_recursive(lhs, rhs, output, negacyclic_conv4::); +} + +/// Circulant MDS multiply via Karatsuba convolution: state = C * state. +#[inline(always)] +pub fn mds_circ_16>(state: &mut [R; 16]) { + let input = *state; + conv_n_recursive( + input, + MDS_CIRC_COL, + state.as_mut_slice(), + conv8::, + negacyclic_conv8::, + ); +} + +// ========================================================================= +// Sparse matrix decomposition helpers (for NEON partial rounds) +// ========================================================================= + +/// Dense NxN matrix multiplication: C = A * B. +fn matrix_mul_16(a: &[[KoalaBear; 16]; 16], b: &[[KoalaBear; 16]; 16]) -> [[KoalaBear; 16]; 16] { + core::array::from_fn(|i| { + core::array::from_fn(|j| { + let mut s = KoalaBear::ZERO; + for k in 0..16 { + s += a[i][k] * b[k][j]; + } + s + }) + }) +} + +/// Matrix-vector multiplication: result = M * v. +fn matrix_vec_mul_16(m: &[[KoalaBear; 16]; 16], v: &[KoalaBear; 16]) -> [KoalaBear; 16] { + core::array::from_fn(|i| { + let mut s = KoalaBear::ZERO; + for j in 0..16 { + s += m[i][j] * v[j]; + } + s + }) +} + +/// Matrix transpose. +fn matrix_transpose_16(m: &[[KoalaBear; 16]; 16]) -> [[KoalaBear; 16]; 16] { + core::array::from_fn(|i| core::array::from_fn(|j| m[j][i])) +} + +/// NxN matrix inverse via Gauss-Jordan elimination. +fn matrix_inverse_16(m: &[[KoalaBear; 16]; 16]) -> [[KoalaBear; 16]; 16] { + let mut aug: [[KoalaBear; 16]; 16] = *m; + let mut inv: [[KoalaBear; 16]; 16] = + core::array::from_fn(|i| core::array::from_fn(|j| if i == j { KoalaBear::ONE } else { KoalaBear::ZERO })); + + for col in 0..16 { + let pivot_row = (col..16) + .find(|&r| aug[r][col] != KoalaBear::ZERO) + .expect("Matrix is singular"); + if pivot_row != col { + aug.swap(col, pivot_row); + inv.swap(col, pivot_row); + } + let pivot_inv = aug[col][col].inverse(); + for j in 0..16 { + aug[col][j] *= pivot_inv; + inv[col][j] *= pivot_inv; + } + for i in 0..16 { + if i == col { + continue; + } + let factor = aug[i][col]; + if factor == KoalaBear::ZERO { + continue; + } + let aug_col_row = aug[col]; + let inv_col_row = inv[col]; + for j in 0..16 { + aug[i][j] -= factor * aug_col_row[j]; + inv[i][j] -= factor * inv_col_row[j]; + } + } + } + inv +} + +/// Inverse of the 15x15 bottom-right submatrix of m. +fn submatrix_inverse_15(m: &[[KoalaBear; 16]; 16]) -> [[KoalaBear; 15]; 15] { + let mut sub: [[KoalaBear; 15]; 15] = core::array::from_fn(|i| core::array::from_fn(|j| m[i + 1][j + 1])); + let mut inv: [[KoalaBear; 15]; 15] = + core::array::from_fn(|i| core::array::from_fn(|j| if i == j { KoalaBear::ONE } else { KoalaBear::ZERO })); + + for col in 0..15 { + let pivot_row = (col..15) + .find(|&r| sub[r][col] != KoalaBear::ZERO) + .expect("Submatrix is singular"); + if pivot_row != col { + sub.swap(col, pivot_row); + inv.swap(col, pivot_row); + } + let pivot_inv = sub[col][col].inverse(); + for j in 0..15 { + sub[col][j] *= pivot_inv; + inv[col][j] *= pivot_inv; + } + for i in 0..15 { + if i == col { + continue; + } + let factor = sub[i][col]; + if factor == KoalaBear::ZERO { + continue; + } + let sub_col_row = sub[col]; + let inv_col_row = inv[col]; + for j in 0..15 { + sub[i][j] -= factor * sub_col_row[j]; + inv[i][j] -= factor * inv_col_row[j]; + } + } + } + inv +} + +type SparseMatrices = ([[KoalaBear; 16]; 16], Vec<[KoalaBear; 16]>, Vec<[KoalaBear; 16]>); + +/// Factor the dense MDS matrix into POSEIDON1_PARTIAL_ROUNDS sparse matrices. +/// Returns (m_i, v_collection, w_hat_collection) in forward application order. +fn compute_equivalent_matrices(mds: &[[KoalaBear; 16]; 16]) -> SparseMatrices { + let rounds_p = POSEIDON1_PARTIAL_ROUNDS; + let mut w_hat_collection: Vec<[KoalaBear; 16]> = Vec::with_capacity(rounds_p); + let mut v_collection: Vec<[KoalaBear; 16]> = Vec::with_capacity(rounds_p); + + let mds_t = matrix_transpose_16(mds); + let mut m_mul = mds_t; + let mut m_i = [[KoalaBear::ZERO; 16]; 16]; + + for _ in 0..rounds_p { + // v = first row of m_mul (excluding [0,0]), padded with 0 at end. + let v_arr: [KoalaBear; 16] = core::array::from_fn(|j| if j < 15 { m_mul[0][j + 1] } else { KoalaBear::ZERO }); + + // w = first column of m_mul (excluding [0,0]). + let w: [KoalaBear; 15] = core::array::from_fn(|i| m_mul[i + 1][0]); + + // MÌ‚^{-1} (inverse of bottom-right 15x15 submatrix). + let m_hat_inv = submatrix_inverse_15(&m_mul); + + // ŵ = MÌ‚^{-1} * w, padded with 0 at end. + let w_hat_arr: [KoalaBear; 16] = core::array::from_fn(|i| { + if i < 15 { + let mut s = KoalaBear::ZERO; + for k in 0..15 { + s += m_hat_inv[i][k] * w[k]; + } + s + } else { + KoalaBear::ZERO + } + }); + + v_collection.push(v_arr); + w_hat_collection.push(w_hat_arr); + + // Build m_i: keep m_mul but zero first row/col, set [0,0]=1. + m_i = m_mul; + m_i[0][0] = KoalaBear::ONE; + for row in m_i.iter_mut().skip(1) { + row[0] = KoalaBear::ZERO; + } + for elem in m_i[0].iter_mut().skip(1) { + *elem = KoalaBear::ZERO; + } + + // m_mul = M^T * m_i. + m_mul = matrix_mul_16(&mds_t, &m_i); + } + + // Transpose m_i back. + let m_i_returned = matrix_transpose_16(&m_i); + + // Reverse: HorizenLabs computes in reverse order. + v_collection.reverse(); + w_hat_collection.reverse(); + + (m_i_returned, v_collection, w_hat_collection) +} + +/// Compress round constants via backward substitution through MDS^{-1}. +/// Returns (first_round_constants, scalar_round_constants). +fn equivalent_round_constants( + partial_rc: &[[KoalaBear; 16]], + mds_inv: &[[KoalaBear; 16]; 16], +) -> ([KoalaBear; 16], Vec) { + let rounds_p = partial_rc.len(); + let mut opt_partial_rc = vec![KoalaBear::ZERO; rounds_p]; + + let mut tmp = partial_rc[rounds_p - 1]; + for i in (0..rounds_p - 1).rev() { + let inv_cip = matrix_vec_mul_16(mds_inv, &tmp); + opt_partial_rc[i + 1] = inv_cip[0]; + tmp = partial_rc[i]; + for j in 1..16 { + tmp[j] += inv_cip[j]; + } + } + + let first_round_constants = tmp; + let scalar_constants = opt_partial_rc[1..].to_vec(); + (first_round_constants, scalar_constants) +} + +// ========================================================================= +// Precomputed constants (stored in struct, OnceLock only at construction) +// ========================================================================= + +#[derive(Debug)] +struct Precomputed { + // --- Sparse matrix decomposition --- + /// First round constant vector (full width), added once before m_i multiply. + sparse_first_round_constants: [KoalaBear; 16], + /// Dense transition matrix m_i, applied once before the partial round loop. + sparse_m_i: [[KoalaBear; 16]; 16], + /// Per-round full first row: [mds_0_0, ŵ[0], ..., ŵ[14]]. + /// Length = POSEIDON1_PARTIAL_ROUNDS. + sparse_first_row: Vec<[KoalaBear; 16]>, + /// Per-round first-column vectors (excluding [0,0]). + /// `v[r]` = [v[0], ..., v[14], 0]. Length = POSEIDON1_PARTIAL_ROUNDS. + sparse_v: Vec<[KoalaBear; 16]>, + /// Scalar constants for partial rounds 0..RP-2. + /// Length = POSEIDON1_PARTIAL_ROUNDS - 1. + sparse_round_constants: Vec, + + // --- NEON pre-packed constants --- + #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] + neon: NeonPrecomputed, +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +struct NeonPrecomputed { + /// Initial full round constants in negative NEON form (only first 3 rounds; + /// the 4th is fused with the partial round entry). + packed_initial_rc: [[core::arch::aarch64::int32x4_t; 16]; POSEIDON1_HALF_FULL_ROUNDS - 1], + /// Terminal full round constants in negative NEON form. + packed_terminal_rc: [[core::arch::aarch64::int32x4_t; 16]; POSEIDON1_HALF_FULL_ROUNDS], + /// Pre-packed sparse first rows as PackedKoalaBearNeon. + packed_sparse_first_row: [[PackedKB; 16]; POSEIDON1_PARTIAL_ROUNDS], + /// Pre-packed v vectors as PackedKoalaBearNeon. + packed_sparse_v: [[PackedKB; 16]; POSEIDON1_PARTIAL_ROUNDS], + /// Pre-packed scalar round constants for partial rounds 0..RP-2. + packed_round_constants: [PackedKB; POSEIDON1_PARTIAL_ROUNDS - 1], + /// Fused matrix: m_i * MDS * state_after_last_initial_sbox + m_i * first_rc. + /// Replaces: FFT MDS + add first_rc + dense m_i → single dense multiply. + packed_fused_mi_mds: [[PackedKB; 16]; 16], + /// Fused bias: m_i * first_round_constants. + packed_fused_bias: [PackedKB; 16], + /// Last initial round constant in negative NEON form (for fused add_rc_and_sbox). + packed_last_initial_rc: [core::arch::aarch64::int32x4_t; 16], + /// Pre-packed eigenvalues * INV16 for FFT MDS (absorbs /16 normalization). + packed_lambda_over_16: [PackedKB; 16], +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +impl std::fmt::Debug for NeonPrecomputed { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NeonPrecomputed").finish_non_exhaustive() + } +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +type FP = crate::KoalaBearParameters; +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +type PackedKB = crate::PackedKoalaBearNeon; + +static PRECOMPUTED: OnceLock = OnceLock::new(); + +fn precomputed() -> &'static Precomputed { + PRECOMPUTED.get_or_init(|| { + // Dense MDS for sparse decomposition. + let mds: [[KoalaBear; 16]; 16] = + core::array::from_fn(|i| core::array::from_fn(|j| MDS_CIRC_COL[(16 + i - j) % 16])); + + let partial_rc = + &POSEIDON1_RC[POSEIDON1_HALF_FULL_ROUNDS..POSEIDON1_HALF_FULL_ROUNDS + POSEIDON1_PARTIAL_ROUNDS]; + + // --- Sparse matrix decomposition constants --- + let mds_inv = matrix_inverse_16(&mds); + let (first_round_constants, scalar_round_constants) = equivalent_round_constants(partial_rc, &mds_inv); + let (m_i, sparse_v, sparse_w_hat) = compute_equivalent_matrices(&mds); + + // Pre-assemble full first rows: [mds_0_0, ŵ[0], ..., ŵ[14]]. + let mds_0_0 = mds[0][0]; + let sparse_first_row: Vec<[KoalaBear; 16]> = sparse_w_hat + .iter() + .map(|w| core::array::from_fn(|i| if i == 0 { mds_0_0 } else { w[i - 1] })) + .collect(); + + // --- NEON pre-packed constants --- + #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] + let neon = { + use crate::PackedMontyField31Neon; + use crate::convert_to_vec_neg_form_neon; + + let pack = |c: KoalaBear| PackedMontyField31Neon::::from(c); + let neg_form = |c: KoalaBear| convert_to_vec_neg_form_neon::(c.value as i32); + + // Initial full round constants (only first 3; 4th is fused). + let init_rc = poseidon1_initial_constants(); + let packed_initial_rc: [[core::arch::aarch64::int32x4_t; 16]; POSEIDON1_HALF_FULL_ROUNDS - 1] = + core::array::from_fn(|r| init_rc[r].map(neg_form)); + + // Last initial round constant (for fused add_rc_and_sbox before partial rounds). + let packed_last_initial_rc = init_rc[POSEIDON1_HALF_FULL_ROUNDS - 1].map(neg_form); + + // Terminal full round constants. + let term_rc = poseidon1_final_constants(); + let packed_terminal_rc: [[core::arch::aarch64::int32x4_t; 16]; POSEIDON1_HALF_FULL_ROUNDS] = + core::array::from_fn(|r| term_rc[r].map(neg_form)); + + // Pre-packed sparse constants (fixed-size arrays). + let packed_sparse_first_row: [[PackedKB; 16]; POSEIDON1_PARTIAL_ROUNDS] = + core::array::from_fn(|r| sparse_first_row[r].map(pack)); + let packed_sparse_v: [[PackedKB; 16]; POSEIDON1_PARTIAL_ROUNDS] = + core::array::from_fn(|r| sparse_v[r].map(pack)); + let packed_round_constants: [PackedKB; POSEIDON1_PARTIAL_ROUNDS - 1] = + core::array::from_fn(|r| pack(scalar_round_constants[r])); + + // Fused matrix: (m_i * MDS), replaces last initial FFT MDS + add first_rc + m_i. + let fused_mi_mds = matrix_mul_16(&m_i, &mds); + let packed_fused_mi_mds: [[PackedKB; 16]; 16] = core::array::from_fn(|i| fused_mi_mds[i].map(pack)); + + // Fused bias: m_i * first_round_constants. + let fused_bias = matrix_vec_mul_16(&m_i, &first_round_constants); + let packed_fused_bias: [PackedKB; 16] = fused_bias.map(pack); + + // Pre-packed eigenvalues * INV16 (absorbs /16 into eigenvalues). + let mut lambda_br = MDS_CIRC_COL; + dif_ifft_16_mut(&mut lambda_br); + let inv16 = KoalaBear::new(1997537281); // 16^{-1} mod p + let packed_lambda_over_16: [PackedKB; 16] = core::array::from_fn(|i| pack(lambda_br[i] * inv16)); + + NeonPrecomputed { + packed_initial_rc, + packed_terminal_rc, + packed_sparse_first_row, + packed_sparse_v, + packed_round_constants, + packed_fused_mi_mds, + packed_fused_bias, + packed_last_initial_rc, + packed_lambda_over_16, + } + }; + + Precomputed { + sparse_first_round_constants: first_round_constants, + sparse_m_i: m_i, + sparse_first_row, + sparse_v, + sparse_round_constants: scalar_round_constants, + #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] + neon, + } + }) +} + +// ========================================================================= +// Round constants (Grain LFSR, matching Plonky3) +// ========================================================================= + +const POSEIDON1_RC: [[KoalaBear; 16]; POSEIDON1_N_ROUNDS] = KoalaBear::new_2d_array([ + // Initial full rounds (4) + [ + 0x7ee56a48, 0x11367045, 0x12e41941, 0x7ebbc12b, 0x1970b7d5, 0x662b60e8, 0x3e4990c6, 0x679f91f5, 0x350813bb, + 0x00874ad4, 0x28a0081a, 0x18fa5872, 0x5f25b071, 0x5e5d5998, 0x5e6fd3e7, 0x5b2e2660, + ], + [ + 0x6f1837bf, 0x3fe6182b, 0x1edd7ac5, 0x57470d00, 0x43d486d5, 0x1982c70f, 0x0ea53af9, 0x61d6165b, 0x51639c00, + 0x2dec352c, 0x2950e531, 0x2d2cb947, 0x08256cef, 0x1a0109f6, 0x1f51faf3, 0x5cef1c62, + ], + [ + 0x3d65e50e, 0x33d91626, 0x133d5a1e, 0x0ff49b0d, 0x38900cd1, 0x2c22cc3f, 0x28852bb2, 0x06c65a02, 0x7b2cf7bc, + 0x68016e1a, 0x15e16bc0, 0x5248149a, 0x6dd212a0, 0x18d6830a, 0x5001be82, 0x64dac34e, + ], + [ + 0x5902b287, 0x426583a0, 0x0c921632, 0x3fe028a5, 0x245f8e49, 0x43bb297e, 0x7873dbd9, 0x3cc987df, 0x286bb4ce, + 0x640a8dcd, 0x512a8e36, 0x03a4cf55, 0x481837a2, 0x03d6da84, 0x73726ac7, 0x760e7fdf, + ], + // Partial rounds (20) + [ + 0x54dfeb5d, 0x7d40afd6, 0x722cb316, 0x106a4573, 0x45a7ccdb, 0x44061375, 0x154077a5, 0x45744faa, 0x4eb5e5ee, + 0x3794e83f, 0x47c7093c, 0x5694903c, 0x69cb6299, 0x373df84c, 0x46a0df58, 0x46b8758a, + ], + [ + 0x3241ebcb, 0x0b09d233, 0x1af42357, 0x1e66cec2, 0x43e7dc24, 0x259a5d61, 0x27e85a3b, 0x1b9133fa, 0x343e5628, + 0x485cd4c2, 0x16e269f5, 0x165b60c6, 0x25f683d9, 0x124f81f9, 0x174331f9, 0x77344dc5, + ], + [ + 0x5a821dba, 0x5fc4177f, 0x54153bf5, 0x5e3f1194, 0x3bdbf191, 0x088c84a3, 0x68256c9b, 0x3c90bbc6, 0x6846166a, + 0x03f4238d, 0x463335fb, 0x5e3d3551, 0x6e59ae6f, 0x32d06cc0, 0x596293f3, 0x6c87edb2, + ], + [ + 0x08fc60b5, 0x34bcca80, 0x24f007f3, 0x62731c6f, 0x1e1db6c6, 0x0ca409bb, 0x585c1e78, 0x56e94edc, 0x16d22734, + 0x18e11467, 0x7b2c3730, 0x770075e4, 0x35d1b18c, 0x22be3db5, 0x4fb1fbb7, 0x477cb3ed, + ], + [ + 0x7d5311c6, 0x5b62ae7d, 0x559c5fa8, 0x77f15048, 0x3211570b, 0x490fef6a, 0x77ec311f, 0x2247171b, 0x4e0ac711, + 0x2edf69c9, 0x3b5a8850, 0x65809421, 0x5619b4aa, 0x362019a7, 0x6bf9d4ed, 0x5b413dff, + ], + [ + 0x617e181e, 0x5e7ab57b, 0x33ad7833, 0x3466c7ca, 0x6488dff4, 0x71f068f4, 0x056e891f, 0x04f1eccc, 0x663257d5, + 0x671e31b9, 0x5871987c, 0x280c109e, 0x2a227761, 0x350a25e9, 0x5b91b1c4, 0x7a073546, + ], + [ + 0x01826270, 0x53a67720, 0x0ed4b074, 0x34cf0c4e, 0x6e751e88, 0x29bd5f59, 0x49ec32df, 0x7693452b, 0x3cf09e58, + 0x6ba0e2bf, 0x7ab93acf, 0x3ce597df, 0x536e3d42, 0x147a808d, 0x5e32eb56, 0x5a203323, + ], + [ + 0x50965766, 0x6d44b7c5, 0x6698636a, 0x57b84f9f, 0x554b61b9, 0x6da0ab28, 0x1585b6ac, 0x6705a2b4, 0x152872f6, + 0x0f4409fd, 0x23a9dd60, 0x6f2b18d4, 0x65ac9fd4, 0x2f0efbea, 0x591e67fd, 0x217ca19b, + ], + [ + 0x469c90ca, 0x03d60ef5, 0x4ea7857e, 0x07c86a4f, 0x288ed461, 0x2fe51b22, 0x7e293614, 0x2c4beb85, 0x5b0b7d11, + 0x1e17dff6, 0x089beae1, 0x0a5acf1a, 0x2fc33d8f, 0x60422dc6, 0x6e1dc939, 0x635351b9, + ], + [ + 0x55522fc0, 0x3eb94ef7, 0x2a24a65c, 0x2e139c76, 0x51391144, 0x78cc0742, 0x579538f9, 0x44de9aae, 0x3c2f1e2e, + 0x195747be, 0x2496339c, 0x650b2e39, 0x52899665, 0x6cb35558, 0x0f461c1c, 0x70f6b270, + ], + [ + 0x3faaa36f, 0x62e3348a, 0x672167cb, 0x394c880b, 0x2a46ba82, 0x63ffb74a, 0x1cf875d6, 0x53d12772, 0x036a4552, + 0x3bdd9f2b, 0x02f72c24, 0x02b6006c, 0x077fe158, 0x1f9d6ea4, 0x20904d6f, 0x5d6534fa, + ], + [ + 0x066d8974, 0x6198f1f4, 0x26301ab4, 0x41f274c2, 0x00eac15c, 0x28b54b47, 0x2339739d, 0x48c6281c, 0x4ed935fc, + 0x3f9187fa, 0x4a1930a6, 0x3ad4d736, 0x0f3f1889, 0x635a388f, 0x2862c145, 0x277ed1e8, + ], + [ + 0x4db23cad, 0x1f1b11f5, 0x1f3dba2b, 0x1c26eb4e, 0x0f7f5546, 0x6cd024b0, 0x67c47902, 0x793b8900, 0x0e8a283c, + 0x4590b7ea, 0x6f567a2b, 0x5dc97300, 0x15247bc6, 0x50567fcb, 0x133eff84, 0x547dc2ef, + ], + [ + 0x34eb3dbb, 0x12402317, 0x66c6ae49, 0x174338b6, 0x24251008, 0x1b514927, 0x062d98d6, 0x7af30bbc, 0x26af15e8, + 0x70d907a3, 0x5dfc5cac, 0x731f27ec, 0x53aa7d3f, 0x63ab0ec6, 0x216053f4, 0x18796b39, + ], + [ + 0x19156afd, 0x5eea6973, 0x6704c6a9, 0x0dce002b, 0x331169c0, 0x714d7178, 0x3ddaffaf, 0x7e464957, 0x20ca59ea, + 0x679820c9, 0x42ef21a1, 0x798ea089, 0x14a74fa3, 0x0c06cf18, 0x6a4c8d52, 0x620f6d81, + ], + [ + 0x2220901a, 0x5277bb90, 0x230bf95e, 0x0ad8847a, 0x5e96e8b6, 0x77b4056e, 0x70a50d2c, 0x5f0eed59, 0x3646c4df, + 0x10eb9a87, 0x21eed6b7, 0x534add36, 0x6e3e7421, 0x2b25810e, 0x1d8f707b, 0x45318a1a, + ], + [ + 0x677f8ff2, 0x0258c9e0, 0x4cd02a00, 0x2e24ff15, 0x634a715d, 0x4ac01e59, 0x601511e1, 0x26e9c01a, 0x4c165c6e, + 0x57cd1140, 0x3ac6543b, 0x6787d847, 0x037dfbf9, 0x6dd9d079, 0x4d24b281, 0x2a6f407d, + ], + [ + 0x0131df8e, 0x4b8a7896, 0x23700858, 0x2cf5e534, 0x12aafc3f, 0x54568d03, 0x1a250735, 0x5331686d, 0x4ce76d91, + 0x799c1a8c, 0x2b7a8ac9, 0x60aee672, 0x74f7421c, 0x3c42146d, 0x26d369c5, 0x4ae54a12, + ], + [ + 0x7eea16d1, 0x5ce3eae8, 0x69f28994, 0x262b8642, 0x610d4cc4, 0x5e1af21c, 0x1a8526d0, 0x316b127b, 0x3576fe5d, + 0x02d968a0, 0x4ba00f51, 0x40bed993, 0x377fb907, 0x7859216e, 0x1931d9d1, 0x53b0934e, + ], + [ + 0x71914ff7, 0x4eabae6c, 0x7196468e, 0x164b3cc2, 0x58cb66c0, 0x4c147307, 0x6b3afccd, 0x4236518b, 0x4ad85605, + 0x291382e1, 0x1e89b6cf, 0x5e16c3a8, 0x2e675921, 0x24300954, 0x05e555c3, 0x78880a24, + ], + // Terminal full rounds (4) + [ + 0x763a3125, 0x4f53b240, 0x18b7fa43, 0x2bbe8a73, 0x1c9a12f2, 0x3f6fd40d, 0x0e1d4ec4, 0x1361c64d, 0x09a8f470, + 0x03d23a40, 0x109ad290, 0x28c2fb88, 0x3b6498f2, 0x74d8be57, 0x6a4277d2, 0x18c2b3d4, + ], + [ + 0x6252c30c, 0x07cc2560, 0x209fe15b, 0x52a55fac, 0x4df19eb7, 0x02521116, 0x5e414ff1, 0x3cd9a1f4, 0x005aad15, + 0x27a53f00, 0x72bbe9cb, 0x71d8bd7d, 0x4194b79a, 0x48e87a72, 0x3341553c, 0x63d34faa, + ], + [ + 0x132a01e3, 0x3833e2d9, 0x49726e04, 0x054957f8, 0x7b71bce4, 0x73eec57d, 0x556e5533, 0x1fa93fde, 0x346a8ca8, + 0x1162dfde, 0x5c30d028, 0x094a4294, 0x3052dcda, 0x37988498, 0x51f06b97, 0x65848779, + ], + [ + 0x7599b0d4, 0x436fdabc, 0x66c5b77d, 0x40c86a9e, 0x27e7055b, 0x6d0dd9d8, 0x7e5598b5, 0x1a4d04f3, 0x5e3b2bc7, + 0x533b5b2f, 0x3e33a125, 0x664d71ce, 0x382e6c2a, 0x24c4eb6e, 0x13f246f7, 0x07e2d7ef, + ], +]); + +// ========================================================================= +// Accessors +// ========================================================================= + +pub fn poseidon1_round_constants() -> &'static [[KoalaBear; 16]; POSEIDON1_N_ROUNDS] { + &POSEIDON1_RC +} + +#[inline(always)] +pub fn poseidon1_initial_constants() -> &'static [[KoalaBear; 16]] { + &POSEIDON1_RC[..POSEIDON1_HALF_FULL_ROUNDS] +} + +#[inline(always)] +pub fn poseidon1_partial_constants() -> &'static [[KoalaBear; 16]] { + &POSEIDON1_RC[POSEIDON1_HALF_FULL_ROUNDS..POSEIDON1_HALF_FULL_ROUNDS + POSEIDON1_PARTIAL_ROUNDS] +} + +#[inline(always)] +pub fn poseidon1_final_constants() -> &'static [[KoalaBear; 16]] { + &POSEIDON1_RC[POSEIDON1_HALF_FULL_ROUNDS + POSEIDON1_PARTIAL_ROUNDS..] +} + +pub fn poseidon1_sparse_m_i() -> &'static [[KoalaBear; 16]; 16] { + &precomputed().sparse_m_i +} + +/// Per-round first row: `[mds_0_0, ŵ[0], ..., ŵ[14]]`. Length = PARTIAL_ROUNDS. +pub fn poseidon1_sparse_first_row() -> &'static Vec<[KoalaBear; 16]> { + &precomputed().sparse_first_row +} + +/// Per-round rank-1 update vectors `v[r]`. `v[r][0..14]` are the 15 update coefficients +/// (index 15 is always zero). Length = PARTIAL_ROUNDS. +pub fn poseidon1_sparse_v() -> &'static Vec<[KoalaBear; 16]> { + &precomputed().sparse_v +} + +/// Full-width constant vector added once before the `m_i` multiply. +pub fn poseidon1_sparse_first_round_constants() -> &'static [KoalaBear; 16] { + &precomputed().sparse_first_round_constants +} + +/// Scalar constants added to `state[0]` in partial rounds 0..RP-2. Length = RP-1. +pub fn poseidon1_sparse_scalar_round_constants() -> &'static Vec { + &precomputed().sparse_round_constants +} + +#[derive(Clone, Debug)] +pub struct Poseidon1KoalaBear16 { + pre: &'static Precomputed, +} + +impl Poseidon1KoalaBear16 { + #[inline(always)] + #[allow(clippy::needless_range_loop)] + fn permute_generic + InjectiveMonomial<3>>(&self, state: &mut [R; 16]) { + // Initial full rounds. + for rc in poseidon1_initial_constants() { + Self::full_round(state, rc); + } + + // --- Partial rounds via sparse matrix decomposition --- + // Add first-round constants. + for (s, &c) in state.iter_mut().zip(self.pre.sparse_first_round_constants.iter()) { + *s += c; + } + // Apply dense transition matrix m_i (once). + { + let input = *state; + for i in 0..16 { + state[i] = R::ZERO; + for j in 0..16 { + state[i] += input[j] * self.pre.sparse_m_i[i][j]; + } + } + } + // Loop over partial rounds: S-box + scalar constant + sparse matmul. + for r in 0..POSEIDON1_PARTIAL_ROUNDS { + state[0] = state[0].injective_exp_n(); + if r < POSEIDON1_PARTIAL_ROUNDS - 1 { + state[0] += self.pre.sparse_round_constants[r]; + } + // Sparse matrix multiply: O(16) per round. + let old_s0 = state[0]; + state[0] = parity_dot(*state, self.pre.sparse_first_row[r]); + for i in 1..16 { + state[i] += old_s0 * self.pre.sparse_v[r][i - 1]; + } + } + + // Terminal full rounds. + for rc in poseidon1_final_constants() { + Self::full_round(state, rc); + } + } + + #[inline(always)] + fn full_round + InjectiveMonomial<3>>(state: &mut [R; 16], rc: &[KoalaBear; 16]) { + for (s, &c) in state.iter_mut().zip(rc.iter()) { + *s += c; + } + for s in state.iter_mut() { + *s = s.injective_exp_n(); + } + mds_circ_16(state); + } + + /// NEON-specific fast path using: + /// - Fused AddRC+S-box (`add_rc_and_sbox`) for full rounds + /// - `InternalLayer16` split for ILP between S-box and dot product in partial rounds + /// - Pre-packed sparse matrix constants + #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] + #[inline(always)] + fn permute_neon(&self, state: &mut [PackedKB; 16]) { + use crate::PackedMontyField31Neon; + use crate::exp_small; + use crate::{InternalLayer16, add_rc_and_sbox}; + use core::mem::transmute; + + let neon = &self.pre.neon; + let lambda16 = &neon.packed_lambda_over_16; + + /// FFT MDS: state = C * state. + /// Uses lambda/16 eigenvalues so no separate /16 step needed. + /// C * x = DIT_FFT((lambda/16) ⊙ DIF_IFFT(x)) + #[inline(always)] + fn mds_fft_neon(state: &mut [PackedKB; 16], lambda16: &[PackedKB; 16]) { + dif_ifft_16_mut(state); + for i in 0..16 { + state[i] *= lambda16[i]; + } + dit_fft_16_mut(state); + } + + // --- Initial full rounds (first 3 of 4) --- + for round_constants in &neon.packed_initial_rc { + for (s, &rc) in state.iter_mut().zip(round_constants.iter()) { + add_rc_and_sbox::(s, rc); + } + mds_fft_neon(state, lambda16); + } + + // --- Last initial full round: AddRC + S-box, then fused (m_i * MDS) --- + // Fuses: MDS(state) + first_rc → m_i * (MDS(state) + first_rc) + // = (m_i * MDS) * state + m_i * first_rc + // Saves one full FFT MDS call. + { + for (s, &rc) in state.iter_mut().zip(neon.packed_last_initial_rc.iter()) { + add_rc_and_sbox::(s, rc); + } + let input = *state; + for (i, state_i) in state.iter_mut().enumerate() { + *state_i = PackedMontyField31Neon::::dot_product(&input, &neon.packed_fused_mi_mds[i]) + + neon.packed_fused_bias[i]; + } + } + + // --- Partial rounds loop with latency hiding via InternalLayer16 split --- + { + let mut split = InternalLayer16::from_packed_field_array(*state); + + for r in 0..POSEIDON1_PARTIAL_ROUNDS { + // PATH A (high latency): S-box on s0 only. + unsafe { + let s0_signed = split.s0.to_signed_vector(); + let s0_sboxed = exp_small::(s0_signed); + split.s0 = PackedMontyField31Neon::from_vector(s0_sboxed); + } + + // Add scalar round constant (except last round). + if r < POSEIDON1_PARTIAL_ROUNDS - 1 { + split.s0 += neon.packed_round_constants[r]; + } + + // PATH B (can overlap with S-box): partial dot product on s_hi. + let s_hi: &[PackedKB; 15] = unsafe { transmute(&split.s_hi) }; + let first_row = &neon.packed_sparse_first_row[r]; + let first_row_hi: &[PackedKB; 15] = first_row[1..].try_into().unwrap(); + let partial_dot = PackedMontyField31Neon::::dot_product(s_hi, first_row_hi); + + // SERIAL: complete s0 = first_row[0] * s0 + partial_dot. + let s0_val = split.s0; + split.s0 = s0_val * first_row[0] + partial_dot; + + // Rank-1 update: s_hi[j] += s0_old * v[j]. + let v = &neon.packed_sparse_v[r]; + let s_hi_mut: &mut [PackedKB; 15] = unsafe { transmute(&mut split.s_hi) }; + for j in 0..15 { + s_hi_mut[j] += s0_val * v[j]; + } + } + + *state = unsafe { split.to_packed_field_array() }; + } + + // --- Terminal full rounds --- + for round_constants in &neon.packed_terminal_rc { + for (s, &rc) in state.iter_mut().zip(round_constants.iter()) { + add_rc_and_sbox::(s, rc); + } + mds_fft_neon(state, lambda16); + } + } + + /// Compression mode: output = permute(input) + input. + #[inline(always)] + pub fn compress_in_place + InjectiveMonomial<3> + Send + Sync + 'static>( + &self, + state: &mut [R; 16], + ) { + let initial = *state; + // Use permute_mut for NEON dispatch. + Permutation::permute_mut(self, state); + for (s, init) in state.iter_mut().zip(initial) { + *s += init; + } + } +} + +impl + InjectiveMonomial<3> + Send + Sync + 'static> Permutation<[R; 16]> + for Poseidon1KoalaBear16 +{ + fn permute_mut(&self, input: &mut [R; 16]) { + // On aarch64+neon, dispatch to the NEON fast path when R is PackedKoalaBearNeon. + #[cfg(all(target_arch = "aarch64", target_feature = "neon"))] + { + if std::any::TypeId::of::() == std::any::TypeId::of::() { + // SAFETY: We have just confirmed via TypeId that R == PackedKB. + // Both types have the same size and alignment (PackedKB is repr(transparent)). + let neon_state: &mut [PackedKB; 16] = unsafe { &mut *(input as *mut [R; 16] as *mut [PackedKB; 16]) }; + self.permute_neon(neon_state); + return; + } + } + self.permute_generic(input); + } +} + +pub fn default_koalabear_poseidon1_16() -> Poseidon1KoalaBear16 { + Poseidon1KoalaBear16 { pre: precomputed() } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::KoalaBear; + use field::PrimeField32; + + #[test] + fn test_plonky3_compatibility() { + /* + use p3_symmetric::Permutation; + + use crate::{KoalaBear, default_koalabear_poseidon1_16}; + + #[test] + fn plonky3_test() { + let poseidon1 = default_koalabear_poseidon1_16(); + let mut input: [KoalaBear; 16] = + KoalaBear::new_array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + poseidon1.permute_mut(&mut input); + dbg!(&input); + } + + */ + let p1 = default_koalabear_poseidon1_16(); + let mut input: [KoalaBear; 16] = KoalaBear::new_array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + p1.permute_mut(&mut input); + let vals: Vec = input.iter().map(|x| x.as_canonical_u32()).collect(); + assert_eq!( + vals, + vec![ + 610090613, 935319874, 1893335292, 796792199, 356405232, 552237741, 55134556, 1215104204, 1823723405, + 1133298033, 1780633798, 1453946561, 710069176, 1128629550, 1917333254, 1175481618, + ] + ); + } +} diff --git a/crates/backend/koala-bear/src/poseidon2/external.rs b/crates/backend/koala-bear/src/poseidon2/external.rs deleted file mode 100644 index 0f1a4a88..00000000 --- a/crates/backend/koala-bear/src/poseidon2/external.rs +++ /dev/null @@ -1,329 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! External layers for the Poseidon2 permutation. -//! -//! Poseidon2 applies *external layers* at both the beginning and end of the permutation. -//! These layers are critical for ensuring proper diffusion and enhancing security, -//! particularly against structural and algebraic attacks. -//! -//! An external round consists of: -//! 1. Addition of round constants, -//! 2. Application of a nonlinear S-box, -//! 3. A lightweight matrix multiplication (external linear layer). -//! -//! The constants and linear transformations used in these rounds are designed -//! to complement the internal structure of Poseidon2. -//! -//! Main purpose of these constants: -//! - Inject randomness between rounds. - -use alloc::vec::Vec; - -use crate::symmetric::{MdsPermutation, Permutation}; -use field::{Field, PrimeCharacteristicRing}; -use rand::distr::{Distribution, StandardUniform}; -use rand::{Rng, RngExt}; - -/// Multiply a 4-element vector x by -/// [ 5 7 1 3 ] -/// [ 4 6 1 1 ] -/// [ 1 3 5 7 ] -/// [ 1 1 4 6 ]. -/// This uses the formula from the start of Appendix B in the Poseidon2 paper, with multiplications unrolled into additions. -/// It is also the matrix used by the Horizon Labs implementation. -#[inline(always)] -fn apply_hl_mat4(x: &mut [R; 4]) -where - R: PrimeCharacteristicRing, -{ - let t0 = x[0] + x[1]; - let t1 = x[2] + x[3]; - let t2 = x[1].double() + t1; - let t3 = x[3].double() + t0; - let t4 = t1.double().double() + t3; - let t5 = t0.double().double() + t2; - let t6 = t3 + t5; - let t7 = t2 + t4; - x[0] = t6; - x[1] = t5; - x[2] = t7; - x[3] = t4; -} - -// It turns out we can find a 4x4 matrix which is more efficient than the above. - -/// Multiply a 4-element vector x by: -/// [ 2 3 1 1 ] -/// [ 1 2 3 1 ] -/// [ 1 1 2 3 ] -/// [ 3 1 1 2 ]. -#[inline(always)] -fn apply_mat4(x: &mut [R; 4]) -where - R: PrimeCharacteristicRing, -{ - let t01 = x[0] + x[1]; - let t23 = x[2] + x[3]; - let t0123 = t01 + t23; - let t01123 = t0123 + x[1]; - let t01233 = t0123 + x[3]; - // The order here is important. Need to overwrite x[0] and x[2] after x[1] and x[3]. - x[3] = t01233 + x[0].double(); // 3*x[0] + x[1] + x[2] + 2*x[3] - x[1] = t01123 + x[2].double(); // x[0] + 2*x[1] + 3*x[2] + x[3] - x[0] = t01123 + t01; // 2*x[0] + 3*x[1] + x[2] + x[3] - x[2] = t01233 + t23; // x[0] + x[1] + 2*x[2] + 3*x[3] -} - -/// The 4x4 MDS matrix used by the Horizon Labs implementation of Poseidon2. -/// -/// This requires 10 additions and 4 doubles to compute. -#[derive(Clone, Default)] -pub struct HLMDSMat4; - -impl Permutation<[R; 4]> for HLMDSMat4 { - #[inline(always)] - fn permute_mut(&self, input: &mut [R; 4]) { - apply_hl_mat4(input) - } -} -impl MdsPermutation for HLMDSMat4 {} - -/// The fastest 4x4 MDS matrix. -/// -/// This requires 7 additions and 2 doubles to compute. -#[derive(Clone, Default)] -pub struct MDSMat4; - -impl Permutation<[R; 4]> for MDSMat4 { - #[inline(always)] - fn permute_mut(&self, input: &mut [R; 4]) { - apply_mat4(input) - } -} -impl MdsPermutation for MDSMat4 {} - -/// Implement the matrix multiplication used by the external layer. -/// -/// Given a 4x4 MDS matrix M, we multiply by the `4N x 4N` matrix -/// `[[2M M ... M], [M 2M ... M], ..., [M M ... 2M]]`. -/// -/// # Panics -/// This will panic if `WIDTH` is not supported. Currently, the -/// supported `WIDTH` values are 2, 3, 4, 8, 12, 16, 20, 24.` -#[inline(always)] -pub fn mds_light_permutation, const WIDTH: usize>( - state: &mut [R; WIDTH], - mdsmat: &MdsPerm4, -) { - match WIDTH { - 2 => { - let sum = state[0] + state[1]; - state[0] += sum; - state[1] += sum; - } - - 3 => { - let sum = state[0] + state[1] + state[2]; - state[0] += sum; - state[1] += sum; - state[2] += sum; - } - - 4 | 8 | 12 | 16 | 20 | 24 => { - // First, we apply M_4 to each consecutive four elements of the state. - // In Appendix B's terminology, this replaces each x_i with x_i'. - for chunk in state.chunks_exact_mut(4) { - mdsmat.permute_mut(chunk.try_into().unwrap()); - } - // Now, we apply the outer circulant matrix (to compute the y_i values). - - // We first precompute the four sums of every four elements. - let sums: [R; 4] = core::array::from_fn(|k| (0..WIDTH).step_by(4).map(|j| state[j + k]).sum()); - - // The formula for each y_i involves 2x_i' term and x_j' terms for each j that equals i mod 4. - // In other words, we can add a single copy of x_i' to the appropriate one of our precomputed sums - state.iter_mut().enumerate().for_each(|(i, elem)| *elem += sums[i % 4]); - } - - _ => { - panic!("Unsupported width"); - } - } -} - -/// A struct which stores round-specific constants for both initial and terminal external layers. -#[derive(Debug, Clone)] -pub struct ExternalLayerConstants { - /// Constants applied during each initial external round. - /// - /// Used in `permute_state_initial`. Each `[T; WIDTH]` is a full-width vector of constants. - initial: Vec<[T; WIDTH]>, - - /// Constants applied during each terminal external round. - /// - /// Used in `permute_state_terminal`. The term "terminal" avoids using Rust’s reserved word `final`. - terminal: Vec<[T; WIDTH]>, -} - -impl ExternalLayerConstants { - /// Create a new instance of external layer constants. - /// - /// # Panics - /// Panics if `initial.len() != terminal.len()` since the Poseidon2 spec requires - /// the same number of initial and terminal rounds to maintain symmetry. - pub const fn new(initial: Vec<[T; WIDTH]>, terminal: Vec<[T; WIDTH]>) -> Self { - assert!( - initial.len() == terminal.len(), - "The number of initial and terminal external rounds should be equal." - ); - Self { initial, terminal } - } - - /// Randomly generate a new set of external constants using a provided RNG. - /// - /// # Arguments - /// - `external_round_number`: Total number of external rounds (must be even). - /// - `rng`: A random number generator that supports uniform sampling. - /// - /// The constants are split equally between the initial and terminal rounds. - /// - /// # Panics - /// Panics if `external_round_number` is not even. - pub fn new_from_rng(external_round_number: usize, rng: &mut R) -> Self - where - StandardUniform: Distribution<[T; WIDTH]>, - { - let half = external_round_number / 2; - assert_eq!( - 2 * half, - external_round_number, - "The total number of external rounds should be even" - ); - let initial_constants = rng.sample_iter(StandardUniform).take(half).collect(); - let terminal_constants = rng.sample_iter(StandardUniform).take(half).collect(); - - Self::new(initial_constants, terminal_constants) - } - - /// Construct constants from statically stored arrays, using a conversion function. - /// - /// This is useful when deserializing precomputed constants or embedding - /// them directly in the codebase (e.g., from `[[[u32; WIDTH]; N]; 2]` arrays). - /// - /// # Arguments - /// - `initial`, `terminal`: Two fixed-size arrays of size `N` containing round constants. - /// - `conversion_fn`: A function to convert from the source type `U` to `T`. - pub fn new_from_saved_array( - [initial, terminal]: [[[U; WIDTH]; N]; 2], - conversion_fn: fn([U; WIDTH]) -> [T; WIDTH], - ) -> Self - where - T: Clone, - { - let initial_consts = initial.map(conversion_fn).to_vec(); - let terminal_consts = terminal.map(conversion_fn).to_vec(); - Self::new(initial_consts, terminal_consts) - } - - /// Get a reference to the list of initial round constants. - /// - /// These are used in the first half of the external rounds. - pub const fn get_initial_constants(&self) -> &Vec<[T; WIDTH]> { - &self.initial - } - - /// Get a reference to the list of terminal round constants. - /// - /// These are used in the second half (terminal rounds) of the external layer. - pub const fn get_terminal_constants(&self) -> &Vec<[T; WIDTH]> { - &self.terminal - } -} - -/// Initialize an external layer from a set of constants. -pub trait ExternalLayerConstructor -where - F: Field, -{ - /// A constructor which internally will convert the supplied - /// constants into the appropriate form for the implementation. - fn new_from_constants(external_constants: ExternalLayerConstants) -> Self; -} - -/// A trait containing all data needed to implement the external layers of Poseidon2. -pub trait ExternalLayer: Sync + Clone -where - R: PrimeCharacteristicRing, -{ - // permute_state_initial, permute_state_terminal are split as the Poseidon2 specifications are slightly different - // with the initial rounds involving an extra matrix multiplication. - - /// Perform the initial external layers of the Poseidon2 permutation on the given state. - fn permute_state_initial(&self, state: &mut [R; WIDTH]); - - /// Perform the terminal external layers of the Poseidon2 permutation on the given state. - fn permute_state_terminal(&self, state: &mut [R; WIDTH]); -} - -/// Applies the terminal external rounds of the Poseidon2 permutation. -/// -/// Each external round consists of three steps: -/// 1. Adding round constants to each element of the state. -/// 2. Apply the S-box to each element of the state. -/// 3. Applying an external linear layer (based on a `4x4` MDS matrix). -/// -/// # Parameters -/// - `state`: The current state of the permutation (size `WIDTH`). -/// - `terminal_external_constants`: Per-round constants which are added to each state element. -/// - `add_rc_and_sbox`: A function that adds the round constant and applies the S-box to a given element. -/// - `mat4`: The 4x4 MDS matrix used in the external linear layer. -#[inline] -pub fn external_terminal_permute_state< - R: PrimeCharacteristicRing, - CT: Copy, // Whatever type the constants are stored as. - MdsPerm4: MdsPermutation, - const WIDTH: usize, ->( - state: &mut [R; WIDTH], - terminal_external_constants: &[[CT; WIDTH]], - add_rc_and_sbox: fn(&mut R, CT), - mat4: &MdsPerm4, -) { - for elem in terminal_external_constants { - state - .iter_mut() - .zip(elem.iter()) - .for_each(|(s, &rc)| add_rc_and_sbox(s, rc)); - mds_light_permutation(state, mat4); - } -} - -/// Applies the initial external rounds of the Poseidon2 permutation. -/// -/// Apply the external linear layer and run a sequence of standard external rounds consisting of -/// 1. Adding round constants to each element of the state. -/// 2. Apply the S-box to each element of the state. -/// 3. Applying an external linear layer (based on a `4x4` MDS matrix). -/// -/// # Parameters -/// - `state`: The state array at the start of the permutation. -/// - `initial_external_constants`: Per-round constants which are added to each state element. -/// - `add_rc_and_sbox`: A function that adds the round constant and applies the S-box to a given element. -/// - `mat4`: The 4x4 MDS matrix used in the external linear layer. -#[inline] -pub fn external_initial_permute_state< - R: PrimeCharacteristicRing, - CT: Copy, // Whatever type the constants are stored as. - MdsPerm4: MdsPermutation, - const WIDTH: usize, ->( - state: &mut [R; WIDTH], - initial_external_constants: &[[CT; WIDTH]], - add_rc_and_sbox: fn(&mut R, CT), - mat4: &MdsPerm4, -) { - mds_light_permutation(state, mat4); - // After the initial mds_light_permutation, the remaining layers are identical - // to the terminal permutation simply with different constants. - external_terminal_permute_state(state, initial_external_constants, add_rc_and_sbox, mat4) -} diff --git a/crates/backend/koala-bear/src/poseidon2/generic.rs b/crates/backend/koala-bear/src/poseidon2/generic.rs deleted file mode 100644 index cbe21775..00000000 --- a/crates/backend/koala-bear/src/poseidon2/generic.rs +++ /dev/null @@ -1,42 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! Whilst high speed implementations of Poseidon2 rely on a detailed understanding of the underlying field structure -//! it is also useful to have a generic constructor which works for a much larger range of rings. -//! -//! Indeed, for a fixed field F, the Poseidon2 permutation consists of three basic operations: -//! - Addition by elements in F. -//! - A power map x -> x^n. -//! - Multiplication by an F valued matrix. -//! -//! This means that it is possible to define a Poseidon2 over any ring implementing `Algebra`. -//! -//! This file implements the generic methods from which Poseidon2 can be built. - -use field::{Algebra, Field, InjectiveMonomial, PrimeCharacteristicRing}; - -use crate::{MDSMat4, mds_light_permutation}; - -/// A generic method performing the transformation: -/// -/// `s -> (s + rc)^D` -/// -/// This is a little slower than field specific implementations (particularly for packed fields) so should -/// only be used in non performance critical places. -#[inline(always)] -pub fn add_rc_and_sbox_generic + InjectiveMonomial, const D: u64>(val: &mut A, rc: F) { - *val += rc; - *val = val.injective_exp_n(); -} - -pub trait GenericPoseidon2LinearLayers: Sync { - /// A generic implementation of the matrix multiplication - /// corresponding to the internal linear layer. - fn internal_linear_layer(state: &mut [R; WIDTH]); - - /// A generic implementation of the matrix multiplication - /// corresponding to the external linear layer. - #[inline(always)] - fn external_linear_layer(state: &mut [R; WIDTH]) { - mds_light_permutation(state, &MDSMat4); - } -} diff --git a/crates/backend/koala-bear/src/poseidon2/internal.rs b/crates/backend/koala-bear/src/poseidon2/internal.rs deleted file mode 100644 index a937c592..00000000 --- a/crates/backend/koala-bear/src/poseidon2/internal.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! Inside the Poseidon2 paper, they describe that the internal layers of the hash -//! function do not require the full properties of MDS matrices. -//! -//! > For the partial rounds, the MDS property is not required anymore, and -//! > we can set up the matrix MI focusing only on providing full diffusion, breaking -//! > arbitrarily long subspace trails, and ensuring that the polynomial representation -//! > of the scheme is dense. (Section 5.2) -//! -//! This file implements a trait for linear layers that satisfy these three properties. - -// The requirements translate to the following 3 properties: -// 1: All entries are non 0. -// 2: No Subspace Trails. -// 3: For a matrix of the form 1 + D, the diagonal D should also be non 0. -// -// Properties 1 and 3 are essentially immediate to check and a sufficient condition for property 2 -// is that the minimal polynomial of the matrix M and all its powers M^2, ..., M^{2WIDTH} are maximal and irreducible. -// This is equivalent to all the characteristic polynomials being irreducible. -// -// These can be verified by the following sage code (Changing field/vector/length as desired): -// -// field = GF(2^31 - 1); -// length = 16; -// vector = [-2, 1, 2, 4, 8, 16, 32, 64, 128, 256, 1024, 4096, 8192, 16384, 32768, 65536]; -// const_mat = matrix.ones(field, length); -// diag_mat = diagonal_matrix(field, vector); -// for i in range(1, 2 * length + 1) -// assert ((const_mat + diag_mat)^i).characteristic_polynomial().is_irreducible() - -use alloc::vec::Vec; - -use field::{Algebra, Field, InjectiveMonomial, PrimeCharacteristicRing}; - -use crate::add_rc_and_sbox_generic; - -/// Initialize an internal layer from a set of constants. -pub trait InternalLayerConstructor -where - F: Field, -{ - /// A constructor which internally will convert the supplied - /// constants into the appropriate form for the implementation. - fn new_from_constants(internal_constants: Vec) -> Self; -} - -/// Given a vector v compute the matrix vector product (1 + diag(v))state with 1 denoting the constant matrix of ones. -pub fn matmul_internal, const WIDTH: usize>( - state: &mut [A; WIDTH], - mat_internal_diag_m_1: [F; WIDTH], -) { - let sum = A::sum_array::(state); - for i in 0..WIDTH { - state[i] *= mat_internal_diag_m_1[i]; - state[i] += sum; - } -} - -/// A trait containing all data needed to implement the internal layers of Poseidon2. -pub trait InternalLayer: Sync + Clone -where - R: PrimeCharacteristicRing, -{ - /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [R; WIDTH]); -} - -/// A helper method which allows any field to easily implement Internal Layer. -/// This should only be used in places where performance is not critical. -#[inline] -pub fn internal_permute_state + InjectiveMonomial, const WIDTH: usize, const D: u64>( - state: &mut [A; WIDTH], - diffusion_mat: fn(&mut [A; WIDTH]), - internal_constants: &[F], -) { - for elem in internal_constants { - add_rc_and_sbox_generic(&mut state[0], *elem); - diffusion_mat(state); - } -} diff --git a/crates/backend/koala-bear/src/poseidon2/mod.rs b/crates/backend/koala-bear/src/poseidon2/mod.rs deleted file mode 100644 index c1edc6fe..00000000 --- a/crates/backend/koala-bear/src/poseidon2/mod.rs +++ /dev/null @@ -1,105 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! The Poseidon2 permutation. - -mod external; -mod generic; -mod internal; -mod round_numbers; -use alloc::vec::Vec; -use core::marker::PhantomData; - -pub use external::*; -use field::{Algebra, InjectiveMonomial, PrimeField, PrimeField64}; -pub use generic::*; -pub use internal::*; -use rand::distr::{Distribution, StandardUniform}; -use rand::{Rng, RngExt}; -pub use round_numbers::poseidon2_round_numbers_128; - -const SUPPORTED_WIDTHS: [usize; 8] = [2, 3, 4, 8, 12, 16, 20, 24]; - -/// The Poseidon2 permutation. -#[derive(Clone, Debug)] -pub struct Poseidon2 { - /// The permutations used in External Rounds. - external_layer: ExternalPerm, - - /// The permutation used in Internal Rounds. - internal_layer: InternalPerm, - - _phantom: PhantomData, -} - -impl Poseidon2 -where - F: PrimeField, - ExternalPerm: ExternalLayerConstructor, - InternalPerm: InternalLayerConstructor, -{ - /// Create a new Poseidon2 configuration. - /// This internally converts the given constants to the relevant packed versions. - pub fn new(external_constants: ExternalLayerConstants, internal_constants: Vec) -> Self { - assert!(SUPPORTED_WIDTHS.contains(&WIDTH)); - let external_layer = ExternalPerm::new_from_constants(external_constants); - let internal_layer = InternalPerm::new_from_constants(internal_constants); - - Self { - external_layer, - internal_layer, - _phantom: PhantomData, - } - } - - /// Create a new Poseidon2 configuration with random parameters. - pub fn new_from_rng(rounds_f: usize, rounds_p: usize, rng: &mut R) -> Self - where - StandardUniform: Distribution + Distribution<[F; WIDTH]>, - { - let external_constants = ExternalLayerConstants::new_from_rng(rounds_f, rng); - let internal_constants = rng.sample_iter(StandardUniform).take(rounds_p).collect(); - - Self::new(external_constants, internal_constants) - } -} - -impl Poseidon2 -where - F: PrimeField64, - ExternalPerm: ExternalLayerConstructor, - InternalPerm: InternalLayerConstructor, -{ - /// Create a new Poseidon2 configuration with 128 bit security and random rounds constants. - /// - /// # Panics - /// This will panic if D and F::ORDER_U64 - 1 are not relatively prime. - /// This will panic if the optimal parameters for the given field and width have not been computed. - pub fn new_from_rng_128(rng: &mut R) -> Self - where - StandardUniform: Distribution + Distribution<[F; WIDTH]>, - { - let round_numbers = poseidon2_round_numbers_128::(WIDTH, D); - let (rounds_f, rounds_p) = round_numbers.unwrap_or_else(|e| panic!("{e}")); - Self::new_from_rng(rounds_f, rounds_p, rng) - } -} - -impl, ExternalPerm, InternalPerm, const WIDTH: usize, const D: u64> - Poseidon2 -{ - /// Poseidon2 compression: output = Poseidon2(input) + input - pub fn compress_in_place(&self, state: &mut [A; WIDTH]) - where - A: Algebra + Sync + InjectiveMonomial, - ExternalPerm: ExternalLayer, - InternalPerm: InternalLayer, - { - let initial_state = *state; - self.external_layer.permute_state_initial(state); - self.internal_layer.permute_state(state); - self.external_layer.permute_state_terminal(state); - state.iter_mut().zip(initial_state).for_each(|(s, i)| { - *s += i; - }); - } -} diff --git a/crates/backend/koala-bear/src/poseidon2/round_numbers.rs b/crates/backend/koala-bear/src/poseidon2/round_numbers.rs deleted file mode 100644 index f5bcd20c..00000000 --- a/crates/backend/koala-bear/src/poseidon2/round_numbers.rs +++ /dev/null @@ -1,82 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! As the security analysis of Poseidon2 is identical to that of Poseidon, -//! the relevant constraints regarding the number of full/partial rounds required can be found in -//! the original paper: `` and the associated codebase: -//! `` (See generate_params_poseidon.sage) -//! -//! These constraints are broken down into 6 equations: -//! statistical, interpolation, Gröbner 1, 2, 3 and -//! an extra constraint coming from the paper ``. -//! -//! For our parameters (M = 128, p > 2^30, WIDTH = t >= 8, D = alpha < 12), -//! the statistical constraint always simplifies to requiring RF >= 6. -//! Additionally p does not appear in Gröbner 3 or the constraint coming from ``. -//! The remaining 3 constraints all can be rearranged into the form: -//! F(RF, RP) >= G(p) where G is a function which is non-decreasing with respect to p. -//! -//! Thus, if some tuple (M, p, WIDTH, D, RF, RP) satisfies all constraints, then so will -//! the tuple (M, q, WIDTH, D, RF, RP) for any 2^30 < q < p. -//! Moreover if RF, RP are the "optimal" round numbers (Optimal meaning minimising the number of S-box operations we need to perform) -//! for two tuples (M, p, WIDTH, D) and (M, q, WIDTH, D), then -//! they will also be optimal for (M, r, WIDTH, D) for any q < r < p. -//! -//! We compute the optimal required number of external (full) and internal (partial) rounds using: -//! `` -//! Using the above analysis we can conclude that the round numbers are equal -//! for all 31 bit primes and 64 bit primes respectively. - -use field::PrimeField64; -use utils::relatively_prime_u64; - -/// Given a field, a width and an D return the number of full and partial rounds needed to achieve 128 bit security. -/// -/// If d is not a valid permutation of the given field or the optimal parameters for that size of prime -/// have not been computed, an error is returned. -pub const fn poseidon2_round_numbers_128( - width: usize, - d: u64, -) -> Result<(usize, usize), &'static str> { - // Start by checking that d is a valid permutation. - if !relatively_prime_u64(d, F::ORDER_U64 - 1) { - return Err("Invalid permutation: gcd(d, F::ORDER_U64 - 1) must be 1"); - } - - // Next compute the number of bits in p. - let prime_bit_number = F::ORDER_U64.ilog2() + 1; - - match prime_bit_number { - 31 => match (width, d) { - (16, 3) => Ok((8, 20)), - (16, 5) => Ok((8, 14)), - (16, 7) => Ok((8, 13)), - (16, 9) => Ok((8, 13)), - (16, 11) => Ok((8, 13)), - (24, 3) => Ok((8, 23)), - (24, 5) => Ok((8, 22)), - (24, 7) => Ok((8, 21)), - (24, 9) => Ok((8, 21)), - (24, 11) => Ok((8, 21)), - _ => Err("The given pair of width and D has not been checked for these fields"), - }, - 64 => match (width, d) { - (8, 3) => Ok((8, 41)), - (8, 5) => Ok((8, 27)), - (8, 7) => Ok((8, 22)), - (8, 9) => Ok((8, 19)), - (8, 11) => Ok((8, 17)), - (12, 3) => Ok((8, 42)), - (12, 5) => Ok((8, 27)), - (12, 7) => Ok((8, 22)), - (12, 9) => Ok((8, 20)), - (12, 11) => Ok((8, 18)), - (16, 3) => Ok((8, 42)), - (16, 5) => Ok((8, 27)), - (16, 7) => Ok((8, 22)), - (16, 9) => Ok((8, 20)), - (16, 11) => Ok((8, 18)), - _ => Err("The given pair of width and D has not been checked for these fields"), - }, - _ => Err("The optimal parameters for that size of prime have not been computed."), - } -} diff --git a/crates/backend/koala-bear/src/poseidon2_koalabear.rs b/crates/backend/koala-bear/src/poseidon2_koalabear.rs deleted file mode 100644 index 01144859..00000000 --- a/crates/backend/koala-bear/src/poseidon2_koalabear.rs +++ /dev/null @@ -1,292 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -//! Implementation of Poseidon2, see: https://eprint.iacr.org/2023/323 -//! -//! For the diffusion matrix, 1 + Diag(V), we perform a search to find an optimized -//! vector V composed of elements with efficient multiplication algorithms in AVX2/AVX512/NEON. -//! -//! This leads to using small values (e.g. 1, 2, 3, 4) where multiplication is implemented using addition -//! and inverse powers of 2 where it is possible to avoid monty reductions. -//! Additionally, for technical reasons, having the first entry be -2 is useful. -//! -//! Optimized Diagonal for KoalaBear16: -//! [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/8, 1/2^24, -1/2^8, -1/8, -1/16, -1/2^24] -//! Optimized Diagonal for KoalaBear24: -//! [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24, -1/2^8, -1/8, -1/16, -1/32, -1/64, -1/2^7, -1/2^9, -1/2^24] -//! See poseidon2\src\diffusion.rs for information on how to double check these matrices in Sage. - -use crate::monty_31::poseidon2_monty::{ - GenericPoseidon2LinearLayersMonty31, InternalLayerBaseParameters, InternalLayerParameters, -}; -use crate::poseidon2::{ExternalLayerConstants, Poseidon2}; -use crate::{Poseidon2ExternalLayerMonty31, Poseidon2InternalLayerMonty31}; -use field::PrimeCharacteristicRing; - -use crate::{KoalaBear, KoalaBearParameters}; - -pub type Poseidon2InternalLayerKoalaBear = - Poseidon2InternalLayerMonty31; - -pub type Poseidon2ExternalLayerKoalaBear = - Poseidon2ExternalLayerMonty31; - -/// Degree of the chosen permutation polynomial for KoalaBear, used as the Poseidon2 S-Box. -/// -/// As p - 1 = 127 * 2^{24} we have a lot of choice in degree D satisfying gcd(p - 1, D) = 1. -/// Experimentation suggests that the optimal choice is the smallest available one, namely 3. -const KOALABEAR_S_BOX_DEGREE: u64 = 3; - -/// An implementation of the Poseidon2 hash function specialised to run on the current architecture. -/// -/// It acts on arrays of the form either `[KoalaBear::Packing; WIDTH]` or `[KoalaBear; WIDTH]`. For speed purposes, -/// wherever possible, input arrays should of the form `[KoalaBear::Packing; WIDTH]`. -pub type Poseidon2KoalaBear = Poseidon2< - KoalaBear, - Poseidon2ExternalLayerKoalaBear, - Poseidon2InternalLayerKoalaBear, - WIDTH, - KOALABEAR_S_BOX_DEGREE, ->; - -/// An implementation of the matrix multiplications in the internal and external layers of Poseidon2. -/// -/// This can act on `[A; WIDTH]` for any ring implementing `Algebra`. -/// If you have either `[KoalaBear::Packing; WIDTH]` or `[KoalaBear; WIDTH]` it will be much faster -/// to use `Poseidon2KoalaBear` instead of building a Poseidon2 permutation using this. -pub type GenericPoseidon2LinearLayersKoalaBear = - GenericPoseidon2LinearLayersMonty31; - -/// Initial round constants for the 16-width Poseidon2 external layer on KoalaBear. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub const KOALABEAR_RC16_EXTERNAL_INITIAL: [[KoalaBear; 16]; 4] = KoalaBear::new_2d_array([ - [ - 2128964168, 288780357, 316938561, 2126233899, 426817493, 1714118888, 1045008582, 1738510837, 889721787, - 8866516, 681576474, 419059826, 1596305521, 1583176088, 1584387047, 1529751136, - ], - [ - 1863858111, 1072044075, 517831365, 1464274176, 1138001621, 428001039, 245709561, 1641420379, 1365482496, - 770454828, 693167409, 757905735, 136670447, 436275702, 525466355, 1559174242, - ], - [ - 1030087950, 869864998, 322787870, 267688717, 948964561, 740478015, 679816114, 113662466, 2066544572, - 1744924186, 367094720, 1380455578, 1842483872, 416711434, 1342291586, 1692058446, - ], - [ - 1493348999, 1113949088, 210900530, 1071655077, 610242121, 1136339326, 2020858841, 1019840479, 678147278, - 1678413261, 1361743414, 61132629, 1209546658, 64412292, 1936878279, 1980661727, - ], -]); - -/// Final round constants for the 16-width Poseidon2's external layer on KoalaBear. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub const KOALABEAR_RC16_EXTERNAL_FINAL: [[KoalaBear; 16]; 4] = KoalaBear::new_2d_array([ - [ - 1423960925, 2101391318, 1915532054, 275400051, 1168624859, 1141248885, 356546469, 1165250474, 1320543726, - 932505663, 1204226364, 1452576828, 1774936729, 926808140, 1184948056, 1186493834, - ], - [ - 843181003, 185193011, 452207447, 510054082, 1139268644, 630873441, 669538875, 462500858, 876500520, 1214043330, - 383937013, 375087302, 636912601, 307200505, 390279673, 1999916485, - ], - [ - 1518476730, 1606686591, 1410677749, 1581191572, 1004269969, 143426723, 1747283099, 1016118214, 1749423722, - 66331533, 1177761275, 1581069649, 1851371119, 852520128, 1499632627, 1820847538, - ], - [ - 150757557, 884787840, 619710451, 1651711087, 505263814, 212076987, 1482432120, 1458130652, 382871348, - 417404007, 2066495280, 1996518884, 902934924, 582892981, 1337064375, 1199354861, - ], -]); - -/// Round constants for the 16-width Poseidon2's internal layer on KoalaBear. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub const KOALABEAR_RC16_INTERNAL: [KoalaBear; 20] = KoalaBear::new_array([ - 2102596038, 1533193853, 1436311464, 2012303432, 839997195, 1225781098, 2011967775, 575084315, 1309329169, - 786393545, 995788880, 1702925345, 1444525226, 908073383, 1811535085, 1531002367, 1635653662, 1585100155, 867006515, - 879151050, -]); - -/// A default Poseidon2 for KoalaBear using the round constants from the original specification. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub fn default_koalabear_poseidon2_16() -> Poseidon2KoalaBear<16> { - Poseidon2::new( - ExternalLayerConstants::new( - KOALABEAR_RC16_EXTERNAL_INITIAL.to_vec(), - KOALABEAR_RC16_EXTERNAL_FINAL.to_vec(), - ), - KOALABEAR_RC16_INTERNAL.to_vec(), - ) -} - -/// Initial round constants for the 24-width Poseidon2 external layer on KoalaBear. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub const KOALABEAR_RC24_EXTERNAL_INITIAL: [[KoalaBear; 24]; 4] = KoalaBear::new_2d_array([ - [ - 487143900, 1829048205, 1652578477, 646002781, 1044144830, 53279448, 1519499836, 22697702, 1768655004, - 230479744, 1484895689, 705130286, 1429811285, 1695785093, 1417332623, 1115801016, 1048199020, 878062617, - 738518649, 249004596, 1601837737, 24601614, 245692625, 364803730, - ], - [ - 1857019234, 1906668230, 1916890890, 835590867, 557228239, 352829675, 515301498, 973918075, 954515249, - 1142063750, 1795549558, 608869266, 1850421928, 2028872854, 1197543771, 1027240055, 1976813168, 963257461, - 652017844, 2113212249, 213459679, 90747280, 1540619478, 324138382, - ], - [ - 1377377119, 294744504, 512472871, 668081958, 907306515, 518526882, 1907091534, 1152942192, 1572881424, - 720020214, 729527057, 1762035789, 86171731, 205890068, 453077400, 1201344594, 986483134, 125174298, 2050269685, - 1895332113, 749706654, 40566555, 742540942, 1735551813, - ], - [ - 162985276, 1943496073, 1469312688, 703013107, 1979485151, 1278193166, 548674995, 2118718736, 749596440, - 1476142294, 1293606474, 918523452, 890353212, 1691895663, 1932240646, 1180911992, 86098300, 1592168978, - 895077289, 724819849, 1697986774, 1608418116, 1083269213, 691256798, - ], -]); - -/// Final round constants for the 24-width Poseidon2's external layer on KoalaBear. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub const KOALABEAR_RC24_EXTERNAL_FINAL: [[KoalaBear; 24]; 4] = KoalaBear::new_2d_array([ - [ - 328586442, 1572520009, 1375479591, 322991001, 967600467, 1172861548, 1973891356, 1503625929, 1881993531, - 40601941, 1155570620, 571547775, 1361622243, 1495024047, 1733254248, 964808915, 763558040, 1887228519, - 994888261, 718330940, 213359415, 603124968, 1038411577, 2099454809, - ], - [ - 949846777, 630926956, 1168723439, 222917504, 1527025973, 1009157017, 2029957881, 805977836, 1347511739, - 540019059, 589807745, 440771316, 1530063406, 761076336, 87974206, 1412686751, 1230318064, 514464425, - 1469011754, 1770970737, 1510972858, 965357206, 209398053, 778802532, - ], - [ - 40567006, 1984217577, 1545851069, 879801839, 1611910970, 1215591048, 330802499, 1051639108, 321036, 511927202, - 591603098, 1775897642, 115598532, 278200718, 233743176, 525096211, 1335507608, 830017835, 1380629279, - 560028578, 598425701, 302162385, 567434115, 1859222575, - ], - [ - 958294793, 1582225556, 1781487858, 1570246000, 1067748446, 526608119, 1666453343, 1786918381, 348203640, - 1860035017, 1489902626, 1904576699, 860033965, 1954077639, 1685771567, 971513929, 1877873770, 137113380, - 520695829, 806829080, 1408699405, 1613277964, 793223662, 648443918, - ], -]); - -/// Round constants for the 24-width Poseidon2's internal layer on KoalaBear. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub const KOALABEAR_RC24_INTERNAL: [KoalaBear; 23] = KoalaBear::new_array([ - 893435011, 403879071, 1363789863, 1662900517, 2043370, 2109755796, 931751726, 2091644718, 606977583, 185050397, - 946157136, 1350065230, 1625860064, 122045240, 880989921, 145137438, 1059782436, 1477755661, 335465138, 1640704282, - 1757946479, 1551204074, 681266718, -]); - -/// A default Poseidon2 for KoalaBear using the round constants from the original specification. -/// -/// See Poseidon paper for more details: https://eprint.iacr.org/2019/458 -/// Sage script used to generate these constants: https://github.com/HorizenLabs/poseidon2/blob/main/poseidon2_rust_params.sage -pub fn default_koalabear_poseidon2_24() -> Poseidon2KoalaBear<24> { - Poseidon2::new( - ExternalLayerConstants::new( - KOALABEAR_RC24_EXTERNAL_INITIAL.to_vec(), - KOALABEAR_RC24_EXTERNAL_FINAL.to_vec(), - ), - KOALABEAR_RC24_INTERNAL.to_vec(), - ) -} - -/// Contains data needed to define the internal layers of the Poseidon2 permutation. -#[derive(Debug, Clone, Default)] -pub struct KoalaBearInternalLayerParameters; - -impl InternalLayerBaseParameters for KoalaBearInternalLayerParameters { - /// Perform the internal matrix multiplication: s -> (1 + Diag(V))s. - /// We ignore `state[0]` as it is handled separately. - #[inline(always)] - fn internal_layer_mat_mul(state: &mut [R; 16], sum: R) { - // The diagonal matrix is defined by the vector: - // V = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/8, 1/2^24, -1/2^8, -1/8, -1/16, -1/2^24] - state[1] += sum; - state[2] = state[2].double() + sum; - state[3] = state[3].halve() + sum; - state[4] = sum + state[4].double() + state[4]; - state[5] = sum + state[5].double().double(); - state[6] = sum - state[6].halve(); - state[7] = sum - (state[7].double() + state[7]); - state[8] = sum - state[8].double().double(); - state[9] = state[9].div_2exp_u64(8); - state[9] += sum; - state[10] = state[10].div_2exp_u64(3); - state[10] += sum; - state[11] = state[11].div_2exp_u64(24); - state[11] += sum; - state[12] = state[12].div_2exp_u64(8); - state[12] = sum - state[12]; - state[13] = state[13].div_2exp_u64(3); - state[13] = sum - state[13]; - state[14] = state[14].div_2exp_u64(4); - state[14] = sum - state[14]; - state[15] = state[15].div_2exp_u64(24); - state[15] = sum - state[15]; - } -} - -impl InternalLayerBaseParameters for KoalaBearInternalLayerParameters { - /// Perform the internal matrix multiplication: s -> (1 + Diag(V))s. - /// We ignore `state[0]` as it is handled separately. - #[inline(always)] - fn internal_layer_mat_mul(state: &mut [R; 24], sum: R) { - // The diagonal matrix is defined by the vector: - // V = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24, -1/2^8, -1/8, -1/16, -1/32, -1/64, -1/2^7, -1/2^9, -1/2^24] - state[1] += sum; - state[2] = state[2].double() + sum; - state[3] = state[3].halve() + sum; - state[4] = sum + state[4].double() + state[4]; - state[5] = sum + state[5].double().double(); - state[6] = sum - state[6].halve(); - state[7] = sum - (state[7].double() + state[7]); - state[8] = sum - state[8].double().double(); - state[9] = state[9].div_2exp_u64(8); - state[9] += sum; - state[10] = state[10].div_2exp_u64(2); - state[10] += sum; - state[11] = state[11].div_2exp_u64(3); - state[11] += sum; - state[12] = state[12].div_2exp_u64(4); - state[12] += sum; - state[13] = state[13].div_2exp_u64(5); - state[13] += sum; - state[14] = state[14].div_2exp_u64(6); - state[14] += sum; - state[15] = state[15].div_2exp_u64(24); - state[15] += sum; - state[16] = state[16].div_2exp_u64(8); - state[16] = sum - state[16]; - state[17] = state[17].div_2exp_u64(3); - state[17] = sum - state[17]; - state[18] = state[18].div_2exp_u64(4); - state[18] = sum - state[18]; - state[19] = state[19].div_2exp_u64(5); - state[19] = sum - state[19]; - state[20] = state[20].div_2exp_u64(6); - state[20] = sum - state[20]; - state[21] = state[21].div_2exp_u64(7); - state[21] = sum - state[21]; - state[22] = state[22].div_2exp_u64(9); - state[22] = sum - state[22]; - state[23] = state[23].div_2exp_u64(24); - state[23] = sum - state[23]; - } -} - -impl InternalLayerParameters for KoalaBearInternalLayerParameters {} -impl InternalLayerParameters for KoalaBearInternalLayerParameters {} diff --git a/crates/backend/koala-bear/src/quintic_extension/packed_extension.rs b/crates/backend/koala-bear/src/quintic_extension/packed_extension.rs index 916fd112..c5c498a5 100644 --- a/crates/backend/koala-bear/src/quintic_extension/packed_extension.rs +++ b/crates/backend/koala-bear/src/quintic_extension/packed_extension.rs @@ -16,7 +16,8 @@ use serde::{Deserialize, Serialize}; use utils::{flatten_to_base, reconstitute_from_base}; use super::extension::QuinticExtensionField; -use crate::QuinticExtendable; +#[allow(unused_imports)] +use crate::{KoalaBear, QuinticExtendable}; #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize, PartialOrd, Ord)] #[repr(transparent)] // Needed to make various casts safe. @@ -78,6 +79,71 @@ impl> Algebra> Algebra for PackedQuinticExtensionField {} +#[allow(unused_macros)] +macro_rules! impl_packed_ext_scalar_ops { + ($pf:ty) => { + impl Add for PackedQuinticExtensionField { + type Output = Self; + #[inline] + fn add(mut self, rhs: KoalaBear) -> Self { + self.value[0] += rhs; + self + } + } + + impl AddAssign for PackedQuinticExtensionField { + #[inline] + fn add_assign(&mut self, rhs: KoalaBear) { + self.value[0] += rhs; + } + } + + impl Sub for PackedQuinticExtensionField { + type Output = Self; + #[inline] + fn sub(mut self, rhs: KoalaBear) -> Self { + self.value[0] -= rhs; + self + } + } + + impl SubAssign for PackedQuinticExtensionField { + #[inline] + fn sub_assign(&mut self, rhs: KoalaBear) { + self.value[0] -= rhs; + } + } + + impl Mul for PackedQuinticExtensionField { + type Output = Self; + #[inline] + fn mul(self, rhs: KoalaBear) -> Self { + Self { + value: self.value.map(|x| x * rhs), + } + } + } + + impl MulAssign for PackedQuinticExtensionField { + #[inline] + fn mul_assign(&mut self, rhs: KoalaBear) { + for v in &mut self.value { + *v *= rhs; + } + } + } + }; +} + +#[cfg(all(target_arch = "aarch64", target_feature = "neon"))] +impl_packed_ext_scalar_ops!(crate::PackedKoalaBearNeon); + +#[cfg(all(target_arch = "x86_64", target_feature = "avx2", not(target_feature = "avx512f")))] +impl_packed_ext_scalar_ops!(crate::PackedKoalaBearAVX2); + +#[cfg(all(target_arch = "x86_64", target_feature = "avx512f"))] +impl_packed_ext_scalar_ops!(crate::PackedKoalaBearAVX512); + impl PrimeCharacteristicRing for PackedQuinticExtensionField where F: QuinticExtendable, diff --git a/crates/backend/koala-bear/src/x86_64_avx2/mod.rs b/crates/backend/koala-bear/src/x86_64_avx2/mod.rs index 88f8fcf8..730a8675 100644 --- a/crates/backend/koala-bear/src/x86_64_avx2/mod.rs +++ b/crates/backend/koala-bear/src/x86_64_avx2/mod.rs @@ -1,6 +1,5 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). mod packing; -mod poseidon2; pub use packing::*; diff --git a/crates/backend/koala-bear/src/x86_64_avx2/poseidon2.rs b/crates/backend/koala-bear/src/x86_64_avx2/poseidon2.rs deleted file mode 100644 index 0f4f6bd3..00000000 --- a/crates/backend/koala-bear/src/x86_64_avx2/poseidon2.rs +++ /dev/null @@ -1,198 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -use core::arch::x86_64::{self, __m256i}; -use core::mem::transmute; - -use crate::{ - InternalLayerParametersAVX2, mul_2exp_neg_n_avx2, mul_2exp_neg_two_adicity_avx2, mul_neg_2exp_neg_n_avx2, - mul_neg_2exp_neg_two_adicity_avx2, -}; - -use crate::{KoalaBearInternalLayerParameters, KoalaBearParameters}; - -// Godbolt file showing that these all compile to the expected instructions. (Potentially plus a few memory ops): -// https://godbolt.org/z/xK91MKsdd - -// We reimplement multiplication by +/- 2^{-8} here as there is an extra trick we can do specifically in the KoalaBear case. -// This lets us replace a left shift by _mm256_bslli_epi128 which can be performed on Port 5. This takes a small amount -// of pressure off Ports 0, 1. - -/// Multiply a vector of Monty31 field elements in canonical form by 2**{-8}. -/// This is specialised to the KoalaBear prime which allows us to replace a -/// shifts by a twiddle. -/// # Safety -/// -/// Input must be given in canonical form. -/// Output is not in canonical form, outputs are only guaranteed to lie in (-P, P). -#[inline(always)] -unsafe fn mul_2exp_neg_8(input: __m256i) -> __m256i { - // We want this to compile to: - // vpsrld hi, val, 8 - // vpmaddubsw lo, val, [r; 8] - // vpslldq lo, lo, 2 - // vpsubd t, hi, lo - // throughput: 1.333 - // latency: 7 - unsafe { - const ONE_TWENTY_SEVEN: __m256i = unsafe { transmute([127; 8]) }; // P = r*2^j + 1 = 127 * 2^24 + 1 - let hi = x86_64::_mm256_srli_epi32::<8>(input); - - // Whilst it generically does something else, provided - // each entry of odd_factor is < 2^7, _mm256_maddubs_epi16 - // performs an element wise multiplication of odd_factor with - // the bottom 8 bits of input interpreted as an unsigned integer - // Thus lo contains r*x_lo. - let lo = x86_64::_mm256_maddubs_epi16(input, ONE_TWENTY_SEVEN); - - // As the high 16 bits of each 32 bit word are all 0 - // we don't need to worry about shifting the high bits of one - // word into the low bits of another. Thus we can use - // _mm256_bslli_epi128 which can run on Port 5 as it is classed as - // a swizzle operation. - let lo_shft = x86_64::_mm256_bslli_epi128::<2>(lo); - x86_64::_mm256_sub_epi32(hi, lo_shft) - } -} - -/// Multiply a vector of Monty31 field elements in canonical form by 2**{-8}. -/// This is specialised to the KoalaBear prime which allows us to replace a -/// shift by a twiddle. -/// # Safety -/// -/// Input must be given in canonical form. -/// Output is not in canonical form, outputs are only guaranteed to lie in (-P, P). -#[inline(always)] -unsafe fn mul_neg_2exp_neg_8(input: __m256i) -> __m256i { - // We want this to compile to: - // vpsrld hi, val, 8 - // vpmaddubsw lo, val, [r; 8] - // vpslldq lo, lo, 2 - // vpsubd t, lo, hi - // throughput: 1.333 - // latency: 7 - unsafe { - const ONE_TWENTY_SEVEN: __m256i = unsafe { transmute([127; 8]) }; // P = r*2^j + 1 = 127 * 2^24 + 1 - let hi = x86_64::_mm256_srli_epi32::<8>(input); - - // Whilst it generically does something else, provided - // each entry of odd_factor is < 2^7, _mm256_maddubs_epi16 - // performs an element wise multiplication of odd_factor with - // the bottom 8 bits of input interpreted as an unsigned integer - // Thus lo contains r*x_lo. - let lo = x86_64::_mm256_maddubs_epi16(input, ONE_TWENTY_SEVEN); - - // As the high 16 bits of each 32 bit word are all 0 - // we don't need to worry about shifting the high bits of one - // word into the low bits of another. Thus we can use - // _mm256_bslli_epi128 which can run on Port 5 as it is classed as - // a swizzle operation. - let lo_shft = x86_64::_mm256_bslli_epi128::<2>(lo); - x86_64::_mm256_sub_epi32(lo_shft, hi) - } -} - -impl InternalLayerParametersAVX2 for KoalaBearInternalLayerParameters { - type ArrayLike = [__m256i; 15]; - - /// For the KoalaBear field and width 16 we multiply by the diagonal matrix: - /// - /// D = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/8, 1/2^24, -1/2^8, -1/8, -1/16, -1/2^24] - /// The first 9 entries are handled elsewhere, this function handles all the positive/negative inverse powers of two. - /// The inputs must be in canonical form, otherwise the result is undefined. - /// Even when the inputs are in canonical form, we make no guarantees on the output except that, provided - /// the output is piped directly into add_sum the vector will be modified such that x[i] = D[i]*x[i] + sum. - #[inline(always)] - unsafe fn diagonal_mul_remainder(input: &mut [__m256i; 15]) { - unsafe { - // As far as we know this is optimal in that it need the fewest instructions to perform all of these - // multiplications. (Note that -1, 0 are not allowed on the diagonal for technical reasons). - // If there exist other number b for which x*b mod P can be computed quickly this diagonal can be updated. - - // input[8]-> sum + input[8]/2^8 - input[8] = mul_2exp_neg_8(input[8]); - - // input[9] -> sum + input[9]/2^3 - input[9] = mul_2exp_neg_n_avx2::(input[9]); - - // input[10] -> sum + input[10]/2^24 - input[10] = mul_2exp_neg_two_adicity_avx2::(input[10]); - - // input[11] -> sum - input[11]/2^8 - input[11] = mul_neg_2exp_neg_8(input[11]); - - // input[12] -> sum - input[12]/2^3 - input[12] = mul_neg_2exp_neg_n_avx2::(input[12]); - - // input[13] -> sum - input[13]/2^4 - input[13] = mul_neg_2exp_neg_n_avx2::(input[13]); - - // input[14] -> sum - input[14]/2^24 - input[14] = mul_neg_2exp_neg_two_adicity_avx2::(input[14]); - } - } -} - -impl InternalLayerParametersAVX2 for KoalaBearInternalLayerParameters { - type ArrayLike = [__m256i; 23]; - - /// For the KoalaBear field and width 1246 we multiply by the diagonal matrix: - /// - /// D = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24, -1/2^8, -1/8, -1/16, -1/32, -1/64, -1/2^7, -1/2^9, -1/2^24] - /// The first 9 entries are handled elsewhere, this function handles all the positive/negative inverse powers of two. - /// The inputs must be in canonical form, otherwise the result is undefined. - /// Even when the inputs are in canonical form, we make no guarantees on the output except that, provided - /// the output is piped directly into add_sum, the vector will be modified such that x[i] = D[i]*x[i] + sum. - #[inline(always)] - unsafe fn diagonal_mul_remainder(input: &mut [__m256i; 23]) { - unsafe { - // As far as we know this is optimal in that it need the fewest instructions to perform all of these - // multiplications. (Note that -1, 0 are not allowed on the diagonal for technical reasons). - // If there exist other number b for which x*b mod P can be computed quickly this diagonal can be updated. - - // input[8] -> sum + input[8]/2^8 - input[8] = mul_2exp_neg_8(input[8]); - - // input[9] -> sum + input[9]/2^2 - input[9] = mul_2exp_neg_n_avx2::(input[9]); - - // input[10] -> sum + input[10]/2^3 - input[10] = mul_2exp_neg_n_avx2::(input[10]); - - // input[11] -> sum + input[11]/2^4 - input[11] = mul_2exp_neg_n_avx2::(input[11]); - - // input[12] -> sum + input[12]/2^5 - input[12] = mul_2exp_neg_n_avx2::(input[12]); - - // input[13] -> sum + input[13]/2^6 - input[13] = mul_2exp_neg_n_avx2::(input[13]); - - // input[14] -> sum + input[14]/2^24 - input[14] = mul_2exp_neg_two_adicity_avx2::(input[14]); - - // input[15] -> sum - input[15]/2^8 - input[15] = mul_neg_2exp_neg_8(input[15]); - - // input[16] -> sum - input[16]/2^3 - input[16] = mul_neg_2exp_neg_n_avx2::(input[16]); - - // input[17] -> sum - input[17]/2^4 - input[17] = mul_neg_2exp_neg_n_avx2::(input[17]); - - // input[18] -> sum - input[18]/2^5 - input[18] = mul_neg_2exp_neg_n_avx2::(input[18]); - - // input[19] -> sum - input[19]/2^6 - input[19] = mul_neg_2exp_neg_n_avx2::(input[19]); - - // input[20] -> sum - input[20]/2^7 - input[20] = mul_neg_2exp_neg_n_avx2::(input[20]); - - // input[21] -> sum - input[21]/2^9 - input[21] = mul_neg_2exp_neg_n_avx2::(input[21]); - - // input[22] -> sum - input[22]/2^24 - input[22] = mul_neg_2exp_neg_two_adicity_avx2::(input[22]); - } - } -} diff --git a/crates/backend/koala-bear/src/x86_64_avx512/mod.rs b/crates/backend/koala-bear/src/x86_64_avx512/mod.rs index 88f8fcf8..730a8675 100644 --- a/crates/backend/koala-bear/src/x86_64_avx512/mod.rs +++ b/crates/backend/koala-bear/src/x86_64_avx512/mod.rs @@ -1,6 +1,5 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). mod packing; -mod poseidon2; pub use packing::*; diff --git a/crates/backend/koala-bear/src/x86_64_avx512/poseidon2.rs b/crates/backend/koala-bear/src/x86_64_avx512/poseidon2.rs deleted file mode 100644 index 30945bfc..00000000 --- a/crates/backend/koala-bear/src/x86_64_avx512/poseidon2.rs +++ /dev/null @@ -1,128 +0,0 @@ -// Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). - -use core::arch::x86_64::__m512i; - -use crate::{ - InternalLayerParametersAVX512, mul_neg_2exp_neg_8_avx512, mul_neg_2exp_neg_n_avx512, - mul_neg_2exp_neg_two_adicity_avx512, -}; - -use crate::{KoalaBearInternalLayerParameters, KoalaBearParameters}; - -impl InternalLayerParametersAVX512 for KoalaBearInternalLayerParameters { - type ArrayLike = [__m512i; 15]; - - /// For the KoalaBear field and width 16 we multiply by the diagonal matrix: - /// D = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/8, 1/2^24, -1/2^8, -1/8, -1/16, -1/2^24]. - /// The inputs must be in canonical form, otherwise the result is undefined. - /// Even when the inputs are in canonical form, we make no guarantees on the output except that, provided - /// the output is piped directly into add_sum the vector will be modified such that x[i] = D[i]*x[i] + sum. - #[inline(always)] - unsafe fn diagonal_mul_remainder(input: &mut [__m512i; 15]) { - unsafe { - // As far as we know this is optimal in that it need the fewest instructions to perform all of these - // multiplications. (Note that -1, 0 are not allowed on the diagonal for technical reasons). - // If there exist other number b for which x*b mod P can be computed quickly this diagonal can be updated. - - // This following 3 muls (from input[8] to input[10]) output the negative of what we want. - // This will be handled in add_sum. - - // input[8]-> sum + input[8]/2^8 - input[8] = mul_neg_2exp_neg_8_avx512::(input[8]); - - // input[9] -> sum + input[9]/2^3 - input[9] = mul_neg_2exp_neg_n_avx512::(input[9]); - - // input[10] -> sum + input[10]/2^24 - input[10] = mul_neg_2exp_neg_two_adicity_avx512::(input[10]); - - // The remaining muls output the correct value again. - - // input[11] -> sum - input[11]/2^8 - input[11] = mul_neg_2exp_neg_8_avx512::(input[11]); - - // input[12] -> sum - input[12]/2^3 - input[12] = mul_neg_2exp_neg_n_avx512::(input[12]); - - // input[13] -> sum - input[13]/2^4 - input[13] = mul_neg_2exp_neg_n_avx512::(input[13]); - - // input[14] -> sum - input[14]/2^24 - input[14] = mul_neg_2exp_neg_two_adicity_avx512::(input[14]); - } - } - - /// There are 3 positive inverse powers of two after the 4: 1/2^8, 1/8, 1/2^24, - const NUM_POS: usize = 3; -} - -impl InternalLayerParametersAVX512 for KoalaBearInternalLayerParameters { - type ArrayLike = [__m512i; 23]; - - /// For the KoalaBear field and width 24 we multiply by the diagonal matrix: - /// D = [-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24, -1/2^8, -1/8, -1/16, -1/32, -1/64, -1/2^7, -1/2^9, -1/2^24] - /// The inputs must be in canonical form, otherwise the result is undefined. - /// Even when the inputs are in canonical form, we make no guarantees on the output except that, provided - /// the output is piped directly into add_sum, the vector will be modified such that x[i] = D[i]*x[i] + sum. - #[inline(always)] - unsafe fn diagonal_mul_remainder(input: &mut [__m512i; 23]) { - unsafe { - // As far as we know this is optimal in that it need the fewest instructions to perform all of these - // multiplications. (Note that -1, 0 are not allowed on the diagonal for technical reasons). - // If there exist other number b for which x*b mod P can be computed quickly this diagonal can be updated. - - // This following 7 muls (from input[8] to input[14]) output the negative of what we want. - // This will be handled in add_sum. - - // input[8] -> sum + input[8]/2^8 - input[8] = mul_neg_2exp_neg_8_avx512::(input[8]); - - // input[9] -> sum + input[9]/2^2 - input[9] = mul_neg_2exp_neg_n_avx512::(input[9]); - - // input[10] -> sum + input[10]/2^3 - input[10] = mul_neg_2exp_neg_n_avx512::(input[10]); - - // input[11] -> sum + input[11]/2^4 - input[11] = mul_neg_2exp_neg_n_avx512::(input[11]); - - // input[12] -> sum + input[12]/2^5 - input[12] = mul_neg_2exp_neg_n_avx512::(input[12]); - - // input[13] -> sum + input[13]/2^6 - input[13] = mul_neg_2exp_neg_n_avx512::(input[13]); - - // input[14] -> sum + input[14]/2^24 - input[14] = mul_neg_2exp_neg_two_adicity_avx512::(input[14]); - - // The remaining muls output the correct value again. - - // input[15] -> sum - input[15]/2^8 - input[15] = mul_neg_2exp_neg_8_avx512::(input[15]); - - // input[16] -> sum - input[16]/2^3 - input[16] = mul_neg_2exp_neg_n_avx512::(input[16]); - - // input[17] -> sum - input[17]/2^4 - input[17] = mul_neg_2exp_neg_n_avx512::(input[17]); - - // input[18] -> sum - input[18]/2^5 - input[18] = mul_neg_2exp_neg_n_avx512::(input[18]); - - // input[19] -> sum - input[19]/2^6 - input[19] = mul_neg_2exp_neg_n_avx512::(input[19]); - - // input[20] -> sum - input[20]/2^7 - input[20] = mul_neg_2exp_neg_n_avx512::(input[20]); - - // input[21] -> sum - input[21]/2^9 - input[21] = mul_neg_2exp_neg_n_avx512::(input[21]); - - // input[22] -> sum - input[22]/2^24 - input[22] = mul_neg_2exp_neg_two_adicity_avx512::(input[22]); - } - } - - /// There are 7 positive inverse powers of two after the 4: 1/2^8, 1/4, 1/8, 1/16, 1/32, 1/64, 1/2^24; - const NUM_POS: usize = 7; -} diff --git a/crates/backend/symetric/src/permutation.rs b/crates/backend/symetric/src/permutation.rs index 5631baa5..c129a1dc 100644 --- a/crates/backend/symetric/src/permutation.rs +++ b/crates/backend/symetric/src/permutation.rs @@ -1,10 +1,7 @@ // Credits: Plonky3 (https://github.com/Plonky3/Plonky3) (MIT and Apache-2.0 licenses). use field::{Algebra, InjectiveMonomial}; -use koala_bear::{ - ExternalLayer, InternalLayer, KoalaBear, KoalaBearInternalLayerParameters, KoalaBearParameters, - Poseidon2ExternalLayerMonty31, Poseidon2InternalLayerMonty31, Poseidon2KoalaBear, -}; +use koala_bear::{KoalaBear, Poseidon1KoalaBear16}; pub trait Compression: Clone + Sync { #[inline(always)] @@ -16,12 +13,10 @@ pub trait Compression: Clone + Sync { fn compress_mut(&self, input: &mut T); } -impl + Send + Sync + InjectiveMonomial<3>> Compression<[A; 16]> for Poseidon2KoalaBear<16> -where - Poseidon2ExternalLayerMonty31: ExternalLayer, - Poseidon2InternalLayerMonty31: InternalLayer, +impl + InjectiveMonomial<3> + Send + Sync + 'static> Compression<[R; 16]> + for Poseidon1KoalaBear16 { - fn compress_mut(&self, input: &mut [A; 16]) { + fn compress_mut(&self, input: &mut [R; 16]) { self.compress_in_place(input); } } diff --git a/crates/backend/utils/src/lib.rs b/crates/backend/utils/src/lib.rs index 682962bd..d391cacc 100644 --- a/crates/backend/utils/src/lib.rs +++ b/crates/backend/utils/src/lib.rs @@ -295,3 +295,19 @@ pub const fn log2_ceil_usize(n: usize) -> usize { pub fn log2_ceil_u64(n: u64) -> u64 { (u64::BITS - n.saturating_sub(1).leading_zeros()).into() } + +pub fn pretty_integer(i: usize) -> String { + // ex: 123456789 -> "123,456,789" + let s = i.to_string(); + let chars: Vec = s.chars().collect(); + let mut result = String::new(); + + for (index, ch) in chars.iter().enumerate() { + if index > 0 && (chars.len() - index).is_multiple_of(3) { + result.push(','); + } + result.push(*ch); + } + + result +} diff --git a/crates/lean_compiler/Cargo.toml b/crates/lean_compiler/Cargo.toml index 1eb26f87..1d4b10c5 100644 --- a/crates/lean_compiler/Cargo.toml +++ b/crates/lean_compiler/Cargo.toml @@ -13,9 +13,6 @@ utils.workspace = true xmss.workspace = true rand.workspace = true - - - tracing.workspace = true air.workspace = true sub_protocols.workspace = true diff --git a/crates/lean_compiler/snark_lib.py b/crates/lean_compiler/snark_lib.py index fb398fe9..8eaa1d05 100644 --- a/crates/lean_compiler/snark_lib.py +++ b/crates/lean_compiler/snark_lib.py @@ -108,11 +108,6 @@ def poly_eq_ee(a, b, result, length=None): def hint_decompose_bits(value, bits, n_bits, endian): _ = value, bits, n_bits, endian - -def hint_decompose_16(a, lo, hi): - _ = a, lo, hi - - def hint_less_than(a, b, result_ptr): _ = a, b, result_ptr @@ -125,6 +120,8 @@ def log2_ceil(x: int) -> int: def div_ceil(a: int, b: int) -> int: return (a + b - 1) // b +def div_floor(a: int, b: int) -> int: + return a // b def next_multiple_of(x: int, n: int) -> int: return x + (n - x % n) % n @@ -164,6 +161,10 @@ def hint_decompose_bits_xmss(*args): _ = args +def hint_decompose_bits_merkle_whir(*args): + _ = args + + def hint_log2_ceil(n): return log2_ceil(n) diff --git a/crates/lean_compiler/src/grammar.pest b/crates/lean_compiler/src/grammar.pest index 6c896d2f..7429803b 100644 --- a/crates/lean_compiler/src/grammar.pest +++ b/crates/lean_compiler/src/grammar.pest @@ -122,6 +122,7 @@ primary = { log2_ceil_expr | next_multiple_of_expr | div_ceil_expr | + div_floor_expr | saturating_sub_expr | len_expr | array_access_expr | @@ -139,6 +140,7 @@ function_call_expr = { identifier ~ "(" ~ tuple_expression? ~ ")" } log2_ceil_expr = { "log2_ceil" ~ "(" ~ expression ~ ")" } next_multiple_of_expr = { "next_multiple_of" ~ "(" ~ expression ~ "," ~ expression ~ ")" } div_ceil_expr = { "div_ceil" ~ "(" ~ expression ~ "," ~ expression ~ ")" } +div_floor_expr = { "div_floor" ~ "(" ~ expression ~ "," ~ expression ~ ")" } saturating_sub_expr = { "saturating_sub" ~ "(" ~ expression ~ "," ~ expression ~ ")" } len_expr = { "len" ~ "(" ~ len_argument ~ ")" } len_argument = { identifier ~ ("[" ~ expression ~ "]")* } diff --git a/crates/lean_compiler/src/lang.rs b/crates/lean_compiler/src/lang.rs index 6044f678..9a2297e3 100644 --- a/crates/lean_compiler/src/lang.rs +++ b/crates/lean_compiler/src/lang.rs @@ -306,6 +306,8 @@ pub enum MathOperation { SaturatingSub, /// Integer division with ceiling DivCeil, + /// Integer division with floor + DivFloor, } impl TryFrom for Operation { @@ -333,6 +335,7 @@ impl Display for MathOperation { Self::NextMultipleOf => write!(f, "next_multiple_of"), Self::SaturatingSub => write!(f, "saturating_sub"), Self::DivCeil => write!(f, "div_ceil"), + Self::DivFloor => write!(f, "div_floor"), } } } @@ -352,7 +355,8 @@ impl MathOperation { | Self::Mod | Self::NextMultipleOf | Self::SaturatingSub - | Self::DivCeil => 2, + | Self::DivCeil + | Self::DivFloor => 2, } } pub fn eval(&self, args: &[F]) -> F { @@ -375,6 +379,7 @@ impl MathOperation { } Self::SaturatingSub => F::from_usize(args[0].to_usize().saturating_sub(args[1].to_usize())), Self::DivCeil => F::from_usize(args[0].to_usize().div_ceil(args[1].to_usize())), + Self::DivFloor => F::from_usize(args[0].to_usize() / args[1].to_usize()), } } } diff --git a/crates/lean_compiler/src/parser/parsers/expression.rs b/crates/lean_compiler/src/parser/parsers/expression.rs index 861821a8..923ac994 100644 --- a/crates/lean_compiler/src/parser/parsers/expression.rs +++ b/crates/lean_compiler/src/parser/parsers/expression.rs @@ -30,6 +30,7 @@ impl Parse for ExpressionParser { Rule::log2_ceil_expr => MathOperation::Log2Ceil.parse(pair, ctx), Rule::next_multiple_of_expr => MathOperation::NextMultipleOf.parse(pair, ctx), Rule::div_ceil_expr => MathOperation::DivCeil.parse(pair, ctx), + Rule::div_floor_expr => MathOperation::DivFloor.parse(pair, ctx), Rule::saturating_sub_expr => MathOperation::SaturatingSub.parse(pair, ctx), Rule::var_or_constant => Ok(Expression::Value(VarOrConstantParser.parse(pair, ctx)?)), Rule::array_access_expr => ArrayAccessParser.parse(pair, ctx), diff --git a/crates/lean_compiler/zkDSL.md b/crates/lean_compiler/zkDSL.md index 6619be6f..2d21b6fb 100644 --- a/crates/lean_compiler/zkDSL.md +++ b/crates/lean_compiler/zkDSL.md @@ -431,12 +431,9 @@ Always in "compression" mode ``` poseidon16_compress(left, right, output) ``` -- `left`, `right`: pointers to 8 field elements each -- `output`: pointer to result (8 elements) -``` -poseidon16_compress(leaf_a, leaf_b, parent_hash) -poseidon16_compress(state, data, new_state) -``` +- `left`: pointer to 8 field elements +- `right`: pointer to 8 field elements +- `res`: pointer to result (8 elements) ### Extension Operations diff --git a/crates/lean_prover/src/lib.rs b/crates/lean_prover/src/lib.rs index ce2c8d01..8991343b 100644 --- a/crates/lean_prover/src/lib.rs +++ b/crates/lean_prover/src/lib.rs @@ -46,8 +46,7 @@ pub fn default_whir_config(starting_log_inv_rate: usize) -> WhirConfigBuilder { #[cfg(test)] mod tests { - use backend::default_koalabear_poseidon2_16; - use backend::{PrimeCharacteristicRing, hash_slice}; + use backend::{PrimeCharacteristicRing, default_koalabear_poseidon1_16, hash_slice}; use lean_vm::F; use rec_aggregation::{get_aggregation_bytecode, init_aggregation_bytecode}; use utils::poseidon16_compress_pair; @@ -68,7 +67,7 @@ mod tests { prefix_free_name_fe.push(F::ZERO); } prefix_free_name_fe.push(F::from_u64(len as u64)); - let comp = default_koalabear_poseidon2_16(); + let comp = default_koalabear_poseidon1_16(); let name_hash = hash_slice::<_, _, _, 8, 8>(&comp, &prefix_free_name_fe); // We incorporate the recursion program hash, containing all the verifier logic, into fiat shamir domain separator diff --git a/crates/lean_prover/src/trace_gen.rs b/crates/lean_prover/src/trace_gen.rs index 6f9022f1..5e62313a 100644 --- a/crates/lean_prover/src/trace_gen.rs +++ b/crates/lean_prover/src/trace_gen.rs @@ -1,6 +1,6 @@ use backend::*; use lean_vm::*; -use std::{array, collections::BTreeMap, iter::repeat_n}; +use std::{array, collections::BTreeMap}; use utils::{ToUsize, get_poseidon_16_of_zero, transposed_par_iter_mut}; #[derive(Debug)] @@ -129,7 +129,7 @@ pub fn get_execution_trace(bytecode: &Bytecode, execution_result: ExecutionResul } } -fn pad_table(table: &Table, traces: &mut BTreeMap, null_hash_ptr: usize) { +fn pad_table(table: &Table, traces: &mut BTreeMap, null_poseidon_16_hash_ptr: usize) { let trace = traces.get_mut(table).unwrap(); let h = trace.columns[0].len(); trace @@ -140,13 +140,14 @@ fn pad_table(table: &Table, traces: &mut BTreeMap, null_hash_ trace.non_padded_n_rows = h; trace.log_n_rows = log2_ceil_usize(h + 1).max(MIN_LOG_N_ROWS_PER_TABLE); - let padding_len = (1 << trace.log_n_rows) - h; + let n_rows = 1 << trace.log_n_rows; let padding_row = if *table == Table::poseidon16() { - default_poseidon_row(null_hash_ptr) + default_poseidon_16_row(null_poseidon_16_hash_ptr) } else { table.padding_row() }; trace.columns.par_iter_mut().enumerate().for_each(|(i, col)| { - col.extend(repeat_n(padding_row[i], padding_len)); + assert!(col.len() <= h); // potentially some columns have not been filled (in Poseidon -> we fill it later with SIMD + parallelism), but the first one should always be representative + col.resize(n_rows, padding_row[i]); }); } diff --git a/crates/lean_vm/Cargo.toml b/crates/lean_vm/Cargo.toml index 54ad3b64..fb31a642 100644 --- a/crates/lean_vm/Cargo.toml +++ b/crates/lean_vm/Cargo.toml @@ -12,11 +12,7 @@ pest_derive.workspace = true utils.workspace = true xmss.workspace = true rand.workspace = true - - - - tracing.workspace = true air.workspace = true backend.workspace = true -itertools.workspace = true \ No newline at end of file +itertools.workspace = true diff --git a/crates/lean_vm/src/core/constants.rs b/crates/lean_vm/src/core/constants.rs index f2aff96c..b8764d9e 100644 --- a/crates/lean_vm/src/core/constants.rs +++ b/crates/lean_vm/src/core/constants.rs @@ -102,7 +102,7 @@ mod tests { fn ensure_not_too_big_commitment_surface() { let mut max_surface: u64 = 2 * (1 << MAX_LOG_MEMORY_SIZE) as u64; // memory and acc_memory for (table, max_log_n_rows) in MAX_LOG_N_ROWS_PER_TABLE { - max_surface += (table.n_committed_columns() as u64) << (max_log_n_rows as u64); + max_surface += (table.n_columns() as u64) << (max_log_n_rows as u64); } assert!(max_surface <= 1 << 30); // Maximum data we can commit via WHIR using an initial folding factor of 7, and rate = 1/2 } diff --git a/crates/lean_vm/src/diagnostics/exec_result.rs b/crates/lean_vm/src/diagnostics/exec_result.rs index 88fe3deb..281683bc 100644 --- a/crates/lean_vm/src/diagnostics/exec_result.rs +++ b/crates/lean_vm/src/diagnostics/exec_result.rs @@ -1,8 +1,9 @@ use std::collections::BTreeMap; +use backend::pretty_integer; + use crate::execution::Memory; use crate::{Table, TableTrace}; -use utils::pretty_integer; #[derive(Debug, Default, Clone)] pub struct ExecutionMetadata { @@ -56,7 +57,7 @@ impl ExecutionMetadata { out.push('\n'); if self.n_poseidons > 0 { out.push_str(&format!( - "Poseidon2_16 calls: {} (1 poseidon per {} instructions)\n", + "Poseidon16 calls: {} (1 poseidon per {} instructions)\n", pretty_integer(self.n_poseidons), self.cycles / self.n_poseidons )); diff --git a/crates/lean_vm/src/diagnostics/profiler.rs b/crates/lean_vm/src/diagnostics/profiler.rs index bb1ee29c..0a3c3e6a 100644 --- a/crates/lean_vm/src/diagnostics/profiler.rs +++ b/crates/lean_vm/src/diagnostics/profiler.rs @@ -1,7 +1,6 @@ +use backend::pretty_integer; use std::collections::{BTreeMap, HashMap}; -use utils::pretty_integer; - use crate::ExecutionHistory; use crate::core::{Label, SourceLocation}; use crate::stack_trace::find_function_for_location; diff --git a/crates/lean_vm/src/isa/hint.rs b/crates/lean_vm/src/isa/hint.rs index 90132b80..6c7fbc06 100644 --- a/crates/lean_vm/src/isa/hint.rs +++ b/crates/lean_vm/src/isa/hint.rs @@ -7,7 +7,7 @@ use backend::*; use std::fmt::Debug; use std::fmt::{Display, Formatter}; use std::hash::Hash; -use utils::{ToUsize, pretty_integer, to_big_endian_in_field, to_little_endian_in_field}; +use utils::{ToUsize, to_big_endian_in_field, to_little_endian_in_field}; use xmss::SIG_SIZE_FE; /// VM hints provide execution guidance and debugging information, but does not appear @@ -79,11 +79,8 @@ pub enum CustomHint { /// and ai < 4, b < 2^7 - 1 /// The decomposition is unique, and always exists (except for x = -1) DecomposeBitsXMSS, + DecomposeBitsMerkleWhir, DecomposeBits, - /// Decompose a field element into lo (< 2^16) and hi (< 2^14) parts: - /// a = lo + hi * 2^16 - /// Args: value, lo_ptr, hi_ptr - Decompose16, LessThan, Log2Ceil, PrivateInputStart, @@ -93,8 +90,8 @@ pub enum CustomHint { pub const CUSTOM_HINTS: [CustomHint; 8] = [ CustomHint::DecomposeBitsXMSS, + CustomHint::DecomposeBitsMerkleWhir, CustomHint::DecomposeBits, - CustomHint::Decompose16, CustomHint::LessThan, CustomHint::Log2Ceil, CustomHint::PrivateInputStart, @@ -106,8 +103,8 @@ impl CustomHint { pub fn name(&self) -> &str { match self { Self::DecomposeBitsXMSS => "hint_decompose_bits_xmss", + Self::DecomposeBitsMerkleWhir => "hint_decompose_bits_merkle_whir", Self::DecomposeBits => "hint_decompose_bits", - Self::Decompose16 => "hint_decompose_16", Self::LessThan => "hint_less_than", Self::Log2Ceil => "hint_log2_ceil", Self::PrivateInputStart => "hint_private_input_start", @@ -119,8 +116,8 @@ impl CustomHint { pub fn n_args(&self) -> usize { match self { Self::DecomposeBitsXMSS => 5, + Self::DecomposeBitsMerkleWhir => 4, Self::DecomposeBits => 4, - Self::Decompose16 => 3, Self::LessThan => 3, Self::Log2Ceil => 2, Self::PrivateInputStart => 1, @@ -156,6 +153,21 @@ impl CustomHint { memory_index_remaining += 1; } } + Self::DecomposeBitsMerkleWhir => { + let decomposed_ptr = args[0].read_value(ctx.memory, ctx.fp)?.to_usize(); + let value = args[2].read_value(ctx.memory, ctx.fp)?.to_usize(); + let chunk_size = args[3].read_value(ctx.memory, ctx.fp)?.to_usize(); + assert!(24_usize.is_multiple_of(chunk_size)); + let mut memory_index_decomposed = decomposed_ptr; + #[allow(clippy::explicit_counter_loop)] + for i in 0..24 / chunk_size { + let value = F::from_usize((value >> (chunk_size * i)) & ((1 << chunk_size) - 1)); + ctx.memory.set(memory_index_decomposed, value)?; + memory_index_decomposed += 1; + } + ctx.memory + .set(args[1].memory_address(ctx.fp)?, F::from_usize(value >> 24))?; + } Self::DecomposeBits => { let to_decompose = args[0].read_value(ctx.memory, ctx.fp)?.to_usize(); let memory_index = args[1].read_value(ctx.memory, ctx.fp)?.to_usize(); @@ -176,15 +188,6 @@ impl CustomHint { .set_slice(memory_index, &to_little_endian_in_field::(to_decompose, num_bits))? } } - Self::Decompose16 => { - let value = args[0].read_value(ctx.memory, ctx.fp)?.to_usize(); - let lo_ptr = args[1].memory_address(ctx.fp)?; - let hi_ptr = args[2].memory_address(ctx.fp)?; - let lo = value & 0xFFFF; - let hi = value >> 16; - ctx.memory.set(lo_ptr, F::from_usize(lo))?; - ctx.memory.set(hi_ptr, F::from_usize(hi))?; - } Self::LessThan => { let a = args[0].read_value(ctx.memory, ctx.fp)?; let b = args[1].read_value(ctx.memory, ctx.fp)?; diff --git a/crates/lean_vm/src/tables/extension_op/air.rs b/crates/lean_vm/src/tables/extension_op/air.rs index 02efa550..2f39a668 100644 --- a/crates/lean_vm/src/tables/extension_op/air.rs +++ b/crates/lean_vm/src/tables/extension_op/air.rs @@ -1,5 +1,6 @@ use crate::{ - EF, ExtraDataForBuses, eval_virtual_bus_column, + EF, EXT_OP_FLAG_ADD, EXT_OP_FLAG_IS_BE, EXT_OP_FLAG_MUL, EXT_OP_FLAG_POLY_EQ, ExtraDataForBuses, + eval_virtual_bus_column, tables::extension_op::{EXT_OP_LEN_MULTIPLIER, ExtensionOpPrecompile}, }; use backend::*; @@ -99,10 +100,10 @@ impl Air for ExtensionOpPrecompile { let active = flag_add + flag_mul + flag_poly_eq; let activation_flag = start * active; - let aux = is_be.double() - + flag_add * AB::F::from_usize(4) - + flag_mul * AB::F::from_usize(8) - + flag_poly_eq * AB::F::from_usize(16) + let aux = is_be * AB::F::from_usize(EXT_OP_FLAG_IS_BE) + + flag_add * AB::F::from_usize(EXT_OP_FLAG_ADD) + + flag_mul * AB::F::from_usize(EXT_OP_FLAG_MUL) + + flag_poly_eq * AB::F::from_usize(EXT_OP_FLAG_POLY_EQ) + len * AB::F::from_usize(EXT_OP_LEN_MULTIPLIER); let idx_r = up[COL_IDX_RES]; diff --git a/crates/lean_vm/src/tables/extension_op/exec.rs b/crates/lean_vm/src/tables/extension_op/exec.rs index 7dd93034..33c39808 100644 --- a/crates/lean_vm/src/tables/extension_op/exec.rs +++ b/crates/lean_vm/src/tables/extension_op/exec.rs @@ -1,10 +1,12 @@ use crate::DIMENSION; use crate::EF; use crate::F; +use crate::MemoryAccess; use crate::RunnerError; use crate::TableTrace; -use crate::execution::memory::MemoryAccess; -use crate::tables::extension_op::{EXT_OP_LEN_MULTIPLIER, air::*}; +use crate::tables::extension_op::{ + EXT_OP_FLAG_ADD, EXT_OP_FLAG_IS_BE, EXT_OP_FLAG_MUL, EXT_OP_FLAG_POLY_EQ, EXT_OP_LEN_MULTIPLIER, air::*, +}; use backend::*; use utils::ToUsize; @@ -148,7 +150,10 @@ fn exec_multi_row( let flag_add_f = F::from_bool(flag_add); let flag_mul_f = F::from_bool(flag_mul); let flag_poly_eq_f = F::from_bool(flag_poly_eq); - let mode_bits = 2 * is_be as usize + 4 * flag_add as usize + 8 * flag_mul as usize + 16 * flag_poly_eq as usize; + let mode_bits = EXT_OP_FLAG_IS_BE * is_be as usize + + EXT_OP_FLAG_ADD * flag_add as usize + + EXT_OP_FLAG_MUL * flag_mul as usize + + EXT_OP_FLAG_POLY_EQ * flag_poly_eq as usize; let result_coords = result.as_basis_coefficients_slice(); diff --git a/crates/lean_vm/src/tables/extension_op/mod.rs b/crates/lean_vm/src/tables/extension_op/mod.rs index 027fd6c6..31e88469 100644 --- a/crates/lean_vm/src/tables/extension_op/mod.rs +++ b/crates/lean_vm/src/tables/extension_op/mod.rs @@ -12,16 +12,21 @@ use air::*; mod exec; pub use exec::fill_trace_extension_op; +// domain separation: Poseidon16=1, Poseidon24= 2 or 3 or 4, ExtensionOp>=8 /// Extension op PRECOMPILE_DATA bit-field encoding: -/// aux = 2*is_be + 4*flag_add + 8*flag_mul + 16*flag_poly_eq + 32*len -/// Always even → disjoint from Poseidon (PRECOMPILE_DATA=1). -pub const EXT_OP_ADD_EE: usize = 4; // 0 + 4 -pub const EXT_OP_ADD_BE: usize = 6; // 2 + 4 -pub const EXT_OP_DOT_PRODUCT_EE: usize = 8; // 8 -pub const EXT_OP_DOT_PRODUCT_BE: usize = 10; // 2 + 8 -pub const EXT_OP_POLY_EQ_EE: usize = 16; // 16 -pub const EXT_OP_POLY_EQ_BE: usize = 18; // 2 + 16 -pub const EXT_OP_LEN_MULTIPLIER: usize = 32; +/// aux = 4*is_be + 8*flag_add + 16*flag_mul + 32*flag_poly_eq + 64*len +pub(crate) const EXT_OP_FLAG_IS_BE: usize = 4; +pub(crate) const EXT_OP_FLAG_ADD: usize = 8; +pub(crate) const EXT_OP_FLAG_MUL: usize = 16; +pub(crate) const EXT_OP_FLAG_POLY_EQ: usize = 32; + +pub const EXT_OP_ADD_EE: usize = EXT_OP_FLAG_ADD; // 8 + 0 = 8 +pub const EXT_OP_ADD_BE: usize = EXT_OP_FLAG_IS_BE + EXT_OP_FLAG_ADD; // 8 + 4 = 12 +pub const EXT_OP_DOT_PRODUCT_EE: usize = EXT_OP_FLAG_MUL; // 16 + 0 = 16 +pub const EXT_OP_DOT_PRODUCT_BE: usize = EXT_OP_FLAG_IS_BE + EXT_OP_FLAG_MUL; // 16 + 4 = 20 +pub const EXT_OP_POLY_EQ_EE: usize = EXT_OP_FLAG_POLY_EQ; // 32 + 0 = 32 +pub const EXT_OP_POLY_EQ_BE: usize = EXT_OP_FLAG_IS_BE + EXT_OP_FLAG_POLY_EQ; // 32 + 4 = 36 +pub const EXT_OP_LEN_MULTIPLIER: usize = 64; /// Mapping from zkDSL function names to extension op mode values. pub const EXT_OP_FUNCTIONS: [(&str, usize); 6] = [ diff --git a/crates/lean_vm/src/tables/poseidon_16/mod.rs b/crates/lean_vm/src/tables/poseidon_16/mod.rs index c5908368..f24c8d2e 100644 --- a/crates/lean_vm/src/tables/poseidon_16/mod.rs +++ b/crates/lean_vm/src/tables/poseidon_16/mod.rs @@ -5,22 +5,98 @@ use crate::*; use backend::*; use utils::{ToUsize, poseidon16_compress}; +/// Dispatch `mds_circ_16` through concrete types. +/// For `SymbolicExpression` we use the dense form so the zkDSL generator can +/// emit `dot_product_be` precompile calls instead of Karatsuba arithmetic. +#[inline(always)] +fn mds_air_16(state: &mut [A; WIDTH]) { + if TypeId::of::() == TypeId::of::>() { + dense_mat_vec_air_16(mds_dense_16(), state); + return; + } + macro_rules! dispatch { + ($t:ty) => { + if TypeId::of::() == TypeId::of::<$t>() { + mds_circ_16::<$t>(unsafe { &mut *(state as *mut [A; WIDTH] as *mut [$t; WIDTH]) }); + return; + } + }; + } + dispatch!(F); + dispatch!(EF); + dispatch!(FPacking); + dispatch!(EFPacking); + unreachable!() +} + +fn mds_dense_16() -> &'static [[F; 16]; 16] { + use std::sync::OnceLock; + static MAT: OnceLock<[[KoalaBear; 16]; 16]> = OnceLock::new(); + MAT.get_or_init(|| { + let cols: [[F; 16]; 16] = std::array::from_fn(|j| { + let mut e = [F::ZERO; 16]; + e[j] = F::ONE; + mds_circ_16(&mut e); + e + }); + std::array::from_fn(|i| std::array::from_fn(|j| cols[j][i])) + }) +} + +/// Add a `KoalaBear` constant to any AIR type. +#[inline(always)] +fn add_kb(a: &mut A, value: F) { + macro_rules! dispatch { + ($t:ty) => { + if TypeId::of::() == TypeId::of::<$t>() { + *unsafe { &mut *(a as *mut A as *mut $t) } += value; + return; + } + }; + } + dispatch!(F); + dispatch!(EF); + dispatch!(FPacking); + dispatch!(EFPacking); + dispatch!(SymbolicExpression); + unreachable!() +} + +/// Multiply any AIR type by a `KoalaBear` constant. +#[inline(always)] +fn mul_kb(a: A, value: F) -> A { + macro_rules! dispatch { + ($t:ty) => { + if TypeId::of::() == TypeId::of::<$t>() { + let r = unsafe { std::ptr::read(&a as *const A as *const $t) } * value; + return unsafe { std::ptr::read(&r as *const $t as *const A) }; + } + }; + } + dispatch!(F); + dispatch!(EF); + dispatch!(FPacking); + dispatch!(EFPacking); + dispatch!(SymbolicExpression); + unreachable!() +} + mod trace_gen; -pub use trace_gen::{default_poseidon_row, fill_trace_poseidon_16}; +pub use trace_gen::{default_poseidon_16_row, fill_trace_poseidon_16}; pub(super) const WIDTH: usize = 16; -const HALF_INITIAL_FULL_ROUNDS: usize = KOALABEAR_RC16_EXTERNAL_INITIAL.len() / 2; -const PARTIAL_ROUNDS: usize = KOALABEAR_RC16_INTERNAL.len(); -const HALF_FINAL_FULL_ROUNDS: usize = KOALABEAR_RC16_EXTERNAL_FINAL.len() / 2; +const HALF_INITIAL_FULL_ROUNDS: usize = POSEIDON1_HALF_FULL_ROUNDS / 2; +const PARTIAL_ROUNDS: usize = POSEIDON1_PARTIAL_ROUNDS; +const HALF_FINAL_FULL_ROUNDS: usize = POSEIDON1_HALF_FULL_ROUNDS / 2; -pub const POSEIDON_PRECOMPILE_DATA: usize = 1; // domain separation between Poseidon / ExtensionOp precompiles +pub const POSEIDON_PRECOMPILE_DATA: usize = 1; // domain separation: Poseidon16=1, Poseidon24=2 or 3 or 4, ExtensionOp>=8 pub const POSEIDON_16_COL_FLAG: ColIndex = 0; -pub const POSEIDON_16_COL_A: ColIndex = 1; -pub const POSEIDON_16_COL_B: ColIndex = 2; -pub const POSEIDON_16_COL_RES: ColIndex = 3; +pub const POSEIDON_16_COL_INDEX_INPUT_LEFT: ColIndex = 1; +pub const POSEIDON_16_COL_INDEX_INPUT_RIGHT: ColIndex = 2; +pub const POSEIDON_16_COL_INDEX_INPUT_RES: ColIndex = 3; pub const POSEIDON_16_COL_INPUT_START: ColIndex = 4; -const POSEIDON_16_COL_OUTPUT_START: ColIndex = num_cols_poseidon_16() - 8; +pub const POSEIDON_16_COL_OUTPUT_START: ColIndex = num_cols_poseidon_16() - 8; #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct Poseidon16Precompile; @@ -37,16 +113,16 @@ impl TableT for Poseidon16Precompile { fn lookups(&self) -> Vec { vec![ LookupIntoMemory { - index: POSEIDON_16_COL_A, + index: POSEIDON_16_COL_INDEX_INPUT_LEFT, values: (POSEIDON_16_COL_INPUT_START..POSEIDON_16_COL_INPUT_START + DIGEST_LEN).collect(), }, LookupIntoMemory { - index: POSEIDON_16_COL_B, + index: POSEIDON_16_COL_INDEX_INPUT_RIGHT, values: (POSEIDON_16_COL_INPUT_START + DIGEST_LEN..POSEIDON_16_COL_INPUT_START + DIGEST_LEN * 2) .collect(), }, LookupIntoMemory { - index: POSEIDON_16_COL_RES, + index: POSEIDON_16_COL_INDEX_INPUT_RES, values: (POSEIDON_16_COL_OUTPUT_START..POSEIDON_16_COL_OUTPUT_START + DIGEST_LEN).collect(), }, ] @@ -58,9 +134,9 @@ impl TableT for Poseidon16Precompile { selector: POSEIDON_16_COL_FLAG, data: vec![ BusData::Constant(POSEIDON_PRECOMPILE_DATA), - BusData::Column(POSEIDON_16_COL_A), - BusData::Column(POSEIDON_16_COL_B), - BusData::Column(POSEIDON_16_COL_RES), + BusData::Column(POSEIDON_16_COL_INDEX_INPUT_LEFT), + BusData::Column(POSEIDON_16_COL_INDEX_INPUT_RIGHT), + BusData::Column(POSEIDON_16_COL_INDEX_INPUT_RES), ], } } @@ -96,9 +172,9 @@ impl TableT for Poseidon16Precompile { ctx.memory.set_slice(index_res_a.to_usize(), &res_a)?; trace.columns[POSEIDON_16_COL_FLAG].push(F::ONE); - trace.columns[POSEIDON_16_COL_A].push(arg_a); - trace.columns[POSEIDON_16_COL_B].push(arg_b); - trace.columns[POSEIDON_16_COL_RES].push(index_res_a); + trace.columns[POSEIDON_16_COL_INDEX_INPUT_LEFT].push(arg_a); + trace.columns[POSEIDON_16_COL_INDEX_INPUT_RIGHT].push(arg_b); + trace.columns[POSEIDON_16_COL_INDEX_INPUT_RES].push(index_res_a); for (i, value) in input.iter().enumerate() { trace.columns[POSEIDON_16_COL_INPUT_START + i].push(*value); } @@ -124,9 +200,9 @@ impl Air for Poseidon16Precompile { BUS as usize + 76 } fn eval(&self, builder: &mut AB, extra_data: &Self::ExtraData) { - let cols: Poseidon2Cols = { + let cols: Poseidon1Cols16 = { let up = builder.up(); - let (prefix, shorts, suffix) = unsafe { up.align_to::>() }; + let (prefix, shorts, suffix) = unsafe { up.align_to::>() }; debug_assert!(prefix.is_empty(), "Alignment should match"); debug_assert!(suffix.is_empty(), "Alignment should match"); debug_assert_eq!(shorts.len(), 1); @@ -157,13 +233,13 @@ impl Air for Poseidon16Precompile { builder.assert_bool(cols.flag); - eval(builder, &cols) + eval_poseidon1_16(builder, &cols) } } #[repr(C)] #[derive(Debug)] -pub(super) struct Poseidon2Cols { +pub(super) struct Poseidon1Cols16 { pub flag: T, pub index_a: T, pub index_b: T, @@ -176,51 +252,71 @@ pub(super) struct Poseidon2Cols { pub outputs: [T; WIDTH / 2], } -fn eval(builder: &mut AB, local: &Poseidon2Cols) { +fn eval_poseidon1_16(builder: &mut AB, local: &Poseidon1Cols16) { let mut state: [_; WIDTH] = local.inputs; - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(&mut state); - + let initial_constants = poseidon1_initial_constants(); for round in 0..HALF_INITIAL_FULL_ROUNDS { - eval_2_full_rounds( + eval_2_full_rounds_16( &mut state, &local.beginning_full_rounds[round], - &KOALABEAR_RC16_EXTERNAL_INITIAL[2 * round], - &KOALABEAR_RC16_EXTERNAL_INITIAL[2 * round + 1], + &initial_constants[2 * round], + &initial_constants[2 * round + 1], builder, ); } - for (round, cst) in KOALABEAR_RC16_INTERNAL.iter().enumerate().take(PARTIAL_ROUNDS) { - eval_partial_round(&mut state, &local.partial_rounds[round], *cst, builder); + // --- Sparse partial rounds --- + // Transition: add first-round constants, multiply by m_i + let frc = poseidon1_sparse_first_round_constants(); + for (s, &c) in state.iter_mut().zip(frc.iter()) { + add_kb(s, c); + } + dense_mat_vec_air_16(poseidon1_sparse_m_i(), &mut state); + + let first_rows = poseidon1_sparse_first_row(); + let v_vecs = poseidon1_sparse_v(); + let scalar_rc = poseidon1_sparse_scalar_round_constants(); + for round in 0..PARTIAL_ROUNDS { + // S-box on state[0] + state[0] = state[0].cube(); + builder.assert_eq(state[0], local.partial_rounds[round]); + state[0] = local.partial_rounds[round]; + // Scalar round constant (not on last round) + if round < PARTIAL_ROUNDS - 1 { + add_kb(&mut state[0], scalar_rc[round]); + } + // Sparse matrix: new_s0 = dot(first_row, state), state[i] += old_s0 * v[i-1] + sparse_mat_air_16(&mut state, &first_rows[round], &v_vecs[round]); } + let final_constants = poseidon1_final_constants(); for round in 0..HALF_FINAL_FULL_ROUNDS - 1 { - eval_2_full_rounds( + eval_2_full_rounds_16( &mut state, &local.ending_full_rounds[round], - &KOALABEAR_RC16_EXTERNAL_FINAL[2 * round], - &KOALABEAR_RC16_EXTERNAL_FINAL[2 * round + 1], + &final_constants[2 * round], + &final_constants[2 * round + 1], builder, ); } - eval_last_2_full_rounds( + eval_last_2_full_rounds_16( &local.inputs, &mut state, &local.outputs, - &KOALABEAR_RC16_EXTERNAL_FINAL[2 * (HALF_FINAL_FULL_ROUNDS - 1)], - &KOALABEAR_RC16_EXTERNAL_FINAL[2 * (HALF_FINAL_FULL_ROUNDS - 1) + 1], + &final_constants[2 * (HALF_FINAL_FULL_ROUNDS - 1)], + &final_constants[2 * (HALF_FINAL_FULL_ROUNDS - 1) + 1], builder, ); } pub const fn num_cols_poseidon_16() -> usize { - size_of::>() + size_of::>() } #[inline] -fn eval_2_full_rounds( +fn eval_2_full_rounds_16( state: &mut [AB::IF; WIDTH], post_full_round: &[AB::IF; WIDTH], round_constants_1: &[F; WIDTH], @@ -228,15 +324,15 @@ fn eval_2_full_rounds( builder: &mut AB, ) { for (s, r) in state.iter_mut().zip(round_constants_1.iter()) { - add_koala_bear(s, *r); + add_kb(s, *r); *s = s.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_air_16(state); for (s, r) in state.iter_mut().zip(round_constants_2.iter()) { - add_koala_bear(s, *r); + add_kb(s, *r); *s = s.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_air_16(state); for (state_i, post_i) in state.iter_mut().zip(post_full_round) { builder.assert_eq(*state_i, *post_i); *state_i = *post_i; @@ -244,7 +340,7 @@ fn eval_2_full_rounds( } #[inline] -fn eval_last_2_full_rounds( +fn eval_last_2_full_rounds_16( initial_state: &[AB::IF; WIDTH], state: &mut [AB::IF; WIDTH], outputs: &[AB::IF; WIDTH / 2], @@ -253,15 +349,15 @@ fn eval_last_2_full_rounds( builder: &mut AB, ) { for (s, r) in state.iter_mut().zip(round_constants_1.iter()) { - add_koala_bear(s, *r); + add_kb(s, *r); *s = s.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_air_16(state); for (s, r) in state.iter_mut().zip(round_constants_2.iter()) { - add_koala_bear(s, *r); + add_kb(s, *r); *s = s.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_air_16(state); // add inputs to outputs (for compression) for (state_i, init_state_i) in state.iter_mut().zip(initial_state) { *state_i += *init_state_i; @@ -273,35 +369,30 @@ fn eval_last_2_full_rounds( } #[inline] -fn eval_partial_round( - state: &mut [AB::IF; WIDTH], - post_partial_round: &AB::IF, - round_constant: F, - builder: &mut AB, -) { - add_koala_bear(&mut state[0], round_constant); - state[0] = state[0].cube(); - - builder.assert_eq(state[0], *post_partial_round); - state[0] = *post_partial_round; - - GenericPoseidon2LinearLayersKoalaBear::internal_linear_layer(state); +fn dense_mat_vec_air_16(mat: &[[F; 16]; 16], state: &mut [A; WIDTH]) { + let input = *state; + for i in 0..WIDTH { + let mut acc = A::ZERO; + for j in 0..WIDTH { + acc += mul_kb(input[j], mat[i][j]); + } + state[i] = acc; + } } -#[inline(always)] -fn add_koala_bear(a: &mut A, value: F) { - if TypeId::of::() == TypeId::of::() { - *unsafe { std::mem::transmute::<&mut A, &mut F>(a) } += value; - } else if TypeId::of::() == TypeId::of::() { - *unsafe { std::mem::transmute::<&mut A, &mut EF>(a) } += value; - } else if TypeId::of::() == TypeId::of::>() { - *unsafe { std::mem::transmute::<&mut A, &mut FPacking>(a) } += value; - } else if TypeId::of::() == TypeId::of::>() { - *unsafe { std::mem::transmute::<&mut A, &mut EFPacking>(a) } += FPacking::::from(value); - } else if TypeId::of::() == TypeId::of::>() { - *unsafe { std::mem::transmute::<&mut A, &mut SymbolicExpression>(a) } += value; - } else { - dbg!(std::any::type_name::()); - unreachable!() +#[inline] +fn sparse_mat_air_16( + state: &mut [A; WIDTH], + first_row: &[F; WIDTH], + v: &[F; WIDTH], +) { + let old_s0 = state[0]; + let mut new_s0 = A::ZERO; + for j in 0..WIDTH { + new_s0 += mul_kb(state[j], first_row[j]); + } + state[0] = new_s0; + for i in 1..WIDTH { + state[i] += mul_kb(old_s0, v[i - 1]); } } diff --git a/crates/lean_vm/src/tables/poseidon_16/trace_gen.rs b/crates/lean_vm/src/tables/poseidon_16/trace_gen.rs index 3e2acfd0..04a7455c 100644 --- a/crates/lean_vm/src/tables/poseidon_16/trace_gen.rs +++ b/crates/lean_vm/src/tables/poseidon_16/trace_gen.rs @@ -2,11 +2,11 @@ use tracing::instrument; use crate::{ F, ZERO_VEC_PTR, - tables::{Poseidon2Cols, WIDTH, num_cols_poseidon_16}, + tables::{Poseidon1Cols16, WIDTH, num_cols_poseidon_16}, }; use backend::*; -#[instrument(name = "generate Poseidon2 trace", skip_all)] +#[instrument(name = "generate Poseidon16 AIR trace", skip_all)] pub fn fill_trace_poseidon_16(trace: &mut [Vec]) { let n = trace.iter().map(|col| col.len()).max().unwrap(); for col in trace.iter_mut() { @@ -19,13 +19,13 @@ pub fn fill_trace_poseidon_16(trace: &mut [Vec]) { let trace_packed: Vec<_> = trace.iter().map(|col| FPacking::::pack_slice(&col[..m])).collect(); // fill the packed rows - (0..n / packing_width::()).into_par_iter().for_each(|i| { + (0..m / packing_width::()).into_par_iter().for_each(|i| { let ptrs: Vec<*mut FPacking> = trace_packed .iter() .map(|col| unsafe { (col.as_ptr() as *mut FPacking).add(i) }) .collect(); - let perm: &mut Poseidon2Cols<&mut FPacking> = - unsafe { &mut *(ptrs.as_ptr() as *mut Poseidon2Cols<&mut FPacking>) }; + let perm: &mut Poseidon1Cols16<&mut FPacking> = + unsafe { &mut *(ptrs.as_ptr() as *mut Poseidon1Cols16<&mut FPacking>) }; generate_trace_rows_for_perm(perm); }); @@ -36,16 +36,18 @@ pub fn fill_trace_poseidon_16(trace: &mut [Vec]) { .iter() .map(|col| unsafe { (col.as_ptr() as *mut F).add(i) }) .collect(); - let perm: &mut Poseidon2Cols<&mut F> = unsafe { &mut *(ptrs.as_ptr() as *mut Poseidon2Cols<&mut F>) }; + let perm: &mut Poseidon1Cols16<&mut F> = unsafe { &mut *(ptrs.as_ptr() as *mut Poseidon1Cols16<&mut F>) }; generate_trace_rows_for_perm(perm); } } -pub fn default_poseidon_row(null_hash_ptr: usize) -> Vec { +pub fn default_poseidon_16_row(null_hash_ptr: usize) -> Vec { let mut row = vec![F::ZERO; num_cols_poseidon_16()]; - let ptrs: [*mut F; num_cols_poseidon_16()] = std::array::from_fn(|i| unsafe { row.as_mut_ptr().add(i) }); + let ptrs: Vec<*mut F> = (0..num_cols_poseidon_16()) + .map(|i| unsafe { row.as_mut_ptr().add(i) }) + .collect(); - let perm: &mut Poseidon2Cols<&mut F> = unsafe { &mut *(ptrs.as_ptr() as *mut Poseidon2Cols<&mut F>) }; + let perm: &mut Poseidon1Cols16<&mut F> = unsafe { &mut *(ptrs.as_ptr() as *mut Poseidon1Cols16<&mut F>) }; perm.inputs.iter_mut().for_each(|x| **x = F::ZERO); *perm.flag = F::ZERO; *perm.index_a = F::from_usize(ZERO_VEC_PTR); @@ -56,29 +58,60 @@ pub fn default_poseidon_row(null_hash_ptr: usize) -> Vec { row } -fn generate_trace_rows_for_perm + Copy>(perm: &mut Poseidon2Cols<&mut F>) { +fn generate_trace_rows_for_perm + Copy>(perm: &mut Poseidon1Cols16<&mut F>) { let inputs: [F; WIDTH] = std::array::from_fn(|i| *perm.inputs[i]); let mut state = inputs; - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(&mut state); + // No initial linear layer for Poseidon1 (unlike Poseidon2) for (full_round, constants) in perm .beginning_full_rounds .iter_mut() - .zip(KOALABEAR_RC16_EXTERNAL_INITIAL.chunks_exact(2)) + .zip(poseidon1_initial_constants().chunks_exact(2)) { generate_2_full_round(&mut state, full_round, &constants[0], &constants[1]); } - for (partial_round, constant) in perm.partial_rounds.iter_mut().zip(&KOALABEAR_RC16_INTERNAL) { - generate_partial_round(&mut state, partial_round, *constant); + // --- Sparse partial rounds --- + // Transition: add first-round constants, multiply by m_i + let frc = poseidon1_sparse_first_round_constants(); + for (s, &c) in state.iter_mut().zip(frc.iter()) { + *s += c; + } + let m_i = poseidon1_sparse_m_i(); + let input_for_mi = state; + for i in 0..WIDTH { + let row: [F; WIDTH] = m_i[i].map(F::from); + state[i] = F::dot_product(&input_for_mi, &row); + } + + let first_rows = poseidon1_sparse_first_row(); + let v_vecs = poseidon1_sparse_v(); + let scalar_rc = poseidon1_sparse_scalar_round_constants(); + let n_partial = perm.partial_rounds.len(); + for round in 0..n_partial { + // S-box on state[0] + state[0] = state[0].cube(); + *perm.partial_rounds[round] = state[0]; + // Scalar round constant (not on last round) + if round < n_partial - 1 { + state[0] += scalar_rc[round]; + } + // Sparse matrix + let old_s0 = state[0]; + let row: [F; WIDTH] = first_rows[round].map(F::from); + let new_s0 = F::dot_product(&state, &row); + state[0] = new_s0; + for i in 1..WIDTH { + state[i] += old_s0 * v_vecs[round][i - 1]; + } } let n_ending_full_rounds = perm.ending_full_rounds.len(); for (full_round, constants) in perm .ending_full_rounds .iter_mut() - .zip(KOALABEAR_RC16_EXTERNAL_FINAL.chunks_exact(2)) + .zip(poseidon1_final_constants().chunks_exact(2)) { generate_2_full_round(&mut state, full_round, &constants[0], &constants[1]); } @@ -88,8 +121,8 @@ fn generate_trace_rows_for_perm + Copy>(perm: &mut Poseido &mut state, &inputs, &mut perm.outputs, - &KOALABEAR_RC16_EXTERNAL_FINAL[2 * n_ending_full_rounds], - &KOALABEAR_RC16_EXTERNAL_FINAL[2 * n_ending_full_rounds + 1], + &poseidon1_final_constants()[2 * n_ending_full_rounds], + &poseidon1_final_constants()[2 * n_ending_full_rounds + 1], ); } @@ -100,18 +133,17 @@ fn generate_2_full_round + Copy>( round_constants_1: &[KoalaBear; WIDTH], round_constants_2: &[KoalaBear; WIDTH], ) { - // Combine addition of round constants and S-box application in a single loop for (state_i, const_i) in state.iter_mut().zip(round_constants_1) { *state_i += *const_i; *state_i = state_i.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_circ_16(state); for (state_i, const_i) in state.iter_mut().zip(round_constants_2.iter()) { *state_i += *const_i; *state_i = state_i.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_circ_16(state); post_full_round.iter_mut().zip(*state).for_each(|(post, x)| { **post = x; @@ -130,28 +162,16 @@ fn generate_last_2_full_rounds + Copy>( *state_i += *const_i; *state_i = state_i.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_circ_16(state); for (state_i, const_i) in state.iter_mut().zip(round_constants_2.iter()) { *state_i += *const_i; *state_i = state_i.cube(); } - GenericPoseidon2LinearLayersKoalaBear::external_linear_layer(state); + mds_circ_16(state); // Add inputs to outputs (compression) for ((output, state_i), &input_i) in outputs.iter_mut().zip(state).zip(inputs) { **output = *state_i + input_i; } } - -#[inline] -fn generate_partial_round + Copy>( - state: &mut [F; WIDTH], - post_partial_round: &mut F, - round_constant: KoalaBear, -) { - state[0] += round_constant; - state[0] = state[0].cube(); - *post_partial_round = state[0]; - GenericPoseidon2LinearLayersKoalaBear::internal_linear_layer(state); -} diff --git a/crates/lean_vm/src/tables/table_trait.rs b/crates/lean_vm/src/tables/table_trait.rs index 4504123d..3300d92c 100644 --- a/crates/lean_vm/src/tables/table_trait.rs +++ b/crates/lean_vm/src/tables/table_trait.rs @@ -132,10 +132,6 @@ pub trait TableT: Air { false } - fn n_committed_columns(&self) -> usize { - self.n_columns() - } - fn lookup_index_columns<'a>(&'a self, trace: &'a TableTrace) -> Vec<&'a [F]> { self.lookups() .iter() diff --git a/crates/rec_aggregation/recursion.py b/crates/rec_aggregation/recursion.py index c8467144..52964da4 100644 --- a/crates/rec_aggregation/recursion.py +++ b/crates/rec_aggregation/recursion.py @@ -722,7 +722,7 @@ def compute_total_gkr_n_vars(log_memory, log_bytecode_padded, tables_heights): def evaluate_air_constraints(table_index, inner_evals, air_alpha_powers, bus_beta, logup_alphas_eq_poly): res: Imu - debug_assert(table_index < 3) + debug_assert(table_index < N_TABLES) match table_index: case 0: res = evaluate_air_constraints_table_0(inner_evals, air_alpha_powers, bus_beta, logup_alphas_eq_poly) diff --git a/crates/rec_aggregation/src/benchmark.rs b/crates/rec_aggregation/src/benchmark.rs index 9bf3ef50..522bef14 100644 --- a/crates/rec_aggregation/src/benchmark.rs +++ b/crates/rec_aggregation/src/benchmark.rs @@ -1,13 +1,10 @@ -use std::io::{self, Write}; -use std::time::Instant; - use backend::*; use lean_vm::*; -use utils::pretty_integer; -use xmss::signers_cache::*; -use xmss::{XmssPublicKey, XmssSignature}; - +use std::io::{self, Write}; +use std::time::Instant; use utils::ansi as s; +use xmss::signers_cache::{BENCHMARK_SLOT, get_benchmark_signatures, message_for_benchmark}; +use xmss::{XmssPublicKey, XmssSignature}; use crate::compilation::{get_aggregation_bytecode, init_aggregation_bytecode}; use crate::{AggregatedXMSS, AggregationTopology, count_signers, xmss_aggregate}; @@ -217,20 +214,19 @@ fn build_aggregation( signatures: &[XmssSignature], overlap: usize, tracing: bool, -) -> (AggregatedXMSS, f64) { - let message = message_for_benchmark(); - let slot = BENCHMARK_SLOT; +) -> (Vec, AggregatedXMSS, f64) { let raw_count = topology.raw_xmss; let raw_xmss: Vec<(XmssPublicKey, XmssSignature)> = (0..raw_count) .map(|i| (pub_keys[i].clone(), signatures[i].clone())) .collect(); - let mut child_results = vec![]; + let mut child_pub_keys_list: Vec> = vec![]; + let mut child_aggs: Vec = vec![]; let mut child_start = raw_count; let mut child_display_index = display_index; for (child_idx, child) in topology.children.iter().enumerate() { let child_count = count_signers(child, overlap); - let (child_agg, _) = build_aggregation( + let (child_pks, child_agg, _) = build_aggregation( child, child_display_index, display, @@ -239,7 +235,8 @@ fn build_aggregation( overlap, tracing, ); - child_results.push(child_agg); + child_pub_keys_list.push(child_pks); + child_aggs.push(child_agg); child_display_index += count_nodes(child); child_start += child_count; if child_idx < topology.children.len() - 1 { @@ -247,8 +244,20 @@ fn build_aggregation( } } + let children: Vec<(&[XmssPublicKey], AggregatedXMSS)> = child_pub_keys_list + .iter() + .zip(child_aggs) + .map(|(pks, agg)| (pks.as_slice(), agg)) + .collect(); + let time = Instant::now(); - let result = xmss_aggregate(&child_results, raw_xmss, &message, slot, topology.log_inv_rate); + let (global_pub_keys, result) = xmss_aggregate( + &children, + raw_xmss, + &message_for_benchmark(), + BENCHMARK_SLOT, + topology.log_inv_rate, + ); let elapsed = time.elapsed(); if tracing { @@ -285,7 +294,7 @@ fn build_aggregation( ); } - (result, elapsed.as_secs_f64()) + (global_pub_keys, result, elapsed.as_secs_f64()) } pub fn run_aggregation_benchmark(topology: &AggregationTopology, overlap: usize, tracing: bool) -> f64 { @@ -296,13 +305,9 @@ pub fn run_aggregation_benchmark(topology: &AggregationTopology, overlap: usize, let n_sigs = count_signers(topology, overlap); - let cache = get_benchmark_signers_cache(); + let cache = get_benchmark_signatures(); assert!(cache.len() >= n_sigs); - let paired: Vec<_> = (0..n_sigs) - .into_par_iter() - .map(|i| reconstruct_signer_for_benchmark(i, cache[i])) - .collect(); - let (pub_keys, signatures): (Vec<_>, Vec<_>) = paired.into_iter().unzip(); + let (pub_keys, signatures): (Vec<_>, Vec<_>) = cache[..n_sigs].iter().cloned().unzip(); init_aggregation_bytecode(); println!( @@ -320,12 +325,17 @@ pub fn run_aggregation_benchmark(topology: &AggregationTopology, overlap: usize, display.print_initial(); } - let (aggregated_sigs, time) = + let (global_pub_keys, aggregated_sigs, time) = build_aggregation(topology, 0, &mut display, &pub_keys, &signatures, overlap, tracing); // Verify root proof - let message = message_for_benchmark(); - crate::xmss_verify_aggregation(&aggregated_sigs, &message, BENCHMARK_SLOT).unwrap(); + crate::xmss_verify_aggregation( + &global_pub_keys, + &aggregated_sigs, + &message_for_benchmark(), + BENCHMARK_SLOT, + ) + .unwrap(); time } diff --git a/crates/rec_aggregation/src/compilation.rs b/crates/rec_aggregation/src/compilation.rs index 04cfa60a..4fa34e46 100644 --- a/crates/rec_aggregation/src/compilation.rs +++ b/crates/rec_aggregation/src/compilation.rs @@ -374,13 +374,53 @@ fn all_air_evals_in_zk_dsl() -> String { const AIR_INNER_VALUES_VAR: &str = "inner_evals"; +struct AirCodegenCtx { + expr_cache: HashMap, + consts_cache: HashMap, String>, + ef_const_cache: HashMap, + ctr: Counter, +} + +impl AirCodegenCtx { + fn new() -> Self { + Self { + expr_cache: HashMap::new(), + consts_cache: HashMap::new(), + ef_const_cache: HashMap::new(), + ctr: Counter::new(), + } + } + + fn write_base_constants(&mut self, values: &[u32], res: &mut String) -> String { + if let Some(name) = self.consts_cache.get(values) { + return name.clone(); + } + let name = format!("bc_{}", self.ctr.get_next()); + res.push_str(&format!("\n {} = Array({})", name, values.len())); + for (i, &c) in values.iter().enumerate() { + res.push_str(&format!("\n {}[{}] = {}", name, i, c)); + } + self.consts_cache.insert(values.to_vec(), name.clone()); + name + } + + fn write_embedded_constant(&mut self, c: u32, res: &mut String) -> String { + if let Some(name) = self.ef_const_cache.get(&c) { + return name.clone(); + } + let name = format!("aux_{}", self.ctr.get_next()); + res.push_str(&format!("\n {} = embed_in_ef({})", name, c)); + self.ef_const_cache.insert(c, name.clone()); + name + } +} + fn air_eval_in_zk_dsl(table: T) -> String where T::ExtraData: Default, { let (constraints, bus_flag, bus_data) = get_symbolic_constraints_and_bus_data_values::(&table); - let mut vars_counter = Counter::new(); - let mut cache: HashMap = HashMap::new(); + let mut ctx = AirCodegenCtx::new(); let mut res = format!( "def evaluate_air_constraints_table_{}({}, air_alpha_powers, bus_beta, logup_alphas_eq_poly):\n", @@ -392,14 +432,14 @@ where res += &format!("\n constraints_buf = Array(DIM * {})", n_constraints); for (index, constraint) in constraints.iter().enumerate() { let dest = format!("constraints_buf + {} * DIM", index); - eval_air_constraint(*constraint, Some(&dest), &mut cache, &mut res, &mut vars_counter); + eval_air_constraint(*constraint, Some(&dest), &mut ctx, &mut res); } // first: bus data - let flag = eval_air_constraint(bus_flag, None, &mut cache, &mut res, &mut vars_counter); + let flag = eval_air_constraint(bus_flag, None, &mut ctx, &mut res); res += &format!("\n buff = Array(DIM * {})", bus_data.len()); for (i, data) in bus_data.iter().enumerate() { - let data_str = eval_air_constraint(*data, None, &mut cache, &mut res, &mut vars_counter); + let data_str = eval_air_constraint(*data, None, &mut ctx, &mut res); res += &format!("\n copy_5({}, buff + DIM * {})", data_str, i); } // dot product: bus_res = sum(buff[i] * logup_alphas_eq_poly[i]) for i in 0..bus_data.len() @@ -428,62 +468,142 @@ where res } -/// Evaluate a symbolic AIR constraint expression, emitting zkDSL code into `res`. -/// If `dest` is Some, writes the result directly there (avoids a copy_5). -/// If `dest` is None, allocates an aux var. Returns the var/pointer where the result lives. fn eval_air_constraint( expr: SymbolicExpression, dest: Option<&str>, - cache: &mut HashMap, + ctx: &mut AirCodegenCtx, res: &mut String, - ctr: &mut Counter, ) -> String { - match expr { - SymbolicExpression::Constant(c) => { - let v = format!("aux_{}", ctr.get_next()); - res.push_str(&format!("\n {} = embed_in_ef({})", v, c.as_canonical_u32())); - v - } + let v = match expr { + SymbolicExpression::Constant(c) => ctx.write_embedded_constant(c.as_canonical_u32(), res), SymbolicExpression::Variable(v) => format!("{} + DIM * {}", AIR_INNER_VALUES_VAR, v.index), SymbolicExpression::Operation(idx) => { - if let Some(v) = cache.get(&idx) { - if let Some(d) = dest { - res.push_str(&format!("\n copy_5({}, {})", v, d)); - } - return v.clone(); + if let Some(v) = ctx.expr_cache.get(&idx) { + v.clone() + } else if let Some(v) = try_emit_dot_product_be(idx, dest, ctx, res) { + ctx.expr_cache.insert(idx, v.clone()); + return v; + } else { + let node = get_node::(idx); + let v = match node.op { + SymbolicOperation::Neg => { + let a = eval_air_constraint(node.lhs, None, ctx, res); + let v = format!("aux_{}", ctx.ctr.get_next()); + res.push_str(&format!("\n {} = opposite_extension_ret({})", v, a)); + v + } + _ => eval_air_binary_op(node.op, node.lhs, node.rhs, dest, ctx, res), + }; + ctx.expr_cache.insert(idx, v.clone()); + v } - let node = get_node::(idx); - let v = match node.op { - SymbolicOperation::Neg => { - let a = eval_air_constraint(node.lhs, None, cache, res, ctr); - let v = format!("aux_{}", ctr.get_next()); - res.push_str(&format!("\n {} = opposite_extension_ret({})", v, a)); - v + } + }; + if let Some(d) = dest + && v != d + { + res.push_str(&format!("\n copy_5({}, {})", v, d)); + } + v +} + +/// Detect `0 + c0*x0 + c1*x1 + ... + cn*xn` in the expression tree and emit +/// a single `dot_product_be` precompile call. Returns None if the pattern doesn't match. +fn try_emit_dot_product_be(idx: u32, dest: Option<&str>, ctx: &mut AirCodegenCtx, res: &mut String) -> Option { + // Walk the left-spine of Add(_, Mul(Const, _)) nodes down to Constant(ZERO). + let mut constants = Vec::new(); + let mut operands = Vec::new(); + let mut current = SymbolicExpression::::Operation(idx); + loop { + match current { + SymbolicExpression::Constant(c) if c == F::ZERO && constants.len() >= 2 => break, + SymbolicExpression::Operation(op_idx) => { + if op_idx != idx && ctx.expr_cache.contains_key(&op_idx) { + return None; } - _ => eval_air_binop(node.op, node.lhs, node.rhs, dest, cache, res, ctr), - }; - // If dest was requested but the result landed elsewhere, copy it - if let Some(d) = dest - && v != d - { - res.push_str(&format!("\n copy_5({}, {})", v, d)); + let node = get_node::(op_idx); + if node.op != SymbolicOperation::Add { + return None; + } + let mul_idx = match node.rhs { + SymbolicExpression::Operation(i) => i, + _ => return None, + }; + let mul = get_node::(mul_idx); + if mul.op != SymbolicOperation::Mul { + return None; + } + let (c, expr) = match (mul.lhs, mul.rhs) { + (SymbolicExpression::Constant(c), o) | (o, SymbolicExpression::Constant(c)) => { + (c.as_canonical_u32(), o) + } + _ => return None, + }; + constants.push(c); + operands.push(expr); + current = node.lhs; } - cache.insert(idx, v.clone()); + _ => return None, + } + } + constants.reverse(); + operands.reverse(); + let n = constants.len(); + + let consts = ctx.write_base_constants(&constants, res); + + // Reuse an existing contiguous buffer if possible. + let vals = try_find_contiguous_buffer(&operands, ctx).unwrap_or_else(|| { + let buf = format!("dp_v_{}", ctx.ctr.get_next()); + res.push_str(&format!("\n {} = Array(DIM * {})", buf, n)); + for (i, ext) in operands.iter().enumerate() { + eval_air_constraint(*ext, Some(&format!("{} + DIM * {}", buf, i)), ctx, res); + } + buf + }); + + let dp_dest = dest.map_or_else( + || { + let v = format!("aux_{}", ctx.ctr.get_next()); + res.push_str(&format!("\n {} = Array(DIM)", v)); v + }, + |d| d.to_string(), + ); + res.push_str(&format!( + "\n dot_product_be({}, {}, {}, {})", + consts, vals, dp_dest, n + )); + Some(dp_dest) +} + +/// Check whether every operand is already cached as consecutive slots in the +/// same buffer (`buf + DIM * 0`, `buf + DIM * 1`, …). +fn try_find_contiguous_buffer(operands: &[SymbolicExpression], ctx: &AirCodegenCtx) -> Option { + let mut base: Option<&str> = None; + for (i, op) in operands.iter().enumerate() { + let idx = match op { + SymbolicExpression::Operation(idx) => *idx, + _ => return None, + }; + let suffix = format!(" + DIM * {}", i); + let this_base = ctx.expr_cache.get(&idx)?.strip_suffix(&suffix)?; + match base { + None => base = Some(this_base), + Some(b) if b == this_base => {} + _ => return None, } } + base.map(|s| s.to_string()) } -/// Evaluate a binary operation (Add/Sub/Mul). When `dest` is Some and the operation -/// supports it, writes directly to dest and returns dest; otherwise allocates an aux var. -fn eval_air_binop( +fn eval_air_binary_op( op: SymbolicOperation, lhs: SymbolicExpression, rhs: SymbolicExpression, dest: Option<&str>, - cache: &mut HashMap, + ctx: &mut AirCodegenCtx, res: &mut String, - ctr: &mut Counter, ) -> String { let c0 = match lhs { SymbolicExpression::Constant(c) => Some(c.as_canonical_u32()), @@ -497,8 +617,8 @@ fn eval_air_binop( match (c0, c1) { // Both extension (None, None) => { - let a = eval_air_constraint(lhs, None, cache, res, ctr); - let b = eval_air_constraint(rhs, None, cache, res, ctr); + let a = eval_air_constraint(lhs, None, ctx, res); + let b = eval_air_constraint(rhs, None, ctx, res); if let Some(d) = dest { let f = match op { SymbolicOperation::Mul => "mul_extension", @@ -515,26 +635,27 @@ fn eval_air_binop( SymbolicOperation::Sub => "sub_extension_ret", _ => unreachable!(), }; - let v = format!("aux_{}", ctr.get_next()); + let v = format!("aux_{}", ctx.ctr.get_next()); res.push_str(&format!("\n {} = {}({}, {})", v, f, a, b)); v } } - // Mul/Add with a constant (commutative for base-ext) + // Mul/Add with a base-field constant _ if matches!(op, SymbolicOperation::Mul | SymbolicOperation::Add) => { let (c, ext_expr) = match (c0, c1) { (Some(c), _) => (c, rhs), (_, Some(c)) => (c, lhs), _ => unreachable!(), }; - let ext = eval_air_constraint(ext_expr, None, cache, res, ctr); + let ext = eval_air_constraint(ext_expr, None, ctx, res); if let Some(d) = dest { let f = if matches!(op, SymbolicOperation::Mul) { "dot_product_be" } else { "add_be" }; - emit_base_precompile(res, ctr, f, c, &ext, d); + let scalar = ctx.write_base_constants(&[c], res); + res.push_str(&format!("\n {}({}, {}, {})", f, scalar, ext, d)); d.to_string() } else { let f = if matches!(op, SymbolicOperation::Mul) { @@ -542,27 +663,27 @@ fn eval_air_binop( } else { "add_base_extension_ret" }; - let v = format!("aux_{}", ctr.get_next()); + let v = format!("aux_{}", ctx.ctr.get_next()); res.push_str(&format!("\n {} = {}({}, {})", v, f, c, ext)); v } } // Sub: base - ext (Some(c), _) => { - let ext = eval_air_constraint(rhs, None, cache, res, ctr); - let v = format!("aux_{}", ctr.get_next()); + let ext = eval_air_constraint(rhs, None, ctx, res); + let v = format!("aux_{}", ctx.ctr.get_next()); res.push_str(&format!("\n {} = sub_base_extension_ret({}, {})", v, c, ext)); v } // Sub: ext - base (_, Some(c)) => { - let ext = eval_air_constraint(lhs, None, cache, res, ctr); + let ext = eval_air_constraint(lhs, None, ctx, res); if let Some(d) = dest { - // add_be(tmp, dest, ext) asserts ext = tmp + dest, i.e. dest = ext - tmp - emit_base_precompile(res, ctr, "add_be", c, d, &ext); + let scalar = ctx.write_base_constants(&[c], res); + res.push_str(&format!("\n add_be({}, {}, {})", scalar, d, ext)); d.to_string() } else { - let v = format!("aux_{}", ctr.get_next()); + let v = format!("aux_{}", ctx.ctr.get_next()); res.push_str(&format!("\n {} = sub_extension_base_ret({}, {})", v, ext, c)); v } @@ -570,16 +691,12 @@ fn eval_air_binop( } } -/// Emit: `tmp = Array(1); tmp[0] = c; func(tmp, arg2, arg3)` -fn emit_base_precompile(res: &mut String, ctr: &mut Counter, func: &str, c: u32, arg2: &str, arg3: &str) { - let tmp = format!("aux_{}", ctr.get_next()); - res.push_str(&format!( - "\n {} = Array(1)\n {}[0] = {}\n {}({}, {}, {})", - tmp, tmp, c, func, tmp, arg2, arg3 - )); -} - #[test] fn display_all_air_evals_in_zk_dsl() { println!("{}", all_air_evals_in_zk_dsl()); } + +#[test] +fn display_poseidon_air_in_zk_dsl() { + println!("{}", air_eval_in_zk_dsl(Poseidon16Precompile:: {})); +} diff --git a/crates/rec_aggregation/src/lib.rs b/crates/rec_aggregation/src/lib.rs index a00bed5e..9fc484f9 100644 --- a/crates/rec_aggregation/src/lib.rs +++ b/crates/rec_aggregation/src/lib.rs @@ -92,7 +92,6 @@ fn encode_xmss_signature(sig: &XmssSignature) -> Vec { #[derive(Debug, Serialize, Deserialize, Clone)] pub struct AggregatedXMSS { - pub pub_keys: Vec, pub proof: Proof, pub bytecode_point: Option>, // benchmark / debug purpose @@ -111,7 +110,7 @@ impl AggregatedXMSS { postcard::from_bytes(&decompressed).ok() } - pub fn public_input(&self, message: &[F; MESSAGE_LEN_FE], slot: u32) -> Vec { + pub fn public_input(&self, pub_keys: &[XmssPublicKey], message: &[F; MESSAGE_LEN_FE], slot: u32) -> Vec { let bytecode = get_aggregation_bytecode(); let bytecode_point_n_vars = bytecode.log_size() + log2_ceil_usize(N_INSTRUCTION_COLUMNS); let bytecode_claim_size = (bytecode_point_n_vars + 1) * DIMENSION; @@ -131,10 +130,10 @@ impl AggregatedXMSS { }; assert_eq!(bytecode_claim_output.len(), bytecode_claim_size); - let slice_hash = hash_pubkeys(&self.pub_keys); + let slice_hash = hash_pubkeys(pub_keys); build_non_reserved_public_input( - self.pub_keys.len(), + pub_keys.len(), &slice_hash, message, slot, @@ -145,14 +144,15 @@ impl AggregatedXMSS { } pub fn xmss_verify_aggregation( + pub_keys: &[XmssPublicKey], agg_sig: &AggregatedXMSS, message: &[F; MESSAGE_LEN_FE], slot: u32, ) -> Result { - if !agg_sig.pub_keys.is_sorted() { + if !pub_keys.is_sorted() { return Err(ProofError::InvalidProof); } - let public_input = agg_sig.public_input(message, slot); + let public_input = agg_sig.public_input(pub_keys, message, slot); let bytecode = get_aggregation_bytecode(); verify_execution(bytecode, &public_input, agg_sig.proof.clone()).map(|(details, _)| details) } @@ -160,12 +160,12 @@ pub fn xmss_verify_aggregation( /// panics if one of the sub-proof (children) is invalid #[instrument(skip_all)] pub fn xmss_aggregate( - children: &[AggregatedXMSS], + children: &[(&[XmssPublicKey], AggregatedXMSS)], mut raw_xmss: Vec<(XmssPublicKey, XmssSignature)>, message: &[F; MESSAGE_LEN_FE], slot: u32, log_inv_rate: usize, -) -> AggregatedXMSS { +) -> (Vec, AggregatedXMSS) { raw_xmss.sort_by(|(a, _), (b, _)| a.cmp(b)); raw_xmss.dedup_by(|(a, _), (b, _)| a.merkle_root == b.merkle_root); @@ -179,9 +179,9 @@ pub fn xmss_aggregate( // Build global_pub_keys as sorted deduplicated union let mut global_pub_keys: Vec = raw_xmss.iter().map(|(pk, _)| pk.clone()).collect(); - for child in children.iter() { - assert!(child.pub_keys.is_sorted(), "child pub_keys must be sorted"); - global_pub_keys.extend_from_slice(&child.pub_keys); + for (child_pub_keys, _) in children.iter() { + assert!(child_pub_keys.is_sorted(), "child pub_keys must be sorted"); + global_pub_keys.extend_from_slice(child_pub_keys); } global_pub_keys.sort(); global_pub_keys.dedup(); @@ -191,8 +191,8 @@ pub fn xmss_aggregate( let mut child_pub_inputs = vec![]; let mut child_bytecode_evals = vec![]; let mut child_raw_proofs = vec![]; - for child in children { - let child_pub_input = child.public_input(message, slot); + for (child_pub_keys, child) in children { + let child_pub_input = child.public_input(child_pub_keys, message, slot); let (verif, raw_proof) = verify_execution(bytecode, &child_pub_input, child.proof.clone()).unwrap(); child_bytecode_evals.push(verif.bytecode_evaluation); child_pub_inputs.push(child_pub_input); @@ -308,15 +308,15 @@ pub fn xmss_aggregate( } // Sources 1..n_recursions: recursive children - for (i, child) in children.iter().enumerate() { - let mut block = vec![F::from_usize(child.pub_keys.len())]; - for key in &child.pub_keys { - if claimed.insert(key.clone()) { - let pos = global_pub_keys.binary_search(key).unwrap(); + for (i, (child_pub_keys, _)) in children.iter().enumerate() { + let mut block = vec![F::from_usize(child_pub_keys.len())]; + for pubkey in *child_pub_keys { + if claimed.insert(pubkey.clone()) { + let pos = global_pub_keys.binary_search(pubkey).unwrap(); block.push(F::from_usize(pos)); } else { block.push(F::from_usize(n_sigs + dup_pub_keys.len())); - dup_pub_keys.push(key.clone()); + dup_pub_keys.push(pubkey.clone()); } } @@ -384,12 +384,14 @@ pub fn xmss_aggregate( }; let execution_proof = prove_execution(bytecode, &non_reserved_public_input, &witness, &whir_config, false); - AggregatedXMSS { - pub_keys: global_pub_keys, - proof: execution_proof.proof, - bytecode_point, - metadata: Some(execution_proof.metadata), - } + ( + global_pub_keys, + AggregatedXMSS { + proof: execution_proof.proof, + bytecode_point, + metadata: Some(execution_proof.metadata), + }, + ) } pub fn extract_bytecode_claim_from_public_input(public_input: &[F], bytecode_point_n_vars: usize) -> Evaluation { diff --git a/crates/rec_aggregation/utils.py b/crates/rec_aggregation/utils.py index 4104c6eb..6bb10ac8 100644 --- a/crates/rec_aggregation/utils.py +++ b/crates/rec_aggregation/utils.py @@ -174,21 +174,6 @@ def mle_of_01234567_etc(point, n): return res -def range_check_power_of_2(a, n_bits: Const): - # assert a < 2**n_bits - debug_assert(n_bits < 30) - if n_bits <= 16: - assert a < 2**n_bits - else: - lo: Imu - hi: Imu - hint_decompose_16(a, lo, hi) - assert lo < 2**16 - assert hi < 2 ** (n_bits - 16) - assert a == lo + hi * 2**16 - return - - @inline def checked_less_than(a, b): res: Imu @@ -451,24 +436,22 @@ def checked_decompose_bits(a): def checked_decompose_bits_and_compute_root_pow_const(a, domain_size): # Hint 6 nibbles (4 bits each) + 1 top-7-bit value = 7 hints nibbles = Array(6) - top7 = Array(1) - a_ptr = Array(1) - a_ptr[0] = a - hint_decompose_bits_xmss(nibbles, top7, a_ptr, 1, 4) + top7: Imu + hint_decompose_bits_merkle_whir(nibbles, top7, a, 4) for i in unroll(0, 6): assert nibbles[i] < 16 - assert top7[0] < 2**7 + assert top7 < 2**7 partial_sum: Mut = nibbles[0] for i in unroll(1, 6): partial_sum += nibbles[i] * 16**i - if top7[0] == 2**7 - 1: + if top7 == 2**7 - 1: assert partial_sum == 0 - assert partial_sum + top7[0] * 2**24 == a + assert partial_sum + top7 * 2**24 == a # Compute domain_generator^index prod: Mut = 1 diff --git a/crates/sub_protocols/src/stacked_pcs.rs b/crates/sub_protocols/src/stacked_pcs.rs index 1070d602..d7ba6565 100644 --- a/crates/sub_protocols/src/stacked_pcs.rs +++ b/crates/sub_protocols/src/stacked_pcs.rs @@ -79,7 +79,7 @@ pub fn stacked_pcs_global_statements( .collect(), )); } - offset += table.n_committed_columns() << n_vars; + offset += table.n_columns() << n_vars; } global_statements } @@ -179,7 +179,7 @@ fn compute_stacked_n_vars( + (1 << log_bytecode.max(max_table_log_n_rows)) + tables_log_heights .iter() - .map(|(table, log_n_rows)| table.n_committed_columns() << log_n_rows) + .map(|(table, log_n_rows)| table.n_columns() << log_n_rows) .sum::(); log2_ceil_usize(total_len) } @@ -198,7 +198,7 @@ pub fn total_whir_statements() -> usize { .iter() .map(|table| { // AIR - table.n_committed_columns() + table.n_columns() + table.n_down_columns() // Lookups into memory + table.lookups().iter().map(|lookup| 1 + lookup.values.len()).sum::() diff --git a/crates/utils/src/display.rs b/crates/utils/src/display.rs deleted file mode 100644 index df4451e9..00000000 --- a/crates/utils/src/display.rs +++ /dev/null @@ -1,15 +0,0 @@ -pub fn pretty_integer(i: usize) -> String { - // ex: 123456789 -> "123,456,789" - let s = i.to_string(); - let chars: Vec = s.chars().collect(); - let mut result = String::new(); - - for (index, ch) in chars.iter().enumerate() { - if index > 0 && (chars.len() - index).is_multiple_of(3) { - result.push(','); - } - result.push(*ch); - } - - result -} diff --git a/crates/utils/src/lib.rs b/crates/utils/src/lib.rs index eec86f62..d7e36a8d 100644 --- a/crates/utils/src/lib.rs +++ b/crates/utils/src/lib.rs @@ -11,11 +11,8 @@ pub use multilinear::*; mod wrappers; pub use wrappers::*; -mod display; -pub use display::*; - mod logs; pub use logs::*; -mod poseidon2; -pub use poseidon2::*; +mod poseidon; +pub use poseidon::*; diff --git a/crates/utils/src/poseidon2.rs b/crates/utils/src/poseidon.rs similarity index 78% rename from crates/utils/src/poseidon2.rs rename to crates/utils/src/poseidon.rs index 2fa9907b..bde7db7d 100644 --- a/crates/utils/src/poseidon2.rs +++ b/crates/utils/src/poseidon.rs @@ -1,24 +1,17 @@ use backend::*; use std::sync::OnceLock; -pub type Poseidon16 = Poseidon2KoalaBear<16>; -pub type Poseidon24 = Poseidon2KoalaBear<24>; -pub const QUARTER_FULL_ROUNDS_16: usize = 2; -pub const HALF_FULL_ROUNDS_16: usize = 4; -pub const PARTIAL_ROUNDS_16: usize = 20; +pub type Poseidon16 = Poseidon1KoalaBear16; + +pub const HALF_FULL_ROUNDS_16: usize = POSEIDON1_HALF_FULL_ROUNDS; +pub const PARTIAL_ROUNDS_16: usize = POSEIDON1_PARTIAL_ROUNDS; static POSEIDON_16_INSTANCE: OnceLock = OnceLock::new(); static POSEIDON_16_OF_ZERO: OnceLock<[KoalaBear; 8]> = OnceLock::new(); #[inline(always)] pub fn get_poseidon16() -> &'static Poseidon16 { - POSEIDON_16_INSTANCE.get_or_init(|| { - let external_constants = ExternalLayerConstants::new( - KOALABEAR_RC16_EXTERNAL_INITIAL.to_vec(), - KOALABEAR_RC16_EXTERNAL_FINAL.to_vec(), - ); - Poseidon16::new(external_constants, KOALABEAR_RC16_INTERNAL.to_vec()) - }) + POSEIDON_16_INSTANCE.get_or_init(default_koalabear_poseidon1_16) } #[inline(always)] diff --git a/crates/whir/src/merkle.rs b/crates/whir/src/merkle.rs index 7c644c55..49a94769 100644 --- a/crates/whir/src/merkle.rs +++ b/crates/whir/src/merkle.rs @@ -8,7 +8,7 @@ use field::BasedVectorSpace; use field::ExtensionField; use field::Field; use field::PackedValue; -use koala_bear::{KoalaBear, QuinticExtensionFieldKB, default_koalabear_poseidon2_16}; +use koala_bear::{KoalaBear, QuinticExtensionFieldKB, default_koalabear_poseidon1_16}; use poly::*; use rayon::prelude::*; @@ -31,7 +31,7 @@ pub(crate) fn merkle_commit>( full_n_cols: usize, effective_n_cols: usize, ) -> ([F; DIGEST_ELEMS], RoundMerkleTree) { - let perm = default_koalabear_poseidon2_16(); + let perm = default_koalabear_poseidon1_16(); if TypeId::of::<(F, EF)>() == TypeId::of::<(KoalaBear, QuinticExtensionFieldKB)>() { let matrix = unsafe { std::mem::transmute::<_, DenseMatrix>(matrix) }; let view = FlatMatrixView::new(matrix); @@ -89,7 +89,7 @@ pub(crate) fn merkle_verify>( data: Vec, proof: &Vec<[F; DIGEST_ELEMS]>, ) -> bool { - let perm = default_koalabear_poseidon2_16(); + let perm = default_koalabear_poseidon1_16(); let log_max_height = utils::log2_strict_usize(dimension.height.next_power_of_two()); if TypeId::of::<(F, EF)>() == TypeId::of::<(KoalaBear, QuinticExtensionFieldKB)>() { let merkle_root = unsafe { std::mem::transmute_copy::<_, [KoalaBear; DIGEST_ELEMS]>(&merkle_root) }; diff --git a/crates/whir/tests/run_whir.rs b/crates/whir/tests/run_whir.rs index 4f0063c0..4c6b4cf0 100644 --- a/crates/whir/tests/run_whir.rs +++ b/crates/whir/tests/run_whir.rs @@ -4,7 +4,7 @@ use std::time::Instant; use fiat_shamir::{ProverState, VerifierState}; use field::{Field, TwoAdicField}; -use koala_bear::{KoalaBear, QuinticExtensionFieldKB, default_koalabear_poseidon2_16}; +use koala_bear::{KoalaBear, QuinticExtensionFieldKB, default_koalabear_poseidon1_16}; use mt_whir::*; use poly::*; use rand::{RngExt, SeedableRng, rngs::StdRng}; @@ -30,7 +30,7 @@ fn test_run_whir() { .with(ForestLayer::default()) .try_init(); } - let poseidon16 = default_koalabear_poseidon2_16(); + let poseidon16 = default_koalabear_poseidon1_16(); let num_variables = std::env::var("WHIR_NUM_VARIABLES") .ok() diff --git a/crates/xmss/Cargo.toml b/crates/xmss/Cargo.toml index 16caf4af..6b54442f 100644 --- a/crates/xmss/Cargo.toml +++ b/crates/xmss/Cargo.toml @@ -12,6 +12,8 @@ rand.workspace = true utils.workspace = true backend.workspace = true serde.workspace = true +lz4_flex.workspace = true +postcard.workspace = true [dev-dependencies] postcard.workspace = true \ No newline at end of file diff --git a/crates/xmss/src/signers_cache.rs b/crates/xmss/src/signers_cache.rs index 70dbc10e..f939265e 100644 --- a/crates/xmss/src/signers_cache.rs +++ b/crates/xmss/src/signers_cache.rs @@ -1,124 +1,136 @@ +use std::fs; use std::path::PathBuf; use std::sync::OnceLock; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::time::Instant; use backend::*; use rand::rngs::StdRng; -use rand::{Rng, RngExt, SeedableRng}; +use rand::{RngExt, SeedableRng}; +use serde::{Deserialize, Serialize}; use crate::*; -static SIGNERS_CACHE: OnceLock> = OnceLock::new(); +static SIGNERS_CACHE: OnceLock> = OnceLock::new(); -pub fn get_benchmark_signers_cache() -> &'static Vec<[F; RANDOMNESS_LEN_FE]> { - SIGNERS_CACHE.get_or_init(read_benchmark_signers_cache) +pub fn get_benchmark_signatures() -> &'static Vec<(XmssPublicKey, XmssSignature)> { + SIGNERS_CACHE.get_or_init(gen_benchmark_signers_cache) } -pub const BENCHMARK_SLOT: u32 = 1111; +pub const BENCHMARK_SLOT: u32 = 111; +pub const NUM_BENCHMARK_SIGNERS: usize = 10000; pub fn message_for_benchmark() -> [F; MESSAGE_LEN_FE] { std::array::from_fn(F::from_usize) } -fn benchmark_keygen(rng: &mut R) -> (XmssSecretKey, XmssPublicKey) { - let key_start = BENCHMARK_SLOT - rng.random_range(0..3); - let key_end = BENCHMARK_SLOT + rng.random_range(1..3); - xmss_key_gen(rng.random(), key_start, key_end).unwrap() +#[derive(Serialize, Deserialize)] +struct SignersCacheFile { + slot: u32, + message: Vec, + signatures: Vec<(XmssPublicKey, XmssSignature)>, } -pub fn find_randomness_for_benchmark(index: usize) -> [F; RANDOMNESS_LEN_FE] { - let message = message_for_benchmark(); - let mut rng = StdRng::seed_from_u64(index as u64); - let (_sk, pk) = benchmark_keygen(&mut rng); - let truncated: [F; TRUNCATED_MERKLE_ROOT_LEN_FE] = - pk.merkle_root[..TRUNCATED_MERKLE_ROOT_LEN_FE].try_into().unwrap(); - let (randomness, _, _) = find_randomness_for_wots_encoding(&message, BENCHMARK_SLOT, &truncated, &mut rng); - randomness +fn cache_path() -> PathBuf { + let file = "benchmark_signers_cache.bin"; + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join(format!("../../target/{file}")) } -/// Reconstruct a benchmark signer's public key and signature from its index -/// and pre-computed WOTS randomness. -pub fn reconstruct_signer_for_benchmark( - index: usize, - randomness: [F; RANDOMNESS_LEN_FE], -) -> (XmssPublicKey, XmssSignature) { - let message = message_for_benchmark(); +fn compute_signer(index: usize) -> (XmssPublicKey, XmssSignature) { let mut rng = StdRng::seed_from_u64(index as u64); - let (sk, pk) = benchmark_keygen(&mut rng); - let sig = xmss_sign_with_randomness(&sk, &message, BENCHMARK_SLOT, randomness).unwrap(); + let key_start = BENCHMARK_SLOT; + let key_end = BENCHMARK_SLOT + 1; + let (sk, pk) = xmss_key_gen(rng.random(), key_start, key_end).unwrap(); + let sig = xmss_sign(&mut rng, &sk, &message_for_benchmark(), BENCHMARK_SLOT).unwrap(); (pk, sig) } -fn cache_file_path() -> PathBuf { - PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("test_data/benchmark_signers.json") -} - -pub fn write_benchmark_signers_cache(randomnesses: &[[F; RANDOMNESS_LEN_FE]]) { - let path = cache_file_path(); - if let Some(parent) = path.parent() { - std::fs::create_dir_all(parent).unwrap(); +fn try_load_cache(path: &PathBuf, first_pubkey: &XmssPublicKey) -> Option> { + let data = fs::read(path).ok()?; + let decompressed = lz4_flex::decompress_size_prepended(&data).ok()?; + let cached: SignersCacheFile = postcard::from_bytes(&decompressed).ok()?; + + if cached.slot != BENCHMARK_SLOT { + println!( + "Cache slot {} does not match benchmark slot {}, recomputing...", + cached.slot, BENCHMARK_SLOT + ); + return None; + } + if cached.message != message_for_benchmark() { + println!("Cache message does not match benchmark message, recomputing..."); + return None; + } + if cached.signatures.len() != NUM_BENCHMARK_SIGNERS { + println!( + "Cache contains {} signatures, expected {}, recomputing...", + cached.signatures.len(), + NUM_BENCHMARK_SIGNERS + ); + return None; + } + if cached.signatures[0].0 != *first_pubkey { + println!("Cache first public key does not match computed first public key, recomputing..."); + return None; } - let json = format!( - "[{}]", - randomnesses - .iter() - .flat_map(|r| r.iter().map(|f| f.to_string())) - .collect::>() - .join(",") - ); - std::fs::write(&path, json).unwrap(); - println!("Wrote {} entries to {}", randomnesses.len(), path.display()); -} -pub fn read_benchmark_signers_cache() -> Vec<[F; RANDOMNESS_LEN_FE]> { - let path = cache_file_path(); - let text = std::fs::read_to_string(&path).unwrap_or_else(|_| { - panic!( - "cache not found at {}, run generate_benchmark_signers_cache", - path.display() - ) - }); - let text = text.trim(); - let inner = text.strip_prefix('[').unwrap().strip_suffix(']').unwrap(); - let values: Vec = inner - .split(',') - .map(|s| s.trim().parse().expect("invalid value in cache")) - .collect(); - assert!(values.len().is_multiple_of(RANDOMNESS_LEN_FE)); - values - .chunks_exact(RANDOMNESS_LEN_FE) - .map(|chunk| std::array::from_fn(|i| F::from_u32(chunk[i]))) - .collect() + Some(cached.signatures) } -#[test] -#[ignore] -fn generate_benchmark_signers_cache() { - use std::time::Instant; - let n_signers = 10_000; - - println!("Finding WOTS randomness for {} signers...", n_signers); - let start = Instant::now(); - let randomnesses: Vec<[F; RANDOMNESS_LEN_FE]> = (0..n_signers) +fn gen_benchmark_signers_cache() -> Vec<(XmssPublicKey, XmssSignature)> { + let path = cache_path(); + + // Compute first signer; its pubkey is used to validate the cache + let first_signer = compute_signer(0); + + if let Some(signers) = try_load_cache(&path, &first_signer.0) { + return signers; + } + + let completed = AtomicUsize::new(1); + let time = Instant::now(); + let rest: Vec<_> = (1..NUM_BENCHMARK_SIGNERS) .into_par_iter() - .map(find_randomness_for_benchmark) + .map(|index| { + let signer = compute_signer(index); + let done = completed.fetch_add(1, Ordering::Relaxed) + 1; + print!( + "\rPrecomputing benchmark signatures (cached after first run): {:.0}%", + 100.0 * done as f64 / NUM_BENCHMARK_SIGNERS as f64 + ); + signer + }) .collect(); - println!("Done in {:.1}s", start.elapsed().as_secs_f64()); - write_benchmark_signers_cache(&randomnesses); + println!( + "\rGenerating signatures for benchmark (one-time operation): 100% - done ({:.2}s)", + time.elapsed().as_secs_f32() + ); - let message = message_for_benchmark(); - for &i in &[0, 1, n_signers / 2, n_signers - 1] { - let (pk, sig) = reconstruct_signer_for_benchmark(i, randomnesses[i]); - xmss_verify(&pk, &message, &sig).unwrap(); + let mut signers = Vec::with_capacity(NUM_BENCHMARK_SIGNERS); + signers.push(first_signer); + signers.extend(rest); + + let cache_file = SignersCacheFile { + slot: BENCHMARK_SLOT, + message: message_for_benchmark().to_vec(), + signatures: signers.clone(), + }; + let encoded = postcard::to_allocvec(&cache_file).expect("serialization failed"); + let compressed = lz4_flex::compress_prepend_size(&encoded); + if let Some(parent) = path.parent() { + let _ = fs::create_dir_all(parent); } + fs::write(&path, &compressed).expect("Failed to save benchmark cache"); + + signers } #[test] -fn test_benchmark_signers_cache() { - let cache = read_benchmark_signers_cache(); - let message = message_for_benchmark(); - for &i in &[0, 1, 2, cache.len() / 2, cache.len() - 1] { - let (pk, sig) = reconstruct_signer_for_benchmark(i, cache[i]); - xmss_verify(&pk, &message, &sig).unwrap(); - } +fn test_signature_cache() { + let signatures = get_benchmark_signatures(); + signatures.par_iter().enumerate().for_each(|(i, (pk, sig))| { + xmss_verify(pk, &message_for_benchmark(), sig, BENCHMARK_SLOT) + .unwrap_or_else(|_| panic!("Signature {} failed to verify", i)); + }); } diff --git a/crates/xmss/src/xmss.rs b/crates/xmss/src/xmss.rs index 6271a36f..88f9e6f2 100644 --- a/crates/xmss/src/xmss.rs +++ b/crates/xmss/src/xmss.rs @@ -17,7 +17,6 @@ pub struct XmssSecretKey { #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct XmssSignature { pub wots_signature: WotsSignature, - pub slot: u32, pub merkle_proof: Vec, } @@ -59,7 +58,7 @@ pub fn xmss_key_gen( if slot_start > slot_end { return Err(XmssKeyGenError::InvalidRange); } - let perm = default_koalabear_poseidon2_16(); + let perm = default_koalabear_poseidon1_16(); // Level 0: WOTS leaf hashes for slots in [slot_start, slot_end] let leaves: Vec = (slot_start..=slot_end) .into_par_iter() @@ -158,7 +157,6 @@ pub fn xmss_sign_with_randomness( .collect(); Ok(XmssSignature { wots_signature, - slot, merkle_proof, }) } @@ -181,23 +179,19 @@ pub fn xmss_verify( pub_key: &XmssPublicKey, message: &[F; MESSAGE_LEN_FE], signature: &XmssSignature, + slot: u32, ) -> Result<(), XmssVerifyError> { let truncated_merkle_root = pub_key.merkle_root[0..TRUNCATED_MERKLE_ROOT_LEN_FE].try_into().unwrap(); let wots_public_key = signature .wots_signature - .recover_public_key( - message, - signature.slot, - &truncated_merkle_root, - &signature.wots_signature, - ) + .recover_public_key(message, slot, &truncated_merkle_root, &signature.wots_signature) .ok_or(XmssVerifyError::InvalidWots)?; let mut current_hash = wots_public_key.hash(); if signature.merkle_proof.len() != LOG_LIFETIME { return Err(XmssVerifyError::InvalidMerklePath); } for (level, neighbour) in signature.merkle_proof.iter().enumerate() { - let is_left = ((signature.slot >> level) & 1) == 0; + let is_left = ((slot >> level) & 1) == 0; if is_left { current_hash = poseidon16_compress_pair(¤t_hash, neighbour); } else { diff --git a/crates/xmss/test_data/benchmark_signers.json b/crates/xmss/test_data/benchmark_signers.json deleted file mode 100644 index 1bebaae1..00000000 --- a/crates/xmss/test_data/benchmark_signers.json +++ /dev/null @@ -1 +0,0 @@ -[823599328,883533560,897612802,1025345740,708937170,1353211569,578366465,1491997886,661182865,1274716677,163288798,181554685,1240208380,1211177668,1310589172,64446394,247578063,501609788,1206412004,1762321530,1430914619,1209072639,1227156146,1755153793,1223258652,1612226227,1427047166,450862665,1064051330,1967764915,648840936,1394104307,541435854,796499236,1236491756,527522781,1791893652,1937794340,1193043244,750562050,561858648,1763916602,2094547012,310916854,1147003069,7475647,1006151197,1416902294,1144171836,1367615960,1053158022,228115424,1667613359,1772892214,780570832,943762933,651867997,1569712173,982412596,195130356,900966800,1954088917,155160998,1473108709,298578950,171042020,1081984111,720329238,1748170720,1936320005,1303933813,1286206612,1757930538,615453157,2119688116,1210805711,1024643410,1942270749,1364851914,559432862,263058571,1540298211,448719344,1352530070,1944294092,275664163,787410823,736937873,916856742,290174497,855689976,1776184129,371376516,583714329,1685110164,1841922861,926942670,2053704098,876887118,743941176,1926739196,1630985505,308328609,940676564,1603780715,1077177990,1570028893,1910382947,921323837,1772585706,1293939594,1418564736,716251862,1893471800,77138959,1149817547,1571476320,1317845700,350890704,294398876,940596897,969654378,1653855396,1888578782,1309099319,780685232,65816311,135791504,247549741,1885607578,860778022,453289033,2021544886,564775925,1040635399,942648626,1650721801,1611661664,1776286790,1378298591,1997731396,1121912620,2075720529,1859302039,1720993003,1410774390,1250819849,877992628,1818046276,1082101739,795230020,1811275827,1237535441,954741235,102587716,643671081,1693143378,1675693851,1701533246,1917617385,2077113699,921772420,1501140278,117384338,1151812814,452652362,2257893,115942895,1784179022,304153698,1134895183,672077917,847008797,532240374,926021361,305891187,663161685,1157609108,1616821424,997362031,361997231,1433012692,1593351337,1666990958,201498351,954700624,939236238,811934718,1341250956,733173557,1889049211,1288386529,1358884816,1746795643,1523564441,285547395,177435538,996852588,1798775448,611688534,625841861,192032265,1431163887,179520463,2109416293,1190769067,1163568562,1298682455,1811113249,476584670,1316306984,890865283,691426114,501886641,1868595388,685425124,762405043,1878911821,1041473162,1136720097,1177405850,893682188,1267226910,1425775203,1273015475,1149585348,907115307,882073597,689581379,571477633,771526205,871200663,179994391,1178200497,301404542,153178994,782885838,400500219,357132519,707545568,1265066655,681043598,1115081033,346685592,597773195,1935043329,2122808253,1025580072,1625171795,1699708807,802421170,300424894,90562368,372419216,1786071407,530338555,925185402,1103301095,980164199,2068009106,429633766,117059275,418031682,660801998,862152119,2064184504,1720151528,1583040544,1317534601,272220036,1267331217,332579671,904775872,242543721,630198660,1852969971,2036763829,1025038517,758268944,1959559127,452591832,472154355,1050467614,565288224,756661281,16033423,849155151,1030234657,1280166991,1256666318,1906479873,1527172185,1303113569,1900272240,1566260660,45732613,2041290778,922125740,57598058,1840251901,497136642,370049728,1372066140,891408385,745327895,2063487453,179854651,1463383150,647362626,515328319,1984106968,1960695115,1765895423,921092048,1645966403,1973972003,1423145990,1063855503,1052190529,1200883017,1545823876,1312253210,1355827022,319843154,54080783,1375687173,1067200498,1770531547,1267271780,1245374640,323518265,97541935,373659553,1255632627,19581421,850419216,1683479425,337364234,1561538741,388938469,1210059415,1758927035,1467724788,423073366,2029777926,317340908,672400827,1897261151,1237759509,88978642,1237459380,1022218209,1806448779,29746161,1984026011,1345832283,1969025317,1964019654,297976630,1699969151,49642691,1844538341,1165985416,149140890,1812283958,1309800840,374926505,1885274669,1314370778,30441718,1045976352,2004267036,527772369,1550595371,1717594163,1211593839,1111833181,1668055640,1379256410,1892514147,757326244,1754346146,1223497491,907085878,1611240348,1301695176,1434140990,1551053974,603939671,1077776899,1241157588,488227403,791988533,217566804,1322067367,402267564,1105519631,498872250,168010742,322746074,1464434000,1973260726,1314609150,1776219357,1067700539,1397175856,248570024,1502447828,1614296237,894364809,1722668607,1094286644,1672242204,716726573,62316525,565730816,580907689,347159328,128135753,1299433583,1624617994,1543421668,1823472045,379731870,678443052,1808394000,1898440998,295791718,1169058686,829388359,890792640,2093472779,192740911,2105825485,692747230,787952917,122747297,2004787770,95924920,267051294,1928238016,1740488788,959121172,1697371384,520933949,1604962781,519322293,1839827688,487557874,933533187,836578038,1130710209,217182584,1966296252,660527934,1331806971,992259410,1967315915,647132832,2046892881,1046844523,1906637632,825901513,1498571079,1657980364,448920568,67519710,681327473,1703892939,1897617122,1616614617,342490418,1921533538,152910013,2042057069,1808648968,1822904383,671210520,502467357,1972469939,1389453933,490830494,720680563,2123973863,714460198,530691927,1364939492,1117090064,2064046709,1177473145,1577220060,1918873338,219130677,248912645,315409733,1524547746,508376876,506111371,15736958,1470702526,430173048,1781095980,1754320949,387987694,1480403849,1521466133,1533148059,1129677865,571622704,2107152492,437015571,1906335799,1367980313,218480573,571219017,1523377313,765457273,157471855,992354791,1787328540,889821007,2097512065,1327697056,1881395870,146213873,1457381061,730322915,534160292,891543458,264814188,451984261,943638883,2108612859,908606836,1187149305,521085657,1204522545,1557886667,617697415,1224532351,813917949,1486063428,1578890440,1342654587,988992977,797596612,1184570392,1968637961,949227090,354702365,2074333180,187859727,162102597,1217049467,1905812065,1978983241,238263,304522178,729523440,632814354,374458062,655933434,948790424,1547593461,831402176,922135456,921687143,2111996947,789738340,1393854502,350118123,248279685,1364083809,613883384,1793197919,1193719708,1244755367,1849451244,428207098,650214155,567329681,1065991062,322926878,245922193,845447088,1227293768,1469622353,798701611,761136928,2070525167,2051666096,1888783953,1193655259,1806166654,1449985748,502257239,1261976209,611273091,1070175285,1228721365,1115867165,1556484846,1452866616,275330003,1631959934,974485915,268872085,186190743,1262129986,1303404029,1342422455,1222687250,480280580,454619288,1687392244,697052910,716971476,903250938,2020390389,1434682067,1568235898,1314444004,1102771907,1483122240,610318080,828820595,1631850388,1206149322,1806739723,1615087319,1665140699,392616392,1139049438,1831052369,1260286501,967643598,1113105982,923861933,629669469,12650893,1047146861,2094480066,974695052,895493563,989103767,1186662438,1180194275,1759249755,1532687356,41481405,565518958,1623310966,1630203009,1866752291,183233795,746424937,1752352668,1391347835,617648780,1906012245,317224701,654483206,1116166871,1617844076,2091209587,881567439,728462096,2059441514,1867153900,1500711173,1331994448,793954047,2057822922,621515077,354989615,771975965,1120094164,1585470963,142571558,48876239,87356089,1075151546,117821963,28751234,789834027,828902856,1613174668,1478260080,1632640839,1483380108,48407183,1060595288,505090687,494602297,1224855817,1494138883,1217649253,244040313,694317633,880243552,1450302620,1175257948,948666,1482420816,1812627666,757846088,77127158,435033876,1569485114,2015222915,687833306,390708253,735225031,1812220825,1386382388,1389568363,992288477,1741228658,196349929,1137756675,307458251,1208985244,1916416589,1531807707,335408971,1894800223,1872525117,2017727378,417625560,1094730173,456452617,354523781,28564236,1750036581,205695536,1837834547,808243535,1347063644,1704929484,1463631612,1528718906,431978448,134853174,1954647226,1514991113,448897302,1567620144,640889221,664419068,390833903,1979831205,1883063067,2037943858,1836254286,658618373,1036694044,1780308589,1253349200,2063246216,697073499,1803981490,944640012,850463222,425032792,258504193,1476945422,784936966,2126392770,67565240,1622278096,74903106,1560839570,1493938868,1217597815,516006250,1789436590,392653658,626806223,1325310673,303911810,2072758749,562574184,403376500,1702660410,1018227912,566111462,2028475995,1357002166,399243895,473935262,64643438,802855297,1478366607,1919107029,1746829401,334726141,1227173098,424220319,900752981,718667992,425761810,338280976,1351704641,512855824,111940268,641051940,1500053706,1508434867,295058410,1156606941,870103682,449383773,903832663,1778572797,1255355771,1907836222,21570545,1314323999,663451674,1054812103,1661149137,1148763286,1029267741,2041956843,45681151,547373944,71424539,959819883,468150251,808553518,1104614995,1095254692,454555016,1503356408,208064657,949543605,1702516845,21488431,40946587,190558543,2117421012,1603531095,709179267,746757324,1581097638,1242442375,912892867,1932966342,1485300529,1118559444,1063271059,728279666,1292191794,634468386,1914788658,237731637,1118169403,445722455,793230638,1747501013,595354046,454070138,1997393074,1298298701,1690000943,1485102507,2104060763,1747832553,1883018999,37728793,1855611706,9884895,1475861884,1817283470,1104342817,14364569,1210575631,1668073567,1404873979,334813708,1789607894,767448690,79655193,904560925,85647758,1057912913,1210973330,1060653171,437045482,511746052,632955541,253068468,1078084340,1546620888,696232673,403140891,1442521870,1105211402,1668170663,1138125338,2042388106,347159238,961108365,1468346900,85720110,443809759,440866313,1973928101,742411038,1527157190,1341792663,1082184229,29278286,221797170,1988446345,30432630,1688169681,432753632,1585586487,1060110172,1351956716,1603006203,205026913,1495111107,1831428408,1022263649,1450999424,672810792,976343558,1508397422,1143232061,1851163702,1524792452,268638497,456437248,134870978,1318391649,502331713,1353755383,163017568,344144792,2085813745,754239850,852511856,2034581673,968834346,383584593,1639112311,270998822,1947392413,2022696733,918751546,2055060819,1038046867,1600703679,1886566854,687254071,1721448042,1489618048,923287617,1227268680,1947747853,1022491427,1140394511,1545458169,1620380233,1493722770,1578185068,1955508821,2054094908,550747635,1443706826,1255898781,864706297,900769580,1522358303,912773328,1144272685,778399396,1715016342,319832337,1734286320,1807138656,1572488518,500217450,733952898,1196925218,220587366,1974855963,1903350994,1824753579,1749210515,1975047973,85077730,199659863,1929281725,1626963142,2114477215,1523319011,748870516,1578594749,1636820615,1944480198,860187724,278180222,1954047258,531144804,349186911,1095093267,905111555,6900382,517294852,1008202681,1656854271,156538024,423803340,1057388671,1199572089,1620269860,214825314,669460668,1183454360,1561262689,234529111,266148305,1993646133,100799509,287214981,1857152915,169822374,467596358,2057485957,2086086551,1776281749,1288246017,1353796534,1410057810,248405549,1349905998,263996954,387852984,1854097551,1363881186,1220961649,69973156,1240163383,823496703,1939936444,792108901,2080681007,1231414065,218736069,1389003177,1259047206,1863587156,797322626,1435993027,701068480,1312309917,588207434,1864548798,189970144,910344399,1262207241,1885038094,995071065,1901886217,978801955,585395801,2123877095,1205265851,1188368851,1017687810,1869749967,917367090,908267531,829020442,332772044,2083594833,376598339,660666339,1648704008,1743653583,2021412573,1668972415,1971510128,1405198677,1801559959,1002410332,801751085,95308437,1333756920,1533978393,526141669,696499191,1061238183,1205005757,596745196,1853470153,1662785131,403871978,1314122590,1629192272,1915258273,696201298,907729826,1113350635,1249773349,894323566,272039730,476589508,139186854,399155161,764953184,212395136,63847243,1368214574,694744923,1416883444,122052191,1420536494,1251960818,770454172,730752332,2107433425,1171445305,1563231957,106407757,1325173469,1879217152,614376384,1305428955,216707956,447080053,1983503754,281815564,246023125,167937039,917248124,642745689,1467700762,1581528606,173304197,1619231373,142055294,2076696610,929859768,518517390,1221367746,1813637120,227821774,405350073,1095152036,477146690,1257141904,1865557751,1113395758,374492651,1015501922,322351862,20258014,1302712532,172183018,379054617,1428810032,2049276939,2034112858,1994976375,790109636,532428502,516556334,1404310620,463576549,1497584602,928466653,1212236039,1878121129,449815478,807287382,1416673337,1226431303,275284055,361851800,1430124292,735018451,86924526,2104066427,298399892,2065325681,1917561021,512450551,818830082,1286403172,1265757815,128321412,1925194844,1615304525,1430017482,813659915,1423115328,1982443449,70747167,1044536750,1830986365,2088765082,339086097,955018795,431387709,1328900929,1909023785,1111738493,1275324076,1066505080,1672134826,278453898,1898394362,756257094,334525188,1881779463,351226403,858742721,1580794179,975966430,1844765270,247165627,1850651773,1390453230,405706775,613447480,926221090,2003447356,907312503,495861452,515569555,516350677,2119880967,1578379864,812105458,1282745320,153209863,705872646,856208210,1328071960,258422777,1097247601,269646127,187266109,585183999,690521553,1636118341,1783522682,1289025746,454720383,272379455,1565228067,352241964,641466826,484669629,1797602547,1533814799,2126067428,1732974848,1392919435,283390579,1594151741,1848178527,1687089954,654543240,940706935,236409627,314490414,1620754958,1464777877,941453336,1934834062,2035307062,238223488,960072160,977269766,645452362,914230883,1441786893,2123635928,112300690,1832121951,2041352395,991116705,1330418541,1434221447,2037165219,1740564545,4099179,704654940,1650085077,1670775066,83943258,408427123,407163523,1084268106,1539159670,1737775138,1278358929,148422456,1336236399,1082082600,2001709132,843131011,812266616,651890305,52290734,175678803,1974595600,1306338998,672236351,225851043,1326505608,322446324,1606951002,78712647,42630937,1726345611,1938130452,979269831,1700662560,1245335754,721602311,277266052,1051142683,2046084237,1006657339,55235801,345066538,2070694464,50131476,936958446,1457305278,163069279,1408462049,1559020451,1291364229,1550897167,604479944,1660502282,138200557,484792773,1465610464,1130809896,475725699,1978670148,1650325092,1309377797,1229351240,947252397,88519495,969273396,610852389,2055959816,1708928541,1006341054,1691395874,34045645,1212811860,2054499275,1978226249,906001033,1841245684,819371465,212560058,820502239,1530148624,665905274,1843919166,144345361,534658487,852861242,1633579734,1389971148,611595398,822615232,628287413,2048973200,92049751,401121807,296377999,19261077,1357432642,1226672410,1280701787,1486675163,2191911,926583766,2023173777,1095247829,1500573547,167343791,1264445386,1661650788,1233432431,728873282,915884583,846903130,325917973,1698861532,1573524634,50471731,1964217441,1175102858,1793939341,1364097240,1773666304,1549096420,422297558,691892925,2120726388,561505714,881276929,222908353,1316674988,204045178,1268491772,60817556,1383401373,643681105,329108055,1957564745,37644787,1181927587,1711230573,1452059011,1294369861,592322101,1736532708,1853302151,16795514,1077860549,529452879,1252473668,471731612,1892942702,1108575169,2053670207,398520563,1384765220,311493872,317712489,1340419990,1922315481,1463214346,2002921294,1676643514,257534262,462849223,514341563,239017073,668166950,2037803554,1726746003,1956190853,618458297,1000547227,528571654,1539240785,401767654,132408294,394802651,784803224,1193224179,975734348,1117869466,1164961558,1515204661,258902454,1919585823,1547972927,8820089,472316817,357175351,1539845026,197372225,932525710,997544005,860812197,663523025,1095682855,736132828,864131858,1026746398,1904202113,634014217,1055459015,400479082,1719805662,890770384,287540295,876803805,839019693,999439386,203125400,254215686,1009136026,781617342,1065268193,1380386145,144499616,662593022,1640967825,1296304563,1865155615,1075455740,1909792182,1911335706,1912305442,1850484039,2055021196,564296885,1252476574,2126846684,1655452021,198892473,545048913,1009956482,1443997116,654924708,172098187,807286082,1880991795,440218655,1938460260,1443897640,679610755,1447363166,665042493,1826954205,752097504,713342117,142467892,1374977785,1777649703,163635688,956761598,1115823059,1646557695,1279901223,88417189,1222045058,1970944575,345228486,1137545591,1104797336,114623176,517756930,869812843,1516517157,1305244295,297541926,1161275259,1532050320,219318371,1369417190,913222061,2077356096,1089985507,1104296458,1186751021,809383993,1670129448,158409883,351038877,1336705187,1489323711,118704894,2084766084,1691199099,372643838,675765879,1022269443,525900191,1626624667,906742720,173418782,931880076,455709410,1528756184,1736345261,2111313766,905312443,1652774007,1959538104,828625570,1882708532,1362888918,1997358528,502026427,1795285056,1506829932,1100872694,1647890519,136347046,1595050373,1242881548,876655052,1219655751,1709898607,1118143567,329034548,1594448881,397433353,1736335232,1515719245,604923793,1599489133,960620755,827774322,1335408086,1566928241,1964937078,747625720,1271084013,698424084,113416179,1966816988,1993781349,1940729583,1065304793,1812184177,400669532,1522248989,1095496220,867508108,1983613393,1253741080,1927382287,792596598,1861868829,1206998916,1801623411,159398882,963992114,660913266,1628788178,1154934118,185926230,284542343,1610625664,1696256956,1878033315,962060765,1498230323,1059782658,1295512063,451329980,766296537,805174717,197154765,86016668,1228405934,458206168,969461114,2119504714,224161217,96750576,49355637,495586179,1625770306,915659398,901681702,1685241866,2076509139,1739269648,937468864,1215701442,1075144972,963860488,404777918,1216978570,405405933,2077394196,1673834981,822512153,147542586,1168222805,1993230099,1744226580,1451952611,116780799,1856264278,1863890525,335378881,1332615719,1919846766,488967352,1772882264,1468056542,1860045511,79074120,707718826,368674888,1840968907,212184285,1016745832,2123638013,1267997658,186205879,766997841,283013192,1949390486,192542666,125747080,1052605155,390157626,960441562,1514641191,1005541890,1267741375,5895610,1881161608,886648401,1383031143,1137157414,322022061,637367957,1787688456,1424660145,2111956038,1278115827,575445421,584204763,535515707,65178319,1448420467,567481862,1057258978,536836853,391492786,217753487,569035496,1031256379,1753998242,762629397,1051752037,1661271334,1019929772,99963261,1418183837,1105685320,1030683185,1067636235,1315708455,1067429608,536346673,983485908,462939171,1491921419,273201168,2035243867,1519284745,123843593,1799392224,607366859,1854744569,291554339,71912511,1806802499,633082736,1274982940,841609709,65839382,1492632224,1668478624,1210166282,1162521946,218113839,1173156455,5751505,1729657808,1180164262,2084459742,653361941,1132005098,1806385861,1520352669,819163827,447711911,449008836,539543679,1950753664,1955363841,1361640104,1615574266,705761281,582947153,1688364736,736847470,1825648672,1427756093,122292613,1888336432,1827976189,583353937,1175218051,1698026717,1699610895,880099108,1703164587,2014421252,1609041283,787009598,1420357436,1433705291,1450945823,852134187,506869715,808252482,251369995,1033986131,1632458500,1978678135,1281209688,1961704871,1611852963,147317180,1689814543,1080331621,725899295,1316449518,277581894,2126550530,1285520707,165365482,2104578344,2105342327,712513409,1447950762,589854436,1596850748,1312682532,1119209932,1747023044,18641198,1319816848,1708729477,1728146796,308776820,1185933564,148829476,739985682,1154081684,1858109681,136712340,2083296836,420323620,870965276,94335941,554453291,1012316999,1943772425,972558858,995953740,970534138,1607511243,835712294,660784401,2085424174,1228019322,1352147693,1672893653,117289648,1015296415,1621430238,1794631010,1909189862,534291551,522684105,594693358,1603087622,2073436784,1120470291,1243792877,287262707,1543052622,985472886,501620391,435865369,1349082473,442085961,110129979,1994394058,1706752040,60368401,441517404,1136328967,1740804335,1470171195,705971749,1417611846,516941176,100279327,979018784,358680182,1780638785,1369639115,27705997,89941132,933145068,1546462868,699721315,1484026696,1851209023,143575635,2106265724,27531680,519821355,407612317,917701423,1683635919,166265818,1898854565,1958696612,495397228,402104045,1582304029,1565674575,284016084,1585591656,270588202,734549575,1272016995,1826512350,1260509909,729808444,1506083579,567701133,1510358883,149785281,250366765,919948815,1903821984,1487230301,530498676,747668348,694073207,1921168113,1851506129,174324979,601729487,887017206,814486764,628767113,1073897623,851208193,2129137150,1990742946,1623614205,570965831,599902891,701075450,425324011,1323419452,265889621,1992920620,650509231,301716101,1400168329,986939676,264799319,2129853208,66164075,1061493446,430910426,370406840,262658672,1518350679,634376552,30563708,1405898841,658822999,983026220,685140945,1959127972,946578416,957198777,1597536653,424174858,878536868,1879598645,1176254296,948786989,1532905860,405043138,1223329052,372733360,468554183,1226656433,1352570909,855781500,74149198,2088997915,856910161,32931511,1050599050,667571436,1286594139,226058467,1072542322,1270801598,148610727,1407581751,641958733,1796333192,1231774209,1525762810,1848472877,937737662,828736528,1104611442,570712169,1923745732,1759689049,1128227672,650505672,1809299345,657463642,320292921,1345070498,743062229,749712471,1447580726,764700814,569515835,1210206034,1861609793,652771598,827475337,1772037560,1295188092,1202736443,2097966919,308222205,1045014690,1165813339,1431064478,1215175849,1153068163,1897754564,1338133338,1906622770,1101847836,251257556,830773345,1087808155,578675456,1410146512,1121126739,900760078,992105308,505439804,1400645331,1453971255,1783029242,407570726,954869793,822800602,654825722,1837066799,523353097,682846447,188174061,1248686438,1758117072,1756692754,1824621487,959318207,2071725912,1874445415,1652451227,772939439,733865172,1388811607,319243447,1425718604,268361242,810417358,832161971,1492637045,280171669,1726537198,1569872043,864869184,711371415,293945191,755694837,526154420,931288261,168186446,1832776765,1520817963,378048456,1880007565,1835643849,742687895,1309835014,1295142169,1061277975,1063431149,459255434,1080393776,154631534,670914946,1004167859,1124645332,1343371455,1983590285,2070459505,1426679907,931131017,2003838194,1551401458,536325533,1016065951,39341459,1830763072,60167473,1383026139,2110990912,1887441621,110740858,627952326,1748372712,1692329173,1177783742,757267737,1655433737,2057472300,657618278,1246865825,1432186616,29942504,1582886608,26066956,807173782,1837659126,1536421523,2014415269,196811749,524833045,1204498779,1285093323,1786451413,9630425,1538810323,1128341819,296856975,2129113410,627606847,75300962,900094373,819599844,1783161010,1059850482,1419103375,1600821486,11396883,1161600699,516382337,925234981,919568359,158488404,928954994,1310143172,1654746866,965497818,582567726,2113938351,1149611896,71177691,265588368,239521128,525376447,2088843525,2049254468,613594780,642170824,2063539801,1342979974,1321157034,591025263,1500010103,1678278139,433225934,1350603086,889553072,1282745953,578483247,990189892,1533576744,379361371,258234602,682861203,2092541254,1580686256,1034304592,556791016,1517586244,2036230820,752428598,1339682646,1454287822,511716515,1056762413,1263368254,1173478459,1443652949,1939754071,702404901,27901072,2085297492,605084724,2129403774,711747900,770164824,1260819507,1435022247,1169255776,1662027610,1793682670,172443314,912938350,766632474,644388438,1328393603,673565746,2056668677,1125315011,690723020,1474912374,1223338556,1292868542,1318907035,1217812969,1606498136,1838834658,439235763,351656152,762245048,240477692,889992792,998690933,1250530991,1393938065,739728716,714005229,241748638,316753156,1530749788,567279069,1140190316,1169897776,359098482,557612903,1603951659,452913950,1945107944,1823172465,1783209345,746994866,1199364905,955434966,2063629655,337951664,1022204725,1602052699,459641679,1734785316,2098101025,232867189,1154169505,1845272136,944207731,1519065217,1763152144,1366222296,2080351200,1777200272,1624370714,1238744106,802688739,881366853,701385690,978396631,140958981,1498373149,1844809596,1032152840,666865184,1933868104,881385231,1802782582,2094237695,1535152679,874465857,535902558,1553611135,538630023,2073533451,262640642,1438382144,1818345401,2034885845,1824672706,341895383,1724640254,1573571770,232707231,1415731680,457898698,1915920807,197972765,555894826,1969483861,999111405,538628229,670720559,141840344,1641195966,2106582519,1175147236,555321336,133823376,1031796018,1526398186,1585106931,2066301824,1577432641,1796903801,115253529,1678875857,1269556798,664419208,1198559572,1408863374,261860354,1728657681,757079969,1499528703,1013076403,1055285944,1830463068,1981776160,1513927276,1083916910,1079349291,1201153108,1598846368,1355598658,1684688864,819769729,727025492,383660377,62075724,907365477,1131060313,1770941192,19718126,1546156575,830675643,48935190,1889421416,922616007,339759889,1600133548,1264063928,217883923,429227578,168531703,1926111451,2070543273,1133970524,1665176211,236152674,857801196,1397424089,47129258,147693990,900700781,1174757626,74269533,386933792,1390377717,618672485,901119806,36112204,1207608801,1602908264,366070457,886104393,1533164548,449532419,2124024086,903980051,957915295,949807304,1267430915,1538624407,815355820,1708711795,862883933,888372875,395453708,335011289,2022974721,1063578375,864688849,1600455229,107523413,313195712,1889107607,764384223,2038435198,963613119,1893285332,326487222,217056557,629247740,1688419532,1108574197,1118187925,1091563652,1781499496,126223488,1720193105,1845400086,724306143,1803114141,747902447,1729563254,904084950,544971792,2046593360,1758161470,1963086612,876133953,277203960,101127729,1095414469,602378512,432964761,332863496,1914161525,1892265001,199922378,869967422,1802423510,654020452,139829967,1213744390,2080914107,396268045,1502826594,1543079278,281089581,585031403,1579327798,20477288,704519264,537599894,41777185,435482366,294071639,1904157867,697958815,1049287878,327534879,653928710,989805360,218828380,407206249,572389526,928669541,1681524732,1498829834,1826590273,493660680,1750247876,1819377928,1770720808,291530447,262288988,1885066646,121961123,1713466675,781842129,1315085265,2120991096,965312371,833542152,269725765,2049391693,1140842198,1596766894,273351805,779563089,337692689,1349498374,1343101546,1492111724,999853035,1662710375,1549515608,1193553139,736413065,288097068,1656868166,466079985,369683510,1979971136,1814671771,233655267,1854116909,1159788858,1178477617,1248517404,925381830,323907724,1434103493,602509792,1002318827,1137107446,1053006504,1659328520,1854563430,2090070493,1482571180,677138502,934756652,1397001038,416337916,1236869652,302252368,546426592,1085405341,1813364217,1092819060,744139569,295901748,239407357,836220526,1502687547,1873230029,1624643465,204917080,1025158921,740554520,669354335,707650322,929613795,1303400012,1859665533,354452165,766205999,1196167378,555170986,1069198459,1106723334,1506475145,451920098,1953313508,1759158418,1733770031,91111742,2090594994,617837979,930370647,217990620,1351933810,906885743,470025804,1311425962,90431095,1310572317,631272209,682943912,1047732934,107753184,674382065,1172412364,808931787,993455974,445229330,365938453,967368722,746335350,144052766,1633904194,376330572,495432178,1937464650,40919385,1043305655,893841032,68048270,532074829,1514145493,1767414300,1040506619,442044438,1515774464,2039740402,491854416,498094951,1740845377,214209994,282353079,1038539550,2101347479,851419529,1312965656,888249247,1359906485,1427052113,1351995835,692731912,1130908769,957542364,1335615104,729791749,436178937,826347848,1508343326,1541562578,336609374,1038505680,1425573903,1042423111,1337016546,515118757,1840330591,1112435857,669268754,1437239356,1140551931,431537801,290783156,1670237371,923384840,14323220,2039566222,1683754277,1277667360,129888405,48577769,2112211363,100216714,507205867,285590045,836738272,1560314735,759657049,1705824218,1631350274,1415624920,887628881,1151674923,803879046,1654624133,704414891,598636752,1199415130,967556225,1564045917,1427480446,1287497613,208408781,121259513,1737633007,1461016954,714369779,1001477892,283352589,47525350,834323506,1868132443,376173842,676199276,928407664,1339963669,38852495,286158445,1559033175,1161563076,1708400285,1480941029,1316249387,1457368077,418472707,1731622558,553291436,1591602015,255476338,2085726933,263484877,2012220012,334294292,498960056,1806609180,620345478,402326223,1267054635,1991215001,965457969,1087715992,1098605692,2094437614,2060166961,528404900,941665662,329030267,480745298,103398818,1547347651,2012719180,1387679055,48362698,262326738,959182206,1760293778,7863071,840040552,667794212,283400778,344147300,171215299,1858526761,1555467811,42983873,412099378,1816798820,1825932617,982610327,824996705,1334432713,900551657,1580787684,737660521,1737080530,1669488828,705074882,303609638,1592304362,1475042498,53104217,444811464,243914995,221685645,893093549,910515396,1384766381,657948579,605224138,12284521,1488336987,1177936796,1576474993,862071053,1713978006,1280055949,1614936163,167277023,1582157207,529265686,1861841193,122329381,667848560,2001461399,1717122963,1691616863,972602927,350743726,1424989996,2063618321,1743870217,676909632,2130361729,449786278,169399597,467075607,911159163,691574476,925220213,2089186975,1842943391,905674392,423083496,1270929914,318083124,1649700984,473370809,1930955730,1765316601,1993625810,1788389656,1046824406,550280128,1648827215,916600689,1660600343,1037199364,343195914,1394738516,344167232,741304162,1234175909,354710933,966438015,1844309717,914710439,2039821971,1594754852,662992422,1684475943,418479058,339256858,924979557,1637607169,390394581,1108737159,1427259149,802037854,1006370855,1207323633,1051434710,457338100,1937548692,2082835092,635342551,323469213,1216465937,886463411,674703843,2046997704,756021596,1432503807,376706476,614677466,776452360,1742757683,1594443660,1351651501,1980682889,1639616543,821937927,1222944700,1460808135,1434782281,1951872459,943652739,1268263159,1636088855,462708957,1320893096,629925029,1689513891,770877489,1848711195,288303354,29919591,1885041746,102370454,1012828411,442071479,1194228579,1411090153,979541729,1049428259,484603029,1806488355,333698276,184754610,868473128,700349439,660636253,60888199,1824316591,127781342,200827077,2112933434,1849778687,294500805,54695839,267241598,1281648909,1135519841,259732796,2121390032,37974920,1284638864,336028143,1935374306,39852850,355624240,722099354,1276063063,1104404,770713869,34611967,1980602745,492326310,2072351884,2077289188,690537923,1500506972,1141099405,607321181,1131867734,982712579,1684750114,55394977,1347173165,88301862,508724338,392530365,1684457240,1829103069,1776173656,1686829623,1306311924,482676172,1942763978,1469908961,1671717638,977372481,1398551775,595453722,85760299,545996315,200760724,353892318,502240095,707797142,854994511,972134987,1603319025,851262721,422401554,305851943,1236716862,1792637550,1187696874,1548263739,633343663,205470539,256881481,1998226420,1686520392,993987970,1340946966,1602431111,1161124372,1237156197,1530095683,1286925705,348243854,551069098,728888074,614378780,2009650791,1574490130,226394126,1543818973,1661742177,546838901,1508347987,1368504638,1531113790,545745319,1956774556,2009957161,1733722800,888238778,1555797594,983806247,826181465,614138699,1480115456,1965909970,1314497759,323852763,179823071,2116696932,1830319509,1677728515,1977497830,1918561904,297790444,1830253431,237613752,1711349239,1145670632,1701536450,1378509940,137001446,689192833,1176839298,1555057159,175476120,42497430,1863707395,490260898,55273800,1304832586,2034360357,1610642844,1913816079,523848954,331629216,2017488121,246168664,545780896,149156352,1853616570,708602539,1486143951,1329147312,2130589260,1822916264,473245502,75458256,1252264666,1108122463,2048115766,1573081889,1080883034,712026968,212574367,1552317491,1689645516,745850924,1962311066,1803965908,81573366,918813716,1708851063,1680764471,974815630,862014576,1355884136,179134484,959568269,217974626,668445305,409822840,540533854,1321388326,1623512425,953044918,1352252333,676780624,351879255,1925379066,1432225307,1425604951,551125279,1199798725,1040600016,527609245,1996859689,1847309490,1248401984,1547116618,523574451,1534170640,562971964,1969853332,1087041146,1984785841,2100725148,1128673361,1518518487,1962661445,1916519223,1071497976,1618722027,310675615,1430848059,1747988072,598284820,1676365399,1929265978,101678099,237175396,641870980,301997630,268277796,1464447131,1815005830,1594405027,1655105042,1859780743,364920448,1502981496,874788816,133537918,2065940914,497395006,1394706574,941717187,568367946,754228391,357913628,292924270,1929256758,1032744833,1195173789,2110817113,587105955,1510376627,1547583521,334596325,589700113,734817407,1639092335,1011786256,1904422674,1927222798,913747321,298742062,1610132178,498512304,649362983,704014980,1344367380,78658328,831655944,662257116,178220090,885741078,1018793073,941642619,1220533546,1593369211,423957003,1355095691,2078980328,829954672,225991548,463166655,1101181964,1272246276,719215156,2014583683,1656177585,1801390135,1612881117,870257585,1269355948,1591520863,1321302575,1799528997,1147796079,1349609187,113610846,568676321,1319336685,1035387298,1942461961,1006926440,503140480,1911044656,804169228,1389334892,533517309,1518470253,899781478,1436453126,55684903,1839857434,1884242355,918812663,2045493931,1499931938,1933604106,780939138,1424816087,279298991,1269753745,1243591676,301564041,420128149,1476291293,1246644721,1210808925,50626156,1976252416,1149153122,1549786345,631495990,1422624290,1688030919,515172943,1845933600,830483874,1911132118,549850097,840273380,438395092,949991861,1693366590,1969326752,1256463111,1547584617,1397411729,787332178,1725976118,493558042,1031100101,1275785701,1465272372,765269851,461380333,2118493798,587457873,4418371,1885847697,134330706,1749202575,727503958,91495582,576909251,635674620,600910085,959838978,674470136,1923294639,459544849,273984996,729705057,989174381,1456541069,1581659792,503828349,2404692,1462215108,327773779,1163834824,830360618,420140869,735187202,316043307,1060342651,954807088,472761416,836141613,738638240,2123038535,1141614153,820361212,840388798,655307554,1129656505,1280828366,921700836,8296208,1043009916,1517118592,2076600599,69594533,1903025249,706564669,1293259696,1146383242,1178673641,456583817,1351776030,544573410,558622424,1175529792,1719447469,1848841703,356449662,1781370737,494988556,910260103,731964160,1756700538,1534156463,1135688568,321154036,330795241,1124723452,877920030,419217322,1682910490,873953649,1896329649,1354846523,1743747934,1199244774,1536606888,974263036,513288079,204716662,342514486,512775251,1018500064,401174096,1961462608,1332204665,1067414549,2022471702,2011509794,1899798537,1457053120,210708505,95112192,1821188358,1347103994,1199853570,2033535261,1924564,211437555,1915506407,1433701456,1488374557,1632102221,249646510,515959184,2099436345,1160035408,256903447,1249007333,612379631,1483041551,126478530,759048297,1170290150,2112204372,1708841673,1965251570,806679187,122568748,2067202361,1116135820,973839741,655900527,398670921,453855128,1502403717,1956875434,341058022,1762615705,959764029,28999817,672616310,1259114854,2032216769,1635986335,1933126524,697265851,1647205626,754919799,123320156,66397239,1307468277,119426835,457369768,1283215890,965119981,346331665,585231922,512477168,22229617,1211968832,496027630,925810647,1727381329,147413676,1633068576,212520951,1856049772,1056404874,489077444,1789501744,1910753527,622494367,1668623352,1524843833,954161882,590434166,650649045,642492088,1243011472,1945979701,1243874241,763799298,1381389727,1121587003,313471987,1356448047,1283817943,969952015,780083560,990013472,56255061,1625366551,1154356816,2011727617,440418385,1117918047,1293475711,407291069,1435723811,425030099,229108816,50247656,1001970835,576696938,224411542,1140446540,1318478744,1303632856,385451126,373633156,907762349,376592315,964513457,1131573740,625446764,932843959,1220248513,2125447680,1490899432,79443970,1205470051,1115440523,1373878493,1715217583,356674826,1971487789,1831870735,1982060773,1582999115,1520283940,68777237,1874814410,664007645,1314026913,915915865,1557940139,487919543,392313603,1989510182,428513915,421323154,1585947858,524387980,1497505110,1111484703,71365214,1899547982,952104071,981689635,1941323620,1664931917,1818315665,1923016411,823007067,1360021525,185419706,2085734535,719091478,997231944,1266089314,270635161,1147730987,1075475896,772576879,2057755893,1478585781,174408500,1518702461,1487086909,1365352123,1388744119,257099655,579142850,806579210,150059110,1686788321,699469525,1284758136,1922972639,986620133,280178931,744267267,1698916596,516910100,1925901353,750815915,131573258,1118871803,1089922043,796524012,1721512664,443187504,1084521835,964421182,906248597,1519700291,1219481848,1692075853,187963717,1258872690,26050676,1649687925,356796108,274186067,1848621807,1993278740,1782851079,522643636,292422257,188665945,1796528049,6688807,1386233298,1196876698,346863504,501553798,1097157362,2055162994,1738231176,50157485,367219869,4346122,1662296092,1051226257,1022734836,697014027,547513349,1566831631,751668929,1557246894,1754803605,1268069620,120360628,918874170,1010280757,937225598,20495526,1593613468,760293461,1605038515,1142641444,528291705,1492954318,520887898,528849448,1170489568,1540510900,301913905,1481357536,1000742976,1395290519,1357894745,65687581,347848576,1785272526,28168461,2033147124,412452934,1900970668,599738043,635392153,879235849,1624807557,783476002,1493813631,453973812,1455054525,1454257465,1816207003,153834549,1099304971,1753858455,1567553484,1060862726,608640385,1135990379,1791962695,704613226,513632312,732473057,120105708,823557836,644092465,913895463,365569990,1195361528,1573387671,253670239,2077802028,847540101,575169094,9891371,1063620938,2104622189,1828677372,1758664580,2037287169,305637712,290496860,230122871,745928589,951139185,1252445497,1139682803,1086266742,208514791,862735783,57504147,1238626999,655134748,1767117784,148483261,919529232,1596123021,177598337,535385151,712909005,678785138,1314540992,328627031,1645332504,69370551,335493727,2070686694,2045263336,1062504636,1490610239,1597028328,399363644,858385167,762643010,1095027756,1652014797,1763141353,913022592,1674449762,432136554,725414262,1833166801,1182318667,252715758,498948517,2015859183,603096989,678966688,744977271,869363237,2065718096,512404435,1203573030,1237558949,320740244,1659409398,241849266,740008511,235502801,1453253675,223510145,2017319625,845603056,1484346617,1790170715,1230491884,537707003,188210188,1429975605,564727060,596634635,512130795,1429977430,18828044,1171204321,824941876,1561946956,939463028,1267701028,561376246,1494982337,2127784020,1636301537,151869757,801388658,1191239049,894382417,823787592,2123085555,1720860836,725515943,688658840,2006923266,822047018,1505444452,2121970218,79885943,602120396,695747983,1222585800,1047561764,1742662170,1981109590,173043939,1649822096,159602773,1118294594,1538531863,281302934,1080580793,426821151,340299730,1674561842,1900498900,1062043465,1616416006,1200336720,76417531,495525066,103066257,1595499484,1253144745,112329984,1302001510,635275651,445615318,508885796,2112172808,126511853,1162365342,665385705,1806908100,404059630,1353963086,623914777,373187638,1909395842,329362678,1571279783,305988402,638244469,1311061418,140076086,962150688,1662121199,1290544702,175863520,178743895,1602021838,716907487,1759358796,789036137,486366048,1810357956,822062652,1760183892,1199133478,1135213413,933501240,440077451,2105168265,1971539743,1729419303,117603599,1441479986,699384009,363669258,1090724460,1481674048,2010150715,21412551,472487884,1497939958,584395154,982861067,1992380270,1085188777,1679789874,1864719149,1168237940,1030536409,69763262,1633425021,101798886,655808752,355788781,803162578,200479783,164301960,1234677929,1932015789,462694771,667499583,391820251,1944323307,1802559538,1127577347,1515651113,1493921055,929348222,438974261,209452700,980270785,1268306934,715789620,418888899,1435047328,806718231,1253518582,1959521210,1055886874,2100680113,1150268772,611681893,980584294,1033514671,47197951,1703039699,2049204066,1026033423,753938759,1581039512,1366484417,1646440702,1434276738,1922264344,1820528991,618745085,2084770976,1749027354,221209345,577617621,1603032689,1289764585,1054523990,1320722659,1151727903,1894384377,230462708,2002587709,1844404740,1072066213,2040697899,662673743,1232845804,1561170980,1028308081,1204722321,274846223,1269481986,1870329484,2056651209,1924583882,315227723,1718363181,2121838765,1882261546,2116266660,253515433,72097833,377290135,7269556,1667485826,983615463,821353431,1023957225,1590950591,1696277579,128384977,1309327126,433701633,55746838,1024458195,1361022873,1782068033,557631537,1662819948,1841557897,335357577,1105752526,637601640,1563436108,487065752,1402862262,2049760067,630500677,451134191,1720529582,1219531060,400072479,1059261948,2001824757,630504273,1746757346,1150409452,1150080501,2002690971,854875292,656460421,864430607,1883122638,821851961,1949970422,2068548244,363210480,15811500,358497979,1990358371,1976567504,1912444744,1342032060,25682455,557515083,559990447,1917010918,545125762,835232707,1037818499,371078692,1590520545,1174303463,1271548147,1736961548,196796247,701564853,599376886,532075266,1432387318,1775112811,919209772,1679002885,768666929,456635418,1997860056,1829113646,154733869,1565557443,569961461,1170438843,1865471014,675167306,652948906,1783841473,2080354743,1271777191,568369946,850960139,1856236701,2114442719,985540572,2040553681,1705581500,271847138,2125680868,1329119137,1817292722,1776456607,1578126595,698239038,155606750,654784537,1217467527,202839612,1978272124,770795155,1500326717,1537027049,1946416154,1234841671,1584790201,1022977568,601513104,1231664130,600552697,796747320,426465215,1660869502,1484502840,1823343943,1518065420,715107709,362104545,498732942,1256109105,605722417,1997416621,1293668599,516951929,1297389307,1328390415,1406576477,1250894099,1962515660,829323490,592481248,186012683,1309118757,1563105290,582814101,305485454,777822584,561537140,214647751,1392980676,773731615,1679763810,1137593553,1734147621,491556724,1069108674,1790746847,1871678016,1276623408,1158891916,1602796357,882462487,720632315,614015321,379845048,340183992,1057168371,1166296480,804704896,1060662186,1995210255,544114641,28377471,1045836586,1239795400,239549195,917375744,1585918701,1367062898,1883881211,284551450,2050884000,1866728752,1520146086,1766749544,1968226960,1945820303,629079373,373223143,1921574078,769685737,1461507819,1619100638,761729892,1755764409,1072156690,262825640,1219526400,1602753120,1397549675,1394941451,423694616,1533540738,985519213,925571818,27318566,1908067178,667950170,1290532607,1549620012,1712754629,2087070590,1493617176,281511591,623209512,1510279423,2094797753,951824360,1915473509,1418848355,1710511217,1170677262,1143040282,258061309,1187511384,371680267,241260030,355031238,1222386283,583522963,2045656778,329844073,285251360,1475276185,1386917421,189528026,25496611,1743831341,1650253640,364119528,142943871,1445962436,2052616738,663774456,113366848,858663627,1934950318,1018785003,1308924114,354354534,859884784,162936294,1216149128,732955996,367755940,555037724,247912220,367401027,268878789,2037327583,879894387,225772410,1219101671,1919032919,1713679514,1640575292,1245771543,1832408144,1909912977,977456898,1799120218,705430879,1027309990,1142494178,125891894,597074272,1652413096,1399356506,109859782,1119108474,1579278964,83146214,124623274,236043228,1961619830,1653014846,1737062410,865412178,1761633543,1766230983,1051739073,54970820,1802251218,1462442655,1229938759,326800465,651829205,1918300634,24643827,532517075,1085442416,608228932,675630173,1671017175,766072726,152013008,1251587257,1934503749,671559372,1515472419,1664038073,133742534,1555756884,2074785185,1645585151,1588883760,1189705161,299727658,480588546,941182766,1994853831,1441144526,1546098236,56859245,583672741,345770879,960152273,769272652,1997082481,2114650370,1258242631,2015542666,586161992,2016289414,2046641132,1292825396,1157408293,1731868191,1772193850,1469747564,1222130703,60815475,1533302621,894565027,1932670533,778878182,1516378695,1770326817,220700048,2075901089,756596273,1000265323,1310404110,247428037,540912618,419725253,1753067894,301945461,1192171680,1345260170,669124140,1240815981,693809316,5166757,2031599829,1297978438,1816512108,566310810,1279267182,262554828,57210083,359966340,175795141,679621466,1268395697,1369167998,1678655310,1149842213,1448942510,1838455113,1332306747,1522652883,1585006902,237311381,387870938,174367198,1657466224,825296847,1000574153,452965727,119578428,1075832304,1574577576,160964691,2096556824,1186249736,1435009786,1347639625,669507984,46651245,1441768796,677461897,291325929,1498201534,1271319098,1508412574,1612472836,740528728,67908260,652262712,371955046,337701851,975162038,1921386970,1023895207,225747250,1630386536,38826863,177779182,125208777,633487058,822962123,229776409,1645073321,11794394,1282070004,1574092965,215441244,614962657,197209086,2062728891,1928260050,1483866664,1318532657,1259857410,1560155200,1120335513,263312657,500675485,595242890,1374606865,2077010683,389799990,569278680,1010866913,1939561537,570108575,1685090801,47875505,1514992348,718388900,1846294033,432425659,707399409,720589369,695877954,1795164170,800470082,1279424536,1577062852,879417437,1020724116,1623156629,1083439628,2023825926,383680296,2093382289,288487223,564518566,1709267683,641197183,2077275504,80395081,1247541363,91791859,715605908,410508061,476217420,452566621,1177175162,1371556100,212750428,464816434,1833333879,35934954,959224356,1403949478,120397405,376197366,8141056,886423673,3561352,657319473,1964933354,1371717479,1772054017,1090762439,1817979615,1971863902,936878981,1823543055,1289603591,1560971247,1569174992,719604110,882401900,1961621632,1474952829,1450742314,1855204568,1126631944,1672142359,11156068,190839579,2028078117,923749700,129721925,98470997,347394205,573594484,1238510918,9695245,1913459937,1062532335,1217593149,933332448,1241997572,1217254379,1161639723,1238530229,535435178,909047534,1644813333,2079058618,173768512,598357569,1709586661,1056355559,824983718,2100162081,1250232706,1902812823,1300798751,1003278100,1853761830,301373416,637902514,684919467,1272887390,875464579,1600352879,2103485773,470493849,1429199642,33735536,458514858,967664402,1268352215,28283834,1186713911,179447582,1871503807,825065321,70308242,708805439,589428,1741391690,1416235699,216604906,534728899,1517741558,777358028,293041444,230333653,2094494385,28692174,1524748077,1902889529,623243386,1997921362,2025288550,400930667,463333243,1246493918,934808958,1358449801,2127492912,1269613376,380223059,1034722406,1527671767,1935419493,1414408832,405645995,1222545734,864762619,1222788179,2064516048,1040685485,864416917,428598515,687360164,392856107,437418218,570512185,2116923648,1198391042,735074035,1162479450,1803767324,1907638355,1186947687,273057464,427167459,229822424,1361962340,1296449415,788545336,1086818718,449881145,348510069,1835724544,1827203073,1947990482,400499135,1414538095,1080375826,2103497457,1903577157,882868908,27187030,1638312741,200941523,1562587806,1254429473,808855822,1510515926,1008277699,1067204571,46603329,2075634074,333316936,1383977531,1096678593,599149000,1503188025,614372867,1428086833,1020997443,992354776,1474623775,1803744035,549556016,1574324289,2034898590,1636612052,888934562,387532158,1099736759,1788017778,634823117,346162038,1694365960,961918947,2124012693,1424716574,490715442,1310867854,2092226172,317673650,930961404,1378493893,1231895026,143998941,1266085301,1490375397,992611485,1322173595,562867013,1255885664,2065051148,1191985407,738586918,358190270,340496930,987945555,255067588,1750919894,1783034403,111820223,1826594228,270878707,1339408615,1893867963,115351480,973940055,385167367,1524768903,456358936,1237901329,1866180639,1422590063,2048151613,1335375602,885502024,1585427655,534108691,2098304736,1157657184,1376415354,1250490456,1318437871,1036420491,1589880092,1096505299,159375097,648320890,1007005530,1939237267,1531504556,2127567230,1355430521,1243745280,1315908913,320370130,1082524744,1675628107,1727506604,2056288600,1042778911,1945055603,27265237,1764644339,1294117683,1183045934,1660128215,1257673876,1501006621,1281150522,781328769,1331613699,1294403348,1385541614,2043217209,1666816221,439434069,803781900,231790621,1440771161,1673966036,1672720040,2005419488,558659006,1391785759,1975840005,904756639,1335741834,1081043232,421860520,1601080282,1169448993,716885965,1204750024,1326335101,1937362954,1336192046,630231527,286584405,54935584,1449689905,617085946,1556394462,2009649774,1326602371,1480052883,824288840,1228524663,521635753,1269486896,1319292005,440349874,2020846470,1222808560,771981613,1434271490,744372099,322656165,760730589,1893619435,175818725,474486636,1376642649,1008677899,838343366,1820108522,1757414091,128093939,457839658,487421601,1130163079,1024139474,1426324064,1514345900,1911030521,1868683192,685877567,1759606218,84930584,1950393785,805989667,370652652,917917597,1149699787,1322149425,1239785682,931701578,1675654215,520256856,1771860901,1808772995,65898145,2074230349,4932848,719226956,569434892,311330532,1293456416,883697725,329293654,1235486582,2124239594,1882419973,9532698,1232994648,1293054850,1003877776,1374551950,1213201672,480418077,2044227680,691354460,1434060237,1072178644,1124360786,299907027,494348596,257081771,935541373,1408461561,1204706565,1200830780,320616229,816948275,2096649805,710264168,2068310017,253764260,2021007055,1914660905,1396853307,1444072632,1652690202,2038780802,1439281791,2109565883,1889867978,1180894304,1136571658,1914093029,1991551575,202618830,1303352434,458707509,572531246,595158325,551257362,192632363,511248941,155848082,221766632,633426342,1981457521,1640938004,300228738,166293576,1850850330,1226272355,1382887418,342209037,962009916,419061363,65687367,520599215,1254962077,1025468430,505137367,928390905,482569610,1369749944,1738062878,676284078,803702885,130344950,452822783,1081213188,1371796289,1222015830,98472636,1553824069,2032867146,1585209654,988368803,1112787262,78414685,1846504816,1844472949,1201224635,1317377988,390523121,1678070467,1598215093,970208177,963361562,623371091,1855124953,95368269,1762517471,1624498317,1440624007,394112414,287730979,1483914615,456059784,1781566216,370226281,1565096091,417779539,1207935929,1264874652,1088229828,1955828143,960321014,608670220,235224704,613722064,1983446072,2114064781,1103684371,1988640145,688034449,757763900,920537014,2060741785,999856338,1136558727,833793105,1973270247,1765207862,1299086994,1006312973,230604679,631799556,1023786983,1582355127,1056104923,894338548,745325800,2045478967,1617695084,60100072,1290565017,1095829285,1238203848,909917074,1148921700,1490010396,351940311,1206264525,1012056088,2000682388,1313210744,1685016785,25375157,341609139,1695671813,1347514720,1973985527,1242654441,1933575489,1345535109,405482397,2010788134,952883293,1692230814,764156794,547954831,1910257839,1463614216,513302345,1359668281,1710273862,1195722380,1662444911,1879252448,1706302358,579297503,106331286,1091785816,1316439156,613614187,1159606665,53847664,1010167178,627106952,1214233373,551875729,684941223,1456273459,921527729,702536594,1375012869,1444510585,1961390014,1978824409,945922436,1500115730,483185636,491610320,2017345809,317126462,716242589,1812265837,515226872,2116131207,104226250,1611857200,320047322,371841553,1550225678,1823138454,2107057662,843879389,2046244401,1663736919,331555083,850664690,1831568252,597031562,1699042302,770447688,1656044417,1503898266,1177812534,297435876,1438413499,96438218,400122757,795438193,1872641972,707092915,1049527824,1192936594,2010140122,1269255496,633258150,2055628418,2047006624,1554729718,440987282,94077083,979632482,1445420254,336409627,1952133637,624371955,134512560,1154727208,350450661,1371887299,1302643374,1099376254,1216703575,787964690,619172543,678086189,1820824703,222042509,1763244538,548893026,69031838,247442235,95154942,300250622,840731941,763210196,207234676,727982191,802623795,433246243,1679429201,2125441572,97945160,309311914,1667492169,851671346,1161419562,197275473,638790248,1527130708,1690696767,901311605,1693332024,810279838,656668150,1902189832,1564401812,1714505280,1368382696,580331915,1970284329,1120334641,821614765,2091422435,1316685402,987309588,661286738,216664901,687324284,34540001,1429985904,1560062350,38989854,914131891,2012529956,928407114,1469330785,703328553,835251592,1281065885,502697623,1748788836,1616329946,1539290430,256873008,1671597003,1374774302,138112297,926905587,2066555246,1939675116,752965655,453597857,1830089606,108620785,115852898,218880089,504605391,1955527026,2085383037,1785727901,1668688250,114261801,1110721050,1947261064,187591756,656652779,1944300540,999728179,1729971201,996422315,411454869,243281413,1604934783,921639878,2006374153,1079086963,21560329,647257976,1697651319,1549439655,1998688758,229372710,903740571,631654632,1029153236,440058922,1188870110,934764366,308893574,1825828868,2062166769,2011340672,1044094965,1873284077,367424612,369130945,346731784,1204662469,136382507,665393994,940370011,906827386,1649169891,46621661,1072209812,1463551202,1344543360,901132653,1809787266,761343601,86994008,1515761757,1482613535,1958015590,310082578,56689634,1781061500,1930951862,1745560201,769769636,717362862,1841730907,1314687441,816278277,804184532,1562306768,1878700405,168563033,1212769650,822250799,1006799544,172549640,1520283971,1702615388,668546533,1509641178,1451415608,1300993292,1879751869,1191884130,1102056085,703737731,548978463,1714903492,1704787759,513971745,718761197,311951449,2099575430,1026410261,258235845,336975852,671319372,53796461,1177862753,97220398,69004428,674836033,724204,1279374435,534917343,882343032,771647819,1596228645,901990023,1209015643,1130172042,1896249943,1451811744,1335232548,1578201184,242927759,1190063414,337717296,1210454567,1950220697,742315066,1895635475,874440014,594020562,325936099,1376140719,2039549785,207689691,295631136,232285936,2070753652,414439877,371099182,1914487025,1153631144,1078611949,1188192026,1451737769,2127584231,644116187,1996737644,1907752103,853229340,1272522914,246877517,2079782010,1096117944,1328517844,933071230,1951625469,1817758458,173835693,7156196,556606563,1540095129,1283553642,1085605600,317189275,2020268993,161325769,2013628688,611700914,537958203,1441466454,345556260,1285607394,1065700,2119015042,237131024,172679742,1625144716,624684586,2008560032,2120213010,1593189058,1743112389,1862926909,353125683,438837333,1793064070,1801780308,1841795023,876590884,1516658495,306878184,1241207393,326392373,1170338366,1355393679,145103239,692685067,1207049291,84557611,564770844,677431667,1085327252,653725084,1606851714,1126330052,1955184351,1018623672,1889589664,1401039817,2025707172,1547818907,171637713,967563437,953255398,2057110043,1940190786,255336991,997241097,201009579,285312801,2037364788,1443107891,1951365505,588563883,1185018659,614098718,724138691,1949929116,1303011107,313233298,745354875,587341565,290336024,702081997,58663797,1264023442,10617494,937462210,1673253590,723290637,1574492812,2003412996,706545355,1953901362,920135976,2128165700,1696430903,2099179487,752719805,633148453,706635626,980884318,350123074,1040356871,477681324,1096122530,2005414629,1574728523,2121645044,274689508,1406967220,1145283582,984604890,265540461,424047775,1116918360,1398834812,534225977,1642854745,1043516722,829944653,70599101,586118736,1557098300,885584949,957174530,826384167,1586812802,1712082222,1977301465,1977384278,770101212,1029306966,1156079906,1688478249,706747662,1295645163,941676278,1406022164,1135379516,1420003083,1750166685,1992716918,1389982614,777488530,1615851194,876875494,1236222617,643729808,862045560,1563913991,1874553322,1693173724,1566156908,518928242,1812847084,1863988924,737116678,1328750832,1211064044,1213342482,1990635194,1794528713,111030917,1520247749,1943498489,249554024,126483167,948437577,933019984,334745572,617641410,257530175,924034577,1227906969,9803518,1294084263,274708402,71509946,1602412119,831134367,810050351,857382523,58423386,934348305,708383971,845497332,1987095110,439539625,82309985,667635601,1395481181,1084692946,2091461392,1129105843,132590737,1599179121,1520786698,1431888378,1129905611,1603369675,320516246,2020302917,2093380672,208886840,1169458546,1074467148,182838331,220298431,1288547911,1132447478,1828287956,794781408,1491522532,1730049807,1220864279,39969904,833797182,1492643343,156605746,1440310343,16939239,826660197,1907555134,387315922,600462486,1745626308,1471684930,1520693175,2098135371,1050638151,697441766,1497195807,1456235570,1093330054,205071441,876934809,917324967,1291521296,1394176838,233611921,386928894,1872496192,233479941,1704717299,93605924,195448811,1772393706,2078187868,713237419,347603936,1992413366,395339453,91692049,1822083107,484019248,686531265,365517349,1507341282,2068142260,1801642657,1624581671,896256426,118406063,992019821,553598292,691340750,108934248,1535485911,535244782,1770835608,2049181042,307685214,1376357539,750038216,1736933686,456688592,1105662477,2024578803,2866286,1086675164,1757435605,1014719902,1119086164,1138521794,1732842975,234647104,1118317148,1701684616,1120501396,1032671714,674897960,1414120250,157397242,2075840239,1936274367,1392605134,1243596475,1452184054,1242211759,1710063492,1751246458,792660445,586850458,173917072,1078844731,312372342,27501961,1589782087,652103093,879100505,1299860804,1393383609,220597369,1318830819,1046643856,1085203165,1218142683,920199073,12549051,382902520,1816205902,797354509,2130418394,1374597943,1208081159,800401811,512385163,416092086,2046982866,154354532,893846302,1451010069,844767247,557501432,49139370,2068575621,1370657192,1294836786,763690131,1437622807,1295369840,763602793,1383060550,1126456615,253370717,937058922,517952327,262398250,592621041,833456852,871020575,650574702,1993968146,355966737,1553964823,1130640701,264413646,1981146623,534882775,661977144,1752701889,1781880332,429682008,1450382819,437580913,1681738664,1086813979,1588243212,1976775761,531083303,1657900245,829525394,1130337054,1514924042,954487536,99446868,2104321801,2078170767,829418494,1401177631,1647071911,410601070,642869958,802988637,2102505175,766089276,1426449446,1488185678,1279048572,1995741487,290732747,979294925,443006390,1289301227,1118378036,1723166569,7143242,573601182,1724951808,1412572255,433217803,1350473304,605627218,835141739,626449272,978869968,1910148119,1078937014,1568292723,1455658731,1951166231,1485740358,1213489292,1143250188,493043499,308362,1670292607,94717823,1957265623,1283259144,217993548,186589533,1730381435,680380597,1682274919,2021671252,900055969,715060228,1468055396,656425312,1266644445,129195436,1727671554,617085024,797275450,1270333380,1466343935,152457628,240636885,1837215652,724258091,2012505494,1674001380,926284589,2129019707,221756237,837429415,286610093,651411860,1872903668,1548049547,501758054,1927452093,2012709633,1936341996,1080127335,1846659560,144357801,70726993,747504356,1368200407,1593446216,240532715,496188121,84242364,1557891668,845467604,505601839,1896256014,1898715420,47952803,1915085316,827776280,655366404,509657210,1069803286,1266218857,113706763,1018363801,1445777788,709134024,858605260,263357010,921267339,1323073619,1688326524,1752995122,1840157879,415705183,1936039597,652755487,754584771,340375565,1829595155,1008223594,683433883,218629399,1112807060,86285034,1013662887,1809146663,1325090703,1392234222,1215624269,2079872308,1483494143,232638240,1605437558,1645887764,559013148,1458637130,1919492897,1681236624,1366693748,37591828,1901071090,1932692161,1059676551,1846213633,1541824420,1022383857,1351216663,491228080,1242761879,1996056839,1371911793,528044034,484828564,1859322958,1844834163,1475111171,756003383,722714580,1830284891,25750760,2065301151,2098131535,2031953779,69734052,1677088254,1317610899,1920550626,1640756368,1186059435,1151580410,204213723,1938910910,1891147025,1752305448,2018945626,61687530,1675606711,783717879,835043769,146302251,1634033987,748105855,1194079997,2049356495,641116418,42723406,1457321334,175158258,1968197929,572409732,397304115,482957895,498041345,838333483,2011710276,1888036159,1390520084,1611548393,339737441,1581047625,1332276640,1753692311,1079024887,1363024439,1405467164,386869037,1306235043,98320372,282914740,76195196,994260469,1757453424,795995520,308908499,2004925133,1052944833,2036136312,755652269,1383618622,446932581,858394103,1038665204,209000045,439285933,147330069,1751563947,685784922,1718222794,443903164,1275968463,458404085,1345272504,184707953,1966673471,1877046473,286829687,389534746,203414498,1492507715,1446098052,452987962,192070927,135378621,457912919,764252718,530323823,1589914743,140471630,521270195,1776970996,2126222295,151166402,119979497,172114552,1909229262,1597463639,753079714,585224793,807065372,63433448,1658654670,978470599,1542105469,152656155,107768299,2086299984,1134476881,1886751396,1643361761,469833757,890513954,348118714,775974979,1219087466,2118942874,1886850776,1773911551,80464152,1756475544,393867534,1420503524,836109998,1700220699,1785406137,1418330616,1466157100,478312156,532951799,597238258,639682602,1264684181,1506477132,1377117132,881423571,547541966,1003985527,1445062058,320978856,2095725069,153398403,114849170,2023873561,1327585238,1331735768,1576898166,1795239364,844259584,628620466,1609265752,545611240,143047256,849641227,1066194815,1595834202,333848740,866843107,776206794,1027030907,197171401,135959142,1465925760,840732886,664490964,2053566467,647383944,2063925293,1581636937,1150663824,273502396,1856442736,1439649780,1303426101,107584619,1295273177,533417196,2116972813,1165708844,1594044929,878591726,964228024,521223418,700894174,371657949,2069640977,1821017144,1071588346,846026139,1554644271,260229520,1703782128,395610167,1820938589,89694736,1665583711,225546845,1612923184,1344729615,709420439,1553105579,227921877,1800346770,362911103,294476428,511219795,349728615,1318767839,1938047287,1664312979,418467403,453395370,1442636672,863363285,481374632,162855760,1209456183,1277347110,1688956873,1812481809,931067569,685408876,1732808998,367739912,651337967,966460707,973073111,931340272,1868954899,1112608138,484115524,1433647624,1803968683,1799640093,1576387176,78130841,16780500,1995465406,1042872898,285212299,891449862,1602594147,1770631340,1540486940,672174095,2078343148,748349938,1830727706,1927961871,943453206,1955108649,2017718021,1416993862,818220162,694399584,980027564,1803074862,582013500,953513481,501683028,938753443,889244086,1024092632,1416397048,1151421354,1903967594,1315242706,1879151147,1514115947,1757720247,563325701,1053928536,914894256,1326005472,604472788,1967055867,1044639168,1243769731,578921314,1553213997,862970608,1137612760,1894291760,1511544686,1278875451,2064214741,18601379,949418848,2085453213,1996620074,1156160992,142531962,92693200,1566060472,1991495103,1968246514,1477049662,396913933,987454101,1648965764,594781478,8656742,1417994245,495258453,1676851560,1559244108,1526375484,308828220,1088444840,1675530921,1105745818,63807056,1313339850,1323459939,1537975871,626495581,1136397928,1330778012,285355898,1126384918,1020216648,976267729,1578309095,1694894423,412860753,989710336,1333410096,727051976,1763191370,642581077,2048168590,1819365573,544149703,931706778,1341514064,331730055,1463734823,158465692,334241025,786773331,1855876312,260704050,1240363122,2077556839,1595382201,837657817,1943127329,1824083265,1641143369,1835465729,1247349196,1488686816,1728310957,1847821091,573693423,1295229272,1087463755,2060413402,1278809457,1469334873,937153572,1996951725,1373975813,1071061713,1159564671,1011615851,200763104,1151711050,941069260,982478183,2119042626,1836044273,331301739,954274440,580017003,1124397349,1308218046,2025495343,1919304682,453146397,1910690662,604887686,1939286704,1245360280,1756500792,42825732,1381253108,1253200726,1500984392,533815626,471583196,119455744,78766741,279698327,768498364,503097740,1619764697,1793978234,1502475654,2095501036,618431333,1262564077,552995470,670573839,1510629643,1070067924,580782701,568191786,391855077,1412907377,1287985129,2026111597,568438347,2064431530,594408939,474964604,944260729,572361070,2016628160,953683809,1579913735,1286418899,650577553,1372928797,2117178994,753971895,678864810,1975310486,1366459458,716943195,1632328391,118128087,2095176208,1274454836,1439024253,882534551,1684925834,1467217400,1417197778,561510620,1340111536,632626878,1632421962,1128104834,1643117443,36982592,1982291952,967123518,1816632951,63747038,432413383,473351106,1247127168,178683048,437960154,1877952443,922959807,178546424,1040305745,137073926,1131393335,932037595,512629124,516986947,843769483,102340848,1543603414,71102166,391591592,1059260065,2041059325,199958467,870686230,1802385030,1765137157,1963624293,1553079530,1367116059,2018037382,1514040450,474986182,380382964,731543834,1099711246,1391685462,1139706876,399551473,882732075,1326836304,124813414,999575616,53052419,396788962,1983561626,1266496774,1046142198,577376886,1950575357,545664443,124653400,1435158840,1226173123,1639813147,1214635212,874303816,1623522149,475438025,1683426934,122479371,574053959,13739194,323337061,567182682,1959774901,207851975,647963767,1792531694,2055830582,49509739,358883694,1493074004,1357933014,1261683295,1592397929,1562368866,1136944381,583695549,1380230870,1469311032,967851907,1243662986,1787480423,1714412043,523790293,98123963,621177251,1406169279,193741786,983694975,1760479611,1830363593,985405568,534975322,1979451851,57245666,2085663394,2087838565,1712684944,905814059,227741015,338335250,778061965,1474495097,1075742001,1608666591,1967692515,1364620738,1547048601,2053150971,1301352870,1749725442,1979531350,1775886725,1025227180,1132684563,463306215,1554401014,1894477212,346556868,974220747,1689909991,1112369337,1535280749,1458275636,930031667,1790889197,521822319,1630117611,951290512,701471211,2064844115,673694705,1362962728,1961105193,744816516,2106339387,1612253142,1766073783,1637465761,181615689,1187516270,984286228,1986124958,779846546,1706323890,240490866,713916128,806522403,1156498798,2073685485,163156627,312153351,1548439105,1807981847,1628568423,454400288,528064390,862417313,2084237734,1786020427,1600545446,1217656474,1057460029,278236957,705884857,989245700,2037775529,364834030,61126079,407103294,721305752,1621186775,1447399723,918219120,1806768760,1270098596,165709844,1640057973,1515811178,230937576,1839309438,944431303,1080067805,576597883,1898521758,1931871611,1157871375,500150807,50837000,660659826,115669470,873055072,743470046,1175193132,1644051721,1283237381,710632473,303923583,985810477,705665331,2022359519,1962642119,1616656632,1205372642,401252446,560978408,580896040,986033536,2082893553,1959243660,2024888623,1726332305,1810096483,1468288726,410960779,1823615979,568452203,880119692,891726119,347867000,286071695,2016623870,293271450,911650305,935277753,1768982810,1666301668,530613003,452700040,1689265268,1576216361,1606970531,425979755,259628166,2007035586,916743042,537879852,1256536327,47410738,115728286,567951189,1859144589,1206493296,742991405,415297350,1813515871,1322279905,1147673842,2008292092,787482209,1048430709,627820091,979288347,669204021,1906807244,1813498988,484852177,1627573798,631496411,1502651342,1303590508,607115060,1086606081,464857994,1802130515,1177748868,436521165,1715894833,662984545,1917600009,4805149,1681151125,1058345135,2094107650,1573245490,36998958,428403095,234369892,1133991738,430640409,1994371273,1903499157,1195733970,1941577950,1410218878,804559296,1560783840,1025541578,2125616962,1315404367,102648151,1865166729,1398337942,2098576356,350791552,413797627,1160964590,246368452,1013576756,1602261670,1167092017,588248016,1932102143,1219037570,1478265760,959474204,98723614,419646170,1625277663,1939680372,642221520,1981998729,319584032,1183696998,527976818,589224438,1467510448,1077242566,1304920442,838605991,316107056,384592141,2033197467,1510490819,852230093,263259474,802744921,633840815,1540543359,1552845882,1888243229,1736685395,1742684670,585405708,1339953095,1197160545,768643156,1732992873,1095310771,1050531400,1386092220,341011782,1088251783,2017181633,867249601,1611778678,1988035407,1356093389,2058724501,217061298,962936089,1569296244,506235694,167750239,1721182925,1965029769,1011646607,1087477339,1860298403,999085786,1542479520,290211819,262554684,1454041730,741660845,1002327848,1747245636,1569171042,1479804127,961544130,879789212,292801801,1848736177,1117430523,1943252533,796604370,471632710,1913044233,15516436,749541504,1208370452,1842230905,1275704385,389279024,182304890,1201457901,542897918,163169339,1251189124,902421814,953733906,645529785,832100174,921529310,694464135,1881530404,1964994408,15637563,1024328526,661933911,1218313463,68591698,1370755809,859209782,552444876,1488900121,470407209,112844883,1635467260,1481810602,83625629,1750597537,1654784352,1544624901,1946522156,331239846,1228214344,918736540,275126693,1758352600,1846833148,1518291740,1007222294,1313082380,1422948073,1506868426,1306574075,1035737769,1513430348,2102325665,2116157955,942751345,1898381166,39467188,1825632817,2067543371,1723392055,156662647,679043810,1568424103,905884187,970432945,473725814,1499726135,2011858273,540464925,1670751379,164791207,2084934537,1851328576,2031242080,535375034,1720312128,1121346595,1257105255,567547237,492395121,1089178230,2085308224,1621559657,350335312,1729591117,1315682969,187743861,1454170037,1550676637,833839684,1060561989,1824535475,1015297863,1542950795,1994516457,680136221,1981057803,727244168,1423431793,2010111610,1522615186,1085978029,1203783792,1206248752,1452353961,1582310972,1187080557,139057690,1245559791,1413600733,330185267,1740840052,839351722,2013337789,864461946,1139600204,211808008,73896852,180348873,113763339,1324162617,1292805464,1175062072,1267044598,2105462664,376304759,248297320,11324843,182130454,1334541308,1037960440,1947479730,2064830895,1088265144,1581209557,552534419,817449448,421630182,2047393398,390796681,131515157,1278509366,1822144335,770314312,813401956,1087560419,504073450,1482716161,159641597,976175736,693071759,1325380625,1796959271,666947326,133893024,2094420129,1630742774,1483656904,449745673,1759110364,1442264410,1687488442,378251865,2058109694,1747077744,131391707,1808495051,837865053,489522848,680489917,696845028,1933828311,1342558900,319302731,1547621186,1527306738,668187241,2101895630,1935562081,1484366016,1554148139,1834194300,735647384,1891445683,1824275522,1792237908,1466265823,756039467,208032384,1469047395,1630468651,1689579204,609123460,1667674060,2126199983,1862246472,1173459972,218873947,954600815,995827389,3040582,758989811,408605432,2007360857,806622105,1959033338,57425113,362654610,1939781598,1851056723,817816453,1211559330,1660334435,333557650,2067382661,848424291,1205553124,1434829357,164667921,310112485,1780197457,1813486854,314672311,1496049047,1211962216,637333675,1031843268,523539347,1451436207,273943613,2045777710,363316102,522919593,2096684555,213341309,1826984401,356572210,487913763,69143977,853492728,1326870775,1383730075,1294283401,1968447371,205423893,1309015482,1323170740,1120659421,1212911723,1325861323,1652426030,1165735325,562334942,1077904372,651925475,2115149858,1882478873,927576228,742406776,1588595639,1206269361,1976440955,694069761,1006819046,1017014598,1778992779,1345956266,2061996104,2116854159,205571145,1264171261,302426099,705894247,1645631484,1842971943,448589544,1916356359,1096830760,1892939072,847222441,322962615,1445542761,2061728268,548907629,277776401,227189317,1611925771,1899238182,635721289,1357718235,369109698,61191208,1679015896,1758111219,230830262,723092631,1653722808,31078177,653968482,912582860,249444139,227954814,584826852,1558966046,1826617854,1089749282,1173619038,1229786058,576233561,770404296,250745136,826538263,1822994588,205036425,754631756,56065677,1491504933,2057090631,9506130,1485936480,1473446934,169188094,1612994494,520384718,543237670,316314541,681592073,1587840521,572414593,558586515,1349234151,1793133759,705729940,1906267281,569151412,430960070,1353482346,1350817079,5470757,1002858713,1387959439,210486883,566563287,932948095,949372639,1160181520,1049846751,1376730059,918647359,815671609,500653582,10203609,106027776,1533151978,1426183435,273640730,819081968,1515409375,2024018265,1032438903,1825326379,987569284,1037985611,781294293,392623095,1521903237,1099958847,132376509,1015875313,2020612508,214972342,548926062,595315379,1260170663,100978121,1743087594,2118636824,2032287462,1619135017,145920236,1483259072,1934166028,1038578620,1878275351,92545790,1007029211,1764657911,255347869,1159345198,1818698358,1415545265,438159354,1473668245,115621675,851891243,1945775766,510966325,695443879,850428060,2031448932,1381259388,1075890013,1354690444,1817636108,1000356524,1951291919,11849724,1542072473,1130867057,724469469,1667684238,229035641,257259901,952220059,1270279069,2001510650,537286443,1964418842,1930103394,1492016186,30373630,1945695385,1198986593,1157236461,1703364199,372197743,723004193,503165382,1114987142,1574352210,145966390,161066723,757857066,1739582180,1661384358,1861807047,1990233745,980434547,684612774,1148464162,1813285497,1027867711,737394685,575510409,1463517249,1789186531,845793178,763999277,1205594129,116074670,1097844239,1298649462,1394399219,709944453,1014288110,1038920262,788513203,1672333594,686948337,349336259,649399759,926252785,603055600,1335164094,1498551937,1472292880,1179609794,1794496207,1427312780,695459268,615227350,115823882,898857670,1148220839,87399528,1409573787,523531240,1376587541,2072399130,1692394387,264963698,1484422376,2084798738,156049574,244716404,1903746682,1551788416,2087175254,827700017,2110495751,1606825829,420859007,28137857,1778798383,1812818418,504818659,1824120820,84170348,1184419261,601986270,1396485694,1586324798,2112728188,752729252,1094918764,112574964,326308733,1393859050,837274242,653119677,1424600461,1417064955,1995470468,1064016431,1674011721,2042913241,380228673,62641724,1756748037,180120316,1155998522,27028957,1140713654,1388002862,1152824418,762084474,1297743833,146592133,1447165837,1667073295,964347772,1989640156,1994672646,1463963246,1357234158,1024840177,959536610,557101437,1567987644,1488727678,1979966113,783432823,1192170442,1520366195,1260088902,510342581,1304303508,1202985156,139199947,588571299,432503292,1124286563,780855363,2052095371,2117064275,1015000888,1541958020,654998219,1517543672,1373434539,1100865185,1024084670,1748875171,2197046,1688991267,272212045,1954799104,2038879733,1391088865,1391399077,1079729143,1426399160,400120238,1683665061,2098187175,165863489,718042853,2030329860,2118530976,1607897166,616790293,869289938,381587196,710339200,1337149234,1442557758,516065893,290033338,1676837865,573253966,567463769,523927838,2021899554,1967959329,1711791936,1336285922,309973262,1336609582,557646987,1267455769,425386526,371297113,1040441046,688238845,874304454,1332088192,334687123,793636349,45061863,1298784069,1527748006,291077046,1619672498,2119834168,148055845,330399498,246719815,985454589,1511761165,1313154180,1664280482,607216794,640404593,1025739885,1673834322,1243188298,857916985,1554536530,1323825121,1574604355,1693591187,1013744234,1356883343,137677178,386868706,888896019,121311397,84864857,941134259,2026872606,656256472,747501608,1933489822,1328033320,741204265,1608957424,1159003207,410194491,678951534,31966845,1337217208,71644526,496874398,1504908387,942335363,1255931897,186169539,1599134362,2006352409,1603870653,1426031279,1628224347,2061593184,1095765721,1053690963,1952884282,1341397656,1014204899,1522157598,690904655,842029196,1426031873,393248590,132428406,758317405,652187146,1471079991,1635806892,1390337598,1036657936,1751958772,1745601292,573620498,1096377248,1879714230,338432649,2055826731,160958651,1444222213,98796835,1899958303,977675676,1098213742,1224035159,156469390,80497355,1834417628,2082024145,1869522012,43169015,2025945405,273149271,1658777513,97720096,1528075317,541448001,123817772,380996552,689138458,508885986,545198371,1246838993,611598379,440977984,1469578967,1590488645,1575895964,1294512747,1902184686,1479526019,364945767,1957116382,69851333,1207937843,1326753309,1506304532,527254426,169773630,1636585703,1928147272,1036685110,748475241,507673141,1120860477,277904943,1877028705,789286957,1041729075,2066494411,1670285459,1981975290,1263100007,2092060634,119118337,1044193428,467543133,1184274149,249518664,950989248,593025690,155590774,668823104,934802458,352475264,1056026734,1114889488,822414566,1362422465,641795772,979653003,1595189611,1971628991,2100632777,1264871035,1972594461,2083501476,1065590938,524125436,1190969076,400336188,507977211,1956112573,387685907,1429831324,1976948202,1061308684,1631312612,1114262460,327568594,859105461,257645304,1296689808,152041144,734371623,1490537960,846633511,1599979355,1426808302,148852302,839325258,2126235681,526710466,565504243,915820666,1629762996,181675260,655720705,1795923997,1775170134,1752083544,1561411168,1361640598,822924946,1216923245,1174087343,1127505965,1762584234,1264288172,314104383,1161846627,757386337,855416022,1451216529,1155816789,1268117828,367200052,330418010,1325333415,253098796,779358505,968729411,882310839,1443108821,1473918338,1725260968,1108895949,470375882,1675488481,731315720,2084316941,1522405017,896442902,2014802118,1660157431,1189008806,851772607,981853897,683299904,1477221712,13656285,78422257,1178051743,974322402,1031019615,2012477754,2110644190,155256619,1540512146,1018171276,211505419,1124807863,1373098826,564454435,2084267888,370706303,873511521,841314114,1693119702,1657588616,1770995065,32575403,153056191,1833212270,877346637,831234146,1683053543,298056632,119960984,2072236219,416315434,263618996,1012393864,1718524106,601097531,1271106034,1388827016,903685626,1803988190,1104177965,1874299839,1252809701,938501786,661333767,540971061,1087273637,1203266333,1200355843,1539889538,180965247,940514645,1502462903,633243302,246988740,1755795271,627648406,1341900156,31878417,757919547,1497430688,715014369,210952366,961845898,599944419,1318318552,1003661060,1651013346,1999861250,974002481,1094329746,1094730874,63137373,1458383380,1603414068,1193578004,1341553248,29752085,1589107894,1245562419,1912229549,1037262490,784159661,1033653956,2058131985,945212947,713929087,1909011274,2007634353,1432570297,242703692,5891654,776970907,1417738632,2037497318,551361068,1387204479,1822816503,1481112007,1684130959,826802162,1018095555,1270672860,1141260878,611127221,811751537,499247018,1488987120,644092632,541497996,1527330409,1258480272,678855752,650705043,1531057212,517049014,371802244,520749001,375704543,1401662921,1215918009,1039139895,66690215,1839983921,1866953427,1922884030,446058775,1030378462,706582326,2004543830,247880153,1889410954,115607300,659100680,460051830,553085060,1226086681,1915004230,1075337432,925677802,2063073003,1835201610,1276059979,1878703665,215027408,1042530234,1370714691,1899166015,185459639,367087299,750335780,339279989,1261530490,1721943454,972111547,1974450789,2085093606,413602784,1338875174,492995823,439433999,2089438084,2108646874,1929894215,726851058,548199060,1119502705,1107545715,591543752,1590484341,61565308,1396928706,536865576,1611976789,2005857956,1989396629,1384003677,973905647,230721802,1049404015,88309777,596209652,700845687,754647589,1205962864,1987939423,1840328894,1425064000,1050390901,1074758374,1794411391,1410799512,459131411,1990505075,1323740150,220462297,64237025,818611019,1462752419,35541299,479016668,19916663,754420961,683032776,1833490408,1735603535,957438221,1205394044,1596938879,94299115,1557575202,270430093,1500207429,224566580,1717949443,1421819436,2076806546,1509309652,1258692966,1210347570,1212896693,1415962366,435477538,1493358557,832794539,87588062,1011777126,1302378510,1446989405,1509980735,1273257046,1794971605,1809464495,1881999891,1535130470,1553892119,701007220,99744079,609850174,1891489703,729215109,1985962051,1182722181,1570850720,159502551,1177697602,243613919,1232644281,457964151,1116229857,309013885,1706695132,218563446,2045025354,1301179046,249919341,871047298,1328982576,1173497976,1093232886,1220133819,2027451065,1196514212,1527359092,578631598,1780927233,951443641,1618674282,396898305,212907288,1152350030,1083740870,494817471,2062780533,1111469582,665904152,748749873,1874390949,2013648685,1234396285,1856240094,782094028,338229331,1403079508,2121814737,380814240,378186188,1518687864,1987471345,620891760,1466723681,1024937901,1712650097,260075941,1051646884,124064028,190235306,595775892,1042577391,1430410133,1815082029,988583241,348031200,1562036878,2055092689,891924899,63294719,459976598,825621718,454685512,235637877,775365671,1817831953,2124388843,357070673,1175124502,380596173,403540956,521394483,1683588138,691238692,2040977545,705505481,1861392448,41142760,1438906716,1302110758,182363777,265105299,976866020,1384097568,190934472,126063415,1029633998,635835936,128362753,1239041781,1020953767,756598698,1508715349,392762440,1741576019,1021241045,1781565824,76712195,284738916,1706264080,448226586,196452771,863448316,1706134743,840432665,1440673537,170988280,1830270104,558061643,1036057466,977904336,871797793,11394531,1284238031,701502892,1541550674,317861640,1199576460,1128850071,1622774683,1908698128,864296025,1120831530,771727806,151979405,309006317,171795507,318017314,1942734525,1475670071,19314276,417430671,2091967722,1861658707,678533134,1942950979,1905197020,1014836814,2014595486,516721571,1033018808,6928694,237112053,436950842,1874464699,1745936253,1331479906,1184199201,806919999,1315339895,1344312026,1294401357,30691318,1882215845,329605463,664709494,1954928636,571871802,1154329902,1843513221,405839870,1408875936,904920167,621773136,1429356796,1481088238,1000521860,596092064,130411042,2110707401,1665488166,1004540083,57084742,1690876299,156545652,1551328165,186496952,799095582,1874833664,1786494697,697947654,1063276443,248070937,1033679556,204775588,1580725894,326457178,574826145,1134975318,1754460297,1175940315,1829417155,534309843,1908232718,876228783,984295976,1949171409,854301395,922258309,733723220,993134280,1086898926,445634146,1521923488,983037963,235642264,298705892,737526312,145273054,998025944,474635361,205624945,1289341340,1908649730,220431060,1387748911,1103618920,1864401183,1518056063,486773154,549284812,2043498358,1291547757,1029768935,629013049,689872336,755658589,1773971894,749968530,689511278,2125293768,1261789032,2103143324,941930544,1854334063,1404582119,464361501,1273167291,1269110498,1263978306,1884745534,1648168858,1848847284,1964272742,727587472,1905973929,464456201,2024397747,536103334,1196388855,1370198573,1702544795,419955065,982572671,187385284,1731453250,605463517,1506838495,1186848834,709058336,473310294,211217,1435540145,2045314124,828335634,1890412129,1396711326,358289014,531616721,1243047852,183381504,1835385553,1897586719,2054963282,37117861,1292441439,1775927291,1839993339,616410570,769842189,1451381547,1042756269,441639275,1940765405,1222889885,76559003,360427121,623402609,2087291151,1905677179,562563020,1066332163,784439650,958608828,606871582,1420937577,1639957965,574282350,1498760391,1220536012,254873144,1683008600,1806570197,479114718,1687362496,1954685180,218491026,765390092,934442886,561887091,1754720354,2071259494,86648030,58507907,1720256956,652352891,383625255,209602809,1760031513,735176982,249846207,275392630,764588645,1423799632,1294871271,1375839470,2080548128,1807314525,512765849,1843179549,129006134,1529816398,1760043632,1964009759,1064433349,1621702087,1412137466,1596341277,1581312050,114492129,1636876786,400964085,1163285845,2021524249,761458216,1161574116,1506607774,1802516802,1971276726,91109438,63116465,1916164905,203660648,1841821766,298602572,1139125081,512732524,1740606024,235386624,1462575662,478652101,969549146,619879961,1940108517,1389363900,2114416883,1033542737,1662384679,1607011528,1745782381,933940645,1088706049,728384879,1696177509,1936429702,558086416,1736142444,138119256,199028776,98491941,1994494005,1383919717,809602691,349821545,2103436942,1240054761,1025018870,35621864,1185574176,1676850145,1921691335,1071316581,195056011,1136283148,46501096,654848374,1831017802,1174762221,1692281143,1186585713,485437197,462565423,1829557455,826163397,1340948511,1368935384,1932961092,432311824,1143050851,30144713,1770335496,230571436,1865007123,78951465,223079342,797637011,854045844,1451086099,678833208,154088978,1951388552,1773703246,1265950251,1709828909,1792912419,186723681,1881807853,264736494,108597294,1858931830,1530438175,122767946,1443815854,1166714006,2003524956,1882450448,1219848060,839711049,12848199,1756855181,1762850197,639192604,177701080,776175947,887444249,492431282,19405972,1042308694,871760913,1735349103,232210070,729889024,1742711564,273774209,799811058,1748041449,907326828,2100152755,950068907,1790363943,78482580,562254666,841663800,167466419,1067822732,622247672,1318200384,1985971354,1713127714,399716822,1332546093,1842025906,1312364613,1914554409,1977700438,197549123,1291259715,392655077,1183004892,1370915494,350485856,160608865,1066799245,1293107019,670050982,556982752,30548335,2037740275,798541479,164542902,922239537,680865034,1592110733,298281558,1892608447,2045045611,877649876,1596527456,1104072351,1672374029,1937735071,945218443,1310895907,1884405510,969450940,426839492,1838863918,2002581927,1823740732,248818946,1654854317,475580560,2072413024,917283333,462151332,549341602,880931479,1582418298,578749003,1174157670,272293236,1988703418,1052713114,969281932,2097298755,1784518938,633060675,473766793,1884661314,592371469,1882791218,1920353075,1113328805,1130806175,1389055404,1001865163,622888043,721057936,644219239,964725332,722767312,1905257777,588715092,431860196,1317712875,512837984,1680716933,1533222774,1861810545,119481999,1025374067,2000373722,1873032755,1116650403,1109223444,827076729,46398815,1115137538,1652592301,1349390918,370991941,142314491,858222388,2022250336,1860275280,1290503860,1706070197,1324429531,1993695583,1293401809,1705777580,1697251096,1730179071,713285077,335496380,594897544,878181724,2092868356,619149089,2127717343,195576197,1917292833,1727522873,1819760341,860472942,141433279,730785671,1599214819,725793919,1533954184,451090124,1162657564,214669027,189346611,1751849963,1039368182,269796409,1907741786,1946852973,606926254,1141005381,1999121991,147988521,999763508,1436439255,1047267268,330253128,573877091,993348674,2064297977,199858780,1956553904,1770181946,1769668219,1021335601,379366293,505254324,1196919303,1029028634,391096497,1282065712,1547655731,1703256511,657826297,17458345,1907326257,277073421,129494016,1199382034,165073480,467597777,561064886,114436947,1225945548,263785669,1263225640,227939355,813220482,1458898879,28423249,1119526539,1135916441,1184741795,76570445,1720619783,1347364985,1711068262,2068880970,1817417003,1372181799,1574267592,21403796,1527315044,1256876026,1956326525,1968890488,1734561446,1079378048,1523821109,589952191,994745060,2060720169,225189866,9265223,1884666050,982368728,1534072283,424465696,1928400507,1376770512,1392005719,668587620,1770904261,1811899886,412587372,898758968,1729073106,529548101,175446566,1901482012,1377042919,1176238558,391880994,1348474293,87354085,2037098297,1433931043,497018149,124699596,1184155649,2032690705,289752001,1898418951,2121881239,105463519,581777604,267292934,1863291628,154205315,2096862322,1988489314,78155654,317125428,1570471958,641623908,1120001842,502495236,631690153,551063140,1104899859,1746722774,1196329545,1329427322,1936165202,1090239890,577956821,1706840399,1428919363,1418139423,2105658043,529941659,510675091,135704453,773526295,19130760,330585754,295822169,301703562,19772891,153086535,717071735,1884251632,496239648,1588668853,1797658231,1374171964,1882640377,317560433,1187739222,584250840,1005020494,1565488742,1310506945,459726568,848412492,850166823,1880897381,532465890,283077203,1379246558,1494883801,382927277,465763871,1026384249,1213640608,503755113,465603982,222143423,401006776,836637697,1358597786,837669277,630281190,1832963880,1520762977,312241746,1997017526,884337183,311885665,374360748,1384546509,447410378,1831061821,1325803194,1537987260,310487072,1699974969,1808054766,137884022,521405695,515333426,180517113,2101658286,520764374,803605968,1151653919,1528936069,1392116855,477363543,202570943,56201168,886723994,985526680,535889683,1492934089,1388539156,1972916314,962160134,580032775,621834263,1171054354,1801656327,1741482969,1329858058,1666456503,1202474010,1168437940,48268195,428062724,1346115215,1232849031,960552752,792077481,1288286957,817832003,1385537984,161039985,275221286,987260033,1871220635,1044537222,2073692889,276339500,625650158,1213143204,398036021,507852509,662907283,490544767,1578318129,1308984518,173115274,863138988,841666922,1011681422,738032681,1221449528,651755719,969390128,691946306,1070697781,1033986464,1388884755,1229963763,750666316,1846590384,1755720969,990639584,966341570,563515599,702597813,414807419,1399065124,520583756,130963628,1164004874,1480734617,162387336,2052700600,1307955571,1638453158,1346266257,1518054532,692967026,2047673739,563256992,1817600887,1773663260,1289394006,301760576,1179712728,1809887767,1920337632,700070600,1968533396,1691373723,1377629269,270178655,1297330726,1605005872,1379790605,648510310,784268346,1395989044,263354641,1853251795,4562473,1615279671,697115427,221645494,1880722618,1393712393,927791986,441859991,2116316346,1232439952,1112893687,1985702690,1646035676,556978619,1279182732,1117340492,329559892,656300267,331293832,2069094070,592014002,1952143136,1223819860,532761734,393875794,1207542522,2009723120,1191598698,1720401776,363980123,1908784279,2047442480,152613045,306489990,1879539852,1382505413,969769808,838320229,842966494,936986500,1022512839,2024528375,1382500663,1194369664,994590609,778292422,1325096374,862376892,823360616,1761181279,1710774222,1951346902,1739913311,834339715,1855939622,854429119,413007861,1751618911,1019359260,507700931,1524102127,931963875,546452458,1151489096,1855499565,1293322315,709078994,854854625,111668294,1580820828,1754014433,611605135,1881629543,1985569339,1004794672,1689678705,1479925287,2076228619,1115933720,1847144363,1339868735,1930239223,703630152,936842746,498962615,164590004,1340708496,1466012934,952866271,602414454,1320343004,683233187,17672685,1513188494,1087790153,884101469,380246090,1033067671,1580834022,405920545,1848571390,755967782,26590201,596608870,1360556198,1730859537,781071967,1430683316,1990324578,1407689094,692426216,1066676048,1369277805,1716723717,29228680,1064810109,2130040007,832914489,626290381,276384033,1423387769,411844642,914373741,1780634875,1429050809,627596616,650042014,64279247,1287818088,1126933110,1398810996,277790300,569519652,291183458,1473318659,1232650378,474358372,1223730533,1677566530,155844710,347158985,751723681,1631049502,1733564417,1414574149,813539872,2114050142,691830220,1216787510,574411039,1090306141,1208108691,922596162,472348406,623218736,1003879982,169746839,2084763987,1458957070,1877896575,1198109413,620880349,100890719,40583749,1407888380,1241738289,968094348,2008699237,1173007300,233998894,442867756,196302238,1178602660,677862102,2039425414,710299831,1943052013,1983747326,408314925,1044333749,1252442390,923640295,1219581944,218423226,1885882308,1813529043,335978024,1599866975,2049795498,595829520,1752181346,610086910,1039288446,275730133,1001002185,30546500,796949333,2074521068,578490543,842560056,1691933247,994126827,695651017,1865700490,75194643,890613635,1270807932,1093556618,44108568,1384159718,1803358285,289207240,816027640,1450454755,1312410876,833260126,632981091,620212259,1813163657,1238157014,1303913201,882654929,520811737,1304254440,2000869377,1215529167,1388719305,545438680,110073331,1596478385,426632470,1944643237,288396466,842094932,1129413457,1882725678,879278092,318571139,719179009,126891813,257353310,1279904216,1544635078,172641368,844676776,1654749592,1479301763,40096344,1469816373,1733042694,176978286,959588622,1868806229,924683132,1246178334,85336427,2091230206,705635502,1770044265,1959340487,613826967,390805715,1297061403,1352051283,1224606944,1345193656,1106567725,344197325,2120132596,2055255918,1080163955,1549782887,372710901,1405833644,270934639,1806416770,1696626107,992688709,568253569,160356118,1405640302,2120274158,2043774554,678908643,307466903,1422887174,587794253,1013321563,1966884539,1699453137,1155144528,1034467792,302820723,1772748901,1166669773,1030080371,400821725,2086372813,1406835227,1749760945,1310125197,1801911465,8033755,578322014,761882928,355415010,1058876364,384789209,499933092,620844368,814551447,2051528979,1162877792,1776308841,959829477,56159748,124248024,854838386,1291121408,1023711870,1126785162,96157180,1734926473,719993831,1703278951,103308440,274478674,1344276348,2020318236,1266859066,1347415963,563044823,498172870,1862739379,1492066335,1711359311,1368525205,810503134,618874834,921711550,1729182569,657108950,531290116,1624833150,3727282,2084707692,687155684,1811375615,369520298,544179501,579161038,1194324517,441253293,126359603,1983578472,1339928773,743467110,349631208,466797438,52593204,394144401,490999836,1994673190,1648920199,651060739,532543959,981006545,1726983768,438476740,1780434275,201553182,710707140,796053158,1588952877,917695853,200983589,1754379912,2106015844,1806523180,828738892,1279104560,190173596,1932741306,254823560,1616166750,1264284883,182525910,590676522,1088665678,250214680,1959240878,2063949183,1574134383,978607975,243447228,1552744994,1267063314,1005435002,2087029955,727746352,977323886,851146214,1348856676,1871818170,745285150,1582850725,2026703935,1310959480,1096457103,1446161056,1332883640,2129183014,28492824,2839340,502998497,16380382,139832591,720881771,241265940,637513365,343277001,1256587044,300978158,249126863,1811347704,1378552036,724578438,1721417183,95967779,1350194387,1922117564,297774691,214404387,1361448334,1411710917,1823683709,259386744,1006113771,866259971,452419873,1033789568,649897628,1508912949,740280849,113087357,134440562,43977660,202090491,831691224,1039609247,1988590533,495680737,1993147314,1067565941,2116768976,1785388339,364064827,933396616,867423464,1257375006,1357369729,1117450389,597647841,1337448866,1846981105,780685599,762317980,1430799831,62978887,428736833,1076781514,885241866,1710450801,109884588,931353987,1115286623,516559661,1466385743,1179863479,1998200097,1360050201,236473704,819398632,2094751471,1618274497,628660494,373469760,484608720,673646673,381981778,1050235836,1032414560,896589695,25290271,1240244841,557186502,1386832645,971317842,1256206407,1921668779,1991739093,723596832,1591735922,275894915,1065127963,564503058,769974403,120980300,2037581825,215919351,1529244823,1416054218,1028498146,1992846707,1574103917,167339801,1818597958,1700342238,2045385798,538682789,141539512,245848568,274748959,569767920,549417238,570455644,2062132804,401206342,1036262769,1029641946,704647925,311484018,1794500570,231484109,646980657,847594697,1286557846,1283724138,526994622,24850186,1406877400,967539050,150393014,104802232,171400938,1739813920,296898149,453571178,1075018457,614339215,1804257039,2011376282,609863944,82502059,144272460,1208530897,244825563,345545448,499952650,1446360543,1995523257,1320715992,321493239,882053486,66174613,653257202,995251341,1441286912,362947888,1638836161,742567680,1572227263,1263600286,463641823,1671126384,1887062103,1908644716,1669586957,1291878634,927617988,977363792,1701267112,420849306,55443959,2073636817,1580222385,1897353017,1479406720,644347738,912528095,1029443586,934858994,667831223,802366563,371807056,527399265,1250418059,861085425,600074712,496781640,25699813,1631723352,1873650355,511691345,214386291,2130176381,1260219766,1662509698,249421543,431524616,2010879670,1092985465,830416557,797591903,669854282,460896362,251578592,1278566982,257530831,2111132446,707776982,2081722819,1701975532,1990731630,1721967801,1959501274,1210146746,848501147,785546309,135244252,1638285830,1296951196,990168875,1077655684,1946562849,168250809,1718442910,593948632,515935719,202107759,1403744294,1939706494,906780075,11584818,1658651386,304940233,1073129636,1200587651,1172428540,1113072511,77469041,1683949194,46713646,2113512809,1220704427,996653540,1115271079,1758705466,1594685057,1587372479,1734140388,655427566,1613088662,2075605540,1884065235,788019950,504470239,1068458975,293766228,265985914,863681497,537602654,823909106,309688776,980719679,1331554065,1475204849,1938314709,150641284,1537669316,1425710245,1350713934,677394071,70404903,855390694,388267430,459011392,450975944,59132067,339931615,1332447517,465122612,1564275110,29795407,1354949463,252135887,1209591903,1271333962,1187522956,766259090,1639656229,1333536426,837669483,549491892,390524766,1658805593,1980240586,136315975,1634060618,169609202,483291234,1463704874,655214495,1976410050,1723604674,1833601580,974087342,1582431685,831825111,458414615,483954405,1520545684,478897342,994914198,1235664571,1302581793,651309971,1938790165,1884279680,1543153735,343069270,1307141019,87115934,2070015991,622841275,1214891804,684183777,1704475897,1973570079,1142254461,1834788677,518669137,753450315,658983301,1805763229,1075178321,649218912,567336512,1645825850,2074401585,311289630,3715370,246270235,1372959968,1679895851,2029705396,390022170,1774290189,560499272,504516940,1675761105,1110092049,1148443735,765129769,58676630,1785631612,235730602,1993964855,690588322,1226299585,916093521,1656144649,1935182237,221570372,1834278560,1256743138,1280274107,1486187660,1069079490,1617748998,1123991611,516274946,199163802,1800218009,1575244574,1852687725,540092607,117370121,884215247,1075101436,1013336463,1664430542,1616105229,302705954,238770462,2071316871,1213306399,231172285,406675920,1411131851,1117089954,2059899549,433653493,1948735246,1470695040,839621901,238204012,102379923,1744835917,24642399,671829912,1395012317,1985121140,742823139,1555127764,1819584821,1523673564,2063323129,138777905,1071705275,1327952802,464956125,494648406,1928618930,1077373403,2010694530,978384450,1217190555,120076131,962265409,1806137255,382222893,1144256260,1339837035,521144601,787232300,32406021,102355223,262918992,1968010283,129356133,169576895,1374566753,562814053,1001110466,1520573545,1618608163,1325608607,1264754572,2030526709,728644357,460842397,683277448,946636794,870194140,1967847105,1201258242,1090287802,366295021,1885689249,1004186743,1508989684,589107682,1980112524,602438207,749814782,782420470,1508789811,66767211,319372544,192047557,420714639,1761148037,1629778800,315083041,1288925747,977258085,941992901,81228039,1936665649,1328494740,189490028,116093340,1875799293,1463320285,1631900492,1624355317,608451616,614362216,2078383953,597755218,1197197984,1638889636,478623441,2008365845,241918686,99977039,2031452509,1779396454,188254526,1122038385,314337318,1002161566,1701886525,1589769346,408832716,1241639548,212101515,1869229998,1963921396,670363514,1880338472,620775417,1230200486,1572189705,1777597852,1732070883,671197089,1101417699,1071523053,1245536616,452423503,933252681,1267631065,1229331248,279326955,1423805604,1237606935,1792781357,385482943,39849870,88441364,780871879,702705190,2105681533,974243124,95796814,1267682557,1827157193,1399722141,404542053,1014894181,179704653,1959468662,96974904,1598736482,761864117,1090617394,1949881520,2047918176,30588032,285942194,377269322,763433135,1806137792,460632743,476721938,101382273,327571909,828702550,2115369893,2050525246,1095604938,224515588,142318355,1719003815,1803899774,2118387514,90254595,2065857878,935503475,1508430255,2052825858,1147840791,2045563183,1974175290,1120406417,499017593,476661267,2034573871,1473548636,1348838655,244210394,776076398,1746773156,569763791,1551987543,1772767542,1723366102,530092366,1049949001,1312363600,1349971926,1400114815,135359500,163502522,1685644609,1125987419,1439569677,1648299366,37582804,1000185274,1900751831,433325280,394324147,920905521,1029564055,720746562,272691857,14610677,962665751,2022991706,1697340816,508787316,1977904533,1185038901,162569107,210809481,1426249799,1705009702,1027180840,1334943059,1249446669,1428888155,1864688223,1312140903,618067331,567513539,940885257,1659149329,585167004,1252961982,1907060996,830770682,309218910,1047205099,597289579,1368675476,2006918986,913402302,1626804215,59718113,1545821857,1402088598,113124569,2057533601,253560564,751115522,648884460,89866672,1074999823,1794352698,739410035,1190569353,1717501135,1455145572,999534796,1790864475,1100526561,2109031656,914065793,660774513,750084539,1560064074,248558030,276701610,1066570830,1876050681,286304813,1887785187,663984749,179950356,1182653960,1914640668,1777431838,1540157106,1211603859,1683362821,1751827161,1731010852,1935105315,1183931101,1940018445,1920765872,1457207070,2006280970,1447145100,1052667618,1722436538,2078698479,1952227358,1994475913,402922589,1519446092,1167312553,1502505748,548777689,1641659342,1410580989,1256972739,1153005141,1979052575,1552059961,735806570,2100081502,206828401,1845182573,1461297661,185527808,263166489,282474068,116932109,1707277427,245120026,1488350883,765138186,450785974,1041825210,499439516,92037683,2112943127,633516447,163398169,236741650,541600037,1047686895,1775104190,283797483,773545614,1063703656,206978573,1629497264,2037063145,1048198073,355363356,1817739368,96894992,1439881248,491306781,334488191,761929965,1140725544,984718895,733666664,755261862,206482879,865343308,638693574,742257459,684831329,2125723229,404087428,2047495707,1016099632,1757396481,763534272,1423248376,1858087665,1351960014,722662745,1478479204,850975509,1936273994,1777826438,1389197132,1586797254,1141961598,493002349,306523751,1685097787,1226041448,1716759510,1727863233,1314302135,205284890,481898278,1198124923,965516087,2127742972,1515348485,373524610,687051133,1706800541,950149886,2059824386,69044901,1418043671,646288033,444412322,723136713,385508407,269885229,1669066813,820725546,1344306204,1902455246,893012421,1804461422,1190608628,1578692269,1440144601,1639838496,540184050,2061089351,815671144,1345923061,291268198,60837878,833483814,1140776895,682116241,951938781,1588032705,476905793,657192716,641993404,620481979,325408556,1936686085,2006991642,1381472915,1029786162,98607171,518224927,739695118,1663097550,1585537302,1399355469,422648836,756164927,47625535,17731753,1081975762,1483375658,212764818,1728472068,900617211,2035650894,1384109813,1041321772,466535310,307750633,1124461762,1537375741,165478226,649738795,1126137769,1211842333,1601855988,1444936219,407084107,575225934,420381133,1307396328,272342179,1643996155,531870842,658982843,1329094925,1141467152,1474162114,458781697,128033958,2029870443,900721425,1033468242,415266405,1913494496,1587381577,1792929270,1773510313,1187921385,1590058375,866881368,561109324,1526736536,305749788,86586782,1242375606,35956979,310915351,1032941198,1368912960,1436268178,1948085482,585691817,394376773,997593811,1600103897,1890627055,1959652430,1886038182,801840651,1528324859,397780259,1187110958,1480462537,986699113,2002092505,2024680347,1773336358,623114458,1578174983,209802182,965822718,589240536,1853900138,1435744057,815324512,106954580,1412648777,1778131424,2054994927,668220265,230466509,1640588829,1832848020,615659527,1591214424,688915792,703485446,866905911,450810882,614304325,517479779,652490757,1212970040,543936985,1417737272,1242000959,1161833471,342423622,94536933,1897366648,658757267,239685126,866540990,64849270,955048285,1970816497,1102196704,651389611,1064125552,1631809976,1305144065,431734299,1352123721,350998808,916785412,898109129,736902907,2100677691,780631305,519673120,2005867214,463559805,46062272,1095262884,655064518,1115952417,1987658093,1246264219,107985414,391031264,410889431,272946258,2128486905,1950821835,1120162177,658300669,1184989458,824366154,2052765810,1909503801,88514407,786302723,595402015,139684465,1744377231,272556125,1600695899,1622805371,1213615365,1507153519,1681635432,1897391940,113552157,1411330250,1217251249,916750244,258045591,362065082,1565711304,610068942,136825594,326556342,887925369,474133075,1490935235,1313650964,669478048,175623940,445347849,223012970,493984985,259941978,1986730982,821570326,686416533,840010683,1346216951,1892599009,262303934,1623968988,1239573186,1547676818,1506408032,1232583554,1011075781,641861189,1849288704,1875063899,528075695,1633495827,1305750239,1694054488,2090025438,1424288739,1723402821,1675903584,1151835802,418852856,890088667,1184945787,1280768379,1821310727,546390588,587417013,1481137055,1859512318,721664038,784715172,1707038310,619504835,479280519,856977149,1975560714,1684978693,67265111,931629518,1987517618,1787583131,1733010633,73621153,898654559,620751257,1315550757,1681273476,1578085834,1911348550,43681547,648008014,349577135,788352142,1957442989,1988394220,1589328909,1844138582,1340981252,786270696,325389257,163060094,979676482,1074790573,590597333,1027924850,2064860221,486786551,955428760,317825263,1179826616,1755879078,657071858,548281877,994529573,917126653,1742829971,703068374,370890526,212112816,880291654,630230415,1896731749,1752408579,318606886,88923149,1120278484,2073274615,1988036798,1779106596,314520404,2101083335,767128584,1523189645,848158528,1320729063,209058950,785097547,1414664947,1079881600,445273548,1671040455,27081167,339210592,1194955674,489948537,1621245926,490877814,33840189,571954751,1389862108,1800056005,1320575056,301110815,1298392535,1321774916,914555675,894165516,2120812933,1111722278,728850856,1171754966,1371059317,273170494,281659986,2095949383,700069806,1549088617,1732363617,399423455,927317927,160470244,210538896,547927743,1371719279,1814281721,350767838,472146899,545197114,1806908257,1367158850,1065639077,1899441209,913577365,197129370,803110952,988660963,307867210,452780454,404021650,930619011,1633387431,152982046,1422644615,834208321,1122972270,1069321690,692157068,1988975840,13824231,1181475956,362612884,689610044,676007051,2026825860,1621736568,1308829053,628553775,784313556,1322221803,758343208,1616851558,1069075846,1862618399,1360011173,1077852222,691022562,1895566186,1427634771,125587222,645036261,1157763248,1614644182,1890422472,1530494213,1029038629,1236821604,736909970,253355680,804927453,1925283021,425687140,986131664,86317449,1293836414,1181252650,919377657,1864096163,1914932242,516491882,149778433,1706622596,1428579405,204129439,1358577474,1706898693,115250020,185784470,444391314,779462104,933422578,362114706,754638549,1170743163,1448843749,312736826,631581705,1223140204,410400516,1377225356,1503755160,1399777409,677707824,813019298,168399908,860406789,622546494,853766696,1913245091,366381585,61575427,1151697340,1049492393,1709676786,1365554746,1746465381,1326671906,867750090,863497796,966931160,1233860585,516837834,1702539945,374488432,329628746,1220279387,645920549,1690392524,1508778,741139318,61995791,1526023391,1363285241,715276502,1598668777,535294588,642275777,1446536978,461904322,756797619,328328197,1242335778,745507273,1235964874,585244004,346041016,113474764,1426316109,60992538,702650704,1034719072,975190024,109714902,557064655,714931305,834511174,1264616831,930488206,1041409234,1201740058,1624221304,20541035,319219622,2079564403,326898518,1912120826,824590345,1205848751,1060385403,1994078811,583412485,1303187649,861879369,773812478,1378287292,1112871155,989491545,294136362,1726026350,844595827,272025559,1922622598,1693663480,542089695,1067448145,199880322,1461373698,1659711603,1739975841,387158908,1503856858,1264258910,1719287133,1151000233,1497106234,940310230,1875240338,1626703274,313789013,1966948739,776980791,1072982503,168980845,644540147,2072433087,632758460,563792703,1131359536,1774584111,916363568,1042535714,1060553886,1293072139,2128731033,91680457,1377557809,1589598808,1960489343,209430490,1142685605,445797037,2083671304,188986246,1114778444,1521736537,278284328,38434313,909043546,1801323648,1293818061,818678192,1768980239,480958939,1939117357,1939191166,724238405,897906385,1921407087,1713077870,428934109,459881282,1955671076,1033748762,1860196368,291884395,794634477,1573331649,410564369,1107187661,444665906,2013384967,1302007586,587145435,869055481,943372387,72261402,267092402,79807934,1160475165,254696879,428634575,1987868399,758424367,271415728,90619155,425762995,454695569,1510837334,1045497777,1411630231,483060241,1852601989,1998293622,938342324,545941727,437622021,353850098,1579094939,1968519669,381214969,3059290,128457903,771584350,1680666060,34383860,2041921381,2014335547,100277097,1370908080,830973296,1612193254,1158622787,117307819,1552361660,1780754315,1422924397,367737419,1275738747,868927480,1828630512,614567555,1317154770,1759762104,932722240,918069864,1567252231,2061756222,2058158881,1370584773,35908092,1803691451,881630114,965553793,366699181,227813636,390387158,279869203,217291625,1295509449,611683861,406961765,1455653047,964152195,1511299583,1064717832,170327056,286662736,362755602,1627244995,2100098007,1467966373,735886789,187448918,717985322,1445544881,1495019257,771287232,515163779,364979506,362276274,1196629215,131079752,146914519,492308100,1148733860,1707932606,94986062,2022256012,409859977,821044532,1622302599,1782837538,1435910210,728383032,1214226800,725299160,37574122,451850008,150457034,394836713,1963278497,2099750769,1010910976,365104816,842570303,136284776,154511701,340859520,956013541,909677219,1885797916,1030861608,943613890,1188001270,2074208670,207191710,693964118,973261850,1163236025,2094175732,1575039812,1205381859,534031649,1732135445,1503249743,371050745,1617795960,1781951872,1213389478,1162895591,1339494471,667396766,716783465,1804212353,371194176,1947684849,1409703781,2096978275,1199423200,253838966,1437866361,1345537544,1597753613,899711393,1529088014,1529020810,619562876,1218943426,542163654,872652505,294299011,412307629,686463471,936626064,786006921,2029223679,1070079556,1763922161,688602996,777481613,1925494231,418503738,1683223558,483634704,143463050,364982762,552914288,2052416587,1388554733,454602487,2127640974,134831480,943284269,1075303635,541639183,986823905,13095563,1476942145,187146830,782210982,1157444996,698336446,1126744580,1638362242,1933393337,676072220,305783493,217487822,132620837,275337347,868676323,1740738258,643378550,1212296446,2110879105,708573733,793396726,1622507843,927570458,1511837811,1634347569,1759517332,1361768171,998113928,683338117,276024438,1490933500,1773906187,568057475,1482841945,174009437,990549201,1724518181,1860485972,845517348,614441775,234026957,897570681,905729628,979728472,1864558906,1590792066,1714025895,1731955917,1085228736,1455884558,433396494,1417437533,975198111,1314709092,2113117448,1818783922,1342103444,928519417,279264194,481846315,1697710822,1275654803,618007284,1465664017,2021908088,1497880046,153183583,1477750580,494473080,399818401,320123879,1966779460,685223163,436702828,977718624,78453480,977237481,995450342,1356999363,1128244568,698852950,1117966418,622850117,1411541727,1221207189,757570443,1606010927,1507058763,1058517837,1345651910,1987660152,122578799,309913415,2051397654,1816376762,1301755684,1480077567,1204968363,1629371632,771927498,643378033,1268789580,141259842,1028725605,1203193419,2096893718,276461163,195090005,249149562,632110217,1502421473,970304589,1170009190,887366152,1065099678,1875382699,1262818277,665288112,256827555,1837877333,229897939,2122261872,1761589707,1329611402,1329535705,418235178,383753944,1147837915,961551866,218267375,112712503,1243235782,1461610444,582332184,1608627825,1406300057,395685906,977850511,1515398274,1475978883,1710301036,1224626590,195453640,1578336331,717942602,2022263406,25833932,356301843,504813318,1336270002,637466475,130743225,2096558202,1498666414,941682065,557784717,1807238076,915286091,966676582,1877881370,526840509,1197584967,502469793,1739030929,1897331288,1019647661,930814076,699502583,200239835,215822011,2092683421,1456160351,1927091078,1296361738,895677752,112581353,700034541,993425501,1229467300,1630717544,1587500641,584262611,1892719227,61122901,1633937704,1224390772,1134912521,1131592386,806352493,147434619,1570565358,291249102,1419668015,1564280350,1664383695,1310037102,18113756,1930422993,133582384,1758034528,1506994273,1115893979,1364294345,1000334192,402782331,717404918,946205992,536354102,606292971,1542891730,1366789099,228331803,413210904,1480227695,1486725546,1929166748,1905444137,2035104635,1600011121,2046380599,1128266339,209030330,2089923978,41556455,1091236961,637428953,864729263,797161518,848478065,62160410,137556173,1976181243,826991318,2072021276,672787211,419936919,1056388124,516144093,191950926,220468716,1780345472,1620960320,569015602,758170953,1850579624,1469146049,2055710605,1755232677,1953995572,449898033,29757382,2099272494,1849945088,133640211,1407869216,682889190,1364105465,155918223,2053625751,588915663,1483698597,992185839,784716108,1475400820,171993467,1770050548,1512885910,68018714,2044421193,318320109,457431151,1168129299,690713666,1663914296,1392770637,1466442329,555053259,2027149459,191895116,306883886,749180592,159460994,835984794,2010823791,19696818,904938799,1673374023,1176219048,90269678,1599554167,323157389,2000541773,666324898,493080270,492174772,1635803322,634821667,1874064183,992577101,1769937576,810920940,1833436008,589582354,700377804,2124982002,1763866181,2063922115,220150574,1301259511,657935141,1552370144,588887325,497771620,284237608,1652637525,1461258708,2049719195,1340966801,671235627,220894116,993308260,267817694,390205938,1239467050,1040353949,877238710,402804503,1933785910,1507164867,1772648313,1700911719,1880587158,797275930,1725883825,2070253442,524989982,1105777724,448696577,1490471119,2085502076,16442429,1809578048,128642445,633069248,1630244194,989607098,526667312,808222208,380514812,381635065,395354641,503944523,1864433990,1196025747,574647453,1131672203,471794451,2117148798,1355776426,740111874,1283064403,654260224,603780048,1828307502,88915262,1848338726,263486321,537390821,1356147086,669691545,1613613146,1043003470,1426923485,1012263117,1260442196,1753032521,1262345889,2026457579,1360951696,1524004780,2016308779,1454547708,238344344,1090403889,1093814379,1980026603,1502493738,1508196780,612703769,235264064,2002531546,992507114,452779819,1942065001,341424219,1129061760,2032410081,1936649749,2036230247,1295483672,1782595157,1036846239,675800688,641466576,57359702,273574603,1287868717,1497505759,148268607,1616056767,1168426584,1183001348,862830070,394884872,700846782,1339181592,1790312184,1128832529,127404972,620428996,927170032,1301768473,1577700915,71491986,105816276,892950679,709630840,81249790,1166914552,1184574882,330563542,1680543781,419732081,338026272,205747443,1180662994,568265185,1508383265,754560265,1910782632,1672339783,1609054457,297797502,1060822252,1581188120,1045540957,1117326767,545921900,977823346,551365774,293963893,1861027785,1060135861,1792500213,642739629,2003970090,544935210,655494730,501380960,1913477281,958528711,690336711,1293778482,29683852,1838814683,1366514789,1431705241,1921786583,1399162338,345922210,391983420,1775514686,347234897,1981195746,1308642570,949691985,1053156688,1324709840,379150531,329624799,627657301,1386489197,363171241,1311104883,254209324,543683990,1680068616,1095591253,765020021,1540797371,1763441545,1304987301,920372482,305357965,1547621059,2092158706,1767401230,1337505929,155695492,273054586,1506191716,1603893113,1130906943,1062442799,1800193582,1548586045,1264405537,1619370563,1824209073,1618819486,479849472,49584868,970141008,1430256019,1063190300,834920315,690089127,448887327,1891699367,1317877066,15643830,2091001225,1656353348,485284912,1473228641,187342549,239607287,1733182028,698471473,1316871224,779159859,1120055108,413112146,426718135,1900709872,1037971806,750139673,368673203,1261900581,1141117157,1122231525,200459940,1051592295,1405720825,1481070083,1072862517,1860099033,2073695640,1475184017,1698867629,1701501701,285413093,968456994,1006956599,744747734,1027567949,387123054,594727102,1945911465,660981559,1013678,297353407,1778907133,1933147606,1932484797,1456813079,57481114,8698703,1814312813,1046973118,1257576601,1545640659,735247993,1959487580,1787658460,1978553516,1948399725,1162334730,1985232133,1608291254,1712439269,1229006571,593271094,129459695,582010625,1019992463,1263429274,449159952,1984128782,707377896,1001446083,1097460446,1420925247,66916425,1081866360,594462203,1419780285,1030119635,87143757,779091290,1124681499,338443510,1645884600,229349666,1224014499,1707144914,15722298,69132611,1152394730,1044120099,597010653,356618764,254111550,949988544,2037893753,637625001,1459309729,250226153,1053705814,115878537,684210706,408283232,805861532,717856187,275074483,1845336665,146721568,605249384,1968171460,1545034471,909034537,1563554240,2129325783,649472828,2034427397,305704357,1593203031,1692337601,284462806,2053947076,519105825,333246583,1281030870,524209678,249375628,2007483557,1864095037,2012574865,827936919,859032032,967214264,1064236851,1481683758,1358643514,1573915547,157894441,2080723123,149098744,1098635933,1794841189,1659061601,2103993851,1895519231,1814829725,857709933,1168392467,1094557419,1963955537,1662817672,522038731,1195507718,867100891,1854691564,983037231,40253538,109715886,2024724104,1431037353,2094355415,1725186087,1121216878,2072867291,1539084064,1114316558,1574777872,1000351832,26393510,1030545051,469548484,1519251346,1663793358,599704857,1893478355,1836258546,150266837,1572271586,1380354212,1185123217,242826580,1926573928,1141077085,1827867510,961691877,1445168924,939408243,1523151612,1692569387,1755841376,663946634,1816295300,54078779,937689030,1478307797,247453639,1014303138,551087937,333065939,565508051,1399436706,267069409,89399777,1438117682,1548508132,1074888719,442376910,1621482190,1950896974,2069139858,902859576,1133455959,136467542,1660420342,208619518,1658217443,173133957,625328421,1200503131,264694211,22275618,1293017488,1278876158,1424697485,33497579,1934527681,1486007860,1068966859,836561371,906748129,1645064228,1181915602,1800569000,942272699,1158709261,838934661,789908430,210638585,1063205729,1951662812,1925791712,1768115892,1634544981,1101351347,1014388287,582616555,2031390896,1101025092,1702821350,203178414,271910179,2114016702,495753319,1626350259,506452887,1864138541,647669394,628109311,666568305,763971676,1848604416,914821659,1406254226,1010374774,322617790,1465075201,32543957,1294757184,1153718421,1988821749,572069203,1075101922,1703573141,1153650310,1621147977,1149012820,1261692763,197746711,1719123021,1995511766,1946718745,1877375175,1195704712,92487715,1959745785,1212747096,624525702,1808039782,701155162,1947925788,1263421233,145553378,466773622,662229307,804392366,1642170804,470514722,416204793,421955361,811309045,286024258,970512522,2032073631,2072093028,1977264318,1135750136,1499391694,1050768672,2007550726,166341353,1996207566,994510685,439062241,74987715,1109296279,822724342,1925536873,1283989689,644940535,870652027,1047032234,1687797603,1965924290,186883129,2047127314,555295645,1594650677,54518147,1587164867,1294412729,1504403034,2093951227,790698584,1827781161,1268947523,1161454478,864156950,979580200,533062517,1066130219,1966475090,823649822,1140185655,391026447,1223335624,852518153,2035799613,113960518,988162800,390089018,1794786402,419516075,643661362,676951387,1909142800,904356452,2093096723,2093475516,1247505334,1198007616,1395162446,1947534873,1424071431,91330933,241551965,1605413533,57645669,1798502132,939953694,1145237319,1968039311,2009060612,1178936097,1794090168,1718114025,876817332,199259571,121111990,1780397172,765670047,2110884534,885284619,152205199,538311221,377167208,530105055,255499356,1002661822,1416597988,848728235,604012361,878705033,1184894425,586839496,1812308571,1280730944,659382375,2127473103,2110446249,347644125,662150097,1470523553,1681508705,148336700,450815225,948870226,1324875276,661950477,1584754376,1706131720,1955913384,189332649,172442028,1738705768,1574454710,1308579249,1587270837,370185527,1084426460,1537917724,1896966803,333469765,207885634,1802002832,1590153803,540676643,1778177758,2085315088,1990824331,938267809,638026062,947929063,589235546,179462411,996340338,1725203740,70138448,1678912509,1692282113,1015191306,128969981,679185051,1471859443,496341588,1153948714,1047310561,1049747525,1673933273,1971190409,1066894446,1538124069,581551352,635055234,1026787504,1415910826,1574919532,1310236682,1722860602,1645789001,78568261,290476634,1421674445,990181752,55113997,2048108172,195444758,1946456643,872021348,947656477,1742645679,996783430,804086329,1970677460,2004950081,204612694,1985830023,1533073845,1157040837,664387338,578971160,235137368,937528470,837120808,837162468,100978689,1015907116,1244110863,782266132,2069481449,981172627,581273394,1695222601,2045042859,2089709539,1760485244,1688468158,169908657,1512276080,150957476,2108410948,157671376,210929825,732711724,1975612978,1931279601,1304848005,74364865,45540127,331809634,1856897989,600501238,1988455812,1469719303,487998527,206466408,1942537133,1554460606,1571714579,2049735964,1620230947,1142755780,1477256654,716209729,1652293308,1439345146,868014538,176644657,1316283664,1249482052,1333106500,20052356,1471747203,1893358955,373830353,1011316781,536090010,904550473,1664500774,1683740930,1737853669,1861617437,359120696,1678195414,1100761426,873519562,76639185,725340800,1543778156,1330263052,1889202588,1103705675,549972395,42223287,690716135,1458821579,1318774802,537104564,911801195,664850055,1917381663,461123070,487247224,1532734500,1364533940,2011052636,1467842945,1105981180,1436129577,1870179902,1030181055,1658748705,2121772888,239926390,189117268,2063171745,219074402,1538098273,950044003,1486347591,373628571,1477191824,632744171,100660562,1591629430,1848693883,142957399,1925898902,1162246802,182336517,1311513118,1488750589,1402917091,533177963,1745458243,1286864101,388579510,1329768989,898914952,1388028575,203451374,831211610,855496021,2035077899,198681273,1615673318,557858070,209369546,1744516977,1567027136,405948566,474213106,1323802894,2090698877,968044871,775364875,928963334,1198707193,1162258697,354859618,178172088,1553124715,604085455,1913379918,262722688,1344937871,401837640,1810697182,1728849063,54630381,574388181,1664005127,807504044,1612165494,1457929565,1615291555,895521084,2113700142,1427288756,432771086,646889184,735847620,1515720458,1633781596,393716511,339096396,330257423,828052024,678890390,1551010949,2033266919,76893810,66710163,1085473225,1188819294,41159650,473140789,2089113146,1005811213,1225652686,1804731666,790040126,906942088,1850332248,1860063669,2039801443,2108474910,201068526,1656375346,636094397,1179983904,126983670,1111906806,198666192,1454012941,1147435183,584628899,1917624375,705480398,594623609,1319632932,2006089278,478819449,416894498,553516890,1739017038,131165664,990365015,1714611813,2038877356,928032565,848151643,2036695087,1792575382,833840125,1622385287,603952349,1778379335,1038986543,255693900,1242067998,1662691447,1405786739,1603024012,1453773296,1848005694,1794789770,1085962389,1257913832,1675165983,288949699,2106272557,594706988,251290534,168772725,589182627,1680856547,874406453,652902729,1761038982,1460599461,1387203492,1783492641,2041070223,1040341985,1053067445,434469152,853521265,105984776,835744323,677489350,1019485671,1639466535,1086431509,389687303,656303867,1488662230,999151198,2087998339,959080801,1294605405,2095237931,302539849,397228739,1108929797,1907193943,787390743,402578370,74387638,1245221990,224085227,765025642,68164423,1118999717,821012917,1612564457,564476562,1518603480,1500488845,342836606,580828267,836561718,1541720694,1570956218,1538571612,1530172985,300263502,1063999820,1481102483,1844844678,678378555,1222429409,1813174893,1315926285,1071852461,536556545,574201230,710848683,1740977384,1936588727,987921533,135786395,831405358,1503795500,176080470,829469291,660032276,1935532006,215201588,1058385982,1707751339,379340433,1712023188,962257701,1191469790,893642171,761004026,906789137,1127887419,272374792,675564509,576720222,330919891,1261943351,77866299,862346337,1808224051,2014770017,950344753,17574851,697799981,1679500755,163407254,142472807,1951128630,1653789804,281647141,680783556,374302683,1586359484,1996751933,276941404,412154843,181686900,2079044946,1607735804,1293866499,257651972,1809134083,452021925,2124073130,1005525399,1544245927,962420886,1670820915,1957190931,1171873860,1026526737,1790172193,1758632202,898257391,76564027,2092512462,1691788949,890432755,603026615,833333932,194877898,2002514870,1442621068,1237272868,1951779669,960025097,1526542012,2042583632,46209079,1644500129,352866213,649242626,348748810,182738685,565166495,1908376724,455816055,1306654419,428471000,1899973161,1540773569,936219319,291966341,64037897,1048632582,1705381553,1571314423,687917028,1143682323,1702866750,619791697,1732067141,229018971,478509708,1315820174,6745317,578405480,1536188211,985010493,103458329,59414015,1586463255,1192608656,893522789,1941641790,112066819,1336206427,749625796,122581656,1159946880,874151431,18114103,1214477623,864008151,1453731064,294654233,965231150,6985125,886411089,261293963,1726278328,956824507,1196820845,921853615,1621764588,1499648326,106436313,1675712653,2082969199,714861287,806088388,1870138680,1174966314,1445300869,1991935149,1771826404,254301733,479364443,1321980925,2068010146,434308799,1235473455,921515232,1854859151,1282500100,545500596,917365282,439030753,2051411192,123649504,1761164240,117417011,1712438286,1593929397,1900894325,782651077,1512528509,1629707584,672775572,442614003,106342186,1260878459,629198577,1247855852,861660499,103164344,812761398,995495039,1585498489,329560952,608943353,1857310199,856585093,1571491790,244122780,790424833,1671398942,693090523,635775241,1093872170,1165212521,179783454,1760103274,1145178922,1231138434,2032493461,747381700,1287323216,1971209922,1627127690,1232935376,374556108,1537557232,942341433,2001345755,312418592,166128978,1779210274,708631734,57417741,2017425170,1770319142,2024766617,811509008,622056345,1501864460,1038376717,716741731,628807976,85549304,1053344329,1593589241,2028925450,1060440008,1428891403,1155132818,1159749210,1789410977,101975672,1969009741,1415408468,2050947994,416632636,1239314875,148242481,1235291841,1533638598,1082725283,1487201393,104284235,1331955210,584538748,683923950,1218397768,950787669,1929680216,662692136,465660004,1467899510,2098669336,1123265058,1577222430,1121420364,2050663933,2118098881,1554000040,1821275918,1441367775,2063395887,1381418611,950790750,1400892556,2126543312,1293880936,685043148,1072347503,54926712,119679351,431936171,1434492895,2104699206,993670655,648190836,399330078,1614412952,498524974,428545483,1396132462,1632646782,817419887,572293604,334943425,1867266438,487432634,846474883,674522214,767066012,1178489285,931667561,1790176429,1167080801,383761149,1031551720,30103895,517218097,2030893988,1238143992,454545986,1455347271,974972037,1551392384,1538734934,1391259184,237383101,1455652965,958977274,1966399203,129200645,1101765208,1820214538,879100421,1052182834,2039004170,920998689,175365150,887160358,1729791297,995668479,1023188572,155379119,1567070254,1982652653,1796580120,454956676,1100523607,1506027943,446032451,1509309325,1577082940,1730153376,1787448374,239122484,1179393757,873215258,921083105,1196789415,1408369364,1955404933,1988101078,286071557,934401956,878972764,2067055170,338053466,1301687731,8881329,1107553813,1990403771,537566246,1527741401,793079359,1215047524,424231269,438812864,389818294,1604283857,1230353243,639199185,1933525602,589747125,2018637193,1551248623,1656082247,1259463561,1256600028,826065154,1770766070,1864764156,990506549,103206632,1976788148,1536820583,112063352,2033045245,1303251579,395790442,888537009,1467371514,875203792,751115337,1067488082,2032816940,2054452483,1846157214,304004885,1437621049,514566083,897693098,353829115,408613092,2018134076,1477878267,942738213,2118412460,489665428,438307140,1976193035,1908053471,1997501466,220226866,1935276431,1566441704,993852572,936380178,192238120,519461805,702195439,243223243,1759021130,179368153,64504134,1901401994,269845980,164665764,447626749,603896551,237391526,1975535431,1762932617,794028149,1272995799,517034162,1864611818,1757371875,1837962239,314710749,677504464,1444150637,368994877,1183148777,1634946766,2084171409,1220742726,268890777,923705399,1252869744,1264980140,44834723,1683071693,1968653354,1281719156,820596620,212268085,1008834402,1702525011,1920529012,86461007,840709385,1508249183,1028609593,55041031,1950105489,1714572413,2011982054,2077850179,1098102031,1685528570,713041578,985801405,400581534,129752707,135952653,913275984,1447498029,689275068,1208625171,1624461591,1310562746,1180697127,849829728,960672280,896917155,1089723716,697454483,955638096,883353967,95734198,1759570360,343886305,1545809948,381872208,60422760,1752465110,766139370,686107062,998729006,1292573397,1717828751,1802675273,955240461,696643252,824247962,560976947,1791973259,1109361847,1510632966,1334789155,485749054,1814715667,2105578092,2122441042,184893436,1942512600,466384910,1030867170,1984586494,948431107,1164515803,1653947051,995197516,1460068308,490512849,1832078285,1179146736,1409993782,509200994,1891766069,446150803,690448003,1896069489,275513010,280841434,494208517,460589655,2061380063,561280944,1253799326,1378222613,979620938,198254224,397676017,563517609,1611311513,1644638854,141744074,491363604,912339649,221270604,504304016,1585746884,1087136116,1426403766,1405210038,1087213190,1106224535,1885488892,1780133021,1984702578,1180727466,275393041,1787682733,1156125125,672033616,1018965151,2081344923,1819063491,686283815,692834862,843102998,816011490,753422214,2106946786,1169093847,223666526,51328213,1658436576,943684041,1161672297,150779956,345980567,607285371,259881042,451156343,1783915262,1351260282,1012390413,291368910,1095192743,147545832,1427731327,796395278,1710532306,1682348586,787214681,2100532102,741288767,1537652322,136553292,1661535547,2036108476,786676498,802260009,121205467,1399454475,1603716670,922398520,145325152,925162513,549382018,321781896,1730082664,1359656877,1972172490,1061999604,310152319,624007279,668165304,82933621,1543771461,1861385702,1439161206,1532914623,983622382,1389526433,19356613,1127290674,210311249,165435664,1521926419,1245502982,756790512,549858880,864672085,1188042247,1024280586,1651774679,1632375624,95922912,1113174212,1250158533,1924299302,944405837,1397075596,1547172732,1323444382,2110655876,319942977,1491183346,1710424736,1897052383,1906938085,564542368,1678288961,187676844,1721743950,866575891,1163694402,1845002749,1600460065,930080056,1680436244,1069199803,521018435,1734825570,74105765,605521123,1049518868,1250178925,72064263,430760543,2062720953,1424979296,601882980,697361751,510928484,53064665,879566231,301330934,1498593303,377816321,1121067081,427549398,1749659591,1815706035,444295858,273851782,1141604871,417414168,390118802,565397409,1865070881,530868883,1342337235,873108011,1545466367,310289919,1918326574,705178725,903884180,1588060775,618611154,728061731,105017270,141080033,448976496,874469188,423611326,2076895762,772845406,1305493875,953263860,594670933,1370520640,644498983,489175872,1103128645,28834878,1897894992,1329011986,1977784302,917566282,1382777405,724263300,1047298186,1794033,439990414,468895996,1770374261,1965730511,879365774,979798730,1142409983,794702239,579885302,1940389350,1471490254,1881625045,1555224300,1818338862,437052420,840790747,41481368,669607105,1632126391,1523299758,1642015681,1882875439,1683467495,1014123646,517765085,545871969,965008932,1432571202,454661359,375389422,674786368,1629242368,2067558617,1954456279,56774108,1763747040,705756163,653733896,432257564,1265584797,368107117,226968369,1532455224,1600526402,76301378,1695232312,1230525255,1686976847,1976791154,1966070127,1970917611,1508587415,48669041,90122755,208423674,1739201843,876271344,1641086805,1051216559,1302184695,524023058,1497567482,2090066302,314313559,1322611035,75293946,641038009,6673511,87951983,193674833,1941070935,1536359163,1253244474,1757558133,1599283388,1324582467,413721474,1261062191,121035448,1009414686,311328666,1363291038,299447113,1890745799,1447576701,8340510,769274617,892505102,1458962963,2014006120,244453038,1167675351,1526406258,216423277,1888671002,512282292,612061310,953902664,20884069,72600431,1961359859,567236693,1459797351,1596341554,1104897215,1228130894,738821414,853918928,608281683,962417067,1849028398,1005659841,1189043832,708964851,1026394576,729465237,1997590601,1277736723,682090570,602692646,839910938,375986853,1990724531,298629342,1052777060,1869019439,1475002752,601922044,309296925,1723395754,1165249607,1140169421,581351407,1275303976,246757824,511832751,131876366,611601241,1197218358,2045826240,615972560,1113070087,906820830,806814497,1019189484,2108718213,162848430,133773455,2114521671,1436681757,551036236,951351177,982263900,1774308056,1466537200,495521557,1886771116,1956784114,1414095349,1632130830,1472130750,1437955709,1695246985,1838695764,1847507728,191125742,1421864940,45936172,899312202,710607437,285347033,839215143,715253709,1969298885,899876290,427156946,2108696763,200292254,1506231856,1775087066,1342709715,1048132697,631562049,1965469784,1427374871,599867668,512604315,911736395,2062088483,1400222992,1029145458,2081567956,1238048346,1636516759,1341596359,1629407373,314684961,1366430587,882106137,429041620,628989136,909663888,684737978,1653500001,995860548,1430968991,627940036,1684346459,377993179,249988325,1368014692,582562761,1343947416,1732582422,2069823383,319742596,14076129,1124314603,700512249,1182626240,1656536714,1973682581,593381389,1117083061,1790415314,1598102958,856630999,1902340385,576045477,1419628776,1078261631,2123516043,543724441,1165960078,775179179,1427135999,316406036,2063343714,1978562643,1214187855,1423830798,334043628,1285952313,2035374973,137404155,1613173072,775134338,737693740,135689274,584708037,1914916313,1845886247,1495388074,1364113245,1672203599,1736179718,872656571,235583207,1945878758,385265626,1259345672,296339527,950355968,1792689414,1437401885,1030443378,2120821700,811821277,690494527,981415791,577377935,989145831,384795353,1242550835,1865081034,1174881467,262487012,900030452,1637232726,683754697,1192640656,1039735914,70572233,769220564,3750401,845205552,875943031,1333266515,1093577070,726217938,2015630509,1077008142,598886748,1640383527,1917960874,1564869258,1739281288,1220857841,1786670329,1374266421,1114538942,638437359,571808423,1548010945,945368918,912714769,939707476,1451375873,851440384,2051645984,795117024,1712253924,60561421,1840769906,1777625892,1655337481,1619699787,740192363,1427630990,1261314361,1814639977,1912496144,624297617,1115228985,1288048046,291604053,526114998,1796606411,1242353339,65176106,1132630726,1936658785,198393242,1976950978,1121713460,1937439974,2078695548,1702155611,1896810336,1360525074,513617071,1191166438,1458464991,1454017006,1758668834,2053007041,936549539,676473051,1613086750,829343113,424621176,58848209,1401018933,376090926,61208843,159257163,566691677,826508696,1334876008,1172146907,965607980,297535584,1172538276,704417786,1497113440,600539076,1422423227,1497414148,1797889701,903852783,305989412,1468110526,353683358,960822085,1949107503,892463702,1648838876,526050793,41458779,2121436162,1720256074,1661721408,1632203745,25982144,1550241916,376429670,1979528404,1736602818,1952044366,1718984145,512719805,107770477,472896285,1087892209,511912307,612576246,54787315,816199059,1064530299,2109192534,1114521860,1509316919,1523054417,804311643,1681912867,1763498899,846260079,1996610401,654179637,1971799209,682390573,1944006286,623162764,517065976,231511780,1573543167,75989355,569499046,1071374998,1378872585,1549515530,403177666,1243130231,1393183460,1245624320,128560598,915712184,1918430442,1905762771,869438011,839584114,1094755272,799676066,274881122,1228440332,387048858,1346746570,1432836373,2076185618,737218060,1637940207,345421689,1976922961,1876578826,2083769504,1082689656,1179263509,814142972,150393020,469784704,582200544,2130519739,584281164,1218038262,210832011,1764294025,1517501046,1820983379,1698131600,913830093,378960095,1101026990,1803318340,1507107945,485376711,1716357269,188468020,2048047928,1266471006,1951690960,967679902,1535418209,1848298737,1399746219,1361626714,851102199,1893890438,2105982078,307040785,666688558,2354558,1070298479,706747810,840712208,1741398668,1070926667,523423795,1915163663,1671461167,594507954,144635971,415684261,1105463530,61218420,1907573913,817734376,664975199,1643792323,264258976,1186724832,1584197357,1805031735,1288788866,1412854327,973379841,128716198,1552145768,97497760,1994649530,2053131627,473654831,939587872,201993096,1530912450,1926437537,1420219751,1263096791,1538197243,1729892908,44133520,985187727,1927326810,350177906,49239242,44464560,2083036933,1063708271,1485514612,1164947027,870705595,330911019,2090610031,888362808,1047492287,2061748476,1874707459,1453333791,115414563,758460373,1907318210,839101092,505438743,545526377,2073783766,1375625823,1231031344,1953892002,1955027432,349208344,680100201,2040133548,2061504920,1795931192,532930587,2058405084,1666671859,420735448,1773389868,1790281773,328504486,1785352586,1569746854,252118982,2045857230,861769613,158207423,1874482273,810095828,1480193300,1393332315,7769202,199401678,489172990,858185132,1429989333,1626175716,1021700471,1944199824,2082371875,284472467,1189379795,571225545,84716852,755699927,89151196,1927261548,396304929,623770205,1146984351,202573907,890831478,1165009753,658153799,444499641,704948557,331247136,1821140123,1399104622,1792475492,689466389,710600243,1005113279,152156630,601437222,1044562371,2116575042,1472837759,1923332495,700216039,5102357,758578952,54115816,885604255,963997773,1352258652,948286963,300996565,457187123,82226067,1778888439,682921577,1286214259,283219765,2091404196,889142098,197023678,1543531708,1603931400,944089692,940004643,1759441245,705097571,1825523108,1699516943,1576438076,795004503,1387755288,1913391075,715491473,187545722,827794007,731646190,434226223,1639645063,2076017435,1992763565,1519422151,35912238,389145259,1812806974,919603257,2051205563,481498354,169139806,1527296188,686787295,185352876,1701462640,1178600514,1228062069,1157018360,1069813211,976910602,1705087447,215448810,344257636,1719678093,811181054,1523580478,2080824575,978946694,2061162695,1515687035,136547730,1326928355,62342664,220439134,693047681,628754952,1968764599,1543940216,69274181,863671976,1798808846,63142533,1722701575,191660490,1880294665,3969320,1145482229,531452767,550486047,1198834986,1841696377,1733774021,1440674583,1812364817,261094046,1584032021,491349616,1462140347,1049365421,273628562,925057408,857985188,1172220903,1843970628,229024056,800313869,983688487,1668128042,787140640,1745690563,1457630061,1655571208,1184425040,2091780336,166863481,1362463000,577216757,997775738,568750402,1180344272,1550306018,1872774898,957922607,1378254133,1815846788,406109504,134558042,1692201684,180065060,1718649743,537253610,1490435418,761391359,1902264900,99380583,1792454669,1920596896,1968412605,134774866,179441157,1337304028,1416244691,2096192102,1969255317,1055567961,601788946,7975163,724203274,1185557355,1067833788,637936770,552274255,1801883197,56267280,1268504904,1688334338,1869364395,1421884668,729089597,801891196,1375229549,973514877,1656048557,874145068,1902978338,2086025318,244320870,2127176682,1035197966,2085218463,1624102074,2035993108,1570129695,761474871,1245251944,1754472097,1152398491,656300339,4537016,1954734839,461391132,1262235259,708196340,1492023874,1664010290,1682660736,505383385,1387865323,42393781,1404400942,1660318409,1373596193,1329396557,2127606811,1361093434,1628229228,1922932416,618357642,7945686,1321540256,1942998961,223358831,1633052445,394072903,1036112609,1952110473,268751335,313963133,2089047651,701195590,2100267687,1791672442,1557372850,1691064265,1007386615,620699916,1994163745,978469598,102719390,2103915337,1134738899,1835769254,1887175430,238680022,1685144635,1972493797,458087232,1211710911,1051249860,2043996605,603570476,1021208729,721012313,180408493,271523037,1195371055,61275262,1170857636,755723862,938813196,2050488684,1001636805,1210556680,1106988685,1611197805,392828840,103239770,987136660,797100971,1357788774,814871711,2021446555,2062855773,1368041746,1724284026,1566545187,1353283007,2026647803,879646219,379336928,252894604,1505353,821741223,2049863243,367380028,1149610903,1175087344,1455870186,2004797664,409200228,749865898,265174071,2044765872,393888189,1357856587,2007227471,1502232209,1503036144,1903376562,1399304045,1719173509,1968086066,1867119106,560643892,532012912,1000323831,175440840,671333941,1693744471,1915018598,420657561,1829487177,175263898,853136649,2000623108,1446663102,1927669476,434204847,1842494758,1740371594,239443429,1305390252,311300496,1479473161,1097337221,1243407300,1129024887,1940692562,50365788,1716845451,925416321,146418849,351011479,494195158,621408749,58057335,1907285149,244223250,1618399290,1273662271,1990712582,2113034231,232734189,1744758201,140505424,1289867961,574484101,622214068,537554694,244714469,435613582,304416609,1839886407,1809173940,252133513,1250584107,1491296525,1162790883,2014001156,1102435588,1400971362,1817646593,1151952930,344742888,696225252,1090188815,742813928,363885005,1344003814,1938387292,589511660,1549504391,398937811,882779304,276955533,1577423001,97069670,1960660945,617556560,1937160561,86705714,1399904258,1581605571,2049191111,543352933,104938149,692650433,1703554014,254169911,787049262,576399288,376593961,130934324,1351559096,1962440913,1569603995,415112856,1775472084,150692194,1106541904,569450610,588348373,2028464476,556553040,2045156506,422492481,520688493,497276304,905261975,66733050,608689292,1114685042,158153779,644399888,106067461,1264272178,1871762886,1336787726,377270709,297291977,794458539,78399843,1000582043,1886404089,77065194,396408092,1981644322,869467892,566837179,1251198330,220176110,1759483898,212577157,1379270990,1027078271,1938713351,1524220514,89200001,1144244130,1997611889,1459285681,1526360117,628399780,221504131,1381828251,742444022,1825998811,242424504,489769969,1464919922,1156904418,239230729,328216943,448488345,1127933129,1849647512,1823294961,651920731,319051544,50594966,1821607098,554858187,1097437098,1511496298,1698002214,1175984671,281120984,41939023,1914209449,1457190421,1070844074,1824167097,184869214,1078533290,25650264,1209988304,1896007767,966421401,1117807226,241079128,732474448,71685675,2085593981,1792693413,1231373565,1307839270,2007944664,1062499205,1894416562,1100416425,170083653,1949747741,155946435,197015015,228672702,1337360057,1759264794,132290743,1257195600,525551558,628707363,789411970,2060814931,1148471828,414992727,200089257,538130508,1569911242,1901381714,1016135542,1261681610,237962071,1489674019,144527377,1988882701,848963828,1969109336,1636419768,333481353,260190738,1548330450,335812405,1426083459,62621315,121635646,1132075012,1727287948,1643386268,799363458,1558997887,478674215,1956938313,274810650,1901232936,474835173,2071108061,1216315171,1462038381,1520842705,2039500090,1190688678,1538403425,83828495,226171652,1413867950,1070281267,1940524152,480440004,2011800113,2100371357,1031702064,34982296,1861095452,1435769258,1747268210,1130856229,608385546,1030281591,1920274082,1585737151,1332469684,2112935912,842796685,297909826,270211255,850774677,179252,273348065,1604036535,1001775115,1917454905,122744072,429785400,210978660,1149898420,1845336541,830352498,1434146896,14548808,183282526,1890572313,688397989,116993535,1341251832,1995598587,508705901,1678150632,440000542,1365011673,1203695514,438031451,1502906213,2039608403,2070267082,1541765396,177752695,2127154784,94557076,1985720114,725733465,1559624927,275303757,468670793,611905514,788408565,409092397,1521522217,487095190,908361306,1072803008,868918920,1379763189,1997895536,580865696,1335709286,2022178624,1490853670,1701619801,1517552609,288242300,2023986651,93176059,767322639,612111848,1160446948,1318960651,4986604,2019860191,1321652442,644334210,815291407,149654902,1492709281,1379677607,1676521434,1033775682,1368999221,1660886106,1308201724,449227264,2038549382,1892288234,1922661974,416425205,715447661,547098481,1670665944,1854617187,1225450020,1844411266,965073258,778647503,1307259298,363662724,956908562,2090143325,443854883,685943032,764810186,1523778940,468189308,550627218,937600749,431023469,206995529,1335985256,1596562384,1667942529,1173228736,1814082374,875686862,151764586,41370330,1757301106,127636324,1093901754,520491408,1908905792,1124275415,1256761033,371379767,256724616,2070039569,1699275446,146308332,455776307,2108069334,1631747935,753723152,12045911,916861586,309695665,990462379,24990196,1033599426,2110408372,1111566273,669461179,820317379,586792443,521115351,500027221,965978311,1153687384,297705932,1345399671,392712676,677407055,3567108,510476188,1134453611,514559804,890614707,592396213,2078226286,1027790264,1104904360,660951511,347203660,464003964,29614593,159391800,2120040825,402143984,2099085228,1652504967,714354464,1031640889,408674928,1639351355,1387223192,1784467628,2001876165,512873804,1923403479,826445333,2001403465,1028382857,8669027,1980682685,526870922,1369739539,1327709689,292280039,333683459,2032086055,1621918458,615608119,1610655921,804919883,1223249271,1664256811,2066816856,1714844230,1807820885,1440953233,956481883,7346228,1452669200,1684331561,2123119789,1573591541,72695545,86667599,2120987796,330629460,427240873,1043523953,2027631019,1171801998,1140665991,207129745,1755352544,415848597,876161641,1860257698,1685372595,205993336,1649129105,1724455105,463917855,1502891807,1008410480,192174388,1798336356,2079872358,704435108,697163292,566811801,1641057593,2086624738,1485901576,938169487,1635797290,1272899854,1633346104,1133048995,2083661562,1097887503,352596781,683254358,9622258,2046347907,758874556,1015000969,1742949714,41009245,1817594392,1511656392,1541790947,2075353749,71544992,1225259121,337381946,1383800273,238745542,274053036,851130168,865544244,1684945260,1663516342,1384448811,590146576,377993584,1210934434,405842040,78690177,1263960347,1254240996,1044603721,31951698,1209045247,287147765,29964736,1884994834,2043157497,168543660,1076650925,145592767,612207396,1197913204,71198313,2025157253,1185110978,1715953144,997614775,2112878659,1041358164,297521703,1272453978,2056127743,737911565,461594086,1364437729,1272036305,1593292912,1251110779,1369576617,707392600,867331768,436480575,128429521,369188809,1842178692,1243137942,1536821179,913161690,2000198398,1881687095,547136498,437952856,998363619,426871878,560384748,1879063971,989875686,1199305363,697332144,535887885,988356905,823338496,1408555483,434195239,528406645,1971497719,573897901,961704061,1268459299,1750444950,1866663801,395843602,621771606,1999589970,1562287939,197308819,466727025,1940082699,546695390,1123235339,677472053,1438786337,990107547,1665166600,770643935,2054006078,518784954,778294936,1659707836,374110427,2071634944,523533584,212281974,1686053947,1848523422,1079504708,1400309242,1542833330,1678218164,1976767610,1983482312,2032129725,99412985,208129917,1175292131,1196598053,1671467221,762591295,863348050,1104347032,158037056,1707291733,407157381,1109396030,1379502136,2105604211,821337295,33090179,962950111,625103920,2075600873,2030197773,1015883048,133440413,727363878,1679840296,1409656771,509146060,1293189205,2018605569,1837465164,1744020280,642319582,1042247233,761408151,802888038,1179999222,2040931040,129266504,933347046,477623242,1642390037,433331373,263080559,370344663,268626087,1851648139,832521133,1103631324,460176453,312264788,1476877359,1613932941,1510806951,274771077,225006214,1127874977,736110897,1716916972,937333776,1986525019,484459510,307382413,617901810,501088817,1131516843,1953543721,1724664283,941186531,1811067229,850393547,917371723,905182727,1059121395,1497998913,1916605793,1653772426,887718713,348918955,576425067,307574528,1267710069,1797184899,2122119851,140866937,900232443,698156983,2060009624,2051986305,1469784553,1161112304,733477567,1810461374,1010293816,869100084,1120609061,194143682,929652011,1063545212,208739571,272221474,1668809821,1183836483,572286692,1527146178,1921236522,587644133,383462447,1396100102,624019098,1993118198,199121178,467876964,1078245318,1258741334,1202179463,1378388669,728701473,265721432,109070078,1320203786,1710003482,288798842,1971359432,1052343583,1212888261,1918017809,62849141,1999520790,698774659,1074312515,58295861,1972336791,27765957,133839189,809630649,1026695604,1815491923,1885927277,305366087,1862543456,980064332,1760491145,602544634,86072706,1575707199,152291072,1590748402,243765112,564750614,382179298,806382809,1006928014,841490253,1086534589,2009217037,471711346,918517423,2120761884,1938549779,763402913,534016922,803751881,440804008,44665243,1960365782,1752277130,668237616,1866914518,926860595,1895396275,1332978048,625180369,574831970,1340573916,148510719,82484509,20723519,1648281573,1195146206,1702997088,185198132,1692431834,1949588834,182731976,435721414,953309041,463504389,1317316486,464976820,1722477529,1104434722,1831503596,537497196,2101567964,1646555236,964133306,1749521897,1664293567,453982835,1871082918,1162232490,1800652172,1086609980,1414344614,1547132332,1855703505,1253438970,587020684,714859769,2079175927,1399486267,149206745,1390822602,7925137,138951076,1766308181,323635952,821607112,857632663,1755815827,1719371945,168914022,1221975275,1225859117,340849916,1688880881,790795454,882951305,1048638065,925811725,17591936,1148552761,641151761,1430256927,1282338457,754589340,419090560,773669684,963268792,445219500,1514805583,709067190,1581262815,591096724,369513974,1533576020,512117388,532846516,1828873868,1966498169,1294403683,898028759,523918732,1363760846,518958585,1027787860,1889890379,1138349887,163184778,1472421923,1682470287,223266488,316264353,845176841,436579241,1664452173,1302485137,573458371,2103556699,731963085,2045171660,508629560,1160373843,1438975498,1023584271,1302978476,1079673748,486505089,564242556,1108023027,160203805,969672151,2009214887,885220141,1918049693,1355616727,1840040972,1774928251,1337096564,180029878,692269172,1927703970,784508703,1147878815,1721129562,750997753,1339447821,123593732,1653538545,1969809842,2062122189,1752705651,48144767,1435544233,30874616,1936975266,1516206554,1615832451,707264692,1626209890,1947249649,1475095294,746497631,308940931,1774501530,527735263,1135155299,1211512138,624209371,2055552871,2494927,372945719,1044645510,644227466,544874660,2048589497,115139393,22076124,540917183,1362797101,1611967652,1256855044,676745119,1957592307,1675241233,1357380687,1002005705,1930899866,609216570,1143939865,1930279300,121644125,735882902,716334973,230209964,1808316372,1930151324,1173228854,570576944,366324948,1147900888,1424253734,391215258,1628719655,1686336116,682379137,758120084,252744591,251036795,625126845,1495355890,1774484962,705507746,1869378525,1433762805,1983531383,948790190,1064794546,1208495443,997159335,1212633995,1887533377,77026149,1780076159,1673252568,840503717,473535858,802897201,1868808336,254797035,891559871,1200682743,2096526763,763755940,844076277,323221949,1839439341,1079467073,188318647,1311826097,1988039205,1320353059,1856171504,425396371,1671584557,803501053,1020400823,359523556,1459908948,1594880782,1344085150,1318592177,1311353860,876719952,1612896082,206667280,952976475,1302661626,69069755,1009758303,40650013,1541512311,825921156,996466909,182416928,1134093669,1790495240,1200527347,1182317680,1340483210,1208607251,1670962163,1135818128,264984642,1116671793,1722989167,1597188238,302221626,191186747,2024471689,1993527059,743588480,458253331,1336089269,179925478,1724582295,686257087,1071484004,158033683,100385240,2090374465,1748051448,1402800304,1773137487,1935182126,1941513171,1905727440,1956566286,946844606,2042188799,1954084030,127322237,727126994,1046351962,229889328,791578724,1882408308,1151352106,794459619,73937136,1462239648,1510600590,1846423456,1920857935,1581566169,63429518,2119416937,459040064,439933229,630141825,989996246,515769298,18517029,1100500490,835401023,2100440186,1892025167,541029769,2004973787,1347612057,1042440368,264568150,1319931188,717741154,1587161202,220211639,611657004,826042497,748653295,993836155,1468146013,1621504983,1067254969,450292712,623397950,1648241661,305649509,993221170,1403774814,1063561349,791233768,516167573,1450950596,1925718010,1167605514,1114953392,1025375038,733313203,1344103926,143558890,1885261151,325880212,822818280,1089803810,1340280524,1689352585,809214880,1895026728,155210847,514812657,577756541,1621889320,1705905246,1634459080,559693411,1251862979,846841630,1303010218,776583760,857879441,1180627626,1850315200,842805436,1212266164,968097877,1928839668,1541335655,1840470672,814893648,785219151,295664701,683702075,1029348440,50119514,500538316,1462831349,1771435347,1703383501,849000335,1548441128,98184194,143629917,1009302451,1138031937,622870772,1363784392,1039806978,962605880,499374228,350524476,382255251,427048743,1749507900,1689452818,1518092327,820588313,1455705688,457271959,1617997165,1731198988,1290331939,1534496216,2031308660,550571235,1553928807,2108965102,1531582229,1057195356,970570695,861193100,651260660,1316140514,406507958,1208266123,1502926080,1063012436,2040406637,426410831,1430396557,1155212659,848408937,605319082,1709906005,204158806,331329941,1974900436,1129129098,1532050919,58589635,1550924982,2037891351,1191490055,1693157610,2029214262,59131696,937953509,1670967052,1718144996,1529847645,1564960015,233482450,1612185596,381701275,494431688,150593030,834039829,735419301,1653695789,1746783555,27598075,2093765437,2093210174,1997600202,1613801078,1670076108,321299960,1560869944,1585864223,1288039989,309495412,653538709,263645283,172895892,1074809615,1640882819,211019564,457134191,1945544260,1734588617,927051393,1583690243,1826466900,414155309,1827733743,545370992,381515013,1449406147,1334375608,514557894,819487260,850544750,1219141417,556999052,661142988,2125523918,1194766654,596612090,1093467046,1329112259,565147837,795049898,521705626,1024382510,1433213828,1012435854,680664458,1627852967,716705144,1537923615,1232588063,1150342663,743489697,1325715323,227380367,27155036,22545980,1992330135,1266048415,769182069,1630893307,160662004,1803314816,1583578807,262480012,914716007,120426671,1811264935,802996829,1436472916,1998203627,929180161,1458837144,2078454865,1153216529,1383712925,354973668,1955848169,1702582480,1205254144,421913296,1516478948,413939168,473065243,568354831,13554348,1935476403,244246635,2072678829,584922134,2114200534,1330026670,105293795,95040491,188080826,962972532,395633441,583377085,1269812795,1318500298,1628870394,183837059,1202364981,1962114608,137199927,111741927,455363632,357368770,1273455020,464073907,1364822659,944395213,1246487264,2066835088,1031836151,1215040758,1779423263,1757793874,176345883,740135410,936108517,155355485,1665926287,1367956930,111065950,458515191,2060374341,171624347,791276207,1819891469,1009698221,1269711945,1453949524,943433535,520403804,1856149551,112880510,9015702,1301640669,184731242,1929235616,2038091510,1486298947,437295690,1262976340,1630663592,1472623459,821167514,881748786,955793447,491804358,256133908,1768698999,1829779672,396862883,1485840304,584441700,1510575171,608769233,494969893,1687176356,126164007,427280480,1885587234,482636367,1297869633,4629968,1329797730,1277323555,720080702,2099772486,182071908,139721841,707104141,491897071,557858550,1383936875,780932730,408172781,243286758,598094108,1752738064,159221178,451355416,1450517223,1270434906,1288474893,2025574740,1870670790,303482563,22247010,2037885216,230732898,1343292551,1677616174,493834818,3558219,1020572063,1772177896,1476443637,1769074374,528020260,1604268720,230116025,496803480,1897183364,2003340074,398171346,2098380058,597681987,1444013694,328565915,835201296,1754199395,318123605,1611182555,1118550611,1271650130,204763127,37121094,913907583,1492347431,934905658,1655785442,147804102,691701941,910146744,414639383,56557726,464822944,1576235145,1429986840,578165190,662015742,181991711,1311441764,1746006267,1790397236,880874264,192129006,1993244228,637049312,451003875,1547455085,275242700,1144685601,283234692,974494859,1712781453,1797240592,1685511553,1196791813,1974690339,878259195,447219778,574718599,1653521562,1366667131,157260395,255826026,685486609,2063708284,1530837832,2073653756,1847823180,831949141,1364303171,951589616,1774282223,1694427522,952940500,1099555554,966972979,123894267,1782989515,1396855139,1792928969,246262681,1690017865,1200836046,392157548,188017595,364252219,2057024122,1865686700,1829140612,1153291226,1570477241,728794362,1676655925,523484171,1596784524,73750609,1398182786,127410440,251932814,1673315573,1844426809,1390246895,307524275,2061862188,2126928090,1429936223,1981571554,47650375,315887770,2048025907,513659521,1390116471,579760321,1219771454,1150735670,252476551,696730524,769594122,737438999,1169684163,1023901980,1307179754,1227016119,294016410,1265426994,1744569739,2011666111,1084182639,1510119026,191146619,456758695,1321538321,1749412789,1976891699,337753252,35774303,1431331988,1620592081,12357052,1875592721,1853897659,1621681975,276452031,865343030,699410586,1439240000,107282727,409882159,449079448,1442581316,469843679,375835215,302586618,582519947,1291823557,52311557,569353573,902800825,962756281,1133668109,942322457,310052539,1238402122,959588942,1724919095,499607167,425172666,896777030,611685404,661288912,1773286398,1484892534,1930654017,905715080,337401707,139636052,736346076,820830576,96880145,1211932878,293889264,1823608724,363084985,925604655,842671133,112949039,1686576810,115096995,1443281962,2094196342,909168218,1005347241,1290183002,1679572400,239932279,1200399832,1237134079,985278021,1081071771,1199548391,208500172,1402879838,180661942,1679326747,669160115,386981833,271660313,1373801180,791996280,682910351,919869333,966050391,1825853450,235762207,2117604549,1790333546,540228126,1556742729,267217040,1396324604,1463878318,1306024419,1380025852,1398689104,1333788102,763354220,518948448,1904540450,313524867,2075402809,1928023620,289553100,525267775,439268902,1414737151,1617562947,743451543,1493739482,217273337,747098560,2004262917,101008593,1156612249,1420504835,2013048488,1896240645,1266531535,253120980,1407829839,1375315734,2018330077,819749111,1618291590,757818233,502438823,867361945,937825189,252218608,648688362,1517399495,777349997,868271219,606121088,221597867,171952114,1008149658,1944984170,668420173,135677274,1578746461,1696565791,357379052,1104910188,1220977042,330742127,1936260218,89434154,1142925972,80243137,1776487172,2080006674,873200988,14339765,1106024653,1129005262,1970393273,968190812,1494602171,1469250698,888527828,1510409728,690897558,1140742137,542377141,1875327102,84256408,798382845,729878838,1026312651,1949254418,1475294457,1835219599,1331774604,1861082199,350030805,1012821110,1942894554,677462274,1597379761,825826550,1764801606,134268955,1631807976,305439326,1611732953,437253663,2088441605,2103439817,1717530109,2055331672,1722539820,1402857450,949890011,1006327030,70340910,1566600721,940353064,1800303421,2013080114,20163197,749744546,222792168,1692477865,817583193,806022334,1845968402,936484692,1368740398,1298581807,1189630952,1379761580,318313193,1481281343,912619323,586591269,688130295,1635218316,1022744751,969514041,139672183,321359312,1450445074,408999010,1586147141,1897136548,476404444,1207373363,1341079399,340470473,995158841,1321682065,249761832,135139532,886016724,409530133,1881467961,117336959,1746608266,2044247115,1837614092,1715299654,328055240,1015156634,775900405,308490965,1285519697,1533411226,1745930271,633772403,42084172,1295557089,997296256,554964810,2122320624,711509678,2116538410,1217644508,1538312901,1945994723,1020724516,2125777431,443040792,1056764273,1030758261,1417224981,797495452,779138212,1070389528,216638225,385066204,1285603426,205059440,169128984,2002082686,178319483,1232081349,1268816436,695688103,340726774,902003550,593559029,115555365,1406696876,1395550929,1935082721,697209557,2088748574,1297682117,1538631316,1637737276,1739866059,1213469126,484013101,1476975618,1710695982,1245086360,2128007480,93179501,251945230,952162453,47894334,211201493,27282281,291276562,860208756,64653194,14027983,977227450,2084768531,1305596101,161831053,1640001234,356213998,476911969,1552564156,1866697532,417276817,2114356997,196633709,676321160,634538193,1691399355,1137570118,208072597,799942609,1886360941,1333379937,1004351387,1724341601,999716215,2088657346,1212414755,1539484636,1070928519,1720362052,561082832,1819758463,181070449,1353805106,2039639800,1968455555,596329396,1435116482,1166741449,642048106,1422092173,638449486,793193912,333681330,557458699,346331496,395676780,1358786838,913355147,1165742488,1529848160,257602251,97647048,1558762932,478685656,1808023848,1020346786,516032273,1814101847,334066335,1625143739,1201327973,1112843718,595095945,201569073,2018569786,373155867,661758601,338782439,954969327,1354618158,1208809087,928818061,777101826,1347310293,318824517,1603512231,417056645,199695301,986488182,194397760,1242843111,1916176950,596293854,508251597,1868548663,1027530560,822756452,154585890,2038758891,1766734617,928152740,988790332,1550242389,404978668,1589065632,444476689,64343797,48644478,755777734,1683068052,1914764835,85731262,1644162283,1355805227,994984305,621454155,2020632474,761567368,1549374521,514766301,1892511209,935866761,994733816,1225290305,1300072400,1214800500,988405140,608078619,1035444518,2015646424,1155464635,813397805,311514390,1250244228,202931570,1680796224,443644543,201376598,1334726616,1172991985,1185094855,914788516,421565204,782278535,1143276914,2023254790,1664569878,113606663,631032800,1582598662,837236324,1342618780,190753929,227096881,193428491,1606468162,1082556137,570944537,1449987788,1051336456,1116034925,36303015,1836882818,1866491932,685596846,861673507,1761748104,1637890325,2098292597,1609118345,419618260,1154194724,113514733,1440940924,1353396183,1369316437,2037477917,356300420,829156055,599269113,78518740,76790586,1621748948,178200999,2004271112,73112029,1977088731,1295280376,2111558683,18643532,21111250,676495361,617479612,1712316367,950286434,572144647,1403298048,466268606,732687471,31447926,556408751,941784216,542386345,1582216152,1682696249,348369863,573061970,1444470748,937399676,1865978865,1461801248,1985779088,1815815692,894429648,1090810780,845422555,736190267,835548450,660538776,1471037220,741383232,1713245278,1560560698,594846349,1106660666,536017051,3641195,1913489136,2121443280,1957251641,2114438040,1867025409,330409596,171127213,1246715402,1911889978,1354494468,1324661448,176329455,1459776148,650866521,371152391,863174729,2023569443,170339088,2031685438,614221086,1353188807,1469844208,833444246,592161185,695873964,75636226,347516555,2063777831,794248041,1705153049,298205386,1255130523,302802944,2113610150,1558161695,2108158523,1904524379,50815972,867023287,229575714,1987597490,1909195645,25839798,1107904026,797415394,1660335542,1013931681,816208953,1267585269,1677810767,425902507,126394997,991076703,2008007872,582405772,2053182232,124959035,1361278482,1352725384,584918140,1906750439,130334759,1899143957,673695970,1621992814,1762997848,471113531,960833099,576283919,1589020344,1756699048,883464721,2111982627,2108206223,1192718388,713146724,1821389730,253304002,96595632,1684466808,315225088,416345005,914934165,667494910,468183986,203798173,144175350,597208663,432018782,1791544850,78594353,493232964,1478908716,1702044681,288290867,934805841,1430330574,594596184,930557682,662200740,536283018,278423353,324273607,789299874,1401053973,1479202482,623382391,1802765828,1993321608,636415570,886872532,216027062,1567090265,2112143800,1354511751,1837071598,746493862,1264286332,2042849831,1512585114,230308774,1581550105,747425818,867087890,1986997839,1219629868,704617896,278366660,1854783059,908155341,1135303300,604768883,495506160,2120438626,886862576,2000983894,56770530,1312061168,652190795,1417435526,1225831148,537044201,399353834,1370110308,1021326743,1823849924,642940490,927869911,909053954,1807641669,1042671469,877424544,2100491751,104926170,491017242,1652043602,2049930346,1182481863,1714958812,1710308996,1746347663,1430636103,388277054,1112547571,1558667769,454088075,1381398659,2083018954,799593917,59534807,644626015,285688590,694069872,1968534980,1056388330,835695802,1245095184,1821109000,1204842581,1648936798,888431848,41484600,2048756762,646678989,1223953196,979137597,350056674,740486036,588415237,864283607,1538314379,1939744892,344362492,1888179764,1401576735,1636091277,922918485,1173215598,754829404,1014682575,2083157969,1077893096,1394428046,1317122861,558238358,1437803459,169418656,2021732277,577357533,1201330112,404797527,206674571,1325305247,1303003933,811003059,816373331,2051816729,288932944,2094425111,622357736,1933826422,1610744443,2014630997,345299482,656834132,94223710,1436575524,62086922,634675060,35115122,474013284,1053703879,533245244,673746189,1907155259,1613758384,1920690558,640549238,376211139,1855991810,970722549,1534143180,1627848417,2098483189,1354039886,779760618,1730265140,1088275894,711648693,1188207371,677152255,1262751485,367903735,1269164181,171718252,634519615,2047986187,310033869,36934530,173956909,630150145,821696045,573353835,275661509,1901556175,1972206178,176535869,2028861561,371890305,738678740,716845240,1327686489,485320253,1940575832,2048211270,810234854,1927255039,1131687904,1238676666,448554650,1040736776,726120589,1380888884,873222621,1746443931,163538720,73695761,469086264,278468347,1459037603,1665713923,1131890942,92129078,1051001183,1029247350,1330087046,317875714,2109745020,1698081204,1778598574,1156926351,44880380,1195978440,1065073081,299789293,314455360,920674174,1593779095,1273895973,21854735,1056250015,120754069,2057855132,2013677070,967646339,592823767,543178816,1892372126,1847012866,814857725,1082827651,1462767831,1685746019,662181271,1386653691,1882942490,1563062265,767094480,1227069878,1808944963,2072982059,1871615944,979268361,1316701045,1689099651,1162158108,331016488,1949708589,1641869855,1550660474,1997340139,158308168,793727411,35316070,470074680,345884243,1872588561,621731338,1836750004,650147659,1473509916,1133935541,275526199,1509744764,405129021,350573378,2071766857,1409398135,1472449424,1183413618,1936929258,677562660,1460966217,618818739,274199368,188491041,1528765768,142622017,297766208,1832418572,946413545,931927222,335783578,1864821165,1875154990,245933884,1990001586,1931681769,645389233,1700848696,773627863,702301895,2062823919,335850594,1945384930,1332809122,38583414,1676002205,167490845,1412432249,1957985909,1365057758,1432392927,1168661728,1157573396,678220177,1673535636,19189860,1719699198,1453503811,2021932231,1816474708,1552188327,1483432421,1326005036,140326610,2071081702,2000876604,596533728,1194652350,1114711450,1216045248,1277320270,507073321,167326760,446593913,46644608,1682315120,366288664,1244840080,255654731,965366721,1907542440,831709470,511859096,449187429,1867503427,1089888698,9892506,1809113103,1266274547,825283259,1792050133,977312177,144555276,1022472162,51581640,1056749913,1989080516,1271419206,1168876007,352193188,1468685938,505495716,1023349489,1184980578,954737985,1816429359,2023803406,78379451,728894610,570833974,1994698828,1902478005,1142408340,1522059872,1777317743,1794695376,329061554,1279564465,1892995136,485343688,1213372317,1880165876,489046557,124766507,687539350,600363433,1496191189,2011243343,490709292,2047623931,1360890944,1447837681,1534052216,520693883,557739100,1078754263,1942428803,1156704602,1809998412,1537307465,631717983,1223841205,1467130370,980193747,1413004490,30765601,591161277,1666200429,1153459172,1533974436,1681862056,1977332041,2031183304,998235876,1597277505,33438026,336883702,1422846652,1967809826,1680929753,1234271635,344154799,1678790812,1556283117,343140467,566369334,1066381254,1921778586,97080380,706518825,1991854199,1899194147,882242736,309122382,1910340059,880664247,313086474,825003162,429169740,1231067133,648654073,1903907367,675321122,8969619,1833881548,1011682567,400045619,575419373,326463819,1586532357,161757691,370939891,853100109,697780250,640324075,474177926,703209237,2089836066,1498508913,2072691857,60886536,1385261822,482188596,415757073,253073710,1259957182,1632250242,64575515,1823184550,937935886,793089115,773035263,841606600,109293224,1757326094,308011322,1651617539,1005455407,693955338,968580181,158334567,1422881780,1217391284,1976901036,1740091959,214673492,1738343942,57726799,760726900,1403787061,441902423,1758262715,159833054,1323505804,1425527921,1432457723,521037952,165763392,323575030,1469486582,1087262429,579395944,489135074,1078398668,1678541028,599058035,547464208,1603744101,1534122810,1894902827,1984109475,1162927211,2040489611,656428400,565376520,910628512,1269576006,1749582328,194521779,704757517,1755113245,56213971,820980857,418200741,1204307802,1214121250,133915083,215529084,1029153849,1055707709,1012241927,268669503,301180201,515040314,1395406878,838963121,53961802,1178182609,1313613470,92315914,1086638592,1809980047,1750718883,1572539191,670277304,792046220,1247871808,1786608011,529375741,1918285669,596687480,1068436455,1870384772,841304384,204079727,1679088438,1393546131,833310963,1685949292,354329358,1805687631,1678151063,1115275414,1043553679,1137227328,1120884930,1150897335,1599549879,2040645853,740605656,1058824568,1334094251,1112423071,1749635145,78808102,883691060,1178333832,1978130967,1299461419,753181346,1615560293,1702887969,1484376793,773901286,475928969,338062509,1225906447,90092662,1203295593,1261160879,25915364,1474445737,1851798967,710512806,937097931,110734546,1397311734,2063072654,1807460571,1836415735,901645621,2094779988,1242837115,604806943,1610892010,1341181800,1523935436,1355527659,1688251820,1662651706,1772482164,490741532,1909335371,362182678,111117848,1003682875,1431996702,1295972992,972376119,1369713622,169595513,68016185,2033291452,239178154,1346933,1037003511,1738232128,472020377,886761560,1486904556,1630879382,300937354,1265238987,723305613,889392902,980064858,412621079,1069216646,1805943795,410562882,622830205,1394640959,1633796038,1866401395,735508672,617591068,1338878684,856347609,935371066,1060289481,1802599711,2006414160,404717321,1884293132,2093707789,319431439,143818525,318283259,2080810235,1115768390,109541700,1204008535,28854045,1833903345,1468334508,1183613660,697401618,1633292808,1326075188,1734846243,205854588,119753929,1748028055,159912421,1657924411,1357573450,1806509118,1088174525,1631521201,1212764598,1276930514,513998364,1412650965,2039095487,1589601776,503877036,1764527795,728579658,979521027,1963638802,1454049655,1465241570,250330017,132523271,1989374589,372334218,1090503279,770560460,1247078106,2088480641,1197294639,266275025,209748785,1577413228,2066278481,1476092598,1237355652,1383673018,1805055774,307868480,312694915,1140487683,2012137655,555851577,1486775087,192712630,490079684,1627871526,534187920,864028595,866174329,1633492737,1535260035,270150820,1296475039,1113703926,1898040038,1067604285,550641827,303400221,595610702,98733861,1457460753,1710656082,1676278902,686554242,316987800,1250149338,1551614051,1440425,1552528083,89979917,286625685,654844582,2063700301,1468971522,1933305454,1467429086,1179413918,1851968815,1367027979,1820503587,250354036,795778479,1119557334,804833232,455617096,1878443025,305873679,177975478,905204059,1312377620,106056698,871038620,956500488,162942210,319321002,679612712,2002011720,290386752,159614874,363695669,1406264349,247709911,934731701,1696847120,1743488727,207770901,1416773436,187896880,429414757,1683254667,989736563,495690042,560497833,2003784703,1768323784,779126735,1801518247,877201760,1095778896,640024951,49042367,1941356435,631180329,1025302830,366069110,588965277,1515584276,385504367,1241322847,1468767173,389660768,2099134245,598404330,1007023939,1160827066,14702305,95405179,1760297041,612464681,538781766,1712732780,69898207,742107020,1752226523,603664848,69420931,1837670226,1595726211,21509491,324512083,1849444238,1352681762,870962930,1241254738,337862092,779999251,110380229,519825699,2043107857,1794953854,182842819,1038607046,1132863218,1755647418,1266115665,1582980692,762102069,769558012,1901019298,271673976,1532705544,1309645935,820257111,1700009423,1173414905,192245943,433032359,1280533411,471062838,1422130550,701060555,1779171274,1843477030,907403587,1148752086,1040619327,170611700,1183373389,1353389577,1118513957,1634087721,1592555979,972087821,224211193,665963120,790946432,1117120883,281145596,866797121,1176618166,2024530406,1599904662,1365564432,592289615,547630490,576834204,182877467,1882334275,257368735,331708628,98865728,1183338953,467909341,1390983098,1724279620,1188855634,1690613379,1796651825,235633057,331397505,1676732506,1030322233,1159174657,1615010439,1061703116,513473338,1625681667,1881141678,1729890633,121041264,1595353943,614863419,67112833,1701554269,895413860,366619032,1117666919,1973224460,956681594,3671843,1046728680,1449877043,837956377,1067371878,1029981865,1919837734,1357805282,862192591,206836016,210015852,1764480998,2128766833,1177880054,1115313558,911867108,630995283,470886151,498637003,1469281083,975134916,782525734,1648060933,576719889,796792848,80043476,516026251,1525877597,1331722520,856781469,1176282958,259127288,662291107,404405810,1350620274,455194421,1040247514,1166412946,1375726525,426102711,1490291176,1760463264,2066585025,1015307761,1657910162,2084001709,1149136217,958226345,997420168,1884115822,12169760,837495710,1589819066,271098540,1107529873,1804551581,1555503545,2022675285,1946159723,1861687918,1628426765,553651438,2075617192,204713428,474051495,393677836,1395049617,1101069597,1659165488,158995959,168898577,355784166,1887517379,1310502923,1088274180,758517415,729960853,1480936779,1061557914,1449171673,189018693,1995724489,868303463,7644840,2053087021,528484316,899391054,435175255,1429507573,567847646,2014343749,841349674,1974919098,1234053069,2084767568,838102999,19813218,110422662,285719296,618842454,904522182,2022889278,603949259,1394113943,1081274635,2031706834,773730856,2032121103,952235307,2094558484,1129455729,1559604933,475126059,452974635,1167445904,54112078,1868221825,1072285741,1611802733,948763883,1690627532,393317553,2001736368,2040711360,1728874670,143497928,2061227191,425632646,1888293328,611796088,1138266751,897308103,1276291398,662388364,1853730667,4403802,1510403627,1070603901,691113496,1247559173,145020413,897314462,1687283149,2028767401,648451462,23742667,125511880,823212997,159527876,1334214208,2121205881,996159335,732852773,1285734440,436560262,566774257,1194013582,1494751268,2050176361,738785424,1164644572,1163048190,434393149,1703637996,659844797,172857997,1717904237,1361881071,428537519,1581950797,1336270297,1353628120,780493629,1307510769,608806484,376239080,1511360019,1958848863,392290059,771367252,632632627,1442406020,635951973,1361078938,387171002,1629107569,1161202326,1124261991,97123099,527224816,367300827,1933600451,1493882969,1478693568,244345921,1655008978,41563736,386838057,867323602,1393544620,69703912,574908992,1296255697,529377439,1517013556,1854601984,1151046829,1149647710,520998527,248778520,923806873,1664686963,1214957311,457177837,563835379,685949647,1604755354,1616407257,1036159410,426655186,1499453626,302703134,1394859588,1496603809,940177031,1962165044,1470233816,1898377849,972150259,916392166,724564704,1380716362,1457239529,1157992805,1005404942,770280982,292066903,1376399331,1454219477,1415993126,859297204,630734175,243410927,1111765564,38228865,104928143,1102841337,839893471,1268067056,1782150182,362270686,161936328,1918950335,2053409215,1478947350,367568345,1420266719,35873260,657211231,1293400187,1875991942,682154228,180743399,481207496,1457891935,834478434,1998747585,1576010451,1905496093,2038709537,1221268155,1743510154,225444044,2014463070,1439205902,373744475,137154071,879983984,815094385,1584343622,192242657,2130012974,1264219431,1892765052,831254511,1589780637,1720502885,1075716412,697092595,464966180,1539568981,427950779,1567501662,756472483,1733534884,562609688,1189755978,1255473376,509001855,837509742,260770416,1495384776,744801509,1479562550,1396482136,95103818,1846138766,2068881522,1630623528,1742184586,649080631,1278876411,334445783,725479863,1564069916,134904662,1093772374,1395776761,1319162872,885017917,2006134832,802970494,1612329669,1709103614,1203990906,1230991429,620756845,1495090901,1337570784,312374733,834643584,1326971472,185801388,30534116,1941101839,1440657081,1116700295,2041697481,1764423487,1805359078,1148868877,1229598118,1311106201,993852737,1140214675,951473016,1886978144,1274870154,1518155358,1473243415,936379425,845182395,1031906247,20850201,1676014930,864311218,5482838,1494467350,1534683114,1646536950,721027539,2051768377,759110917,2029001855,484800739,1597352368,736461759,1947165058,619299716,1651108144,581540647,657567356,314734451,17304662,206200853,1305659389,1939454457,752373257,820375247,2086637571,110173715,1475373390,144051997,1753619910,378975523,436517093,778047725,444385068,491611491,112749081,612049986,1383762277,67823032,1853844624,380030405,284544789,635827591,2000712601,2093569836,1955789812,324088871,1961946514,1164927110,1360365761,1368651834,1497721313,2128000707,530332608,1460243320,1472526729,343625506,1178391429,1668417800,305483799,1715261485,1978184563,297748252,668925498,1390746349,1779627254,1875324407,388715347,1103915402,78320070,840162431,102758848,172407173,2039290894,400064820,1943774559,1587241658,1790029437,222625852,1380351326,2014191731,129543080,396080643,1809552851,2128379766,2020729684,1434159368,1555086767,1177929650,746705408,1918625327,642413314,764775445,1416774369,846709742,2051061338,1272753216,532173725,811046245,1965252937,1296399782,1459246132,749068366,813615681,1221138386,1665193013,1906341158,898921991,2089236992,1493986660,1108346972,1915844496,2058938990,876487179,1553281091,249939522,1064320140,2116467062,1240077145,1171636292,697205933,1918741931,627102870,786121050,325566308,1820772670,680556131,1615923333,1977937520,488453225,1209189177,1167662646,313012877,183525687,466428527,752035985,1921437731,44853554,656262659,331310351,827313849,933635339,1475514327,399419722,3368555,729678209,1813982201,441847789,906048153,816882004,1493167062,710229788,866113345,1642071862,1658700715,801109500,1539957046,32607936,582189708,378379605,1881629095,298762774,604486223,1745890187,1164307204,2033170008,382605130,1386225383,83563491,1280713191,1001554108,1132061620,261167175,2081409016,2050087021,613409749,1211909887,772371324,934060790,56137569,983558666,1081711608,484196949,1479416816,306264503,1566396727,167562549,1625140020,849729076,1860543369,929497855,1394124428,259211636,1881858655,103553625,1103331540,1513355006,2130526058,755282705,1848607495,922830984,1660550345,1313854967,517580318,1864599849,391406586,1173836515,204029280,733898145,1812534627,2052327489,1117771575,28400312,1283269237,276335759,1322418937,1689896581,1712998402,648549871,610732265,1709563844,1212923591,255589876,978141727,609613307,1669484931,1243062403,1520724962,132524958,2059562766,1234254804,1081488990,1368900733,150338987,739006101,650225364,838873667,6449418,1776197142,1735967896,1814672161,1115025776,356715603,910306646,818560713,1446399854,224383120,1408008025,2075531031,1113066835,2089858062,755940264,977623451,1535447989,105807751,707947870,1983225087,334989062,908903452,1799576992,1349026670,403119423,598231287,742212155,1082876694,1982002976,139894271,1140373265,84627394,1990333231,2015611658,1714613514,501144741,1329515647,1053324978,1629985454,655057384,370748535,630186018,1043099748,1010216645,2070091499,703279714,1897292062,1458316904,1907785368,1126573801,59035818,1772380255,798112541,1584371483,1359145913,1691315282,1532418698,659732358,551343810,1159946007,2077648271,2029686377,788492593,716279196,1593302437,344447261,458052242,1799096267,535464541,1593941170,1882318155,577014703,283971931,1503939244,1013708552,1741318575,293785346,114661104,32071115,622751962,2021044479,1072235544,1537590492,982728049,470352148,623141803,1644690012,1870324776,1210676803,818901619,1521574651,1937385220,153494694,253716456,1886062554,888636935,80147372,1414108810,2125399840,1402472537,1368487508,1078674572,779094759,1206859716,1606979661,531737404,72230755,1870718367,483201352,1828968409,1631565035,707124216,1387898407,2105659504,902651784,825498561,141843243,60588371,770635696,1395826623,621972218,2022017639,1932274279,1776653635,1570152664,1996620052,1046898998,2045943397,1581712196,657006022,583617734,1042258037,935187284,868971324,1922349618,1761599758,1970355738,1672389922,1940631352,1245420503,822318767,1608991918,1044389628,652654229,1557634639,1163349923,1193403949,199071636,1612575909,1758663451,1959522078,217717984,38533531,844598629,328892168,1203978647,1580369529,1582311037,1114482173,1219692218,2059547986,1774316679,572187052,322341270,502390762,1920007263,805255416,733741170,1223947536,1018170335,39291068,385860662,1008439901,1977258305,1873610236,1950673359,68318766,128861879,1915316618,1347197877,278528889,1700384622,1995111287,1328543302,1593046113,797833589,80069972,1800019237,897251736,629844524,1406525814,1402403331,36095097,1023513500,968735526,662626379,1778918887,1957509403,656340635,473979397,1134470366,1393653360,1309954330,1899258881,572016400,2059105437,1794461922,783981987,1692418979,210719579,1949876558,2078730524,1875508942,1292624344,78638319,1750200125,636038069,2108943411,1955133544,52307291,566559138,1174083974,602027636,1698923955,1520917684,883329228,501519309,2037814053,1239696393,1080873396,1352683215,2084151660,631200159,136524527,407252961,48425625,1542596461,1474011074,1356501925,1904734350,1472816926,1860909955,523398521,138612196,178725922,1217595826,1657365865,326523990,1121840736,584757908,529721953,419682687,2015671781,1146982333,1553051543,907562102,1942159854,1560508905,1142927206,2057393988,372578292,1186933225,475962282,543264409,1681398595,478683156,719589136,733440409,1205864074,2000676233,1310060746,902517476,607043596,763031442,259586796,1708287701,1006899481,1756860773,1040222698,1618882777,60422636,1678256350,620926817,2050228738,824002027,1104108464,2124450246,302297226,1463472951,1430352814,513950563,119855015,526678103,53239492,1024154862,1908744517,954960998,1318769865,1039665084,1959860068,895795505,1509603735,490656955,1517284977,76261652,1167578593,1338576675,628460811,606506047,1428937612,815095981,384123745,999879122,1813506900,1118331369,1566838569,911185956,1913787352,2109038218,1807721351,1303128325,1621958298,459213878,1540917222,1969533858,1489928094,1465877455,227500267,461525271,1919495788,312170110,691548309,921207597,883672573,1321764689,94124757,2112661167,419100516,1428479534,1672256315,1178201969,1802082246,859532466,375406315,2127175395,267759917,1547185421,1945135767,1836107786,70291274,788149297,241856024,741691018,129666044,1554477149,1335846670,2117283679,146652855,82243802,71231390,460608714,1430806995,739803200,1723012293,1021459729,1529038781,569802854,799260815,200509109,1921689458,1930794803,1532963242,2050463273,1273277953,385641018,453999460,1858354340,1399939193,525426919,65536078,950858873,648103893,597234655,83814731,433117741,1935538367,714134919,1702564637,610868286,1356659729,1572708047,1546259776,732544855,1879859714,257097238,1447841873,353390126,2092664014,1618099475,2015217390,545517523,299492723,1843391671,285545501,355355121,241204607,357261010,1871708662,906649629,1907175813,2017784549,1323684513,1578572206,2019088841,212767426,564868831,353741647,2095601020,1352502474,2039629931,1865315595,305579468,691353452,194561308,203134965,1435564030,585869978,804466923,476729711,1464517485,1990945785,1931212691,467446805,1567241705,453195980,1846242904,471569830,1836942875,2107042631,982284524,964481244,1986729206,1896111618,1457011870,129681427,302176767,675200433,2039167215,1412598946,1649298693,785719756,395862558,1712746344,535387404,1843259126,866811501,1924347582,1895344006,1935641174,1236198879,1298755816,741419960,1319391708,1825891065,998663263,1426888391,1567471379,1845773035,234175774,1491135978,19238910,784787740,1161878040,1721270343,491496569,1184482671,523086454,1704429498,1780924959,413552578,1460695357,221527968,1497611805,904527209,369253213,776020975,1356141780,858666196,1232567148,1436716581,1287812581,773120014,74550945,1870530607,542235223,992616493,1822510673,1214909885,1483079923,2020161938,767811059,875206223,332937846,2124803391,1655885759,34690554,1833783674,1580771146,687751185,2118093168,1990248432,1849618537,1233079511,1684377489,281298349,105050002,1042095366,615807155,1288599882,1265787675,1750352798,168964978,1674479207,2039718928,1524913414,391352200,160862426,2126263758,189315859,362225320,682921476,921369647,689732141,505399738,2099448896,1022851559,1385436019,171159405,343199014,575902107,1487809090,373811522,1669811631,1307038582,1208002848,373359952,230944007,1678486867,1198632739,505055710,1204349795,1171987881,1124719877,1061989765,359905242,1187608594,2082081314,278899756,266680649,2083336961,254228157,1428612474,1991667552,1165258255,2105807597,634121796,1659615193,208022067,1994283164,1341094624,241083377,1884174152,839420050,629944998,464038198,2125138901,544319893,199421571,1241241858,674558998,692323282,1995214913,1270684328,1748462147,599424914,707219549,1331235136,1690223375,618231192,151233703,1028721688,1580307181,1738228200,396128071,112118917,1611522617,1548241763,171432019,1605231799,367674528,67628799,1131969377,1537495760,930450041,1736279769,305554575,990457157,1239711024,1606896760,930515444,281591704,1054252838,1469221368,113526725,2099574335,1661043570,1481797663,2102122841,1836036609,1157619149,1443308239,1453950667,336964781,2094845699,1668953453,857986307,194047820,420354716,1608077618,1213919977,241460036,641055215,819320304,1961766311,1811549853,1196093163,268699556,894757434,782481791,421361910,1090965707,771429419,1422438200,1866192197,426664322,1359484540,253632480,1885436913,945399964,1384627177,423702054,2033825656,1329738413,1020036612,1206033470,889464585,678568336,2025742986,705416487,1545846800,1558756090,311173440,1683620385,777800904,723268780,190878228,705901867,1205091005,296149168,848930190,1522128785,1575840109,373934886,1774129516,1130562319,1572393334,677058839,1186871885,269132846,2042207917,699310214,1261338636,1296105223,85814444,125687939,1427536552,1442227808,1280129177,1350825129,114715829,612076316,916356635,640534275,1808903053,1727762714,1923760014,801648270,934321461,1062953959,1643268221,1197468523,1308397825,1493150189,1951234514,1130675531,1557927701,520636291,2038435592,154808968,11484223,1011032769,516768080,2057267124,1242934263,157178105,1234887245,1447508851,1514315858,1996862968,1205183297,1237532371,2043186916,325994110,1272534277,226673378,633114840,2018722341,1438690468,2005956463,1622051306,618629674,224509603,375629566,1795630178,1136469996,1269040228,299060409,155916423,224465527,146622884,775450229,1137800010,689748002,922180167,561785544,123075733,1334108519,2083246414,1217496633,1869267958,2061162500,291063654,874064041,738294987,317892833,1501301986,1239458232,894687879,794564734,781274440,1392940971,1630544452,582515058,1819987322,227350875,104957774,237970686,1714892313,1995881056,1972615436,1661265924,1315225690,680415429,2014073195,1925963493,739048722,2005304437,1262546274,1810934726,2081905760,481760845,718934360,1767790376,1512301109,1860921734,116923938,37343379,762419983,1615961897,236197816,15226596,603371395,2019884481,396176673,1288556379,2017842194,606290,1819770096,673888688,1053496072,1978120342,994273650,196326173,1159705905,2088384996,913766869,956092499,764406205,183632518,1900547895,813924896,1021099818,823506600,1190077827,1985587493,2031296468,1725345915,493827495,117186813,1985059174,1010360268,1291845479,1729756,1659246704,1266535108,811312645,408771314,97410547,2062722448,1358138088,1928950537,1691541768,629926683,472190300,2123330788,1927455227,370956550,1209409672,2017136731,2004596437,933190980,745214336,1609316042,1595135595,1110330010,3569802,243384059,750931543,533038884,1991087299,1851680412,661103217,592220765,879011767,1080071406,1693878148,715126446,705658218,1028474564,822554926,136970908,248050148,786949672,104168294,1837622445,17038222,1797951493,153083124,1399366104,1866799890,345540353,1666912536,1316887461,849648885,1149867742,506854384,201275504,1746739967,1543058102,1740606829,629336510,30640412,1830368556,117837396,1563843052,535273022,1373111252,2030934881,1447958881,2020845097,868290935,1567333281,615872019,858482735,2096843498,587425799,911961851,895980386,1961590856,19324116,202288,763222754,1832873054,1569357288,2025522074,1948948779,274774708,323008943,1957283477,1298863925,745569132,473542274,933163040,1946034485,265068338,1608704475,1294509268,37786495,478281241,381677210,2093711405,600384237,1833053216,1132570141,1383509367,547779100,310945511,303941587,1005685949,2049484348,784214866,99374061,2051923118,855995374,128351101,1256107097,1989184793,1000991684,79503773,612836741,212833346,1152290751,1672620478,1280173209,1650337862,1067521659,1744882534,1743796205,22115840,475475680,2031271581,1035929769,149204551,159600290,538917499,942746626,1280167814,1168107639,95342066,254091161,1498171881,717707052,1995971457,1499879409,698186273,337861687,797273833,1599878019,603729370,1073226841,1719976288,1319188349,1488112416,778684730,1705905268,1087157847,690293481,1980216084,950004353,471975143,2087721878,135043627,460091246,1521380958,641524167,1049848877,1301040254,1569901436,1959136472,312811867,1173752282,516843261,1671539220,323492013,953305293,1479955301,1290858338,393504499,619068114,692337188,1872621005,1245490528,1403615514,257128550,1860520494,92003013,180402251,1892870468,2084195067,1093293820,286190453,885056663,293209971,437084560,368919355,1192711739,66641434,1768711876,1367729796,1974360713,1254260230,2091181843,76151916,448251136,1962664695,1156235568,1148971628,509200259,486811900,732169818,1653972246,1701708893,27339875,582388473,957194502,1325583968,136790878,593528626,56297738,2039240216,403590726,1296647047,1938127723,811219729,1752963831,1759977198,411245972,1809621103,857901550,663364501,619421677,1655917485,157925397,1251552463,1785948338,1528440162,2068408653,745572263,896952640,1114660191,653043628,504847038,729091452,1629001953,2056897401,833547674,1827481920,531319565,2079055455,218302602,386117467,441147383,1722119742,138051097,1846829292,1500063632,2111967152,974376824,1798246921,274415822,2129217506,1410307729,1482294049,1675438168,229137026,103418041,1237504185,654855048,794203840,333637844,558939528,434243168,242672832,1231210160,1352558992,1071003783,360442957,1995988569,2069166199,1765912116,2002413252,296340115,613913209,521885569,2013418327,1814211860,1858266934,2064389471,570627644,278639635,2005407257,1801870116,2062486621,2080005193,1729543651,2124079023,1415170764,1136678717,850423665,459180115,1407746653,1202743939,1501990567,1100787850,2113925983,216543336,1305606009,837365495,984107017,359983387,370915433,1194015302,1187657922,1821995831,1476040165,615436198,2025087977,1432157416,1861892701,1576989324,541156949,1381527598,2103659470,1728588765,559460165,1146009619,2034678100,569326098,93233880,860505374,2033562133,1064805501,761228791,1217211852,2094458990,959164009,9840501,229571423,1802081682,1283114742,1909930326,722542700,265426593,283132396,1385764787,1187741937,328516422,934018806,1121973504,615275625,2118072585,1401594829,1086031239,801273299,1928280089,116884719,186040334,2113590474,1823631682,2098245605,1532404346,1205770161,985418890,945375140,474812760,1773691981,2111919036,1258569060,653039775,1065309077,1796291019,2078432899,241861086,415184955,981115552,216920445,1783235642,530907520,2072704371,1107803498,948310757,337756049,1228813231,711827576,682918033,1027395482,1205982055,928802047,1896752481,1825499784,1161887826,1663070310,310515538,1318941998,1957607162,1111159511,1903548715,1927017521,1387785034,1869143889,653236174,452259308,115247155,864631551,1961525571,1615163318,534370653,1142025750,1080682154,1702615148,1816056378,1930859095,457774711,1592118037,993291450,1092252395,88618148,1367624230,1836475274,1526034531,167520286,1154082858,622190555,1224520183,1870334936,1734994162,633452763,1964002783,2016168622,1436349523,136679643,1108420441,950270311,850248267,706101146,1805929640,1487203547,795243106,1846319851,163220443,2063493783,1823791642,656751420,2009757728,432580719,444050831,96259981,647131983,1568021731,1600525568,2085714808,1555399840,714087830,1461253605,1125090289,1300527769,1348210894,2110308744,671591452,31138779,1024885087,702076805,102703361,243924695,1926349785,2067813666,1917263321,1214254711,1002443750,635183380,2129618121,2081628845,1293676411,1702351141,1776423136,387330082,1787057223,1531795279,59623218,766622202,559314361,1433548252,1925201263,1314346686,1381596131,908403603,1693358191,1001212646,1693221659,1145341659,1746854133,1065715607,1984377554,1703446048,1431579815,1234773456,170364594,1981969014,1474325761,911569670,1765178386,2032123534,1384905451,371179658,45950207,943861285,720206565,1136968615,1776266894,2104096757,1267182253,369157975,1445941225,386148762,320645663,1743105714,1556680874,1613410610,1970834078,886756545,1586666880,1645739826,1540608043,1092340755,1493898684,1371312031,1064730986,1308304333,1243711043,44834646,1110463780,1970695443,418720753,225831128,319270699,67318118,1690177313,1627354122,1057215814,1575554803,173146335,882748901,1233401257,1791918260,504511437,1349358087,84712520,1589903237,559115882,1003842423,1305242402,1738808926,172940685,1185470083,1866424913,1546227583,2056538388,2042200664,112752129,1556855501,256315540,1748866702,1116446079,365281419,808107303,2041121550,1710366396,55443240,2017017101,549465580,1267659206,1230601842,1461420031,747157614,1216927083,1486905971,1879256400,426392633,1943398449,1044619318,776926786,1737707887,609596415,1678305630,479534684,592876973,1075932256,472721410,1414360669,1750157571,1915119866,269250731,458729589,1054116834,1592834379,1471769973,735827337,1081639201,452632585,357542321,2019216293,1133174413,2128146432,793617067,456146875,591489609,70379411,1853086997,1784433310,983022645,1007767306,1495791023,510256350,860500324,1204103800,777010401,840559224,874740642,1359621163,1700089716,1276802004,1635484916,1134291443,1920163807,1662091349,992412039,1820627009,449957619,1120857795,1688764473,682650044,1821783472,813857940,1578553645,1857821570,494680963,380735409,1869127505,363746067,142351577,1358599561,1506565520,1643302546,199039197,775865726,1335766982,1549226361,1670744693,1279430813,1801757386,1636351233,673425304,198470673,812580949,363372545,70893134,2019325332,1839240101,911964003,1127762922,1773311374,128390363,1587578740,1550419742,1571210222,1225317173,907255784,650717888,2092420361,1571008173,850754321,1782908996,1243108022,1282852827,681767576,908839584,442294905,313230477,1050504971,162403549,1753993804,1691507792,564107464,791813241,598850742,1641224876,1650493316,1050575877,18845645,428336326,17389736,1054708682,737391391,842151263,1500787331,635820434,928539900,2130400464,1241987791,1994686891,1375982353,973409877,904528518,1727729154,728219020,1422534388,1753961862,1296855992,967534935,768548803,166065090,211393668,852377484,999311793,1933288090,796033266,1399546007,605218549,1716644294,1454115539,732896040,35916549,776122189,1251397522,1675222945,1007893857,879683081,1536004489,1627270212,187696723,310506081,685836017,1179142257,1740507445,2036457320,169963366,102788132,901606970,2063935275,2031754182,1128966145,1065612770,615508162,1786759389,1008488244,148300614,1735901382,139780548,772628635,1218492711,1977263506,1227062471,1236324386,791760215,1174891561,738113348,367385117,1586397480,599306633,103545344,1426388200,1329825606,1139391114,1539057941,1893878764,814123071,213960195,228825065,1941099756,1155792879,177391932,610433389,990795133,1756659886,717125349,1652110552,520003485,1980867214,1492265079,326809875,1455429562,1317314086,609081324,1322926925,1036785055,1875853885,1837513131,1042759635,1703780653,1648959790,2055044363,1701681319,677459913,1355323111,2026842911,1922408093,529447577,1214249191,935723762,848627066,1586100185,978120858,596265700,641522419,883929464,1251890967,834641037,330733208,1646344137,1366123428,226430691,828801306,1470918785,1692230960,1933806027,1557682868,2060690497,946456726,1048534087,923303651,1026212615,570704312,1360568729,637250771,471969358,903450730,924094095,1455721482,961702429,1190832379,701474510,814064671,622994087,1687654625,1516261271,1035101503,449065936,1518821955,1273933410,494986543,1016612558,1910025866,1087962085,570072476,818143475,555930174,706654067,1193182787,1778368173,540927472,198003846,1428323660,670201404,857148845,1849495640,1575161661,1658118725,1991452142,2079030736,364555919,933042714,1870873999,1427016712,1408576188,1443932011,636793844,1950127334,120257905,1106644073,72868966,1255661250,782567331,1789219010,2096532207,1523600828,659900523,2041792826,553161327,1582834671,1210035474,6822301,2031672494,944622941,286330371,1687666751,593240793,2090842109,1093945231,1141344897,885039499,1510423017,734634734,1811923278,1344516011,423071802,1744362960,697704489,198511994,438396917,284787866,1487722930,196275305,2121557557,1876421390,1272061455,319713142,920418562,1796308797,980670876,1200461941,986080913,1586796275,2011881239,260915681,2102382633,1184245368,994362380,2039441101,1460869756,1577938703,978374932,1970243358,499002653,2049025045,980592867,1538751420,635247307,988978097,736961336,479680374,847896347,1978157800,242573149,640666581,2063736916,926915539,1459079536,657492492,1665556137,1355706513,1933065089,654550110,572520461,1921619181,72861995,72052542,640308120,1134821234,2062182003,605314833,1425809173,1854344859,1608985368,42263710,67267889,632765080,532235796,38961700,1343192632,1699488804,1437943482,1494121710,1693487671,540803983,1648844821,73285650,1146520363,291982189,319794616,1061094342,1667712067,990592526,1231647601,892610093,77894866,1556031191,1435257920,248409387,139394107,1966547999,1482002508,576714371,2082325543,1411924027,511002599,1049754494,1019584095,1644965196,1125429679,881579333,1992961595,2112953292,47350475,920654259,826077612,2076531721,1772699089,1488074601,187718458,1625219411,1950082470,468626603,580206858,1550811039,820783442,2005994348,35124973,351017345,504673643,1721717643,376460988,1977874189,1461992047,465656999,889856422,1924617227,120734239,2064151259,1431611844,1099131810,420161412,1714128192,407532403,1757321027,1641483613,1883758254,888832560,1764438501,1448275459,684799506,527171902,359551784,815713983,1925769596,351194522,467413621,1326164602,344982976,915979184,403786982,599867733,137966154,804809470,1713579979,676849676,1888259403,1877171188,895648282,1380677037,452742086,464680066,694225593,1126006223,1680032256,1075615293,319611742,947657647,1948202128,1313368914,1071050536,1318851645,35133358,1638310438,2126829864,1836959152,640462228,1424656793,879046930,411970358,2036786128,562540408,1764832389,317611755,1099685743,293051231,1772663571,729390435,968020701,1756951235,1647285671,988925246,1708407548,2041052377,163409734,1905407018,847362549,199425925,1508051765,1597064797,2114902909,270063568,1762136445,1226796745,1752343862,1740956248,1226073233,1091401133,1515577193,1718332734,1395565001,548457553,1775097187,605382830,982733137,867271879,1043165514,2025581681,891491772,1763672483,460182313,1277410819,1288860424,684992866,506750244,411931570,57571457,439737987,1293111491,322989554,409479590,1867738419,481657763,732216423,1680594354,1181809964,1568780832,1285720211,692690627,404848922,343694832,754661943,360915358,167958486,1736680781,1509887854,170260159,1062524984,866297069,1487952052,1538269429,1227339453,520949114,1295574367,1934876151,346985982,1988008552,1489071605,1718533715,365280673,929272047,1141787339,1202454303,108286481,1597834592,539414463,1922779674,1739681161,1752902944,899924454,1588086085,1261539734,467235637,1442194515,226218126,871153386,710590407,1424296464,1005210898,1608282564,450907236,487850512,1407943000,264853314,1641750600,2050453830,1366213437,1794229619,289086753,820781378,1752549762,852374551,833834687,784393121,1946692419,1911089297,1390347291,338609055,1121474899,1428199,1035495823,1201275199,1369523646,445074743,741880998,877772191,102042133,2090547458,1987916805,1605428249,1638860249,408479865,246696971,196700587,1333091224,854483829,1678592210,132636175,2095527120,61923794,2048634301,554082968,44781935,506284379,866171110,1929605057,2081408468,902082987,1097955273,283568484,1656931468,186185641,1521765141,2013108116,1193177880,2020181053,1955169682,675477556,860296464,1550154420,1878033925,1665588521,1940060821,1061014492,1468869987,226526657,1351814553,936279182,796578190,1098962406,2002846084,1719241538,1945832614,1021755045,1551269445,1399770530,2124742262,1977381242,928239279,263006606,1624958531,1846795405,914546997,1858809343,1088817832,1680977014,1680329107,741554291,14695238,1099778524,1855640959,1385742903,369617470,529292497,17235983,1166608726,1510052862,1739576284,2078704923,764861826,1631497257,1132536129,788221311,1556800031,48510323,150550698,2130045141,171488633,467732540,1672442543,703915068,1037815795,1804439139,701759216,426623416,502333256,857239608,1568162705,934640620,860376518,267509986,1193510267,313647805,1590507956,1305365570,733475434,1751661496,1799572938,399941572,1312242811,1019718728,1994353680,1970498974,1076861601,59542211,469658600,332866975,186579259,1361317510,925414452,331834065,375698962,46697852,1159799526,497383299,1394626121,1023810439,144608986,122981421,1049368258,283693343,928288010,259777419,964981205,1508827763,679427138,1829702865,42154159,1773957152,175770553,743402539,349006939,1652610024,1210195426,1659713825,227975091,902966669,1986012909,792726242,1979610412,1081626193,647619459,1077570613,1962925168,164134775,1156707971,1383875033,1038400679,1722458889,1165964133,117032737,1359682138,2088577864,1496558266,230906462,2054369815,812282152,1619362519,1714601119,152598135,1909663136,55595169,1288840028,1164998079,985800972,905046105,823479266,1809498404,1413419105,275125438,2009651531,1508904894,858211102,465379081,903816194,841581455,1003931239,1830959517,917367857,1166313444,1494204637,1923644660,138059085,438471374,183049829,1365020682,145014127,881646217,1174428786,1795777603,609802238,1175518344,597454965,1825660369,1914765136,1800049717,2031492938,14426158,362078878,1934964622,1076210920,791494686,467021141,768272877,2005329081,1934811226,1096761522,2103794005,1217477876,1845343358,2024354532,1769999597,1516333738,1192887946,1544658847,1188565955,1016326232,121058074,631349640,88851140,1513700863,1876846888,1654987811,978136128,1405203809,820564520,1630444598,1293117336,1639620153,332389486,2022969858,1029318204,1473434729,1061863167,1281940335,1310551158,2073565491,99427836,57823179,1418872988,1501188184,787701112,1908796311,1367604545,1357575505,141414137,1862997722,2016505479,146703488,1005522496,1109113997,608664242,1495990265,1539875556,427839409,442480607,139512154,631133336,419486615,1289021804,875434525,974835198,1285959046,1772952199,1915018003,113917922,1364821037,615665746,317469372,1686328752,1476195275,2009843938,48080447,308221595,118543457,2063411865,1596090858,713255928,1043159811,2084743729,131972450,192122478,1646643508,1423426266,635691903,920034924,1240102298,636669524,423341719,1452769128,591370740,126023791,1371020228,1865460316,1659264037,1861956748,2053486740,386411843,279818294,234813301,789200874,1055827714,465924478,748373960,995990976,402335882,2006440335,1364325901,408569149,1273861874,722792330,454506899,1149355523,753049829,888700935,1308772748,596777263,318622853,1444756949,1767005674,588084926,1654947788,1375313556,295633668,1515149407,647264108,707560055,10380580,1283402228,646515280,1696134679,254907597,1131189282,408494098,108572011,1657176692,1015073022,1484039436,1535647025,139767980,804545440,191049869,170804869,118539895,169120033,1859892502,24459040,2062261502,1300424528,673082022,1802486132,472426821,439682031,1339363450,1105491872,1499505519,1025472641,1509515884,369646612,29642054,220442769,1784524666,710816748,1582350643,264442830,621411833,1010333765,1520459265,763271142,1995100145,1072449996,1242736406,887574283,417424290,1962755203,160145583,1985793969,1710940986,1829856868,9838810,1912601406,1846697923,989229812,1491033331,706089602,1048182848,924953248,1889774865,1024163865,542658719,971267778,407000404,357666273,261314599,1906646962,2105731003,1588152340,115494311,1495370257,736619745,1424426055,1391242601,1866012212,2087323294,313765351,1351253095,295722848,419621280,1420099670,1949484660,571267675,1694458443,835777215,902616450,665554880,95406464,1641830935,23587658,2044987678,326449781,401644954,438626945,2084319826,398670885,939452932,903231852,466936933,1955859295,6340409,1102593138,904782289,1658704771,1994892544,146512621,2071942095,408382422,642034824,644056362,1474845585,1197663045,1550526051,1987716713,1407069519,957331944,720628414,663210876,1692617049,552666142,463670770,1931650793,317712354,656482640,823631559,1376946854,738579710,1425453178,1183373309,383097090,2040935348,1636473216,1941457095,2046771638,480991574,1542148962,71611028,931955005,1867769685,1745382079,1657373359,1345485890,1241381692,2126383013,883924786,1140701189,1743162679,854161385,1572790366,364582928,829342745,778019165,575008776,1079214171,1055503683,764511481,956905868,1508120602,1802266792,1265037299,42473988,109939300,512194489,592342836,1382830127,456039880,863664506,89949589,1057468613,1337023454,412306214,1705008403,1607553279,1404360535,73141716,1114314441,1376047067,1119427779,1034307925,1556048533,2039791950,533528556,963325373,895073165,2048415958,1114424443,703653394,1648278841,102448236,1717699687,411712164,1920001010,1156248010,2075515649,441415398,416621604,1718040481,1737581016,208067549,1157534074,655563321,614873131,391468882,537407630,268175878,51854406,718532925,1271917892,2072489666,3694438,922249140,1915522720,590430927,1996316586,1068855838,514292574,729385245,1031773991,1857165128,163850414,1599419483,272511940,1295138816,320791347,1744116935,1116940310,205044838,1886262241,329747747,463283594,538363824,1400952741,1881293638,377422350,1627102990,334188911,164034152,781037084,1293046627,1910405477,826209637,1885156918,1260095357,250528540,164192319,419873747,1103853505,894052335,1036634567,562623370,742783628,388477196,1804594949,1658435492,1581901,567959566,433111600,774642669,1186848123,1815249535,533103019,1856275027,98258821,297693162,519790835,1840380354,1048046627,97413892,1358385370,461395686,19575380,669751838,826936651,5746961,1486993208,336907828,1635762721,565418172,82682653,1247498785,1239546375,558469905,667605535,752464771,248362901,1234212514,1162166687,1999499997,1852003042,553839755,2059893186,1599531699,1256727600,616530632,1832777431,2122979105,1662392986,1497433474,1883788632,1904243895,2985990,1894287583,1605776082,1381953937,1045200424,1583465570,583319110,1675672551,1677119531,1951046479,1745070460,1124078684,1757882962,1388371650,56517961,853386020,1836695853,666715575,1181110636,1308618657,1149909704,1667181100,197396583,1550724976,167111018,1432676932,86610651,2061660891,1946436105,791202515,1458125153,353727507,625073036,465144932,1241884538,743922734,2036610585,329512190,970096960,129275537,639077253,1850778122,1166723592,316237235,1094976504,292609900,287741112,66095261,274437551,267562447,1681497706,1340341046,972506354,815845170,521583333,1344614334,1175564604,230912243,149674290,1143288053,441050805,1578964936,730407873,2072305074,1883447913,1991255730,2128705253,1739409821,1657268470,1062108534,1236451114,981285254,243484649,583565881,860349050,1041672171,602373192,1580992540,194048808,1515723904,1739758968,1709152187,307138043,556617417,393697716,962723321,878084779,1381594243,1949690115,1548646585,1053195077,451217771,895767724,1803169011,2049705196,705201543,1203594229,2090452776,451440184,1169022183,1053717636,303576037,484108793,1288176701,1876636809,926525168,980835607,1031692541,479026071,652552302,385410042,1913863340,626658812,1611511943,791486862,96891103,785105294,1892613850,1391163588,65606341,900797089,2125770270,871299869,1085425886,112474801,761955075,2030244077,1117908537,1036727908,995309668,69931113,1277662360,1628260632,381452460,132089850,421870609,191861674,1837356642,504841139,1736539237,1369365130,2095076700,1394833781,1960141370,522961572,1384548649,1488157113,792547117,1785989232,1146918972,1984835417,1098135214,947871849,121415894,196589925,195404698,261905830,1016174412,339290111,1431893043,1742246536,346184342,109999394,1277997431,229157471,2103608809,87642557,224237484,200284737,1290531293,606887646,963386123,1972004904,317156759,1330816007,1959476615,187104406,1040873660,126095717,1921542262,1502546103,2083114279,93504098,1457651205,1483918459,642813632,1282598191,1522450149,740851246,1963681744,1628765189,669429515,881384895,1608215962,947507950,2121303693,1910709778,300577994,1061329916,310189814,1835445565,1357750812,1602884657,435797243,10781400,686198606,1368573385,1400520881,312495403,408429313,1675787547,2045094989,1910534604,1611884809,1654987227,666414699,543418149,1985254043,1466048617,1127591946,9803959,82738250,85347276,200870258,1562253138,119331241,1181231378,1093936352,1040563658,73343631,1796485063,1804344469,1638926618,276327552,767988294,843668775,1349672080,1247313332,1198361453,357759874,1996906447,550078916,419656433,1154112564,1544657656,327404702,569652305,550296419,486987613,41484461,1825934201,1668929798,884808174,376006665,66960848,1337790580,232885523,831978288,852952508,1982872083,175721718,634079906,708206264,1418633351,1138969563,934897878,372043948,1256363103,806563126,442324225,1676652595,1577265280,956271361,1174642520,674359935,99858909,304939855,1063914580,1409227856,1699188154,1741345596,999647030,1033917205,148066245,930635503,1776646315,1002900947,217067820,1792587591,1701926246,47621931,1164756634,2052476944,2008148385,1864488439,738474973,677730817,1146392521,1955390544,1890757168,1327209342,1213730965,713605593,700371117,2016433906,2015640411,684883049,2049979743,1275645759,1825332132,1382623087,1713722257,1328124021,721001754,55374602,1529557339,1682383330,428914226,1763380107,353369450,1056098143,560018210,1759669459,2042420208,1116225868,1373865429,116598764,1729913131,482551209,1331718458,2097351759,1975944923,1908115650,677240956,703471060,1932947390,1949046063,625910208,116198924,2091432050,772506786,1280439819,1699266314,2122264667,990971675,440919633,97955281,1566941946,1370452658,616142090,1226102232,981987456,631559409,71698381,792141369,1010765167,1575478781,375528849,929302825,101738010,1015220364,2109616894,1378995419,521965630,213585147,249861075,961493609,2000215003,1388292617,1971150324,764618666,1449415281,221204111,809389673,1616090241,2121831703,1453259461,1445327997,1785681934,2022487174,977813688,926896178,552716752,1802392406,1611393375,957526365,1315796185,639337530,1256767398,1369094047,1098989070,1436044591,1404036464,1321772025,37102427,37692705,1585551753,49275924,1794701933,801649623,1356446086,1185149016,1278992231,1065409341,456742738,1396509389,142728274,35500046,47000477,1494324050,528340891,1020565897,456685906,1489363171,1581040180,254437009,534509737,846076530,2111660752,2002732862,1192162265,1898380639,331254112,648624915,1473288443,1101932559,689314681,170162022,1230845482,1343088114,1997125635,299531312,1362753851,1086025864,1393956134,461248851,2830381,905525077,389245033,2002903986,1917424281,156935545,82515543,1779057395,267269470,1283016112,1145732511,1516212709,1839162392,1583031430,1226413617,611076236,654479312,534627689,1992806691,91641704,1288931731,1758213427,1421636905,2039659741,1914330617,1187261886,316116915,468564012,2010334710,1061040460,1439941396,1172322535,1699967332,1745698314,1538170890,1853087898,1573587457,1181888928,22362745,791469004,705016445,2010088326,1426524864,248780280,529585786,849376568,1878642337,391327398,1621277926,1779469508,855156666,574259506,250257761,558475002,735227007,544242917,1910283479,38854897,211649735,199759954,1589933561,796144219,508914177,2009966142,292003449,1280601098,1599407823,1211312717,1858265001,1936986302,893703230,1939722477,1850357344,432786430,430707365,694269918,1197260432,626611425,426454683,1651554010,1019617477,1272134373,23969435,195485871,28746439,1730119711,862247072,674850519,1244304189,159413952,1486140768,1626581347,829173617,1859050632,1205565962,696055150,1006243360,201573927,1817892876,1500727697,1710266848,1222549152,1302806110,1915276464,2079479353,946773359,1929152560,727348798,1891785446,836970499,1680454282,866607167,1024999895,1115576527,1897683446,402115685,572595368,226125912,1910566528,1934449330,1102285751,810691654,742751968,457378533,1224040556,1510710510,810764496,1595668073,1248186117,778415208,815198191,1357587984,162506987,150118394,374666090,2070631105,1758439557,1461614635,799097512,1104542050,114719766,84827304,1729205328,1801382755,1577520241,497158471,1674390278,1629960385,687677527,374691655,1628296389,17074678,150093238,441376016,1815337826,1098383914,2052401483,1593271767,1283070742,1900657910,637429156,1410750306,545111597,2028281487,2101520174,137546173,755171546,1864809238,2063408574,1377546165,1049284939,43254811,434659823,508452815,502561677,1710528974,326074840,1771115392,58790531,1978785979,1985563586,1976195446,1374426751,1488168212,553778822,941270537,1054688044,33431535,1032766597,773529683,1496874631,755366591,1182720569,941582356,492097584,828515144,756372461,726957529,1952362995,1583713241,899699221,934953378,1626106670,609166507,1413379128,966352398,823309654,857372537,625385479,1575776104,235096929,1887585594,1890765559,879895976,1743848925,1158646341,1928457242,48237749,2013225436,1340632336,1068976140,1410066409,1323574191,1446400090,1120297121,1924154148,958453444,1983256015,581481368,1862386796,566299778,1074381335,546166607,187418100,400286594,1064635277,1069609674,1935229834,286557474,1006192772,989300577,198592601,1422424063,1595435642,1861367846,2022613570,785050826,364891339,1872786692,1704547628,2120027202,1307869516,600541758,1012414690,1785546005,15984889,481981273,1265766720,21997857,1968537475,1995463729,77153511,1285812013,1761461668,1541233650,523090098,821314271,1009854308,2041663705,1733251458,967157763,183420675,1611465477,1052997595,1254944665,96078490,378500424,1354307405,573071963,156127153,894466195,1466548426,323950937,231069395,1591960862,1895503972,368928162,1311662774,884201736,324254987,509029093,720994631,412669360,680031899,1134955667,1316127888,347169168,594889002,1997689958,1948738472,197977252,2116972303,1707093933,1973255412,1578661816,79242103,955266093,2005062330,542960588,530319054,1933975208,1133780332,996301780,790581902,1441969599,132915375,1859882026,1235586012,1317776684,853946501,623835677,531552657,1586497789,1361394062,491237897,2101787929,1290550634,488900232,1148321511,624141072,322054101,1977024668,1309529096,230265460,2015660166,568298780,1804198249,1450719238,1106239,2113342382,1968454764,53052043,1475099916,441078905,1452605692,1128936953,584262642,1088230925,821666578,181103751,1960250999,211451534,1279589762,1611065558,99942819,139981680,951458229,130162184,258394228,1163715738,1728163337,329377042,1208725494,1815345987,211216195,1188139862,1215426809,1149839517,578003066,651020806,90685660,1191227121,2053802742,1463566133,611891062,140532418,1241852683,1961048548,2002748017,283594472,1615718623,1722138209,2067600545,1698759729,1694355909,1538351181,1939856441,984414097,1924721618,473612345,1857268160,1876006766,524806701,1724892570,147503783,250387031,1794906796,23212802,462333928,986530742,1013923697,1335200253,227977348,1077433214,70882876,1492952922,1721707023,734387811,1085874276,1689033068,1664634899,1208618459,572611383,1745019236,1135294099,1070961517,1298834743,1050180063,198667393,1259951633,1087018804,2086570677,1471083847,597805766,222441486,1633732930,1823629820,777650561,84385166,1498683423,1590119124,108297762,1076872379,1645621380,361566203,1280501354,935031394,1303192998,416124539,1345124646,435109649,251502436,224862518,453394887,1455357621,1013824789,536247089,1889190753,1041659503,987782572,729446707,173663266,356915739,442342833,434688871,730420672,199104222,2048720989,1675534831,1337399461,1585241027,2001034993,1701961488,229558285,1766939470,1570327893,1215142571,1570070697,1821818108,1144251567,1214389403,508164765,902797150,2030390792,1788730992,411239975,9490404,1495469842,317457913,1305510812,1634743541,929366406,210207343,275078474,1279103017,641576671,850800377,9734386,1869485299,788368417,1854912761,2090325962,1069198205,2027921096,1853943144,989126596,1241763701,1725322158,1831988521,484953584,1245335637,1362679724,167634536,1341809685,219577139,739433797,1118729204,1726559490,721346683,1030499629,109440360,1899991965,1362988740,821430713,363188471,1229235047,217616529,680554759,618996400,1915475003,1202734323,1824603951,133729136,1343529793,1689934512,1470317920,991057338,837384892,366408891,239793133,287825190,450141348,127848873,1973855773,1187592498,2031921723,583241694,1426335461,1341041271,799705112,1695954337,731548664,640250400,1616168550,1778527272,852833945,884758724,959261658,1053217900,657003149,271786129,1707991593,1170542519,1365751653,649087561,313927185,1174760651,2053887066,1481485472,459441238,1150173242,1490324855,855377176,62267225,646049557,752118855,962733172,531769048,1417684918,1854942739,855342951,837405072,1901075453,437673891,787345610,860571669,575060463,1968413838,1730100932,523782799,395284184,94174814,614715909,1590587047,1437546370,494828166,1844487924,434916620,797551198,1631679897,204001194,571546918,1447579005,1001637023,2048181187,1171639707,1793127863,66023652,127986630,1144817633,640468560,1460731400,1344892431,1823237578,698455464,984049675,964243243,46217425,672739595,302414581,815061141,948734896,1830068372,842915862,399408413,873099532,1822705962,1448158865,2103857620,964634674,1958975392,572179099,1369049709,395985885,1474542958,1740340115,1524510026,1891846852,136134700,1299636050,1815292228,1424161976,1196069964,930943824,851630574,701601246,140169940,1961072567,1514927257,1166701417,1198708855,1837404129,1168638939,290672925,775985876,1767609433,500006593,880669602,649102459,1427215672,1266705567,1468153209,158370045,244604705,518207499,1750099925,2023735060,1927875373,445672895,366035581,1236565891,1997409753,1382774379,1717436577,1563231068,770156070,83811968,1783107992,1808623357,1335937863,2025511486,2103546307,1868912577,953899321,1849071584,1185938606,1322956293,1001152444,1119075540,627381860,418499053,1288036811,1014938352,60689949,1676839010,1652465035,746598198,1586420949,1374691558,885740852,2048653000,1811497125,45444110,558008705,2040523732,228327705,1966112000,1452533507,2095660073,1012272444,1390698395,184973119,1142342970,1324933571,2091632765,2070656047,217376981,91429051,1133147246,1429900034,2112633519,1239593351,1612319843,942507800,2066459740,1608411304,1066924142,1293884040,1556694490,537218883,307251762,1517603909,271190914,175768752,2098926696,829558875,1134646329,1708753391,154423121,1335711307,483423747,940279932,1634760348,1307451161,147006546,575663081,333286637,1824297400,1818499929,651254935,1059125287,1817686181,1556544302,735759254,453531586,134652032,647215161,1446226296,31404558,1858822651,1024747848,548801111,2101419291,1592819342,1874035064,546518721,340343482,269356300,961274560,1079225144,891827328,698619525,281666521,1160542391,1641625184,1274248592,600104259,9981470,1730260423,830009613,1379667455,1014386203,1384021773,1046031020,305984712,154509115,1916929211,819229465,1176584834,1761676840,863983133,1104017108,1651519946,1365873023,90770432,655328665,1198223871,931901389,1534918952,477353114,996575291,637558304,2096509619,777763106,1381797931,187966997,60657933,1640452179,94954105,955333960,973329064,79741752,1668246454,1813348237,1571996822,317082182,155759635,1848935934,1984156135,171208785,1586562548,1442831650,1391587675,1750354129,477175174,901194905,906176640,1104784813,1281379738,1505397117,2106474573,463522375,292879798,2031062485,1545274163,474881868,708813991,1612155418,1143020326,325002095,875258951,1792026285,255092662,1605551576,503247835,1623383936,1719069998,1253432454,1009450329,825626930,1556933374,107827717,2061326352,569792771,45608237,49578545,10759772,665838002,717742843,1392034529,1967769598,1163902762,24160222,643696964,278130454,1073015024,1212511733,831409078,1020449564,1501118842,39790476,889924177,17214090,489901284,1446385746,1995533026,636558685,681975671,1795895032,1778428310,1393820683,1904737277,445143013,423280410,1763588911,1748504299,605941504,376342626,1201878916,592427332,1134509768,906069344,1673173206,409224064,1581516811,1176762236,1930995207,1035496540,1336213747,1384163143,828824652,1413236132,741957692,433794990,819576206,1218207209,1676307147,1518346327,1708047578,523666531,1418249944,1899029047,1457347340,65822383,989352361,1295324110,1447229919,765241234,706447463,881759959,621644634,1942207292,1728949495,1046888857,368924880,778152981,1116018858,1142938169,200338469,1116329433,188699444,1932038804,850891736,540979974,318287769,821725636,747501041,2060903479,1628504873,1361705469,1420021199,940824266,293736247,817382816,387721181,2050033903,1678453988,1997919634,181032498,1845729352,1815078477,1481360650,1974299773,1008433748,955985947,602801615,718199450,542826738,848362945,107905776,512310432,678011799,391663183,1807883519,1331120108,402864798,272529928,1656835191,493546522,1357209253,129974974,877674853,2130252075,29970053,1982239905,591341165,1335682548,1163788265,1066359869,109352681,1773398718,543559448,995550357,471791131,1605524416,515282970,1426826856,1666081239,477188988,1886874012,1596015430,837430224,441993237,1662965550,1375039960,1862156522,281295918,1946196558,711451,1311060168,1910515656,1193897682,499729663,2020665639,1464184462,703488372,736997425,187258520,1596714869,1584148395,573173973,103319886,1356097810,624697775,373980807,1809559693,823331467,961168532,1685162674,1821476694,1267871003,1673800864,516486921,869268722,400262410,87826253,646405560,81223781,916954341,579401218,250645477,1464811179,33527812,1853092955,1698449933,1098740346,466186577,265152152,2067853575,2117128335,2066323202,985779794,204137936,494680058,1135150377,875843702,1254387586,1673806488,290984333,1122697071,1643768754,987947175,125496271,1543630898,119384620,2020865686,31155142,1578306042,1313209160,809114730,1543140243,594630053,1256179475,1293777847,990595870,1783428117,220389973,367278525,629953705,1143345541,369079927,961361882,1785468173,1756873495,1187120346,2096654582,1394587510,1467613500,1726174577,178767399,104175811,785832252,1339841508,1177478872,1739541577,2050922514,692977028,370293678,319236393,1662888857,1283447700,1405889119,579047685,1892752362,553720692,1400425372,898534077,1756363482,597039232,1514523686,299092215,1025410498,2023123365,1278252558,1784002794,702082898,1565705955,152442834,828836612,1983433145,1613165922,927328299,697698431,2002128671,1673389439,946833820,936344919,302913249,688359734,2061826787,27059501,1680119951,1225157344,440878161,1044230766,633633026,192791399,1514901813,1063409557,53291879,520050299,748382374,1623762190,829169835,1202440758,630077767,2056105088,939550009,1894109685,1394771044,980586871,1603558478,1751749175,1943146128,780496331,580695165,952942582,336593964,268870498,1245381203,1266403208,551693290,1772017102,1877368748,685776154,1920311347,492639931,1102054667,542842434,900802862,684696802,1970396760,1426636501,1012901751,151751122,1597380449,1577998222,1815838555,873053377,838920084,36967137,503092959,92887553,308818933,1576917594,563110829,1468377357,865789319,435142582,791751354,1966922215,2006405340,575180659,532894797,1840663414,1272713666,511438057,1972856228,814199086,2049976229,1054713548,1074641665,790144731,1818214692,1625725771,1642975149,94459281,1280020028,1818008411,300911410,209276175,731443518,1430014383,759719562,1055736335,365342823,1088440921,728157335,484398759,1999767513,1602012325,19406043,431805162,1869124217,567482749,49287935,1648900561,2082565986,1237349376,925921468,897461067,111560941,508368155,1815090882,268363779,678835012,1645614241,880492166,1867126887,332859447,1271423776,1947123153,229801439,82764254,617110806,2073267954,61709875,624970189,1244105639,340580769,1905075725,1276481255,543301094,627204942,1315979318,1971087519,1024107568,285330655,2118452407,977886892,18240305,1449304938,685794949,1203093274,1116353697,1499170728,1324265183,573891209,7431545,675444106,1329457360,1891872598,1000984110,1668417584,1379204920,1023308579,670299926,1905340671,941537914,649356650,1773522113,672374141,2122806245,421648170,1253790054,856722529,445104594,2091535795,416226190,320220931,1931420011,1971015932,793740975,771697527,1408139721,1472076005,1001144028,1682339925,903169467,329371273,913666594,936656545,75379524,243978101,754762685,1651491847,1425118047,689020555,1207913438,1825654697,222058754,643674294,1786966555,950949201,759179683,1811335413,2016975765,1780276322,952387092,1158944740,1679364952,96245732,38664960,781363394,1760121841,1042870553,517731431,879422353,901225263,137571622,23282621,1031814166,1436984747,631834164,1381671436,1960133975,690798751,434767446,1896258217,299697465,665962307,1834460382,489582853,2039439453,1355945109,1300261353,1039428976,454041886,1674509074,860555618,442019955,281666310,224313430,179395954,1033195167,479045198,2057745429,2001349993,1357107103,1095649523,784974800,1258538971,280552388,1180498945,1418565537,771180635,946330255,1853425011,1735237092,117698408,864824283,526550333,1229596374,1219101966,263084457,336160275,1011772827,1212638481,1119948715,825538339,908011543,1457504585,853291132,1921618944,1764596818,1893872538,892076606,1014870128,1372070191,1531063900,647916809,63416250,508219190,1427235287,412481649,1508917739,457284493,2030152205,1261368121,2105243491,1468561125,1024138983,1490828987,918997753,998184690,100443477,334433820,216077008,2004817049,346129671,811040642,213858165,1695668786,670090458,1388024424,1237831043,693829714,1875386752,1427918851,1297802396,1682343651,1333258912,2080256266,762909229,844631334,107870278,153261303,496027243,113262581,40394550,1037318232,1928197609,447812144,272259656,766214713,793485602,609763923,1404524772,308550436,401925363,703400244,1990714095,1969869921,126052443,2061591517,196116205,450096092,870830250,1000436584,2115847942,419889125,1754561070,150336432,1577297583,474221192,1590085163,1329438803,1071892341,1440002851,560523512,729400956,1855272086,850920278,317202868,965971550,1033677192,926039946,1859601542,570116667,1585858841,127220225,98383720,1609101143,2022169709,2068693787,788907640,723114128,696254522,501697,1345338147,2088282578,441666210,212377527,880084446,1500575653,706605546,295659386,1375963831,536532627,697645104,1309530703,1272302556,1330962735,701990896,617808986,1635955122,1564365901,1422972757,1217713543,1257779409,1838141225,2106759778,734488129,1563450407,1319347734,52414003,1538501195,1544156894,941889336,2040576874,1976146021,1554249720,592450350,1343818351,451316561,366429303,881727173,1064746069,2121471141,446222403,1914627890,2009201543,1541185371,2026364116,999616955,222255563,472400658,186270959,815597716,22818407,1749153886,1751603557,54676118,1786998124,906206105,246628518,1100072417,1647183107,1577996981,813065860,455108803,1084588012,1500045610,2110701912,1720770862,506192784,246621636,927952450,1794687091,515001190,613667875,1984404603,402147040,1439182062,1556120993,708018973,267587069,496514603,2000738823,860896003,1973231892,1994733138,1144206778,764613207,408355992,1560569265,503100008,769844038,1416096637,48568861,236507684,2092907945,92857535,334392167,945044616,775891791,1409757586,1208882659,467937123,338618856,415769571,500821861,819186877,1720187877,679105955,2042220682,1407875933,917815202,406057585,380169731,1572373221,1118305190,44633833,653167470,1991098520,941074733,683384339,353905520,1419020887,554507702,325071376,1250360205,1732411389,1132436596,584788087,1819486042,2063393083,699416542,284076628,135567540,680718416,342159477,408978101,424092679,1918438846,1270571751,1631424532,1359413113,819013226,767186170,1010220336,1793987799,1860850661,1679483816,959207186,1000422554,621774546,1763155465,169229398,323955351,1294748766,213947372,1670017244,1679140892,477061719,379189735,2111708332,492633435,41513694,584651457,456291739,1123207880,1076653305,1857728873,1631432689,362027176,1281776813,1221555291,1873581639,90058419,296278455,147145662,795290992,167024823,402332714,1469150676,327685547,422705134,2081578555,798895608,1947671609,2038190161,877628184,9371381,1159118989,1275001757,1431014192,341711210,336656341,941551058,1690453659,1701107660,991847824,1720717715,1569939328,1140842672,841125604,1514812613,1588979039,284298644,1750710834,1103712175,282286527,1638384739,731667098,977754342,1745397597,294350179,2042548708,2104918906,360154229,646017353,1769231214,2064941059,1521339903,1298953239,1793076725,648659579,281309365,1232613121,831184307,423401516,281402231,36017648,937123034,1416928682,1118068779,1690670530,1882297693,1217041720,1495564835,522416746,2111631588,670830673,1765381175,1879162881,931018314,1672582454,994953455,961599200,1432238104,1783314592,536385374,1014410973,1723067070,808696645,1745241294,871178104,958217030,1176610909,1031593132,2000800797,1401885856,636166717,1541808719,1324465841,1440163256,736066184,1235096922,778631860,1447458898,1283265854,1025648687,1625682511,1606852010,216720905,2119906265,84681547,823721021,287091082,1202553674,2117042987,1337681709,947120419,1840819961,1017738498,1137357374,49416416,465831796,1131890978,36278650,461683032,596379801,1254848984,389507008,479352094,431096678,400081122,597980353,1856420249,1925960686,1857907874,1499175856,1778341389,344937560,833552888,1703751812,620410746,1415499419,313027057,355425253,2124695214,1698558961,1217381237,963484467,1768849366,794200368,1949427749,322698016,61549489,1106707215,269285976,1852961700,2018561282,544099434,192144133,1813329524,704970952,297217580,1092418546,600548572,1465354027,1637144295,1491488050,522485671,603374947,1080396425,1788912866,1231050464,1318059915,1130949950,259885597,1703464432,123184969,1610290717,1460661172,1624582311,975365230,1905900352,1664357787,673071793,1659883230,1233284068,881700493,18281626,1026680218,734067711,727832410,1585653594,551228122,1702598703,1681710394,1673861614,1077374652,1704658042,1288430574,208227404,624480451,884312446,902356993,98818563,427332550,361562073,1631464668,735806957,1276272940,1614347131,372712349,869324482,855968312,866184464,1361749244,1229615173,1026232682,1774101342,983388299,129973907,2073287536,1056905375,279869770,346212147,408931416,299940119,1090754732,810507968,1444112834,1940075184,409546886,364393566,562078588,1231383330,146728437,1122473090,440362861,1966809433,1548877137,1353522407,1648645815,882790834,788038137,1645497748,470478436,1718435425,1726555180,125993963,611325925,278284255,1776518603,203006471,448853515,1745571647,628499132,1118975620,61628247,886194736,1316909193,1667232455,255219616,989700078,722758246,1803003663,285133999,484626343,2022955547,1803354633,1836706763,1773951155,223875332,153779978,40963126,867296169,67505174,1702774409,1091489748,386506254,657091372,1962421872,215979303,1047675834,1191689922,1557576313,1328646549,1911352124,1878709563,1548188302,1011825386,2116799627,1236693912,104096543,56305000,2009561364,1278290549,1269825879,1791321756,1020841771,553476839,850659347,762407907,1527266684,3505068,1671843790,2042180611,1676090588,431490177,1958360506,973209846,1225471077,74442791,433150695,1194744583,752582150,392168941,213269209,677457616,188013692,476209698,1346653948,1473114329,337557565,1706761974,254951770,2071436530,222625891,905065044,1482222185,1409790915,1341604371,876346352,1777051506,1987135586,261963406,1482983243,596708052,718605573,619948242,1569184800,1880371446,1001618702,1176235343,577763365,1443569051,952181825,1999161231,1762797601,1553333587,330971661,848484917,145758092,1361957285,2046759318,124914471,1302956581,2092836965,1561429972,1843707341,327380906,349367703,644959538,2002503510,1286028881,23688832,593839319,25965126,893225480,1670710761,1002031391,605295604,1259377511,540374668,483276164,225788463,1725663549,1705183251,1108206925,368672635,1745731784,566975811,2072929702,873555044,1500755907,324067797,167442328,624344679,1842416376,2107089390,1758812732,1542790878,964801233,158137682,958373820,1330000840,1587161448,1333177316,127080933,1779556018,360934513,1578059779,1649492517,1327047759,113738130,1972248095,601304668,878342927,1862298792,324816407,2086521523,1512596659,1612408126,397229364,899097521,1408030559,1157330941,1945416858,1679596416,2105164395,702951680,1096135462,1579450675,1120317349,697300902,2071820284,919428002,176383334,1619940982,1952013149,16638061,927230285,1361525425,1030438782,2063193492,1260111251,1546464976,1486338345,907584910,443812718,1534878036,1925604963,961108540,1567981579,1143058209,385432604,1744677877,631482331,368855893,1080696599,1864753326,937820996,2082714928,1977017971,843693359,962379429,1243171255,791669140,1108238643,1802024394,1629629610,1137524182,877115543,330460787,1730831662,1301352820,176985938,1523823195,529231000,1786068328,760555451,1105606312,1082901949,600330556,1513325490,631251685,1285285728,1414713149,546033464,2059540181,1141194953,1036172420,1762054811,1957615065,1259606232,132489321,1758523510,1004405756,1016261724,1398957896,389718972,1195018583,993081510,1631086208,1879746033,638283054,1271679549,1667074036,1347554314,618048219,1989457085,414594071,42620411,988801837,1589630060,2073031665,1120033159,1335351398,860294611,969466595,1767363271,1258236121,691434718,1374568491,871033771,1907513059,183635875,1366077818,918101727,784316697,1227054465,1407085784,1364204584,1160264883,935782440,1820881552,74286639,744068770,1781998107,1169552188,1710960608,17938735,376517248,202124593,503125310,1540582083,153308731,2003828715,1940569229,429129290,25426104,833522295,1748191813,343059062,1953274366,1311728284,936153978,1045682036,1158026143,771668547,560274693,2062191353,1416867146,907610761,511533259,1535416215,1278207696,1358154877,1893857850,1359111369,246221045,227032494,301854150,1810496575,325821582,1547712489,1665055983,204437396,1190148555,7813066,1956994651,1925159516,1425129403,232493779,1828078868,1792332456,1222105365,319358658,197879046,1386809293,205648156,1606627296,433727738,1074336370,345974196,318077529,364813432,1260583627,25350628,1542924156,1205576392,736662378,1396252348,556134205,154133041,1291379395,1350322076,1481948401,1737253396,233629168,20814375,146757907,2115364748,2007349208,789785670,1299587107,1361892428,1172656379,1051736907,436531854,1295784852,1082226644,861439322,421679799,674643503,1175434167,139999517,538270597,752584607,592582347,365938423,876899597,1773754032,327390013,2081398840,178621206,299066576,154787067,1690800435,1733751489,1801255688,117922270,937747186,1032624518,418047467,1253662943,1621610436,338004559,384831459,227973400,1463484689,144510198,1565925594,305580478,270495079,816113710,2044957453,804475360,1135308565,1889395435,982121686,635445862,1398983821,428517525,904655860,300194915,1491801623,689791659,1794550614,1302484824,1641826355,586391974,596150818,772425484,1041654663,391921012,22130019,303974240,1099316403,1398800650,866152546,1792079506,1195891930,1845251139,226330804,1765048048,2012560343,1562174591,1830332707,1900416681,925354473,1043161524,2064668036,1789576373,1416256556,1228993809,1469080824,1816900227,588290786,1571880109,587792399,1370559891,263448199,2025102056,1563729047,350752501,704923887,589588986,1016166736,1972272534,427692887,2064317726,1038621725,1412415497,1783210003,1893039234,130877701,456235979,505872680,1926044888,603515348,296550167,1664702021,282211316,4627473,1955015106,1822045376,52125623,391617664,28951386,215886980,537188548,818609039,773219940,910580761,1987014529,855465512,1746336507,278528790,770591955,442081133,761379780,1121373117,856497371,1485541703,1858861357,1770109997,627246672,639615219,651382143,154288026,1056154261,371834308,1898112663,1564508381,679072453,1566754076,809659332,746644613,1909909295,376910442,557465967,793996965,1944130490,655367899,630105182,1069600995,1608462813,1862943180,997787805,1961467060,712064038,84346268,784178549,973954062,2110828441,1127266083,1872101725,1285127367,548357904,318564279,1076674408,653749451,123857639,1512073052,1915761165,1418023536,991869130,1974794570,101864624,131433018,1079470485,1809344872,661754060,890681553,209018629,1763008449,969314331,571791850,1914338087,2021803796,335630393,1625987078,1075537558,637308684,1325402482,610452076,1353323733,1697687694,2049635596,1365776695,1065933146,791406434,73686957,2100901439,1932093414,1076613924,616127967,1934172128,1102064221,904074953,1408166717,387882749,1892975262,586646907,1289357686,1585640713,325567936,672475961,834379462,491561869,812773191,1254207666,1479154272,1546960176,125547927,1585865212,53744571,1819109721,212678266,614142542,324371085,1459506315,900910186,1315548229,105935362,665468178,459412195,927901228,998093466,230011611,1769098414,821314829,1448102843,1859386755,1357888068,622849466,1766063838,1737336309,1568143033,1518835846,31754939,1834985900,1751077410,1140709013,756578776,1891025452,1489529297,124456574,706353061,2118167014,242039634,237765554,1575728532,727007707,232426371,454047997,239852565,1837924895,578766161,495782274,849242326,2096260101,587979397,358990595,163866065,1953219770,847546442,1255140840,1611714712,415277912,615179026,907658574,1493744369,447825987,655382960,1538880546,1154321726,1954715320,482298911,1776944120,813492268,1160370141,1093658688,897665912,177269865,1070246530,1962497157,488266097,128577352,937888017,696580708,1057590475,1985729750,1732116127,165843330,1627241891,468978961,1819797933,766745575,2128325597,223396319,1489234742,1678364233,1553503975,1013345203,14540528,704122362,1612515550,1305819628,585360241,1924153047,1303013701,243961511,1065344883,1775611254,748931567,1609453749,2033230349,872790981,832897096,1257463627,178056346,849835682,178300407,673359493,1547647747,583596969,1652573212,984345447,377865087,2095706111,1110666628,1617844838,497338900,332809246,139624400,1233208102,1083116302,2004007436,1281856421,1699990862,450880083,1596467286,399953310,265109280,1618630892,1542421629,587646607,1049743134,1996258032,270627494,42215998,1597792890,1278388891,904365758,443934703,639415416,657230593,1986767848,1359473606,1152463930,986495751,792604300,632043506,1440065708,1240478546,99185452,437016954,1853541829,1085515039,665886174,757600170,1564633860,1420628499,544484839,526185826,1357303967,1847443522,719895722,200494524,1043822894,1433135604,1510201273,1177954295,771956093,1599905707,593534422,1203376186,112246039,970593955,1878737808,1645739280,1079930206,750296337,699522861,914199080,747997215,548639655,226548587,1526296394,576518565,2129167671,435220275,1542984126,1557245237,1945201814,1204348014,935342745,1461949818,927312759,1596381707,1277215193,1225293335,1221032963,1546307759,1146888768,592663085,2048148945,502622623,716567854,2019279545,468332165,1828927349,896308238,636329984,1741744878,2028894045,1856368141,22249960,811427755,806694880,66884062,1673086582,1982664772,330474198,303479039,1675773265,1682084522,1901095918,354184354,519369405,1644054746,749505969,939217181,1814515956,177939337,1712850210,455641543,905151659,1570769974,1202861632,941818188,1508999356,1697308298,164233991,1711971918,1028557230,1228079227,1668941809,125803992,1650298482,462576004,1452770314,1400227906,1080779788,1980804447,1821042953,549336472,1285450702,796930031,1622901022,624910211,1787685912,1793331288,592678276,696757923,37224842,159611273,465673397,1056160931,698186840,1856257774,786172146,1095523600,1157364843,700707311,1061152381,1341704269,2006501632,1237181970,1976459557,1204624094,225604147,187548996,1592135035,741736581,2000899050,1349561510,404055128,646359661,1985457050,871557008,590770447,606631803,378325818,869472094,1806031492,307074103,1451529870,747815552,1538198029,73222817,1118267332,2030331839,566417792,865058851,458695298,409067545,1476159980,1152674392,604928149,1977560576,137782073,1438987129,1695823237,503447913,169688010,1781871973,852901791,392853056,371351778,777644023,2104619459,1038956404,996968815,1469654777,1367859047,31336839,166517785,824280505,988235016,363866135,638636449,1786651243,857380527,862196276,648741861,1592608871,1804412277,1119208237,40604808,804839779,111708947,1680424174,761704767,1854493375,1590453882,304650962,654942907,12315927,1307419273,1481825543,1986237974,646001073,215923346,1810200686,839615264,430512553,1912716054,543187500,735965239,320578352,2005976914,1991331134,237792219,113502345,830697160,1489762849,1837578370,546890877,107602767,2042954203,61706676,526894412,831084322,7138700,1065304944,1554935054,206140646,1084963367,790444272,1472231846,1649074304,438250248,1576445772,110238393,502239378,1407049979,814947210,760075387,1876406531,950392526,1852707240,1995369797,694601580,2005516468,13958490,1511914937,1149297225,887737614,219643795,974133981,1846372702,1378923936,605798675,1225379009,1980711099,206330597,1352255974,48820458,957538625,1466783670,1621885760,368986722,896633957,1454562941,1623958938,1900794930,150973146,229808565,2056346415,962202026,1624012878,703085485,1410563460,469424180,1441773728,1273425961,1153786943,1652304644,621348235,993274492,187004437,49702926,1087484524,1529754168,2096191123,921058944,23787040,1787691498,1629709321,118933061,987558503,1978368279,1163823594,625385381,24146551,1681164047,1920435413,795907450,1592895126,1237003281,1767838117,1975973341,682220814,511787147,640537044,1314930903,1597255654,1570098258,688116018,194665418,1415727157,1526214767,1129440349,490180434,394505773,472850905,2014421280,460732373,537198585,873765065,1778583400,982584164,1029234452,1224863193,1809050134,715887861,1566262348,767693689,907156139,1959910273,2236917,395705988,691790923,776501735,1487591801,1337430137,907633378,246195977,303241642,81559167,743980965,84580866,1452437346,311298082,976351104,2097180641,616871183,1479991541,1962528238,1850738257,391756844,2042528920,1791693661,2055747294,964141028,1107083920,917715103,952582358,68737893,1952848990,877875904,735920420,1352837010,1188083095,637517121,16949106,1423144977,1063012538,293829743,944095215,812181745,994392640,549829563,1105927108,2041768985,1024890059,341211190,805188489,531000408,1742884105,2012370855,887511482,1918813318,592408962,693500572,1427715551,1061433835,1164481502,1512737417,1867201879,1648034762,2014572044,1423914948,1343516796,88388571,916406435,580299536,1375086578,715535452,1618622791,2100227179,1033011126,572739916,935976820,720018620,498802933,1576394156,997187477,1613794350,533352931,1977516656,176994991,911294522,513626323,2101256259,789993714,465703489,780971622,2104162745,950213444,1003652870,1534206096,1828665516,1165758326,1813715022,490034012,1173305316,1975875174,1815972596,1614537948,1271468328,949567875,797301940,885977723,1977903707,1362550260,1149955329,653771144,461984398,1235410964,971315510,567163855,1980157932,1323561162,1220117122,1187444287,1877173700,1223920672,784946169,955221414,605224795,730451963,793864878,1200630024,1987530990,1909461271,2036123058,1876459528,987229176,2078477511,410935310,1135695675,262073829,457547191,438161829,112843627,1944209029,1409784175,1122765879,321482713,184049383,377363489,243390503,1582814302,492052292,333228137,317107491,1729294895,1565868981,1462899786,364647610,1073787743,1748157486,330259801,284087004,1332850860,1842396660,1805790713,54111958,2098035560,1418901182,825573191,365639521,1673943636,1015535052,168224266,411259354,986541991,641227202,760477467,1404794627,437197214,1597397906,1706579951,1427549200,1252391349,363669333,1013261323,933318894,1449662613,854767571,1139103479,858147816,1606331404,1701080356,220122542,1568244390,1958317799,2042296958,61016245,480685681,2060704938,1639203330,2127845921,1095020448,1053857107,842057327,1970803699,906268720,1601391313,161719164,201142605,331979965,1662313777,1186433775,547885490,1223547090,1511928113,1375001007,1480533205,2077382724,144569891,1105989800,1006183459,57466121,977456526,933022699,2115281290,1579432763,1020214319,13944371,1821681067,1708564303,1081729441,626782269,193622007,979971763,1348692141,1528462006,602848278,333778911,1319727249,1493197265,1902586989,1694590307,1814099748,1579331415,1619139115,872647601,1284035807,57898536,1930063308,635081999,1646811995,585960102,1113666632,859437519,1090327411,441129034,1897228045,1868793913,1790931258,1627155208,4008302,277141297,1215657217,1920507280,1455874032,1423180405,1637739213,35922773,1467396053,1068874920,1364500031,1141424048,1334006780,1199583159,637815617,2014737081,19474177,1402113636,1454301004,769410956,1229644391,350619132,1503565940,1155574600,1567253182,1217079897,1144845964,929677625,766356693,1778013261,1593436300,1893128135,1752852665,1720230172,1730614955,1236594481,144744636,490104354,42724542,465365102,421103109,1281008293,1519277578,634042596,1820052896,750517009,1224630290,2058822169,1616131626,979669809,726542588,556736377,988239134,397218887,317852013,832731127,937879121,1890170472,231483216,1051090301,221683048,691171521,1493771736,714345661,1186700776,340790049,587072158,1519569295,1278082193,299188846,1828239605,940048195,1431779737,1241877741,1979956365,273290875,149564916,1094055629,1165479963,1902922901,484585647,1669523035,1142442884,368985850,1339489452,1737776064,1055034384,482649694,1899849831,1487254775,647422288,302349886,2097270941,193993853,724715831,1788739733,1523751539,951959720,1837901790,1531005238,1031187783,1385352965,1482306232,1338117812,349341976,603227272,655407561,310736054,510281187,602231255,977486210,1253233439,1351352787,1766590556,2036414221,1766652206,1203136975,1928676117,771465036,1351026701,382429073,918431547,743139819,264313062,342300798,6947177,491207589,1709538179,279346562,367208497,492258212,1001345070,1652327261,1654453255,1132276932,543096146,1607396639,797565677,324263572,145992205,1677118352,1560532007,623026481,1992909596,516794754,1396549537,2051532543,1755108472,1782460406,640980268,1596875404,232925008,607389319,1038598907,68528447,1352710983,1770232842,1225949713,2094181425,1574672761,1266035250,1244275865,1089546080,544946620,2069752801,231083177,1302168356,836794770,1970996173,2121689292,1402964220,813015948,58819733,1264817425,1164272553,109378894,1824519882,1101041358,764035098,405707505,895140566,1789805387,1318223325,686955272,1535563720,521416632,1305684057,628355920,1541257350,522375561,53573810,231472488,997420177,1109783975,368879116,1921844258,1523097563,575770752,727814981,1346968447,1588694467,598262618,430129819,224972511,899913980,601668065,1571580220,1631284488,781421881,742951357,1813429427,915474348,2046550196,1104726419,542360883,1799186113,276070785,1220548770,1161398477,184891527,1859560578,135709226,290476705,1211803917,2113756523,1614312361,1025515210,2040592722,1339054921,1114573625,396446145,1641650703,193572269,205796018,619154430,1848807628,1438254005,522196946,288018083,1569468777,927024859,1643740815,1457716419,773699337,643410270,108542646,1003850751,1534451869,1397982439,950517444,1010501806,8718415,90556932,1956018650,1637230411,94035354,1233536419,1153037951,1283723286,647653930,2077577374,815963610,2034808357,140405208,1372738581,871056854,2095087761,1462337587,1109668709,427812852,160438601,695836543,105845293,2117727968,1621946337,1883051394,121817942,1446779153,546300739,2017923976,1466147278,721683986,1319282342,848636843,364005682,60666181,322878423,1225316338,1995443235,936339908,83365907,1982525524,908226087,568735463,247829727,1820366342,1312969253,283109135,860261841,277418049,1852902292,1171699171,118938221,1553421791,145402228,2045462822,342386491,799953170,778494766,25187318,1720230332,66002114,504733921,721007296,1135381867,844060178,1357626962,1277366731,828231971,874014680,1085001418,313488708,1351354253,977380677,1810509137,421402137,1356559930,1335152461,1433955817,2115328744,953123495,975304614,1847632182,2117635570,1258925035,355769623,1000287692,1167249634,301100433,1693432697,711587598,873688138,1256654726,2039141477,1068841678,1594953622,129589863,1438793487,1776885332,333099159,833760628,1877376337,887239923,1830525442,435010498,2127035020,684998690,1120216507,873889201,533409485,567201415,187425600,20263496,2123395002,1334033099,761471871,812310911,411401987,194215327,1966449828,1972114900,515603348,1803495823,1189983248,980854962,1744972939,242725293,1763677820,291127552,1767178708,626796702,604753024,1302479277,2013051247,1142512203,2007082500,93639934,2043279083,1349008397,1522263402,269319291,147607208,325391478,909878001,563084550,1625109432,279247695,1208434435,720917889,1200398849,1308807083,1676569189,91555864,1698396277,1978949082,1158958110,1917431084,2002442194,2101111489,498621085,1501033630,1367764951,1905568913,211604411,1737805052,223556851,663496946,984060447,1508469056,414938911,1032637065,1339284637,823684821,1914186123,2013908453,15657884,397321504,218350866,1537423684,728844368,1677456056,1166358143,398350453,1862886537,1516430226,470793206,1972970417,1834157155,1718968691,1619726886,543804065,1896243229,1247723286,843303635,1656626880,2031478079,6326916,1709745515,231946710,172859818,1998464413,797314321,1989914487,1777373789,1185446878,1504073988,893799898,1643713637,2017329376,1085913364,453967637,1574974164,568339322,102682509,985737400,1339715022,1057707787,1337097761,257728241,1146053646,29395258,1596727452,948932105,523491007,1020366710,762109659,467861606,539208622,1781854152,64865953,51802585,1945721556,1020732668,1241103689,1105703928,1370950020,736052953,1858572894,1251868114,2098922399,359404459,116010083,1779081844,1343474162,1863610484,1953239198,1097910191,1271503745,210781611,487267431,885740175,1289143533,1219750882,191857723,1674246641,513230757,20382254,938215870,1782908889,377255856,686213258,2078860454,45536362,1513430276,195605531,1287878620,153662419,1193483312,1313960936,2034840006,83360569,1650263254,82457830,1862774375,1602013883,623913488,1629102179,1976299142,2006665324,823967449,564432746,724863865,1228059055,1454259179,996720158,1215756314,1865866550,1216118542,980143156,100522028,1666743827,235522604,135601152,1747040589,1032012817,1804387022,1005737564,119057320,684509111,1753297263,1797671754,2037963891,1367265369,488386165,1905360455,1448417363,1866487476,1477746438,693828455,860767284,1284410802,1340328568,402691013,455915335,1176739167,1506185309,1297831395,1742941226,1527023062,265697555,1953638803,66132783,936947607,1136706066,20552961,389945124,176309393,83344210,1037545321,1391201905,359103232,1322685426,234035088,1665432926,1047294795,906382422,1718575061,835501078,1119010210,2097655460,1172589032,2009068228,1000382206,141072934,249286377,27590601,1742489147,2101864366,1512411894,297546205,830567939,784616171,616420676,2129591825,1554033036,1255448642,2031292961,1243160514,1703615554,2000621580,1873411318,440967536,705650183,1144975408,691574187,659529577,1767228409,1692031011,201673243,1524457241,1631557891,1142389976,1859664460,1638496116,654424732,955633271,1177651963,15253756,1110298018,2061790988,1921406790,2029008616,883701982,3479349,806432062,1893421623,1111165312,1711832929,106557473,259593926,335677466,1085798800,1971593337,204407640,1604842894,1835279243,1452903687,285368370,952208668,1654127058,631519303,1665333754,1639528210,1405915829,1107107254,1217738720,1989021285,1996719359,227130504,1611157932,1260106078,499710311,658998282,905186301,1534841705,1211461807,329667918,756342622,1036718932,2076350550,724011509,466068853,823747840,1410482642,2103780158,272581623,741495477,107475963,545597214,1505317625,1431741187,415865265,1597191968,1693686942,445394977,796197083,1471200507,210660045,186963301,326606702,1985536984,1560674859,1631097052,1207863321,1216173714,477663744,707932067,663524510,1103181072,546122923,323430265,1666047814,206990739,1747568917,978784869,1020776188,477206228,1135415644,1501050622,1990449979,850323295,2012868622,57997419,685246711,103317128,1716154012,881472008,1730302978,1584532637,1535286289,1835814197,13717907,2053365033,259355187,606474635,2032093269,1361341934,1419756504,51062608,1965048631,1509298017,1222147977,88870123,217938816,606139833,1891806136,774534319,591444179,1432829102,837403045,969695218,1962495209,1578920271,1134627394,1179563761,1043645863,978796650,1410221296,752064941,524033386,1223071923,349796063,1703524803,69401053,1779416410,1044703424,260185493,1342438135,1406011359,735648684,1189435441,1308022543,1010037368,341938724,1889185786,1731430844,2121724575,1932768811,515422275,1795701264,1960570334,1620371399,208672564,1116736506,746398031,1807119575,1855816945,1963641859,1714837193,846109271,679618445,152291833,538475342,74841009,206513798,170131722,1526073817,1661076968,1080367279,858184754,980304619,522154240,1544316414,1608419648,1281777577,2119334903,414032610,2054740982,1516469948,2073665571,606084103,31541516,1169719560,670379756,1187909347,1369134197,374251053,1292009034,1849844901,1168011523,1061288353,1182758683,721152865,977099031,981756126,1780017823,658684606,489144653,124571485,1467210307,1961459188,1788968850,2118325456,1088311490,1078671740,2096459348,1464604396,1930152467,1714950912,1653023742,2000887235,1972354716,943031223,197663063,865533403,1869993329,1217292688,228896208,2063163535,1974338193,1716043828,1186986516,762581213,447843163,1715846079,502056548,1376718350,1849322298,751106353,1204110070,413033940,2016726381,655640206,364438333,1675144845,2124311292,1334124895,1389021240,818021225,1055711004,1073413465,630464566,79751025,2096308823,1308453656,2046006119,179907207,439924867,1126214101,1891826027,661726521,158051074,2058478403,305247081,1912172124,1463921161,544249443,1268525188,645677675,1987631122,1873694516,2029200931,604326285,2034072623,208720650,2025628894,327777265,1446122055,752318457,2100771613,80430705,320916316,672124223,2082536014,1768499204,1782716072,424560999,1436806550,1162950516,2081441899,1893111821,1424576466,293272753,1476883597,1489508445,1243728483,1864448234,808581442,1694788115,141700925,1015684303,1311704568,546865260,789865264,1621235853,1857347228,285756268,827762377,2105856239,1715583879,2005164902,88281593,1894320736,1300698687,1405648570,918011522,431451498,140643121,1207890851,2070148736,1757377082,1341101160,1325364671,1518062964,1838116658,1597914677,1259240356,346721287,309662270,876894626,97516140,1940855365,862120303,1912709468,1737434186,124958361,1062476795,833582002,1279976977,1394851079,162271052,1832450246,1186977913,1745843628,770339678,317379450,428900295,1307251691,267863028,1385925636,2018890105,563477224,187522823,1628450822,1768484314,607110064,1350866863,1692224279,91552050,692938156,687829793,693520701,271161928,298745690,1643893926,1519385126,1243710453,549307239,40560988,94949001,1205250230,548732169,1218263106,1010230317,959776468,1936306040,858839973,343686342,1676464078,443840756,1936664389,1344344795,160050101,310318330,1316131095,734198987,2116007446,1926483479,2010603808,872406291,1644524374,1035609908,1953929521,1219255860,1226032542,545665593,1769233730,88405597,1648194358,1769929651,1775677557,100978860,1884422765,147351397,521185473,259255395,1647993228,198066807,828431790,1039537687,1072439990,1244922344,1522091222,1246335454,147809545,376416112,1118688945,14337929,190017376,1559061624,1973422397,2099172064,290256028,1406331469,430874595,1530255949,745916096,1661924737,1216927347,896477401,651129939,80640543,2054212040,517431100,1750683094,1400082932,1041374377,629057822,415442817,652529440,886216317,48017992,373132937,1412655309,1878692855,290759872,1294274218,1618643797,408511952,1166131338,1218758384,1811299796,666507727,1331876733,2542002,1343527841,1468848978,776572364,1893184927,1074102879,1458700570,191346232,557678553,806559347,617429510,1785995563,278581495,508433581,1372684088,206384194,695730242,1493393583,253503757,1322496662,719410878,561764785,443574895,293035151,1810202389,1788782991,499420315,84887037,929376502,1583697671,777013252,214210265,83032949,1100612526,443648115,506925507,191436004,218305126,2023886489,495058534,309162107,2129287059,808138179,1294234785,456555366,1846910925,1708655549,900815575,458653857,677586186,513093268,1982629756,646894509,1773243811,117781660,437147555,1253399186,1709531111,1321191230,42093992,1543152410,1390785280,1131323013,506718238,1530283025,1533647630,55668489,308510669,1803492599,850334216,1511553385,1176484520,974159175,2111858052,598428989,1085117016,1772278955,494948312,1815206525,1936951885,1975281389,1969885060,1934477818,972570630,1378909884,1138008906,629220113,1345128014,1093055692,1148828040,1449978609,1987362734,1506029125,548966257,863542098,1774681905,1453950824,1894391761,1141117470,1913384769,1661310172,45339576,1908833869,967858861,423940465,1407108739,699839164,88322173,2016470256,2095070031,925631733,1283059085,1878686791,846196794,1537022277,1205787122,1740016304,1882129291,1955705252,1505052464,864702051,637516621,1540209535,796993973,382287010,225322222,354945479,414792094,364379413,971134298,2118860809,88901997,949873972,688265315,498091630,449688564,1506496132,633448181,964518802,1576489790,1877210264,159835224,934437652,582759167,1397858897,1715357371,562446434,1073532715,1502998754,762847846,78540912,593353170,901642527,1299501333,220853894,436840095,150872035,671632711,1304329939,1238493155,2097828081,603851563,1874070087,703455654,718418327,1880423746,969036360,1577453520,1990477017,365842670,1516939192,114171900,827623788,1593019155,81371406,191661895,1143873033,1964011664,223310122,787037150,2124044005,198489005,1826472007,1056759653,85887013,2005869020,120855305,527546674,367757782,976330870,353180131,1970066802,1179053091,893666213,163766365,727453550,1727354960,608775270,631317203,1390848147,1059886037,1354265591,2106852971,503217304,882942141,1056523326,1338257897,536649300,491475665,129226712,792962836,363737968,579556957,216580875,1053195462,461374591,10291076,171467098,1949386550,66026347,1306972112,1306469788,1715221045,1401691434,1117510467,897109543,1263548234,841247911,1360079824,1866250416,698616050,1049200212,768192687,40692288,226788384,1212839352,1030395538,817842900,864665721,1604472639,677103631,978865939,577818903,499009701,896129044,1258352662,495327505,1869227567,1034332732,261013891,271901683,1590355199,850452977,1731168919,475443886,2107374826,1612430424,784899718,795865909,1162384897,1754992624,1672352007,343143564,1006887378,531944345,1239187131,12483669,1023008514,807688805,1573364823,1132260895,1746299755,1158899498,230270235,1115838696,992205865,1934953591,1314641982,1076686938,2087580215,2124514346,1313319814,802015421,702990936,597092479,946121777,1376943729,814877358,823095506,588200164,694051966,1410236414,1602527540,2004098710,1641347151,1382781591,997599995,1597672351,529627633,963834173,1745282272,139306379,570567290,1223831107,1436741792,828266779,194839482,1312633773,469513806,1355164856,34897513,957433097,1500943696,1965171658,1786070555,927636914,547358601,1382197189,654528262,261316297,1361284411,890886124,385068935,1343103240,1271729537,346357216,495741026,858911788,1087211892,1994452900,2103584034,1309026938,811348791,1408659274,946787379,1713990287,1143937320,1753348184,214392997,814639523,245704469,806979823,1750447750,100330349,621399974,520956143,1153115852,1656269297,1746796652,1520427491,851418142,1973964954,1421555914,102370659,709025267,1402340172,879961785,944695616,1813389415,1215287660,761464250,2102848422,2099562537,1108850769,1411164072,736346290,1708662679,977686079,991364545,2001117460,1346160476,1655281569,1621723031,420894924,670751541,196060642,980189908,705283761,1132334324,37943982,888443818,1745564811,1658737459,1029863875,283786286,38484541,1186995354,111366118,93516109,99767328,639045561,694557245,1889863456,1149050954,991727305,242954119,823949084,1306163972,1828276667,1862013259,2002129601,849660383,112110713,1386194894,146877966,108394896,1011026538,1815378500,1565680595,1914785838,321563515,1478020641,113506813,1938716854,1415917108,263748604,1950918668,1578696005,1860666656,2092638517,287755688,999430952,134326521,853932299,726227320,2075380252,1121908193,1882847508,263031151,257157503,1714372562,845159980,870019363,1032813802,943645565,717784826,179354803,1575344165,1472038975,1703022844,672272149,713158574,364210308,1178002482,120296736,2029499666,642440028,1682088148,1371966746,1291275537,90958298,2013062203,1657496061,185774289,1746626642,1310166670,1570460297,1183365917,1095904169,1414836811,231882750,1577029111,1759315399,988306675,365375320,1403007258,1344696988,1465685319,59242646,1288935518,924193306,1958284111,1453919426,147397894,2001943192,61865067,1161774154,1227561395,970574944,1524830606,308975728,497725372,1959358889,941510751,971936631,1270792090,992955922,506494936,1839266523,1905783204,1086964396,1921596902,504403178,2054411490,619344447,2061900023,506020371,952313733,958757298,511071894,1815607104,471918861,542349316,413715127,2085485106,1415659388,389084122,1331771952,1018304696,109359025,374867853,810218301,2126528896,862783065,191466097,801477128,804591248,1608416547,391037832,1123612254,91760281,1095112574,133113431,1514959875,1737603548,1968167409,1801318222,2127017411,967808877,21328321,1854847155,1156227601,347491880,122235476,431048317,462326188,1747885471,1533913309,387773465,1789863405,1943178644,1332492715,1108595882,2124291675,593039627,1870174452,1032363170,507322355,58528368,1251294301,784654997,727741211,310216536,1013844956,518004359,1389566941,135822904,853532917,1589882173,1336541485,1826832505,313405036,1346521510,1388298684,648426872,127793112,314850274,1398751074,376867594,518924919,98349187,1646959072,1762123974,796111762,242428389,1587466413,812265783,212255625,1219696088,360367327,601268339,879172699,235161683,1469888301,1220358699,1888911191,433009757,299368406,1516412840,764980749,1155384856,798111316,596874190,808977334,873272017,636407989,1371866018,1651316666,1749868938,436971814,882714709,1617969611,1004354799,1999829271,770370925,1566650451,642638893,685416047,2129989266,1185061742,1838033251,155939056,168629182,876536127,479374788,146787543,1371666382,2024782824,323110712,1932746548,1462626131,1726989735,503304445,581235045,300460144,1782902092,820860972,1050289188,1822004371,1935078126,848973905,1294221270,1041670935,1714379084,896602992,1183019130,1906574467,1052139233,1847963874,936906907,1077001778,2067503736,1053587333,1293700179,382892260,1098701082,1006055884,577218323,600877992,1580906985,1724482633,743126189,444889540,1435719224,1028279019,1286417307,2108655704,900954637,45593636,1053798995,557547744,88453233,100642275,1826195529,838599029,583488248,42635319,89774220,1256379729,2060999643,50951431,1300323988,597096997,1044988183,1606834666,1202202717,2076547400,267089711,476234536,690621324,404417801,985868079,37898520,185333438,381823672,36723244,1549105044,122692661,1919792945,526483282,1197483724,1917179059,1262312614,682909447,1724194682,509442632,855443163,1932589673,1520797516,1643698330,742885263,1630824957,1792125619,1604286508,1985587915,940843727,162176180,846556882,512555673,1109504242,811076163,2022397758,672983801,1313650157,1604607768,69738990,1891694252,1768615710,808926839,1389124032,448671164,1023868861,33841627,1207868178,1490910685,524401697,1104405969,1983908018,155241524,413080259,1446923259,1186880730,249229779,1363776812,1548683315,770755599,1060845849,182224831,1462665020,2051207360,973009943,842864117,1403476256,1454384981,1791521289,1477970015,929289780,410832785,1200438252,100224237,1230796913,81243520,1367018500,190837048,907006836,1545505814,654168057,632421382,410354699,249723371,1228984195,478090418,378741468,232006458,1776561176,1018898585,811746401,623289744,955250409,1197661257,697668796,1545599201,1257522320,847260383,1387368398,1742305036,807777375,1164774636,1878189832,1183528476,1428055599,2129706085,2017589391,1867244990,1916627786,1682054468,668707458,1072625428,805510871,432923490,1494644242,32029777,67795966,1677276304,1060566316,377124231,1550943652,1783625242,336315788,1885732430,1533858444,469454815,668755385,1774772558,1517047091,754921793,1408162676,1953581222,1862669586,237948262,1440071774,136335502,323498043,875921624,273785633,1884571224,1057275020,1065632901,2087971675,1095741382,803576235,1448587672,1410164918,897445798,1997303634,1848680891,1348219089,884092273,1048233824,1248500074,969137358,1439192698,544894144,1949737748,8526533,1103293125,730059191,485962856,2102812970,398694321,705798824,875354905,1315572634,1327396598,1070264409,1328790156,1425693543,1125873637,175837478,1231889174,318051917,819705745,581348566,114315226,1466603050,2062843708,1544181291,858954075,1834875871,1322191641,220654716,1830859582,537087896,1157083608,1794870277,1646149703,1541892316,200184939,1879639657,1623844129,336787522,619635598,1550634829,1532608735,1377412208,850344313,1454515800,2117066028,822958865,1842719564,486250131,1648514952,557037668,1883650813,696450811,1281429596,1437942757,1283200161,1544357340,470926917,1933585152,1681976394,1592896358,355708245,1766884637,1581182067,1489889135,98592484,1394477553,1114632824,406078869,1678626245,1571610116,940188539,1073888220,1128699603,469420486,167431902,284914321,891320820,321044589,2005031683,999058327,1119401460,2078734513,1254822837,628131568,757889771,757917400,813825176,1246407998,2069312056,1899665166,698561710,277646534,494145274,200544224,1670344568,1027869717,123778253,1894427696,1909835367,546031190,491912713,1567643643,2031353288,750295470,155909259,1888781569,646048057,1182502047,486305951,559301928,263937478,1048208283,1319609916,1955737286,1321925307,550594308,1376447895,20288448,166391130,381953687,234635184,812664270,1226100316,1471883873,1955865997,1227012856,578676438,1578396906,1187011942,1046517576,1939853561,413923457,298472988,1282433200,1810520834,968944194,880298355,1706317587,1363495514,320514742,222626886,923833887,1965400016,986581534,1856766585,1022812649,1056685642,1714709728,868549544,953489301,482300712,1858877647,1976311674,1476126667,738204722,551074301,774940838,1585544565,703815946,1548522897,955574157,931329228,389824041,24163360,891611766,1260118085,1858547008,1159056078,1619357114,1362640390,201879981,84822866,587376103,350898188,2082897752,1397586977,1307311299,2037993518,572327027,592671671,1625064747,158781725,274608063,1324822801,819321768,1033462452,1241097683,886579664,165179614,1515784549,82677208,1335296886,1701019199,1231981870,1749019256,89497418,1148206243,1467964451,1194587036,1812121443,1073465167,1907441445,530675733,5126747,1789747873,699642974,1158865745,1436533836,1336232488,1861639047,1905197901,231270987,1359531419,1678453247,1226119352,1604019935,127421676,1128699390,1860772569,1007933222,1431295542,610600332,1400915561,1798014118,1779440106,921060572,1616062574,869845054,611536915,2026660246,1278999510,603859450,1469451575,1274846156,1016612997,35699047,20127660,747405762,135262971,456170266,2058382677,1869710193,1652084353,878983067,1249374763,422033125,34011759,1963601824,158149098,661339244,1805079837,184362603,1859076681,1681998967,1020322214,1256043873,785103119,19199269,905255387,101311788,1623051880,1202937550,1527261992,96583345,1226380781,943683491,87304333,945359709,1581581544,2050394956,1996418124,392320998,1621186604,68660068,15926680,1089582871,2003410509,578914237,1629878472,461091741,429179627,1046720468,729876982,431982487,1928990429,1095908631,1016995822,232581348,1587097019,1829594702,1322256222,209895324,1904782786,1743435020,1194197774,83614359,284856714,2007430993,1725613322,282480231,1349704909,1945432376,1055440325,1273981496,1355505981,457287963,520240412,1034738005,256579120,211888986,719429888,1630578550,83585376,850726107,1208440236,1771288012,834121990,1176445939,28932101,222425501,1443850794,722654305,773998163,1212288095,136891018,1812985586,1946594733,1713865238,1493935533,1900455947,1308900886,15252174,1286972595,1165638113,898093170,405183697,482838921,1536124120,1715085398,355042527,881974206,119293460,19509372,1210608710,3186530,2062963476,1858680031,560613698,646888287,1325826787,223230002,1964698668,104554213,2123056267,1024370140,583414909,621339439,394893928,1950380199,1589366591,1852948737,1059168221,84167259,936199475,699040734,1943827071,651388910,1755110904,1674249020,249362305,1365543710,1739210857,524820129,1573144961,1054556382,966768236,2095411723,1816438433,1629285062,116213349,280531400,2128946272,1334093181,1244872794,661639619,1847166657,674356213,670807918,239418199,1896153867,1341259095,811507347,976327647,638051997,534807577,508271861,1686356234,2088563442,438477094,1669709618,1984095246,1795449145,1464136261,956065018,1365123850,1274910910,1209399307,1628240790,1058217771,1081968026,1882822939,1129531505,1269600628,1125345413,1226987535,1328300743,1059246882,1533734832,1227990283,1617297246,1702134675,1700730764,822930683,486814686,1664730530,1248321702,1671458915,457822047,1884632776,1386668596,1649631656,851344154,1264304587,751257316,973362309,1747605555,736849391,21954175,1265479663,19890127,328192039,640408188,1388137880,1139536242,892492079,1125490560,1517644452,1126479714,219916307,1643666062,1032624995,1734255078,1678415301,1710317885,440947437,964263455,951812922,61147351,967133046,1076456940,144803590,211208432,1474012497,1550529972,1730495688,1151149380,1125645419,778262145,605066792,1196277220,506441329,1046214212,28997689,1578672141,712345882,2028707815,139202932,1958505784,692895368,1821329018,297071468,2030516137,35670666,708334357,772865149,339993401,1521342902,1731709609,1305896331,1088087393,1859396793,563737751,729188857,334651403,1083274974,1623696965,777431926,354509670,1609039991,270211970,1398646934,1180905212,208078435,1204311419,1911962852,1067090367,1819732714,1477733513,1374187279,159154392,10735529,2057702265,1332296899,1112900669,966727234,782038218,1697104544,806516962,1881144929,627429632,407241419,1403413104,422423678,1173197648,479770286,510102834,644749207,126035109,1024418902,1569046938,1720098735,1403254243,172893882,84926497,234106363,1678211866,1726153091,949795153,2119943862,1809564455,420782892,686041266,1409854950,1911711768,1545257366,91254206,1584572448,814910955,1367209155,2049168422,606366953,976622865,1905474072,626090936,1945957291,2004179800,1554818995,1364218827,613486007,1128769187,1287348459,1972637744,2025462550,194095196,471978154,359005346,1280653189,1334492848,1732377595,247174941,1548869072,1328106592,1811436644,457043326,416333277,752492157,168681254,1073617209,371865680,1154775038,825602408,424959279,1068877049,1506336788,606174729,194693453,754220906,1903226365,193570185,1994558065,430584996,1654967281,633399450,1048131816,549944414,1638298709,246734728,715679202,537050058,1980785823,15360049,292059224,27978384,216208233,1070502450,1068259731,833327074,1297677076,415994438,1021266305,1895609792,1075532153,1610285487,1099241268,2057993441,597633405,263544357,989832464,586849007,683243075,1033205196,2001671549,1047151528,1884598084,1746588379,775493609,1918526471,929145287,1123992115,1765890874,1684429575,952738159,1644735244,1400064546,1234280607,899978523,2119042110,237231712,123413928,1599973286,1301232582,212883321,813792462,901080226,1226335587,1400647668,561050971,996848241,1570699063,230777006,1041275455,953646679,1736897160,100953394,1162864423,581654145,372451759,252453923,418190435,1706878221,842369306,1328128415,588383785,1883293264,669941822,955109021,402340644,1989020293,1604410449,1988079062,2058594326,1948413014,1269299768,1891473318,655504885,886860963,192811915,2070336840,1127304961,627710282,446748075,1695737701,52029704,1211721585,542559133,906712939,919387154,408692092,528786523,1600946853,986352457,1145002945,1548928362,2125439706,851449879,679444285,304888634,189513049,1341529442,1625045670,1166855113,1938770259,1732875317,1263870732,690059555,978649349,1772695981,1424829700,1918208369,2000841978,1977630858,800241291,2038524488,1528842176,1306569236,826555311,493352859,201386974,8528699,2126277391,2115610654,123662999,1329337409,1597696069,351224909,1781253377,566587590,621257295,970108352,315427986,461415560,1818225449,1150805104,625141239,1812188305,244816838,1562915569,647775345,1917152988,428453767,660027837,1505727086,558449253,2108761415,1360528520,1914117195,1557659036,2115786542,873318963,706779851,1937130032,1055437140,1778630630,2118981216,103557237,1750405174,299444174,1608292458,392719515,1887381207,2082481328,478202355,618455528,584935238,1524963740,1390866647,334040015,1769466435,761854084,1164615335,131284413,1801770939,1649142541,277481196,1780623925,2108269149,286931312,1885945874,1719972562,557349939,634570450,1836489318,2018104573,1965173576,1805911159,1914564597,1039558226,2115389320,1136897621,401371168,629030603,1852227613,373311506,1157053647,214169998,1568987681,1539467301,173975542,1051696307,155378758,1954468175,1854909043,950481041,919791902,174942698,654964855,342296555,1643416023,2007182781,1081283020,48750060,1090154851,1040627705,2030050424,1629011700,2089940720,127396239,699527782,80439942,192333588,251643040,1372666483,1991777809,593764153,1541238612,371687060,27553881,1959551130,458199838,685606657,1570485222,1393630480,454030233,1612483917,1854380827,1664124613,926382273,538247719,2058243218,1758000887,43484109,1244057788,439127507,654191792,1660925024,1033880516,2006561467,1025168081,200297301,957757349,629503022,1986557745,589661329,1824236440,720897548,1766564964,1404764927,1314695454,986834197,1023816613,1230749707,1236971450,474414680,412855308,967626721,1121122991,22328758,1514413144,1236657721,1443032432,1726454480,1053944798,1874671013,505022221,783863444,804333746,2009728905,1972512860,112014351,1292429551,514392626,1007767406,1219362969,1767639449,793244524,775016097,1025715432,456400878,454914642,805479933,1515111030,1407044550,1015518474,2060954304,1504792099,552560500,223830781,1331883640,189976436,462999344,1934160785,332497805,1614709955,1989285825,562957550,343664866,1998190341,952640405,1041133267,335455782,1623453406,794710395,469168223,1508148701,109207136,815532252,535025692,1691837998,1722920653,1726195957,1742152101,1920477410,1575008539,5297687,174812880,254625721,735029698,96565635,973022723,1017005064,822184216,565779132,625643184,2058205178,1492034420,1380838043,1143916474,19791518,280191135,1301421212,1838439380,1972648164,1338388215,1078730553,1841132501,1062882066,1921588357,314473468,1058352254,1508036294,484537189,740437161,1005088304,920410194,1639141919,450708629,1185848034,477553613,730912546,1588020944,95617140,2066632501,1637524752,1880675533,1562075482,1191561358,617060018,1105560132,390605313,1513504454,17430825,1739448853,158194082,39071573,1406274087,1114450882,1746295790,734086578,1086108516,840493726,829377323,655308546,1826897765,436062736,858747720,1129416672,12167184,1632216899,886912168,218646896,1639944872,920571887,162746204,1009371877,1700976925,59265016,482329608,1483454457,136798045,1118582471,1421548276,678079295,1461002644,620811365,1622806566,247111146,1263719701,409727410,1551579053,205915227,2027055953,698790949,606201933,155782818,874008575,1581848158,730446896,76803390,707505594,246484998,1735050503,950338527,601439374,1503750986,1620476597,148109487,536424206,536028121,1443825011,221673213,2032266889,446430640,1062482301,1455906618,1802832414,940837060,106480475,944284547,693279564,154481251,1238947831,362532602,1016446242,566463178,1268417994,571182129,1814754128,2102816560,298241409,1695366309,2017547018,705480469,1542204244,1866212991,1333996065,26589171,176154890,760450839,1678819161,970403344,114677328,2011759203,1526337932,1553951575,315414772,1103444920,1325536871,2113296597,300020195,993687192,1696664779,559034765,2122347507,1175034343,648895119,568858927,384854591,1009992758,1837516875,776766377,1918572379,882101962,494449087,766071766,1640240140,452875981,95523049,997166103,416168526,943850354,640803879,1580591349,144655475,1403207975,978777645,1634650229,1125880224,737727572,79603566,972660711,1066484026,1245735384,1855273071,394298817,198079877,2093837684,1247494334,756554086,1738129106,1315254152,551203598,725411355,1188283444,1075772747,282979935,1479967793,1889459092,761764001,203716328,1805175243,2015100053,1753936423,1543103580,1152937494,274732341,1059243448,2026675884,2130314851,614930567,513337683,636435663,137625837,1076971036,1123071763,2042004359,1222632214,1800587268,1274114955,1309859179,555094598,777094659,1150327534,1458203284,1194342210,1399811401,942296241,1971183509,229408847,65883788,710046419,595483502,940214091,1012722498,186083537,815211964,1195410980,489905068,1787251991,2129389242,215152073,1987789326,164768717,1037411256,1378392744,307607889,1842814925,335603835,1980293761,983558380,1512432416,853647842,1941992990,571915286,495523996,977295448,529873738,39676417,449756134,1734422075,1572805794,1077331332,1040157259,1250261703,892827299,841702943,982814481,1579478591,319417315,368700806,928839195,1965737975,526441634,1376158897,272498574,227807787,131407662,796132028,266746033,1978338681,1931248914,1500655866,1247396547,144634914,1059123309,1912928085,375817912,1203505168,50855308,865889067,1287210729,1693954848,564498209,425865263,1135268456,1888057039,260905519,1996186250,2009978423,1943250811,1812944399,551944014,1656644983,217012830,273874313,1602752530,2039815612,1294047679,405500158,1037313851,233929017,1657601260,2016106955,1479604334,1251270996,1649031984,451723331,1387200425,1907670902,1063344697,1814624021,1507431757,428313569,2050402821,1906481249,937803637,1741680512,1661724398,2101927920,1491843852,950967904,509513955,568467498,1647136019,410173505,1633039353,425354876,1875738066,763767486,986482368,781206920,1451574920,1314755017,954986518,1455747646,946386543,1967416422,1199421865,1384177681,1472609303,1314455595,916119893,2036580057,76247766,820207895,364113993,1659524861,1790369928,1274714484,931490132,573075448,1801090795,1921801709,801917332,213886439,1080482440,138612272,642577119,570543629,479991169,824086021,1876952247,1610140323,1271919864,1363910172,409291995,520923482,1873840708,2129028569,1375945011,1955359563,731037543,2066077695,42750973,1942846520,308621973,1200387772,438879244,1060066989,1383168500,1542432256,201474812,1033902905,1516907951,1765252268,2050324841,512004043,545085107,1439127701,1817228914,460687708,1994850514,1654787958,1429636527,1484214872,1651085542,923321977,425382870,1780940058,2029914134,469621293,391668686,479067451,508218447,52199670,367507490,308348623,535569317,1386081050,1210126758,48801841,1732915405,545003529,494174358,772648688,804139530,230485478,695951270,2078494630,76852812,110006800,565575,264236916,31464179,402456093,814279727,1668711566,1492006368,1614522752,647045510,992385123,514792519,444316917,657830132,2116131100,767822320,798812285,209057639,1361765102,611469441,1907828447,2042562075,963905778,277911978,1987327584,2012839066,1755312969,776475495,901996680,1787449013,1182196422,1155244262,784678317,1118899951,1197644050,1568629789,322634492,1701259910,1110909581,238269080,1704358343,717488660,2125966556,2104685234,1440777541,1391096748,293249836,1550816752,1045412856,1273195782,1541580854,1415277395,1429849714,644737782,1215902557,161796032,537605872,1035934675,1480939077,1428340505,354453243,177237670,868306847,1157493547,120883327,253253608,92827100,267328258,717826226,192021645,183824766,689082717,1912592186,1457008245,1463831934,504987834,1625737513,199479749,127658086,1961090439,708613804,556325260,1299099125,1360697824,1864804401,2095229895,2103331525,1206508212,798485399,641074425,290911145,623424586,1553330449,171005590,1382809344,1344861260,722043961,507157388,1782092030,406656053,1837568180,1141212214,1670753640,526141770,13515863,510854917,157029592,1874904625,105847686,878518708,1499534885,1105889166,723649391,74944455,1247027060,1353942965,1356433206,394558754,133974763,28735983,1793091089,2078542312,1050248897,1468812091,562706235,618014533,913623254,1453804652,211278392,1293865338,64232384,1513021182,757927327,191823768,820863275,948785100,85946974,724259923,930026011,1359356557,603063637,1570318534,192641641,798926344,234730657,1093712118,2066150627,1230827376,1665171864,1432555565,1106663097,34713990,1433475228,494131073,605542512,846430228,1183421610,1664290523,218182832,2018047783,601331713,66575371,1459272726,1028072202,186088528,469494979,1224770154,1424066056,1523300210,1853552580,1855421110,1892149328,1037677960,1943687317,1239895153,150848624,695315555,16580831,1825050779,616366712,1557830578,890922015,490375882,1584499933,963119953,2059543091,1524084756,1080222295,85608791,950798655,1834901146,463921470,17622480,1809332991,1781873063,980396276,1313377666,790238373,739082892,1649592794,1427467520,1487834046,1166448931,1815506559,1662533199,488332879,1805879123,1906448850,1376985846,419724554,888901984,1861721358,676386679,1409617571,1221722056,1048031338,799718147,701116377,1890916414,818391042,824545168,1963295098,1798429832,1385934900,1688081100,1568541835,2093716140,1609799843,946430876,1568317368,127912528,643368832,29259349,1959345418,1989297818,969168167,583262859,480099480,1592209158,298812796,2086081714,1314309418,1160978806,1397518577,1403727577,1868742037,466025847,94100596,820275743,1903905799,1149215394,1750407022,1537726478,1148972649,2047583819,638798740,403861300,1015756995,1279596170,1401450636,1714497516,671307428,874297832,1127797850,1364010445,503756735,1948245440,376356227,1079343163,612321243,839927659,243835950,608143904,888613013,2129646841,420820167,546506362,534261544,1241872639,714214915,543489548,684932547,330215459,1436183757,2019898633,1257956287,205100240,2053801955,1323760605,498869671,18281008,1360652554,871872776,740783459,772872554,181313650,1501596509,295374058,905194305,866609300,554574312,950607348,1904528558,445976581,1961057461,2019120400,349091769,1266257273,633230795,1898989216,1694142532,1607816982,338862261,1388262554,939041873,1686123911,285462503,504197371,1837858087,1206534681,1886636231,1356052657,1037955733,246783106,1385420515,1562455988,957444775,1841309724,837004914,574594060,1847691278,568123489,821596969,2056277591,1673655630,1896821851,369752061,1242312347,735675832,501994346,609868880,816144883,1334840177,466688982,846241172,1692179573,1014222033,607879575,1545833973,1215347075,615855850,728561610,1967127635,291299989,50145857,1861785460,633262971,1645638642,479438038,558210358,925847469,857240215,2081924537,113328167,739249878,354574773,438993182,1518883289,1384374767,223420531,1266632413,110195169,563678004,1490185453,1787205435,1061325691,1344952862,328737426,294290156,669895301,1430672242,1045953880,1963677542,974574827,2036776019,468598303,23022908,1057688653,1362098374,938013311,950215375,50601316,65677547,610822375,1348834733,96610527,791213045,250102077,1720929693,622723590,1625798297,191513077,1524505752,2117643777,1926228646,1837337813,1658312358,1328639594,460898093,232474032,1371705981,1358232349,616670668,1389562544,589635765,1892591051,1101872238,997841320,38653135,1486727315,1843678388,1260004796,1709335639,1296097196,1752821140,495941304,812932223,877807493,1015198122,470915897,492099731,37766883,894460698,675587437,1008881325,607664185,737421215,629410274,829707513,85771639,1257941796,710165219,592123349,1624443164,1145692637,1109382655,62144180,1161660116,1353163155,53592741,945635198,1051942708,1713426538,693603240,184491046,1303721178,1794662580,198507893,812315914,1471702947,1924939494,524595691,33406698,1059193227,365577119,1171880545,47877554,465596080,1441671405,657802485,512805569,1315040201,1985187516,910722727,778737773,1898026419,2040028492,1983303407,333118913,481342115,634707103,1865066553,4156463,1253057090,836305447,74079074,212505495,102838072,1760579942,284260618,1617497766,1074874087,871788270,1606640590,1993381034,1215106200,1270270979,1393512311,1450413795,683623402,1182235543,560184475,881972363,189669043,1061905018,1554541189,2106746923,1178610092,1773052993,528895391,793289385,358194749,1990244317,1217579555,1558781071,310803629,1053287217,1914766037,471032657,1499846015,572962531,852313593,1513488280,1506536145,1034374197,2101165,573069036,695429738,638383673,1891309720,29979827,1151914120,1599478806,603173660,1017508457,370801101,732358352,228658804,1296452369,564778604,249930730,1768415758,280581674,1780935541,1372298346,1506500819,1187388606,352009890,1274492458,2077516051,474666,1571013735,144300714,157477564,1549320453,1893437985,1215261266,263168806,1488835602,1093691871,342500999,308361603,1716505389,635941711,1726008353,395576353,164636551,779040181,1073745412,740412885,837858505,963165453,1875694787,114499869,1704094363,994847298,1283087437,1868620334,892927666,2101139909,544911228,449387849,1901453341,1319731771,987673389,310753304,606381113,106593473,1444711979,853344528,140722769,693234799,2087211374,17918063,1960896768,934635993,689312508,214477204,766495286,868267404,1060081354,792638817,1623250769,2088238995,1935133369,129816069,1220013626,1474126861,791624303,741442780,178170715,688944874,1402296104,2009475973,522932251,1378977679,1653043568,435310620,1717528780,380071617,705545396,667498792,585221532,1481285906,1295748983,1678816227,1022385006,1025753353,1299833692,82005517,89377436,455468189,713653116,1089760478,1328975658,854775134,1077624658,1577900524,1695021825,1568039852,1243815455,655609338,681646453,440180871,1535292059,1185958819,194194477,485691791,1511644923,1899711532,1025682743,90279327,35978642,738709263,230876912,752941942,517286863,1138733788,1007766471,176226730,1170968840,1166566476,2003998446,1992398872,863892356,204666897,305649283,1911550266,61508620,744212575,293656173,710418554,698315272,2088399054,1535561207,1146403907,788486502,1190718362,1122644846,240943704,1535410223,723518151,992251174,397276992,1506971222,862242324,1415634591,931226295,998909696,1500523243,203343198,1723916965,1659159128,1543732461,608541713,1219790979,1693178879,1909946843,631386282,435252679,851569472,1210131986,1889334352,1061846445,2003572275,1786673395,481298450,485962240,692848162,93143944,506659002,384670835,741554078,258231580,1742130422,638123024,1658993514,707423213,602991438,370609950,21333805,1251372400,1373590219,1132489117,718010666,36868769,1051533512,339603138,62028845,217094382,349237823,252787312,1742597523,2019606073,190053391,639767334,1052432900,1794193675,2036468287,137528290,374205122,1187895846,1183311249,950518430,526222722,251332509,117146449,989328746,662636254,1197862511,28275161,1869092700,615080608,481824666,2024745135,381875054,1867509512,1622671446,950825996,533428712,626306861,283590263,1687417361,1950150944,170744429,1965336372,2098608010,220078217,1198496817,2122735118,2048865393,7671599,1531791379,365649495,1864919070,1510776235,609518535,1988189199,2058693474,876468720,353704283,850738960,1416260750,240458013,842814642,63160642,324528574,1578526872,862486493,2093282509,1838969223,1606098850,497225961,654067268,647518017,1952158647,36716431,607386837,1204988820,1386476354,933375892,1863910972,501509390,1189965710,303768256,1585922240,663626853,1410332465,853494708,2127497773,887072063,1453152841,791543218,1855529228,344841458,859590451,682059841,2074465390,1951120747,423136775,1420076850,475045679,1471959113,1947548248,1979653726,1262863126,546058987,1206548242,1656787046,20251858,91411753,1762095279,1501339615,1641498642,2086623446,1166250638,1998517231,2027809669,1822816917,871060037,1273923863,1725955055,1802287709,1568416006,1795201885,1447096491,1306764183,679714286,338070273,1647816098,81216962,2037356991,1943688901,211829173,1286215436,735340714,982915600,1517347570,1251485977,1027767691,1743919484,1812248401,901273397,442812563,122643830,1188369508,1372583006,74395877,1065077491,419795968,281663072,1631394831,197121840,9230773,1718577224,1163875501,1330457,908004715,1131004852,1841238270,2087656043,405571341,52818037,1727036910,1190647538,1369750203,1245187234,1350460845,674568219,238026846,201439370,1655949915,1468366010,1031290985,1007997168,1680867993,484248859,632479466,1385077166,1442750949,637565051,114751343,281963643,1209880493,1551690252,1413476554,1347109877,1605270949,863318242,1866763779,1012682201,1454977411,761974092,2033534964,334220356,1943669940,44570930,2022863094,134882899,62078936,1711150329,566082023,1021675553,722970547,1303125389,1516580280,1893910114,1240667014,488284212,1413117798,1133708945,1253080688,784742285,409201848,1587722943,419485811,713272385,565992324,350005218,257850945,191411140,791315520,163757504,549056947,1217672002,522265036,1021662040,309655848,294469511,1891552111,1723604950,1874853956,1790781240,688023107,41909109,551304096,75152265,1577752918,1729315171,1729049506,399846746,687669669,1055419746,989270563,233869133,678506254,1296669069,150056462,204224246,1705647106,1933879349,741091297,1864410147,1192892618,571261555,352084885,1036842767,417332122,1949919462,1603181922,162506819,806834190,792149801,2095316826,1942952830,762690347,1910579842,875376208,658981655,550970550,1306200241,50066505,264855369,1147650511,2078367398,1204455934,1396149327,1060294852,2020903267,732949445,1530146990,1309028633,1031588120,717947007,173943984,1651143248,589001914,1732791337,119361412,234359546,327290864,1160237030,479643402,328795178,1528374357,970031474,2114163655,199325787,468923499,1723226371,1263206593,455603142,1703540653,220931930,375023170,1882224832,942744371,1868420215,840612997,676997822,2053299504,993317827,730706739,647366336,1058462216,616112915,215629258,1376025375,1910258191,626829378,1836511543,464403250,297241521,888903160,393781412,1490158295,857988215,1945825434,838719823,1991016699,1075888811,1842471887,1781801443,1172355784,1354790214,320513869,828795037,1082951819,212397458,284315249,731635233,584489419,1013461132,1685753558,1128876460,1325370685,1091149611,14305573,43113583,100080478,353910071,483441632,554549466,1688641634,259328346,118431057,1053004831,951984336,418900559,1973620503,622663952,1320567250,1240244309,177853054,161565354,364772246,954032865,2097791759,1568010921,237808252,309768030,633634086,973217307,754708801,630454963,869699516,2111732830,1758873669,144156358,304971077,731673594,1842094992,641031648,960308462,1029226926,1687054405,1397197805,3059729,2046710907,970678431,988458074,620592872,1807833778,169868404,1855111154,2110106291,2127105776,916385017,1194006777,1320639742,133823047,1133389284,128832066,1126909969,893815259,1425673114,113521652,1674953631,2032311415,605887146,1591764573,595540134,798064150,204733778,620525473,1659313194,1992023003,643375520,460672035,815464827,1931468638,563748096,644164256,565150080,905493624,1105350257,2127311737,1316501225,577661498,793256627,2105118413,682568374,1390073463,852460769,1848002607,1293679382,727589722,1518012084,2088033306,781895349,255410802,1559559787,1269086884,1084372130,723054375,1971640343,1406134689,430995543,1429270010,624501675,1543953831,1274139567,1480843797,1913029022,294888230,2037200897,469488856,1660859054,231348771,1620578954,1316506497,1443094033,1113911191,1013426177,1273091185,976868079,1602687835,760325380,417291213,7502369,835031160,1580862759,1578524265,1806508951,1048460616,1997537034,227983945,300407791,1475715212,1264192464,1361793615,2030477523,1156477553,780510667,1367252118,505201821,1681025240,576746261,742955608,967088144,907484712,830365212,1693599062,756701650,2129639697,1457815624,356937329,1055925434,1593438577,838214333,1366848493,1489606479,2009905023,8474243,1607442429,361054163,1525620156,1159545997,842561036,42386853,674824168,1524915256,949418332,2127871304,250198612,349191451,974426721,865437341,495758337,922845231,858895176,333909311,370575290,2004560640,1745719189,123321240,880309547,1792572634,1972201438,1446267057,1731555129,68439738,1549847948,1219038364,185196737,1604825818,1094461718,1400542757,1001907121,314337472,1996662059,563246605,758610620,1181305444,187925863,779095875,750391914,58732354,200935195,1342552106,370135042,1230455786,580268550,810761889,872277312,846246822,1733811985,1451884039,957129284,238834259,1649947129,841323524,953462356,455377617,1357958299,428351014,745984511,1326232093,1555880748,1738916790,1522677051,1830175739,422676277,1801480020,1484400815,374047220,1342060920,1562368603,823522765,411682745,1847885435,323923918,1601702438,1088534430,809915639,1444017330,1848536335,398516223,38991238,1389672800,1589161664,1113937734,1995767656,590029614,259091539,1979908391,1728170295,53066545,489897978,1494364885,1361117219,1706143355,85441905,447269702,1322133508,1195409259,834068197,1617813248,1429541652,1540009743,772015321,2083437589,815237139,1073150768,2068859815,1147489050,433195344,53517010,1602290221,1935479430,62416225,932705543,1976122017,1729185739,1302382384,137852984,2054729510,1499289420,680827495,996281519,1094481745,483439610,1049355266,2006411632,1543512111,729184023,663920773,1062491622,1558915045,1794902216,1792890517,115916933,896207660,1609341344,1039899498,124741064,50514841,1129136004,1822205979,768204765,2067302338,622006352,390049573,1054159281,876469504,1638135287,302766577,1280804874,1602362860,1711244379,805591346,1449030718,2069609366,1093427389,1133119707,418587554,2059052316,1330901779,2053552176,325138194,669145222,1770425476,1716025842,276000312,880561359,1516346715,1058169672,1562376681,29728267,1305629131,1226166570,289392430,852553886,139246786,1756506930,2023266933,2039577929,208193830,971129774,1548126258,1807046818,1790980165,896608058,331611179,1385905998,1043568109,23987858,1535198171,1543427758,1923609568,1955335841,1608490357,1898626795,499119017,1941363111,1752984975,112604656,2099548375,990367958,695730512,471727339,1074108731,2087455915,872070858,1336032524,719540840,1465366331,1100840250,2086523046,760713959,1721142548,1404842391,1562095062,1110075326,530094378,813525554,235205756,2063536124,1232442478,1366167826,1000284104,1365926687,725396675,1477298762,187103631,97592845,1112218947,451633830,2051732826,674425516,241874345,1703023836,1101055612,314959766,621872512,1699498277,1932307795,1379363706,1471330312,1030490125,971670443,764206507,900321772,101861558,705193137,474911907,1232103532,232014482,645720420,478614297,713173171,1557404496,1452285253,2044886786,891874231,2086046760,167576179,734060897,1965209970,573060539,159048900,1403703065,1213461274,1748745198,1031869674,237141614,2031308711,1307892464,522629801,1207052938,1886739680,1711280404,342503098,246799021,223784309,767698670,1195430229,700502749,2110920266,1503793227,768689587,858492971,1593887359,1689817941,985482047,1516139831,610157200,1108173017,459668938,1135159962,932882074,1487639374,978616357,1064398254,1687899764,879676321,1558008200,102134949,1945168448,1782399361,1433779494,1928072450,1035314321,658067526,1338578399,110488268,1675043122,1038737472,704535078,1182467004,1949467298,736736418,1761737430,772670971,1193361756,177134050,1073274113,1371803360,1060460529,1166698110,1905697257,132115839,597209574,424985166,983599103,1491854558,1038129026,235254288,1235019254,996124172,1070815695,1881178920,737775239,1481595478,1091048178,742358550,465270814,1911449914,1185800858,1678583780,1415097352,1164709667,2113081759,1793310917,838995168,311421894,583309903,410438705,2091025691,726273735,383512696,2112949321,8510869,1258705624,2030873705,1467949205,1137312231,631983440,103632989,1727706132,1462671628,1934023595,1888819460,1827060965,890244168,2029987913,1950273890,738282515,320657297,474884544,1647867302,543791308,46321097,44065492,1627763265,1138751904,1912149031,1989070012,170208473,1534262995,1392792821,366509977,2016515116,1917659159,864094972,628549701,1566210938,309146605,1926043676,16070662,66559401,1514127221,1894681128,2013342550,10360020,823979054,1016950243,602726723,544526611,1737568034,681264898,265113867,327493704,1723481816,1344618599,1684727719,25834741,1568707201,918762811,615913382,592338254,361319418,2055776594,1113021107,1348341183,1757648901,366322563,449629023,1534819182,123663153,647508637,1715446980,515608893,64289274,1000247541,1078899797,292931051,359905254,1997620129,1077853275,1033439863,1781114581,1163857776,1969355683,291770611,1392023924,269196922,1647002241,985801276,1964941061,1687417227,1747856128,1595385865,120531544,1971821613,321739642,1513142657,953818771,222839870,250827225,264787196,510934521,403474027,836118904,1488862820,1756108589,1242943271,1302966799,472922111,940492145,1275951731,322104127,413860607,1730526701,423774654,1750118693,558143746,1712824970,1418244476,1126370234,892772461,661920757,347110593,234553744,996280398,689056396,384705115,203625921,1535872810,2025161063,389067615,1689675080,1894694763,525465400,628429840,1696677071,477503479,2006008787,1556150221,537614929,1147283268,936456897,1090610221,2097185001,488284918,2044467802,1699135365,1353254222,1501855843,106915410,1665659669,454684517,702667889,864242801,664657836,1079536020,2026761393,1770957270,393012317,1441802868,1584172214,1564579450,213607672,1327907149,1972344926,1896652655,1500411852,707376417,1970149589,320398947,2102151907,450404655,1761754440,1683310592,447427958,110915473,106646870,1992081069,199341652,1245093415,1810336086,1739019822,1546312667,184802465,404123737,1625918321,1629262938,1596030513,1440058837,137410332,1581509542,1255816155,162417822,1736990278,1066814707,2114313098,142377687,609075152,1452617463,1303922292,352214065,1754664289,1910961092,2071835888,673737067,78044315,1342305484,1940493677,617050522,1044833041,128851229,98164981,1833896033,1237968756,2074737863,167388728,905660362,167762711,873830610,883202636,1326986606,166756290,1794356118,107529030,426780138,532041822,646144685,1677465663,921615469,808007024,1196177429,1273586707,1291171478,1953562106,105463735,683908539,707001048,1071775922,1704094537,2090781036,875071067,290849294,721559665,878462003,2024236851,463485270,1712365814,1419301005,1812585281,726579687,873792536,147561915,2112121552,3651946,1959145383,988455769,910028547,117213189,1670574722,980370790,1860817598,1523055549,847043090,194215159,434890890,2056977767,43471623,1871322070,1229968037,79670580,2064854220,1406559446,1336413704,1698276067,10728243,682201514,1548884550,481137581,530186198,512300381,183401809,924162302,235573758,802306445,961821113,371012288,975075632,1182068785,1784167427,1822859681,1210508182,620112825,1067386929,1415602548,1774876756,1116437679,1562762607,164228873,139402112,1822584831,798447150,467537503,1878329856,1653572194,1737370633,1966249322,756600818,982775506,417026562,1662860435,563159216,1018826287,1256333675,1573341114,882356376,567538539,166871414,1391922368,2047895771,477410675,1293135705,23939785,1199882331,708423244,951726867,1988875959,71410437,511896447,1466195822,1094870673,210357274,348385751,848413981,1659393479,440865882,1122393819,479921371,239767377,350759442,569863859,1645238295,204519653,1702194833,941790176,1749817093,280523014,76661260,529767406,191026145,2060111713,112178351,146294945,1449699107,974362325,450248727,1499770091,1485028278,1636601531,1750400437,1241840242,859769744,840565691,63716986,1990086462,1028768121,1386668580,423865019,880374944,1831734204,1324003410,566809296,1937468212,2037422006,872090791,1569026495,972910010,591877319,1615181858,1595747278,403483279,2057811560,1642666028,2010106221,47549960,1923830054,1691971119,412396594,1725537992,1340339797,31886872,22933508,1166655382,405388136,460833853,612584895,434367184,1360251029,490240920,193159766,975917245,1671861366,139017528,1827449535,1413768336,1307036682,509111853,808533530,1040931170,131337170,1431787293,1830848483,958707167,1195407020,1909537160,1462443351,259884012,313188378,1097957895,2125060638,332952839,41736384,1534453193,837296262,1725128441,1156763874,1003925061,1407903812,1949895600,1647554845,1033661607,109083830,432996491,1932966798,639546139,195146595,1475418603,452247169,1830486377,1730085533,409898162,1728414963,831413245,119108516,1739810274,1099482366,1435886753,1048759436,993392729,326003246,528631551,125918688,751172760,1614478467,32247908,570973230,1955393724,1534418090,132925327,1043209851,1684004808,838965643,1229897966,392696942,1147204325,389602731,952555411,785933495,615215949,1427744348,337141926,855781804,986567839,2032826358,2119327457,600119156,1091107137,392635747,1735528012,659042136,64179055,1890154774,573223741,2071263440,63807768,481414043,985378081,194827957,921796577,153655376,1120711633,1769720159,1750690965,1932891837,1337696971,1802452475,602965124,1313505711,538580380,803864203,367892664,1630559565,1519120122,1236627465,2099538601,36122816,1875707036,298364926,1110569445,1981718444,1268833951,1381428342,2090662404,684692858,133833721,1743209599,1299690889,919184479,903543099,1631975569,501842,2058387600,542859945,2122117070,2007293731,458493283,718689985,1021004002,730059046,514581639,222412899,2104765432,1103971501,626843650,487719442,1525177852,2078145768,112279805,1085173303,1353158626,336629295,52204592,1529284004,908542519,1094505782,140407565,942745324,2120681437,2083868709,1271382225,856561598,337637612,461662654,1322699454,468764345,1621586601,1574254866,1549897677,978598409,821006703,598054376,1729777014,1412057004,1977000369,612155656,959367881,430793467,56092344,1128390123,1245849242,1152936094,595120311,26485791,1593359014,958318942,229727764,2000860508,127021749,1104692866,861411021,1133837607,952378458,1123200237,1760116375,1307879032,215658736,1789035296,1204014525,716509039,1604489135,512016127,2125716374,152735088,465905123,1605546775,20090515,1014016580,329349447,1969914511,1724746582,580583582,1861031532,476045723,639462920,2046847601,866545560,1176982265,199062789,1467103143,547574922,1421437769,83645786,1022833693,1613206722,749372232,898495111,1673856604,1020678624,290380177,869905763,1884821242,30915914,666667302,1897667686,1687217414,603845236,2074587231,383854070,1256170557,656230793,509370401,656072266,603574966,470839027,256972998,1280753658,1229267595,495988050,1481548821,646582002,1558498327,1477757089,203408396,617763456,892698317,700189313,1620349683,1833434503,1142077664,1820557256,1375859231,1226806740,1945572384,791274530,545517039,649300869,1811431633,1807324609,883732254,735176320,1620327605,1308569529,1374167188,1904923831,1740731714,492329952,23775380,24222540,132343161,608108516,693011409,1383734216,1017168866,222081769,1738280051,360089416,588751868,1767173483,1285846631,448390654,605147581,314491951,1788090740,1876707753,1488326406,1259953981,1633601248,2127050246,1309553696,456126664,1620359586,25487667,569453697,1593229742,1505619158,1262710166,1365853223,1759369404,1032351819,1936458499,1978689495,1480589697,2079757027,721867754,489746852,1160499638,1589294860,800964925,436563450,1848926495,67323654,253477277,1181871493,1878526353,290372312,1692334458,875010948,1760508052,122377160,872843733,975697087,94439843,1407744691,159888156,1966916558,1078685382,791184643,2035877117,2012702034,2074811647,771206580,1042501613,317043144,1783510642,153352431,1207733338,1101800140,544672033,1494237134,136297474,745067141,932455858,3880370,1274819495,433255272,593922003,652752995,1336129624,482845441,1011262473,1655804896,147169190,632218610,1730232981,1740894602,779372196,278057936,1792765253,1189520528,1217492448,154939551,1852443735,475101768,72514089,5914243,719173465,605928271,1464562223,1366777863,137006299,148749240,524202385,1864890529,1085851486,1131190426,635501589,389892841,883611515,1903600897,910978509,58285322,1769164204,1005793856,699899672,305915199,403093262,894525807,692500148,595860686,53181630,2012535433,2075722509,833099799,2111658296,12602006,2009622435,1024161801,790937534,1991715575,1303998346,379463956,582841558,406690235,283563095,1464877475,2098500891,1692585244,1762631297,240813477,58631360,1524242758,1343251431,1091725759,1089906786,452572244,260841407,801125891,1958197263,501044565,1096524598,1370485333,1113955062,279726123,529234955,408996796,2123868173,1192387876,1197071167,857386833,1821049036,1040327261,505905338,423918427,266374558,1431596315,1833330645,219713333,413125874,476102204,2005844256,859040084,1840927183,1030837427,341267630,1461412165,1736869293,1121787883,1373227319,2129808283,1588132194,243350193,558537542,1388323556,442656359,550368458,200029785,1874339938,495981981,1474340315,303523043,1572655371,110817709,608905652,467927136,1195347213,161015084,459411003,326267153,1115618578,1580581207,793544486,1119683492,972406401,316801774,1285950299,519307164,452031621,1820872292,1572332524,508348169,1327228875,1989910227,1535696926,1898377853,1050811678,1883322493,206788046,1973007704,1457444730,1407047272,1211012571,878166556,1484956014,1050967534,123532933,1099190808,1967724427,1404525889,647503557,788960505,356292727,757270988,759810626,1462948777,742024471,162531553,338384188,1468888438,1275386093,1136703707,173250611,1337875337,1481199176,233278675,229382764,1484275144,1703565248,1033675280,939224905,1876155626,1559556024,124156012,654228338,1683070041,1412805168,182393582,1394303469,2124878192,98437947,572646051,1157745435,446039000,1292055592,685009370,1481923836,1397093224,1200117145,334123181,2013872621,23294912,1186881400,399655574,504561385,589600567,788943830,1784606505,452210897,206421621,1692353493,923713122,2126668107,1764646991,1034303832,292499122,1454073188,1122752623,412242360,1197971160,202129376,1327706398,681036489,465627466,1797917329,1052454562,1130680546,843611730,1070748651,598825488,569092842,1372895391,2105397826,234237075,683860974,1485618374,914910197,1300507516,755914099,1523829304,957981117,50296540,626515532,1715831798,551777989,1532488065,1832830547,2061604129,1469439862,1775926438,661202021,1992695722,939322238,519133390,684284223,571311254,85722212,60237790,1374445738,1231217217,53759780,228895025,1914365227,1158029946,363839245,2024720628,2057856187,1687685361,887660872,1859230653,242561390,2021449130,727110820,1973668655,173996019,1905603725,1376935343,1463409076,399224283,980070732,1948737947,1001308026,537370564,759878199,889182237,1849548735,1327951989,314037995,1736333229,1817500712,1950040714,2059428587,496303237,836551868,1921146102,2021463450,84705668,1730596355,1854080744,1860383177,1950180551,1303782836,209012672,948343151,1744580102,2124535035,1461880165,1773666160,271895181,339158933,883851876,632048825,1044871079,1114765333,334671877,87540807,214924085,1957036211,1430101666,1783125300,1189142252,789482107,1901664006,1820450519,1519129057,704172059,811672070,1043194005,1767202799,2058509646,1905640098,127125107,179814437,293013038,1818638110,1617343444,1675882387,1735026567,1901481100,1744355698,712924065,313878335,2010498403,737954600,293061299,1589291020,1138357271,425110726,554494424,1949649716,1428810281,1210468469,453149457,488393043,647622197,356473852,479721139,643440243,115040348,238760746,1428172009,517382118,1588307471,1212714085,909608055,1493628753,1745481995,190572349,1716875359,335368053,1717219464,1139188355,1304932511,59789058,176468789,1482359166,150074333,726839154,1142595238,1706498860,1968291434,238856325,776412333,1490358633,1705575739,1373333861,1330932142,874174411,1294332145,1322545544,413977434,2007513626,1002143405,1386433712,1920285785,1288600447,750064132,856656389,1486473242,1476299497,1730070081,2108610836,1636442599,547456794,215290362,1618015310,1708559806,1440391932,596441529,1888577239,1767032095,308051702,574686774,53749480,1199146689,756087689,1020318949,1947040446,1290495334,2008352291,1050255998,1683558598,1320820426,1158982039,1023999985,578668577,967305252,215697996,178080167,294825081,178578754,163780753,194448024,842842603,1308187592,944419761,1260154093,1512448927,1002754885,602461034,974520833,1234145878,2117168335,1733071666,2074782204,1112684392,635241124,1669726479,1804938171,660668088,1631695530,1251382562,1321378267,2058474677,575094957,1642577987,288964300,1232508205,1758532598,1801728806,840320251,1280453626,535433054,1143263840,597012824,1747693000,860624169,1754011360,984554683,1028629973,2004435658,498612106,904325411,699900819,1647489734,1954892177,934758010,444002969,1177453445,1691062794,1539085786,473638809,1750141572,1832860177,616700603,2022448515,605659262,2087046789,226062135,149520110,1112077623,682924550,290645558,1666061129,786589599,924360125,1997461995,567918556,768276232,1900825354,1969233614,1901735401,599247196,339379903,1441722368,1277153542,715047708,2055371543,887933044,733328235,1930441960,33661288,1632215764,1372672454,717812129,1336129567,393760510,294829589,1946072033,1272240122,534102095,685736614,1075983396,727275483,1833416602,1050007781,320784729,1447467408,18753112,793996407,610410899,1859566675,1512686997,76370636,751300998,1478324,1092171721,336210548,136106914,1649836022,1833403220,1419012040,586748201,834176053,536998017,278731849,997028292,1381476480,1059904676,1235132297,265732142,1337938200,1931640375,222097469,930822743,207542345,642527993,1282805840,987149008,283314045,517322828,1566367843,1084342513,964826669,1724887757,1493611165,1035885142,764405458,2065579661,556150807,1815031677,962850441,444900245,572233087,1708571094,2107051741,405116944,234072947,656331027,234075276,1625278522,1855195924,1684351410,675782693,206103573,1250430446,1685259571,1385375067,357084732,2059780359,1000094646,2070228378,2041864433,507520921,916861262,1178908692,204185087,426732935,907624135,411308889,1573746839,1731040026,1026912778,539127941,1044562078,293798642,1139086947,1752056168,954626998,1577141991,1080499409,1630294612,1676992328,976081744,1000049530,1499104804,1995108975,1718484819,1704690240,1288572378,97577809,410610335,646622066,941240490,1699475759,732006931,71992548,1957416896,135020069,2020731057,336647340,1909317724,1689101066,1145997168,1061798152,1930469385,1215374393,668400423,1484680656,1300710541,1561953101,1743474800,21741368,104362044,560856349,258378984,1780115174,1347931511,1517838353,1647175798,351107803,465123796,1151201525,444855779,1318041155,1474990602,1402739093,52766581,1151159809,1615788530,1031610495,543552465,531490770,1312596670,437882277,1013542710,1999031039,818095197,1236328453,1108685127,137591271,834062535,1774948144,1707780916,1422499052,351001438,973031921,175899596,253244754,753343813,1999985475,498659594,387475160,286206209,1084090307,943262557,186830150,717312378,841770465,2091485543,1699442175,212119022,548213637,1862082906,206995448,1283751102,1711571724,1712312757,1423353081,457123895,260245866,547274998,234563088,939673538,975074149,1229031354,592144901,2049321055,1897986018,1090955458,739753556,844690693,2121704636,916998981,1903154066,564579809,155511332,253327326,1238119076,1624695219,1501524363,1793468517,170204608,1523757906,906197848,1235388901,1302513454,1216964441,1960634041,1878257480,1964328770,1174141495,2092784598,1962940322,891898287,825116237,379921921,1732914682,643942837,994310449,1201750250,1153029262,1391956752,1030327441,1476990124,1647468050,198511412,86166439,365639175,1059964955,96291982,1023478566,166969567,448800736,1062455878,990125200,720551002,1589733069,598354022,325819321,668434839,539203799,1098866472,1301063710,1082295219,261325060,1478741367,106379070,1289252885,1597708349,532542771,1655159700,1750277253,1011363474,1431863682,1681205741,1723098985,402572076,2017967590,1486770786,1800883083,547496422,165147637,544065000,1338144930,347477530,1785368044,1289652539,2055336289,656648218,515741950,1751598048,565337204,670151197,1450599268,510839257,1039303369,875038030,470571816,626113171,977813596,423521659,68305973,539504343,768471123,1961931900,1716572805,2112314403,1072222844,2014155191,514408660,592072566,1905915367,145993853,787703607,642636247,1842775721,1745352641,130457425,1776310694,2115604599,1360700310,630354031,124771267,918816494,1370974437,1997134867,1847253122,1436865072,1802391055,2060138809,338870259,93436640,2070741483,590385942,566658629,901708252,1698098702,1364999556,706675899,1647687440,734471615,1845186035,1160816963,2028028108,1109111681,734392932,127669643,486770167,808859837,1793413006,965831504,918845837,344552979,48329762,1430540023,919865660,536459209,1190244357,593438664,221703188,120960964,805691148,672753059,2027396739,1791199940,1178114446,637181025,1006555907,1512115952,1829308834,199655111,413169035,1899380298,794541423,564815287,1694802385,580843043,1337645931,581567418,1449059762,1573863494,1509419730,253237404,443317585,1831857113,774950720,1124922184,850523725,2015391188,771618470,688109917,1485436633,469486297,71841252,557347310,1893092799,882513249,1681082556,1860462418,1546367966,916200516,1054850333,955893196,1754122381,1096946747,2046725356,1156113917,1326316911,421018343,1025838885,1880720156,1170467241,1996390350,1238510668,1732594675,1393464148,1137193032,290280408,364460785,1796594618,45514473,1904752294,31852882,514469343,829379083,1003453328,727185228,1705413708,1662632863,854499460,962920931,1803573597,1179827549,1101068949,2120192084,1597120413,1669832949,1806560463,880383582,466253361,371765932,841369437,1317279339,1315595766,1915545103,201984764,1817964588,881826886,1447133876,673333014,52331823,2123427020,1727673077,1242157707,978672385,1985624334,1458198541,1327380892,2115123273,890919595,1809460903,214679199,2087024233,649122754,1113485638,2077577809,2025166770,2078522747,60415391,1949277236,1561277026,11453718,1703812588,580600145,997011170,738542192,1117550594,997131010,520176937,2122451347,520307655,388138926,1769194707,637748054,745564388,986162220,652178292,874315229,833657886,1099911322,1597958351,441313588,415143657,1630752921,1149791366,2125696476,248493370,137516460,2073466381,2075827016,1186924720,78965386,1886219473,1186904164,1507643127,1581859766,910325249,1283437584,618857888,1221263904,1993022987,1648370992,1236494710,1797831456,817717258,431393008,501387292,1922072101,1401110551,942108230,1491048511,1980250170,2038361955,1503528983,1647241669,1950711301,287994092,1364834945,396140304,1427522102,2037260141,393848950,527737712,1719372504,2059954625,1997225934,549669053,781297369,555099372,572849876,543587406,157694313,351402408,690347689,1676026846,784381768,1124928134,1670582538,963142352,261908676,411389835,1541383606,1931172884,627254613,675193126,259689714,971370980,1177196917,1688688403,1392440433,962918727,292432688,1377600634,599996777,1413706229,312702652,111774039,37683407,1016839291,520598087,1290499439,458598099,1007189862,2090604348,1420100690,1249643149,909583814,40755148,277525596,2012249677,377617248,2447283,1321138414,292090921,1155797709,1827170109,75330008,2071896579,459013816,255368341,1675632378,1273599504,1313293122,1522243327,414845739,2052692131,1206385898,1693654861,698344102,836086710,468075269,933125443,1015746565,646504761,2055875132,591494114,2494178,2090904776,1978511270,2055975360,935163559,445252454,898331263,1643271248,721201328,1908587949,2030869863,73767716,988410011,2031951298,125026537,1403826628,434248887,1349403511,1252527127,477714254,2096502062,589386739,106509242,1139222094,1956262802,1207035128,1064413198,389790214,1459152898,1529268893,1776517284,975284243,168788359,951551795,75873892,140040207,293874166,1858359111,1809681080,62920780,1994435252,541587874,1358190202,1011793962,2027816354,795172038,315310069,4293773,44697099,538650673,846168674,602914685,1623537052,2091740820,188661738,1663537713,2009253482,84337546,1721571361,522849288,1421223434,111676314,1544817412,1579482690,1537006935,1162745132,1463831493,767355006,1691380146,1719618513,116846448,1545824859,70852468,1966400838,1386855596,678946945,2030920479,995059010,799903424,419962347,827756340,814932876,2107568629,307554808,367410469,122791194,1452632836,366852982,1313683811,791532384,912353075,1969552215,960866596,1398538619,336947523,878640010,245168908,123236228,842679438,1203586,658465726,1993537205,440199632,526961187,1675220741,1392694235,161626095,1924104494,375194619,440837979,462250676,1893731707,1874563241,872419686,1768944451,2081236911,676481209,825104161,1905074415,2130689916,369207383,421644281,497062521,1265625322,432182192,1593265231,519297329,1252844484,2029684535,1035659553,1197922414,492709360,492955958,84930592,1371159729,479030278,1739882471,693890884,261359839,328078574,864389976,1708380639,1159566953,1114692916,2105854131,967497451,249562151,202407777,1367887757,1733058008,696496910,1438678820,1797535035,1574510747,2027585513,1724160530,150221722,186646948,1784372086,910067144,1602663593,983980614,899454598,717895780,31684760,522202315,1171943578,1986424199,1978790672,1851270133,1923222601,1631658987,1452612194,1039209073,1181355301,1066301481,2093328129,1310230352,2050729285,266260152,2080865630,220967000,1389887651,1925960269,1770480921,1465460411,154321946,1312780810,896882796,573314287,1929972676,177600498,1023321945,1588718695,1848151599,1415841093,1396342026,1962518847,609542814,1714705717,1446917626,928373945,187050663,1218522809,375105684,1336450866,1662307593,1787508523,1818170356,1276842463,1778667832,906669240,617634133,1992941353,1555868631,1522701022,1837327062,332028685,1780533203,541464609,1168492591,693238997,1017051352,1565187729,1698484357,314134150,405082932,1090693113,633493011,78385813,1692929645,1668733971,711904624,1064202507,647568356,1621430346,656055706,1433179188,21021066,941919876,1153895718,1351413934,1292389760,1322224363,1967194910,396657747,900018999,132974467,641549675,1866107987,583846350,660470060,234817314,1258630804,1547104804,26607400,623092950,1004419150,1105778361,512246497,1028268358,497290802,1129281281,1479372433,1621554793,29976136,60963085,1292412544,2025848248,1722858692,1037264760,323344654,1927489515,1988769156,1092853187,1823632665,1849220409,1286408281,1732147029,1846702206,1450312458,1995488039,581737077,823968966,1806484621,1827247535,119339344,14679470,869259265,471914684,975399636,1571620616,857862312,1478430140,778346443,919585027,435594009,1005154055,1205274315,1182460691,172634978,1082145763,192618332,1701683739,1767759100,1369228703,885964724,1519755543,665375145,291282813,534652971,692922202,671450003,838174764,1085005630,463863646,309380405,1324415777,1958452723,543166177,1758311017,650139452,1902716955,2101227603,1884213017,224918090,1201038380,1991661972,1141965709,108619809,75555655,491946422,2077648225,1444046437,1554877603,2079532996,1103759974,1751976497,1043647201,762223671,94181793,936699620,674825453,1895410484,2118381142,1368274235,139861251,1245910360,1354840689,1803609894,1990485614,33974290,234201446,824337043,1885943098,1885804872,60994209,772794351,710693771,1329226270,942823755,996276167,807736265,1691702888,1331769874,774280724,880935830,48763401,357484611,115989491,1099231291,1717349512,1177462132,1408387789,979848299,1195386496,417132327,61398298,356695096,146098766,1721740011,477124953,205358023,1158835330,2096871626,343076021,893388280,608033495,1722957042,1479151252,1059612812,1167374282,980471889,1495067088,289278835,1510574464,94408867,317593742,1385340957,1437800082,799795250,1041044346,1495746965,121753725,1122796820,2001350787,804266028,966365703,882526717,1900323285,831704620,2102979970,676318330,1903500987,496959438,374355074,435560450,1471824924,2109971668,983380987,1449096048,1674950529,676499845,646593951,60890115,1007584893,1395180434,1565801611,233437585,202708738,1026189284,948495120,159872650,1117211815,1318742466,1801499064,1266087645,220898539,1614854613,38161437,671110240,794381243,235479118,1394161715,383040428,1636898247,928148472,1665709421,827035336,1748311491,871201157,1809633275,1415134099,1906124262,445415954,1217864397,938514156,1428023817,302485177,410952950,1760995833,1021817212,930285062,1473043823,1015364021,142455885,2005911494,361653806,1411034245,1201926682,1473385054,1600708642,971380057,27933469,1273475517,1331848190,789466545,560791401,1832967531,286135118,882744842,614490364,489273892,1451034343,1447095017,735990935,1073383955,1318873438,1492485939,1114727996,376923297,895114032,1883499705,550457747,416338771,1319830495,54913826,1668931702,1083113531,1726581286,1730726262,1693820378,581616921,1611557944,1328883585,83937733,1981011702,1389518136,1886150248,1661081630,855313627,914318550,1888455755,425412871,97082720,1235507364,1678569378,1963960639,1498852592,697183992,639603794,584331293,710249963,1024552328,404264022,539332104,1999365697,1526613872,1603741936,1883802437,1705208532,603818081,816247436,1815219767,1244885960,618997671,986722155,1764118140,1509449484,468916843,405002556,1910563749,71523559,1450979803,273774427,513203759,2061341602,1375537318,1750864548,20377959,721548391,435588391,1412823392,2079102970,2010993691,1014663637,501420032,568231201,1024528377,1953065560,1178589285,1746201204,882953278,110349762,2122577747,1763089036,1511471551,2087294354,1584867011,1303629098,664582933,1723484254,551448137,892965690,1179980169,748850218,1138146980,900868325,286225258,296535594,1527880778,1667864148,487190237,631435890,750295333,1892024385,1240799193,651258972,882325086,231621338,1871729495,704583039,29015368,467370170,46815551,778365045,1706600688,920551669,1487855979,347093872,22016903,1256828211,1155957757,751297528,355436546,1834343933,1568515328,1047049494,47914507,1014335903,1876281979,615637944,1165175977,281002639,1537281644,490511224,613348035,612461562,799097456,2003603143,1195003592,2123166096,63472757,306206380,1528888809,2120008844,825103520,1279859349,1807278064,1905317739,1782300617,41722377,1277463269,493407389,301398899,238421509,1704325549,496301941,105657761,1365858079,343061591,58142440,1850400078,1447230057,235502559,2120631828,875667311,511737222,2093832,1843397937,580475451,6896913,493903441,750666116,637387997,786130894,401813118,1183953835,1995373611,1988927222,1093006767,946060683,1495204867,913553428,802660312,1384389760,1277769770,770384895,446854654,1596706566,31111138,2096620263,103945841,1431148185,1766391461,2002455670,1887592985,1917498351,900257080,177691374,1865279705,585394264,558886205,572770778,20392386,63891284,1396994984,1243195804,1904194659,1367955039,175037980,1824708615,1169155004,1667163258,641998805,1730768614,1828766392,1146997394,1055886870,1252235509,1534650399,883471752,726269400,963577110,1353544252,1857562887,441148319,1956318656,103864175,983832775,1034575166,179861978,1179609532,252017280,1497063293,1331691532,515171346,1792903097,1098450356,872096194,1061122002,1191293832,1276374235,2078340474,1345090779,722547774,248320297,118517863,841668446,1067044261,845050931,402450065,1358693663,461384568,966507301,1346712523,261094894,1470101672,1795849222,1632489303,1489680411,665880664,764201704,368218221,212970191,856097452,1131980695,1109832822,1507751128,1822147317,647759480,594110323,1521198353,50168212,1804845344,1672402772,644126604,1488077100,493375865,733626605,250233800,1918836603,1535942638,925438006,1947301306,1653892395,1628200879,1717952462,292200459,1791394715,435738551,231241355,1134698602,181547419,221743660,1388773756,2116604205,1586421805,1572128318,2124585787,658747262,1496551969,2010237062,743986516,1938600837,145034305,1317617085,1053706409,320888507,558217967,1095758272,465265958,196728624,1491796491,1340986633,900834002,75858143,994893742,1038403099,76785446,1501570517,276137246,618579744,372436861,1628319570,1150365157,1137441296,1305921018,1149503691,1660501070,202951343,1794155240,807776092,1585145846,1018934957,1285870320,265010528,189129536,1483571939,1280376479,1540000954,551156985,1316883610,2105854766,1608713790,124194286,202194570,1945297525,775271198,599379983,2098668573,764507379,1871774474,506436698,1830759852,900667409,634341028,459513494,1321858878,2023243848,782842518,2059514161,189568435,929514443,811418247,1213228757,36759780,1673658208,1157980060,1855913900,594021742,505439730,448688564,995507438,857902603,498044658,1820591373,784350952,1097431690,2118047273,592660128,1854535384,565321610,1465482808,742294258,1271314707,761234961,1039341162,1519665067,42641860,390969655,1581150931,1820421250,1529694297,1605140848,1122975023,427145912,583703823,839801471,607715980,64961975,538009165,2120585591,1253640509,2102016531,219347295,1852950329,509541262,1883264635,1047194419,1691060037,2118711555,714889779,1504527807,839723367,1928438570,629488180,1378636278,251150011,185223565,1843221273,246478256,1964777632,642390805,68034499,1711553569,349368378,1859160574,1241256348,840236134,1226241587,2058598942,2125894060,1912146739,1983662325,901179695,1323091469,59432503,958846166,502518461,1785496111,1610300979,2055234455,911941243,232694686,1644622679,897659650,1668573543,995054791,815804720,997321904,903645203,1771267523,1446727376,1780471193,1860461540,337089916,1927804828,964968871,360995584,1645076554,935344418,627099239,1408070527,992774997,1866774837,1089257351,114910390,675527918,1776084514,1564019846,1609992195,282575217,297090642,609140096,1528208219,341141946,1516118015,1483092932,1766641603,986287223,607013624,1823703369,218410618,411974482,1785876701,1642866150,1194958473,887466564,1392759257,435030737,2019887477,1629419318,1097418884,1820964972,1068721780,1928976112,502119437,875311133,1010225421,1276183025,1727588688,549088422,1334425632,926716110,1441305701,851074803,1458632127,1954860554,616661257,10616776,1754393385,279569361,2094043471,1611494351,1007106239,538779508,1302758202,1926082835,47614230,1723942010,1150192648,871263026,55192750,2898011,2031599004,1203208499,287875726,428302888,1469231116,2077227910,1981217826,528920879,277947745,830432638,2030756215,1838226453,1950143262,1428958409,670515347,697685287,1787236594,1003099647,738852759,1128102673,1878331496,1966474593,1399084724,771280248,829293891,1301517278,1081229764,291337238,480211654,1525369030,1570163121,670972198,1589106352,1742832209,1347278194,1095033057,199962974,1716742954,187757680,1181900462,1452214449,1973261867,458175355,1118536766,939985036,848011237,1839280490,1481386148,874519697,1205031388,1854564577,424243292,2087571498,1185712171,1526627412,954846898,412883838,1097949443,175915763,364983782,723465043,2116020073,1330392300,1642647871,747616175,1299501696,260434651,1908808850,1271962028,2001220706,874521974,1461249889,496129575,849309677,1883641702,1182558860,1941977528,1469370010,1472916520,1583307667,1643141071,3829885,1803682253,1354003005,1253062707,421891868,81747802,1920595927,1199863757,141085967,1919227920,1059325135,215285137,1280486324,1849280708,426868879,1607906314,951577633,602890734,258234385,1538263806,1851344474,964041332,1596583863,1113958520,553263273,2060367617,883307936,1842470662,393648234,2032044518,536481645,170079462,1478399145,5163887,214651237,2004559216,819298585,723556061,1256845012,782735708,639634747,558031415,854290431,1169480603,1223772643,669365542,1855368243,2040047628,246901312,503566413,960503528,1627156967,964756103,1290696614,1984411026,1513087738,1658854092,220410996,1466960773,1429043961,217055918,1474190273,658858779,1316518567,1506900847,514367742,1833575012,338877464,216244847,1907402554,63480612,1480415557,477152568,1451780593,1005165142,388600775,497341130,1809645073,1118322507,1507093735,631818824,1049578971,1481040473,797581008,594319779,1809889355,876212804,1592149447,79171860,1989722962,1350555731,2008796436,1485089464,2078681442,214341165,1309907978,345898699,688876913,28955732,1621343794,1994352244,387753323,323584143,1417454550,3293227,646416225,3142033,132417935,1073126323,1538158288,2129987977,1448803605,759512560,794744047,1601141241,715066006,178491224,1833136628,1816607267,325563210,500128453,1108127355,166967504,1611962765,94437106,356466929,518957105,2030808145,1728064028,457988737,1567909530,1292264552,118392396,1873278010,1330688350,1721123980,745544704,837672038,1801352456,851694630,1986585412,680911520,834983257,345791051,2000282738,1257656588,1889743694,1265164061,732049582,1677061050,1418702829,560390606,1768189769,78880403,450448316,198262676,411765659,1398320309,1876668170,1205431855,1477298299,279264107,894848519,1037305798,159377289,1958960069,1254204516,1640200215,536396553,1036096961,1299398242,19805648,375302895,1674756667,717079535,451115521,857148585,1900152184,587242671,1241297596,96481400,1709502939,890457152,730499626,837216503,1809431857,1841352451,1895215678,1307965949,1460773874,712296397,1320165562,258135948,680818365,1343488709,1894239225,986326643,355694107,665523081,655380874,1040198341,837992694,1411771392,349238617,1471190757,1150247258,781378624,564450460,115128619,1913283274,583202943,595330331,1820940599,343392095,1897711823,2010522460,396772601,640419426,74046323,1965070223,486804053,1941621579,172497154,420995323,1745877264,561740810,993499403,363807356,115404658,1409687959,179697319,1551103455,1285981135,1609679011,1825414093,1987402366,867172522,742433623,196090427,1828342024,514193588,1277942369,1998994752,1816208270,1988310316,1747155962,89837212,1331491453,895134788,1418148468,556069037,2013410704,1295508319,1581334120,1907350059,662044676,2019363742,740563503,1183614901,354096735,2114334315,39637733,1657577789,1521093259,1772480427,158577115,1227328888,265039278,1639446882,669539802,1646451982,62463362,1683846735,1585775477,1049489319,1827060135,462808454,1257633695,1962710835,505508379,1825267603,220591360,958445953,1811469643,1275553492,1230496499,1361726528,1203276831,1257088242,1669934393,829476442,885276587,1825559545,1540494343,1509139342,215819123,1068434817,1652956554,638343009,984122750,484084043,728354682,714447969,159355915,1647565533,394806367,995963815,776794334,642263384,2091937613,443706255,2049001376,2038702867,205173655,1238978196,509957882,830457211,1959745564,838067665,2007101740,263695148,270658275,775397670,578506286,1000769022,1556497850,402115474,1187437412,982085383,1054075118,1276433439,669481121,198479331,665907218,1824266665,725479274,37450022,1105006766,750218681,972577035,215011208,479106549,646142015,1653487588,534498574,913170843,539059981,1992383929,811981854,224716186,1685930781,1628211432,1265971700,813697519,703881863,1175416339,1956241088,1779345702,1789174899,2050023357,1078060342,1688017142,508157741,505145935,1542790269,1441986858,1861390293,1527929015,199250722,242145569,235282040,7000781,610283639,1795319545,1408931077,1582334109,632121531,716788374,1192488732,944682391,1549611399,1989159790,1932738865,1512754824,1566801011,871258606,1064657884,2073743821,1081625632,1040276677,613197655,2046325336,1540215591,1293039924,1841676833,705640455,117154035,33646008,526781959,707610550,816013928,1807875409,1548039587,2089691864,1856879357,737059320,2076714135,1570556766,544192592,335077638,268567987,1124976727,962388997,2071815025,858823554,394927111,377083094,1948738457,118486179,534549907,99824586,1913617211,2094661849,845769885,247260440,1820677944,332313929,2046812962,1220934082,259835517,441071407,2092778234,86127314,1504461710,170657932,2035424411,935707030,1662869286,1307177069,1285009368,93206578,1791243214,765159884,1932919945,1085633158,773064063,1327237649,1754898468,280447365,2058144741,1045805022,499408422,1440285627,1045967276,428509255,157441124,1097794808,780712750,965291994,2086276872,842381218,1517472328,212214807,2037535222,399391267,681132501,684623597,1754246867,2032732454,1232952869,611745622,1946969724,205269837,863716791,2015323725,1766409818,1518690063,902042444,797350636,1495715718,181231814,2120978668,638145690,248286416,772744086,482641568,433467059,798071788,2024760065,1545655202,236827812,1789514403,540105162,375641129,531255444,1312165465,1894109193,564144469,556152316,1454145104,220647707,1800130898,1682513043,1439296689,131942719,177080899,36397201,1688838585,1116361181,104157872,1234842221,79995636,1601153691,1898135127,1570727062,1845181447,218114431,1346942793,462734054,1731217209,27255334,169033885,1251663894,1984501578,1867342077,1173297279,86288074,1084744956,508682679,719593682,2007715171,1289917905,1783213029,572794584,1391544569,2102844169,1104759087,166983367,1408224859,1912414634,1421145651,154513097,843429093,745030036,148134330,2071108439,405120012,2104976148,1353727508,11087779,1911031908,2043384434,1896545938,358257044,10100629,562734452,2013603238,1613368235,2027254499,1386371221,373546294,2094840599,720690609,654683883,1659699624,1840919915,1800310547,699772837,658550545,44928164,1038118372,1796986306,1023941310,210120309,127202729,770662644,1373582719,1026307513,2077608626,1342937289,479200063,39586112,24067320,1232279740,2083528232,1132445550,2063902855,1220769800,679655467,2038615320,999988814,15282918,1200379449,1033657617,1040862524,383486079,407016202,1971175986,545156241,1552685178,37558945,532485190,791085053,86232132,66596026,1114582194,844801626,1325953293,1781717332,2075404070,1815573268,1789309415,1906097317,1974654428,675118545,85302976,1845826270,1416891910,522077847,308706605,689962033,2096259172,1544975448,389966424,323999549,251449319,651864342,1787782193,1360431156,923179200,1505591954,2025592575,1820796691,2117383617,902142863,923295696,309862282,1408782430,1107528108,227818695,1831860653,1993402509,298451569,1971212736,547585109,137743812,2058951871,1035195377,1520211102,1997561371,1864696731,2079452494,406254811,707320283,726764747,1545669955,925060959,1085567507,1756392060,2056500834,568645094,424584112,2060651295,700391135,683655110,281403264,43299643,708242574,742913764,1226051399,666229721,830297451,171651563,711070080,1719597820,2093022257,737948796,1478580376,1229329155,2029748470,423902415,153786616,9546949,951138461,674818292,1691195018,1979374037,2065161938,1848950531,150402826,755246449,206265854,22024507,1334964912,161287753,1721529762,1257488340,67285684,2004324690,2017851438,87272744,2078554083,1342719758,1038359001,1364268007,711938070,492607841,1548078817,605935936,988133730,1902664070,1687168033,962432224,556378307,1769962089,1957898219,1624834054,588787563,933709994,1228134861,1156217018,257747639,1282810077,1637329563,2058790201,851171228,802502658,1949984102,186126353,1800974923,352437724,802222871,2038294742,957145726,740416140,857283200,1844463654,417094275,1457183830,1489223079,1143597202,270992682,470206971,503709433,2097508885,1890883990,1271863003,1636428710,1571445515,743845405,1386476713,640676506,1525368993,1272837656,825410039,2032464159,1052517451,815224211,1440861587,802466359,1347532264,45014355,373285508,1086322745,610635662,691484705,167239097,907500589,223764030,855855186,281261187,1864754715,995555152,1980958093,1325185039,1759650464,369420945,1277440116,397919226,480486929,21522953,1088824638,1722966099,1068977293,1089469496,965226625,1058403609,334617354,1368157006,1350139306,151276704,924086272,453261281,760038219,763184661,1528700009,872007164,1759506205,1317858311,1246705687,354989192,1596554070,1205850890,729169033,996000464,1628765384,422095956,1446190131,913819234,479805461,1885770969,37544362,1247154830,1764313828,866730713,1917334986,358704502,1512137997,434973077,397366381,163047344,1593184110,376916155,617263269,2082398292,596892905,2005251690,1526049503,1386042847,1657012010,1490223491,1878842564,1820920199,480918519,1370081484,877042667,1259989598,1003358575,133440453,2017920802,653180761,97604048,1403838911,1165662141,1098803820,667959521,624339079,263072237,420901321,1342974102,1268561175,1747995288,364017307,607183987,1085601733,314183991,1156626630,1196681385,1037526469,1765686910,1038637647,743675634,1723417379,190828075,1756886458,1041834808,896631472,1787154353,58258559,425323972,1389329002,2059969699,1874784917,193313017,1940865205,1731186758,778084456,1413987497,94106862,173087239,1533553609,1256893081,1499509668,291537244,902465029,1865138893,2067327103,715238461,395699621,1506360291,929396785,1217977810,1460568937,1423328117,814848558,1154917798,1527438424,710260648,1925699436,926769744,2084765661,142807428,1427402024,830240007,971793426,2063756368,800735101,1738565699,854264200,1535806502,847973936,691585046,646306482,216720734,1947110185,1637829543,1641562994,569004016,202892803,1694377953,4878654,1171807827,1440638224,1553512438,286908605,970191051,1081428625,405294109,135333252,1893961804,647434088,519896996,1558174433,688184939,213053183,1989799734,1218053722,1581255249,2114169907,1109936940,1806439339,769471915,683354137,747321792,22034307,1384779346,741778698,1545392129,922586297,1067855739,1247549276,1255068336,435915939,685323557,1712756667,2031690408,1605218719,1586227409,1983040909,315938814,1273634212,1223210188,1571144399,798809929,1142505219,1671925327,1397629182,1676514273,1907584475,290241203,1635011191,1965207834,2005529953,1418805443,1702889600,1164112360,2018697842,919869956,923076719,469635632,2055121330,1574170457,474970664,2086063676,477622057,2048756928,1662539189,1255875815,959313947,1190536096,896148049,1381872371,1539407904,190367632,2124466915,64306537,1374714519,16118018,1964837239,521194598,1544307668,2117003352,107188150,1357006494,798706403,132444505,1046722196,527382080,641564457,1558784501,122749794,1721694027,1699568129,1590437403,1846050030,1317497534,305182890,1114521202,1322149358,1419447627,1359466819,801367890,1257753636,1800543571,808255626,1719076822,126507999,133202119,760146055,1356076824,686521235,1298717378,680776127,760863625,224131223,554792799,364999184,1319682629,117596059,1327025516,1569481516,136688501,632632210,1025218711,1713378841,330478875,626421668,1496500743,1519857732,1188399927,1633264590,1600304365,1172270974,2003275423,476113669,21449641,2062442220,872151906,459104715,832790925,1206160194,975557994,2091383050,1557626609,757576630,1434478666,1695659721,313676925,14512158,254346163,1485380032,1198162904,1406973698,7926101,1522122280,1377154259,1049769235,2113676646,1089760729,1904760589,228892987,688729813,378368879,1727405188,1661523517,47014918,1244817951,1829906176,1877896899,1516978590,1047979091,1288907329,1291506349,1026081452,1667731438,879830593,1340340173,1347013832,234332639,1906643916,1256496533,1706974049,1143866941,980010691,1235345373,1750252515,1260928380,720140496,1118417958,1213706555,1201338581,2085806108,155045544,757261342,1568576586,507714263,1986983091,25097507,920474233,775696566,1777625626,419480050,552037168,2099093303,1125497729,1174077106,1959585664,223619551,592823931,1866659560,519686324,540331592,1883776025,1325106410,258859199,978463260,1633110679,1805333280,1392869837,1976168506,501617434,894919854,1425548625,687302990,211397972,563535275,1277605414,988375330,663302813,938322040,951049128,2125994666,86282674,759517891,2046275884,924393591,1558983251,743028587,1368364259,1781088023,1033648809,1318270680,289909147,2039354006,959150304,1197295375,666630237,1806691927,1982032316,1935856048,382108627,275157774,1693498848,1418605380,1806694910,387113880,372248558,1694226957,1896511747,1222324912,1378861502,1385212469,621192136,1006486463,1299876371,842926241,46364567,1557931910,199843794,1501571188,332589661,1427301093,332217751,433116315,204010910,648722812,884993494,912952951,794060868,1974183023,1042141813,719733784,1006868023,1720610173,401904919,1301796946,2127649835,2009278470,1201811139,650760834,1243988707,957611925,884147881,1166347359,1786604313,1847533559,578844615,161975517,100093452,740412417,1999610145,652553863,436243671,156303286,2013979715,711925469,1472123456,1931690162,1488778111,1325733190,1097181277,2109743459,168109381,819930382,119629314,100149015,1403263621,24567222,1415315996,1018970513,1474276946,1563152465,1927716866,1840809770,914809863,1987202467,520333851,1151421820,963006425,1615719353,1168699440,1658187963,469936859,46369987,440335764,488625814,1538631716,532156258,716444574,756289845,283507982,882988275,634196660,1256272736,277440335,180784320,1407493417,2029929730,2089474216,36998801,1860055602,849029922,84101098,962871221,582866195,932811698,1349001841,1580707264,745057794,2098554598,505257728,49456460,1882358007,1853142576,1714929202,745859225,1195423056,883327593,1736033202,1688190126,1723437166,1803287773,614457213,1715428923,1305647719,1160849250,37079178,1466990070,234857059,571379830,942908977,4882262,1271960701,1781522084,1331872609,1679804886,2046537584,447660930,268606678,161242395,1863694617,370138103,928416230,1744960782,667698895,1380592981,706942431,1078177121,1148224294,1522526607,653683268,1868907952,723075806,1711496546,922744655,1120928475,265307006,1448310163,302720681,1738241572,1110837581,1275905974,1452240706,793508347,838229328,1170230964,1213083819,1662083831,731451978,1592213178,1937733877,903770129,1759942242,1199498889,274154740,798102290,1279845108,1873270199,18548482,2068822819,1636901047,1279378858,1327338281,1622427114,767434806,1572201469,1073521559,27694156,584740155,524575298,1760644658,1068373277,1907309435,726960038,795526993,730550565,1672966101,78869989,393126985,1822615364,882202529,493485356,1663286814,1858087176,1893376774,688899585,924180308,143787676,1593199436,24618422,1018435820,1326941369,39118562,104459279,72144705,526775841,1642954853,263214513,1902272767,574980771,1179338982,897831364,764346365,813938108,437484179,364939289,732523671,1193690851,474225460,890917098,1824539714,1958377794,1649614539,1291191434,2098571453,54121863,701662560,1809977733,428075122,1243757384,917090202,1541506905,1943489997,1176910939,1273831510,401947790,35917473,887558367,299574238,1390040528,877907460,1424210030,1515119452,131223343,1882884132,1811487205,854561465,1359637021,1195106015,1559735163,407875696,2073346328,47787679,374923905,344604569,711584056,169094485,1512360228,331546943,768139701,249014527,657466578,366111304,976040485,1665365536,1538255612,804029207,755107240,1256652643,1277014201,1023247528,1641049623,1014406808,1671950903,832327065,1767607935,1826924144,136785551,970717350,1989866913,459093985,1206391152,56830289,645226938,1902353442,288769277,882735784,564214995,76856608,1565499983,1497817726,1717108971,1310748403,1909801413,1968454199,73810105,1322172433,1066974946,1802927644,675948210,1217813325,580957982,1031419859,667190226,1919454921,1640135837,2017218279,63347898,1996347622,1971557535,2005079948,1950294533,542843609,220043815,1703338218,1084331422,1134180826,2018778930,1459936996,722778183,112875362,1972463162,1842061457,762865015,1660573904,1775279832,589641584,1453636141,255576802,71252158,186973197,2059368235,49748069,194570209,392896905,667549209,1454754212,412218752,1320578141,1549153363,749156332,139173806,2054479811,975096430,1906282381,607326179,960924765,2068329338,440214002,1845898337,1227540188,109822341,858903754,197993039,2070152151,1908916234,494752715,674415240,1764977686,705778120,898012449,220307880,134143000,1179138095,823977002,462464129,900642515,708605577,1526980387,1660443685,1252768633,429000392,985803371,1626627521,246420340,758302908,923033240,1295317529,1413598066,775048526,934705780,479727794,1484790157,849011736,1050398410,1869402003,792028935,1958725140,827733448,1010177485,1782885310,941817902,1040648999,263662668,2002533797,284089344,174548893,1225427140,1522158066,678796294,212307580,1473499604,226270376,2088755669,1023921616,1659991835,1984503240,94141483,2115131113,1265528992,274710958,1477378609,8641733,203799950,1313147433,1042255612,1016838158,1698577418,915725312,838758955,2084609066,1832276932,492153974,1224439420,1521858361,1384271988,764092926,345772482,1851184069,323617649,698394073,1403512862,1195717511,1113785745,1451617320,234709048,934850554,916941082,952186225,1758317871,1913452459,1866236068,1314388099,194908118,1311326065,1719281791,1189409689,664335879,1217958305,1351740092,1046026920,43019943,1190330970,511494076,55048152,1752641068,1600686903,84824105,1342426143,1612732261,690500633,102835808,167570624,1967328472,1279714773,299580611,1007032591,441106144,604023006,31726410,498025778,156952185,1344631379,486857922,1900001897,214544388,742801991,2050895715,1721052458,805025083,1886933644,811013089,1982510002,640578464,1989588882,1125591547,1455619347,1820033861,2055000435,276805699,1113132524,1344063879,666980515,1605177656,2013729250,897114099,15509239,2079592675,968985137,101922518,379248385,1114526960,1199984994,867081469,2129997298,1970259315,1212986449,1243617168,884260236,318554390,1270726320,1237906084,1927931556,213666707,1711064245,828355042,1559635831,621430608,258038377,1199379987,1176914930,1826313542,1015377498,431243062,1117932399,1030085720,615817365,1240703290,1459727522,1722003649,107133719,668261353,324946577,1801810904,589898,418707684,1134388659,1400980383,1697176197,12551950,1989460139,99625480,342064450,391636159,923810165,1459451036,1921253579,255467085,53045369,1874415507,29908439,851659151,302511315,1403595324,701383770,260159394,19773541,898602404,1679724673,1540351085,282541975,686811261,1783110343,221420738,1500840039,960190341,92769277,1047365309,1247746154,912365401,94945104,1520310991,249333263,475146266,800440982,850863586,1115392972,463226990,1162700197,352551786,727988191,1270205399,561140270,1861103187,914686569,1416361276,719441860,592679611,1478340163,1739990781,1780237057,1976727041,1783115791,40772150,1355368933,1366132953,2073120019,523825723,2023485585,761619331,1526866362,1301558811,227866902,2045795374,2054969149,1302403866,1525646381,1414223955,540912882,371604085,889968408,1673500764,539598811,721832359,235859897,1724486696,1317679637,924752239,64915433,284639489,676307584,499439026,886225796,1157774379,1548354639,121274203,1433665694,1601279325,1969154517,802629147,112955183,2105609525,37539362,2032834029,1622841359,1811496929,1381693604,774110537,1958731338,1910197392,984261173,244870868,120934044,626069513,1171176557,1964412266,752194746,2023878293,1398109158,453726459,1368939629,577563345,1544368788,1269361119,1136196509,1694866383,1368040073,1415270022,918419229,1019696882,379131315,1651386814,584126972,11786493,956121869,492431831,1054251966,1216458315,1768744480,1085030680,1717197241,823819290,1774778211,723396547,2106613792,1713258207,331085900,2079356207,159871786,2075415783,1439849928,1913826811,1456092641,198042043,1050822382,307190785,1153102332,727515327,1290426202,1754477935,1080666915,1261783536,1237221050,1178103168,417091700,1954017582,577588570,281212322,1801711634,1739108912,925042353,1987841242,1970532744,1600866839,1437354014,138809637,1213522685,988786211,574277848,1022291089,1820271506,683938995,79402026,1935988934,1306913379,2058532992,1982948439,2034474564,1374667758,384002428,829461468,497879895,402120632,1421385736,957203495,73125691,750767462,52113994,1705187383,1682973480,762630679,1377269773,309045014,1271846252,1926715233,1508405405,440774221,1003217984,564026379,246340045,1702336790,285864310,1672019295,962737943,989942169,741270498,868762981,1999818293,1389374425,993647947,157942784,179847534,299167649,1637841079,19070661,927189457,899133829,1504231859,369454286,269693981,995369603,532824288,1091848629,877285394,2089780130,1055663352,1515864350,1564313460,1004919505,1635876308,1914271061,1435532331,1976013587,1957981973,1020791844,34855490,62952517,1750104173,1614749946,568810719,2073738834,659355735,520619664,205253269,1853183787,434330477,1860997663,1998516390,209401578,1026740337,1343018460,295215773,1939739035,1555669503,286083909,1642372984,1488930607,613602012,197840181,263669526,1146628208,808489507,1684402342,2119131446,117380918,794795304,1371536458,1427344217,416311850,1631968871,98265042,205763048,2068971061,2025094774,275348280,1107603469,579811166,21417604,792341732,1387345644,1933604839,79895966,38927519,1790582995,988739863,1678273109,1220219386,1543497737,705789452,1076535380,1008736801,1755516369,1655373255,2021493199,1538084404,9485957,797584420,361990083,198496421,1515515586,1970775956,1616796643,212313167,1304911828,419775574,803437855,896645353,678995416,520867764,1131705286,190011015,1866090569,1705169167,1618011897,1200793464,1750440554,840573393,1592398526,1605100459,6639621,1755839712,496887726,596805347,1452322575,583990466,989867725,171295467,2075770837,1805291851,1187415399,407494335,26145451,1822512156,373417924,851041846,722354638,696287205,802557157,182362608,959341795,851313885,836527812,469294520,1798486350,873920253,735373778,1404898119,683712980,306270387,932639975,767111060,1966823899,1347111980,392193238,309862133,760143643,1313546840,1499600714,181484070,1497727683,1776972138,1188068165,838661846,433407001,1608025382,767129481,264247100,871952595,2116595230,498861988,1579467270,1441591687,1188662294,484555412,50374157,1572803479,313812796,430244397,660331298,1311818847,795546539,1782326110,584174850,1730271019,283282239,1113648514,1546702071,1046992461,37137497,1153051926,652249859,119307699,775548185,1162918556,234023237,1323431965,321370249,604072922,1013222269,1943427280,908301233,1061814708,615970690,1518244966,1865343774,966209795,1147349518,1304671310,1686646773,1494433807,799478724,1396115252,2088917010,1079329985,1263052584,1177811682,1178203623,759292837,248547253,1547068645,452222998,1860136065,1040254722,1979556701,1315305261,9898566,408076542,1360950352,579591086,1415692522,926565314,2096691267,873572233,874093357,1397286186,1828494885,1079754593,905711676,792701142,1067642407,293063943,1389623926,632841813,31420107,1993350022,84565798,19607160,247261538,1373529128,926292486,609426329,559737577,179180344,1357319421,990812454,347159962,1644742478,2038989875,1558940971,1932877679,1531857734,190754370,165128281,545026750,473448229,1024625519,729427742,223079454,355359665,212372972,765468470,507932908,1529044183,1512467136,99298071,1155897079,641580017,53050794,803781028,779408228,209287541,579314382,360388062,1897504354,1745981083,845930700,1732393513,365711412,1821102776,1193648666,578429378,999745416,151475624,1698070524,2014456589,2111681675,1404181833,155810972,363046306,943229713,215614327,536495809,275797856,1472680436,1275587333,1935939480,658664642,1294955498,13757100,392219826,1206180523,1303785262,1146298246,374559668,692755491,1473897752,1183074944,1183285573,1620449261,1924058988,775265159,2067191429,1619107126,392680552,62146583,282984182,536611781,1683993531,35274300,1077407161,914200598,70623275,57498679,1754298964,852451617,175607006,565806643,1153208441,569761380,1196576429,1565173270,1915034296,1819736665,1843765538,633700342,1974932575,88596256,1516339645,1527570699,1974868250,1134349029,1548580133,708697742,389353082,1260767756,1062237083,291380319,521196479,239750050,1058587035,1216450048,1987480305,1193907163,1294870471,1926803748,916261432,1893691462,1725702779,1442271450,1680023969,1561425366,230212211,1900514640,1260869870,794488943,148338071,94064412,1051471283,1333955934,215949750,1145416605,664847822,440856415,1991897210,81995445,2069343642,443880807,924122742,1713669882,2084076615,1013183776,1476340823,858858746,624410372,367130360,105513195,1374614339,1531125132,835660433,1521542261,1569036713,595816035,656899419,1811607807,1878717408,356882972,297589534,481585622,244053403,1301037350,254939158,489893787,749166704,1588040492,1716808182,850038351,1734763929,1372850673,1102169093,94990666,450476937,1809000210,594150360,908702649,2010973111,1960128019,1898029057,566318199,923389273,380850232,1201784579,1029500292,418786035,1442318007,238950812,1663083389,711845953,1805457504,798850906,903785176,1636556737,1786773967,1230945047,1001647907,481021760,469882054,1124793288,1770035905,1733091868,1865404353,1526530493,1566394796,1069527322,2073924531,369401109,440330828,2043357693,1013743778,236068391,556493513,1172448435,1506725471,2057276174,1644082708,1904571752,1043577427,1143432013,447679073,963374400,1760012439,1492393819,43761222,363812552,2018989179,227459525,320187139,1631007953,676470824,52908674,819436735,1936852825,884437419,282752981,1244158777,205280145,1256373852,1693546119,1238018656,988402798,168435969,1654984795,1915062448,1119231232,707700233,2039915805,1145311391,1389584214,1436382336,753679456,588033035,312877951,29622433,129322524,542972557,1314181660,1618980291,1357782286,316882877,1476968347,1140580409,1756228631,1886869528,514340676,1744782997,981017892,1063713402,1701025567,1683728430,2010978898,120131610,2130084973,453788630,175593592,1817037854,1401340184,1493899744,1913678080,487381411,505866440,1788470161,825410025,1876714342,353951539,34427165,922630933,2113018860,1522630768,659129272,713828258,82166851,1913679807,1537265762,970241468,1565327421,867412254,27409442,770026703,754407723,793855442,137185093,250719328,1004361847,1025402963,344941191,865422158,638536858,967354214,1354754376,1575012453,1661334046,942762425,885579220,763967729,78461509,1003147945,1873415511,465312153,1841204839,1531738536,1272393659,973491744,1274556782,2004992826,2069458806,1469235602,392266271,175138940,624292798,2067924173,710017110,578123396,21540956,1763112100,1832101719,94779687,1765682967,2042523866,782568685,1902491987,1222870626,1693151355,705988127,694263044,1944206148,366302215,1815413925,1518878133,2001321677,375409146,935395294,86386188,73350703,2109814594,293674203,1529719683,331639822,206923201,1970381885,142749060,1643281662,1444098933,407237262,1319066055,1657141844,1680390547,1826795700,1317931158,1190779193,1834039298,1452886334,919232061,440249962,573669333,838022907,52910151,2056938622,2004080721,1978227733,1116506986,1411411894,1778238788,1457389892,1141352138,1044159019,1978952590,1282000179,1692663396,1425326583,1481910467,811218878,1110763838,1988628105,424854471,479036718,888381033,1643764252,1621809802,272560504,745246766,108631346,849243325,832525759,1902936440,1823981326,1360189141,88564802,1175858894,682344629,323242664,1751029291,87167155,115183206,1234710849,2014283977,2066144677,1137666798,76831685,1418779994,1837542438,1173924877,964951158,2053947309,1837155810,1122634480,945649103,1174183032,16866102,949712494,87965045,85700806,983119471,1692419611,105991666,1378247972,1480200926,1972893425,2001403944,957799348,1854522212,1961293838,1863059373,1781019732,3612425,500468613,764333456,1028318416,1257297399,327806083,1525761605,105778875,760558909,610539482,1318873590,894932220,811410544,1232149333,638963505,391256722,789356461,626540349,167206387,714336715,641325542,999457943,291284433,1886944918,1816361468,2027047864,881153234,1841879234,214029545,1998450634,1605058134,633316066,1209070283,697753720,2084195096,1216334896,315278631,852536309,653091941,1395239493,1106765426,440011347,290562916,352841548,1191404308,1810126665,1091003592,444470832,728992123,1824128593,1778708518,1405842162,1878714199,515865276,1327760125,686333838,852913841,1794844274,381669032,1080763386,157382294,651920746,506022271,1614961068,1756549877,1843407918,1814980248,953563235,223510756,1806800775,184821375,1866729199,1936995800,184343610,1814919302,1905304100,852995999,796622159,376919172,543487444,83124448,1442922464,1557523752,1786569834,101469609,149596578,72350212,1847046105,1065459660,1291295390,6437501,1325981871,574434343,956288944,321536699,2108873859,1292659243,262100304,2101228312,1280109700,1451012894,268101286,1511361054,1480526572,77909567,296372708,930627091,1038134722,80498317,1808100547,60012483,784145370,138722678,1072206441,1051815064,655280408,861871197,102025114,2020732407,1310235874,1996792081,120473454,1448259484,371328469,1331804986,2016946593,909862040,1336089836,1951254367,527108927,1763289733,948060285,340965959,1865968778,590133210,1758347866,2109266898,1458034646,512534448,1056944043,1943047226,571684663,793785240,1528460872,1751173601,110607301,1062532506,352876084,529661666,1712177044,810116190,286958435,998409394,414264935,829158152,6097241,997089568,1900024020,404304695,1068497726,984413548,773850771,818501579,642144733,1254458877,1535000754,2041349326,1783561494,445571929,448401959,1842166629,226017714,1449458784,142518946,1445638731,1617219922,275495127,1788816414,107116379,313190041,2049766466,889861427,2033230518,165932,927772010,466898460,1683229498,1307256486,1706143619,948403992,785613771,145572128,2087851862,1629429508,393936177,14831511,1784490420,271256933,749431733,1190436792,1870996538,893350819,123640522,757871083,1179916892,825992169,1311678881,1281240380,438052069,485127455,1176489750,1662555297,1614250988,827001098,902343638,611787031,479767872,1668152511,687115059,1188044446,323150163,1017895494,1565059189,660859979,96993969,1168018671,78304712,473054800,817654329,998420848,467432281,1172589848,1608381846,1948293809,1670593932,1019575781,1917293996,664231821,2054721982,663597584,1479436022,910551927,228664847,1174419552,46026616,922198478,905952772,2079014920,199674349,412553916,1065014894,369941271,484607696,290831144,1961541626,1231921934,233070815,1845505122,595979561,860599708,470052549,313136247,745385477,2107483799,1157533879,40772434,1994822782,1988264581,789746245,446085901,1102454476,696405258,1449511720,1625053864,254108005,1129565657,1233041060,175146766,1945963827,344689509,371616002,1378151045,342977020,2080722135,1888762909,1149289093,1937394585,524676738,1009157732,847620743,851846300,1027580263,775238029,48522351,1692984981,2097555230,290659376,1877090609,827283271,2077941114,1055775198,1187826844,1686572833,1174482929,747252934,1098468841,165420807,1949761579,1271575837,11888957,188499055,1784852763,1607455441,1915921696,1416769099,1858196756,219380071,1280218791,540887793,624874005,747972354,241230329,125949191,2109555189,1851622764,1374435114,101512164,1508351188,481630095,482308030,1954393795,221444021,300988050,219888941,2128109180,1341311524,1809696999,630997609,889827862,470496775,737790733,638168116,1795123682,1115309416,531244324,1804459545,2066910980,1273511100,766413635,1660582832,1543906617,309518799,1149334751,45561095,1829802231,1418323898,1403208390,264933394,211739331,1851799610,795123842,929716828,426459557,1151917443,1643431489,1771419353,1588638681,298330726,2022362476,1810687748,605875567,6672900,1767913446,2059966038,1255747483,1696267794,947427137,1953321840,104469886,1940528081,153772821,168314271,1411908640,1911155905,1079853544,1729424472,1564022286,705097651,13730044,1484152327,503919210,2051478134,687135571,983567096,1482785974,246700955,887544749,1459954358,1071064814,2130672925,979505781,2047143154,666474781,526980181,1592955140,1109586399,1815159663,705705511,1763368662,807897899,1103173850,1014805235,2077656850,1072551255,2121030172,1336974286,2090387242,1896225777,811996462,452673772,166154461,1684447191,1646950368,1227736587,102878288,1988736990,1136083067,1172658554,1867365368,141579094,340195682,516886419,329132242,1055700519,449363894,1945021386,1579204587,99123816,1541463465,1315370596,634917664,996432074,1517299515,878851125,1401948247,1524599341,1994286876,682235411,386126413,774623758,1069538218,2092672879,1171505867,1297754949,724699537,646415727,1533970659,1358112582,46398726,404860389,2117102403,977595197,1240800525,252661437,440026418,1046773111,368980993,247852479,975198768,1110054584,471953157,711781710,375622245,1178503162,207410525,1180623656,1812829625,76139497,1334694940,66651457,1500350095,450716395,864499546,1700957520,1047132772,2039944826,1650509835,134310757,1620595023,1729754203,2078563568,2120984628,1023211049,1621478349,976012328,1639304007,959219978,290752176,841012441,1118858569,52468891,652118851,36983294,479037064,1953410362,151299911,2086843612,564204640,1076430452,326060196,530743474,736929631,1851828088,442506840,1994621655,442050221,1889897682,2094444774,801526902,857787288,1765269714,1802894896,2001412632,1245016066,3701706,511137861,1871814292,2039440462,1992638525,1200829989,1149325629,2024765135,1935956583,1244743553,1068271125,987434197,2103796815,810870239,274443305,901444268,792158768,556611025,465271313,525910748,1184184434,1237190337,333495016,370483109,1054988644,2052961870,1286529241,901907420,1661277469,1628197690,1231597652,1603382640,731758530,1402614961,1310636189,439958387,1066144055,463133634,346270740,1241236730,1938934449,19194975,178875299,425076009,1370550467,455693852,909092150,826859004,391794441,841216851,341433514,1226232378,236807747,1506717465,2077814682,406249956,2052431329,1509590750,1106380369,2001264810,585375679,1929556915,520915004,404233556,2124809297,336569729,868034331,545728676,1502966169,186457242,1238887801,1065010193,628972611,969205250,1007599624,1936347888,1002868686,1168940769,2000560542,709501563,39550017,243207900,418391598,2059380531,830264451,1595644087,316494393,973804403,1732359336,1471992327,673524820,1213505518,1452867758,1036891417,69289262,368723905,298115084,46821211,1728223984,935035709,611279030,1621796397,2048990730,1684078779,1410902218,1766344851,1867293139,2062030314,1676111309,381996554,2076208645,180374690,740801346,666223946,1696020688,315319476,418916040,569389924,1282606621,597819680,161523601,418341074,1490841358,158993599,612744113,230514325,663373741,1949633690,456090417,2024896373,400118068,158498292,1246791910,905512151,2058269587,1427557610,1875087938,1421910521,463225733,1269382752,1689361460,142388179,1755896422,71473054,184360050,220914291,1329553284,1993284365,2017901399,1111451792,1946130863,1317850066,1818570843,1849369671,1739400036,795722863,1002707229,83017645,619254217,1901718019,1039483985,1942974757,159102028,1815559312,1405000846,1836338876,660908083,961585007,1388393280,1985985575,1718556434,1317545170,1541538904,1765971341,399123311,247265077,2074491127,1255783605,851473118,652208137,105799623,303254324,1327916858,4962244,712902247,1069884877,1366459777,258469102,2061558607,943545008,1118040969,1084951520,1357517992,1598409874,809613723,1339999556,799669271,977024520,1237406306,7651630,1249292108,1096502098,1622599247,1899554342,898172358,607142054,1035304776,451027478,1571059282,1809824514,1567513285,227061008,259944483,1260302490,767938776,1434666544,20819143,431459342,497314492,1058022688,57663043,2092934915,6647335,1332212487,1495046240,1258838910,1385843543,1031683057,2001507738,416070929,740558449,1880668306,1098847186,214591016,972571273,2075741572,1962115110,454035901,674999936,1739107561,1214962425,1477732702,418791763,2008651124,1000949514,364955085,94718477,426596477,957977929,1693923031,1485141216,996962478,758284637,260549649,1988625119,882942257,361533211,1869964511,1670726904,973962033,551523973,506539415,734871816,961615878,1152049368,281663043,1854328743,1097214863,2116469034,1698438946,1101355523,929745278,1012159480,779634775,1511724772,937775998,1923040811,2021305333,491530861,904869481,2026131563,203953411,653407763,1284553551,1899934314,104149992,1366358498,459017125,186481122,454536013,255718737,97578129,1218436391,1868962413,1899789639,559974431,788097595,1666460182,1417302322,205960250,921348786,1102257693,1204701812,1414640625,1366848053,1823131307,1825417039,1464206571,388131836,1431340109,394682573,1171806845,1298119243,1500600681,372951507,241853638,1103647880,1153590723,565252421,990856698,1508649426,1224569091,193122795,696836636,644735775,793558308,251610191,71252388,1688422612,1965589408,1932385253,458387255,586462037,1304631191,898263168,844350631,2049368268,2043274362,2024850663,1506453773,535290238,1226167804,1425918637,1248265340,1284085950,1488234488,358251202,820737456,1322772387,1101610473,1142874825,245631899,298626746,1066075692,1423067053,1680230845,1270282211,1923448483,1720910818,1484954003,661206914,408347299,263165966,1569691785,1530553808,1553364046,1766617349,1713435130,614801526,680224870,1375060898,1965768032,1692046667,1384018483,1632800586,1089883175,787345366,1846346838,617379517,84083653,139394248,1517192831,767449297,1850406279,1866979750,2075399281,369046704,1236557223,1137672617,1584435678,812035594,684714577,260794670,322313829,1608409822,1575076510,222957118,775657505,666515975,850357255,841867161,72887942,529845442,2031494593,936909999,164321315,742178716,1868392041,1427167409,919485096,1677317656,1318449858,241627143,812579751,1870349775,1536518456,813891709,1779093734,2104643770,658168444,1266850445,1018194623,1562688509,1638407968,1052950315,132981707,1212283853,1264913198,922150185,282412771,1424773006,1438441840,1189507796,1102766494,705117078,499411343,609763390,570872868,1972192724,423908939,1990395808,573459546,860723916,1436720007,1320213442,110883226,1058136688,297418392,1088113313,1453037622,257570956,1167313183,114805573,237987827,1394792725,2095539935,1241683267,318117519,674223797,184036263,614293978,495361585,577472474,117126862,967873896,1796737214,1112641305,1392218069,1834069658,97382701,1304940594,379458285,228822512,1451038232,1079985428,1860286284,873548388,1633988616,1109707039,542062490,2093648100,884930378,1735360972,1574215113,1905719193,960057275,2012186230,1362948219,975133926,2042440269,2010253309,1819612823,1117603224,2051844878,1742820307,796036640,1602059315,176918775,2115828805,1806114354,312703734,1092584564,1237422068,1941687416,1618389364,387138969,1839401078,1390060275,969191810,704305525,536243965,1853759529,1435919976,1586046629,1706096584,1529337107,1015082701,1613189730,1360377756,16824149,376593772,1619505742,734047284,1356397212,1140658017,1095647849,2064761531,800264431,1741453460,313388595,758093770,1897958964,2812607,234153355,1158158322,759148313,2040173166,569537809,294980109,672944546,251883156,961588662,1815625240,734490518,2047955022,2046467424,271858075,849238245,1852733227,1698569508,1200338604,1668158919,1872954096,1338076093,1501138214,661536394,96439794,1746693481,1554499159,282013009,286496450,1770884901,941959015,1259390503,923118780,679175234,1933447499,941525056,68231273,1745059186,1698722004,1307392376,1067430371,2039629839,957610603,1034023825,500158565,1835950480,1061580743,530838332,124845154,1072369945,1525751622,51368258,1664921944,1007108135,572189326,68427430,1283621668,642654855,354108549,1546496870,1420459399,1686700663,1263871505,27895713,171393433,1195778194,48350403,576639909,1218953437,1187044726,1110100870,310978609,2071104821,1435084460,326823076,1110955724,1351682211,749435886,1733480102,989622560,2117747401,1504123425,1796158593,435934927,351270877,1472653723,36241708,2100505979,982951029,502361399,1936061466,496321918,696365862,1988039045,2071966861,563249158,1857558270,1645020521,599164551,567980924,86873828,659158115,845014951,1210150889,48686458,359763166,392449258,460728147,1502863556,1070735403,1716345593,1145163055,1492695587,137185561,1936903687,397436358,2037195352,999586518,120750483,1010179799,1304094792,566049529,1337410030,874708682,1399442365,1890843895,697304626,418680033,671053433,538963562,197261834,1936307081,466200560,68678573,751723901,1876916252,66648881,1515895945,1382881897,679167335,1719795733,2092554387,15069017,667656924,1332629457,9413754,1826556183,1854349546,1987647077,1406029155,684803321,1251594041,1615809443,2028893930,282158992,1933869623,949987854,2035095908,1346979204,1824517159,1144433298,1473193784,682756133,783075137,1391075222,188341300,1229094784,2117072028,1619980428,1846824896,734461176,1430453214,1279822858,1253858307,2120960932,1399677705,643774261,187894657,1534160873,1686348059,1605835472,444179966,892058051,122250432,267648015,612443518,504202773,1021645630,1335412471,1863859423,1549096478,1599081200,290047613,1539819927,343913947,870438052,1890142713,1644581602,784695881,658965908,63915169,498040161,2109658376,2126351112,1350038916,1224843959,992158337,49419195,383685747,560924093,58131356,1392463351,112064339,34467338,36994510,2073131734,685894360,1556625512,1816134548,473076453,101003741,1490696417,1946335002,667481709,1484893457,225067433,608834743,860606789,1796669149,862317544,1664446909,395245847,1370479717,1918600250,2036765577,1946324615,952917633,1012498429,2052972305,1825314095,1878582808,1062343405,1391100722,2106202763,1494295710,214007777,1452506249,1101197855,331375990,1342470577,2040661435,692015923,2060062461,423209872,758256327,800687344,574273565,630083421,1737447772,1927420990,1844038990,245061097,2092359412,2043613516,375985771,1528726491,1785569748,1242703140,1912199353,60185486,282682605,1937081122,1206907175,799831764,1941674788,569588760,913835510,552113203,301418800,1017245490,535507064,748445389,1403313825,1090746566,1231761284,1923920770,771468556,104806611,639335360,1691958894,762131684,406398238,1157987541,1414178146,1010409550,615933182,617019141,557296217,183582219,2083170362,1703765752,1199547209,1817679162,1211689384,744598910,913306674,1713296006,468542577,498664032,1901155262,918843718,421570538,943488872,1863713375,996664828,2092547775,611489943,1398501931,1178995228,1872490923,304609854,185957028,264663090,1104314517,720515617,2100089763,1111617892,1576729428,1651089984,34449140,1304870323,1847649984,239517195,2117679616,745918127,1024890908,591814181,1590192123,438909429,1395318120,1337973270,1872241605,1098454039,1598839337,1069585264,1623882085,1119842143,1603079072,1725906296,2081844393,1893417945,678953135,312187498,2097642884,699858530,1385046923,1877061758,1823288225,1487362256,460101091,411223547,119004842,402756421,457227045,240427961,1352342603,1239307082,122581813,36551775,200987419,1534850215,1790839582,877370490,2119198638,764073676,688350257,1350344831,2079392490,2076284975,767299101,184627050,390065151,1788038519,284686790,1676457601,1319337569,979675582,1376771279,1082912097,1175964291,504294306,602316063,997385066,410619177,1892319005,339657208,281554573,415174579,994257735,2008439188,1237459137,1264461899,532778088,1550914217,1601828013,1632554629,2001126442,1888119646,1069941022,1864348562,719301314,646749827,55949085,1488792907,734342994,1582397074,1518326785,2021981202,652605932,827749749,656780097,1891965435,1160892382,1165763182,274715823,865367099,730160553,1136662317,662998671,218922570,682022253,1778620691,748882914,2068563945,1182715246,409868395,1706149424,485775592,1646094284,604884265,1382753767,1025896425,384671908,1218389491,52559247,2106849429,1426779995,84384161,264487158,373841452,1207143086,1089048749,1186102896,1372474052,1140709832,1435417336,1548432681,1246896834,1428757257,2118537303,572992786,1298753141,2086694853,74815860,1818047196,1990571677,1098789883,1240872514,595100129,311156735,484061240,358428587,1795393854,869466833,352802391,609090441,1122960364,659535502,92965479,1178719011,1049459072,1215993377,1189347676,1416173590,864238968,1491170041,162132130,578768751,2002766929,385858317,1506193324,1274376222,1053288034,1442499350,49101248,1649728416,1814222520,440026562,1138743666,1174674737,198292838,227118996,2042927162,165743419,1019110366,1245926897,348319212,169325350,1004398577,110264886,1415771853,1747297521,244790215,2115135307,1630544744,952656612,391303461,909974369,1592632968,1726756420,2079952147,1616604797,1547108700,1713903862,525857509,441732117,944135729,1632999498,213562907,842328255,2086515084,2038371268,1469184942,1398155765,1308064036,1197305785,1658244177,2075605289,1538466888,138555260,802012690,376545136,331106347,2084344128,2012726572,1013973868,1736161153,1520942908,685940426,1031575497,1604566219,46461167,21210183,41564034,1862666726,26838718,614128982,1057082617,1489549910,1763728868,819605193,482007641,748672693,2083135487,801906409,865385667,1756665613,1031772788,386373618,510049297,339795947,1962409618,219489644,905517148,2050317973,657074093,1919275601,481463895,752709844,1725139910,780787377,49591242,1100212527,531858470,841324881,1118888601,636634672,2055751239,642943790,1227454451,1526410476,1471449196,1067314769,146606580,2064769477,880436417,1512894395,1708948357,874570255,493844853,1164410148,870983697,1564068526,1162260220,2018399561,219335898,1086270178,1071056586,93697,773024018,540932520,908962388,845562098,1232308136,1690343292,1110664760,1158973225,1841841314,848177140,1453312030,1017162143,521163253,160186389,1881915383,625837772,1432268864,1048132852,1383981051,1320411234,428954249,977526611,716076616,837639806,1477958211,2115049403,1701381359,1717413829,386155577,2101748292,1503513165,2044329421,1345134924,1272407356,9906053,1991322845,1971209745,232735504,1332297284,32978767,1660055905,469523861,1185037540,603587206,213832204,1665789863,965542346,2041428120,1935205888,1789209656,1674091698,797293693,1418261164,1430507590,1414161862,1883278768,5932424,1225122586,1696025981,1864465677,307834726,1191976049,1198742440,819289498,611300291,1421921905,115478258,2086159417,682809588,1286673393,556328234,1381653544,1829399600,569636526,409295921,814707791,1995883102,17012413,26373588,1701823395,412207301,1015658685,853995775,811462284,1566172415,1579868967,31564330,1043069859,2014494286,2012329747,1077007265,1880199794,138871632,1350874686,133005770,100477332,1417250881,1238162485,89595620,1307316944,1824132962,74016401,1664119524,2395276,1478404287,595000413,883505274,192188985,83517677,206200895,561876425,1102336941,1641905107,385305523,205967303,1354746751,713078866,92720066,1103594730,1692783876,1611043243,1690741799,832073494,594549130,1784846057,1678283190,1938154346,227338848,1222428055,1710993301,1105570689,1373615439,811689763,1237658856,250673097,939924793,2017335132,475285279,557792761,2049206553,1188779284,501691448,1948366792,2029585541,149978488,580426640,1311898768,130930792,1562168638,1116219122,512123278,250606886,383200223,345876610,330230709,533846214,1843140439,1240578557,2127151792,1314430483,1380614560,1539419197,1686506016,945102440,1632834967,1229296666,219844661,1777720659,1594304776,790600205,1115877610,679054447,233011274,762131209,1345033309,591605848,407459084,1929996978,794217851,319650575,819128398,14353023,1467665813,1827383276,1117620685,703693313,1347693264,1965483155,2119734677,2016224491,157973834,1993622212,139048466,587442782,1941810195,700964625,1101471775,1092782464,1765586971,1549107108,1870958946,1304720781,1311605135,1729675085,871123505,1563467704,117720715,477787959,709959939,1430764150,640765124,1848160406,1948727927,1990620644,1025170021,623801686,217682057,1301514109,463415933,1977221791,2097455073,890292458,1609933153,1045946666,533954123,1448686745,1430659339,1997100641,1545114686,481668781,763687506,1564026083,194276870,1258307821,414129319,384583989,1061374634,1690473376,2064177151,1329032896,1258731520,830780744,180308863,543768431,331346132,966016924,1923112650,790420261,1512899443,1599702112,2053006773,1041130210,263773777,187395276,659575892,2045256212,1679330957,279938208,1227818790,417588559,648402040,719487533,387168873,435898610,1192259590,2111962146,1909884916,1252469111,2042705637,2063130305,1644304555,369369132,1577124503,616546048,1214370356,1150087751,1588940792,2058131930,687079322,1535365983,1971690513,844014117,2057668428,510214756,1229559569,392363006,1554383943,32486644,1640890363,1606974545,1847673222,1203145825,1395867273,2050578328,1501764969,1728502558,1419105466,313309755,345704071,1232566529,1966187636,105991769,159150862,1830165645,105398960,1217959897,588074368,780958206,647591810,604992876,1690015170,1870744207,1465996143,1971495696,1662670648,733240456,649818418,2096265167,2046634150,1213674977,508885310,93473778,2000825623,1949811322,1002055946,1767022773,1634252791,1888420938,1221887558,681093985,1179210129,1933572303,840472564,875207726,461523959,588705549,859328370,210882430,1524264352,15903138,732455606,2044685390,1981593572,1062061169,592532182,1144303934,661237351,1427208066,1229942013,885562821,343613803,1843750997,1748569691,1989767827,897785512,1959426059,2106016379,218176405,1669939233,1596919647,104156471,571102579,1315414581,68071886,138812354,507487829,178968036,889489476,1015712405,1670654257,1185426692,519455993,2003417957,59157479,840791862,812736489,1792661937,187661882,1922711293,1683452612,1482635479,1865838709,26223812,1545412030,535024273,222593461,540792857,445027663,683509789,183043688,1135622530,731071070,1691939903,661420439,717124808,1378517409,700842807,1274645912,16675355,1131241207,1365231463,1742339785,1661408982,807420945,609591579,1265342763,872426078,1768420966,1586708759,1765704174,86594656,1003954516,494770815,1576916898,661616531,292798726,313258634,1408726971,1319080180,377614574,567347952,1132472590,358080941,1350359019,577379559,1728613565,1760429194,91399120,289287254,379389868,2031694776,769156093,818806014,404598983,1698981454,2028465899,954585164,288917796,1949954930,141762729,1576957616,1253374745,1132259358,578377428,327181178,1695866459,1756475905,1332884337,696888613,295029379,1535347987,802597128,169098285,519329932,286107135,1045769801,618749774,1747318648,1328686057,671276205,1446823000,13729523,1099963227,1178814635,1503401628,585556663,2108650630,11900485,349456202,1872371854,1806924981,1495142531,1741963419,716554738,116099337,1861294540,764149578,1147253599,1089563809,1571280115,1075889208,1419426448,872067910,323594073,1003042156,1310871962,1558883261,1311222119,403968364,1961516164,1497940193,369478977,653812866,1248801041,191763161,338597598,729430038,1314316822,910278665,931914517,759956695,1499482708,1063582354,1270642711,1557253662,329478626,312608023,741818818,208348390,730492058,1542531418,1491426814,277382073,363614310,140152672,1803196396,820421689,1433670164,643070678,2010804519,981129702,1572542621,1865308154,628903459,1614699488,152408928,1776382196,859861612,1507668379,186869201,450963358,2106925479,1872642874,1261704594,1358325356,2055330233,1032296778,1302110550,1172095104,2068527853,751409869,2098569268,1670832943,151525956,86382204,1925600836,846002491,875974179,476867975,2095531729,478689893,1779917240,730892313,1547917837,820901830,231941421,1276345579,1674144615,1930199557,46016119,685892278,1417899906,1031555287,589027048,827370118,713966953,1327476761,1568021417,217028465,599037475,865518996,983941909,1779861553,1565860703,443538435,1621279284,260615384,1515402876,347642506,465325835,887604957,762018612,1113576471,603456570,2060783167,2034907802,42558400,2034215409,641060941,740978069,1954205288,1405436666,1486904190,513235885,1547865806,707850410,808437811,408344009,1993719471,1527455817,1257048482,916247649,1760798354,29615143,1208492207,861863360,2060419753,742662689,618357216,1040947896,838064455,1584466889,287267706,1088629921,506208744,1998046086,936261857,892019405,31278944,1748469757,1806712934,1242651303,1966354305,2012081156,304811780,1494549053,337022628,825528437,1595113015,1140135483,597206381,31205895,853735394,1891247022,790311433,662354202,1033091840,388033304,1781935320,1852640478,276388032,1881483462,678820,653773528,1364673978,1682475879,1292307512,1761632928,1387167887,1679980717,1328742475,138722203,467446652,1055226758,1795795192,1397505369,803203251,1516018304,1590604261,1305388084,555383205,1558082816,1477611322,1871945829,1539767245,1600432680,548619114,1349567421,1845255378,854955437,269446783,1379739455,1872312687,859644186,1686327536,726424284,1164817852,1441847,2015270052,577182364,1069692131,989254996,233709796,715315586,2105127667,259947387,1096459376,1876920022,600391567,827149536,746094306,2087660183,1745324094,1133151066,556469222,2029862061,912199060,319209354,854957669,1733486809,1311987450,1762267439,275515975,1133606597,241770680,359948466,1465400775,299879650,1040444572,647876438,1176384714,1513107707,2048083339,105699422,699573181,1232890615,951328056,590166500,1525681454,156160471,1180954116,1220086764,2092497945,628181537,1398373431,1238630440,164556964,529863385,668997310,2058909303,1054902653,1959842034,433241548,1043960190,348779470,693659632,713174077,1387050380,755589438,580796703,1627845304,506966041,844270564,183367207,458070556,596229753,1125925910,429644763,1717013491,62555343,1251445673,33678094,1421219698,1254383250,1607950476,837024490,1329662868,1854096513,446084338,1366838497,1770491494,1881923974,831836987,127252045,665036449,1177300362,1659117831,1757133912,646804847,104744516,1263737466,1164143025,1176197138,951497573,363730103,989963434,1312612129,1378990101,1091429205,410900413,2075883258,1246765870,525651116,907088020,1738419803,1474995690,1123886078,661300538,1512953800,751514330,987539631,1824689873,1192156319,1254380488,1027980352,1675163511,1375102447,567502651,1726622691,1201340522,32038717,19853018,38752141,995458316,604994918,868837043,1858733645,572396829,957210042,1712530843,406951541,458053715,770619944,210012490,1873860304,657388763,1747370382,697527996,541626865,216007741,1601098564,466838336,1027784120,2044111112,1958064804,459046882,1873672470,1962648635,1254522915,1835399060,1390459889,1861081221,2021018148,2066640213,1217270546,1759423596,1613764144,259562569,675179177,1190963184,219292674,1387688255,1438287318,869476690,366095893,860446137,1509325077,603151025,338736334,365381868,56529781,915256107,1222057336,1840873020,1020443505,719958769,1030783440,692718558,218314506,1915848991,711413190,1731821329,427125412,1403814566,23986628,2124159184,352452401,2033375686,403813988,1811581092,792012102,215737752,1229567994,1355609747,891173093,1786982258,1917258883,381551018,1037266076,1386721581,813054267,1476145859,1871854363,447337368,654399212,573145319,1141094819,1892369848,355576348,380520449,949573255,397922855,151465762,1594383108,1859357153,1589364581,2039373312,1496454794,1224987686,1260184036,1858959642,706311233,1543452776,1825930694,721810722,6117398,282326283,709466077,1615363080,1823405243,694879052,14815296,1008541344,270547772,392963781,1630458594,1834293705,477137395,1558239688,1173767494,1224182598,1214321299,345724477,1670997521,1996357096,1070009686,46331041,1074912672,754833735,449848117,736131155,1533390292,1424929395,901746941,920624812,213627917,1439432835,1162396281,998244582,1393791985,1884900479,249300392,976007971,515108501,558037312,737780500,588090947,1826319126,2083180317,21915008,809973193,1952732394,1723990706,1991744781,1088946337,1738230109,479010308,1461466301,1565061807,1914565499,1278137282,625466637,1833537110,803360679,1116880955,1594678574,1587142632,416257397,770939552,12070868,1847279621,1802380223,906711203,94162352,401510241,1040702077,1029968415,459054138,981717180,1672593980,1225209150,757333739,940442211,1911086669,863613629,1800416726,1096756517,749323395,1100238588,1071525963,1024730580,1881235814,1090421137,2023754982,1434852974,1173978784,1700122009,161846901,1549458363,271898618,647378640,165897827,2023276030,1678528505,540165990,1928546243,183982018,48246717,473438935,332010110,502931812,1949038631,1205848992,409362189,900414789,852192021,54328447,1145406742,230644662,1080612865,836101175,639893892,2018359560,1266900492,723385050,266845096,243951666,762248455,672650983,2019526528,1270062298,1127004059,2033243730,2129068485,1861280625,1412116168,2113253874,1742939836,767287936,1305358438,1910621779,1582788888,316119614,1903138692,1717313227,523610814,1748341494,738104074,1908280641,1945622995,746715160,1346482019,21688646,203224259,1331892822,1007045610,2106504833,908726594,942514539,1838620760,3522873,1814900331,399992888,1764006341,444593196,1967602172,707502240,1017796502,1944541940,611782828,1887572850,1468388952,900159872,1510073239,1685787487,373100931,1221957115,1573194498,1958758278,1945801524,441583968,636202917,447389100,1675309685,30165683,487269425,838234252,347694860,65778794,744000536,1060311624,1578769447,291914207,488446325,75246028,579514507,398437365,859423902,574829516,815782856,729090540,871458544,1933838304,732755499,42202573,873226972,1050726803,173136531,1764146319,556369564,379796853,85854378,1744346663,1758025817,814976891,1804040506,567132909,1837386910,2097857275,1507790409,1560195809,1592804438,883035159,1767154068,471902318,1225570127,428425943,243426640,89993337,1540586557,388257064,203662454,504357994,1671649916,570626283,1864452084,1377013229,1382638355,782586427,535431875,2029864511,1081696728,1920006120,2038068792,1683012575,1143486304,2104918907,394092000,798583512,1055538459,806562284,1135180380,1973700051,1407659855,1292743389,1991972107,308325563,1074240644,131020682,1379923393,703160944,173237419,899567603,510432496,13953610,1442133678,1101089820,1033949425,1556641211,36944095,2109768963,1380502108,384311236,471925187,1028942366,147803440,1060769136,1237115430,1521982275,1738110428,1772728050,334497503,1452720289,532055667,1989906470,1303928568,1486816907,821404268,569783510,1599732267,556985123,222621019,724605609,549469749,854265497,1896967000,334793278,652812321,736360375,517537657,1039766062,926618537,1045979291,174176057,685522332,1478991259,937828909,1682023493,1180366088,1625303363,2046809415,31185052,893301004,1688382988,240932827,955218895,720097693,1952163992,1450579056,222712957,369646256,982598702,1323790321,1500815823,941983710,1413979126,1432713138,2038981451,1681582334,1250386837,1077727456,656834728,1541208218,1472915176,1938016623,2003630615,1440785568,1201506931,587197843,1110218317,981307396,1041537942,248114476,716420834,791258252,1087917126,1134542359,1623601025,1788624944,451233762,1171328546,223191184,821869873,590366680,78078570,1310363080,803691240,1070457232,1655346650,555411950,1798473551,173546093,1777171182,15384009,544303603,294967336,241417071,1838335486,1653940494,536657603,2048757227,2038466124,368721183,899810424,211531877,1797504239,175737236,2026984952,893943115,1461227787,998492355,2105933258,325327307,26495252,1361411899,632323983,1843417015,141216994,1637859898,292881675,1532830527,1642411754,2022037637,1653216927,1237913227,129189657,720622638,1245774206,603476634,1227769665,443333345,161494359,1432860531,771245134,600869446,829936829,649006207,1458338001,1030267185,1502445035,1356758370,1988840975,883981678,1006128256,64510003,674613484,2130078428,1482105601,484601120,472353404,665156464,960835144,391678583,1071374516,706503036,1659408555,463445950,1835791903,1327976763,648787409,1464539090,248759974,177009274,293653936,605259187,2024066416,1631302307,1148298060,2031927556,1712404337,936329745,1060180509,1930153192,1898461960,2123312631,486321165,426651832,2019358972,1240754311,533364735,1244681960,1450250550,478560158,127890124,1979026870,2027534341,1765947760,1136430820,446783531,970636241,1023844370,363655821,1920059321,23953668,1178749793,1276188353,1513331081,680020573,619657248,670851240,112097812,1112272480,27973884,43410984,1871595776,779385412,907865484,196844968,1300310643,1807943917,1611978953,1743071828,1196913417,1266727142,933512329,1052336268,305350950,1145895920,1524257175,753484894,443017146,156896854,56153147,311935939,1122513855,1458749457,1635509148,277044243,1554250258,346491157,47480835,1922821579,81999358,901706060,1896364431,2126757186,649599137,1339162569,663075306,537125225,6250300,921831571,164189587,389138857,1362803149,1362027875,481918411,655445219,347981942,1643128229,1397541065,1433962568,1446322164,318466417,479554322,1913941778,1968948738,1072900055,819434650,1265010923,1522039725,1881185137,1007927171,390236593,395214904,972710260,353523530,287862663,1050596814,929535396,2107244537,1633987974,1699562142,1065388638,1330751517,1057904924,39390373,1407616076,317228422,356673907,169893728,784436857,461605302,1128304554,1620137025,1620818805,2047043678,710926413,717818884,1284737423,89718593,1194372991,1002155578,502859746,1643266577,875703593,1675928029,1966806730,1603948005,27706105,1485196312,1147107625,1652642299,219059597,1584022036,479982625,1849649677,661132089,478835274,1747734951,424815818,1143936463,590158776,658775494,243607197,211731623,159961388,274923294,1630930128,1844863975,1848036685,1681642080,877739069,869018818,307143642,2108071636,492660454,673790476,1114595582,529511014,172453117,1162663797,159246560,1232363450,1655054844,1962869967,1378069438,1296972785,1070589598,152857884,1675598283,1320550619,1501525220,296260600,1560227551,1564198802,161390795,174395839,389598109,446325282,1322752859,1044213649,1145814494,1334713041,838681383,1970445754,665446110,564057470,1724937672,437083252,1611374864,1064117549,387974477,2035344286,1556896953,105262927,1558062766,1441698761,1137431326,1070544395,526371967,905060380,1962273884,1717881293,1919065529,958659211,2016057836,491285433,108278083,1146759141,2012828063,2097228619,1533248242,426501624,101272992,387454941,1305660870,791250392,1809042636,1781259899,1533235818,1869886223,308309731,1502116970,94394418,1095506038,1447376028,1569353403,2000247269,1705268375,699906894,477581725,2070757070,151990227,2051890536,1295809436,6795656,629804306,980795911,1762776421,1323187059,1656250720,943196755,1832916548,461849542,1858897975,1670041827,813986082,769755962,440369415,784206380,636509438,227800353,436168393,1078427372,2123653553,630573936,1351321960,942444894,1456211774,1382529009,1171067939,1077171257,137727609,556442320,783178361,1839842046,1423611047,2040301349,335965395,693771092,1659506032,815106866,437647166,1129792367,664512000,1268658010,330740768,594947055,1788674744,1509010068,460456911,1416654729,189278993,93244287,797919199,739833024,1838159994,362661123,374957968,809641196,381841332,1613595424,708338118,2064332856,1720197900,1432164800,134984752,657344103,1695218386,1231606219,699454687,1142478843,633572635,252261252,2073680792,554015019,8073782,2123832802,1349222277,978612842,1151593315,2023522949,1979130698,1011897328,1675863761,351411844,1961198984,381536642,1385808779,792896142,663833149,1460436695,1535808694,14330335,1505144970,1192989903,2075052008,1220807279,1174543590,456597796,267942239,1015506412,1539790258,1555447290,2089402751,850961730,1447823924,774617659,1770423190,1327872218,1106161222,1328728638,281430033,2004364090,1508841564,1468440583,1929546399,1674693050,886489598,240005550,1439569595,1773879306,1703962033,611264686,278968590,1602804250,827807147,1086101273,1094263662,494562263,1104659586,803792605,1840279612,1113741187,1308010096,1996334189,373123794,680681961,62078167,1488954198,924814026,414875368,1174197120,1131545926,346871575,46969952,249775233,243212440,1742025612,164099916,475350855,1027815897,2111126856,121224019,1282111438,763740449,1351073991,1029654619,246215552,1795171994,2027823260,180216663,1386260434,1346262595,1823880099,1231534482,1284347136,1657622017,903736900,1553992926,1131929515,68524208,19941072,578144585,1970088957,958532653,797272646,702159406,1382811609,1947358856,504656298,1333421567,605376993,1927877775,1212590738,1967104085,916882694,1803128522,1855127947,1510118529,1789545253,1823258758,1374005877,938998692,1350167375,1730912050,1092348586,1042372683,930050029,1772053188,749941551,1292027805,143096935,46836263,186052585,1853341608,1832973578,37555710,1408847501,945013036,1855817117,1661319154,1881046467,1561335720,172084810,1971468533,1651755082,1951982976,2052763246,468927567,809450617,1640480991,1074827801,735339337,1648870812,1832358143,691204885,63247870,247809956,619556717,61630025,2083173841,77460682,1683983939,1932084848,261569748,580049738,1493676976,1497728273,230577567,2051655089,361299909,1673348667,341503837,2054516723,205468586,926445527,1292043077,994207608,1827518149,1091244385,1558014989,1945754131,1895193572,513687338,1112434231,1539766017,369859449,1553197778,548550174,302052447,1903879580,866154003,1689455902,105624669,1648833479,814279582,1805107232,146563167,1300022718,1068923211,1968573230,36178214,672863773,943836786,1330195920,1286308191,734634615,253373298,1450635431,811983453,1528982245,1119625952,895120063,618497819,883125130,930377312,2068590628,1465595322,68882925,130158048,22319657,1098767531,721554907,1294830640,1511405095,185743347,507637077,215272753,1302392794,1664883549,1202562032,524834021,1463479565,637882645,736379128,1123215393,599772391,2040398419,182768119,542330054,250390318,1952814483,2023517779,710870664,432857445,128588661,45369073,464124005,527990633,580692199,466541599,974590604,133528447,1225181012,922716077,944843196,105647646,255470609,661669548,828731238,1060040369,2039465195,2030027366,322353623,1924748905,1814239529,119569277,1763929714,441404257,2089439464,1927509510,2117067909,1716734137,1553657795,37205925,1360346314,211063180,1022139836,1977295896,1276758829,1426385654,725515738,1715398883,1851086860,1071933632,1494833863,20712891,1155878500,2045995439,955654093,1070625732,1258764218,658732515,1211352785,376195184,685403379,1455900203,191558727,52350085,2113828717,1100099905,980669120,292640454,658990356,1621961402,1674629660,255220989,369154129,935734206,539239009,1528850589,1106360816,2072991898,1501159325,1621342019,2126185941,1548849352,1892138514,1481289703,555296139,1657966122,422051189,182850697,539099899,471156843,1293853499,705103416,259596680,510799487,1113018794,1048612013,497172720,658618708,461085699,1939859991,318904151,1459770678,764730034,1107679500,1923833439,1872046988,1767100335,1733618555,852425727,2080218628,348107530,1403106921,1453568302,1868067243,480857696,64094864,357307634,950776871,1843362936,268667438,1583806073,189410278,385752099,82969996,526583052,1615764503,1174511876,1646364399,620049502,547889059,1324457226,2090283878,423123142,1671672218,1617436036,1981340728,1458342301,1797475722,17926157,159114230,999676986,192150982,415252517,2000165385,1764789811,265878296,540664257,123602037,643969987,1576610662,1134005672,1837456827,1333540947,936899147,801443026,239857456,1002484554,406558630,1842719543,972232292,1853832698,1784372514,736386588,1190524884,1247320203,671701425,519404684,2092462712,1625626751,990869196,2019011873,2099956510,776609907,646050009,759728748,490573161,235243160,769544992,1749487609,1631353559,2064130911,388633657,1270804857,626170470,1846369459,577049189,65288483,1355382534,1399986947,623709802,777039982,1297963979,1487733279,1429439476,1299026343,1214946079,927654710,880910458,86665594,1728908969,1047318228,326150754,1000422841,2024025990,1388287331,389443812,2051720751,1403186516,2087615010,2091906042,1468036707,1855068799,176784018,1807678608,835199778,708380099,1816004470,723492095,731575491,54395244,1588636674,433315779,1311081635,103630327,623200924,664484774,1559359849,669476197,276185370,858734260,125100251,1421038607,651790834,565707218,1091925053,910606555,1660601485,288553393,1433079377,481184747,875931300,611690879,454402981,1540928867,1892476056,1719918801,1374455502,1437132221,1617087958,1789560214,252679979,879325531,1723335763,200347298,1608847594,544662915,2043183779,1465467604,59817208,1857993408,1822925828,338264734,1950659075,1376604402,1440462994,750090106,1570712095,1763585666,1259337305,1402369903,1970320255,1987140052,382985620,528450561,128226194,1314956664,1751634195,34167084,420610752,127808500,1541430820,1652225078,1764431846,1326934440,1853812302,917202769,819234992,635438707,1907260575,1096941065,921105924,1975243744,761742443,90386064,281397882,723322996,1268193624,2008793050,492440059,2049692521,609468390,427377014,1152946566,1764115494,1770790116,56919427,990126789,1960862962,1480145841,1503825654,1158398386,1513994821,1168558180,683556772,171292405,841045467,1244680467,2049344681,177100790,265625102,377372827,254176503,713934805,1741065583,422600927,1847070656,253161485,554465543,879584952,875122043,726990835,538915528,454197654,177672876,97345603,228963346,1715598579,1473502812,670685742,1509674079,508461523,668242417,1267709813,1670704997,648361350,1680440218,1080849849,496171130,852678415,1117711117,1294994519,231158892,1744923358,173940188,656867948,537086080,996598268,2105354179,780768930,679720243,346180798,504187778,25943105,1594525306,934383339,1596517952,1884722447,10178449,1356053568,1471381419,1041388983,795824909,136443422,810093663,52976103,882574927,489215156,1019355242,24096317,592613408,893720792,10460270,397775897,2024951855,1442825531,843155013,658737921,1138199662,1985746585,1225299997,1173148180,666417496,1328265071,566459593,1550042884,826723408,985025328,814150299,1884027327,414520560,1710169606,1923843785,1941986794,2025677147,1200984236,305757413,453271480,1965858633,518171199,693085750,1007454098,1296933299,2046626056,343707019,1944837774,274901022,1066541358,272239227,729714012,2101246707,1571859654,2118308106,221054175,1964150017,688079740,980787080,131224583,764617224,850650816,1600295132,1392244979,1047900320,892874544,1866648434,154353517,706429734,1567092245,968695855,498897117,222736897,371940957,166383569,488205281,392293971,1968339861,1889884866,1827226318,1511352508,1949429840,1672160982,2046580586,621193197,663799240,210064853,120060654,1634831500,1312759720,2094943807,1008317026,1806100675,1934014225,2018847044,1054040781,1878885643,490271686,1791097906,677273594,643189623,780242511,232948097,321420882,548700405,962891535,161690618,1141198488,2070892194,2026883576,17293940,1396463333,318641040,904402883,1289255677,610920334,1114439727,1602156621,410646859,974152023,1399577426,1338434236,2015756052,1889275563,1021098961,892850826,344881943,2058740994,1056526795,1438350761,773531450,998218125,1244075337,997682730,1396772657,545021349,220027685,1496930387,1234732241,14423296,982506548,222085863,957926929,1440979001,481631093,1673813435,1802569037,515719896,1223707143,216824811,203271832,1624852635,2044295920,1698579103,1079445661,1731028635,1545200222,535555778,471628570,1071043374,536099476,2035781766,155106003,663542394,271540589,398808027,2036076314,1805345725,233581045,1066268317,101590784,569265084,550375394,2033159254,1572819911,1567293831,1647183324,2075993129,211113626,825447845,2048310049,1896859678,674573821,896703933,1149431491,1074229164,594252581,686640268,97471795,272403126,1311534187,1874226631,1879509923,399862446,400887393,331821678,1341062237,1969733581,314462479,1513430175,1520405952,1970757194,637157304,1826220954,253873219,1472362796,1611280763,347388658,1908858236,987496857,924488589,1935165885,1155130018,80374950,737929027,655234451,867416106,954995938,1068747164,235800235,1782461308,1125432058,2044238434,1925514442,1597361387,148516383,508065964,851735521,611340884,1988893092,56808651,589524105,1201692191,539508816,649963125,1265832326,286046801,510194955,1325395258,2114093157,703041889,248823586,2096205945,900026704,192199707,955466218,264958277,67568271,1291411262,1990050929,946837167,1888462517,1685442552,1084346327,1889979628,1961618026,1820630814,1327418335,1889745522,1684731638,1207571678,1940872753,1333007670,1656843520,27817781,730349981,1612198026,1168620271,2080930764,1757549687,1525044073,146923980,685097668,1370115369,431304501,923894657,18354641,490163176,113061375,196266156,488544356,1435485736,760765562,673707065,1711640012,2123842104,591121237,1870916543,1978610950,922914296,1158631067,1601132620,1809897524,1974726757,1063600602,1800651845,1462825280,355480373,1726510302,1108987534,1446542575,205582626,753627167,334433105,1937002155,1999359326,1926423963,1827429256,2093988360,649020157,1667447590,2049545029,1296749658,2051831170,1629321232,526008309,694521938,1247026516,1894262700,300444872,209310649,937774508,61448175,1476209420,1158007604,990257278,1898297871,1440243659,764503592,823376923,1589916536,1121766005,2057309059,1104511581,766405136,1457918599,525549511,1303028145,630854033,660231672,1161908102,1176153873,1833095003,1732152267,2093547604,2089372109,1457226400,808554400,284182263,913655042,1459089754,767974820,234897708,339116223,704315923,1369043507,1423561990,1260045490,251125522,648111911,166037287,719893114,1438159820,1311291497,26848283,236018789,658815220,701200628,1235656086,1020859564,805288023,1358369541,2067732905,441375704,253617996,2054786286,1481039949,154481734,446450860,527129629,286455584,365376751,894179443,1340299118,1103405261,2085216994,1690884952,23734986,1551757824,1936280251,1856724290,973003555,1982532998,1930075818,1825615496,851674067,162354132,852500125,1339505155,1000683680,1011759081,952931999,873192655,1735271211,1664800032,1470644240,616179473,698756638,1165014602,31793778,1792968844,701749317,1856415057,3049969,2121353698,2081239938,2075331901,1096092970,283080701,538920193,1824871667,1347029406,1173104488,1499833782,827349417,234936601,1266482257,1815441344,2128703467,1382406378,10275877,818981168,1362249374,1153537156,621410632,1867869566,769951382,1299114873,2126949930,913760654,46834718,1000790771,1631130126,1253906279,330138683,439312175,1486816641,1031755044,1737441111,1943436910,1482681958,637557071,912602863,412711246,119885270,1519262879,940983927,587332256,1669868160,1783790157,2107559115,34494020,282887818,2078113264,1483452071,1573114602,210496843,1438775333,1063949450,953757838,1017605703,136663055,1917146872,376813338,634594835,670784864,312130433,610910354,2088448834,1151679513,1027671278,1560546837,1946465174,1107115847,966902932,1272878365,59472964,2070728743,1958978046,861424430,15715486,1578577796,919769662,1364017549,1593177839,2044181803,399820047,160713685,977460831,2115301882,1850732608,1079873210,1451780862,610817363,1222843156,319952162,118831448,411897169,1241865667,268486671,2039428150,1065818800,935237644,1190448703,1858592786,308572065,617223478,756677599,1491550762,353516982,1570450973,191542637,978718388,902375385,138408999,657847056,1834507078,1475535847,1343366361,1560509640,1550578979,155593229,1828417533,2030289037,2077926106,1175554778,941764607,992670819,884471524,1301347523,976059212,1061889897,2093686075,308693850,986058309,385062672,2108178866,1324780246,1463669183,1477297355,1976715791,2031784756,3731839,593812094,2006433987,572221237,360158682,15897719,597032512,317380451,761847925,59874490,1273171180,1073346713,1185550016,884097393,287082610,57640261,954628943,534297422,302385916,1895822033,1626000713,2051260524,738331249,56311107,1524978635,1478636754,1063768484,172060882,247834921,2051274028,1191232556,576528576,731920177,1196905205,250647742,616446332,643890163,1674720382,2031588714,77715128,1232028518,926240660,1057834018,694708700,246218450,492211987,107974193,1761356203,1647283854,979197300,1743544845,756223512,979819164,1422253920,1880590013,1778300765,2121319661,1068745784,1507450638,1591585562,454584293,1572340341,554498172,1476140643,544994145,572009401,2112624029,919401580,76395455,2112553644,2036371188,1057045114,1299556993,620968511,421441309,1082564566,1004606069,1190289639,709151952,925733806,379218542,1178979591,1820794051,543441290,322288219,1282930893,299515097,1020682350,728299005,390411807,846111459,452255522,1812378527,45555712,991868544,618850886,1784903604,536428944,1110371699,1962578525,558458688,41183323,2114391144,457968865,1454426619,1268423763,1699123448,194524502,1197600906,600180964,811454830,1894378057,454580867,317848087,1920797721,162788391,1938453356,304659809,454082045,1380328790,1869236498,967388299,78515082,351951795,2074425218,1482667704,721488148,1645089613,333750840,1324572062,1650184930,284255075,1202150133,1006444030,752115205,955374700,1951331029,1612745718,297889592,1244513952,803043144,639597902,1620291386,27279403,2090515579,1920314577,590123320,2061184112,526997653,1333268882,1992989600,420760649,1350352921,1725980958,1739251559,842340023,814634866,1648510942,609205304,1998697840,320336848,817965892,1589946521,1149801872,451762431,1912390290,1808017441,1303952371,2091823011,888175277,1000538726,384612049,174752557,185474721,1830950196,1272950083,219240101,1856869289,1043296489,1662393593,1550851424,628781815,1794610232,460438484,323028717,792506020,2083155393,47189498,337232712,1918734598,1828886951,12727682,1400781851,1405499410,2115743989,1915928605,1243029990,820712229,1994074393,1448677071,1849839939,1051042336,1934456497,1890446457,78682221,245488867,227280752,1233351476,1922501337,278776398,581792697,1106363209,1145432513,495317329,969378554,1167148162,885158063,1977266260,494102417,26153237,224195803,1539363,1054856191,1764481580,918978095,90288211,1070877744,132160788,980111074,1535619807,531355961,1295548252,1184525499,50132799,79598755,395290720,1739911366,857019909,669275055,1143979023,2122225837,1034562754,1188115165,1165480130,447692814,1003997745,1798993992,363164736,1143760279,644093488,519910629,647372993,28464999,1544000329,922629996,1676524352,802060232,847086936,1552391660,882300089,151423352,1582788402,804998156,1822089312,1153045327,254916683,378794506,1737741383,501006627,710988245,1168970799,597130105,1918781298,2127409876,519050243,1943126751,790250551,1479627745,248596603,1305685150,2095114563,225760909,297121347,219092419,842543992,587924799,577249470,1925766438,637235282,1441771502,1366492763,403531533,118381764,1648469365,1502965024,2053224995,1333762187,176381273,1331226919,76197280,594397571,1373970349,150442006,551051566,1635138393,284389138,1982287239,884526590,1827805122,631521208,1986455828,35921155,17592377,1558576616,1153024297,1075092127,136009022,113022523,218731237,1629648352,47969642,205987364,1864578441,77861377,1823144904,1865746396,1979957659,166849351,743986006,2097334972,275091742,1503496739,485035854,1902354558,917349254,951329745,59059707,2034374158,676903827,1858936991,401845822,95984989,402282924,159676257,1528936321,17902681,1620605984,1818073953,1392899351,608855180,1615662113,1772706482,1482781878,1651676168,1044077082,1597520453,515884203,2096427222,30707061,481089811,439904109,882474094,950541232,894036740,123077796,1890985799,1532406849,808115616,635829891,1326242896,863791448,586397518,1475269633,1279140827,444804313,39935633,231791909,57852651,1964230137,2101601063,208929594,601291673,1999460649,2117855756,69880162,281464562,729880471,1153864169,1465394088,1489473949,101084217,938952346,984220721,724688343,1756287163,1044975594,1733258879,1422974274,130467073,114831226,1657718385,2052184190,1819037921,65395794,1252482153,1331563428,1447635121,1185756330,49397114,240080911,1169310309,1111123090,1729338515,1595687037,1352442001,557446608,1653942274,1994411284,872077947,2039554055,671992428,1125230845,1611994274,384449314,775990501,400991244,1121929438,1494733637,138311441,867266221,884054546,628653327,840618491,682971848,1972130650,236199491,24689655,372785179,550683382,600769472,1835473241,1763266286,1138802952,153683550,1291716675,759560512,223722459,1006042966,1100947832,1224010125,1734355885,2084588071,884077872,201267758,1897259293,430250651,505162119,955706836,1732869408,968816605,1826864008,1135454745,183458668,853377887,1687350638,1186913267,1203760712,1617835493,637946106,1326691883,102680321,1851063311,1222189049,342725557,1194281465,94548789,439723140,1193264377,190507064,1272090479,170823198,1985873502,1047957359,782043453,1042190804,463128711,1159060914,948591961,318165184,747897563,437121840,560913178,742297510,1907435127,119416894,1142986142,1679413405,81767895,1892320562,2093767806,1167493023,1216771267,484646326,2005831316,1153145864,1314724721,284471241,1121987550,1086301368,1468491946,402008058,1164050946,662248590,1649706168,915060003,302346163,1609673490,1429159117,560925368,489802885,304067939,1718769995,2020901606,1539329787,114936872,1685539652,565934712,277928493,845373414,1803983251,1655864247,2029339092,743854540,1446139116,1692580643,544854118,899997182,1737072169,1165765904,1381974463,344330865,1897261344,761293459,1404775276,965086261,159078147,1268956282,1533693732,474228540,1513031300,1757973368,1762711444,1448882354,1319840351,1900868719,854047209,1539401734,1668070162,2123890105,885742751,1283015215,1690182754,54735816,1538931843,802221901,668294799,576291394,667697387,1763662762,1724972493,1522630374,1920456252,1304217045,548143378,244923974,1148011208,1153539099,1258771957,2127266427,139374515,1051032227,345246491,1770882845,1748455210,1499493041,1523013327,1578060643,10653039,2118520953,1478237480,555813775,1656246360,1574860360,542290611,1888261853,618828171,928994688,356691102,357411645,855384243,862421108,681217602,631313811,1676967918,943399677,1341193626,2003005573,1343748072,1457372256,1429197042,1339649237,71300198,157905853,268304908,1776064019,80924326,236697402,1950223075,374135502,1328030718,662379892,692763317,242361591,951160853,796732699,575516773,1004195694,1960177894,1580726166,919410310,149265340,1094907969,440447213,2048357983,1952312217,656439492,2081528363,1950377009,263364170,1180905335,1354441599,340859352,1767311485,1128921648,302788319,1515233200,1628538398,744863647,1451117447,1893775249,2069428450,1387752097,170948058,1262611733,821256807,1213941574,1383450580,497504605,561427133,345494587,2094890326,822554150,1882489592,1406948669,1956025982,747922219,1487133769,342206369,458442744,1709390578,1327206618,1983367786,1035814543,266477649,486618321,975939602,1573542631,1761151450,887125302,617941940,1997123353,1385927084,2112930319,986484819,698114453,1009337940,1627941844,2000638581,1851623459,1258008165,1252314806,7034565,1272823867,1536542685,202844966,492019993,99001959,1074230633,251303582,1834486975,1862109083,1926836848,1258464697,1789239328,1113333474,1441848140,19812504,302684636,226453436,766243601,953835328,985621816,51296613,388089140,1946265901,709083433,1687100759,1046139640,1117968304,1768785481,1005087994,848391657,735387806,683655724,1313273611,770757928,369446670,908037186,41068212,270499927,7610949,2071290647,1359395259,1806300667,1764939880,2095882625,1723235088,685089244,1813171888,381113663,1810008059,973946893,293472194,206826290,424015627,736618694,914113124,47703808,1657894280,867452242,479279348,799076351,1993646516,490746248,1640487510,767087406,1956196292,1326602227,341912489,528696194,714976915,1622582911,304127799,136682341,1991723897,1719603305,1420053311,1686663009,951292823,1714682256,1781723100,1569767409,836153211,1868500901,2120048459,1576565112,1371207301,1117142043,56336763,502471859,87374770,1646411247,1590714408,1622820330,606735525,1387961909,869008155,1362374795,663686662,478972175,1626548598,543024696,454311031,203198991,603404986,1497545097,1685756344,1463400802,1068562227,139658750,1433307290,505195610,1821697247,1653092035,398400476,1283718393,1319516860,1219034530,96864271,965442177,1291197334,793963873,676034116,1133450190,1536959350,627581739,1591285975,660928697,1304925424,1665316837,448150032,919775270,2126969996,360535641,1718931108,1020777422,775992188,1597467218,1995406455,1779184629,1264408193,426132789,31991651,1255020343,1679402097,320107410,871889448,970998557,1756194588,102232944,514964429,1605744238,1688561726,211592329,1611135656,1680406068,650601169,1397671454,1826788881,392758039,1220877693,1118914412,1871704172,1726328583,227882405,935876132,1973884126,982688951,1858463314,1220927274,1245472718,1771756703,349219009,1026177926,2083123811,1142958127,1903510567,1704233658,833072912,597518109,596924555,1370276676,378909438,710737580,1934616334,375220074,1008298273,77227490,1368411904,1001689263,344344377,1037864295,1087124995,1135684702,1739331219,922929805,1918233071,1863807574,1011350925,1119540388,1315143013,921864786,960638436,87892668,1790041168,614756621,1096462799,725220839,865127665,1728557198,2056366326,1396987578,1499781959,242111454,1362904727,973319774,1029130966,55911146,1443201570,973351137,1660710037,425132717,235721251,1621343790,1462861109,1633378239,871867568,560753556,30635313,1477082414,548666377,453366858,526541652,1614058209,1001504552,2121120193,398945450,347158740,743762964,1904238052,513079301,539704627,676754960,1961890905,1863050777,1745607580,1664741135,1219516169,140580607,1983143031,1736840244,1912497304,1564920780,1446619690,419805266,133489266,494238248,747823854,541655967,1839722712,345775624,2023768653,1071369534,1444099796,610551140,2002165266,843081223,675916342,1503968491,1621925579,1068570564,20702380,1258268618,1304856423,1810194356,236331449,502552448,14762592,1167758049,629743100,816974307,1420771330,2038430524,893087729,32169551,295300217,689120807,151436805,1818690509,544800216,1860941935,34937358,233298967,21466617,485560417,566626665,516159802,1700698926,905028489,157940261,649850601,858075645,714822085,1990265480,390911363,268459766,653255489,1561236482,328928078,1165297146,1458363798,733559308,111874112,1303180675,1983030610,823788436,1230003696,215149246,2022150823,939384250,1990080841,275528309,1412857209,489661868,1233026326,1682645380,313617843,1849256066,522736747,1358908525,1913649089,48918902,781606309,1227058838,2081003377,811959106,1818805988,1496962724,1217428306,1403775673,912253964,769840898,834952121,1235312136,1344289340,473284052,603657948,1193250544,1307241969,2128181237,1736331349,1872311140,15219098,1840604503,619807218,119930515,277680841,857603103,2079559022,269904555,21502475,358443463,825677847,908590962,688290294,2032039334,1874473735,672207016,683608783,79853607,801392771,1493945775,1659456391,1376300185,1276621136,977921916,214900901,1159883201,1103289055,915179918,33158298,1949104250,1699808041,1331578491,676417302,930936509,1327580793,178699161,932662280,946270888,233238319,475449982,2121650967,1731662518,1308039322,632468697,911735710,274970806,1306583663,672589329,1839735610,89748731,803515232,1518514274,374048041,1733677828,1652432643,2063731825,1191147793,1770441123,1325886003,835938558,187642513,1569961328,1712039312,1741008224,1659113746,804006637,312475193,169030406,934213251,957129187,1284304613,1074136562,552454500,905790976,1942502999,1583596672,2121126722,616524893,32687210,1930058372,19191917,985598213,1999761582,108888528,1255576498,1126047736,751532680,410102707,1243318015,614139186,192698541,1378018268,39113337,669131274,1033751980,686247745,1667752718,692822725,1068869859,1337306872,848721945,599985426,1578369373,82060258,1093606443,1583259854,1824048629,782259992,117319692,754184485,46648169,1162350800,2032588738,110691535,1291444707,1981791299,413671736,2089055745,1608233349,1997536944,1803335037,94454390,245707394,1078642933,1159958494,1476146915,579352481,1018959298,1192765681,765729311,488747514,2028320483,480436368,1970478385,1734492846,415056462,36163842,1092329436,624091287,1655179849,680969587,1747528234,635174210,1150852377,645351496,1057344090,1486290308,1531487796,520519184,663295551,814590686,1395819834,93404821,662297290,559676110,1689382129,346657573,353031518,72005837,189410536,1310555067,1273678776,560911849,318638033,1183101546,1929746092,412248994,2097078836,661927901,1802775980,873133248,1732280590,2046934823,385950956,532517853,383042131,284321409,114073933,528902366,217839962,2115420919,1062045344,265000482,1069728616,579025412,26978084,1975011235,786112301,674785460,2010830532,1838089216,524044765,753847239,1090091249,1446659699,1909450343,1204341169,1519349216,601858990,1023700663,1699775772,797207969,1625448151,1571218978,647447955,2087892805,682626258,859236536,692210370,1290985474,650113434,762135478,1029560781,1487484933,1260424139,103862276,1249938410,1489653319,408375832,1294189053,1668552671,1746507692,446209480,74487420,1826259003,1612320159,1872478000,1250067617,236957114,306314655,326840017,254433217,1633424039,453155768,915881157,1318316874,1194099245,104754623,591707979,796372377,1168273138,82583976,1004454768,1926661178,176147798,1779260390,823504449,1330277964,903880035,1117206739,219733757,204383259,1610416532,588526635,847475478,282474481,302683722,347281879,136972094,575387677,446139724,251246187,1731019986,976744315,270313896,789255317,865771387,429448759,1224709590,164940426,2128510258,23305715,522300306,744040312,654893050,115327768,1972402149,645824789,844141329,274878276,85528681,15420785,914340105,1050861900,41517784,1217428025,1274295171,860661899,1594874980,1258329709,192377996,389698707,1242978843,123672738,644078010,756754537,1783664954,374688517,909408174,603911414,1209262796,1936057410,1701975269,68929545,888571608,1167406225,1708528709,1159049706,132379717,937846494,1137841784,1800218514,1915093046,286432100,1403322591,1740869228,823787249,231509507,1462115552,1727623057,1641855305,914831132,889405773,446543805,556389626,1019166548,209435058,490790085,1565009723,2013280056,1688062032,1728119258,1867816777,374876028,1062394484,7337623,924779923,1101822973,135245903,2122434794,1227215574,2076245812,1474251593,81866722,406438564,199789533,770991050,34985253,331697841,1633880091,2092794464,834343397,1817790583,1400074948,995331808,942653610,1162276639,218110594,384823421,70944443,1674060284,1094917151,1343452582,72751388,1039313948,190758389,1299935217,987196970,5176264,230099389,290919877,1383665046,1821685400,541319547,1286629853,2049316549,131108953,1518193051,554714131,1479590293,1798983903,1829570105,1305711482,1868967740,859144519,1415550965,295605917,954802284,422949746,721837919,382488655,1816643341,1003670042,141261817,101020763,1809614411,1040308267,1519612669,679522112,758494823,693825376,722747255,1956153368,761843158,1986992232,397662778,1013624412,860289154,1787450002,444289955,1541709159,1348730911,65448917,1919542629,466595014,1908144387,1010932355,1831741790,1791771247,945264162,1415904378,947528257,1563223567,672136168,995165149,126578283,2121445425,1469712191,192328082,1332217654,868978838,386361473,108277642,674797823,327471531,354829367,1499733704,412195341,1441291434,1551182904,498423132,1180034101,2019960786,1063854861,1713961802,987909397,793813138,779310726,883856574,32479645,558938603,2011976307,281626141,1773500231,1043632896,1734770397,83933208,191418629,454388910,339648424,2039488842,2007282365,561854230,2096364369,453248642,356998806,550032372,320687540,659681338,82279171,2017897922,2094293711,495345506,1127044123,1736100020,1475601710,627203256,1476278131,973299726,655050291,201081864,794196906,1789060545,1228689997,1628729175,759952761,256230357,958637939,226345776,1380386231,120711717,1700701232,843925820,1483679472,1701256816,141957288,1037633611,1049824727,289813493,1565691675,373527,908884190,50246069,881717488,1392117342,205942831,944063715,742199099,1530412921,1467892307,263780873,459281351,1976251371,109676882,1805905019,1676049790,708316522,1485417337,1540259414,824170917,875260148,1486741375,1628139759,495912833,342416212,1480505790,46669750,486342808,1008326139,701437857,464104793,1784794283,1462020482,306199930,1170016951,1405205794,33686135,855188937,494358913,960458286,943357062,1390897460,565585822,822654331,695846497,1760322792,889210770,389638149,1226847868,1798062639,290893845,487190589,392123258,1812945663,936550188,166625394,1491365999,1211894477,1916421553,738090566,2017351001,1327350400,1303751302,1651987994,2019493608,1443656290,272970051,608761429,702214609,1059158781,1678043926,843961209,1944503692,1956432792,738857829,1652359839,1194240460,1554214765,1896916982,1488489641,843073341,132618026,764902489,667139510,871966916,721836463,366720020,582710109,2098195230,956600947,1997581892,1783112507,1832139092,1142160834,1159060134,1993784940,1648693984,266856151,494315265,1564427483,865442940,902866268,1920161872,1795104553,735437449,1657921726,84705354,942928685,1306581052,1298641111,1286010763,1309190609,1871007721,716705462,1128455162,410507272,1427879952,729465941,1869412708,1409355624,1367991290,309832453,890438819,1576045471,1736513423,144516446,994623528,647584927,194032144,2113197133,695569346,820756442,1029411253,281346377,1574927372,339273085,1453065382,1015700477,44469092,1559479000,1605615118,302207670,1340705548,1195471084,1076301290,1279057131,1501190972,1793135017,2069274454,340060596,2042281089,638991792,1551962140,957461275,381730639,891154528,1556791855,508213029,1361342324,279701850,1611246586,1627992575,2096289277,95197018,881988824,1078667951,1940664445,5337514,87120185,1080403980,88556614,1769821418,1323988084,948688091,1542662761,1177926132,433537940,1263946189,95242413,1538969996,151345679,1211858427,1288196953,365291289,287615459,823303865,340018285,1066379865,1417236314,1795219659,1618254183,1082487972,1244981928,494115230,1867008623,639987548,100217742,146873972,1883781132,104098827,1907593609,2084674610,480881915,1504190544,1338351007,734758144,1637433859,1804195339,99999963,1547948684,673976461,34523645,977764232,298283996,273298540,964893227,1025625006,1517535095,638223494,1651093438,1228368619,1443302906,1376956706,1884476897,1037464185,1577856198,488989593,109478415,35755747,1747589622,371911542,1596648843,1644077651,1622980957,1256068995,1037186417,935132873,1716481362,565842705,225786565,1102892634,1288346213,863686562,2033588591,1317956264,376365655,781830465,1919852967,1031596556,1904677985,1029660972,764270793,1173098208,515866686,580040716,364089249,2054775658,1621548613,1585281894,1749734902,1005214864,1527761968,1022825747,1805767326,1401573853,1064083009,1943034899,1257976844,1269621405,1017666572,2060864736,1877986519,736286312,146537815,632870783,977137996,283996543,815084463,80424602,784657992,751322145,1836663377,1314290715,1873565769,93526304,982924315,1189500537,598809331,1612304702,913398575,2124153184,1372307963,1199891690,411180455,55850513,2005070328,585875630,2059234279,1016627346,273380403,1701587005,1506325972,1575098990,131896083,1262426109,2087527282,105486241,406403918,441285823,978585528,225287068,1761767579,1362664631,299475118,434012958,375492094,1482988043,1480525037,2069930269,2013950657,1790545436,49305222,1613284984,71275624,1963090871,1940352575,847713175,157983212,1965936142,713056689,891784022,1694164763,185774461,142272022,306191692,547245717,36761045,1217853529,1959348452,34341683,1951749854,276821000,1668509905,1521118957,1380363986,561181852,2044424669,164033439,819095182,672348143,782656240,449253,1904790833,656359293,1988655515,1715864034,1401278204,1384193020,727999138,1526497367,1414779995,556171678,1940975860,1780842557,1683036249,638083921,1524561264,1191992431,1934392053,200109667,1093477106,1063943398,106487598,1586210147,540177346,1905080034,1893226175,1688668372,317663696,2046436406,1930664382,1406623653,117148737,808571207,985045221,1862850449,1341204308,1686820759,2002133532,332955930,1685034975,843910246,1650549279,1033816252,1658714865,1096425789,220540378,385758568,435738742,1900164754,1233564669,1713876328,875832460,1662557331,847423371,1546689349,429283737,372710946,1992462763,121165904,1757521188,563145020,1879809038,1024546081,2031836142,605679598,1643102116,1646973205,131424104,1865650989,758805177,885055821,25988801,652038772,341044335,2086904131,3446382,1051363472,2092342856,318935450,1350346844,516942286,34142863,379665066,795663816,273130511,1107903738,526795736,1969648580,1888463109,1440689417,1230154710,1537328161,1415062798,2005329310,1470631664,999171349,1371036278,605413663,756577567,346589917,1542517346,1765109020,874309057,722613285,1490858703,2096411105,618838107,192804323,1117690649,401633705,200119909,1325270625,1447908016,1919979438,1486715573,575317204,273752722,1022784310,844473183,1563413995,2102928290,1810629508,544302768,482402626,1025846174,425906114,86399882,942737384,1419868944,250722849,1728566083,526207319,614927073,1162066710,1083954120,1589196704,1883188432,1698832141,1816857972,716442566,1848957439,1042143939,1173447611,1039289247,286414459,1194577505,891648838,2051941292,1510342637,2057149008,514087547,1158954198,2092265466,1556001234,743470562,1929625507,601609931,1676240993,1712643199,1378255731,186046783,591418756,721841985,84260119,721435246,2005837850,155008982,1464726067,1311463412,938490532,1758089022,1476833477,871605304,454575966,686787399,434586198,2039647758,1879646328,1474314752,126638037,1705784978,2113929280,1301208397,2050188822,1993425658,736240133,1806031712,1436529339,606045899,2041875352,1287929987,1986853012,1680646405,1923334431,464728071,1381481359,2045376185,1080030734,1505760291,891210125,273236793,1919270528,1914672023,2112609087,168096593,893149957,951917038,17191952,684046876,1600892432,2012442001,711479053,286715196,2058009618,927035501,964275192,1782853115,1440342325,278842393,85440575,536716435,417942233,614193166,931972038,430120870,382101726,2068843674,962915003,656856191,1063280917,494391261,1119397685,1362555086,1773060125,1331302722,230857362,1811285198,1279421678,1713816148,217285597,1025305106,33755150,117585325,1944832543,1905050981,413902688,1053344458,522481790,804103411,1001164878,1410081658,633539457,1493239673,1335442139,2128469255,94694135,839170001,1799281584,2019862606,243949397,567140078,849704490,690722307,1444068334,1868653280,702575674,1430205075,1030544764,1934699690,1187354535,2065661537,166353047,1544487943,1562747041,377510076,830083916,1958419785,1256893956,1327205332,111377167,1132369027,140233684,1570167137,1211610261,652218919,930817237,1018871313,1962433529,1690729458,992106429,1256812632,1388562773,141468585,1300525400,1354781075,1596825765,1471210137,437157824,12705373,1120216539,1269617818,1617798308,1287457313,899068157,156222202,1533632449,958441106,219314645,478402980,969875911,2088153633,1660310210,693517560,235571702,533654,289050821,119449725,1207869484,1968801612,692114384,1504867865,1010149474,1221255719,1861761599,1645006884,1946978301,712247121,389658582,137655059,477652201,1873720926,1206393321,1887791448,1741030804,2096563961,1611104956,1862671871,1925826612,2062393299,1461055626,1242726275,2040731975,537338576,59715136,706586653,517256849,660480377,1782160733,1663483246,1722402352,4957725,755928357,28274064,415990009,255774069,1153804747,730504041,465322057,1557032335,1041512314,1799852861,1898850734,1551301982,2101079463,1047820910,773338719,2124806319,1818878461,1124998348,1312972803,573286473,1152639138,1954732283,1419893598,169404846,1330179200,888769644,403071080,561370716,361208490,1476572915,1276078110,100682358,363914741,698271126,1713104829,1020536661,953306953,730927952,495244335,1704659617,1550044402,1529068978,1173500758,1938337742,1850872540,1742024698,1893482530,915481981,959487778,696140330,1592418397,986002555,2017333600,1769609441,585482732,2117810017,1656459571,156146911,815634978,830314063,421396271,1611503253,1092969297,236049034,272838295,322668159,188948470,687495108,1795196191,1782126644,2071925714,739530122,1700453411,559280335,1029556181,833124000,297319420,1433954248,1942158393,1157325680,1202334483,765845034,1525088830,95353259,1110346563,638619606,2050280510,1665828425,1411721819,635781449,39759599,1325840443,423650194,1503929703,1700832763,2052466213,859744385,552645073,1123998890,112138370,638706381,1679485004,1624776064,1743874170,1160102786,1257036539,16201079,1903166092,1457279691,2028557077,1658007503,1019633772,1031537842,1870698786,2090655073,248743136,57101738,220571154,1249022365,1440492324,253572087,1298026892,533466179,1298349502,336523660,784117697,1882718304,330800671,1690275530,16790882,346201772,119769584,1845753729,394212425,1991317543,330632540,917745300,2011504928,1381053445,1926335908,1639303292,749178173,585376100,1401707814,1282751093,894243074,894088966,1371569429,112628034,449959010,192514085,388701873,1606160230,591865869,2008624678,1137806215,234494447,2005918118,916078043,1872040638,1950924106,1285999987,23189672,668355751,1399190909,156684246,1398515983,1286467229,1120383861,736150848,826106488,1780558064,403525738,965520405,1688269379,1459954003,1450577147,1060754748,430843661,1108494802,1703269644,9219378,2045534875,1381160553,145303915,959560318,848584536,737472474,1111911710,780696931,1567843729,77263925,1962783176,2051638515,345967586,112762433,1170994823,267590946,1866251931,1397897682,1978112698,318484919,1448237855,2062036423,1737137651,945840152,1416300325,2117337970,1371921893,1036906813,1007335630,1145937117,2000628133,63236638,1440022610,1722292786,1215367035,758702554,902418706,74374270,1066267983,934056589,1258773066,1244578518,1950177247,1837983850,1425429770,480410396,418228412,478335822,1914539439,2027507958,1179840666,1028752961,2112463639,1095171058,2063559959,752141456,2063469650,1628792523,257875834,113566578,275134905,313077446,1850470998,1026762567,247450906,508073911,2096765534,717127601,1536654291,1396473149,1861062578,2025403556,1703831263,2057298928,1431096168,946706520,926124624,756969836,1344946438,348242922,1013498739,1965456697,483698801,986914858,1405500787,2059460409,104509195,1603526838,1716526158,1019819416,26319077,474554793,1221715476,1678024996,588505709,532106313,899031221,721507224,1096849979,112936264,1778661924,789848137,222365251,1003053444,1676105950,1437830269,1030011580,1483485982,1262346023,1623093336,293771112,528698855,1090002761,1568987491,929080775,1718577838,1100770437,1311717293,456841253,2085915567,176547505,732381902,1550248111,1733418012,1490636800,1928671744,1512294898,335562643,1672186821,349810610,789051141,171605476,774432106,1691583849,627430730,1969323440,2090070915,188591040,1854454614,1874582863,1304577668,1565075940,1119304297,1806635362,853818579,1024845233,719774601,1920090935,246126265,110579052,1653746110,2045041532,2028832608,774501249,1834638955,745660021,1426741178,107703082,1814443492,1817528587,855751503,191736353,646858544,956086868,2125314369,1944274060,66370121,671007300,860610530,1794971340,1171393465,1248279765,503194397,1952532739,1964627834,967157787,462315348,1111059167,657654882,1104189832,1492368493,295556017,1723617510,1963294670,1045294933,357930691,753304053,1573121064,2096964168,908829702,1523676835,1204214032,1639750076,1865028995,245997019,413136248,404617888,1725115427,1333771317,1277317579,146761252,151253075,554906420,1364876964,670059433,1869625746,686477031,339653835,20957240,847371485,1779590231,210249022,1250455299,1850987820,55933026,86556894,431905776,547576510,1745991036,1780916933,745344608,1099315393,744407992,1971258340,1391204564,1988455028,948778195,1929440260,2108519167,532325592,212143851,1259959098,330939605,292716110,1767506996,428924473,1451549406,753184363,641085336,565579116,1624544588,1525899991,202904334,1624700937,1397707787,1352460701,2115764073,1869253507,1980197418,1208475710,1383158314,1574270011,69487153,1604353189,1638714507,1321136025,1086960502,920969454,1220802833,362843631,2011343173,1394945869,11652950,261202603,466023730,634306693,1285000708,725393245,180826570,1171349454,273279279,2120662294,556061343,731285615,287517961,1033502284,1091122232,2120538767,2897251,1066281620,1467640513,1513069117,1107198935,895135597,1041320178,1629249833,1310833500,90158473,1570962339,696300744,1175997653,203470044,1542370332,1365383106,412649098,2110311819,1764985099,978527894,841036544,7141675,1049372039,555199108,1184874450,1018572543,168698437,513311088,924285962,1955291173,533748255,322902363,1493304363,1575463530,1085800496,200341845,1832155793,194301383,82990108,1094807613,496592884,1923748380,497979767,1363912352,1563478576,355901102,559651277,693679290,2047305167,229242555,1819044215,1703993327,1352846523,1329623097,1265421912,1904398414,1020842289,855101509,1925820237,655968644,627582176,1707349846,797174748,1168592726,73695908,762780300,1936401173,412346849,1221710566,451984637,116901790,1380194518,127169935,614492735,1951059534,1764004537,547009381,1366945769,2628695,74585239,1274446665,577697867,566887237,1145742083,1189452368,1885883122,137398633,1641627367,1287965897,21232822,376441080,1917593157,1666051214,629671264,601426003,1892157501,2036262616,1429801903,980339151,63129892,1343287681,754465500,278553232,1337864318,257252893,678996862,1363981380,787437193,654721574,499576466,2055856940,1119023281,144173570,346982509,1678433941,725036664,450919725,887872307,1989506827,1834055794,514837339,1840869317,232079799,1897536903,349466229,258703314,1614016150,1835760714,136561309,2113129029,42334663,267677642,35606893,1175941570,316919868,1885556852,1962130342,1390436665,1928000921,1585782270,990172742,2007018974,184463415,1599893928,959190049,889173456,1205788051,2003191309,427978446,1247441359,1172035872,1201726720,1983581295,722996191,1559728298,1651097959,1356170013,1060038522,90449066,734743668,41574802,1432211403,1786330123,682050624,979190381,292106910,222223872,672114504,52331548,1869570345,352118093,1530570265,1318885930,1400581882,491168527,755692916,429366968,1048388241,33126407,1198616402,233852937,38865417,895942116,1931536307,273513346,968972859,957670333,1796690040,1086642985,497458265,2079565647,1074318543,671591434,868364445,2029496382,516207952,599353201,83882968,1822641948,730101610,1264275674,1365379993,749066830,1917474368,746969646,406756692,74814634,302417277,2033111647,1303176126,225166249,1438741941,620740933,313806354,2112184862,1869760413,1879682922,1725978859,1410880120,1011032072,1567702441,273697813,39978685,1075149071,867733856,1421427887,1254425849,212461381,1664747738,757364240,1856815330,1189823585,1260421055,868561047,2118572889,813249142,775654643,1261144779,1549765310,1976944002,1158902763,492580586,1861898043,1253828887,1179154994,175936597,2066143467,24632324,712522090,923573643,753838180,428932551,931554978,472543780,1982806775,957117943,1861635789,1534776612,52443347,1890865942,1591983519,1623861528,947749438,1929571184,1630779991,684808410,1240562379,1004242857,1521328940,1755996347,1626400246,251840566,1024975376,370939089,1248857336,1290632811,1587999626,1728983567,54979058,1497805831,1620217385,474702880,1867419843,1413786421,423206207,265814031,1368042119,668989698,508363853,2033278876,1079450531,1485276175,996498314,327038847,1430693892,1134148982,2112744596,896216653,1260657885,1264566498,1229774549,1104194155,955979901,2052637802,689448299,868297300,508723164,581306681,1048402893,956691596,1022173234,1272849325,193004065,39967876,1706469362,1193066758,1125615820,534678420,1305525306,505463746,422913096,329625763,1672002959,1116841625,342942865,1379456563,1426996029,32802979,1751407201,1696172327,1960820447,638940569,1694539536,877742653,1551843579,1461187535,1098191446,1276567223,1937887386,1805248978,83362355,1879990231,492301624,1296171131,1975335072,1657133133,380801073,1427568449,1126388866,897534364,1534570956,1368511989,414429953,572305885,967530800,1155322144,966596255,1543424414,618171018,480260839,513490651,2074997967,1658429903,752453851,1088898934,1837998830,402198476,1993397717,1470185059,542063556,1160288116,1773242034,948085179,1875092038,1657764855,1056494805,1756009779,50609271,1073945982,2027523418,62039159,1121340258,204568135,1366999785,692728904,2035442125,1311073829,789607439,1969183225,959805327,659229662,1667479725,1887982295,1431778211,1502745083,357833681,1302207934,1103594736,2059624380,188058846,1405288418,98360573,1299367661,352206513,712522685,292378329,195517529,989814116,1441027605,2029028408,459725092,988237837,337538862,797747984,834798340,883708995,1968034634,758265517,1221470037,721741667,223561008,2119059940,2002580949,1283798288,39976575,598624871,1406724931,1990207530,298388156,1701352605,1139320086,829161785,1569982217,1399861431,1857235918,174607116,639490731,361077059,861905488,816656694,227650634,1090671927,1894433380,1640930111,1543513221,1081988945,1644302907,261145470,1525562193,1382451087,1476547705,265763228,989761204,1209536634,136743348,1374539350,1178229377,806888444,1430050345,698367279,834983403,1752524577,1309910289,1541688862,1497301880,1392107340,760864744,1294196818,907089273,108646142,1400847618,148042644,193649724,1315523889,268660180,938150089,1330672836,399970864,1604050734,2047624297,505998496,407483898,207483431,1676515845,1451515336,1432780570,92153624,2037149054,47950679,315567326,201061624,639775511,1749108189,1037352458,1142852504,11163998,279889706,2077965148,607561256,1887073800,1413562253,2102731557,1894824557,735861199,1424048972,469842141,1758140524,2040536914,1066517145,210117855,1517029593,1917230082,74350237,1316523478,883010008,856883756,1850486621,966826898,1474067111,733479878,808348584,1363819757,1491968989,1099436702,1721125198,312135059,1735139227,126286685,2039958088,679049002,486507294,179622190,1843298036,1726761192,711060216,818551111,1236534758,953179239,420876310,1595306259,1691768333,2119047883,1085869790,531675795,86355929,285387960,205210595,425290931,717861997,1886564380,1732957754,1475536013,18210618,669986135,1063996404,813858780,1996160161,1897096548,1357836276,2076214918,1435539334,1996353867,1545201367,1800019134,902257686,469715327,2052612376,72565060,652312741,1710153751,1251852325,1614522572,2087685255,979821390,518542046,667838540,1463378357,972682546,758423978,515189874,168285016,1118030793,503024181,1722087485,1942260532,730770296,1090878771,1928524753,479247336,429910205,241023648,467141450,1956941976,2073354891,550869511,859040797,449537867,1671639298,1845349834,1323600800,1406867193,1655807619,320844815,682004661,2074772832,1718635859,1902049840,1337337431,463232116,1057446618,52878958,1298867662,1986988623,1690244881,489464732,2095955354,1622273330,141966085,1573181262,193563988,1691771348,1705758584,822178992,1356947166,1774044571,1613904448,2043202528,1767388137,1999963069,158788995,1860214952,1231573268,1990784527,820059347,174516145,1144275066,837046974,959154500,783825705,2035804573,137210224,288349103,1842278772,508771888,611792020,69580525,1412152797,360842270,257810608,1366907757,238604028,612898674,1548262884,167279102,1800239948,1540101785,350404052,702233762,2092383256,998826584,853538018,1532792714,1700956622,1478214042,350743059,1954768149,309051674,1510974239,1214083694,488255410,1687078518,1017911140,1477004610,467561388,74274271,1785290547,1532698169,1892497567,1883171992,1447396376,1348669415,675486987,34738385,944723000,340543410,35416441,860268528,1842467928,809523661,2050753385,433390885,1141359788,837910960,1410679235,1121478572,1796978709,1111963919,184389358,1637726168,962383782,1285476783,1605495173,1788839023,2061919419,1266222519,1966187485,655197038,186680682,642475386,963919472,1852508396,1976390663,1257642830,1131364586,1890471805,649398648,623964783,1849204182,841234140,645083134,312922868,878933054,257066657,940145173,2064387522,569309976,1566665277,813976637,441240911,439609713,1624174891,111382741,173738996,1580153176,728648670,534337309,2018059857,1918228417,1842284931,674007412,2123775427,2053416738,1929997076,1978501933,1349873621,1947001142,1948762363,1080059427,1221150599,1752175181,1567994585,1236293992,1387767084,1587948626,1501449684,555675709,475226869,2048234379,597032474,42892208,1066949538,200537439,905833048,1890490896,774923152,160182242,880821888,1969173647,14087334,268976231,1145660287,87932087,1590693395,23535504,589945916,869206222,1974487041,1007866575,934290685,1049286521,1930980087,1544057935,1971312375,49734907,909434415,1675496065,700301137,1510525379,1647973746,1113799288,1758068493,860158663,1320965353,126048334,1451831154,2032717286,1435725406,319313042,600991527,1074979271,322990262,1250729658,779397516,1037573669,1231525759,633808420,825030438,930569107,546111017,1914123716,67857156,1055889743,1952428111,114259099,469423054,421407222,1148712172,508456131,2049052938,504263556,2002092901,320438773,1569535542,157641166,1980158367,2108968691,1570296386,58523807,1422981661,282557216,866161320,696696290,1005265851,1226212178,1963261834,1042926827,2011794137,2113570526,759151552,1955972497,1439964651,1344232210,277037428,1661436398,665150125,69099833,1001211304,1379194429,830826468,844822713,346099492,78761026,217100763,1803751569,2035508857,368534582,1573778372,2116209971,1026668090,1121182795,1341424846,1133592967,1504881988,1934968626,724852836,829556221,1536391108,2016462784,91336754,854848000,1822597203,1542790176,520559759,1264476731,736150514,1443460222,1182940904,660682477,1696570679,1715969741,701485178,1881877920,1437185056,1545872757,743967003,746010952,1040477593,602011088,1314226966,971067322,1073085751,1240782439,591264200,1416104851,1091803843,670649092,309129928,389630640,591827103,113486926,468017434,1971940741,497185356,2123966507,818579739,1042782662,1562628324,1641821803,1192638448,889682503,1171923923,1029730915,1104890305,1631120407,1797804891,1844838993,1369334836,54530677,1757998111,1065822917,1912749378,198798958,141074998,929680096,153124460,1798419361,962774781,867799902,1662387973,1769880667,1246372592,1159382182,121918286,2029324612,1327159561,1442199023,1709977389,1012870687,1076692219,560997460,1476743681,434022559,1322247412,169400743,9249826,2060214791,353021329,1072838282,259657041,1246207375,1545694387,2079030834,737891826,174514927,537321172,519542975,226888445,1156784583,1068516136,1202780105,512670471,1186748587,858440428,1788422804,773689095,1084528559,751139058,1049434974,767552035,1063610665,307382093,270935151,272873302,1235662502,357194124,1843999441,531444108,2064886444,444940054,811418704,988368113,1443313782,1868477605,1551887828,1534469609,1184853103,2125927325,462822013,1130567572,362477849,1080259152,1259929719,1469030455,1571664033,541989726,36250226,145278190,1643711421,2083542156,1783698960,549771077,998426401,385371523,1009275249,329854981,290140020,454241581,238458772,2099623304,627000345,335584523,1380066216,1618963496,1158222222,1091425983,1413736589,1688128623,424017348,649681488,960821581,335155888,745610590,183714305,289637470,248484614,189298535,288443133,228932220,1412312498,1136095270,1769363758,1764469550,983456626,1722779652,446669497,1344121430,2081738907,658639142,621089809,292808794,1521047088,125360260,435163368,1062145097,1931536770,418281991,1418843536,1182391125,1270646610,755658083,1293768347,937691345,1089612023,394247282,1924125092,1813585237,1599326975,86346562,1022193916,2060849096,1905594301,643804680,44641822,1682782348,983375164,1865659957,1454625244,495898283,1479413711,924024235,396109351,864806407,583396234,1975659845,531051014,1017404736,564627770,1043318957,387638742,757423044,910411922,1700475472,443839937,978511232,1864078041,1495463513,1720262813,354678445,834517647,1118124484,1335183777,1062631125,792503513,1945545464,1446763332,303513445,786756693,1836904503,1610518439,28125939,25942583,866461002,1444850904,1621306047,1270483764,1164800674,333400237,174047612,2066567337,1508885360,1216012262,24836208,533940301,596385758,90310538,718519965,1445611539,872841381,424833343,1651846563,1522260280,1586569769,2082781316,1746991667,1717793026,575024641,915768485,523501326,2024164293,906671376,1353890755,554804419,578003337,995846887,668913867,181836251,2022789951,1830534130,1758941063,1092256948,2129545491,1725148896,2001010746,1135371479,551683470,907336804,853435057,1271131077,726846026,166153486,1165094106,877101731,1935711774,1643850964,1301236108,755439132,871400270,1212570215,1659679122,1874704646,478492991,629208144,1194965733,1303382868,308417972,266118470,1078762730,1839601809,1030138966,714928139,1067722973,579068272,1521488592,509674527,2068024068,701862977,856894600,528785078,1469134548,543615906,904547268,187960115,1149435057,1591248342,686313117,1256486553,193606688,1218557417,825123566,186777571,832502284,894815264,1862439727,1141085282,1381152277,951687635,1209942475,506415567,688202087,1247190109,1865042459,1394075600,567979396,1732341861,1722034495,720460102,242240464,997614809,2122758123,1761278942,814035103,516431926,1335503593,1066508483,881099967,323692086,744142792,1553563660,486176956,331359097,1235491134,1315351594,1133790462,1831725685,2092522530,1609713365,129630649,585539700,1467847883,700954336,12503442,1551077613,1335796981,1821358515,1909518996,220553962,1885057568,148505624,976151888,2085100460,1692375269,1469111307,1546352509,1683293587,1481322744,1280000520,1760301455,628623913,579487188,1246536,158952950,1789348586,982733016,1711672296,2022482200,73113983,1966773370,1390118369,602930668,460003928,1471076825,1999009577,182573103,1249921192,1536966445,410086808,2062391340,1495986926,1767843585,1752838638,474040024,116051682,1559444519,755293797,1928949156,418403667,1829436804,1096875822,783744613,363052638,173505145,794306737,1084258721,627855320,845725025,1279825549,2012703274,1554210835,1430147997,294261749,2090789053,701549095,2000727433,552664447,1158261705,959848034,1389278230,1853931758,1456636447,1848850990,1005460970,1598645662,901856489,1681668235,250392516,124681835,735941647,871579871,1376858232,630560919,1423703791,542088269,575782603,1141202073,774960530,1011728645,157553489,1197834526,516043620,1957387788,725373350,582744998,514591748,594663366,661303190,675152740,1029965105,1099516869,2046508644,141206515,556560348,1461529333,235085962,1431548506,104140239,1956467714,1745772568,1228572410,1109468151,620531508,2106759246,167273556,662814970,1528186579,217191867,806053047,79680918,87543570,1758389477,323173535,464099972,737685437,261741616,513356269,1109966999,1300438732,1013341076,1581678720,799396812,720794453,728490275,1256521187,1988238292,319260217,1580136800,1750285527,2025785401,1256568881,1786002184,1472038986,1474905973,1982259682,809799969,750069429,563013758,1781121172,557564534,983525231,853908842,1069005956,1012446347,1073123752,976805180,745843167,685957844,794717391,2031504325,2033916467,871879688,1606950781,1647188683,1926194946,674104586,1504358223,866483828,1953704735,1926154002,1107858290,1992218253,12019363,616401054,1461451057,690219278,1468845017,852955392,1468934960,293295941,623166482,1617041114,689481308,794301709,1089158537,1009086312,1498167776,1515017664,26154176,206507173,318346995,684541574,723996457,792931560,2065980512,148180475,1898553153,1398928507,268284044,488880409,1993120916,127434966,520167888,1399086559,1754818558,1778872631,1708186796,184406596,2085693080,1333373867,953273452,1933093100,125253244,291334837,290155212,2049359905,1828361990,644637896,21456710,951278793,1268172486,1746517985,1057145185,728299899,1643468915,1872167066,152712720,308289688,1074555184,1298643694,1236668950,1400229209,115295016,203881282,428102915,938548670,1089995821,1514193520,901055476,1146852058,1243949634,2074583390,646002003,615219920,282855640,789947987,60385730,1884903839,587839746,347717380,1208424381,1099696339,1213816650,701329004,1185208418,1022576812,347056545,678242194,1329505232,1486293213,1910458365,1672142703,1499674336,1969901861,541174060,1799036196,1041581120,783797511,1277946342,1966963312,1406473148,1909289920,543801882,511687992,665732478,499989610,115529037,325188878,1508739913,879162935,1508395862,1496264171,257744281,166249290,422855845,1290048267,1738342466,65947243,88692176,1452327561,1963199735,1270770362,557310411,2002144321,1353072700,924009644,1994159267,958912377,1397162484,402282582,111297055,751073017,2034279032,1858628754,519239479,1374041871,589246994,1518740049,626538643,1650437804,1801897430,734444704,1106822661,1784672512,789668090,1631395564,876199754,804874212,1990550297,476571839,963017033,1961328283,433265311,1450176440,561179978,1621698441,1605754145,87916582,1611577220,1886443336,104178158,418605090,884318487,1812386683,69292536,440076865,1167317668,1543965111,389036023,1208134816,527445303,1357008693,1117578022,1816958884,917581683,1795891038,854168008,871582382,788137442,1163104840,1370968255,1468996616,2104585596,174180459,963227230,1202613558,1017015632,1480174256,393805060,482051092,345660793,302458407,1417074563,671258881,407937107,2068238697,187958977,683618865,766794927,974363846,436250277,1895839264,1143280878,7467949,932279626,2084475419,1041005331,228444328,1354759099,349205403,1369495487,734750943,1799401331,57077638,1198524109,505071578,2044490446,784172833,653475904,1654994079,718917805,688047287,607466104,1806452003,541020306,53448637,2031781385,1383350200,1390279033,1253109030,1511619029,1655047543,1041628620,1341625654,1401982938,1553272568,534962472,2037834329,637653328,550954873,1978316750,552638869,1173741558,352081256,1270634348,2078491195,1463744287,1413653565,1487136337,427168501,1753172817,2108174461,1722051071,1563842258,1224488471,307933461,388128491,1609168810,1453085725,364223435,1272530605,1517059939,1154195595,558233542,639169839,1244205230,292115634,1252125993,1540597624,1259736580,501887483,1783518657,890637466,250837697,2029361612,229991798,192460246,1480346007,1823409956,1925806227,1667121612,1626632523,520641493,1372635137,52958347,73569905,1275589277,829866964,227604099,887209499,2092393310,580500744,620905436,914120085,1374316808,1243321740,1406137976,25437669,457793983,691552681,595226042,1036626626,1910330529,466314813,1866143331,1773905121,894560235,673444025,2111155955,545461466,379205742,213440640,1924203786,521775066,618032811,118019254,1641997008,1517137320,475833848,449627970,1294389858,1393699522,395233153,884995548,1065652632,307206515,2018193660,1508540372,979374488,944548811,62140331,1123247834,906704349,2104161602,1253788560,1722659502,488697509,1931157497,1737202619,766304350,2023790769,2023959523,1004999048,401163906,1593678041,944365388,2038570572,1440717573,1631233294,1643578234,1740936723,658608839,852184250,733764738,1088097875,557180900,1788620761,842766633,1444865970,21380139,154619682,98781595,894685682,1753579771,1162542888,1426612531,898991549,2125709538,732613132,36354629,2028578486,1120918174,208941267,1559393726,487697818,457191574,859038880,1476691792,1217617026,117958555,290178421,809131492,1737514746,736863374,523782342,975995344,18040877,697643932,693843743,271146779,1683498736,145298165,68250053,223896912,2084538234,2001429324,225086110,141785097,907848342,11328960,1494401438,143416167,1470663519,940210244,936088839,1018289519,285237828,115638322,1265928303,829194939,444481539,231584391,974688174,355884928,1361054887,1700602450,337549371,573835232,949308384,526547319,522230612,672293427,146863231,699049113,812235755,1215983691,1541245682,1429031369,1760485881,522719524,140237357,565114228,1805285430,9608691,1794856824,1745933987,559585143,2041314208,359333759,1219496718,1638707330,1300883124,279925752,1334673154,1180528298,1485243682,86624405,1600065312,791606716,2117667705,1241370580,106489206,895485013,322999649,1316625682,1787695310,856921121,1439932441,1463147100,264181665,1668273411,930289840,502990492,823994255,1553799964,1902004263,1930467579,1053447834,1802724982,333060936,1784237284,653271401,1435230715,1759860345,1232558118,1715236228,1621171189,2000236752,1759083976,1040616958,357393393,974251688,1887549858,1269052044,1086558619,1747996588,144241972,2109960071,782726456,213417724,1678250111,2055795607,378509227,485148083,2107646391,1382772826,241065852,724951928,2084980420,1407414081,54601592,961082543,1159505240,1548845514,1550693557,67064096,268718838,1420382983,1508236713,807927317,788346218,643828346,744539933,1837481708,1333652019,1490432064,1831243641,276751773,167761183,1719896325,1389821041,1577808755,1074533491,1805307110,970191075,1600144065,1039484341,290641024,1619571372,410906025,1789339372,808058691,964557388,556037245,328337823,1031396863,2077467496,1691634035,589729214,1333991872,1611647551,790518375,1318325325,44985707,92208299,89570741,1515428151,502153762,1857589627,1100922727,287750378,749735452,1760872981,1708403472,1844214577,1166480778,1576042964,1966574086,1117926973,464995935,1512851210,1575620604,1207709063,580156540,775055908,1939211523,812243927,1277637517,1223652976,1618374847,6099832,270170243,948643807,743419444,889551964,79722616,609154559,1220019977,1886986706,1684626085,1711541799,907207848,463585911,1278071401,702021638,942967278,330900699,725485471,1460556468,1625881403,142144834,1101880147,1084087270,1598346648,1772752407,1965033946,979532243,561120425,568456006,1337803519,738429362,60750284,2018693280,1206189134,1421847242,1903830135,771209429,1605991560,2027557590,1508628098,62123546,1973142254,1400621606,902584235,1076166500,500383783,429215973,1732041756,496613365,1444043851,950743794,953129393,4926665,599568300,1932554212,995736956,546924322,50454800,1627833673,526202847,496282396,1547689108,1448106426,289437075,1640384436,740337633,693611200,184864115,588002619,177767218,1202144983,1930552605,1152779020,1175452559,512141721,357707155,491373260,1855549283,2039043199,2114603098,1410746741,1300102940,696270122,546825962,2026743699,1011738263,1727970428,1344809015,699919030,38041122,1502532533,786200933,18653922,1686950366,1499641972,2033440372,1807774325,184019098,303846567,1445251996,146892417,182616445,238642176,1704392062,1818446299,1940823873,2098618750,1711288086,1610298591,501541928,1345738989,858451057,1645731663,599981414,1960808445,1517672672,1123874371,1816368705,2078850659,1471946685,803917335,833779968,220507611,1784874804,158610779,760369787,676036908,807396039,126211725,700906987,1863010129,939951255,267447194,1881999051,926165171,116564439,1031366841,1443218819,1180912990,1387154914,1167372510,884733799,1970972924,1299339251,1132909788,1181740578,1261919850,1822228416,303806708,557106431,1525990449,629147659,313109829,1907593967,1643205328,841366285,1751039283,1686363614,1561152081,2060844913,2082013556,1698011130,1206894991,468648872,1454923991,834260300,1067918260,839296295,511899118,1374204635,775338114,626282980,2047483949,49510811,1529659506,1903113995,850823207,260607230,1903336886,1351197552,576679125,707343826,1243482304,717652092,172847921,1447180511,874300351,1456351853,1494695069,2052740828,312072802,631191753,654026717,326645761,705215423,659914965,592104656,1409791212,1336008279,999123555,1593297350,1629167792,200849373,1724167522,551375719,1904658621,1614302704,970043056,1022120372,1287029176,102143547,709037534,773965011,1377249705,1984562428,1219078409,370298354,1450541007,73466588,2071524963,940864356,869876585,2102908445,1084055959,337308581,1946674652,666482727,963990935,684979315,104549023,116996643,1499637297,1778408728,701498272,562246834,459337722,1860122263,585205757,1099091429,1103774685,867573814,117249805,2003887194,1839833246,336115952,1903741916,2018049688,1376217686,20947925,1823720494,2030759926,816087960,1367241716,1158452229,2037202810,439170735,1487489344,90149073,1712436194,1730781078,804648214,1872745612,962028169,1804517581,1459361218,1981301591,1272733333,571612974,1837850414,2052990403,404317015,1952972109,809056710,1589309227,836056589,995005257,300500806,1723438124,1154432598,475714161,1569226534,466047605,327030697,668130868,1954488822,1608084989,799192553,1022085320,1268631386,1858589009,406684967,922920934,1435886236,1763673279,1636687886,1027537726,641500186,1416141306,1627655874,1115281491,1603774454,364885745,1161939095,355831504,1389708823,1350021238,1222217448,483421298,2121260695,64123397,1611630794,2106539867,1094205292,833947214,1073942590,1600074900,1740285099,1289269973,701941372,298958723,1321632424,439374829,2074752233,1777248532,2069714752,1842943940,1215848052,219838018,1294735364,1126727780,328817527,1721812077,1272944938,970647594,1399164567,1276133383,201289722,1178333116,143854812,121722454,1536952468,353703775,1357633734,1404919589,867249247,1581715322,806398023,1757589175,1348841625,1485857493,279542812,1772634510,718630465,1054006138,1041266892,859282918,899489349,593700751,1042542827,678931602,1505347199,543951897,1411882997,873205376,713820067,1426084291,831959075,732976685,802589592,1067095384,1817418135,1358749524,236059303,1620970688,1340886709,574608280,256171358,1097857443,57780678,1002576593,388010112,458792865,1929614427,1215511921,513876278,2059564206,646809848,1266086634,112000019,1702976513,1341782480,236113293,209834274,551842879,107671753,1766315789,1653091772,93229666,310613999,862853934,213555527,971123426,121002142,1515549186,483696646,1062783899,676800635,281466064,1369821258,129574612,1605750904,351435333,1110081425,1479598547,1990752262,2081837829,991927898,1206561331,1608638980,239597404,1684849133,1187481898,1823966617,1080504570,2065930524,1980983018,1690498111,426497798,674426272,817744344,1054659009,959203010,1611309038,1036408549,1627203484,16668348,1087113332,2057460858,1692588268,845644222,281331397,428427028,989417866,710409054,1250917671,1548018724,1176366068,1660776733,820239928,1465959142,15845244,1918711435,857820631,1176847757,1973884262,1215813218,1030030548,1902188907,207112450,1393357696,1784680610,594283916,609713860,1243692280,509905822,761104057,814595088,1870612231,1645961648,321957450,698128588,1472587021,844544367,1008705655,43464550,1455112889,1212574172,1209898480,751158694,1823898944,1401909744,318408932,1677257977,495575468,977615247,293267104,427646228,835237137,730410966,755863691,330470598,607217999,695814030,1520006490,892831191,1153529743,554655597,348683419,195196765,1852610146,1221449014,1453320000,1762213746,1924024743,1432861167,1398066278,2114787444,142623013,1711164034,1157872999,940440238,1815487857,1694822833,449064801,194971309,1285514825,1111166771,650074804,1437525329,1113215553,597930266,1257665487,931648290,617440821,1027280638,1374001539,723572751,1392549519,638752055,518118033,519968045,494854250,1637267855,1278875672,194373897,1840585419,1685461272,1342524232,1004684358,26361661,1692083965,1440633095,144193744,85164631,894226581,215890470,1630214082,246710453,1439320858,143309100,1953135186,341484073,1290099922,299214383,1425837603,1259700661,1349629450,393080051,679785741,1292879548,1203789036,2005476343,280125858,1470458683,534569991,162742697,530187480,955050544,1205390614,1964838297,1751700812,377963605,1506390063,1865541855,1741108454,1883723675,1739223461,918390855,162314812,1939571253,2097119247,875047592,888623764,1928217956,2106271885,694048162,1337280165,768979620,1302723774,2025709322,334090184,1518413516,1365859045,1400407617,1703749667,894757948,106549897,1452821913,1802344150,2086787695,1712740029,1558735227,129453589,1490878135,142334124,290355663,1196245193,1038073927,718058674,2033005730,1316839864,92678073,1191890459,1123756984,494830676,781348049,1107824926,117916342,419889089,129658658,2105755584,873817675,212490557,121094002,501463480,2047329498,710889223,726273783,471354870,258572952,550737966,707842759,1088526860,1736930355,637131375,1434021884,525602483,1059608528,974631623,1382845595,1913213299,1544838447,1584516744,718903502,237691167,1121680169,705894256,497754424,358053825,1586563154,521042196,145398769,243094711,2026093940,2026894921,1141010269,1698147233,950079115,216140607,246909277,281730398,1673391189,1548485653,865267855,137943754,791106562,413063100,1783599294,1465467180,1617246181,2013183268,1764786038,2079217524,1769233855,538204492,1390085001,1564708663,1868512747,416270017,1056418219,888321330,1831426447,670477508,1937357351,91998291,1235279148,1517024055,341617885,1617165479,1638504180,1661957120,1348830665,165455895,1811699640,775646303,641638929,1059381985,1368995176,1356959420,1870977349,1584334815,1304701525,1180287939,1566997747,548849167,809552918,1937218417,918048057,1031441071,1773587829,2016142630,1404325775,631723387,2062455067,596823506,477874839,44636689,1734901133,1752092267,1920191327,1122301474,297560870,749992788,197018605,965842386,2028235688,1401948792,441659007,1912105161,188332901,1878831215,709169845,895007721,1707857464,2090147805,1017642209,1851350769,2115412413,1574249169,2124849389,1053465982,1444248607,307938639,1121696435,803023374,394605174,1708893188,1827107861,1545536582,376231511,1384771163,971383982,1480683190,577740690,1749935073,585552281,1028942770,1743076357,390518763,1382336581,604419645,448394579,402490664,1232354168,645594338,1195509405,291121980,1895363085,2028807025,345574760,1030525996,503020103,1120080507,1808850893,584097582,716437192,1131835067,480559616,676795725,1247570264,1082668617,745399466,114378664,438574515,896512445,1445027345,999188132,1681995698,1847809013,1453971949,1904414384,1588206222,974072181,1788089753,1533331926,1328202189,837208318,1522728444,265793126,562404543,786313400,575888939,1685024105,1733528393,1491867533,122742806,209348931,1058180099,898457748,703395212,447541832,820738861,2118226200,1328758560,949259388,936640256,1744616387,681705104,374015144,1346354630,1666503575,324168460,1713012934,621779460,1516424080,1224628475,1718791085,264609116,644565836,656871622,1032672896,1265988756,672302865,463599699,312791268,407545574,1036277002,706361577,1898385382,574234110,277772589,1142718163,1095694569,363773205,1577818889,250454344,442979760,949604062,792995953,314121164,1516658191,1898131887,471940851,503525018,885086152,771262122,308268395,180567625,960184431,1949903864,1768870758,1489391943,1169894355,1955050945,809474703,811639579,1277318781,1417129425,320337714,1666361918,757920464,1826913298,2071908104,1425067803,789581503,809604148,1939067240,1935515909,1795165585,1675321857,774327973,699387449,1011521761,24597814,2103432433,178560323,1271032558,2066306888,755115941,1870049896,1280241159,218228343,1998400850,801607944,864686578,885482184,487151625,940911509,504049251,718217330,595612165,500000360,97749240,1103965147,1164794667,499032866,2078282926,153387725,1192175331,579948521,772670974,966366409,195117924,420212417,179186012,212695090,1067095625,2104618026,888761821,498250384,1560253103,561172880,316536377,1393822694,1526460064,601140765,1368011319,1124361457,368882619,1673451870,1676484090,444307500,1787342082,1126898371,1085251806,1809400487,1495830760,1047455102,1073593782,1787143356,437007743,399530803,1928355584,753710872,860885307,1291851973,473355165,1988760347,1667384914,1685672383,321075549,85611540,1588141337,1100678405,1320795363,51082972,931687626,1977374563,927918339,1064776567,550899400,1957887578,688219854,365293586,1819142927,259524615,801471443,884725028,1282295311,464598750,446757207,464564157,724028967,2002277844,1638394921,635532122,400983415,1775336911,292976620,960641360,884395298,884579046,508348801,1387521054,905921420,1032565172,831344774,2117595282,1243513714,1129111441,669061325,116856993,1875560034,419740557,1201627548,1062375487,413849104,1540729029,1168121046,753089639,1420464787,2114052062,153799554,1413145565,1005898168,709379737,931581270,416542915,1938507920,1399199291,399635486,1847457472,1298651105,790482141,1160958783,2072037587,145867005,1571642121,1928161568,1474901156,1543617716,1998875757,565920018,2070354729,1222365769,1391368764,1961687051,438594500,106385868,916927506,687934602,185878150,717816002,520662771,604621310,1681316842,2030707482,619290178,934230709,2089874426,1107226894,1502119248,1135107864,168458003,1286868868,66268896,739551296,2045918914,305005898,209987368,566179360,1210832911,1926329624,1336697094,2090881941,2095765543,554219205,2084189192,1773939694,413010781,439750926,698005154,1818659603,1470067948,1754072208,1961872518,1974439450,1933807234,891615407,1526300258,2117401995,868809432,1150095958,1751748467,957085342,449442279,1627639757,395195431,270423564,1052110197,746884937,2008282486,2018603210,516388231,1560089691,1789961640,1293639497,543599068,1493259044,969893945,508432054,1415709158,2130526980,1412502873,535662106,2093484898,1419700898,1101158608,341905028,1132670576,1727771193,35168304,2120179931,60764234,392677554,1429922518,1450837385,1704886400,102932912,1970164712,1281615683,2003369144,1737088704,1953994960,648489714,207412223,824655277,1601358075,284668266,1513426834,607561782,388241364,667223041,726463738,773894267,160408563,650185843,506846526,1777947928,2034797706,518667812,2001256031,2029590197,1742243116,1160832272,1059792948,54012925,1958162221,1602160781,726986731,669046490,907705044,1705869166,2063553475,990935921,642065284,1125896080,1439719505,856108689,1499273263,809412755,1561511894,1214336623,77666052,317942468,890529925,1286901374,1499977479,1938743649,135665558,1733609870,1003307604,1982840070,571966484,1050494004,286099875,695279772,1542899626,948489333,1227942590,1603745305,202159365,1772353451,827126060,584722788,637295385,524893253,1471949102,1816733159,1597087479,378103125,2074055308,1714920301,1546513258,963783917,1556769649,1708805170,1930065180,622119007,677263071,1028488134,1177780606,443221181,371610675,1575850016,738529571,1565534494,1118175377,1900038968,1006362868,1624837853,674410845,1592599398,1851022170,1160100679,1063373558,1409167717,401059483,890849987,1795822314,762000185,769188127,1674169810,1600014505,777540205,1949869477,1660439461,714140403,1000435674,2071617951,1150718784,217016830,589206517,682809618,982824751,1854241527,717290510,2036936155,1190141585,531865758,430380886,1564131980,1346537915,2004065599,1249626663,1886474004,394823431,1141693509,2083687221,1995174890,443154666,439893440,1708656289,847605244,1295528980,1987608002,130746944,1752275933,980842338,498617326,971868116,851631445,139003955,1109144849,2010361400,1198573477,587390576,335484503,1800874984,785977551,3187093,1856639493,337340306,587499764,473229441,207567849,1357729082,303658827,741769353,758878744,709471560,723067859,37508062,517603997,897725480,1090785104,162443704,87756306,699006511,1865684275,470925029,488253158,76548033,1764283467,1846299224,69335047,1933132155,1964465280,1406735723,325153748,1810775350,170528,1075399863,833054453,778176238,1205754544,758076900,45019404,1430473481,1060707579,95306339,96108921,1947042858,1416602250,1952967775,394231065,1976522167,1795040966,2008952309,1037236908,1615984256,84692473,1404632145,638324988,1489252827,1878730674,1736290850,555831220,348742528,638733561,2006480369,1040622127,1480079542,575301885,459608893,1683350916,1547221087,1169348217,796202088,946179728,1474811574,1158121679,640932479,798803415,928928845,1448783318,618157471,1412411543,2088722756,842995422,1667236359,230532959,814761633,1849708846,2016959125,254820687,676652440,1964130464,672969,535778201,1894659490,1397395217,29981567,40887728,671771880,98525256,1606726643,1654129973,1542408272,2022246911,683114245,1238053679,524035668,600899500,428208786,389527714,1556339524,1783477752,101707952,1467380321,518370316,1818534516,787320031,2016634507,753880127,1304190743,749513470,1195085485,960859433,1502929460,553752744,543849829,87445142,1204290820,1239855050,1687848598,1680828235,912698590,273555480,1060799372,181110076,2105256629,300206113,1499955851,854280367,819864979,1151531718,260178182,201686458,1624376536,613699930,1648576254,1917118395,2040890492,1595074842,1615595119,692097725,779278660,1291986200,1984850867,1934505306,999347188,93883520,1423270799,724640687,988958978,1230332883,1603908896,233247992,1495614947,775125983,1853020512,1892937520,1237708769,1872359824,1900286480,1001377754,659120772,408605143,238153214,1314729470,266139220,1651180594,1505494882,1690643186,547962761,533598380,257143381,525503989,1583217938,1437071011,1964152188,722132363,1588256522,1070679573,478901559,1258650559,1605756073,6613501,1118497691,1093350159,901112413,1936723996,1457834847,1794710652,639082456,1274578118,1808864885,1297574864,1691857526,2063200091,997861086,1102026530,844965682,1227184038,192720343,1526191747,747340903,661481349,871053340,1086396666,1571912785,1615480636,1821505642,2066167772,137031466,588947751,257832823,1269187256,1769670811,262833946,1667154243,1642666302,1400274115,1054418551,691370800,41750230,1464742628,1231355582,1734480805,812190154,633150639,1679031313,2011990872,1774440538,566155194,1215830570,927728630,1168885790,1378495947,1045862380,176450633,1290172779,568573945,1556651147,1342646069,1673015208,327745309,626230770,954852105,1232199369,1648119754,902093395,1518484105,1041232912,1316782785,1673274017,1826502651,645053320,1467079130,1144566450,939909835,971944074,1520161700,321482562,1360186757,763026816,1874845929,848846908,7998140,176541976,1742702461,1182538986,1653912662,1916051721,1881310757,2122863026,873359794,710718775,1703950369,1957186004,303700309,1461260254,1450607951,1579349744,729087533,1611872914,609160799,1296833803,1483286318,1678714246,1262766380,786003898,131503376,61289336,516193501,1684080418,1442405397,1976143784,1086115120,731653148,524332674,454082349,1900136908,197952049,1372168283,588304849,551603794,1085109949,2030653968,335645132,1493910080,1637606505,1407977978,2130191891,156637727,1119665878,571934555,1250424840,1740186791,1525003423,1079707176,1819005773,1986306462,1887134349,1337610052,117915767,862711806,1601590725,1800831015,1874444590,756552497,1375487362,1798905461,549854370,70087323,854216065,1764352743,279653543,1721813839,925143062,1628414858,1915309788,533153567,367686589,1730473677,1218786543,854423697,1601989056,1774069616,1251593223,1328880635,1585405132,1636036099,283589267,2019323373,1479483724,1628286670,573430127,261391456,608916428,1523387734,1347752508,602408300,1857127437,742337001,1425883402,780473088,1185803876,999880642,1712433548,1850789520,1332012683,1942222227,75752097,766532498,1775567155,1088328486,219987819,2079708608,1171144527,1324346887,1563462190,1194166729,411045041,993320668,1355591631,1652657449,964689735,586086792,1337251765,223762259,408599685,883174860,1178982424,2033518179,856417748,1202217588,105257354,1937081058,2117960571,321109727,1457854701,2081968586,1271233779,2079159755,1076513158,51950847,1276966384,486002970,516387324,1394049006,534875746,1659828932,1758704472,1969554112,1641534624,971677327,1958275482,510716774,644973639,1361888660,112705536,127467552,717834147,298886231,1806129695,1391924216,396042329,817679255,419226156,910667243,1326715779,504474191,907668601,261431314,317330768,941772534,625878333,1637389459,2039484,1026956372,1578071138,1037874722,1558841386,302761548,152377928,1764894553,1180349047,703458745,1807658550,2111199370,31754624,273648001,1781701705,1174738603,1047893965,2082554811,77126609,22082630,549035384,739612960,1130971537,646700638,1144344981,1856969156,1910431639,1459595186,572326502,1821044149,766345967,600145599,1344086110,1684688770,244694269,261125244,850501270,1403784382,1133418795,1854162614,162241027,1794738001,578505653,1560183548,1090956057,1501400845,113273276,525655516,1483809074,730700409,477532718,1875770912,1267179052,1018814300,1332942344,1022359326,470862042,1743362194,1577419665,1637459123,1824396647,2093807044,1485169161,258932098,671167010,1658527714,1788709769,402456016,917100932,360910350,1996045334,940801359,1003728235,1180717123,1992672204,1729149408,299431574,1470628941,703286263,974943885,1897678925,1690295066,1406523676,803866550,704229681,363855776,1823617766,46425853,378903768,517873579,87694738,1174736305,1918709023,1293995649,1599596624,307212732,1051447291,1625213865,1965495356,1487255301,1341686588,1265808223,1573762483,1640265041,1134177137,830360786,162261345,1400301815,530078601,854435383,1834591892,476483255,385720787,159712378,1959389129,1989978935,261844944,750632630,1612825117,115354720,1585832308,1674135201,987428619,1526639405,1058540534,1409033439,1554188503,1500630774,1961839016,144826559,686288687,1292567704,1722271561,539354487,1857240271,827613464,86914687,976165767,961128267,148184357,266963306,1159657193,456506967,561189533,804604018,280989096,1097147978,416666585,1464172437,148499089,547728371,679008853,159313040,1297238175,533479221,1348348609,2096517045,1508896882,2069530869,627061237,1487931331,1616223556,675855281,1259530542,778564829,1654741336,372198763,1659461673,397459914,1627689298,1758880536,1326692859,268288794,373160403,1372675712,239753292,561844648,432594020,1111920454,21292957,1052537197,372944522,1927704488,1445714894,906633346,2120189795,1702412396,233083837,137576672,270642001,657627405,1564400344,381341864,1821312429,621303321,1646143431,977772712,1698236443,1226296645,1919457936,816098079,1677141705,1438022781,892373969,87338423,1286294800,1385685587,1748484430,1020881793,308665711,1073518145,663317078,572419038,1322784144,925419858,910068401,1932136801,1069896964,225985647,1752669544,1368350703,248853404,1761104171,320702623,444538266,1868323333,2031592157,1626377563,1745684850,207331955,2098802659,1977168973,1989687487,786240007,498751240,1360516813,1349722297,65387641,1856130427,1565356603,869375672,1540308217,1948742992,558929816,955598218,1135648517,1335337213,49662995,1092396757,337673380,244016536,382185474,399907030,299568233,232607413,1907576546,1043407966,1776284272,755963388,1523047555,426384160,991144019,1151308841,2130278693,541389812,300133808,694370316,779401886,1689207409,1669758252,611525258,702134774,335299336,1333190836,1891684588,452949885,1351815944,1880530698,571608715,127187611,2056604551,1307935180,2085974282,583726934,958433361,547476002,41094064,1291232359,1888579410,2025799420,1571243451,1622468483,1440128049,1627999395,1547666350,1497170262,2051293215,455817242,2115979010,1120362913,1398077211,1000063203,1657630220,295298177,211543224,1590169427,1662919889,1601225342,1335757988,481757305,1745242735,1215187311,1659121204,934292717,845138787,1995818229,532165751,1395163762,286039898,1357186014,2032735320,1695617641,49240686,1413072728,30590184,1553943233,1497498846,1307505105,663007830,663119489,2081836930,203198025,187564577,430920651,2038650097,1672101083,1746611489,463988704,845812921,2090766598,846157785,1830314002,1560823157,184550620,54671937,1706698006,74299139,1798846049,1069887653,1995805728,1585746081,1734359369,818529572,928384478,2125484890,445385753,1073198940,243674003,109098103,1871271753,593328485,900225126,2044498920,790051943,421723537,692172136,80736936,1503395797,997987,1982173159,1997126002,180351873,1900596583,1573985466,1542072925,1040018919,872947179,1345231063,2033340204,65052660,557746652,126667055,2091843761,371169566,275030167,747310058,1165699872,934555909,1608043112,1687469891,1048855559,1265106825,1436702890,1689229228,651759651,269272785,1020568084,1913525555,1106713067,2049850259,1594338515,1303327472,1999274587,1845290517,1711107667,1660258399,83848561,1397169029,1520498023,16571015,1088328452,477135448,1437529567,1286861192,1223471995,82937209,1922199309,449309433,2099819368,175664400,902467415,507198649,212175747,989152230,387752669,299802884,1688176085,2116929050,572367654,387061608,302379121,105767103,264919246,1080116668,981684262,675579370,627949009,593633218,1376162773,1169291052,1207010706,27647349,224364641,329593488,387727502,1838803749,2087573111,2087836336,904999863,1985744833,288781360,941336632,2050067358,1680845962,1864713048,1774679834,176369365,1092132368,2101286385,1398257579,839323197,469239378,1878445825,1684858846,389755306,953402294,1261071629,364266007,2011010604,1573114646,399310220,454604512,1975716726,502779678,2117126156,867602349,1059231042,869769792,749610199,1897577828,2050457271,994705843,1482720918,1201969449,1225920433,26488940,1242130876,1954570160,496519258,976803621,316672078,135551644,92903338,1078739085,1356087799,1986924450,544308733,978978248,363659010,1779010556,726186986,378111430,703407701,1305051358,159701639,100078179,76708566,1817062696,393978810,506339723,1529487160,1052335856,1955525772,643973237,1988070888,1109977864,1913397589,1557637455,341617449,1165082456,1773547594,198378452,2101850283,917342852,310348854,1936815536,882178306,301682962,370755140,70914815,864653754,696432338,37632685,1504429577,1880299529,1497935548,693574486,1105920527,678261413,894388172,148812037,1123507007,1628814717,1669148862,2029922624,228659061,2059570658,1021006735,48867488,1200405151,685315995,1582407467,1193357022,301106163,1523249609,702207332,1452844426,1206621312,1943887424,331394105,743050562,1167829954,66057598,402343302,1671094160,1085736924,979538245,1681963119,2118875196,843343191,1771822449,1320872778,1762291193,583405700,61225608,1882971649,1306742920,1233582940,1433503013,731591978,1175294424,1802867059,1948070827,1720033424,1922835226,2096793411,1371176608,1806597429,1253988829,199863715,497966804,1234023097,385922449,416458160,1812373525,1149351952,114924311,1613038425,1957028047,168809780,1445169201,170208123,947962756,1915515707,142955687,2074931015,626651740,1401543855,2000442487,1270741130,998332279,531847957,1875009414,539436814,2074376533,1977092736,1648723837,1776448812,1307185952,1847308155,1620549049,206473763,992616035,1431195052,645019771,1867843735,638074167,638806430,1673454255,1733632391,1861670246,1789212303,1105905054,520340191,945249587,1405518259,2063741396,789282931,1242416496,922221859,1034860430,631944890,639945922,274227695,1156295419,841750578,1115506872,545381274,506285300,1003458335,452940181,621717093,357979431,1056683105,1400017288,469058583,1688201892,1955938616,2004174931,2003617320,1283932724,714169294,1905293253,36782740,6920469,1273424737,584996560,1049560276,1352669452,1817655846,483807116,347096489,91014525,1684381941,365858779,482201997,658159501,912198546,114593963,1934490291,1877749862,2048720891,1739874289,1167178605,815879439,1009601378,594677743,1121936769,1540606652,1621057367,310225670,1216243218,809178109,809501147,397351052,1294998001,2009338752,1122099637,2123067960,1089191367,185187399,1570566064,480508679,976611822,523587953,2056618477,1405930178,1389473408,1870633105,1485606978,875083450,309620508,1027350217,925124944,436557025,1536688607,1610285137,30994127,33004282,329226485,320226837,2046861842,323759932,2090171110,1623447763,2021035310,880524879,592573110,1713707600,552137280,463737016,568112013,1537915876,2039573487,1720676152,1490391712,156792389,1476087061,907584711,680538653,363142465,754526209,638754946,1406981984,579189061,171113419,1259676891,1819454629,1219762093,680985559,734461151,1409183109,743269405,1286804675,614516463,50409642,107053771,1233565960,728516021,1863755845,1458920211,1210807988,85356892,534053150,2029932665,1926776504,2083493262,619305260,1782414160,1291587017,2110415105,381380295,785094665,670276393,667439454,1404740254,126616051,1834351969,596109814,131098308,1574711893,41708250,36359305,1375027240,1080763874,251089277,1387914203,1585120979,211339084,1148393820,664517646,1991863557,136745148,134285378,1460449623,144678386,744661761,1076882921,1863949616,139390841,1988864007,162100933,468955224,1754988979,913166557,1431428644,1229788319,822211034,475129235,1963716612,1869357091,217958999,1615682079,462448949,949826322,240683527,1914605596,253497583,1445787161,2120755938,2115142975,1675183259,1751636827,919616746,1759363907,564339224,1879296195,1761603204,1657071349,1185997575,492942534,1780701429,482414750,1706281017,834021061,511266387,1360694342,802645957,1324144490,2098627185,582322672,1253320185,174883252,918080360,2114401192,1104904474,997757763,2047351278,793041435,1236532607,2040850184,1329504058,509458677,334782822,544847571,2080292684,1207769532,477810009,64738997,247059900,1835336014,1977900266,129409151,566180190,801802058,326014612,352642053,2058337869,1671775663,1024394980,619582897,1865909492,1807236345,223968048,1523676488,1662906050,198674499,460446628,458241261,46421453,749305489,1382117565,1673920639,1479113191,1101430219,1944067190,1218308448,423094960,2075095611,1289578650,70422635,439649877,762529886,326934329,2011348035,1397863488,1179198331,823987916,1204053182,1979674228,1062491039,950931226,352837141,598135274,211483527,255719446,887847915,576756032,884323836,2070661711,540888263,1094702467,197336496,1066727105,1191326975,1077022527,351129792,1443305583,1760774124,2117411079,947410704,296696340,1865398198,708074048,746993862,1131148162,1326522528,1021358758,274511863,174069129,1644435109,1006781917,730734878,1332814931,692417514,417039520,1559350247,1368755025,1408449455,381403932,69494979,134704334,1964101092,556372998,646560168,555555462,2107878525,1214068344,1447670100,698572125,1243124146,518808440,280796377,1720528346,1641404032,852916782,500904452,1632673206,221478494,1311884013,562296990,747231708,1609108736,355464273,2029409880,1484139535,1422468779,780478058,1698017356,1048179208,657794460,1483365207,1049729234,1550921408,816694757,326042349,291048870,868092982,1661829965,502716415,1921133307,1165020420,60612050,991095868,1078464479,1388553323,1890887001,1584384777,282670285,168227402,331854829,180057402,378657477,1355178721,1594531895,99877924,975037614,1319539221,349027249,1536118014,1511376849,1748635929,192932846,1921369925,300262036,1760954020,972498561,986561748,245890743,1053190634,2104026943,1922866121,1876933920,1559907861,328243277,1890621997,1180593326,1254749754,520350253,777112657,956435799,595928232,2056896073,1883588058,371497957,333548772,599695578,1831299243,1336343980,1101162316,1987618264,1115932862,1064899011,155107206,1652657371,395659832,789044257,775175022,431446374,898479866,1236109863,1964723457,1658288742,1887950184,674633276,1685878300,441709910,1629816962,687285089,1268718490,689090232,16108125,2009978915,805366217,1446307066,1509316720,460538980,1918513387,433610241,57374131,617584739,1878103803,22883308,1275259290,949990516,1998118761,1073398456,1341625664,744655071,1092740608,105315154,1030334925,389351573,1273700093,1622475131,167974604,927478359,1718760913,247999276,1729379189,1213880635,1134277893,68509216,1989516700,1167902653,100909231,179987883,211663819,44262738,621201725,1590017058,1463199025,1369658334,1335481000,1274765499,952206745,583381259,1613788168,1185012485,1243847265,247272817,1681550587,860321203,1545791383,1613269545,704168645,1017736164,1673632468,896144660,805113343,1933185387,994746501,1270667930,808241012,1576927711,446024977,1461249680,930335784,55546602,46819086,1707117441,1119177055,145545191,578624462,73691900,1163012234,380767440,2113089645,817802072,1354800918,2087116864,1014042667,1914480916,486955615,1200073713,71949902,1252379223,151120314,809798592,729261774,1184708844,65953060,1354146684,1228816067,1724447379,2063939661,1504763920,696645332,1430736134,1410040355,281808863,144596965,971338053,2105831448,2014135500,986915326,1813444613,734423038,1470327498,819276678,668936087,1317129747,182560516,1018465923,1914437781,1237673023,1223169633,1245290434,2071929905,2098300290,383530447,1839772828,751552153,1288796028,1240886382,964004600,964037615,1705757600,49938640,474329013,436680904,1871345342,1941158276,253645705,936071623,1854685072,319614719,1789486898,2019163663,1804896996,1188423633,1323141704,967450265,258822023,1211937071,1362624407,430688310,2080251454,1162628488,239126768,899957476,459483429,1913888114,1353851198,1628738077,1851159943,194870673,1794841288,909031277,843371655,2029761535,1793732502,2093388034,3863182,1323929034,1258659062,151000087,595413082,374280396,2051235006,403781881,701805767,164833267,249445074,2036359255,2124707121,1943027011,1355932510,1366924555,1681777703,737948864,1259769944,2089344366,1554396337,1657587347,907098698,1349214914,1626803758,2035331787,448577078,877603934,1936119072,1409246894,2065892026,546600175,1769002764,2009939837,699129509,1325430123,1143646569,2043852895,1398109863,1831753825,1123196507,68162562,1282589518,1908994212,1853549383,163485644,431245415,55053912,636802858,1093034540,1196897416,1855482882,429621830,1777774314,577217469,818510775,906514784,250457319,1760115917,2119905836,62846751,966167075,1110320458,467662909,97386530,1967110694,2035006266,1470874464,159945702,1584530,1214534540,2096416922,418985243,142044156,427031189,16999447,729100607,406760124,1822995268,555153152,2079881634,495295390,1444314453,254776752,559649275,1698475852,725596167,115795940,633114137,1312917381,24044655,1078109704,222784329,888293061,2123966063,1758347095,1486932506,2054695499,1018218343,1255667841,1723734657,2004326144,878303993,1580449860,2076194636,1024835079,1933051529,571112844,1446490583,2117388815,707348987,117863685,1779934882,927737200,1043839961,212814084,533418455,1506658406,1288618390,2071850584,1820198553,598749774,1803760046,1627510961,807329647,2100212498,1581049769,383208591,81490505,1435778078,1334967487,462012534,1375918927,1077439904,1329736455,1596117385,971703185,349778282,452198262,1860293315,234896760,168600941,1581023643,1706245070,119557620,1370075317,1190246119,879481256,74536718,565201058,979642502,453361539,266092414,1313030439,1069051839,837518606,116832437,746483353,1026211112,1587703238,346405776,2038851735,784245884,683187509,1627646083,956058140,1990292705,950944275,1968616496,1744759121,1791562171,339525269,153447570,1364135877,1532052661,174655074,1511998134,1519568463,424603910,1596757848,1705750877,1382601982,1552889128,63295427,1683495764,972538632,1233999384,1382712747,347770187,660289909,2050017230,1645496503,1525188797,1774886156,803999854,267676630,1516540707,1852887503,431324745,1993684740,1248588228,1822791352,1011594492,381483634,943113383,284194354,1352568140,1602788232,1630693469,1363496275,1463729785,1088014894,732400986,615963017,1581327852,1736468379,2027695112,647062475,1078665374,180359397,1070634961,1048619658,572241601,1342930658,1174824781,394230269,1654838860,246705089,66901541,440840681,1159899876,1281942949,577562604,1557001375,2001442597,247187774,1357307167,990669273,2037457318,1343774288,118078312,569783632,1907946125,493770198,1213845424,1023528170,1770482900,341294674,659100035,1131823019,1076095915,1235898801,648724879,714703861,542209589,1742952105,1076738280,233662926,2055107873,1964675266,726199993,163219613,844707162,1092948354,351744738,2045815816,930906115,1386318086,621091339,583495486,490982271,1914188240,1376028393,1697975476,911709160,1555873253,561074684,1632536870,1995191639,450899499,1811000875,1986481040,512732801,77061405,793997009,1657805499,1762540314,581302775,2106617507,1362912892,1070490200,523894188,688711236,615297051,1661093431,700107634,873493099,903392045,1959446525,812048056,1194384870,471394815,251408012,107498698,320803298,1495134238,982472288,947588659,512464671,2074664960,1719012082,252189060,1776697609,108889408,696905159,858503885,1034639839,1002964351,1715420859,193824755,601096468,604835866,1070104407,475567743,1783734580,1698167072,1604879792,858227210,1066263476,1037772504,493070838,445440368,906403317,1016876777,850004817,318279831,98936256,2076656412,1739141930,1829535229,1296387235,1242379173,1865623653,751122123,1150307178,1667340830,1129807404,1023867335,1061805563,1632020076,2119295776,866121018,1227565282,1161126003,1627643495,454059663,255095447,1969469492,630428879,387089609,1836702214,1247659342,370249915,405673629,263743834,2089110491,1232556599,94651358,902900951,802019822,1032159863,1495236670,1729179873,526236007,2088819954,1209021938,773299625,782533268,1514265569,1674151320,1730460181,146223506,1972171449,2059283395,1407687830,3207528,978374870,1516146429,1657186532,319255524,735555111,1565848188,1155208027,1934633059,663494348,699202306,1847435516,1543129360,1007481485,299230142,1182617866,1829037940,1598482501,71131580,1426140239,28264873,2312694,461809478,123064538,332274686,1072075949,857191795,1106845704,50618192,1992359801,1369265908,771886316,3059764,1594524007,960686232,493517515,1269562800,1140967341,1363685982,1283501401,1365398634,1038037860,1175038006,1762988545,101088701,793342075,2127587850,2111434815,541786073,1004273427,1682687140,37630100,1107184070,1099031253,2063124158,637918393,1521455997,1970887372,131499936,2062381618,223631346,580307938,1681951026,685010590,2070564558,671770595,1479314448,215943696,472300700,72930821,1616980090,1735035378,650782367,505826266,402664171,485463785,1216510403,1361850980,58952159,425605362,1787000176,289995976,1410322976,809571437,1400431125,1180956804,1064770209,1764575655,1000088768,833055118,930225395,392287217,1727681109,316109103,955859273,1412567159,160156257,1713307156,1052187225,324672774,1439333857,1286868872,1713076904,1821914935,1577085095,1073874402,238976002,1188701016,1408490260,1046845893,1263073406,203618199,2118641449,1415001511,39127569,478855509,265275296,799351129,195086998,1251087106,1480894251,665205235,1527419431,501791168,691052144,1411232626,333603873,145447042,1875655602,2074948103,686315634,2009399003,1275193086,164443159,325901449,68341556,2073276912,1304920600,653640012,666767763,145523568,1018333908,1225284109,1402730785,389838273,1879337362,388324317,1613366326,2030742630,227849397,835159324,1815206369,1918155685,1868493028,223519068,23719035,163886093,1142886833,182160575,1218045918,1815044796,1061793853,1329564247,373689389,754660541,1005629432,48412021,1908163382,377696082,953329746,211931436,1598562334,2088989270,1734792520,870190845,1546314343,1373686663,1397772532,904835967,1829305157,753530039,713655386,1573272830,1096260768,629149203,259811617,543044299,1936828883,409448014,1398329134,1103688649,1546456380,304799882,1926609890,1758721509,2040350762,1313875556,714793346,2038709152,1656151113,561470916,1459952421,2033949855,2126888628,1417042669,1013602974,647278916,1450572197,505663926,511714731,1980163363,669203511,1049712923,374441506,964563668,506593135,225962216,1788479432,1366239056,1424163282,706763746,1442531551,494799569,1761238374,2042321255,499726825,614425874,1864448334,2068143146,1030821106,1027051520,985008045,1358512513,491155863,952909440,1413264305,1833978328,1576845836,1700045035,440847588,729962546,1233326440,891330069,1733741652,1592810550,623918271,831643512,1929924172,967170801,1507099406,1331556830,810864233,913353926,623535035,1089823383,1479843059,1224980973,1452419530,44358953,1898362948,565420653,31591098,1633857009,314661751,24964713,1478173172,360907146,639926392,325224663,1596043292,851073583,1519550375,315821833,1507807188,1899862450,1590974561,380350477,344867691,1933562473,754006050,1858935045,540297378,769272277,1970281198,610993565,1390266862,817376406,16944559,614256621,738411380,1766070782,117869260,1081229738,1913678740,1309173812,1876730288,1952851036,1425469053,532769483,1894141641,665834714,248755040,1912687427,614332018,20957792,1491046698,956855939,268274453,1178559734,1065747787,1546252946,38541674,851433388,1602658817,408109920,1776858481,1620638219,392769690,981817454,294629024,768893251,253227748,689504023,1662881219,1799554700,671766868,1583346400,1783665581,2009216579,719003734,306315912,1278191856,1595311750,736162036,2088738189,773262506,1083705348,1282170268,1134777336,1081865988,750523377,1340374525,745946067,651996717,1627675551,80221723,421915996,445010881,1459102337,292141950,1947172192,669057436,1982273291,368900102,1674104757,1342774362,1524074921,529012942,465618690,1374663954,1061734694,166196477,235315708,1783442973,2068798967,1699982375,1023278002,1108505553,1963497452,2037305638,1360259595,1220693082,417379977,1949611611,40373769,1792760494,119770229,1224218639,2013726559,411067342,991820951,433768971,2001440284,891160780,1388102962,691952263,1793805208,1546908995,642735073,1041685377,1299203770,551157827,1088305787,1582909191,1488567431,1268837721,692894475,1671790682,1045501051,1563331001,1913918182,198642053,466623389,1714844280,1703345723,1715958561,46866613,2054428485,1250856006,1681679216,44042124,1932127280,1558380589,1338943244,2032267176,909643681,532421678,254262246,1005734255,518727943,1262667060,836462782,1052022142,319529664,7236973,179081884,1351730376,495707686,2011939036,903407990,1633444754,1894662623,1241987174,201236661,1098700117,85095487,1912577851,1042106653,637970057,577319963,1844702305,1315638668,665741882,1960095574,493654979,804647607,247953665,63623498,1232929869,473463379,1103405622,351710865,1496960076,16103586,1978823288,9812815,1476440478,1911775212,972613145,592506310,1974913407,1844656914,1421489200,685901142,1316598052,523698286,1211362674,1078328629,1832539282,1244751273,1716946839,1696249880,393602614,1173586358,2044918461,475520448,1760789288,3428303,1128357035,857052086,1884054187,841897403,1698941703,1363385564,1753635908,905698219,109040614,2092768958,1743791643,1362866090,100252820,234229007,1159691344,1027175643,523480057,1572250727,1179236043,619002270,834931201,1362583572,1084365178,739094897,1945578734,2068381494,516643181,288878735,1871391352,1700303916,1066459137,1569631798,1258339213,1442813200,480151105,359559531,1449478883,1845699871,245915068,362912808,98715357,708049136,1467850430,243847564,198233288,1632851650,604537179,2092505001,1438213880,441341130,103878680,775725763,731912166,745920786,1185070685,1447224200,457712528,765193217,197592357,578617969,433549089,258230610,2054641660,1607826530,1880264507,1617470873,1221575288,505284664,1272859206,87183910,1152445469,402621395,1955705565,1152338088,246235053,438254694,1195489112,369521054,675915291,1704606545,197166148,834311239,1712978574,1464190311,1076825138,1203805501,2068035412,1422427595,2105897091,1001467442,583526700,45587118,1497883721,316160895,1463094339,1987342586,1399792232,130046628,1740749226,1023729742,1748105573,787159520,658636240,1250788025,1842653460,1250342371,1378559668,532309540,1933222533,1779302384,1713822604,1567036229,993880251,317152467,993123349,1520145553,892061698,108851769,1594384484,1266983354,274237469,1321575790,1051914409,2091857980,884204740,147696573,1546762952,1315020374,1119389308,1336446145,1305855716,1993500320,881358057,33462628,923965111,732508674,52936873,1018793432,156858339,864281235,1009783416,2019510704,363672256,1247159864,972812852,69390268,579140685,1442316807,471836683,1273942353,1437023252,662701193,729552762,1695761083,904491599,37315673,1987206354,1231078899,189027702,863856635,107688612,1471552276,1079492075,2129475609,90516216,96350679,439605357,909199367,1591452411,254895092,671462458,166222229,1794645541,773475923,1590238268,1702732454,1587435078,2078320813,1096624242,65316311,1641651925,390898922,2019878935,412983759,1722385339,1393591036,1188242605,1551414526,1126685451,1883245302,713346407,281903214,679123502,603805289,637748515,1098548647,1263565980,644492100,1456691334,841190451,1959097845,898249331,557826860,2096844132,1661210820,1857374120,1260642952,354199018,230484024,2059637733,371823144,860826770,1297264178,534870975,839662794,2028650239,386029363,1276913340,357550986,1526331791,1685724413,765035637,1524431107,881516134,234050446,508832900,521063754,1013325664,26741521,598118445,720614,2097264256,1215938779,1543063668,591902112,226834987,166481490,531387308,411183744,1476240052,1249068735,88683663,449746823,2004873112,1656245422,263515880,212430037,1627420919,481726303,1386172453,965550225,1720509806,1529314273,1638928336,1408864629,2000817997,2091029136,605437589,1364889111,1672515650,51533076,628028659,2068837340,1785995120,675466507,696662571,716043485,654666015,1954957620,208229708,200953442,1996553068,1630020420,994151051,1304295876,459308569,1469393896,985533462,1669376462,1883781217,1733559965,1306855367,1651867421,955282482,2051796633,1061615091,455792703,2075383058,1059568965,1745165268,586759854,217250099,1242765215,1024523437,767183698,939083594,1854600125,1279058294,405480594,2068873640,1009438912,2031239859,1417559693,779600049,639356117,1823327176,1578948665,2094506922,820322215,983569687,420851822,1645386610,1327543214,1759262446,934078791,1064714042,533417357,1526196021,596838437,992487916,1920789552,215760513,441876692,1991347591,1705452182,1525178785,1005370760,1210138532,1394550680,499512444,267137919,158503405,2037255429,1326963583,843178922,1317965589,1949740878,1985296249,765781748,293425006,715047297,727261542,305630925,877898122,24874594,81417782,2076866417,637914685,1460421049,1596593227,317535717,445404245,420421693,882114131,1072251773,1208236532,376770331,674401503,18252013,388768986,502816413,706985243,783639372,1415002604,675325937,1705060875,82255734,16536037,1189623397,934414961,231458627,775976439,151415883,1269891044,1231387255,971020080,658594240,1285425983,1202927853,361118792,875797104,405859010,427066484,815489678,622859831,1728905219,2013836655,324154186,1757238991,1798507390,1789991047,1325432004,1689482049,1777455171,224931329,501787872,537863943,1735812018,1575283999,1202011778,3424108,431981577,1863353370,1991541786,167181811,527160714,643252582,992539920,1226248342,173263850,77034819,1931473034,1501893721,2113092882,1994296866,1349199770,126367504,646923836,1755130568,1858997282,13980705,619087033,315341575,2001186796,2075973965,1496367952,59617220,45744784,1327538698,1791201281,1282513629,1495699221,192379227,1049742838,1969103002,1654079618,2126708884,1629546193,553593238,1638406816,1435228268,1632450267,1964097760,1251221148,1615902320,485432012,2055303584,1280338609,1488547258,2076073239,1393929672,263232899,1463344171,1709384783,1151852414,714256052,2055675332,61977464,1191466,1451630496,356131464,1694989874,126419869,349266741,185347685,170123110,651513635,744173112,247811962,730854561,314007718,1141547176,1938411380,1453266648,1559471435,59349958,1362050131,2096300394,365954160,54060843,1592078697,1136368186,724250353,457059427,894751409,181630307,2116967922,1216607653,1506139767,1819857355,175219309,606955295,1505125227,197520725,24860844,238234840,1184102813,1997583720,273914883,506252624,50867126,734330697,804625889,1630699858,1224127246,794481571,1080323124,1355078611,328987414,832968888,687254076,1485137006,1344577968,349996605,2108393272,700579410,652388750,1681351082,1415699424,441371320,1762959125,411840157,833023412,1910922941,287887213,262119576,240254174,1666219282,167304470,1803542159,1033055997,382586100,1197047496,1829381078,1787221521,723360235,131745450,1492788007,1310613898,346728201,765672452,1908075893,583883912,1357426659,154201760,1191518760,796782164,209364675,1887404929,504114171,974444123,145143960,294288645,28782633,143985496,760681545,950376530,1819829406,691740241,1599043801,499301712,1780677696,474695902,618873568,1554338203,1172812932,505286795,2103097226,1246894810,770101175,291541243,1180977776,1991481779,1404064676,1376362192,418563552,1374503321,789009640,1988879277,678135216,525143325,1230536666,1617589204,1448610871,477200179,643224808,1703303971,249398117,796749542,1485360002,232372786,2094482513,242382239,1829735089,809063671,2024062868,1601298394,1373882122,1462313291,78607290,620143948,265710879,1197259687,1937922033,784627126,1222525371,180461531,839506426,2004601138,67772138,924999839,1778279422,371064025,300043874,1301752499,359885534,356003873,1411953133,1205178333,163042177,286929998,1337169011,1863627239,2050588790,1524264053,673152833,1906996638,1618453307,1198076243,841022081,822782241,273170888,413551216,1250475370,1506850321,276498412,1143929179,1822689393,321388926,1571019222,1984086958,1668512321,562347233,900614526,1718542818,1871468631,228597859,1565594550,39456427,507509372,946272283,738086871,1620379944,1160657308,1610976931,1285884158,1552662708,1214494772,944979849,964549515,825744708,694015801,180768375,1214649358,1509964487,1602554403,1551589053,1096809481,1870219343,1368312234,591068647,957217760,853068699,1407220725,445998501,1394365308,1019928084,377550117,1379824767,1170434803,707118173,1838744469,1960351980,176895656,1238344289,917147282,705785811,12628973,349650770,1268898581,729260846,1675827004,866052805,930333833,10569377,1481451216,1447712036,1896357903,1384503049,752474472,300759024,1581397422,1707435233,542444784,110887158,780958347,375565311,1502496894,945566667,597999619,199749301,932463524,1342104805,1464510996,1751753285,520845978,37034884,503725652,2023705906,811140745,1159855508,298789817,321474072,901561832,651580785,1872957937,174659038,842887170,1668462646,748069116,1674061036,269500902,1695041068,1942707085,468697461,283064151,435257839,1210678738,1041088030,524196151,707594297,2005956224,26231045,61808029,473668275,1740373181,943152308,1971496616,1907078372,580658148,678837336,2047934543,1932601434,2001776796,805097121,1477839131,1910856091,1095993386,49701159,290371903,406917767,250212533,1963358948,1780210560,1841462405,1864569417,1448591934,533122579,814888626,1994867873,325113526,1237216648,798032189,360831014,919274402,1953175185,1433977122,1287842269,1873180872,776041411,660819386,485844625,885067813,2061768968,2045716311,1466937735,783998023,1272470768,1088913373,1178225196,1319310043,1050929361,626778934,2101184812,441218997,1774436897,46958017,56341420,1990133293,1601949737,1847966520,1471247474,1214697728,308344807,725135300,120224021,387515732,2093927644,1066280863,311247812,2014617860,1635401201,1652772553,234107995,1106843568,1798710253,2077793432,316568997,7016354,1869162014,1244109341,173473212,781236067,1243230285,689563434,1071403335,1472097031,622867244,817090532,242003771,1248243939,981387621,1584915922,1235262662,1421836743,962430634,1223697609,829251477,394203814,1044931899,898361808,719675061,610015784,300002319,816067552,1007684209,1672341521,1534210876,1060723148,792245708,509867428,1988186352,1022182578,1601711142,1533595467,1725326139,214477315,876727247,526834664,303577096,1211723931,693372381,690513409,1338360357,1145159827,1363256681,1480078948,2097327401,1765091913,1057597888,596764733,1320995440,919229643,1159920051,1703855587,970814745,508586144,896948737,316636536,1873253944,702044861,110957371,873760517,1265117618,1354846704,1049897464,614461364,775537455,565823212,462236079,426160685,665855085,1761575305,658381126,2093870304,920460572,1205176495,1924450425,610876610,130209798,1946138201,1386979123,207157519,289727649,2028352594,105033151,385426646,787781789,16463673,25974036,936963784,257821319,199993021,1887579212,1114441979,497824623,1143852721,807418854,738493074,216424786,11288818,325333289,2102990611,1184438481,328318563,43675592,1297257199,939486125,722107591,473067633,1202467138,1380621124,783444165,1561480819,509512391,161689938,1152415201,1285050225,1936056180,2043287457,947754920,1767618691,295365024,2100570100,757012902,1331976090,1522416987,1480533448,1576724864,699539716,896370902,569662492,440925871,1822825519,1538106252,1004784378,1933103382,302770655,1286975567,340529333,352231160,1040450848,452720580,1160140652,1316793115,339951480,507225810,762136147,491307537,1666100237,408714481,991952826,317090432,1746269609,650570336,2039623288,488665868,560200945,230012966,1442039522,1708547964,2107762755,1873837575,2093801573,1312247302,481418427,2107619206,749319117,48685771,516895019,50619659,454898532,1519986269,1858476888,1377769500,622234159,1043539598,185021106,844794853,1898936151,835789414,1984350906,157746121,560218630,605083861,97426123,1702846434,1035765902,51076159,1657611796,538662993,770702489,2046044531,186988482,1498289055,653824273,271456554,89770212,1963668221,862940685,1476396822,1689524339,638303551,1369506806,1855581431,674600462,899744677,751108886,1375791313,1295474688,399933071,1626717508,2009777570,551772916,1826358014,1016314338,1593153306,963152683,130343949,1070872307,2069154276,2042096348,119013265,1017528079,285819808,2091252896,406879128,508438584,1712766505,1823328780,2031473226,1412642958,471905018,1846105423,583256426,803364129,299752125,1374423755,111783202,318331908,152962015,48860905,1901292446,686280184,1500520311,2049508582,2048732711,728526428,663479786,985493849,94238165,431272054,1618655102,165539595,158352196,370387387,1822310637,396045871,22196258,1497282336,56147443,390442061,284548914,1404144444,88065291,1401427510,1921137840,526003806,1202118963,1705329460,2004475132,249364915,166939408,1906617078,1958997142,233060,156511554,1989574538,1750480952,953405284,1986239842,61172135,565637546,1346791914,622268903,98021590,1300165134,1050513876,1172891696,2128576410,587111233,1297299645,1523685248,689747951,1177844257,242770550,116735271,1807566646,2062789194,872363802,166178584,1117079288,154660672,781208672,1825153794,669050828,1310476400,794792141,43024625,1600928884,2060785059,2091829511,1780162331,1638118335,261466994,1327179486,182576526,1530468173,2044498604,169560088,1423109417,1595194273,1909259196,386392672,1435513293,2113871710,955266891,1064504840,2024562503,1520921838,243467572,1853109591,1505945331,898986916,633675486,920011976,780146339,1288255047,683300785,1745900013,1099995455,1167921593,551871704,11065065,504406599,1088743943,1001944588,711883552,1923188295,1330282209,25997621,102010307,1897004578,1766986267,1230499947,1855391567,1531147832,699005415,766538435,103535681,909584976,1779195778,1310653441,1735775597,385535066,1379905154,328465217,763553853,584730855,536105244,2035749437,1218806360,539221737,1155463113,1280645704,819036121,1733742730,796862514,1862709047,1476012361,685365254,716457605,1324647031,2102706721,436535556,1619353692,937866831,1640748108,287767605,1141625475,843940413,853404355,1836356991,227386637,343254590,1815674149,293304270,751413221,1195998167,1766695499,1309745618,119547652,1904754558,822212649,1851750262,1842969163,1306029640,1989387564,1559237358,506071543,1495325630,1428217588,187203235,1852710515,1755798821,402422457,1063364199,1482043023,752614986,1792512220,187367626,510335015,1893064914,1529045855,1367266020,1499539929,41179618,1686809172,1809524838,2001348210,1377982389,1493619404,1402430636,1425699972,2117671119,1716515892,726427063,1488583632,1348306867,477914323,1709968911,1997682995,1309519710,1551181984,412590326,1925770574,234671070,215585169,1881498440,231618147,916063463,1755406475,1246641047,1519148431,936886836,68540453,1892184020,1942902454,1353022283,936442978,1948417358,1018628725,1444499914,192389466,1136664567,1953354136,1465495855,349985957,1418051857,2003275960,850918493,1259243596,699221468,3641383,491554676,1094250887,431530688,1470311093,861833279,1509549615,1799447549,2063411217,638092772,1340497220,1279302649,1162921213,1333043248,263890879,803874028,79514733,1813690584,1495966035,882102986,1099785079,1409625747,418664820,1176920296,287007376,448069265,2014451882,391872030,846797599,1481102729,407717530,35731430,1984378942,775114772,1508506955,1498291972,1049645856,607896120,1934932356,1822193181,275422505,721303558,1269405266,1614447769,10089103,1130775501,313707331,1678033027,2012949223,903274867,1022424898,1392415074,264238688,1469858489,1539001150,969543483,70001960,65018469,283094679,1696392439,1667499352,1679529881,1494698802,1905787757,317765282,217689872,1761667984,187487515,338562403,494333297,1803727632,2075648754,1209932385,1652190867,1752727305,1161103192,1933872620,2024803852,732280880,953909819,418395802,837129866,186098997,839286840,1464849798,2070026057,1075306584,776302415,402614589,1886067076,289505229,1430664952,1651549313,1806288596,2025635652,33638337,1272081463,1914094367,1263006748,855256998,1847958249,558601652,1526604130,707008592,918700337,565006217,592492864,107895067,1746105911,914647889,769968518,843597657,1913289082,2045059110,1107564585,1258708543,141054920,1604842321,1849843710,1891861987,148230257,1171002781,1562906098,2107155134,672466207,1154510459,1035072574,1906669213,744260033,1647770600,1116710907,472328616,2118581125,991316504,1397455133,1691882658,1090579738,656727310,540611354,1184971414,915889908,1955325096,902428658,1129783034,1920949251,1184680417,1630841186,1441888706,2095563740,803849022,841897387,1533946184,943341877,1033312845,175616167,1814819917,1685262591,832740930,213333615,1203826964,1213242346,399797148,416726663,840117008,1832035548,831475071,612945961,818076241,1416548080,129787962,1788618343,1288991967,494328395,1150674368,539443277,279671297,1029331568,1161897366,162131654,1337794516,525957916,1407394656,416420104,1297070631,365472773,450423253,882925531,1756193565,820791306,1788554336,771423712,864778152,893654598,1243118150,187870118,1037889501,1574369267,883847080,1720226555,1357241477,1303290579,1017078147,46368682,275268223,1697304959,1621803855,1245219691,890306250,1879993095,2082672552,532291616,1832140052,237996788,623042725,150135764,1818932212,425158265,1796550880,660572635,1895850181,206377153,175026129,1139445905,1567004850,1591757936,504021915,1612620927,1084764875,12631484,333029381,693241722,994450314,847996669,1003272927,163969660,1259686177,585928604,1639225467,1527911156,79752635,2127454233,1867282757,1240483169,408246284,1887906736,1599887663,1120906466,1146716202,2050429841,1242491094,1283311996,1211894752,1986343250,364461692,674901625,993134625,262453497,2053643508,1335641501,488869887,1981570676,1185820085,1669846779,1992212015,1401057902,123484160,373266929,1271475274,29844245,756104195,2019539481,1904555705,2114588292,190923335,162716040,1312545952,2006753217,1308025912,98983592,525302808,594256404,265112911,295744645,314358221,1042206921,2125538557,326378023,1986839101,553921258,1320653705,1608778350,317612093,1781267427,1953687761,992724199,1054395108,2058671521,1021733616,300304466,310271065,632353615,1086165908,348096719,127349898,178212981,474199518,1794284712,555955855,1697526476,2094764755,1197680824,914457007,316494010,1421160779,1148461886,1190676075,713789256,1910260983,1630014284,475401658,469682285,1685576613,265468587,251841859,722494728,1622645187,717246575,626019286,365688075,1229046681,1658955556,660986764,1967081909,1580982909,1728386380,163524164,1498025930,1350854469,1008587547,583536639,1472813954,785007413,2038009065,1230204434,328135572,1335476448,2072871480,2081660327,937501325,1318085501,2116965736,1220465591,1767823743,1080081601,1881674241,485324395,1231108316,2114756710,928415632,168358823,9888375,134172542,1032538323,1340293541,1585074379,77708570,894112446,1102487066,1837548411,1027418997,834930356,718017713,669067654,1475167015,1077750276,58941964,1927981682,772247296,1030476344,336919248,1608171621,1607825149,1744653788,1717689857,1597111747,1184696300,1103307859,1384377618,207062021,1349516735,992548516,1435314034,236928297,790638140,1236750608,631875548,1591406631,485509540,126933800,576154812,394404997,2106630797,1009510153,419358032,1943184493,2016206412,1318333406,1197660254,330276624,410290588,234519992,1065359048,35004454,52572354,961421572,986897566,324406218,1088715572,1017524644,1836193292,1130894316,1745392374,564331950,1162477879,89874021,846927313,824384052,2025492156,854020535,789540799,775197465,297211491,1437478806,1201819303,1348090454,985281348,1834535156,998977932,1865336047,1389757419,1429835171,452886280,2012101437,681208367,1643279459,973451698,1183920066,865369119,1286534191,1945694646,104460614,290081848,913236145,12091704,1335786572,1603639505,685332574,1941116495,2059607909,924637736,230869405,1950383016,600174540,1600412630,1511927842,816876408,280653143,858646755,105480632,694749102,1923610502,1787681083,135809989,1160750318,1398063812,930293543,401739041,1359712543,319252667,1671334974,95085926,542184529,1934686610,1377744906,617911856,2009996471,972601485,1992598485,611042884,175968112,385160005,1735424128,1805640505,2028623973,54040155,470691242,905069417,1400715116,1920122731,619168326,446105699,1410772558,1108492639,284546780,1096189772,1466517885,1586844099,1814405933,944182495,1974590453,1205735771,617999128,1781497912,1211049680,1435442309,1740879031,2054669598,1164953518,1439622398,1080193646,1833832407,1702528426,1927859077,1180393171,1849649088,1785756517,867713599,1058300873,1948841285,345823184,993576806,1758306351,1557737096,162487465,756481973,432939758,818452176,2112670382,1230821352,264149022,572633247,1999873767,1194070561,193029824,446390224,314998072,683984973,509079575,180310000,1631558956,1620761522,1267297712,493481626,1634939418,1982741015,921611307,191301330,388457179,877262455,1657544858,1635094273,1595913993,291812225,1410778393,351075639,1426467755,1543672828,1344682235,723988126,1411711985,1840458332,2025889615,502696021,1871446439,1306853274,1870047896,1074950576,583722815,14280405,1727877619,550217339,344318158,1940653535,999868901,978328742,1689825027,1489371383,1899489236,145175794,3414651,1305222869,2022659314,590659594,1536606145,747676881,605935831,1236254714,67344785,1145729052,1046721493,1783050757,2044413469,21320224,1018282948,297310019,1679974306,207743538,1536689320,545646734,710353302,456344758,593500455,2103565405,223131107,1058247875,447252531,1516427731,1408174952,1805911367,1212651342,911289786,923792255,52433841,282689142,593543471,563405567,353774875,439743580,1388834190,1587300502,860824006,429643636,1038306298,1569834033,529884222,1357408745,1837330792,885791011,2026972516,93284791,1525846914,471009416,660110512,1816041773,1277317622,1880437037,1281222854,240989719,1874934476,2099173523,1602846670,1288792350,177409376,124607850,1192131225,1799835742,868089544,1155612155,1861590706,625969638,921730622,135969259,1050219575,2071077255,2072840660,471076865,1383555901,432184310,97884604,1715330155,114867502,1376246323,526175920,1771135758,525626139,182612117,1269402735,1131982615,1294260618,501362296,1583790357,969453415,500969325,284608056,838525208,194468575,1689591183,836782804,1269848882,1614600657,2072921061,1441449992,269032720,278807784,862509118,836943356,588842113,496398537,73643466,2031245960,1508151559,393982335,720171194,1764536981,1553689670,1939334017,661475158,1943044038,1232007136,161394661,2116849785,1430567499,1347292382,592812716,1235206711,917363682,1142937106,1802386660,573281052,1762735076,1353963481,455150492,1692346546,1284576119,170634122,120696755,277887306,966125791,466514780,1452101387,720204364,69041490,762864089,1132313276,599189993,1799373896,706045591,521621728,761179760,250687998,1225821858,203451482,230714417,1916286233,407079489,1836748381,2047402697,2081782519,1885921679,1382783834,394192684,1707949809,126685418,1768536491,1231687538,1247919005,1051049955,400214186,510207862,1458966320,1592129216,1321634485,746849218,1776725907,1418601354,1872802962,318643457,189073796,1231647741,220652195,1709072139,451623460,154850491,753582620,1032856809,1654002142,482295829,998031163,1079512471,264264953,1305706700,373304672,1395015889,486253224,2111030006,957979554,23025669,2017432120,567253597,1148891054,774877588,956505220,132377545,2058191269,1954514831,1305231004,771118646,1368035358,869220813,139070336,1596915397,1494065924,1756935597,1524811159,1953600690,1662820617,690399201,176555061,1739968910,1556942059,271940718,1110443182,1161147363,765196444,492224474,1286303246,159284122,540803847,1069882480,879690033,1696213875,1050512529,667864712,1590380160,1265108279,1010514171,2043389870,643370304,1804560035,1480195816,1009251844,1641089742,1698845792,535805211,830825319,231753190,463594251,439174196,1201226342,646362465,1481692346,308216751,1818142329,1366370432,1328412059,157946156,1661734387,1820431442,905024376,703472298,60421137,977747146,1217126114,1748267984,1816227174,54450991,185317898,2091206456,920645102,73936666,1660314543,256542555,1567308925,1844211930,795731368,706870149,1602923264,1961933099,1988304567,1828898834,1064340464,1970607797,1884018211,662658206,1125046161,1174227721,1230196582,922997686,1783360241,865661981,1309039557,1365534272,2013996101,863100532,1048516220,423959687,231020086,1754997632,1031148441,1802468892,47293360,254091994,53319175,1142100792,1237412186,153266802,1807025103,1722901159,272036159,438331547,1789796170,1292747398,1609555812,1437473153,1782223935,827928283,1861724049,57350063,81602460,1710576015,440153668,2002959710,439595335,472111334,885648640,1517328834,885901276,2003035969,1507534153,1371699555,222138824,653704826,2092501255,1618485940,1793814178,1432276067,2047730215,181568681,745017870,1316871571,1372407693,549379347,1395305403,1680033869,1419795669,101701119,1914673306,1561902842,545497906,1912903117,1233049547,1920188650,1802948220,1530420007,1969692079,1875074661,1133265899,2000185241,1852167503,532327971,849616529,694972665,1855392760,971094174,368769990,558312213,2103741930,146368279,1724181345,2017254988,286605110,553907360,39797233,1134344922,1843643895,488106440,1363173752,466327581,114481739,62327443,1484396063,541706359,36586949,2013089868,698540717,629398356,1046886054,1140649902,914337842,743499238,2029857054,244468181,1765257325,1381086789,990531052,1084701238,357526978,1071873313,1175462208,853520536,387231621,816220457,258622622,1420260074,1558761982,204828813,17348795,2041020771,392929179,1513447276,947021083,1874877511,1222951508,941619845,805030399,315187909,1898851286,236541476,763697229,3034740,1723684961,1863316428,2015993356,1959497985,1698348419,1615152632,393965102,341021262,2017975251,1751951120,790346318,638605012,1333418789,94405563,1502637506,1217588156,1015041278,952497226,375581181,1889062361,1127424808,2095119950,1843174758,301104588,419905241,1526070821,1225211424,544442628,1809742863,399076845,873235248,1518449431,1864006167,1320365555,381076726,2000822634,1525330015,809102107,734667752,1887045733,1984728738,441461077,610376204,351274034,816665978,1966556223,1158468088,1147074344,1885790260,387996147,1045026110,1824356482,1231521714,249606607,1924392026,762519921,1760429953,883571055,962421619,1596944237,1854141110,527232963,62239980,631726713,1727673663,1234544200,696394467,808247088,1927779703,923462707,1242511757,188080080,915736794,135307688,772988133,1048915260,566358379,190849845,1589759764,1593113685,1681814761,559415831,2105152992,980853853,526945221,1214072025,777357306,725070086,935883834,575000550,1620262179,1608060681,842824196,1765258237,562042498,2060325749,533614535,1252764649,876326200,609473916,2023091405,387106990,1633234052,2093986970,34163187,1536530825,1633089172,911191337,712548380,2119359612,488367273,353663557,1089057684,1355305685,2048162117,572455861,325556510,276466007,20745657,833486946,1118237676,1465403338,1692840567,1151137586,1519308427,1543301821,587502892,73923438,1916615040,1181813653,2089072809,1583611521,1178604895,615110044,208741134,498347962,1851575090,227630265,607578880,83144503,98281275,807982987,1757479533,2089639497,1781367857,1798261223,183543023,1326414959,2100188038,632300570,815944065,1389488552,421166203,1678551917,151579434,1298096431,312596195,51016713,240312867,468991155,1148969821,1037413112,1802918111,236759744,1242178775,1788772700,1425138576,462121195,1577274442,1959267624,652888850,1552151774,1418530711,1338110297,1834727445,268831101,21241598,1178253482,674257322,711783914,840877393,212796930,1893246321,101235061,1407281557,1542826295,213669938,1250797673,529095645,629155952,1231629751,1050857375,933848757,2092746863,123251431,1394881859,123095052,1557951568,1501068944,1880938022,1408775068,2003087750,1302553501,185012801,1186479461,1054943402,1065777560,918595017,593224306,800999926,1401804131,1562799172,1455493094,497734159,1359868230,96584563,2006472044,1634262935,507719820,1231772800,333972380,1997154072,61353874,1899042253,1917729866,126368908,566676481,628554065,1672756657,1914266100,1932424837,1961506016,850881801,1200483687,1780497018,222867935,276631345,480599396,152703682,591626100,1798573906,311565402,938356023,791428760,424522692,956320108,1429887000,1820359594,176636789,959945683,242161977,1113892391,681019806,1074995061,2072857958,241825976,1503105852,535668786,104210418,1536097266,1157279276,1795938892,445993949,1604290746,1536033767,753671442,1279028376,596445716,1384615508,2104408177,351462902,1351390966,1103134141,695449770,2004396434,1623810340,1880871442,238135918,1831968410,315496723,2067815510,557895211,216437270,1180618020,828318063,1548685110,1629039600,821714884,318621536,135134475,1226878369,615688763,1770797039,1875889496,16706112,1192900164,1914679577,718188595,1693785580,12223097,1117475098,1019037596,1517008671,1014456366,740773988,585186958,546050849,2011996500,804002525,1911570636,495337465,1000558065,457484831,636946793,217371669,997948219,1486882516,1599287039,1863287781,1753791326,539954368,1576369658,212948568,1341610574,2081614744,1787291673,2029269678,429528753,999296898,336124290,2039768262,1345728523,1867363751,1940363042,1959076576,1389306464,1208746107,75914738,1751596719,1815269693,1197701047,757587904,1421219241,1441072036,1802952077,1398236038,302937494,804707798,1945891063,756237788,755796779,756729483,1945407020,30594224,1009786234,2050467286,1036985027,39176752,406762544,1121871464,1919753210,1019078423,315789664,1139108211,1180935074,2075381830,1833302377,128856854,1555055229,1018401268,1917589378,839483284,1116158340,1194301178,897865373,403994702,298120794,377355227,1591742514,1734875531,1819202253,350826731,2068922097,318927798,153044911,794483983,228577124,1142194975,1970892975,321621357,593795081,1651768840,608719825,1951010995,1644192590,650293260,1271478791,674177779,405002589,1211241772,377206603,255838151,1731092379,2112523837,311338902,1162047574,58648685,1853464656,1852221042,836824326,763388688,1020303828,736412403,346393552,895176915,902319699,623474094,2066613800,1970045996,1443606530,1838937961,1619312310,1657375794,386465914,1186193239,963119582,1243993782,1462211592,492406664,1638242809,1540779113,2067525798,1402281624,239402205,1106303345,2016908524,981263498,616348279,1964528215,103195740,1882068989,1041620149,1339689732,782241870,31684026,367719094,845793050,210757285,2010176800,509585810,1985152384,1496308115,169280667,628712126,1051691201,134141972,1086351370,76378506,429030369,556027189,1220480210,1549524685,1186278079,119494977,893538183,248101339,1262065177,532185087,1018157303,1207238772,2012763319,1979808090,300687735,1450974099,440902528,327098663,1363179562,1944359994,1384542323,90188233,1357134373,611049228,1420350719,810556389,607519985,54354009,797107708,860433681,372274930,1561288731,17603611,397638587,1072797010,670204983,571423900,1728647656,1358948304,1676340581,254572479,125356945,591907811,1124829542,240160167,1991035858,744710471,2064151638,1617520601,308341481,282355288,2081781791,1155003250,841579112,2098343460,1687483770,75587445,891536538,851368922,2033336732,1670396813,2120430011,670059540,1125527499,865601141,832318932,549468569,11489642,358404685,213717700,262914300,1179662895,1274225426,2030925576,686453767,893857458,624541270,1107701522,139499360,1218534957,241297364,1734933768,1878789822,894091574,1215605956,43186521,546665435,581193983,1989966236,606378102,1804364392,664988631,102083570,464309942,1253040347,250838416,2011515113,2112211892,100572821,1322964578,45109167,687784833,86087552,917187636,853771259,176878343,1763074524,312188317,1966814423,5650674,265939782,276143037,532020848,1158368792,647677347,98623466,977984340,1979167385,1997235986,1819300053,788085036,2089056221,1519374948,1829086320,1218437697,752615748,837206094,1527560292,1399348208,1641839423,1344546377,1800465662,472702303,1045141217,1148322352,1599680886,1525247039,487475469,366896741,1049310054,1416425759,2035206278,257779608,727318550,1897885589,897208198,1731611779,1329923218,374079301,1463632848,881202629,797957670,394110761,2045632002,200202245,1963890510,76808554,1825185751,1048512900,1362264786,1181596081,839188034,994921158,2039132814,1649536043,113849197,1893428091,790692356,1985014831,1119662979,217206414,389820467,527370105,685794445,81911961,1367181845,1320399326,49619493,1499848036,175244160,1901459847,2118966754,1649722165,2026160239,1279431163,1376465855,1171543950,221732867,210048213,1524568832,1987294598,1782836291,851004071,1200210883,798663591,2093994152,1919846893,131401751,1966305860,131651022,439737104,1146457769,684221885,509364,616408603,2064972733,187063012,406059636,1446009616,97763245,870188968,1315608716,1760640028,203618023,1568324235,1973758544,1331414567,580069157,383853152,1166806963,2063674969,1522833195,8898568,1898217773,1752203837,1262504606,176107231,112144380,1932715924,501162691,1068776682,1601217529,1701008859,886715869,1436188089,1187410242,1345976027,468921715,882465913,1299589568,2109764556,2067649926,1904786760,439692519,751362701,914593514,680439066,611506713,1659555456,1344715980,1712398761,141707868,137076,440145594,678301710,1664320174,1403168010,1268967880,891071306,1646099979,1039924781,1417504928,1608466289,206407715,1640973802,1485608227,5680143,1183210296,1200351199,1462828283,601538864,854737782,1241371201,1169427984,327180539,1410289405,895912674,1987562132,1823707998,1688544108,1373440708,224542116,707274787,137419,1245692393,62298987,1169948535,1995548445,343400640,1510053271,1025291040,217991228,470359236,1735502428,1234165060,2120901498,1721104051,91332434,78689242,1923578269,1605983520,1457776269,237756172,1183966056,1825335627,1083308977,29456911,989024931,528141217,160865857,178730702,73467179,1028027095,1245287624,1231736478,1406205011,1314493588,799989629,998200035,1392654786,765215075,1336406410,2099776924,1173084819,1354045948,1593015118,309534712,983546684,1244497097,1915687682,56277516,1707906306,1921686555,398981030,970049297,326447624,805663212,1377621563,1663830540,878307287,62077946,1046774776,2123643270,435571521,686086166,2007132643,1816515984,1098805460,1835912673,1735870536,2074860701,797926802,487538500,252974982,1851172692,1517364293,1093653233,1395916477,1963114206,1726748449,646403988,248728582,1366998462,1425646082,361538991,1278783911,2076110373,118169775,79257739,232683806,1148736672,188070926,1823006075,1235870205,40829366,948060642,120521093,1022561190,862701200,958332299,63099153,1533033110,1297591178,473655505,1209239162,751804198,687313980,2086911615,1573852553,1461963874,1154863437,473585744,256335006,1307844490,1353701280,1399160183,753002962,1969450369,641661716,287254194,305411026,800810534,93753797,2126063127,1030965993,1702668181,325897503,1480558652,2076990601,1275763807,43348879,1980715054,591618302,809091054,334820647,79019090,142506303,1080870990,325371838,716069516,836129073,1867483727,1699399888,1425049054,619085811,1751036539,563929274,1605603781,1751879647,798260894,1324802263,341630982,1340593114,1500239263,1510736701,647842640,256199346,802423098,125691176,82450410,205424833,793586130,663014769,491645055,1659777383,1105607923,1012911471,2021634261,2068732916,1614972361,963867570,1954426130,257593096,2109541215,1034159676,273239167,715205162,1645426983,849541754,118482527,412163595,1909534723,1645094232,1279923235,1400349433,1167919131,581005499,111067795,327022763,625437067,1386845214,1720233257,731487007,1045287533,952305808,621214383,648944400,774474298,607828779,387461612,1559862802,1397807677,1605901708,183432929,598146767,1126529797,264502348,1603525621,1439886563,1556909237,97147907,69007605,57814045,2037871332,230737165,658084516,305320813,193495133,425433971,1105587334,235406359,1595611514,487132942,244841789,1946780446,1505769029,688304766,289682864,1949358855,262120353,1415500239,223321770,373061715,83806390,1003124802,954233061,2042315676,892974522,659594270,692408854,1949222721,48922109,1011237107,279624700,724012387,2105202517,1299926938,60178268,1682228644,768135076,751661674,776890296,705421025,1022973412,1277628210,886150007,1985441932,1711936446,1892069067,2016868688,961200604,352290256,1887206067,97880472,561829566,691931707,1791572456,935131972,1327474172,549287312,348839344,1844526047,1412488964,1658243713,1374145760,175275196,913285469,1590934907,1230856971,1138990062,1772851992,1763473934,1216884221,100791216,2110178822,159573979,554431688,1231060483,1433404560,1655769181,374650778,552031191,2068473593,500696808,610826302,1426004109,1502521298,1816226451,960515386,1709145757,228185721,274581378,696941209,590919116,1538055898,2062315036,194152064,172051900,25618931,59320624,1863103324,1358835636,730604350,275167997,1827523863,111241927,1974239902,411040839,1910589851,486576385,697011713,1465828472,1071132261,1218370918,1104639021,1122416358,370064047,1113011612,628831249,1284394921,1016187017,465885630,1410625410,1434611831,1481574203,1858462102,1956444873,1094235051,113619162,2078537498,1712376967,564399313,704152851,1168455136,1304152472,185723445,1970236668,416348876,372814980,194521860,739388678,1072631352,1259411615,1558555453,436251876,158296281,1944479653,362701410,504682720,441368641,1630063910,307423893,79545169,139145178,1304713664,256843292,927563606,718476278,1569614344,1476810251,1750203341,2066940985,1390639889,559913312,1896428356,974098618,881308073,825802991,594930363,72621702,1835202990,988981794,1902528738,888543095,1055725473,565157795,879290048,2043317812,1185586925,1931872798,742248573,957212419,1095959404,196522077,687915706,1239556417,180247429,1489956990,1037705750,793556005,815633310,718136685,1510947825,1593665193,779657972,1382475962,1088874890,944879293,172249276,922309607,1116266750,1475937120,394499194,1947607306,540433178,1830607933,245707720,264388233,176980223,436987577,600326895,788408888,1768946950,494042077,1716778571,1016607611,641988921,877988382,306673436,882841733,1079159895,2119725385,1166108727,1077638032,265047994,1814750914,1150811755,1000989748,1354351498,865427178,1776089597,496654573,1319943165,1002287741,2096078944,993232296,1299317992,620853234,1901592945,1422725312,678462403,753615804,1010700388,195728287,656109864,1179601555,23076352,2117899280,1855880104,829303011,874173847,46344707,163313671,2107285993,582688337,1117301884,1995204082,522386825,523366380,823925798,1704249004,8117192,1095700143,1309362659,1825234438,1684525326,26989268,1276039601,2043288109,665007009,9858013,1880633660,217689830,1631799513,1291544276,1096223699,1847110350,1460516369,856434008,1387917450,137988097,1137110853,517896997,727072139,1127587514,396360079,1946263977,77410319,404867096,823095042,2081782692,537168863,819898762,474110359,852066280,1562432368,215566984,797383889,1870504975,1716670490,10967165,2000741883,447034088,1190817313,753996082,210875169,1400074922,1227778636,1903093892,1360464239,333900178,1421417125,778711076,596506001,85046026,247642827,1170596070,1148923447,499825407,1289369685,2061594912,1535200119,1323842082,1237165455,466625476,150361183,525945186,1244040781,76292958,1131578807,1181288045,157787620,747770121,1764643689,2030401361,1469880432,228170357,685070767,1449114344,277128029,955093442,1579544155,256277753,857911617,10587186,901861529,332722337,1831056637,307733055,942773183,1910859295,134131019,588983375,540806726,1806702381,1321737095,831578554,593722987,2054336721,1220021052,1634422140,1447992897,335938878,369218846,1695158326,835490985,1598492063,390544048,364436395,308708911,1531854956,1067040241,401521355,322980701,833199353,271850061,272379479,1251871683,425738457,819677501,291330556,938357145,868501131,663424608,753081388,1921896442,325081386,1515497564,681756929,1019473129,310275069,795320708,1317614669,1230762184,1529719106,1369222060,143549097,1808379230,906704319,797085869,188253405,1363211705,605035151,985879803,40992745,1300177051,2120495817,391719434,1628526157,886951340,1064384787,810418198,1954116208,1133673743,1407288925,965611688,886728356,105488060,865446634,1621500890,160181343,545540775,882129048,1622221365,138722580,1225744065,731853900,870181328,742717845,1719670133,1065070376,654202975,1639402535,367738643,1589681960,665371559,1737416377,1614897055,54609093,1530962818,1371534325,800425745,1460677119,1898740004,1475624127,184251529,404736201,1732867328,1501301184,1314092856,1533904198,1383258240,1702252485,897834873,716734337,1996247271,875899288,684422552,1088107292,1902785479,874746358,742097054,1391369929,143551626,1079637155,279140551,2075803293,905202550,365659007,941753739,107180096,1391770366,541822004,897336110,240339774,655515723,562001504,1483834180,635752456,452995635,1669299753,189616204,1463647626,1583696491,2101914510,1750316793,1978727822,1644582655,326039751,300523713,1260286206,1831870526,1492848442,695697820,1505798073,1181162444,83629012,2025425276,1829651317,1661122192,803747301,248435665,365761000,1797623373,228222203,1375642336,1735509230,5309411,2051802325,1548658547,1958378074,165516439,395310218,1514570465,1452561604,939427714,898612585,739507195,1916814832,725147013,2052905345,491513179,1948423941,1820742398,1566837824,370744672,1061596939,959854703,1640721873,2075848197,1476137026,2024681238,1094107958,1618654015,1506984908,1868653446,1542723338,878651638,630292179,1805433494,1953105122,759909335,348605477,1696969306,676786800,739868321,602454980,24119417,900612348,1690566368,589890747,1978373858,1572101536,240976876,1894021691,989747874,1132290490,2093153858,455311338,1135865588,219135465,1753212246,1808554483,658076468,426115153,324416211,905369561,1271321563,2070987880,704705456,1106781701,2185348,1138045425,767967935,1956302662,1159756552,438572206,1661852211,1651235952,1615671069,1773932069,1509954682,1004548174,1742789337,1177060487,1916895109,329781144,706736334,573311624,439064765,110365763,2101243029,548210687,2103654797,719253241,63110671,1622796398,676790404,437436948,1472862467,765836607,139301367,310567490,1977229223,1195083482,256325068,1889129640,1946592242,460218665,1566573190,271778008,820207240,516426821,1731459412,365498242,897145189,323409681,204640222,130636416,697292702,652207438,2081053539,581939940,848998773,1329309357,238844154,690828048,1881020648,38834582,1699919030,1025710072,1043383203,1103617887,1931881985,1848025933,1222350788,1030445702,1100640204,12123581,1358037107,308238284,172366601,1552587651,1131305875,1747548215,1313258288,1956971926,1157446021,1393191456,1008847135,73500902,1357958928,1164719464,1608793616,903917274,1548056514,1970337858,1428032327,460061501,864745932,1410019168,1563674370,1377359483,2033157271,526100360,1149612161,1802900204,1834814640,2068688167,995796333,861022923,1655754112,520696182,2058085325,1711508537,328479486,134145438,1834112454,1043296715,1137144281,1657929792,606507966,209541530,2037246095,671086379,78773592,451500609,1535186457,913553419,507685800,483404953,474089612,1078614640,140628820,1361112916,807789065,2059301239,1750355705,46620223,1234953166,1102020625,1964677802,976188154,328336975,1419786955,1180885092,1230533023,1067439626,1969384622,512189804,1544141043,988877312,888621067,2092849883,826516852,1519999275,75741665,307881437,1692880391,1864727759,1756620586,477540847,1685094420,1144449974,1903365375,1943062292,435589534,418502078,952070090,659762824,647558148,32112784,1439374026,1397055452,43938225,1592475013,1936888505,1430324785,1483775437,195864256,1040839453,1943967331,864338889,897004785,5093154,1651486565,1011126601,249278540,1597779449,1554651158,1097529741,1180336086,569015571,813375356,850489571,1299383217,833650391,307312035,900326631,2120831772,328467146,1027681436,165363613,727031383,1281187273,387608806,990669681,1028418592,1087199413,1045969909,414767661,1888100121,1075442266,727885127,347356796,1868691298,1436524407,1689882785,1421234113,1218067724,1032920529,1634095235,1148474873,474990520,935056405,786850783,1784755633,1026930137,1012711750,183558910,498106303,1065090509,1045192865,499718504,2593757,1482325282,1680805004,845266051,1804794393,381796761,40482880,692366961,950089931,2113212122,463797872,613959301,1406106677,1013565396,1767549455,1842837247,996340415,979468662,1199673601,34132754,1568983106,2096279380,2017268972,1061032334,681142096,861620765,147562756,1899129628,1603007039,1999519261,1845488869,1850716156,168340684,1950261479,1608010287,1613952078,1594343330,507192820,1782892600,1897159995,47824981,5915869,680694752,2127822693,1643417377,150843906,235744431,1217070777,2047635022,294506920,1314002170,1604524813,1570556649,582821058,942889497,1506174954,1265326295,519978149,241704738,1373749017,1508945202,1102740927,262338720,714075530,1790636573,456109948,1824758754,1832887524,118917396,300806308,258655334,216017378,1740861422,1861454123,1761560081,275938489,565658463,1879787218,256859800,806339186,1648526830,2097579453,255755169,621054875,1483980431,2083546379,63825905,1229051141,1639601598,1457110243,2113523889,2040780267,879104719,558547203,400173704,1968123816,1183986420,100162773,1779212369,371282108,742150105,22373706,74096507,1682678956,445072042,1264944233,746621199,1944098892,902533949,1453913192,1034270775,1327537538,1463589568,1489400075,557005733,910029871,1170412386,3582985,848033881,1236791375,94576687,923823935,2067850168,365476747,1335543261,1547556144,658258651,1437278821,503940228,1671734485,302302228,415681114,702831108,884511985,607025163,1115701156,691110716,820546540,665681497,1560917796,2000306715,316111778,1666051849,792311258,1820977884,1978331719,279489433,1238002069,1402049488,2031986394,1426316221,1091783116,2034777046,1139633769,1270070776,724975279,185949546,1189720478,1902925134,577799159,577632859,543065593,1678688509,546340555,251982233,621888645,1910778854,2027734327,1886641352,614085600,658261283,1427338018,886969534,1146189189,1213217412,1044897601,391246961,1228263828,1236197003,1461920105,2126675928,1510552564,1796065312,1193609841,489563428,854594161,1015016517,256497369,1570566788,243931757,906946881,1579623423,856095465,1410659833,1845061124,455603942,1907385631,507298165,296447276,1330320302,1625272673,2084492095,931631096,1023129531,1835865197,418465983,1938088869,140823169,1393277912,1290313518,2046754345,1736558229,424396838,1586082394,979637584,547529949,1903875685,1995706239,1999912210,823995217,1708383842,2114700687,2021339450,2068211721,360371042,1427174164,521325991,1600057452,122441899,33170762,758575422,998176911,874039546,155331042,1046231790,1401541423,1542017717,514947310,1315336699,1489779712,1805331903,1852087199,988851108,2063670709,963419451,1740683775,278907737,1737753080,1141253016,348313587,778131016,866862596,569664688,1987426056,1097050258,847866571,1052259093,1775178894,346035805,1450076680,1982534161,898213610,1306294271,956565829,118335282,1338750867,1671323018,1967353437,376514771,646692422,1282120470,319626089,1659851541,257888091,1149663978,1117172899,1818783437,8091954,981242114,466366076,453803658,207518966,953211406,1085839430,880293667,641783639,754452442,273046303,1297700834,1922382566,318713644,523465558,838155574,1711512010,1309817638,1776110512,451342235,181934398,1484157875,1285072585,864568246,2089650504,1787501068,455998674,2026206752,621874491,251283401,317641505,5170991,1578361032,1894152151,1636248573,531179875,891542703,1144382084,224429365,345190861,38618196,661750900,1889099231,714374958,1602019147,124888469,997715970,1636527124,872451797,1659692880,420535421,126991055,684737620,1265138198,1987248556,2076728855,784204256,1168943752,1306324191,1127757443,2044753779,145954840,150468821,1227893024,546177051,384146359,942632071,1252010826,1465217469,1471731779,1463514413,1086999039,367963283,878493663,679700561,1755974766,1655864307,1911848945,514341355,1913534947,1971188332,288625951,994293706,1285935568,1922473612,1754160420,475057945,837759405,1475441020,1833136522,1525847525,1740180267,666422730,1285787885,131655228,1013362388,528777942,749082347,958069257,1609642531,788017029,1651643637,899134860,1737413963,2013484701,250658611,106238262,524889522,487495308,1354722672,1157944923,435405872,1021397350,2122763859,1116856596,1433285748,312061119,893429892,1040606913,215163072,1181135268,1773329835,814273598,1564031659,1534254922,175602730,1454597971,439956507,1675249429,530139847,1641685859,1434817114,1552054882,917460106,47523558,1454372679,663824457,1784006272,322724234,1729910815,613167946,531080075,1335675304,712851289,976817700,651443782,1607948093,690270607,822308662,105401989,388070168,1350413419,1220327341,1298210663,1964632928,1839629335,1529355065,1585319216,788382476,1747881260,1150317806,606241154,304645025,1313188626,1371855167,950457524,1893193123,1220787658,1322545304,1649375328,144619417,1500593309,1522178248,606539365,982853222,1602119833,1790820347,1793584294,725818453,1733768274,1507743641,811769268,1889139682,904151745,709616888,1531510044,816739897,903426519,178251939,1030346395,9121981,1526262075,1441500031,1243500008,780821810,1227199340,154018654,721902525,1131648257,1771146882,598372500,1784541277,831634545,925166292,202440292,689955034,2078798165,183779033,9285981,1699115083,1281934766,1765987646,931453534,606831642,681462769,878725783,1171824156,548416627,1919804477,230566365,1435805114,194616385,1900919588,1176276032,2039502130,1426093831,954909049,1994571011,1727992248,1650195343,176601157,149674637,1275627064,618583898,1446253497,1133898808,1806679159,2022468854,1421552116,1942556588,1511488660,1896120183,1408139401,1824374175,1698385866,404211457,656628397,1731225236,813351240,1480695860,820463045,1293597111,604577709,877009659,1786574930,1712937704,1898016695,2086091024,1756360801,34737957,1338475056,147036619,1114788863,1404113138,373384010,1371430588,1625160020,1340917810,495573459,1290207430,1207713502,1506889233,1217942016,1647452986,774873105,608558048,787640261,990257220,1711580541,2093937047,922883652,1409006746,689454846,1385787109,524054718,125956228,1487948637,586727509,2089011178,586035301,721182949,586346237,1588478567,797400435,664550283,1997548814,744539118,457302118,274536160,783737188,72412154,1274553689,325873565,1780916235,848870860,1323470360,1953427830,1020227529,1346073692,1810224834,373147799,1365551705,1275866296,800680669,1526154326,1801074814,392219060,2096092607,596681104,1703457827,125326303,1250722766,1176478757,1560506978,428481754,1718981493,2066770221,1921776251,1151849081,1001293742,462750481,1007543972,370955320,1831818728,27952574,27873665,208315010,1115506182,490488998,897128066,2110090474,628946333,1886451525,1416572835,192943367,1895431565,1565979076,1851001081,10694787,972599741,28859470,1233032009,706767932,1355005359,1799860783,1882763836,1320755047,1368102335,313702106,10944761,1016550410,776024980,698878742,522932127,1565823163,2056026371,577834081,1467617462,1521932598,9725028,464476073,985213963,1447323033,1343326548,1745555286,432374950,288732550,1126160561,862645018,2057697688,1619424713,106858763,1783758398,1912744735,2065632945,133588782,1529992011,681167490,58689579,928916692,750601224,597653606,329797830,287396507,2041798994,725386844,1672479323,193580263,635602126,232657345,2009087013,1857689385,292943686,1467314533,70560716,345511311,1651897650,118880806,1367529805,663541784,837075079,44079938,975716942,717746334,489294759,207914041,44056985,1216705353,1055129690,244952523,178774081,325634639,1377964191,1095575107,147118156,307563310,853796431,391823822,693914240,1745924916,617412436,1175795114,638219204,851271260,1893689735,1268602181,1136479976,1167459085,286938680,831316901,1408250716,1918144163,912658977,816926041,836952147,953418524,881495081,763328630,1812039540,687352954,2085699080,2004000626,237585042,1773761845,1473983966,573182672,1913565504,1502137205,798983798,1516305804,169379699,738868805,2084149831,718412910,979838654,1285588607,307963621,453315713,197290548,649187793,1862817392,1331782303,704493479,2060029094,1641480926,2015586201,414434940,1064490977,1174630226,1116185190,417208304,1651693038,1698951505,470510403,1403187091,1728804787,457499983,723657417,371488059,850703357,2060238435,159872288,57053626,818123317,1523053274,653141586,1392269652,930435335,197744418,394598991,1431087002,1696269255,1827674548,903375790,2048947952,660887709,2005714684,240757440,1711389093,1116304556,1664016696,1601412164,1806030531,1300266982,1297256408,266259475,2034072940,315395970,1064255329,877286922,766885428,1556444394,905157745,1153883616,1964927939,1949148780,984452135,998882495,1226661318,2115565070,1283193450,498527960,1393283412,259632320,195700082,1385729168,1207459266,1020850488,309477388,432840596,1536814745,1519797292,511304961,638407735,288961300,1927816564,1609284464,2061468887,780363555,1493796356,1018713316,305569583,1326821799,2080079267,872592020,1430815526,253382740,1063131210,41055808,1176465435,279971702,1003365386,490006593,282672146,435896873,178309581,1686605987,2125990859,2033913105,1483678463,1010398348,93978149,307953018,1711612646,1358981167,906278424,1723387176,898581381,124329927,1003525499,2035595151,107513791,1971454599,1685396795,2040766665,1587927630,257495970,1234401146,811049469,1408983751,2021694857,2011045262,1205519377,828726693,606843267,1296854938,44502980,1455083033,243094167,880453972,921056202,694332805,2126202219,1805962180,295650694,1788270802,272884740,1794923990,1751616216,255237325,1663471467,644402,717017032,1988565723,485717937,1970358473,1572172668,201022965,1892124532,1334008857,629630591,418987879,783762162,1540941761,284328299,511063353,1088482661,1302711248,921156207,376897294,536479421,868533071,472571179,1764949451,722443581,1439137661,264200100,949031858,1174275335,1980889809,907663495,1348416222,966858449,1312796706,1360480020,1159458013,2119399018,2053613512,1589277874,638010700,1139882741,1730999812,1336237170,1218293965,945972505,1899014657,1098531467,2116494547,171673512,1372299410,2010463624,2103350860,33492936,964723695,261464144,1885417583,1343302200,1136851479,1876420785,2105943099,176018892,1208531900,406335586,1929631620,1664810308,1597611512,1370098639,1567700610,1805602128,522129775,424034230,337485371,482500876,1002078724,112825549,961556018,1050296043,1067702433,605977178,1723465360,787021457,384471901,750042152,38873302,1032732268,2071216678,1611410442,336408394,1508915431,45371938,808550172,1471256781,1913633703,484147445,19975808,214327648,570810830,446283161,1227869668,1090824651,796697490,1694523489,1403913488,1667053138,2075594117,339256961,269431541,1597238169,1407274784,969156474,727917236,952685157,548140277,229880020,1602202857,889676206,1745278600,170007898,1464802286,1010851109,1795268667,766825439,2009649434,13226543,48225795,1142993669,259226032,1616445385,552691890,1523408900,1222339329,1708149734,140495256,109026484,1820709238,1593856083,858803524,953467873,1959448513,371850736,1714324939,666176990,1775569558,1770277092,817514671,736039506,296180664,1908307657,1738855041,847420919,1392242204,722258997,1737153448,565718317,1958100988,1412212852,1470669267,1825333355,1256037393,1554600900,1693212385,130525236,1927837500,413449880,612255564,971926104,490892426,80124226,2098689157,1673282415,988331851,246278047,628948217,91569800,1387139954,1216653808,2103217767,1221477068,1929931714,1521386536,161449478,1181234803,1203683944,1391069134,736568175,713008145,19397803,544719654,765011364,467169727,1850659606,1662539118,372028187,591062232,1739180736,1479692215,1043206581,1285334607,873966027,1916035601,1800453077,1374185362,1405674612,856417144,755792221,259112939,1186367044,1394571371,816836216,1857027358,1719522389,476595684,941628914,727733132,1169737332,145401627,460317143,280477858,1122383358,1018809767,716960689,1427567787,130497618,936461939,83258733,1967003113,805276308,977960808,373826448,401283351,1837765025,526911835,1015869814,852650951,908947192,589387551,102974052,375298490,2060492487,1411140690,1893463848,141880139,1044764325,1942574749,2052643062,1183184858,2079394566,1721824197,804816498,680303216,2069304803,1706897362,182826741,1199673550,2036221793,1175991695,2045982278,533311403,1829679780,719241290,62850633,1252623108,279398136,307529666,1359106116,1502125208,988549778,1942792683,611529255,1113332922,150503919,926561290,570452796,1165408565,1411312870,482280347,1609006141,933115280,1482138529,1394937569,598952306,224144326,1641563181,559025123,913406967,357377369,708361979,249530768,284734679,355173700,1814468433,290814802,893916532,1695359539,133742430,42224991,562710941,1043813174,1792489375,478827766,436534499,1579701942,193773702,1515557474,57638596,692568035,2115813443,1198252737,1287358191,1657501286,988357866,1044709399,1980319198,1860791855,1190874349,1546080279,493677812,1860447531,1274920240,1386416011,36051965,679705592,964357972,1099589369,524276231,1465995107,1985147833,1305366999,1153843590,976840318,771441907,767423851,784664218,2019068777,864406974,1738531724,5190683,1193989442,1144462818,1942031395,994732317,770052501,1962456599,1771288905,913451739,1900029225,1890996384,927873268,709357170,1476932512,754299279,338951494,2096240910,1900591636,1448057261,1470900647,1602757322,1061202672,39597567,1732306510,2067036983,835722958,1262203807,743915574,1868752472,1997263809,91440870,828618167,1828368845,1489842533,2072515555,1580874055,1918195486,1228428519,1706325565,780578580,510852699,1691779090,599698487,1321809868,780612532,209029757,144391008,296002622,634515519,29188486,1916831786,1393348348,773784773,745661244,1872404759,363242596,1936613625,62367426,5018873,931204167,434678747,1803956821,2042415357,921032905,200580170,1898294679,1023941009,434787575,223507032,1625527362,629544802,1946219783,1927847575,1853654654,153556988,1477429798,1809039010,589132983,872150014,742196029,616279625,377183993,2029758780,1048256118,350158505,899078761,311658510,1661735509,1750558359,15115663,1958308674,376108283,856240055,1020391966,625203752,1846042324,748363539,35243444,2091034781,685495926,2043795083,630272266,1820389581,2126137710,2118083689,1324598422,154494305,2063573217,2049814783,433023533,1280153641,1937914776,194660527,371957590,2019693968,203830937,225831216,91443383,1055948667,1064505412,1278533118,1942113315,703476578,2122924673,221253143,1726712418,58801337,1510300025,866734583,1728621335,51336266,638670389,449259739,193039094,1781134777,1805347046,1964903544,1538505327,687326921,788796385,1948421405,1695411151,1335430626,1199154292,1627319717,207548026,323204584,679463800,1961975245,1952663994,476089388,1829663181,48629275,309347019,947485505,1950707658,46792193,2065300485,1953150704,2130104618,1767493874,1062129478,1257106930,1923202566,1789353837,773250212,69305516,1272684905,274320864,1376904623,193173246,220355061,583053121,1757790421,475066055,1592420216,873789545,1723801836,1699665940,1375577845,968782523,50366994,580181435,196091212,2110674463,388691882,1001668930,1364992476,1975726258,959408238,1753934952,2080940812,1160131183,126053523,2129737387,1355308997,630455354,1974290911,1844725510,658054609,1794940045,1824088742,100840179,1263480879,150543,1479357888,357647518,1745631991,216895027,554571836,558321245,1404264034,16311558,1667250247,840504903,1706952799,1176756265,2006296603,1220548853,236477309,379883130,1932048011,191956100,1046996871,344047033,1431711593,648819918,929547147,1364305013,991178766,2029802563,1746439606,1112303460,1272692729,1042967596,243744674,1368789542,380265782,1854784749,923208214,831106469,159193229,1439310814,552254600,774398641,165253766,916018642,674044903,1030284410,1906486500,373471109,1786124432,1597989921,1331947314,1842369203,921676885,1592648612,1914726033,2039339431,65131462,1593520700,574593505,1854853311,457371147,534049489,1737954684,215809826,1678465966,331411440,382465048,143010294,1266816507,1796416188,465869818,1112466476,1228855888,1288022813,193920364,684468875,817821002,1282151177,517890556,421046059,1569166541,1609658651,466633196,1000655222,2047731135,1286331196,1040517520,453889080,176101976,1124624043,1483034135,867633179,1701859804,2097693625,133210482,703736087,1194676755,1369872165,294479992,1728215135,1742226020,1950865279,943541961,1049530047,1751152665,382418576,1206289419,604571870,1606123553,984787038,1036378512,688998163,224127657,381218464,1061975406,1169722728,1398355816,1519438600,811328991,808366606,1456617611,1870832907,609818097,798203641,936818342,652358394,2117560424,132695181,789524960,152042561,1007023387,1672127828,1981959432,846659454,320184863,721573652,410272991,1210590120,1447023631,1879769789,1027659790,750632296,1864637179,994567486,904544019,555171212,424692734,947245011,1044647341,166979345,670197548,1645577045,1664245218,1936834457,1167193693,1039230789,1151622847,1625895461,1705369355,926697475,962933605,1940963948,625051299,930449679,1837564542,1723075022,1250149546,929074263,1275395751,423101918,171246656,1660662886,1930142347,1688897030,366427882,2113555796,698511892,67431586,1780111850,1375621457,100758128,1504821659,1201829853,247396049,444215096,36759470,140598392,70513117,1958323586,1233957469,1242210490,601913018,2009513814,62578362,1597248734,1664250734,1310583060,1332464741,1492599900,200096298,1716527093,1077200390,906396478,1705796482,2061064135,651850020,413931111,1821520711,1175004310,1047515595,37807696,150920113,1189160473,2125357125,1196388815,1748632108,1918605930,501459037,1746362574,1578670427,941233953,457228979,658046216,1785119371,895426562,627476874,1971860773,438349987,1903346917,1740594220,1588105562,339754939,1619962086,1670188507,698184601,1761806098,1113811553,518305927,1049835410,648649568,1228435912,1200114306,1416969557,439836665,554273291,458754389,489222546,1594798551,137228850,363493733,1726587099,1450651438,186968804,1309065129,1720432012,49694291,1051956501,1146827980,145241422,623265786,2076974418,2003569701,436957696,1892260684,262751504,78612019,1957180973,2018856927,2085637265,1437905903,301851199,57993500,468583304,1857922181,119628127,1233167616,928410335,1706119739,1692917571,1703565253,1222027035,201880494,873949833,1355609556,1590528452,430288373,577522970,697924565,1548255371,104483023,951393482,1662685054,1671737224,338987306,455689776,831163397,933993949,1562653759,1882800031,1488938266,34341903,260881423,624213513,2052521551,1307335137,71889998,17716578,441717491,795561768,99607997,284211765,46713095,1704270452,1112873557,652649255,1638185023,806358545,496351174,66806826,1289653191,1648826337,1567288561,1471051543,156655946,1742992105,53349989,1847749532,2020364800,1741516363,550206519,1422820576,1925694071,667270369,982463892,584954024,905988268,1499334116,1746077591,306257966,385824031,1744348653,335370289,829021806,12467533,1790360244,919084255,1730016721,2006715498,586590719,1884118822,674228667,1321649722,2110568237,1534870422,2059343546,1442337874,1946679155,1896365000,1944149752,562856268,112480979,1052576803,186677189,1770793553,6182309,873012501,2006638809,1628049789,196049937,1695072883,1061592626,1472959678,2071602865,262415813,243051487,1029389536,60561557,1379667943,1052353734,638655139,541982810,431915131,832868669,1934046072,1955563499,500981162,1502607827,1980641985,702430238,566380722,1648395615,92255803,1094161960,399525578,1568562427,1476135849,606596662,937174812,493868333,1840685639,900049950,1191922978,773147308,1199349998,1966887928,753931403,1889717884,1409796251,430618549,1317464619,324943444,124568121,1893767396,1939893598,1251098064,2029328416,889921728,1498050992,905497090,1379128779,723569143,120683787,2102447965,50823416,1813962565,1225384490,31874592,1070843339,1342266971,1383152419,1437284006,1621409316,104155231,1315801203,199849508,863229818,40423254,1958928317,560299910,2069376580,1034399992,808811116,291030714,2028250188,873715229,251352380,53902813,1455099602,2029617296,1784577107,1585285834,140851421,1811745354,1629886567,109673585,612159447,1813202051,363247327,537009289,2000013374,419851404,1295569894,203665470,1198345574,495832384,272930777,1150014161,790062493,69539488,1505498322,277131798,65516032,1918763884,2030848356,258642248,825892940,1160272891,1612804802,73579273,897202915,639635373,1671857608,179422757,1067999915,1307137522,1331853495,944117211,298407706,1619419264,938436731,139950739,1398195426,2032096231,1912939649,809396815,12394659,464572191,1273805753,210234880,1615325037,44734693,1501580017,56869658,1194041849,871621147,1484210563,864534234,294314890,2014288453,1389405024,860268356,2049828339,1405284389,1129628404,633422320,421539904,1172479271,647891454,989900520,976053706,910488316,412615265,360120708,1689716885,1604593801,269370654,1602592085,2125092421,906638483,1657073707,560941612,301672823,891618815,2109388182,115716507,1302685341,1342084879,1324350439,134848901,1350384404,1805648783,1928108365,1109690829,1348411890,2015397656,2119916498,1637263990,255159915,912834358,731305316,255024684,1845746373,652140544,1213912028,533597424,1969377587,933258361,618331525,711724034,76303011,1397381534,217174884,1632546959,329173008,843009324,1513286146,950822151,275703959,1267991421,701802694,999746156,1882350746,1727207562,140484243,1338927717,1664524862,1372015790,588115034,226202896,1691212295,797164076,1217724884,1150526357,23672165,1659237812,2036904792,447775539,363761438,75427514,1827520917,2012170607,16294956,197129009,124142605,861029896,241048873,1480852458,1857609360,2068007735,1934830791,1832688903,726252650,1126764415,545336629,819588107,361002322,570722267,191440150,1728100576,631235157,1551343834,751491488,1342419528,200466020,1183508331,9876106,1041507748,625083810,727181751,978172181,1091181419,1008368589,937066588,34970029,968457382,823836920,2099493244,68464663,2053959178,2063813335,1070823673,421867012,1314163191,1648295581,2106913675,1587992291,43412022,1917791091,274167534,1655561540,753672353,1624534354,680142338,1743141923,1941275212,1167782953,1940551205,1796390954,963359057,1566571381,858661639,165650743,1128547465,2098725993,2012183188,380283385,2005209949,1804069572,889255640,772770727,154596897,643610949,559405593,34148882,876130262,938793942,1790950803,1752548399,322709921,327207485,909521702,1730270998,1574807160,1852403567,897609189,1369040844,796371076,1050590564,1860491511,861373414,1510581030,937628188,1236002066,2084396853,1215583383,365261280,796166599,14829607,2094630246,1658939079,1110709592,741002836,111475627,759416308,554979624,242617693,871326131,633823351,83221284,238811625,502477155,371900407,821996350,1942294989,565286024,1456240113,1430318714,1903698585,2049035415,1012545126,390047309,195269913,1988934736,63348426,618808759,792219396,1180082782,1203266475,1907222450,592620473,2103968024,904843456,1468820558,621943761,889978354,1582293003,855318109,1547643825,1408445765,1863699118,2041867017,1259606968,1320816866,1871748865,1594601913,275742724,356148602,1954992885,1783324149,1708547950,1917922821,1663390972,1352913231,302321575,881453412,926745322,189123198,720300661,1873287436,1009886679,1952145653,1855485189,1963601409,1932065889,265926630,2129124517,1898019221,1986211094,1925899345,86548014,712353383,1581435766,44283562,1930036252,216350103,1074866506,1248764811,786196258,874614614,1397242887,1380711700,734974515,449278862,740722364,605149404,2004013366,552072561,1932813820,837485363,1048588303,43346065,1827190318,1845762646,636206166,1961740027,372574385,30456200,841098845,1384949664,1748689738,1393396333,725363969,1309312997,120502595,1754895772,1368353348,1692650479,1546370041,70689782,232716650,1239328653,45525468,1960101634,450896044,1082163675,1159607786,1292797518,1215256085,624686546,417965240,1095080873,436321236,8668247,1014564975,1496437487,1464613268,1496791730,186868629,1472601857,1441541894,272994541,2123114894,674170508,1385250709,1637373386,1503691270,678632976,1037450824,199943985,1566359182,408370280,195464574,1888103945,1836008881,866106478,351132779,1240119414,1514515237,1681105451,2130028750,1343588588,807757965,1144753518,2019781123,628306909,1397812060,1072621317,1276708569,756556213,1848121970,1553539047,916185939,394918094,1616533416,1093387910,1336168777,1454672954,162263123,740840817,2077453439,1481760570,2009207603,1298988720,363754063,21359206,390714112,997519353,2066659934,1813595617,784723473,1367897153,1020275613,419627419,1177253680,942493191,1816074219,754870992,1726967261,1263492092,1545029445,1058668650,45441444,107641875,1421833037,1142957303,289404023,1412204434,1889503560,1834553430,729094576,163091662,196281687,1466857300,1735615059,527083062,661925272,1943335168,1895193259,880818657,1869598326,923444771,829683313,355130569,1230798392,2056255714,1387221064,1672557414,1127700316,495891483,2042784153,719254809,567732857,1676407943,728405102,1278988047,144029032,1708572294,1478296474,1284420254,1139644370,2101766301,375159586,1063366673,845744218,1160157403,898408875,244172058,1636501516,1652550497,1441020886,510431969,451627115,1001088181,810724175,803952344,2093758642,639997673,2076504694,548800862,23114030,1882863464,1665427688,1747656221,2130016189,1949711064,1144166378,946912648,291031348,2011666448,1967346001,1003734559,815650114,1051473616,1624747182,2067469818,1764259097,206704372,954547210,1097434964,1044108055,786484616,892645951,775541593,1414717553,673472669,2116791530,286374041,1876372704,1014327522,1549424821,175729879,839146699,1862386942,24056667,1830933656,1841889182,732850017,1216885557,1676610138,536276469,308506058,2051521783,1336008771,319210999,1437255994,1740775157,992624164,886152506,1793595818,1118777296,528731932,1258177245,1534891322,1007784674,551581418,970259715,1372900346,143940667,531382363,21754903,201866194,287851162,2098796100,82658090,644465265,81299479,1003410749,1438840821,992751848,1874587105,1893424455,1215565851,467501741,2010420136,579474071,962830572,1946695881,962342089,1890018519,1714897881,830607005,1316153639,1985598207,756778497,1052215238,921875958,273650063,913329036,261400887,582210620,898639105,2071931208,1598316637,2071261501,408887560,462635397,969174845,656267945,223364544,1410822414,1610549641,480110488,2060823381,625026019,411496553,709086679,861129307,1625084457,908437535,196228620,856107888,620054619,1689934678,1595605381,825167584,1126210882,8828868,117325973,2115767063,1527241705,2026693490,478613027,1815054123,1886239180,1282909807,49390696,92515804,900717920,1454990662,1947645265,2065589470,1148729038,1280065309,1604324094,2075460285,133053830,1886876506,1091729906,1588322533,589567180,645472630,688516190,118427691,1668639473,1553875128,1568816159,1417122164,172234931,644028212,422677092,397494402,1331353912,1835915516,211718955,1465065241,2027085916,555160241,1068479561,1397076989,517630827,1168931735,1001561995,1120948616,859720190,690583723,574205762,1203787991,1291301862,282795377,1609348786,175407808,1810107984,1105435152,1460802229,1786545391,2128977894,1981511885,470781654,1113876188,1934573337,1792061730,748423816,1783998765,251410500,380723125,654640866,741649691,1433395331,1312926477,1588736424,1838048475,177827120,1496028147,1647948868,213759181,2076562197,547886241,1573002114,471710547,1708118026,1274692297,900586673,662146282,1797296512,1501491430,1836021014,437234009,184849100,1550788313,1323717729,1257231082,283719871,992686908,1476602481,2057476376,1291671862,437937351,827962152,498982041,779757645,379892073,272257406,1481261968,1603990466,28757607,1158563899,1200617653,1329293527,1369573523,2013577252,490805950,724313109,897506848,569897858,464816614,334947586,1188701206,941414056,362656727,1686011710,1371804134,1639464818,1722458577,102769448,51564595,613425411,730401808,1672169619,1642002995,228760457,656209833,512386795,872971466,1371099184,1002399600,1560041765,1233846541,1240059862,279472237,1282483313,335401589,559840553,1682541337,267573328,2087936877,1591297355,50370596,102044403,1242831355,959761558,1857490155,1199577678,689517633,1639203563,902888136,46279124,539565917,1196435644,901307389,1839305441,876813160,1533213966,1475900603,30645991,91036891,2098754405,1948207757,1058537178,311008850,1997460650,184934854,418918376,689121303,1414747686,1506123327,1119669508,1819084716,782219549,1568858913,1779728840,1109006330,1320787757,905240387,297869988,529637292,77419500,71473891,470226115,239291533,1002763102,1098959139,944354574,1825637660,973225692,1676140792,1168723914,2037480426,1962270489,797184718,673703822,2014756032,740655288,1633325038,2044455317,1267336800,1270356159,189400990,1777615902,424802498,339422283,1354133331,524395111,1394108320,86241217,1530833936,1986580676,24186418,1734490497,1087965167,631762822,295864897,735571313,731918885,1921653601,967384757,1748908325,908474737,352338009,1858092868,105852967,114043987,1561035547,529067068,575165357,1449118326,2087955263,439453944,595509625,1221264460,359040984,539421127,1145055044,2009153933,524596127,638706491,341891237,310596277,516159169,1843096316,1766484706,1719494390,1164511913,1723215913,1526566277,188431080,1353289632,1939660113,620858629,1126610197,2102191221,1496405460,635951327,936399129,1244350728,1686331075,1554222168,107704945,647616308,801269168,1394142752,1208077592,1055379275,1687921866,2042519379,1623470605,1866765344,72889716,1016634410,596119891,871970429,1783327433,121782767,1921931438,603754930,301896367,236033155,1446252675,1391847681,1633790016,1552976099,1157273308,146473351,2119578454,925572304,1808679935,466005996,914420948,244168318,921835337,709996733,865295827,153563272,410864507,1271072807,945620468,2070770940,850175414,188859112,112877802,2093056735,401741882,1451829104,1692571495,1100826293,803004373,1974448126,1340425453,1876711334,22386349,1207101896,788597125,909021203,599307090,1120121298,310059418,1483348438,1755478069,1836926426,214210261,865588135,1926164716,2097418607,32684767,879553515,1032497350,626437366,1822054781,1402141975,646506165,1203572692,2114979487,1542119100,2035152665,579526944,52664363,1601308565,573317321,1820976766,263845271,532409024,768101508,934280829,1319727690,1269757041,415174089,2011390154,2119104609,1104609980,385420114,1738664347,1131690541,291393634,1153922385,920626042,1399665036,151264740,1660670349,366176048,2120128584,453564714,125801978,1069579687,495569541,1848696815,756228500,1322732094,445340776,1745709568,1077994543,1058260288,1874708596,1114751722,1229078498,429303387,1203296171,1585714476,1127189377,1533050730,1036428565,692608549,29001499,1681032814,1397212038,233864375,804218068,777850016,304558917,1883947027,1041467564,1372732451,756416729,122400486,412966751,919782824,1842273632,2105517502,2027138683,701475640,1236754621,957155028,943821008,1011447984,2088840827,963997280,1560497221,1774639237,1031066158,2042006367,474419540,1632370538,187502637,1197051021,1246496229,2055586037,1269134663,2024684781,871712301,297608627,176002656,273160786,698142109,597836910,1330575883,1764481215,1749949365,138087989,1435971270,1668251124,482436336,1029595271,340926475,1778796672,2130244958,461158329,1043363847,1196662877,2115481483,1634007953,1715663434,1975446274,857637413,355711115,828975398,82639853,682463572,1596623332,645244182,1636511525,1900495840,1902782233,1082134702,1471608666,1973632598,2102483639,205715476,2009531332,300278730,1213757771,77217425,1000082652,1926134136,1375745711,1663185980,1083479504,396627208,1929579995,1567242943,1973018764,1449445745,328804568,153686861,1460092024,503894068,501156633,1609430594,351852075,1504082783,1239944894,1759616669,571631263,39391191,514614667,1350338901,1970617580,67720747,1683051749,2009122346,597972595,938395570,1951309735,1883461662,1767583206,462487239,1607301168,1872813613,1854746585,1256690665,1815987827,1404777953,40397302,467012977,1559750266,1139165280,451932607,1829463247,1553054583,1611685255,1047324875,1350541006,1149759594,1666122390,737066005,1916286598,285988922,1262638542,1377362449,1795685325,1539063499,854689089,1954440325,647108703,1114907653,214121393,1921934533,256164420,831944842,1352578824,365250270,1449135007,181683611,1308479146,1460868069,2001890184,2076024737,652325065,1558908143,172197197,1048040945,2042974757,1852774543,1177985978,79797828,2095384640,1046291083,869248579,1400418736,367697153,147213824,533579133,1193021403,1650608058,924174902,1611571936,1342298762,673776941,1021147863,1011228818,1509070617,351048848,301045672,2092388216,123000019,1259441792,192054221,725563007,1381164231,231711914,1090511981,534174994,647468313,1832241999,1183635101,824739804,1242957600,179650237,483442955,489978970,721246805,1020342017,720195938,1756052031,1701520945,1907591175,720551708,1625841954,1801644014,793891809,1838754989,1874472982,2011263772,815936895,1297259853,995567309,1243835352,1765640551,1691257134,778586799,1397803420,876097964,1279879850,8088594,534530045,1436762820,128436897,1196612431,1707112305,1653196067,858064194,739130764,1281973592,126351163,866404723,6095265,730021316,1589681972,1956675816,180852171,18266504,1914892636,1639412828,1177861880,336693528,161477267,1665617354,161269121,1127754150,446822406,1193173952,103589195,668995312,1452568234,2018885818,1414176913,1991984114,1143450720,20844732,228376410,2017142017,47713086,1572423664,1470743736,2057045682,339402985,689270507,1119410167,1694261902,193538112,791208565,304027789,2002605347,1668134220,100026362,1822452610,2066240756,894820094,1812911039,666166948,979820313,1821111399,1110505684,1083080301,145540667,1180316555,2022119945,642853434,275149911,2130703788,1997264875,1239658229,832856855,1076203003,46618920,2004416998,1856769811,2015113088,687085679,848345575,1510995939,1012987126,1881319394,1335190894,796026341,287105374,977168995,1848916511,1560972822,1218502802,1787065908,1205705002,1831871932,787530883,488050279,2086132139,993847446,496463818,431565431,422064017,1582053790,174863390,410126827,1284690157,1973301364,46393587,192182713,381817654,921879765,169605925,1804798345,1557157933,837147639,439556473,1425062793,73347995,1947664268,905071147,1181128368,1599649014,1776904595,601628020,1885906132,1334801057,898680697,528674667,1846286292,2104611105,505327104,361798432,250358968,1685284093,554372070,1842163771,342545746,1837016351,989245391,2110532264,334624983,853964444,2112709489,1550202975,1609111461,276551508,1680733885,2109729631,842882422,476811729,1339886886,490317142,1124813877,318044428,58755367,1752037044,1085736201,1278892586,300774495,2024829470,2124079484,671582278,1765532257,1479993053,1133132636,979082902,587961714,1953983241,864143137,13691730,66298027,1980350204,1356767153,1349052108,2064128491,1205909594,351310553,1152922311,2099253147,1718427123,519053046,1161282958,911136098,807978591,1229262639,771480414,1414380265,1711814388,1302040835,96939774,1797088383,606429557,1549120610,382791821,982710435,1325838431,1461711095,765897695,986669029,132779228,1180432509,1156747982,38459175,876423068,249133791,858150248,2073964173,1911029942,1625338409,1455862918,2076402566,1074350565,953070751,155542461,1291846162,351679894,235986805,51563009,943395345,114770362,1785821901,831361028,1895111,1739504623,82760582,1739807416,369102422,1793988968,403697004,1542413938,1986274421,1111378145,2031192553,1786829263,397629977,2083675437,673302405,1282236861,1945106456,224900999,514203987,1981815679,1617879544,1142732814,1503681410,305747002,886107261,53942705,1707760717,178724174,1748554999,1914733622,1719070969,1303395910,987316203,884377,1106281430,1271310927,1027877767,1781651590,107870187,1483777582,1216961714,1488727866,784692418,601515994,832306245,513522096,215195823,1174851819,774394866,1000265681,1005088513,2005474627,1662690865,2087034124,861532745,1161094650,460669999,988243469,837104152,1098578245,566067803,1542845618,1236336280,824731577,209712371,1331394092,904102793,92974948,1110349404,1831158597,947604498,1306402529,1747278344,603367825,270774194,468684705,2050154114,977455418,539770408,725302547,763166376,1265573906,1098426048,1667944444,928094865,1334638425,826981793,482109568,1440363783,1247655555,788681939,999853906,745389842,2036483856,1752749409,533761509,1940294561,374695075,980689814,784465644,1629838257,920310150,1595617853,1255794481,1228898593,1848447504,1165140075,1847165875,1857226888,486123801,253524879,739073047,1809776222,501968229,1060303600,904540152,1387877706,1918866524,165982856,76890365,1335093400,16748210,1792960065,1499578722,1242947358,1513722193,748262097,528419302,684198592,1966554849,1949238881,1741843481,664647446,598689635,687857424,664584859,328770197,1288708253,1332166343,1212549016,382311052,483280724,805072546,1096262179,100386886,472562947,1362509732,1462334161,1581285022,176440263,2087211239,439053232,1928197510,1129253563,1607669790,1747172370,363653656,247883963,138275383,165741082,946941473,1425641736,98522077,1639221915,902951718,358046886,1797644452,1455303457,150620677,1295629986,73631622,1819103547,87477451,41750688,1106099988,1740577997,680037587,1618966850,1924896848,178516149,872489326,1866787569,1875564287,1679906636,1760361705,2115618270,349143003,455167025,216993359,1531415822,1805956322,1625757991,1461083948,977083082,1691755836,852212807,1227385883,539013500,908761423,2091307295,2127767320,1204929001,1496856090,1373470890,932435055,1466734830,29336367,1438689648,1974032852,1880113300,1537332843,1030255165,1575162185,489414397,329210948,1233081516,2106463370,2035672049,2125644907,758494926,1919252323,1582211356,1880888460,188951150,339653478,1949294119,1455836766,2050806390,1446146947,1750072353,534413713,820311128,2110560981,1910757372,318677788,747028014,500834815,1074573302,1598138078,976795639,1610992515,777396775,1048834624,1048698018,686891489,201818004,266284377,406822134,751440718,1745746935,1494727441,927995326,1749719494,734347735,653550288,992586350,623526212,729376193,1819005014,23154310,1414815979,1916564396,1973525076,1695511707,780609485,365059090,608872932,1782203414,1927891462,699223667,1494892417,1370918990,1462816806,1081327011,1463718525,793530188,734555937,1218832258,842171465,1964472498,1318169237,943655105,1937258074,2117147375,203074113,1450775516,1300255916,654468228,1856722644,170765272,754509818,1388626098,1720703844,40468680,895767165,1374346011,763108912,368858406,1151095408,1120571617,573340551,1273069326,2089352098,1649557223,377059142,752735617,1741006651,1098641437,1194533963,394815166,387028620,783883113,690074084,41620456,1839331040,257835148,646918462,400810604,1189095732,1155876263,1429166096,1430274939,537098092,510829655,1412168677,1333953117,75790542,965208315,434163142,1144952777,1008829384,76023605,1932544008,1269777510,1511854076,773187304,1550531552,346503084,1218649575,340187775,772928639,1752508845,1507407833,985174292,2097238608,1781584187,211543766,923812142,1824714016,1694542068,52531412,1823381770,174252416,1195735171,887944006,589079779,1468585586,328702035,1532891142,1741723010,1518019167,1594052183,69070656,1752437964,1150297175,783144284,1826044835,948599233,1509844909,397727166,500017151,902563917,1002963793,1814339701,1744816721,1509208483,2049807744,1005948795,982057446,60544574,1033557802,51774174,1596044493,293773610,425848496,2099299655,2086019284,1030900865,244426887,1457253969,1460055317,1873652923,921422825,1078117380,1015515261,1816988260,1106812430,1501804337,1955731468,1860292518,1847094863,1450093056,215068813,459667580,808554331,1853643361,1746390450,646287299,859352247,1716648631,173390665,1185306314,336059763,271705278,1026738293,1552045099,296036775,1032282673,1527731573,460055321,515359628,1786283509,481472590,30860923,1640076777,233976346,1683590958,706702908,1923419830,2114401514,692270326,1739164534,60751441,181440732,1184819888,761164036,945232225,761021416,539050741,1580341215,1693225728,91485571,943808492,1562779246,996800974,906303120,508883605,639829291,149063281,386885624,252867078,1849981596,1082045328,321896150,79490231,1301411326,1415982442,209811501,793699125,585752562,2118879901,1615092149,635977083,1911727502,690652266,76187914,2051643126,1401235971,551040105,1057096043,659886919,1318522987,1835143030,1360464289,1782778720,219872213,1378835429,99978211,1617168653,642120246,599933360,1669878985,482073754,1425045396,991386190,523552184,2082845825,467989879,1101053057,2111287332,1263693598,1845321675,2030752157,1315547144,554724327,397026356,1324204348,1128070781,319081715,98013595,855372077,605116635,929751826,1649170259,1185491819,248223264,1425074587,2056341218,20550658,663704625,1917726240,2072723485,1212829453,901062670,1908305230,951206996,249187129,536360894,1197311661,1172452987,1294737986,1722923408,1505075019,1998998557,1530311477,778086310,1740037896,1487362234,2151661,353367476,1026847701,256666880,1173185188,1291000370,612459026,1781871297,1537800697,2055434228,1266826496,2072913127,349059906,1519512120,1102296980,1589335478,1345984572,1727353331,2054625628,2110208877,1214666741,1178528403,1358015226,959471080,49503093,1109630162,330034098,1096745345,1440384362,869750956,1828943676,15791572,1369036309,757432293,1905849725,187991919,1656833884,1474507355,1239236385,855510274,2046280890,1979066967,953031189,2061396909,268118872,733015854,1429352902,1663315462,517388561,1620592081,1825590476,1583327662,1262984643,334052623,2037337141,1193713261,1301953920,1611732670,753114976,144736460,1612900118,808015235,487443760,2100232714,1883827319,1560626335,1625576406,110498736,1034760190,1962494564,611682394,1189077058,661942376,1299372373,361943821,1576232369,739306538,887100921,348556456,276855634,1409363829,315316607,1032631115,1609124381,820417279,1685609726,1984679028,2002693773,824866934,70374091,1032507895,1597485293,1359240918,326026193,391184714,141119776,1171492491,1535800916,238379252,1872806580,142949595,1818819163,508678799,192485487,1822879702,690296665,452954612,2122149482,678993239,1277576993,1215865440,1598159065,1842853108,1636652885,614944047,1428823899,831294678,381307721,1684943937,1463354365,1669177695,616247284,878515473,142338502,2079598426,1154319953,2056085492,1283869084,2053254732,1488241883,1262926701,679854044,522596515,1664078331,2061770327,1754354218,885589002,1389304290,65186515,207778055,252219812,280887299,1380437652,893820245,156222080,1807559511,1200146811,528695338,122242029,1995538067,495722433,794905635,371977932,419581654,1840062302,1084915183,1235711024,1288664771,1979802343,1303135537,1951745242,179873832,283054498,1575085685,1009006505,1910090459,405173102,1475575128,1689161979,1034146760,1918036387,95718807,1190464907,468768102,1025382808,152852901,1764557138,593927390,2090994680,869522622,1736059351,174837190,1550920323,1637177206,1501621231,854112042,1646622032,1545533141,1327984831,959765257,848765109,1938962868,2032059992,875992690,453293910,1394560931,1827462231,566021187,687117557,234592977,921307833,1821302642,851080681,424110531,1023341222,1781769261,157039202,515641932,1824945596,1807921116,438550967,1704932898,1203300713,1069877151,822926861,633183361,1494848937,557007174,852147348,1221349655,1198855818,2013049341,1343996106,1753224254,891560861,2061882310,1517935358,1303710106,1913935052,1342788277,1988954737,22074484,1131361941,1324716549,777715053,531448888,615162201,1884720725,300731313,543593567,1859200070,996038123,1023320856,1184939172,717687081,395944333,252893202,1783976495,1192680679,379691396,1995682471,1009150322,206850173,1502206603,1112939524,1840748023,38875802,700189528,50187019,1305518086,1383807427,1454138698,1581032416,1916671319,1369568115,528951109,1329242290,82458803,251726079,2108257235,376293824,1167675166,673859889,1742176450,1768644659,507160630,1784513016,1253467253,917174258,1408032699,1801420484,864179969,718269959,2110971865,797556747,84043789,1175067340,1210818053,1564760592,309269463,1802085745,1216199731,139638857,1632152284,1701213114,1726275571,1937251141,455775740,882941359,1474474574,1372060812,1589277436,1069851697,1190644145,386533580,418695520,857590861,1917360062,517945558,1680971095,577003915,1520831981,1831487626,134059797,1462156561,1101878494,1087062993,2119644079,579534402,598937794,1176169593,618175490,147524521,1946587232,1532642445,1156060684,1265363461,955611020,1003162079,1187320812,1952487252,1386429051,1145409777,856756378,84936633,1423711955,533792811,483386458,1910336395,612551624,75403307,784432638,1236651447,877167305,1517866122,1086873534,774103890,830062856,365476266,138888326,1135214258,79708763,1170233358,678272000,1628190719,546023667,332417240,1027821823,1795011998,922782478,121264618,1863815026,1604880406,780927172,1488067176,466696685,1897031017,639114960,1443981834,1919960409,34267267,161839535,1579350318,270988292,968784337,1088796358,1735762058,2075501839,2121649613,361467653,726660137,1167529635,1905593267,540856417,579951854,1035871572,614411612,231819128,1725763779,406223623,1357398595,483328423,998670841,1737464030,379425440,62901152,240328260,967384795,1015786855,92268288,1597853664,101153362,1015991775,1224081471,1301347246,1744481745,970136805,2069418727,1715582772,784108033,1597517877,1929805615,589430112,1188601621,1612564882,382590219,155502508,1878188353,1636511492,427911954,1303563840,1708702591,1654902635,726199364,135372989,379348065,742565691,549849369,1686204975,760248497,801938953,234699494,1817825957,1807776755,168036917,363754834,1716833971,617499243,1971633574,628366583,158912458,1779680710,676212774,310099867,1857291372,837053606,1138552797,1186782207,626164173,1722827281,387148576,1787350517,1811133235,1301234527,1822499449,1335503324,1787560610,358322507,694603730,759712465,833623709,1586535848,227945618,1550828026,825575955,1025808346,1521202006,222352131,1910246103,1907191723,1927279390,33085602,1644443050,1714934051,786273178,383396622,611340337,597340792,1342069493,1825644292,1160161162,1439279107,1644792163,967489002,758719543,442534374,1519537962,111978856,2086092998,365403330,564856808,391120167,1851212799,486226320,1088554273,437183980,785279367,1057155930,141685832,1163092804,1848271056,290750273,775145022,661777635,334781406,1209942513,1318561498,1526220346,446301986,16731859,1231844003,385121329,1340334660,1961602988,614964360,1525428100,1584108259,742515890,877520265,204142377,1051287736,1230376385,251164159,638761350,1998508885,112027238,2034199415,6097546,1527574443,1026657558,1204933980,863688319,754241529,2091758247,1121836593,885214301,1322512815,1664005964,1444552732,297578046,1769953894,1561406233,819390286,1689650736,1976058883,335567062,1170465508,1247557071,1722310245,2053226425,391815894,389877719,553743970,1036403373,222119532,129771158,1287554038,1525278102,1270523253,2101294230,1860055117,101070519,452372174,1200211239,1069895486,208628947,2025742523,1746064325,136214679,1358688612,1960006422,532499203,1919187589,175466253,1526108533,966634909,1707084223,1320350156,1033541223,353036314,1413694674,1721037415,1299688979,990705942,1680632779,861442575,1373112470,2124712363,1848359714,1963490692,1298627840,821708978,2002659654,1042832723,430393822,646603962,694159841,196694969,1629897064,771587258,1943642806,1648913575,91989049,1426085750,1306330874,1081950690,1716220660,1236895171,1409905277,201515237,409508724,799441061,1171122650,1557896008,1857055444,338013202,1154497797,319080295,568409466,1570435027,997569045,1755572645,1444042477,656491662,956069194,1971825676,725060604,60594272,31970924,486065095,2116412771,1483866930,1920832147,773606950,1243723547,657800416,2018488487,996173044,1225060808,422977782,528394244,1582736424,1305860705,1687984410,840041527,1475411994,1172514195,1586972649,1516276763,2039767268,1452218287,759459373,1336483255,1673683211,683628306,1303847353,111251818,1373107289,1500911079,881189499,803216453,791455020,1557084662,1562710037,1770189129,1838383270,1420098521,1586382531,636308033,741685768,338112157,1659113525,926128284,1578421076,2123434305,1263804180,2081231238,84427245,1256321944,140711494,56224953,175582824,1085354450,1344736105,1685567300,983026277,1130673109,120630427,481491313,790278645,1632579738,1099268127,312104101,924906797,527697062,804798297,2017279243,1695707485,1520054939,267213214,1953807301,622905051,201132849,689314856,961109139,1927870292,1435151857,394341151,2026395399,230401086,444591545,716998418,1536827992,1618570049,1465595113,480935865,1556624977,1673864128,2105935997,676475713,1730940776,1779382328,2058697595,950916480,311067462,1772469497,656242740,1378494957,481605802,1403988603,986414063,705170389,1083427365,1766579605,1732528562,578660493,701995233,1210187698,597180146,475156224,938145770,1382605274,267471740,424706923,1512640235,695747230,1122934068,71538115,1927225980,232751930,102778882,829029072,2428638,1101240584,712748607,931581855,547901847,508161604,1041707341,1667360561,321448398,1500948270,370929962,1581549185,538935378,1387531253,1434975172,1277549728,14046065,967674609,1634454765,410090812,442607996,828939207,1655067234,1493151655,174000704,2083939210,1067113074,587853631,1288523248,1825409202,528644671,2061099007,944608244,2081411670,322495449,460810172,1012986259,1492789368,1290844989,22039194,1952622372,279700465,878500365,79063630,1263502408,700086842,107400382,8937745,1606868500,2008136524,1289308705,1366422353,1411738676,676084449,1989627606,992378219,741824574,1615986969,1973033701,1826162663,1864036882,466253242,1458453768,1355009646,2113568751,609787141,1454490635,95930052,1607522867,1724816992,2093239785,584769127,224315800,164447121,1438185070,774787912,139032532,1664000856,1169658028,774855912,937312157,1828543071,610248445,1922379659,928900467,495344921,2009793459,1865609613,784139082,597153353,1640152710,774333844,282508980,462454233,20766408,278025481,2087637928,1977981374,1938448687,654785791,1456641970,1902555533,821063067,2025847057,334348768,1743813468,697195966,717173984,2057908265,170387112,875080113,617101415,867090212,747793718,19597618,1269884728,327274088,1452818178,889511273,1719143717,124535450,944388702,222971927,238596318,1366536783,1016107478,1053983434,224374903,2000926809,624153039,1222225482,514981461,312672544,488309469,615604313,1622593213,1179602496,1529284391,1314684823,5630694,1706547342,1687317469,1967074714,1668974961,1316389711,473184203,799800028,673882247,627823320,1426443729,993683842,1848995382,2124163098,107735734,766829415,1814845910,1946828264,596127689,2009111258,1785132942,1376514079,1756525906,1356528556,199124615,695162210,911298310,952573895,461070082,1843003192,1750191462,65386358,21471712,346247016,165432858,1615822205,38882254,805953353,126803748,1838395396,1202608995,1920441930,1171653017,181145705,1900543380,115254196,2079475682,85457476,582190802,1635259651,1001204678,147712301,1229425368,1521401607,1480348845,1745841615,2025160954,1833114104,300644272,81883741,479363249,1168391676,365294163,1797500801,260118969,444577380,194614556,1637403660,1199193654,1807685002,1673788317,1251115096,1860582358,1710749626,348634558,1865490275,79268951,407078304,701555131,519065890,353473048,974917995,1012873536,28449047,1046648864,758107203,975343160,155044906,1590257314,307062566,2068922191,657352869,206055568,57353493,1930740087,1497099405,658110873,1109402849,1967891576,1415311975,1143543811,1377895590,1552526374,1567244581,598183349,1137367308,1150579885,754970068,1064008813,2035567144,1764033276,1434084839,1503062597,932937637,274362189,209842495,204184694,2011944851,396191630,691561025,1116797911,471195765,1642269117,852545261,1483025869,1823679912,531748952,344316688,774681561,1107588336,1522247379,368432747,452752300,2089247336,1629420496,1385772776,1512485205,1137263641,519003913,1361952218,1555497671,19714388,1522220399,418739238,743658197,1950278683,1693391254,1158657037,1898508529,1904570119,1076375561,1965163984,1866429081,1682996803,1428054478,705436792,1990792715,1805700455,1183556109,469812785,687692924,1327419299,502664759,1367504772,1166949476,506556907,2019773248,1354181920,1093156515,1547415501,215183810,1671232516,1456241923,1106382021,349711189,1191427981,933402813,1513302915,2113352755,618837719,988913477,311786192,1603019496,468503137,319421277,1938060928,1938702983,132446493,560090883,1543793828,698152543,414663977,81624901,158616127,929020147,1424007663,1651376193,1781969028,953166142,1784273903,1401819151,2044746702,1222517686,1686843344,1484780237,1672302160,393092831,588587987,669909260,880051812,348744267,520063985,1928956436,979838826,1831703235,1221413389,904223961,511788736,130415836,1978044464,247711275,940865596,1176415982,1281304366,1114946848,1087208893,1209419156,1543781146,1089872356,2028770268,1105091679,863383486,1083686147,333226188,11714170,1186799929,151421240,2258998,1576304165,607186063,2062467163,691158903,1719330332,429237029,1837860096,1276799282,789910751,1201150014,1517492929,1257643935,766574510,184221804,619180961,138764586,951048375,891478974,494862534,78496285,494151870,628237674,742200049,350472901,548464825,1186580353,1995165118,1228249778,242073880,943443764,800802007,298663021,1957155451,1364490465,494797807,1073983593,1652826489,381671623,1448214365,1871347302,1186929595,694462590,1434198501,695162688,863377037,604593399,1655637974,1904768223,688048165,590490303,1861616941,330504663,1619327025,368276376,973407275,82126258,593918476,1962411461,808745758,193980424,1306420041,683609126,902674533,1335665005,1653748095,1175597428,811541457,466242809,382013058,510679787,603136753,1730958265,791889119,629186418,509050523,1340768283,2061704023,1823947908,484682755,513168491,1733947152,652773523,1499125809,2013315357,1640451752,1421319690,1574221769,1989950186,1699095399,1509605772,1034094568,860335782,1632142088,1808292052,1171431490,699388813,188528606,1146722531,2110432055,1892026746,1837155142,875892822,1490334421,256702603,2077225495,708445064,1767978530,178961146,892026657,72965009,350439597,665130338,1801677211,284761466,908423156,165820102,425015268,1472603676,103737274,1479848767,1872017059,1332243308,1595365834,41358136,147947391,1404299981,1682215697,412271732,214411341,1943250326,1165160555,1169993196,2070480447,1778990213,1845232701,1126727536,1124619906,671548387,1047218139,260521835,1163957772,104793517,966528027,337351531,2127667776,1103776189,966811699,1286816765,2082744473,1121193299,2079887217,1759207348,737636936,2027944434,505837983,1465114068,1459403462,53267185,815473528,1437207383,1563766256,1433672388,1616144326,2099442533,793117066,389184221,1157559662,863497821,1302704036,1668250760,1336325936,557822207,2074594237,1510365206,1451268625,2002423145,2013886281,26401768,721933205,90956469,73028622,1944248683,544826082,84514566,244357363,1492639780,883848644,704053899,2111373038,854477515,1244251170,1516684270,1691875553,2085620098,1344231514,1296162694,89494933,706432360,1094991265,676564687,433396440,978515364,16750766,135070873,1962779155,394286194,608105624,125017256,809574333,330491631,2033381958,1542068925,1595618153,1460889068,1775228065,691722553,1320190392,1465985866,342662399,1512745766,1406446297,1907801589,82892447,1484454980,770053308,1148001289,1380871172,1346685991,359434631,1262610459,1879060955,89418600,551636251,287023325,996662460,1252942822,1666021743,1815912336,597184056,507034250,890138331,944654495,554028452,1193035905,242947340,1559177174,590998119,1231842505,776123205,1058398760,1373711749,2010819223,1290733580,1779824168,185282960,1585481774,990992498,616835749,1226229637,1576441636,677073968,1692948556,787917080,1935256115,838642746,808361157,1108189392,1535303203,748974529,839849663,823982089,233576176,1708024917,831561699,1654062984,1560962377,725532583,1190571646,2120633482,1177125014,1589759954,1580131356,276755880,1638292454,2067728447,1018024625,1168827758,293640538,338888792,1103897413,821294491,2032347633,1290672643,987894201,1053797084,634617218,1180339916,748915962,923778323,640098225,1846136273,1594146663,314267852,584871231,425914775,420209236,489734101,248511721,1493925123,1859249139,3309384,498966355,2041390452,367860444,2081452233,1033709208,1538673337,474595583,2032848720,270914181,227796417,604123238,702358503,2077609690,458353130,1175068162,233606292,1795856038,1214201981,1487757684,1303317753,825736724,1527275397,1108803705,607948222,1480270601,1786310105,714741980,1815463874,900768239,827853502,1125600681,1027774452,828747895,40049941,734864704,806677910,109762584,1383037855,1097841848,1662570317,1690034021,689197132,995313221,1193389566,2028289243,1717726495,686087091,288640749,894348204,2124467268,272139267,907571410,1139997329,522236294,971128612,682636139,496123498,266508708,505472477,2036648829,1234726024,1182818313,1096300518,499679890,581439778,426029787,646722309,110017715,600073122,676037688,61612772,2029396284,1444268625,1866872087,924517568,1714910706,1953424076,324555355,58321346,2072365377,2060085696,1792553261,1499463303,440921090,1278113356,129493644,952558156,1008138048,1529630356,1136944301,1208433745,1007922841,947918968,1270013193,200636939,1072392545,428850800,45160640,316857594,1104624188,1128827138,708199038,1371501670,1595811254,1158221696,451272301,875815671,1953783494,796475226,1307767867,1462125149,772302328,1311167093,769808545,722782050,1088576359,155714264,1956860068,145830562,285230973,1158454962,944892469,986406400,1354384832,501865393,324983448,1094963943,1803233048,293877220,1865099877,267219492,348874466,2039831640,1613854722,842345649,1052294747,1184127460,1268992198,1490988213,1420977846,562773148,1057568377,1189861848,1185788435,1083920577,827410071,1365421205,1118649100,1703404123,672986818,1553167105,1472704874,737167851,662794403,1688709083,1117367478,511206518,511741585,469008836,1262438946,1838723715,1694817863,1336605740,1639865506,1345043680,1972274384,36643207,1971680915,697995611,1303617877,323270555,148847216,852101852,448658742,1631204143,1729375161,1192907155,610593222,641158570,907326170,953152748,1893352254,1293995618,1447547834,545771764,2084650088,1484524158,276927719,452694693,345464391,207130765,356763837,543534411,1314424900,1640056668,1963644208,1532648760,149473038,1835198020,970623954,138376190,952441807,1115367972,1618996501,447047834,1279773839,977942730,198602945,880117146,1541942628,1589844682,1915284810,227281499,607327115,769641481,967288565,1107525261,772634177,1509969818,1614906307,2129389262,1745037112,831796785,1496896676,890916944,720715971,2071410837,1439617655,1465218642,1448209524,1825854088,2076791280,211528243,173703079,835775542,1040935325,99332184,1663362258,277372276,919754058,1196060100,386101511,1893625210,1714561219,1144959861,1839686314,1559560037,1277994719,1467522233,1180633025,1363186810,169290031,284131236,1604094327,1084088726,1151024028,1885337708,1526110650,968854701,1259569423,297351155,177365766,2053639395,1582268557,1133919800,1581705550,493862907,737953483,501519843,1478210379,206543513,2121863824,1202556220,728083208,51966319,1564344357,1546132588,1186649026,1480122277,1827417339,11763326,1826713981,1302767452,1086673508,1523432229,801513222,208309647,374547197,503681946,1294092906,625062778,1715703950,1060340846,1250684449,1430538266,1046474663,936620823,1253599540,1163053373,42297300,1177939718,734805592,259251657,1497693404,1989030922,636450104,540241586,1259047326,1470520751,464600844,403878723,1006270276,1983903286,435589694,2036681229,25320084,169503940,853451923,1916954813,312959393,569262387,131041109,479579661,1169071626,1080273762,793201387,871927911,1433655398,1762998568,2122435512,1041813281,148218763,1360010959,432283672,1021511093,2017576287,644815875,972564910,2103447522,1309186331,1472827569,1491918450,265319599,1039924641,634671288,723233332,319085582,1805603928,668110747,1772819793,15320675,1929685051,1131661217,994573520,357552283,1160759228,1506138120,1460437194,1975378734,778937862,1808733905,42287139,2083164334,1526238022,117495927,1420297,1134454825,1691114291,619938229,135851688,1053518634,123247817,81841507,968030428,22972415,300803722,1996842192,904955791,1840734943,420851569,1260248302,1596761309,1510779443,593540616,68514392,1857514503,2102280,1246768136,1601043643,677251214,196561985,1764522112,1540161416,377729556,1990326514,264747708,1735839280,1248665489,71312816,114139362,176036958,226285276,511314427,757053176,1657942035,438966197,580347436,1028764792,1296815520,439068963,714313964,1863333858,117494952,99166202,422822775,1861402364,900795240,1162083106,450487194,1711113852,1942890896,968340768,939628534,1491562280,872764008,1916473128,1714127058,1346756061,584186664,1062139690,199597513,482385768,215508942,27083162,1379755200,574099485,1359962902,158294935,1248102922,543909910,2120358768,1126976522,1303825997,1928898501,947250257,1173833375,1425187226,756673388,1964196994,2017955283,2051999815,2064275243,2092602622,1679573398,1205409195,537858034,608570739,122367042,1713402894,788508936,185722127,1823090744,2021107938,1078332199,756525339,1874330222,843481613,1761732053,221125751,1764383650,559310046,611085608,705682340,266466534,2119569441,1785663283,869925159,1033019974,938383161,1133326520,1978989542,1196504792,1883270759,335151356,1484229251,1984485733,1055376663,1662696890,1132376962,938183708,991380562,9072449,864692180,1518927990,1406263683,1908805750,439502539,1864488705,1069092494,105013278,1072707305,698654847,1393299320,779593577,685039381,1381014224,524961212,564382259,1262943535,94944266,1928060107,829972045,172045199,1528679947,1228692618,242244151,501222101,790325425,271305800,2085189074,277584388,1592911789,1600766495,1144294045,57691301,636269277,2034847043,435510944,1693351076,1919850575,81837909,627229892,1184888467,434117671,1406127985,1656764637,1090136376,555918192,1399243760,1978877464,1836384854,404145198,182852235,437739115,2070177686,993026156,549145537,945981145,697922757,391144819,415854000,799131069,760894705,1945140634,1585141708,1621200638,2112087706,1619204952,731790710,1255316147,1117529369,474885354,741755774,1951494858,589933565,562803823,1513639676,822850598,2068789238,893462513,16227167,400256860,2115498939,1900565032,944798713,1822618127,1495983247,1756272490,291505895,1094410612,545284053,617108826,2072719389,2029610219,317636027,1574927608,769831673,252889939,981878057,1289966129,1030544435,550091643,2075190265,1021172700,886764639,641967636,689132368,50507410,500178015,190455717,867518104,1020774802,1342941622,43163167,2111333351,1725107049,443475840,5914694,1221842844,1333162810,167595358,1218243680,226498129,2007598626,1870688253,477906057,2078559003,1646373630,1933165088,1160378107,1304914418,2097330419,599828970,908901157,1487549497,1043828723,1869366489,1219416304,1216962883,1311049979,1236174623,1574466656,2008733339,2099210919,522257839,934467934,709831660,1039619343,1932972472,1263757941,703048768,610424795,1139055594,573827176,977916920,1738526729,252649843,941912416,807981942,532006749,2000456282,119478733,1181977732,172620197,1762690825,1034787926,1043107487,526852557,1547996347,1327435680,219070548,448265698,1976824117,1607024744,1270149567,1350248358,1404326252,1864402584,690104307,1279598113,1617760973,1725661576,2128473049,1876686811,1138264907,885188542,88395997,789418363,217640200,559682251,1875911825,1402393962,887295312,1319482815,700713881,1271889343,308489057,1766387404,1776392253,581708282,234740303,522895205,2046718270,1834794068,1047291993,107527575,896863238,1037736472,1116150205,898686730,805140524,995922787,1080012748,766849761,1864129853,1622020825,1118756803,1669228014,1414822458,1053393337,1546905929,274221796,1172421502,1814368166,11011850,1277213041,2017130901,9782388,217771589,484175903,92948442,43375059,367741422,1042595558,961527523,1911169556,499941128,1927295977,973286996,1874368371,837209029,610964412,680714045,608000192,1790731965,51662764,1449334540,1911898471,1138915949,750173504,289183895,1943891292,332490019,1703307674,1807767915,1456105639,583844402,1454145089,1456979780,1079882898,1915213336,511514685,773916719,895301778,504132471,1963167936,2083236966,1058737413,415629942,1967123418,758035808,2073372493,447274811,299218152,1441415251,1786548570,2088109039,1073909959,463987050,1482416170,580374345,791879046,1975190549,786827809,1701285268,1699559485,1613656966,1769598777,1624103099,220579937,1990205368,15067245,1431355201,63631435,844061279,363291830,1943893732,1653455692,2098081074,450820724,1390133517,2118989950,1817212842,280925116,1398259754,1576614095,917042250,204626869,15913507,875518734,1657361514,1586314840,945734031,761687847,45751367,1476365669,1325377752,1260510373,2072615378,1591083734,812071792,712988764,1875369676,1508429253,1872273240,1340611957,525698517,474930794,70113,1829296619,1093786815,286563723,1023880579,711181445,1243731752,50370034,1743895703,992949819,1279418381,696955344,1465251276,1455184005,1625403857,499232296,902586187,260296486,56535337,1301183328,989329629,691504681,854275964,730542844,1199393782,1511815920,907710651,1487675080,1954640214,420623399,1751811058,1300261449,605931903,89588188,1512102663,758862549,232878828,2121940787,1661736987,1845162030,526968114,1560504071,1920090447,787960762,1753003797,917651066,7488619,1065108528,538545809,1724189636,2129475366,393779302,1184642154,2055276289,1328244936,219358741,1827471948,1622367796,72184618,2026115911,1364990960,504794601,1909797399,1465920688,1801794710,1491613214,1281832862,320084319,586569311,996639393,1115094644,347441552,1829081111,932946927,534020072,134555015,1541490754,1749122027,1538983594,347039237,71018449,357675872,970390879,1448718797,17564453,2110573382,2050874912,2060825072,1831477493,36996916,490927534,958600124,2129282628,817924614,655809960,521298157,929632857,236403763,1326101197,601888996,941151605,1510252821,1299784466,250058613,1802822396,1725660587,1875529253,852486266,943557830,516402839,1575588437,327192230,1286299667,1507356933,4625900,716592235,1111509156,1208510077,1201069883,500008703,1412788933,923954447,1786436846,1250673809,1675097045,387154699,543709409,1058202635,248783590,1387661838,2071793581,443301541,1931844938,1876490001,1820768846,91399553,1841004950,817958660,627349778,813745722,1581482381,673923422,1432206080,630883112,948192867,1543034777,1820492089,1559883851,59217744,807739901,1292099374,1592405611,408330612,251221171,886853073,1580958484,1369462680,892092826,91625151,1492058340,539281661,23360184,382652324,1545890,1660384421,1601247504,562606602,993269466,632080258,296919191,337143524,462142319,1796150478,1329680621,56898056,482544111,1582920353,1522818856,192709088,786169276,593863698,1272705449,767558339,64643964,1280880933,578950926,1415652503,589549292,586673586,727068742,599082865,723509262,2001743541,1365533252,1620602686,1053707677,1912718003,293354143,543884387,334262734,375845835,1602868820,1580984598,170414231,1086518798,369831883,1845117470,1814390471,896618978,1265553572,116333812,658000672,704312307,2097372593,540586697,1297816828,1051355799,29646473,272874360,1337262571,134066872,363522730,622113420,1916388678,1062532244,1757444520,1084133243,647999611,1111165191,1680873406,2097378452,1888855103,2114242333,655906115,2052625245,1483947475,1990431184,2065546107,1898252211,1904079973,1376777237,943787232,1098396581,333307463,1531823204,427380201,188543911,571152836,1298661458,802216075,762445286,562707478,891210618,136304808,1618856521,1358941304,6123808,1816941533,1783394350,24166360,974256804,1380911432,1012267801,2010899826,1916794213,1514506140,1159372721,2032908719,1277662296,971786503,283394459,908837126,654143591,483141601,817008996,2043956701,104426201,1285073341,205775913,88450975,2097310682,1619671375,589523409,1808264815,2105955285,550945809,1179311076,650174980,1762940194,1442447730,521251006,1227113598,1775074394,10868554,636280716,848663094,1783649954,66221538,664167436,294003244,333370103,1583708730,1762858087,1602858587,1217863415,1063344057,1809153584,1190786698,387948719,630607545,1888055876,1984053016,2048580795,391585423,2128250234,108872348,1181985285,1211176898,1926942436,96347227,555642100,1429890937,289061808,1322988089,566049704,1685725216,980629230,533439599,1974130561,618113714,794662580,415798495,1939064603,875431231,1926340734,952826234,1395176975,1018815592,931238695,18229380,1281361438,1554040999,673107964,356682875,1894152544,1143025043,842207468,1943434365,18166611,1537744828,650238496,1461099349,992320251,1804182618,1135019455,930087457,612119632,1022917410,630259349,1295459933,1640586387,848871862,1227552256,1200597274,114942300,586267388,201218373,1026684334,510867368,1266994090,729700151,211913766,1241930320,139115728,1096507429,1273949922,1722328549,1279278451,1995544063,311618105,1241115572,2121613353,2042067701,1770422874,1390521719,255393333,2070377574,357229059,1089422678,1048814041,955219646,258237452,189067135,638485254,638763035,746023870,1524045275,1585211769,593748836,1566883467,1812789465,550839619,1073414781,680753744,1399324717,1876436604,371993625,347540873,972912684,2083104932,642318147,541465865,1683830316,935739695,1844107055,1900148444,1713214480,1832297063,1850358969,1853143074,797407145,1707399289,851630524,1158854078,1080145735,1401061877,1397166484,2062974247,1755249834,1002438904,1543894430,1173870273,1523441069,2016101284,1609802899,1096585171,736240767,17425823,591198101,717095357,1000656062,1845559491,1999620620,1554105429,325121107,334879770,2095230518,1073967786,217851580,2061797881,1009699337,50209913,1508206605,282379132,2046345624,822263067,2066508980,285493804,95273973,145934938,1900661350,189170500,1008346000,518025886,1298656204,1835733333,612747268,62514927,323653953,1326566791,570353886,373613675,1157364660,1300397392,37649175,1517868837,133007663,886629562,218015080,106781306,503632275,1829725711,1564640795,1236704844,1727967635,1417258865,2047656794,1332524348,1561445305,1477416118,449205774,578192598,1057266034,878053519,1600153965,1195616821,969840856,1347558751,1167610649,1919618758,1147320040,941792643,1373788095,1953734695,1573215499,696208089,714749198,152817233,2039386061,1601202608,1212572071,1178818706,1938825945,1275106583,1885569336,892899412,12823285,795111566,595515701,1616235287,1481383365,1921575788,1199106762,1327192981,72338877,1248507885,754041637,1269230554,1670740182,1358090287,1827352947,1778176197,1200436692,327332879,935067235,1648962477,1240264262,1259595509,1937191892,1718877093,776834107,1162729012,1494415191,730109288,323489256,126620130,985169512,159930208,11254781,470093456,1425175513,845819644,615109640,1117888868,835369959,1120706104,1588579726,385839654,1208097214,868957091,1978427212,394782006,354539998,958602799,1105078222,1634436781,2063558273,1832725077,1226809611,348691359,298345015,1471352133,1905267088,1071300861,1723117795,1547349413,1264393638,1398301433,2048017326,1444167400,1816435514,268227453,1716417001,547684302,1709851856,651293742,111500947,1972116765,944371355,387677898,115048102,1286103731,307054013,253310891,1498450756,1159247398,1228422933,1311042159,780353231,6915697,84004084,1039900669,272777362,2078181517,1133040730,1396719992,1404087011,1644365657,1471410434,850694041,425513567,1971550473,684337493,266630200,194448036,1967910613,930221023,974901507,2091212711,1338375050,1284434221,2054112360,1089822033,433847842,384994183,1650464997,1176823574,658570067,1337514375,1837743460,452772243,1241704185,409981084,416102913,521397625,1606883948,1692073486,1879618647,1886045472,404899894,1588810828,1755414608,2028179864,1462488246,103876357,1332944866,667252815,354493900,1347186504,911717504,89413764,951421280,214018795,781971440,757926458,701508047,1689604315,2039084825,727630933,508257615,318048185,867205724,1973825144,1170136324,257569983,311812763,166581353,487245938,2026414308,1589776917,581323079,864278492,1364745243,380786873,234051211,742623087,1165528992,863317726,49834673,199787638,1222810932,245842275,1929986688,1463183408,2031443817,1597741129,683746754,1068467088,43124029,31340389,2116727553,1772853245,779668988,687353946,1055933953,1882781403,592615370,1140851343,2090398724,918188100,176461207,884931932,1570351212,1258381726,1011122100,1339661683,779159147,1510608635,1238225602,1100266831,1093509728,22993881,833461383,1737468542,1508695277,1144034466,1112620000,1966079163,1327373540,2039211525,884542547,948468302,1620987151,531189301,782942279,526284650,102052617,1653767543,609658199,1862699682,1089735642,646542394,2059602898,136040404,352689066,1895008528,84545202,2043126139,815810757,1646244717,1401609861,1323380581,212582763,678111896,1582835614,2057882321,1222284378,1035381298,62771676,894827756,1164330106,967620070,1143521061,1296917617,995491739,1003783841,62146702,1045744129,1953276797,1240423030,788244944,854057982,1392348956,1539602866,727464454,830555248,2120201350,1334632126,1065744903,1280555298,1291946723,1094623284,696821288,1664825547,1092879441,962084236,179680437,2046203552,434191084,335263455,873848859,1430977815,764444068,978688605,750922043,1441587810,770936857,696073491,308074779,764576541,1132281646,664589100,992549810,245397937,776108945,1364217697,1060819301,1966832095,1778416367,1275488438,1942911696,1324338673,1581062257,120784104,551273409,1046857747,778845479,1675509071,1886442092,1253282598,356736444,1743705200,987427920,1868852424,1579696639,700064381,1047319394,1851590610,715221434,1709439023,54408509,1837221395,101802203,1319801039,1266540566,1702626285,2078990235,194487038,1092561530,1711583447,1844818712,674567426,490100624,299471719,1562295082,405738765,226130195,1651700667,896828262,1583374207,1911379792,1699961802,1674697243,1528439090,510160119,2031867021,890095741,488549100,1844270139,392235361,1518303182,470434508,1059980858,638734278,189472449,899993600,1201805166,2104732668,1716437576,1833482502,1636582780,1722640317,902591612,2122842543,1849894983,1703255661,118641317,1600996065,88437779,784617437,1375095991,426588540,474246699,1954204474,1626732230,1823875038,390188221,408967870,992145219,1182706570,2106762788,1277264654,1717218257,1999811816,1876592518,51464949,1918205569,122647304,1054005287,976257933,762971720,1965920282,1717803172,214903722,1979717467,9564673,1045615508,987520385,650656542,2050627708,1917000779,1761458627,23134107,1688509744,642548679,934122511,621129061,1434919515,1015215484,1920019188,364248809,629593318,1997128096,1320097295,978309913,694000768,145734853,406543543,1249377214,1160071185,472239470,1985884889,1990954066,526467507,1337421751,2096142826,869698518,274419315,224282314,1327664622,915270889,951401488,1810279412,2057043172,1338240729,1045109363,1744176028,529773359,555483831,323790473,466803223,1040367416,1528391178,389798113,1319240844,529889151,811045708,215014938,1319279993,1235964963,1345928252,299790081,590464721,504930502,1299939655,1543787622,719715904,250213364,572879387,1350267722,192458449,261920427,895280700,570817373,1982743431,936905080,1201937640,1126386331,1397203600,473671418,742576171,2067071439,1452969355,1158503345,1984432392,609763687,1441267031,1372803242,528520708,2071379492,135636821,552326999,2053950898,15135858,355258033,1561206195,1368265259,1176803053,2007363469,1531468072,254920795,378739951,2096129447,49234724,1073029203,1319676890,2113732499,1494252137,1275744284,2012606496,700424947,975354314,1403207338,423554300,1153392256,1371678996,1122292939,171228568,1454819048,1323968353,1268901475,582764730,172676273,1630071391,1813323930,2083881242,2083704950,533957783,1703582131,845896976,36293273,1482363971,889171492,352690230,589781502,1335092638,628652554,1492420422,1434382915,820560679,480243120,135070124,927618459,597571368,1083780247,1837378528,2102639005,499789960,1099592424,929685398,108109388,434634112,803055865,785030728,9364913,1830197039,1549235300,1343225053,1612847546,2041737933,1953927767,288685805,606739796,347731354,333534407,2129845730,801000894,1665317359,1671554799,69057718,851640554,259318287,926658961,760209520,533135143,1712067596,1751417225,1813116485,1939631157,52511358,1322351344,487416393,1125926114,1547034372,88351467,961293420,1965790312,2068404093,1899446650,460031063,1915720315,1993169301,651770354,764463873,928458529,842425504,1577434631,1707330231,1428949945,353111658,144698804,657462210,656244479,1122602491,437792592,2043396457,1275520470,1852348509,402185244,1405893700,151297042,637986612,463862964,474585461,1838728408,854619091,1856615702,1863332125,1315880023,1016326344,1689368857,34950510,1835397649,1650838102,1154301955,1386582697,180861967,1304015340,1034358904,242162928,172425793,1233279233,887109652,1736054220,1442507030,1666969597,936503635,1755812338,878563773,2026734807,861177357,1890855965,669556795,1381657754,783006285,629484700,2094618684,2083504361,214790911,712367935,752120197,1611659315,1434951108,846197292,408808775,1673156372,1955796170,1326652320,1220358727,608107241,1468999721,894996393,1673513324,1441480896,1162585032,188039962,1519025143,659739507,2034090906,1782276112,686316955,58340809,1910273704,1345101115,637934924,1000706344,1395147123,1524111370,273999276,1626291341,390535741,909123184,859147419,1765633370,224184462,787323299,168266011,640622887,1113805007,1337736305,9130303,963672206,227852166,1489631047,1252454343,309973658,1823056270,1757890467,1521106282,590618945,1106029669,1051050318,335842198,358671198,1286284847,955817263,621303238,1757929363,458881637,1354069137,1982127187,73250431,1114949010,986017869,1656004987,1191352707,1351145586,1511215218,2124658826,1673362670,58499933,1820022361,1058777526,1376492469,1029895640,1867326592,281890620,1081172744,1620776828,620408073,825747582,1960699777,894528905,112933614,1243782704,214406072,1730093257,1033431103,1855817017,1778322191,1732693615,1317828239,1289045702,885963363,1397719742,1180959998,980626504,1458333431,1992035942,412803712,706703785,1945496532,444027507,1900314137,1907610278,1025423469,782296919,1795315304,197859761,1117055025,1998284357,374812132,2039388795,2070960789,1364747260,1770832190,1569791207,1407686098,1890743651,468636452,1856934270,1658903858,136355010,1301107849,2120254537,1295641400,1543229861,1733531931,1420771948,1337360076,1080948365,487822311,1452389475,864450795,331918635,1714696434,1924977346,936233785,112814045,1528492809,1816182612,47941860,569436414,369967449,812482377,52602296,528464373,1431083655,1960575664,799406773,1050971703,2055205256,1981187038,1797292082,1418588491,498854681,1017906561,548129857,59312895,499975458,1691310446,529881281,1889075862,800507046,304684404,1504626241,1085202967,522710162,756084643,1854900326,573588529,821394654,945661283,1430380914,502810900,654183310,442512164,1189067137,787698117,1918129578,1029443969,1492590413,1429298755,1114688293,1554445985,562239094,1769371623,267112383,1129606436,1800469631,957516501,48448034,1896570829,43261783,1637935927,1166967976,1876758262,1443298730,1555407594,1527815123,1091230007,315312046,2010621865,1250093890,1886704092,1896694587,1486671613,1366294672,376051234,1060784319,1635118493,1365731297,1668122434,384362777,313616596,1426810043,1623381893,1605498838,642934064,2056274016,1916077249,505574047,2100541654,994846398,1361501546,1450632526,1087068234,396899830,334070044,294798315,823589737,2023018240,987818259,433059604,1686439080,515542497,1193694022,311617145,1669532566,1902684619,561937427,1799943037,1420396553,711782601,1878488548,1834229429,539614516,1620547424,767431280,830700545,441864193,74842379,205484872,1419915687,1422205026,1295524652,146942468,821436983,1211958884,240127839,250316389,1589064122,1053557933,1575486037,277382135,1636153243,1451120227,1703585607,668619671,1894199872,1063427054,1707338235,1741147311,1361860003,885949815,420998907,261962082,975132919,1403347201,849320988,981856158,1277987101,1656299504,365658649,181672340,2010744865,2040558188,678252708,1949296528,499240407,2099829106,1189590784,1273547101,105607905,1939692901,1134980928,46954339,1506773633,273837745,2088093114,135184015,1297001477,946450685,603558317,80132613,673548989,736234314,1497176185,448668867,208775842,704452072,388921612,1341586938,1393180298,1186322789,264482162,770092405,996128827,114986153,363492650,894232435,777069737,1146453682,1496430289,1433705646,887845278,2032803853,546204507,1206400668,311625967,197768175,1347729161,646297708,456740295,1940764366,83638639,1676834370,708698020,1642488279,1347065507,62636525,484727803,1288047719,1453848610,111219283,4523239,1178453175,1388554027,356037345,635733641,656680803,1253531325,197043840,947117484,17320415,1585322374,1848499949,1785020809,329490333,631671743,1206074477,1887756069,1197588189,1247171555,1914417686,719566591,639924713,737548256,436590682,522492046,156646829,765442118,1741590725,1737812830,136986771,1433966741,922706595,530484344,893628421,1320614946,438801580,2075433765,1665481602,817053533,312163720,1971316633,1476327603,1101783006,441132722,1796350983,1008659407,1045700045,278099084,1702127999,1718018338,924097431,1941333169,756996560,55708016,1679683084,1230169416,1340665964,1612127153,43379474,2097019252,1234039022,764483577,1857032290,1917250616,1157187506,1463824000,580422870,1752045212,1616489458,1164382224,1848283392,994855893,1346631816,1591391830,1467956050,1242512392,2083584982,13479410,673179065,847232904,982930850,1188184380,640147492,1041087184,1380869142,119660437,1829966493,1306585433,764031414,963220926,915590580,762180934,1248522109,507582692,1488266843,1614276146,847680286,642313475,909272506,864109079,292852482,445647310,1397065401,1461237210,1480361363,822718736,545391125,1591590460,1253549389,382633246,1530417718,46234445,1550603809,635869055,1368525548,1075408693,2028578357,1905687858,91042958,1219886714,936206545,588940629,990974227,41841385,692564719,870369306,1850517729,811559250,1748368866,593168414,1112766488,1109104938,723738622,124867249,1489610018,2038980288,341194683,1069232791,508615783,1849344840,1185589958,1803679127,885559697,79168993,1198388050,205008214,749026728,47940370,82601462,980630485,827387582,1567375501,1546734799,119627612,2130612156,191059411,2037273161,1450110579,747074196,1203752685,62454242,442571704,582653737,1032925180,1565612815,467965124,1357588031,1554743755,751804013,167541340,29467793,1468957286,1966961133,111554336,79237508,844373335,1621500596,2092453508,1466066691,291765144,524577458,84766272,2082808685,1369227844,1536721640,1781173092,1752325415,495102303,14421509,607664689,292535400,461254043,178485877,112289521,1930812827,1512697016,1704284531,1207849252,2107214827,793969632,1377707080,1151951212,1666831754,1474867997,433819791,1149636431,1081136413,1144045325,334733147,408054066,135209273,1987459146,500705322,596385703,1343841665,1592394688,718722558,430667062,1864464887,1037343101,42650524,372890341,517302257,1548783120,133828167,806710099,1721431230,1464703642,1004175852,842797513,852361558,149316742,1244748281,1338329691,2007698857,620819421,1940087592,1393965041,805249468,38582521,1687599075,635707710,214084336,444843828,1137847567,1059736662,1246671110,1027755569,336599117,1042589032,157702763,1572819963,588088297,232019630,551735557,846918234,655834408,1447988049,291981085,26804139,1125175086,1600895355,719458594,1671317119,1417828798,1216328204,771263485,361117960,1302665906,663574066,819480192,1991120854,756814696,94671469,332994057,460256094,971889132,616316121,506363811,2047731242,1625034925,773112356,2004978348,725606362,803166647,76103047,1915614741,712017546,1840511050,198298662,1060610390,1909116164,439914067,1906174871,434024244,1789252001,272979836,543871212,1815758288,2007343204,1130301730,1810287137,1415320637,895237200,1069101914,1709980618,56988489,239972439,164957470,1338443656,1187700123,486463928,244904002,986022347,1542778039,511350475,697847556,471550154,656042865,512405953,1990655650,1810206822,1708536791,1222621107,1442879326,1436801337,302156477,689627958,1639048854,1505794164,367843074,879685856,1919694563,943005784,1814960841,1202076134,422014284,745018497,1258630223,1785793514,890908549,832073423,1236886469,585144700,528344627,1964041416,162141267,332911794,1707404100,200011498,57782857,1394453889,686705097,1600349731,1432676533,2082552885,230621256,182506761,217122538,2103816673,1765447224,1519036360,1050558339,1222680171,1645085890,558125454,751581519,1014412580,742949115,44459772,1947033285,657904956,1785110633,1375149509,1395745286,1964173180,707520716,1435202953,358514796,1284740347,473901437,590656704,1980427059,295516730,1313041469,533359474,1063918163,763333981,1522398935,1640249715,1321299755,1869102436,712633514,21012425,788030652,102213205,746245364,1247175477,1612918776,1426733110,1699906572,182992464,2081445483,844308972,1785544710,693275009,903043297,183846655,859713016,2116613407,550898031,431897461,930336937,1534066621,1322483271,1530609544,4014315,988375247,1084142594,1175197907,1300403686,2103697666,169040765,1863478795,1683870334,1645504657,1946305546,223310410,1682953101,788814208,1956136838,1088729353,1771306647,629236076,824465828,412294159,1282489221,1742517289,1662467029,1971375784,1911812117,1864643874,673203129,1688985354,1016826519,230598041,1773604153,1119003668,185845559,1171345004,166759156,114800425,1095265403,2048973081,1061461055,801532165,512212693,1872129943,1285218244,1856589132,759122087,481875184,1623723107,1909307105,752057129,258353325,1996392057,1252083430,1215200714,542845692,1344381885,1993646928,1818911197,1365081575,1500043991,1259054655,520851190,737250856,201787812,1388725989,527236098,264534228,1338471462,1608135035,874534393,181640334,952581696,3472550,1841970885,995115743,575509852,399369122,2076107245,1825898263,1925066168,2071940447,1360171737,1312741880,517999990,1461427808,724564453,1184017434,1001650845,749012602,2119624564,704792370,517982898,1582360653,8462844,1016265462,875720169,429379519,1921627043,849828399,960135788,308690829,830926694,697454001,320966946,1669176410,361453907,1781346331,1496701817,1764600253,612074813,1423603227,502149135,44957551,532394566,467385763,1508578434,1280238399,714795118,1618739869,2048851540,752860189,328969277,241139152,461435870,1169286550,1697987509,1734311017,1408234181,1714479006,1234604069,274550972,1006500732,587578277,1276093800,2051574155,649476924,1722141361,1759939608,521082928,2017828215,1773266605,991383741,885403855,645609907,99981712,1829656938,1715837388,581218222,312529581,1399345271,1631071325,23729362,859546165,1409759061,949681736,1527623723,1889795388,1957912608,485253014,729547013,1636888437,303171078,1909963323,2099454459,1069759891,1156439137,1657494322,2027353917,44477037,1351151308,1697640624,2023557753,1078287911,1957384560,1665020788,472354408,252446273,171433180,1184006861,409660978,1553413714,1062915529,1106711380,2100731316,1976138850,1845984489,1650666495,2110214247,2074645679,717248257,1459524378,1551591077,2084531256,801040170,1799020491,1990342720,1524054813,2019765191,807968705,1554389355,1766408740,1612106037,726052872,537273946,216367235,418523762,1428437104,38399804,260174832,1525739370,702774480,831202126,92413406,51200965,1231840368,681364238,1539426884,663944494,957796033,1821668356,1485837980,734802781,1096014177,23377510,323953288,1074482083,522608384,686440845,1089355379,1900342599,476451063,690959986,1245912234,1809670321,148016713,513488528,149829287,1683663774,745173597,1823092542,905763196,293453918,2040536604,1997946360,694428977,20892852,331159972,74987041,747433015,1098189936,265036051,1941546121,995389052,1024860916,123450599,1807599514,502400800,275423059,1927311443,1925249483,1455405059,2100008057,555293904,1781214226,846993554,2097850712,725634826,1583298449,1107006106,235034514,2004005271,1908071254,550548481,1473381021,1351188473,763483666,524226463,219796045,1534374573,159714335,1058629258,515368688,857898123,516489858,923080226,279542213,1360655326,2096276377,1506291337,654438527,780803273,1352986941,1010492242,2051769634,358096827,1683578447,1854485335,31251409,124424376,1712325164,1876576068,219704647,899805813,476040796,1432558539,1004713510,1310667437,1079875473,1825821367,1495468324,2091348993,417628460,745107150,1813611742,1277917031,1853182612,1436031314,1488655068,1879295472,1816316619,852814911,2034390574,76226223,1527570359,1868580604,834515418,1148544195,1655060153,1482200861,1290473357,1883101066,2129844345,314544303,203049737,296782253,144094520,384663249,411018925,1171557803,329527139,1914974603,2107455267,1183848486,1671598393,1772987317,223884161,739407333,1731453077,1763600089,1685336591,123085511,1254084471,364522767,1374560005,1263770613,704942032,785603411,1507544481,1721463454,1961175972,148589097,1711107528,194531587,1514705772,906562588,50018276,320386590,1658731024,419096712,1214692548,1657853571,432007045,1429978187,1952875010,1009791868,505167974,1475445885,2068239801,1617508719,2071230545,570944865,1249221007,1201348051,1820168887,1037108803,1469578791,1399682722,1005021779,557875785,1132900931,1607527725,1841801023,1878616925,230655103,792023011,2047815612,752554813,177158438,1974349251,106753311,376444418,1769140512,765904165,425060712,1760175452,1759884502,896916394,1906903657,1472131950,1425184750,1640443782,516758892,250156508,178416187,1510907859,662673811,1004074115,1844839104,1237445557,860707736,1152263965,412200477,144099615,1088157121,909464240,1426266342,440063399,284619969,494566033,451781192,680762634,118114691,1590584355,91644264,211741771,1503920763,474452811,310569518,1691350189,2038431642,107368642,837136270,1854998328,565393108,1028283621,1288122088,555687623,989572452,1202513285,1276112180,1420582233,70327809,1457792865,682239573,568804697,1679044545,1952525865,162207793,298339959,1545262621,1894583218,1730381610,862484612,1523479802,1931517167,985951083,222338467,1540347131,1084579098,524982582,396249093,1410983939,817337097,1174967526,1351057621,1012817815,102730047,1615325367,1070324529,1522344543,1849914287,729218870,359756500,881011415,2083612034,1016792216,759316565,1121236612,1608443092,874248976,65137853,1896491638,1582045148,628085893,846775887,25094254,1116182653,34242651,26906591,2129067210,1787399767,802828368,1538580838,548270443,1588482060,463868941,1262198188,2070116209,2042530569,2033987742,1922125265,1898224234,1543227001,264630180,354509990,369167918,1323201108,1560808998,1139126734,1142261967,315187272,19639475,2054186837,122606627,1182873658,1032614804,625114565,185131761,586804836,1492006925,467426954,1680219027,446082096,1971251309,1706414260,764886683,1481817108,1620216491,1423300368,581505994,183294762,927836366,1997868890,385438678,1683171926,253001986,1708261907,150663055,1865924477,1844429650,1422420783,1332379560,496214573,15780,1742895988,546988090,1526864516,138531442,831562783,851629376,337388967,999278642,1131353679,515058678,595580527,2092098613,1752744693,1649772441,819207376,917597052,864813218,243602028,1293631777,1339855823,1214069888,1169456587,546568626,2025807150,439837776,374401972,229408797,596610337,1178879,2121904627,161144551,610237880,249764040,742857821,1409287002,1747994982,1157045628,2102599524,312542471,1023128573,187393460,1371088535,499247327,113381732,300801793,2061555604,228994848,674150509,1501031705,463760711,993191529,1070223389,2010751357,1010019553,1161612274,1422994891,96394318,389454213,229564966,1272364223,631957757,2078422707,1820981278,1429966614,1172666010,90752861,1030223046,722704884,2066010023,1450596820,1318924441,1440855514,951183464,326801450,653478050,1267060600,859862287,2117339227,196921082,462861038,2071500535,1068972595,888581747,1696028587,2008218455,38366095,1447038558,942122928,15138071,68720879,1200989970,154722397,2014254436,15515311,1469560522,713164121,484829574,1487677599,1888765328,1605268388,370914819,1571782964,1385185538,40622757,267817834,1924427960,284101445,1452338496,918743076,1031789177,193070685,1674419050,1555189179,896615108,70809947,806546292,1207896846,498559494,720924835,1563013161,1097563524,1888112583,1039328354,2052156965,1706995045,164004208,878438745,1695975157,1297459485,1635301905,1284393188,240598866,1918913648,890161766,1034411283,1364118253,1070067525,620136366,583916550,790465128,171337712,801723869,206034322,121741155,1654960138,4302021,1887518542,1631114526,726744543,1631891504,1504237357,470184640,745518713,1577926704,1339060714,1811607654,844973249,1326932194,1226232792,274644815,1296604759,1461341953,997891003,999255909,1064575137,7016232,949652402,1928049178,211726866,1572609296,435200942,1257644218,393951215,1410419594,1404420552,133571115,1985035660,1138136327,604610803,604165380,1079101710,766330825,1777223588,454607657,2106818609,556010934,1928626130,97900301,1965572981,1375189268,1439341006,126453986,1156603015,317561286,1014755962,1703969620,906854770,113104223,1794843435,1698374418,1887452994,306105437,589927958,1621718035,1474348388,1812951415,1151300584,411879974,1791755175,975929532,826409463,938290431,1177969662,1223193857,1846651958,491943606,208120594,1405301334,1211446950,1113721101,1773835827,1799447771,1598747487,1493087548,1822481408,1908973658,1723868491,1211844969,855734495,1516288067,1158296707,1391744345,413403758,1087988956,1818630319,1729556590,974231095,1772635537,435941820,574679362,294331397,824681310,413033702,1567009296,1817092168,1938767505,2022560500,1589986890,2016396346,1115000130,1784045272,584170201,138618562,1406003439,1065194269,443324068,506310159,88558161,1532639754,1652600400,1924128720,1603734429,559721362,1215583032,1447057528,1432998240,557888184,453194277,547430102,1346713387,1894374413,48733248,481467764,58441971,900647384,1704585705,1392362016,1830746402,659815462,491715902,1585451181,630684712,1994623668,621807627,574168136,1497737061,1063498044,228083386,129159528,1394646833,790833316,1458665158,813453677,361060663,260221746,1309557955,521564933,705849690,118452656,650980222,801060459,238348880,1243364129,1009018249,1017153572,1382256366,2085527282,1198374793,1042700998,1818876028,1783631653,474670322,1079189881,514738613,1434707935,579777917,1661860964,1005564630,1297575210,1630033411,2021843080,295227917,921146086,665248279,322500605,509404270,211780407,416873821,1170015208,1011181343,1383358744,37853965,2085361034,1657051067,1370780687,1885254713,282509598,1960475888,1209553879,1737271658,1975656327,1618408485,886564396,814395444,1038693360,592202226,1946925245,90390083,1861781331,1150554613,829568334,1296976636,1226974626,1441636256,803528091,229927945,46260462,2061138157,1367045492,1606310854,1486005900,1871020174,1665108582,1445948812,1601549121,923366879,1571389395,769775656,242261019,878392224,738326068,194638499,907051322,1308912039,213593345,1122963736,1851793480,1903957612,838008126,2016448970,650933212,2102236569,497416472,1738548861,1100178656,1783822199,263001823,1161088264,1604801480,942823503,1099553363,2050764359,434148269,565997829,789753333,1822449319,146537324,2068007785,1202671913,365866355,395406458,748258920,610534402,2082693329,1442451626,1886724592,334809845,1367132520,28094854,676138274,1545541207,373627213,1544597008,855436184,521286788,1765015730,1679289909,1126343983,406907052,1033705386,74647973,1516231611,947254483,513430275,1707041311,1396570307,1879420333,125597457,1338184471,532197991,1887405338,1200213637,1886531016,1068234923,466838735,205454336,319471373,895042327,438997351,1070573233,1930375844,1304547098,494600946,1817228782,938872201,526990392,48344255,69029317,247864800,105219565,1796317103,358889531,2108492606,1164931463,1868103352,738077992,941591857,1755125660,1196861248,1270672091,614332850,1600395257,842410864,92131731,938672592,454837599,519264364,1248630440,1972305382,1763120723,1035705888,1663535315,1866990162,1575249577,256771623,1406874751,88791792,1061719029,1750627074,864421538,1842425525,1493694792,1261827595,1116856107,903415142,658282597,945971322,1048274043,1099529595,1573190377,186405922,1430744747,1304715019,1914274324,990368689,1118377013,1388954481,1557537681,1102211999,525725314,1070740824,1694447565,312824142,530830923,766651521,1844315988,1745099640,1242803702,505165299,760784362,1807409134,732882117,234198854,767141078,1367233037,2102472699,580758501,669195793,1910568103,1943125090,1188381516,342565973,736467003,2006790497,1695869807,273829280,1766111164,1138300294,1084392836,482391460,1045501111,776192874,1297425883,1896101064,567334399,1549199452,399709760,1644237039,1874349390,712668199,320996136,1341427054,2039375489,433180419,1458985582,2039554571,960045335,1324170358,432458445,1043084634,71063382,1659583174,1802705249,953543020,373639223,386291167,708794665,1560891631,1097160231,1564928484,779290704,1283181277,2086212770,2016463515,1339535790,2092134201,1800042313,781941293,638453592,244982836,816542499,536583790,810144298,279624373,1461250662,399320979,1140186560,1574900563,1856532861,1305990682,392123108,1524120038,503862761,367994335,481569427,182019429,1338578876,1689608941,952442303,1899492301,1102357866,1687876399,1503111055,346694098,1104866290,1039407815,423923659,725074654,1322751776,1309188957,1898630278,755844685,1933270717,80560827,225734390,1569109036,1691224301,490540073,752237158,1896376558,1849322541,1083284062,1772601479,1128129650,680566684,1037950538,1733677604,1097838713,1303066958,36619898,1028515915,1202527600,1893205585,1362496570,775001666,1906042573,1829734670,94265193,1705131428,1032572923,927521368,70533430,1696805231,565366965,1170113437,2075672137,895100754,398712092,2036660574,564709385,447006212,290368890,869710464,1839687711,1627833904,1820019265,972537409,205754671,92368314,1593875871,1104457350,1256561633,1037936321,1349744814,607003905,395540011,740398609,451037325,139426611,51389603,501283776,1495880690,436492937,2067394740,981614797,1037488813,979223620,160935588,297656484,1210913825,1343800681,1374314009,1081109741,545857498,1150753690,728844961,412615796,95408638,305766458,1321556048,723903936,295584082,1121964780,1103900702,161180302,1628649240,24136731,1454876591,208549630,900656180,858124794,1242478909,1683357324,444834515,383611334,1266108437,1445578015,1117064664,1301196479,1993739096,388939238,1462948458,824181815,535923552,178783211,1338798133,1306766492,765762059,1389859800,913476280,1760864700,259072961,957713660,251220938,824415299,116608927,1052654806,1612226413,1753072414,1422806137,1424511850,678649583,378787614,1736032936,416460195,279867304,1207345741,908064674,1418214826,918030054,1171276415,1047125615,201126879,1588951037,120368150,1980061140,1246364500,810871460,1589665451,33605960,1889679365,1901400325,2011800039,398901584,598839017,2088845959,524671296,1126141905,304146924,471931002,1715763019,103399746,589366814,1343223770,787375546,251249758,2083691102,1982048951,1111148887,68210606,1886060164,535597533,327539473,467791249,1041881592,286172187,735504628,1045308419,1739605148,1053553457,233112619,1443225780,568928993,1052483380,61376655,853854426,223020835,142865140,1978447381,776633974,369948457,110204736,581787292,729698821,1570533550,1146838383,3665222,1153699509,1507766154,911359786,1517454728,1187163127,616486605,652070081,824842886,909653851,620366849,96201962,573341643,1471349916,33574127,294619835,147343002,839145272,1533921664,2022879675,620833416,1333070095,1379858733,1470697254,403752787,1956760731,838629360,1215293549,103788318,1431441773,1326445707,621486819,854893317,1788598956,1776094899,1661203555,62544787,1005923464,271273287,414340689,1588548407,1013533170,2013672854,328753656,992236740,1483521879,1971475641,210279417,985368796,889191144,885726500,864042394,404938233,2050390171,431822297,90535149,827364919,1486342846,109022391,684315357,53400056,1375328666,533766197,1356856047,965106780,1975719097,751844911,1399756048,1618371018,1999168744,1678514953,1863694135,250230027,759678859,1995251720,1292528777,953794916,1328957430,232489901,1479548949,366362366,576703550,1854116502,780518108,5217471,70498874,231817138,332463432,1867324946,351962727,818672749,1631561861,1230503388,1218336958,320116587,594867503,831364932,406928150,2024271116,1524871144,1980819038,650591491,328172815,939871064,1178385998,138676275,1824351965,268766535,902286315,1376050842,2006798883,804068186,1636304775,2049693936,1517359941,486041878,725470531,225132989,1610258628,1201713275,1667960457,1701338131,1886491946,436218257,1764923747,1983737039,1549743144,914440923,1120403084,1165795666,106126107,400681872,300287328,368971501,47379944,1064546304,362063246,1846540399,61528132,1370079693,1196115714,1972487142,1836948094,1464768777,2070583862,1580844378,1572015767,223173263,1981563697,1617526754,996061025,1024660434,1972296626,936518650,1166268920,678036656,1573255892,901621505,763667819,1399150396,1946087576,937134364,2055217854,86749129,1417677423,486956264,783317767,48148045,272669853,1086842050,1466349656,1254742027,1664343093,1073034068,584964275,2059151104,2025244899,1275620198,1038029073,62400357,912422718,934468330,443516588,143280366,822678123,2078397386,1330129261,579639663,778444313,577594957,684504325,1420814731,782519056,319278278,1766277905,1479059667,430654885,373475133,1598220567,20496825,1778110288,1963150913,2101505048,2031088824,1546395175,1285354709,1422167417,1773315274,165600837,569397469,601074554,1877898093,197314435,906955052,1254980017,924711608,522599916,1575235857,146089763,985437535,240804892,1182807268,820307987,90779666,397379131,1304145498,891153829,916754489,1674435258,35306667,400950543,1547865668,1400282181,499765601,460168058,1160499049,74709122,782307062,1102596110,23695423,1289940961,1118012395,1864067389,392089258,1365318706,539276014,2004058215,2058985059,1289614945,1520261784,2082318818,959065265,1853546840,1296450407,1855842543,555941511,535200776,2065444495,832354884,977084718,468689087,949324165,1481808631,1174955429,1745140737,45664823,1120213630,594237022,997735470,397652868,1579998434,1756057865,838284175,1307389363,1598455642,514963663,94096854,1230781596,1811816397,705936572,188567117,1568265764,2030355425,761722702,740481347,1938566422,1562976550,1325838459,1269830847,423411217,991685387,1205078296,642901429,1543040287,1191587504,579904682,59431480,829510797,578053968,930820813,356043992,1995777067,1249077593,21491785,312846896,452291272,850345591,1604277925,613517116,1057886791,1049394964,1838022765,1534096801,2019095124,1143874490,204484092,160809750,455882747,498949987,493844744,355387228,639670813,1791782135,799373716,138571927,1708167195,173006525,1998991806,803050543,1483134794,1171101579,1273259540,130862146,1105302474,1111676795,1258201675,746929703,1349419555,281919431,1247318063,359634951,850549706,2022822846,1366797777,939069125,494657169,16597085,1677199795,1464485110,2058787424,1407629775,1308516674,2119519569,1048040272,1204338801,1494384643,86800388,472745471,1716124623,1085525749,205184771,1858226929,1078322511,1750877613,507744832,867229858,1083650771,1812903118,1970039959,1904767961,1604622529,1640512747,2059381292,929028126,1080382062,1882592635,65932889,306309904,297712894,1273156477,1462447898,1792650688,181161278,641470844,1512729917,702255535,1647564896,5082034,1656804957,826379738,1835600599,739011603,1488081798,1383416124,977248703,2004996526,1550807826,193099021,356018594,237825852,1026366243,490908790,1230319185,1729165196,354558776,735876761,469444049,356498786,1393763250,434202671,865722892,1914152953,454150118,588034338,903089963,552907688,441830702,439817361,252816242,515688816,453643894,1763436510,1436094124,284833360,489949203,1247514875,132735486,1764047656,569144324,1300581378,1202245177,1344540069,437018962,862234805,1549404420,1776789597,1386008965,1551154407,2040834542,1629752948,762393885,1233394229,1214297910,232079473,126852437,140337189,1175721915,957530028,1764525600,945802009,1965606366,1277746954,319297693,1298809798,1823096575,345890431,860784731,43199172,714807477,1947713619,1215594605,790775628,1518527563,1811276413,556792768,495882645,1639724695,224615291,1775145677,794998571,952498523,1547891748,558069759,530020362,1411145609,322896888,694564933,26714880,100515706,650402918,634630965,711435405,776167272,1189055793,592182349,1930142345,1335687295,1875279670,1790631885,71161554,2017825308,387226880,2010574392,423813015,675743700,609686491,1436162321,1056545741,1995504851,56417126,731857852,2087612027,760848745,458082168,1716683729,313878863,1038019956,1200591765,163916064,808807381,683210939,1231892309,2109756874,1424561138,219968331,97467576,939354216,1906277383,1556326954,805767248,482770662,1490634330,1142815907,240376038,2042530623,1617432153,1662387749,1354514212,1518592452,326397334,1675461422,1425636951,508605728,1074114768,1355139513,2004467807,1037524268,1887040794,1596798099,1459570712,1466277155,81881760,191697622,1701632437,1152066408,409765468,1975294395,1907116827,999024515,72252636,510393105,1711985588,1078642810,1830956613,64651871,650948514,420716212,192109652,2093375475,1010156143,2116921447,1789870396,490089551,1777866261,1404003389,503951733,44689829,950996227,1150376892,1389943619,663286369,1412329649,2023057560,2025904201,6350258,1471848043,81015713,993796845,1579950134,2072650365,610718466,896969160,1130213069,933387691,1550497249,2086497854,835271042,1577723254,520064084,1078634172,1499792868,2074962846,138966987,134583299,2124042204,578420214,1086548118,1222029893,112847572,172875255,16653188,735461066,258661846,417070405,707985066,980013559,62263062,1375539764,532555267,20578194,640445803,1714142601,259416313,2068434919,1568946291,2050937115,1502104313,32248105,1149593090,252722717,1414211383,68479117,1455187242,761029702,928796812,1978352952,1968857908,212688386,363974835,849261248,1036061968,318188899,1190272996,192552194,2086576412,347378260,1109757717,1959848613,945242150,894037780,1407741555,607306966,124316934,299032206,711215115,1743501785,152422087,588313111,1906387108,1908842059,383548051,1790626782,403906778,11145933,990883850,94458986,877128950,51876028,299717445,1342979320,1343590129,866546915,1840107858,1145677448,1511030470,903929346,1279089011,1820009954,1082200823,1437828462,1951932301,1747504228,653029529,592072084,1841123356,1779662580,1673920572,1247561722,1765784580,1741384798,958179455,1152822302,194990830,370247590,307908679,1294394651,2111035402,432141301,31769436,299892450,592065976,1735082461,312770183,1079607781,427822076,534433368,1747777947,2059825725,1367966459,29152441,1842086631,1729098475,2114849146,941696369,340102745,338712401,323332629,294095790,1174371346,1771682086,1105613455,1685807623,829408815,1625150876,119791905,1090560845,1072436671,1660830924,706349519,317292678,522063271,1165442733,606229476,1380534874,151891067,1689631231,1584421897,1814535170,1405990111,1870517776,640783185,87868789,822178543,86175041,860783179,1108811489,1486794375,2041861230,1371575787,1828026610,949017944,224632291,234336503,110224231,33014684,795594519,64694861,1210552888,1672806155,1730017149,1281262170,1664383775,2112547385,1279775474,1271375692,1653118596,1945389902,998248784,1883278383,516654407,1900919296,681933986,1842558680,102000690,1541199160,658297448,928282016,1436179666,1167222043,328427066,333492165,243410042,633601519,1328042167,1349204392,1164305490,1193195634,1690512149,2123935008,1877821433,1490513765,971302001,1077457558,520044183,1503796194,1136343469,1118920300,456322332,1500810585,2054540117,590492056,2009201626,715013774,1364798738,1562032893,1140638442,1840686949,1513459429,2118954755,1175495296,491088857,1498631829,871003876,1538971306,306644206,1783914133,1656269564,1854925524,2009158212,1995186199,43299134,967425986,643642326,1541018332,327044500,351081854,1545328753,465464289,219195021,803075942,1666139577,1017720416,885477479,1939324659,969500625,792795049,1964170756,1938344071,585131271,2074775051,1295674789,1554882347,1405965741,1621744779,575411303,2056304104,1604635672,721291087,868791287,1718748818,1685979314,2057805247,1113313410,1893110168,1344358595,100973827,1166221114,1023402325,314902002,1815476850,2054016368,981394650,88674871,871413721,1967188671,687283659,1479465888,622998319,1650331568,2062468738,490979505,1960007713,1896625823,1232042949,385218014,2018747812,713853942,818125232,365646461,812839087,1113793095,1873529711,1982654806,898197126,1729314535,551799569,1170662712,1350736871,274051234,639875072,563514849,1736940534,1652783628,1894587221,577420404,1746386249,130171959,1748275548,891083359,731600365,1506055615,647041772,436244754,1868997135,617593402,818041981,219365151,1308628736,578414920,2084556305,11213583,1856540673,1321552804,602054755,417750930,1254917759,714118219,326037424,90031723,330698987,2015813576,156249279,1034124120,459324921,1475415772,1526196403,1642515343,286000422,1556020991,1182510706,1806733125,1693539221,723122132,1105638265,1254182706,1565792667,684535095,1033143077,1382105553,780867685,382611356,1977049317,1588321982,1521938146,2071920820,355721496,1760722674,42272052,1371003511,2126357022,901121311,1309026226,304395419,1581382037,1155180546,1438213495,259826176,537649682,1856246531,1958231086,1098739365,1740967208,1485102270,678825268,224791302,1177682915,301017012,1100200725,1991340880,2116575712,668241242,499941553,1164673420,1361621603,141446490,1262390591,2073831324,642442642,1992783597,284211291,165889762,1462694935,1206922272,410378597,706407176,790734426,1792483512,1521389235,1100667333,1648751044,1042931297,1263091950,1512612462,2090686917,1784019630,321794433,1370121544,91586353,4573655,1257054711,1526546830,1979697635,1481753896,1225818016,522863826,1759576277,377651658,133311067,1330396872,1864198405,225445529,602270001,414861909,560282968,655650761,191961802,1192615467,1132526062,1155951992,1621970517,1027572414,1716719712,160372023,1217614001,2074055539,183730260,1862733785,711044054,127072789,1898435584,1028459950,1692688861,611133055,729631084,410610465,783903520,340656698,1699385616,693379622,265240259,1940990810,285335204,795524419,388220809,57168171,1355114200,459020230,1213734909,2074357457,1361184943,235726706,686007453,1639904818,1833227142,1371135930,413703746,1799070667,1963423659,966318425,1685969058,1301429951,1818234566,36300369,1828008457,1856940129,91238028,805471855,1666083893,1201699084,2106080236,1996671743,776122230,1730887169,278149012,1844003217,1393875719,1086551924,964728366,462392621,227382704,1028430693,1720879382,558685705,1622202613,1509357003,1996394610,1837065346,789234805,650414501,742126993,457454613,472276544,485457024,1454719698,690371969,2053430166,318493353,2025055859,958677080,858729898,102104666,1249455060,34055634,56310552,1176654083,1088707581,1632233127,1227324658,868126293,180563836,444982653,436649578,1758953411,1339155119,340433984,257022124,1539256692,2077250104,178024733,355471716,793774304,184606585,496669057,1294417270,830945537,805983592,1283639594,17246291,585774639,1105100235,695153555,692738977,657932062,144303690,1562542634,430033764,655482873,1271955587,831458476,808084980,1023806605,810352959,61192039,1999414851,1389214590,311751669,1447039483,1785892271,67416972,1708717143,998123951,1731909784,1595257791,750342977,1655488078,1021862706,2113662322,12724427,1258015059,669305368,719422793,366755802,912752681,872709047,980031467,733603266,1333026827,832009856,1605961791,519347055,622228669,346972198,1135112069,468725386,1965618834,1412581037,2010823619,958319870,267394064,239425330,1783106131,276935749,822477869,324229610,694770170,1696642351,944658068,1901498444,1972884045,1715239422,1764370805,290446047,1226918780,12783122,646371522,1820414976,1037834543,566568218,2003105020,453069391,195182397,550699576,1533991935,1748699629,783596448,1278932628,790251797,1055688104,792325938,1762178566,1925914152,1307694353,466129052,1710909293,407529764,1857134425,243383850,1369283563,1861585076,902262920,1455027872,1188540348,826823987,435832462,222911512,1969467922,653604555,1869149842,1793358050,787000632,1703540935,986316541,789467118,490762703,864436006,1466110603,514029005,1548645295,721011285,26695527,1713369811,477535128,2063012536,1375211186,1408569915,1923794200,658306502,1570246617,1985104476,1664864544,1851935280,256403534,255636387,1002395313,520465954,1498229056,1386267346,853159497,1122978360,177030121,142506376,836183402,697693083,1174599390,1340846788,1191189272,1905337890,464485288,384392511,888736201,765578470,1461943771,964997239,1845032690,216410560,1894133321,259614391,1465227752,1722950362,824732532,1134627099,331477043,663717694,1567833066,847123364,1026365209,2127289044,273123261,1162634491,93881405,565386720,1249772087,1584092056,862104188,1272926792,434178189,1465374762,253174098,95770346,1164604620,138830027,920573931,558864356,639838110,1460216769,1077301566,1266188386,1330092685,741463646,533435542,2049036832,151524618,751938334,445109893,1830870039,434269816,1866271260,935312270,182078948,1838644562,1152482093,595160053,934269729,198065704,634213054,433631325,347976171,871644575,1469617116,1023293067,266518098,1459481242,1020670106,1980966445,1361363783,18961652,2110172001,1907186719,1239532065,751648650,1054394463,1721321778,1358466687,754209273,178787850,1477837041,1637047998,727350814,30781441,1096022703,10527797,1694165863,1227204841,1940309963,791347604,2096830393,1924752486,36218226,822158051,145096906,1360754484,650988448,592047689,410096410,441468299,198498222,50415441,1064944253,800527717,870774140,396026872,1857266997,1569707160,962724980,452886934,1217918619,1452760999,739237972,1485290048,689322969,1560382500,353914698,1573565988,1106850912,1815207706,2006811195,772211101,593016944,2055756630,698533708,199519037,49783859,426046017,1055463816,519816298,1075347777,454345720,1497099133,741690777,1016811000,511006396,1942198874,1236937583,533871544,209716341,2059430575,2037582033,2062656781,1589729923,1389638860,1718780861,282018747,278960022,1477498441,1574005666,1291274829,2090128261,199983439,861976137,195339759,1146404797,249243534,919880853,1699430019,887533062,902468026,1799113659,1705153320,1344812950,1721474237,55229318,1857323894,304249904,1153584374,1237946960,1411496404,294514438,1192819487,137924056,1648687310,916086777,1635062259,106787630,1343695063,384016776,1201134040,1744267092,122944412,1343385382,1835156116,2005566918,457771390,2006817877,1319787497,1966748786,972031132,62143428,1738230290,635495479,760978340,1300332211,960208092,1690764070,554376869,1939703675,1574232475,1879739566,952621321,1499044910,186188878,2058972830,1240015324,206820911,1748349001,1741367381,348423432,1600977185,759989867,958294789,228205268,1019173665,1467984329,744450151,136575172,1462701473,697516412,360305445,2023623647,1177479532,303881453,216516807,1969988730,761396750,868065299,1665297493,1046742781,1357729254,1749777180,567170916,566893483,818531955,178030793,1122281371,2106224353,1443100054,1921825852,634044647,319524297,442120723,363868427,1005264187,1831228475,1843315594,1123567315,1647413890,2029370047,1204464265,1010734725,529007507,745839141,2088252095,183442140,1674012657,1773797339,292196301,1366520386,648539380,1575760805,1073076991,857831521,334330018,1375050672,330325579,1045014840,1545682522,1299556457,866084581,1199279858,533863399,275551473,954632979,638519007,755452609,1879528353,868501660,384013511,1163524497,1904133830,780718354,707965726,358700850,1616835627,1136347936,1052001094,1919348282,157996880,708641934,1333774894,891386114,835488896,129781526,1981781284,1429404197,1601216462,1155685725,1997693501,426947326,744053317,735691012,1631428528,719439411,1627447994,1616739842,729345860,558289653,1611252859,2124138998,997705048,624464400,1452757994,531068566,547345117,252130763,1853918262,946947042,900166728,1608109955,545430134,444774409,385488496,1112592360,1388311443,1910693179,1532641467,1618796793,557396086,72702262,735411192,847755016,649451312,335395502,1443579104,2064906220,1459368112,1872201175,149678427,2116536446,1728147666,2054379207,1770743048,78465726,949903755,1370949575,1154051385,1387763323,445152565,1643103960,26954505,887412807,1411479052,635381243,1159643206,2037065558,21861955,339095677,1594495024,1422278098,1133253344,1025689733,1590328507,1067695705,74869811,235498731,169503636,478274676,797010259,1905907024,1590029188,862087084,1844872356,2112958067,2128242423,1100254848,900071063,1478379343,339367688,1983461397,1559938221,2040522693,1093481847,212148822,1770408901,765069340,1464424723,1591590584,1454927199,163817284,311415695,606728708,494513287,945661755,522853439,1616387125,718941075,2085258664,820479505,1811616331,764792339,231403199,1638814764,1926037314,1692742132,1986984614,415349738,2112007202,1947033203,867191344,1154158832,1057780375,587064937,140970422,126412739,643399431,260825286,961851711,1401683710,692582319,1671854992,166760115,92004704,1493372374,1962450454,1029049089,147888883,1864403043,1358874272,1524319536,1535113176,675588844,1621676955,2073097094,2032936945,848094714,1912333418,1743313624,699453593,317286151,623963424,1751629634,531996294,598717464,1592688668,1423319144,1982689617,799001582,860466284,1861959146,220482173,1954929917,1386140519,227939167,178955701,975962001,21482036,1133701291,960079732,1576471562,1865206771,1129614045,1939979836,1613964190,1597848886,976485364,1878524511,1971809684,924277791,1349443701,566018138,1595328578,1664353127,1756734829,1789486733,24556935,2125521240,2031787434,1604068421,493999832,2048382027,2044410824,1875064594,2062820175,957414476,719204798,650890399,518389110,1496932730,100817067,43106868,1886528334,720895183,1783891081,508082574,1610647419,1454481445,552318577,1044867083,1201935732,859817743,1833017168,832184633,1293492076,637051371,1290093003,418178256,1109230510,1570045727,1737277256,778614120,472767180,230970410,772887756,223681851,1864068328,954158112,727613888,265249185,1193076896,620069315,2057993811,1292210324,1154669990,64341396,798221564,224467480,1158474853,794134079,260420164,647443736,869149065,1464730610,1570515677,713955630,1065563512,1668251043,1179019529,82643124,989336487,1308541884,812047986,1577996856,1505304376,305621414,1778046328,1117021177,773392231,339090441,260668835,929776665,177645547,279352167,50695233,661157390,576573898,1385261522,1726248084,1932099111,1888134891,438048823,25810678,223618474,2007148813,1192270216,6292471,1439704380,812158783,1461199991,557127638,694506107,1468430020,2022262820,1571503587,1978254514,65944014,1017111021,955572164,339810188,1737394622,496274534,1581277896,1143199348,939863928,952816600,1933286825,2008458084,910126801,356302155,770068140,273901066,303784359,1261499686,1466136531,374201990,1747329736,1856668614,884799726,435022621,89447466,820973671,339955510,375746299,604954203,1788856085,753041151,2048123296,1342245724,438942832,602953295,1957075808,1600507836,1558240935,1038550474,1714390239,851323338,763364624,1017020502,788317368,1808235392,224539620,1155895371,1371771546,1938879731,121197873,1594907354,566733691,824466418,787821259,818370718,33434039,1110280937,157807311,1598321335,1773420144,636401366,61473581,361792071,228746595,1020006969,336461631,1665450532,1959271816,1288192540,104338622,509096201,223844999,1750032152,779062346,859207576,1148888513,476887142,206919548,467756940,130152562,1687447828,135969444,295359219,2053845667,2114396680,2128741048,13300525,1828446922,695013725,1175280849,1797935319,775623316,2031683779,1494158329,777238684,888088975,1400059344,1754425382,270337320,1854911020,136680053,112719658,1064087423,1255506667,1381264724,471507545,1905748382,1187252101,792555600,1318159927,1019119440,288727378,1477311815,524208444,660973244,1744905624,21160267,226834789,140036782,1573533068,916224047,1188207813,2077910255,374827969,603182992,1867423485,1387798166,710545163,244167952,141017016,835345185,1732551805,1713227302,1325169328,1499901276,306530049,795570334,698943650,1433778018,2065195392,1613889740,1300057656,320740445,1475447557,1210408549,1335233173,1517962493,1750838603,588573974,1424845281,1915791219,436554380,1665214576,2111666901,1524411426,1650972703,2092479891,1011030293,271850934,1245630564,560828017,2010355578,811733398,317006793,1513053136,187586422,414340478,891761133,884047889,1826112777,184422404,2046356795,1811299132,1896156501,439579377,1757634140,1836822200,546374205,595073807,1953995544,1134717983,67241841,295666121,395464343,1319833317,2071380807,768420297,1044388059,1667443662,1252941826,1142077535,1164730082,845929529,1664640038,430644895,478754153,1222237452,1693665176,1226023653,708010436,1264719117,1154748064,1005037617,675435365,860006221,937173884,728483886,931609464,1071765544,1166902846,1014186758,624331011,1533012249,579819246,631870009,264972003,119608565,1932252792,2123707508,275175701,1199792048,596307763,1778509898,1719453132,710577527,1908620930,715703166,773823848,52199516,1163705132,657467981,31606364,812009926,2037920862,1115054262,1899125029,400617493,1943475075,592827985,430848899,63925402,846632386,284904594,1230483869,1857903330,2097240794,543126035,222799936,686581512,696199897,2006766442,1697017561,2097423394,1524114253,1131333148,50764845,1804760566,1637016519,1342882704,1810362467,1331772777,1095955869,1725350283,1140352978,677733504,823526659,181243399,646289742,1751171404,1768638252,297790598,316635811,1507189700,3450781,1634544052,844113941,231409195,1526264618,1763359036,907707914,637153211,845625984,1836336803,1289201122,913381152,1559654571,871407399,1050767447,1014724272,989891133,333547219,280338935,1789978095,1563631437,1692419362,2122495914,1514936382,1360585843,49429172,1637906405,471685024,83705648,1261140797,1042590496,478909928,1714611437,1970123386,1322745730,517809986,1178708155,1403165973,1385890966,1187205423,744551984,1082815739,785045040,852921272,69992694,429060049,135421738,871201793,144027040,993317444,2068385682,242027532,1954665165,1596949384,731020974,1500015974,1093313079,1680291403,423027373,1485930900,485501702,337233096,731670611,562562403,50532929,103850282,923000001,866376113,1328658300,678877075,472918581,600154765,2117756463,463788968,159881082,1418497392,1282787063,460172451,212723353,1850113042,957267082,2106986848,1879986428,244006727,1032027807,1980023749,1338252787,1617987727,1951920614,59886025,1451011876,997270426,1448871408,1041074666,2081529966,1317435864,1817949375,1791608855,1721124320,265759394,1575581460,1931932390,1750649090,27576031,1491277525,544574035,997703185,712499038,2069723613,887663644,1763223923,1190543636,1502549293,131468961,1735129933,1310202531,2010491631,1091179681,863388869,2048089464,749220451,100530588,211910259,1959825717,32375617,1114668630,1514933945,848811116,2127539831,608714548,1065993136,654860934,870215930,378094878,500456052,1135962895,756528908,377233938,1301481735,1021570778,883453782,875738388,1389706812,2052441063,1943479305,826939808,1628588184,1865594712,559972702,1929819443,851313968,1183778029,1195278817,1074844189,876234024,1539072049,859101273,655694358,871367023,1437126636,2054315440,1114037683,1803730636,137947704,1137637771,37722885,1054273587,196918625,2091779296,464426388,1867065774,1123545632,532561825,1655950838,967570389,721109450,545137892,2030230933,1070035915,1203022961,662532307,623030099,1968192687,1751904438,203839975,2104021712,408498293,198306449,565475453,1232323623,1444943777,2070713953,540229420,117231538,848715106,134329513,658077865,1411650248,823531934,166050500,1398682085,1124595604,746936019,930557294,1241003102,1538743378,2015712619,661195962,1218390611,2075961445,1583587318,1383154514,1439894865,767757097,1183240181,784129667,316124223,362489625,1741290657,1610213479,986981124,1234959879,1527263808,372667904,663223512,1039765560,798885412,1561425109,1890575040,1806972939,1032306189,53163841,1825263038,890668010,401347967,138023501,591686274,282363456,1529825153,592179397,1757492582,361937947,2009326877,916196981,731128444,1357508505,693326457,758042235,481269943,1858379595,153478397,1404741726,1340536254,1460480747,670048832,1671564349,1900635182,461729937,792397530,1200063822,523764682,1354383628,525126840,1964747096,1912264718,1499149044,1631523345,318696089,772677855,276539418,775903236,1099901172,1375291250,1789338385,745030011,1512991669,868386255,1739374783,1571447916,1883629021,1132745519,1960422151,1720883912,348485827,1851362893,1249397566,1076178733,1817366907,691559528,2001247629,2039315505,1399853008,964566879,1122013417,827730882,1923276927,431432229,205683809,1578951718,593119848,1766559866,731159602,2127700060,2081988921,75595041,146738795,1844684501,54446586,687395347,241827631,1667322939,606396318,1737518602,1872449335,1522419649,376414915,1778519553,658903939,277820613,725488505,1613091978,1774668549,1004363362,1811034868,274211647,63542745,1466734048,1070996116,820327111,1970824874,483202080,902155889,1748321906,1105897791,1387881023,1259216988,1364354938,1820289271,1463068150,1813117605,1007259309,1410018741,760143730,751640146,1216539123,1012402107,412306624,821385779,271900141,264491079,1769639896,23227023,423997666,1113351926,307397154,1758585013,142081044,960563818,2011024532,2071356714,986652703,1901603762,1536174486,313641124,586578920,1149153128,872509303,2060381932,597132391,607256262,1404361487,50857577,1725872623,1743552739,403156236,2059656563,402191264,342465253,1280205526,597393810,1752623465,1135712217,934732556,2004242927,1003761744,1444884320,1629632214,1832524982,1099859326,1973309783,1458837745,2127351686,689540685,556710493,1227056824,1524888398,482304122,1019640929,169077247,577416432,1703001821,1727953786,1578087333,1780542250,632674618,1776186797,1293081759,445043917,450333429,98745619,502435410,504118928,2053908562,894369086,834319672,2020965237,1876738026,1471171294,2043964175,1152323226,2016924092,1895807473,1773320836,1936599782,786588459,575108965,557168700,814366523,1230124288,1414981377,295514284,2088153353,1024742077,1266239914,871250451,879179522,1216625735,595557168,2072752642,872100583,1509595298,976154936,1612305219,471886507,1596322768,935614484,2110905689,1795163929,214555551,911318987,2029403942,83465786,262586079,1065732422,777106370,606832520,1318005505,2048108787,1087799900,687818772,1846898461,751158362,641289723,1874918317,1128179844,180176824,72721535,1701333937,1678254402,1471714867,511137519,2005298404,2004727569,1223790242,431739583,1380915096,1521516223,1001878386,1747661680,450712036,1323350896,796784254,129649544,622516452,1679340374,222181670,690187846,1553247987,1776355166,1466893310,1223009526,1976051809,467362608,720302586,80781946,2093651396,1514078898,191664752,1467110343,932650059,846892548,1248979818,1843587727,1350273443,460172765,1908000216,1373435410,317603275,1085200084,1452888729,1961499116,1856475323,840408556,772108280,889022451,47890779,782012584,458856344,1552219343,1812024718,1621746677,754418669,1079349497,1276707282,1364357852,2005117442,63568133,452662869,1124473073,253768237,1800840466,2093281493,1562654561,1974300541,555436770,956242884,1910691225,37260114,1577221551,1232514048,72165197,312517849,1968523197,1915987997,1195255078,1624068829,193546492,85679893,165543980,1515029688,1607766208,2072321521,1057491190,883617052,250520499,207347137,1192387857,211875252,1342397440,914157435,279857306,1124126890,90159480,1741813018,885625645,1632422361,1205008680,1693401075,1854194994,2105255162,157973078,1893220505,839934307,1991331488,1899706385,882873424,962305707,1441604698,1189861299,112320048,1041146780,1999846575,333790030,1068832610,693417011,444903093,1649446097,314810451,965774327,109153309,1200579281,1464406678,70459954,1490831075,1186947335,1840373075,492677235,1923711478,1958952644,33934773,1203237337,986003482,456957090,28076375,364126099,267898820,1930356115,492757278,1792766329,823049602,400151999,1459671588,1618323627,1250195709,2007703151,1230356886,1283635628,861668004,425358534,796016881,590363135,889734564,121386447,1610350624,1364459317,2105496961,1303465018,2055629766,357761281,673650855,130974654,984082462,2004486785,1028649738,1198153765,967875499,580446588,567947409,1777096186,1100331139,1538906987,1770001386,1629531612,629074333,294602428,253989279,788075140,1226930803,54684173,1333409722,869697522,164127377,1335950143,1380120964,42462483,642579724,1295085591,46162056,1989640030,1858380754,930354209,1889197407,1610435247,1843064677,333933809,1811363381,1947152504,665937275,1303016095,49603428,815546297,727257888,1700058125,1806136636,1267251578,957495104,1967816364,1167359523,1039232104,1587655070,200346120,1147424807,1525980439,2009792678,149537387,228222027,1816090814,1159969082,390977471,1914856968,300756076,168736090,624624706,372858954,708880613,1783310882,391198414,59552923,1698808201,687706495,1615075960,423716140,2108712773,284592202,1495376022,1799364120,186715016,77769940,983954158,803340202,1923213027,500223172,1075980115,409440161,985986303,331179254,1661024527,1347858326,250338065,405242556,469132405,1793502991,2052761050,1159800427,682447520,852607985,712539128,783214196,469987267,1789077502,927137061,869284139,1528353671,2113138925,1784762324,1549136059,583560052,1688845422,1837412902,1481161873,2026669674,1342175439,1693450707,299114982,1525143495,1241088550,222254649,935815516,1248212299,674208222,2117339450,1845865498,1155659935,1715381494,359867113,1801126408,1646391003,650618381,531183325,6520012,1524989210,551549883,1106617279,1524449305,456617756,261884498,2093250583,109431846,746242612,705732651,842292301,411905621,1443375934,592742784,465145376,1958467666,556160341,113889606,845046907,1800218858,570442296,1587500365,1667409887,77729154,507076413,1035047705,493302181,1716573021,1519679621,1265787190,672126000,648157595,1652448646,1623947713,1603768609,1905703882,1185165001,121998724,1177730464,1494022072,1285782730,623431704,346576463,901013955,75836675,250518505,1113035971,47787972,866334440,1453774372,874489049,1805222325,1723288647,1409890382,988085655,1331253699,1592517677,1296121648,400646759,1350695072,978202585,1135591676,1908381365,380732188,1286767131,510205291,711260397,1673080418,1186300597,1612553397,1220049733,2125002970,768089382,109856431,1103163760,782426998,1860133902,428186831,202013306,1535511107,927664503,353357807,416462717,1013091209,650599814,1476536163,1507629058,1809480210,876435764,937229230,364886751,648319085,1720271985,1263448770,1531372816,1251552436,680058967,1076500585,2042421260,2129152694,1579174732,80768025,37007031,283746913,742965384,1383596894,1977852479,1484221992,2012448468,1422743752,1650117803,248980692,1142134860,1131540077,2002790502,751686352,1851585422,810467718,533098219,606447733,1925473758,905380316,1095170432,1586284447,1332127605,1484056764,559525375,2130470321,395757300,1525919649,557816677,684541656,1529170938,1192084466,421511927,2054106982,420224247,2001489334,554479097,2099844291,1670599294,1264223477,2054840430,1092842755,1846945613,243157503,1213491568,651285669,320935787,2052651898,2029506516,2116515937,173809810,2079685974,1780429863,922381401,595306931,1219912503,1371810347,989219569,202723645,1003814251,1988967802,1686381503,35037919,2061575707,2031705168,951417013,1216730499,99445288,1559991600,813030157,332579990,1157479480,1719272183,104059297,1486511245,48067302,985487677,1017618568,113943242,599504746,467625710,870440162,1402825101,2113504772,1325239277,667014140,20103028,1538842192,1881722236,48961377,1249587627,652566313,356989260,1616439163,446242746,2123416390,1400830367,962918278,493547090,1811203105,1932528883,1547317605,1582696583,1758553872,1129180852,1974493951,1553546043,323503630,61522453,1258100266,1743321179,516606555,171391646,834486943,21481569,1123247992,1088997578,1014905137,61543252,1454170602,1947671363,2043200625,1706408890,1859480224,792600441,874964365,1382576901,1381159441,698663994,80805103,1749373136,1081307725,1761156086,1428838414,933119610,1177363291,1959259165,1625927284,381947043,48701218,729712519,1876701455,1330947490,1150452518,1463865407,22934555,528406156,444029285,767055087,1364502585,646744380,1833687263,76953032,1956417691,778347766,110749349,2068639986,216811244,1006638578,1703937556,876180935,945609943,1064866766,1759587825,1007473339,1403522483,1837224809,2106825905,2005155246,979637850,2001117253,910148770,175126536,575216783,1383143343,2080792127,1282692359,1258087109,258542759,154942820,2123535622,2010850940,1658365233,639088230,2015945496,1835337163,52693798,962085134,982816797,171112818,69628423,1527088513,79652967,888478879,516983909,987733652,635101209,1889431433,360880733,1454519662,974611826,1510885305,1410665050,1349244387,610547796,1166126221,739060162,1627987223,1975495978,1658870684,686813798,1658150022,581361727,818801694,279650092,1214011070,1881996939,957288082,227592785,1209755632,984048302,747649828,688123320,1036704435,1988024976,2011357284,872038709,305541891,2030555420,1056070139,1652444818,1777486837,1223958487,1553585196,1283930779,1765139155,1626707270,935226013,2127222358,343814352,1608379762,1882359062,423676242,1298606450,394873873,891947588,755328347,883935664,1881429619,216363279,1814854597,774284203,1114671652,792404364,224597380,204129010,564710250,1043478393,1270254899,1427737824,631189570,631534956,870548718,1088372437,525510087,192740527,1368849213,1470193174,790792734,317204817,1672692020,974810618,1961733841,1436507047,601286246,2087587294,3953631,848490696,418138761,338653090,1402945922,634267924,538390528,206662011,71253557,2113597074,1445054368,879623945,721466838,449748007,49093461,769552675,1635852017,1750261777,1290419883,666716277,1948045366,171647484,174550425,1710055451,1963949740,908832551,21678767,653557454,2074893435,104740793,2062055329,117184406,1693305796,1110726505,492239463,412640705,1587764643,5697772,1017779807,1974084006,19770370,1415903616,1187756360,1413355850,2048255216,626618510,543831688,1483988904,1499671316,1782164689,1495610800,195584980,1867019898,798963148,752741868,1579250819,704174749,1359282948,1927790852,617834003,65386773,1044960430,1038458236,724596124,1618429181,1080306309,332086647,1207988798,1685041498,437958115,38025328,1461250967,1752791882,1903604103,1896061403,1989432939,46862587,864455428,190847149,709205774,318556067,779034730,1195465272,1191938708,1993011509,1451227889,740019767,1483541911,1104219387,126685664,1145280942,1995814402,279830414,1326446445,207980451,1226291692,518818462,1765620716,69262969,1239374194,570434389,1923044796,615390788,1561627333,1740858823,2030797731,257502451,1847255259,1588411244,1554860871,215931004,881772667,1173635999,1607991042,524076597,1900873517,1727764340,1708539886,1489724236,1116217431,493036561,1633593259,1688259728,27623808,872993371,1133249113,1853125162,998801311,126027199,656693919,615940766,1932555925,1067289916,1227841202,900019257,719730426,1763081721,680334310,1247990320,655704965,728107848,1562486040,1722147327,1167450463,526661015,182588930,441553591,1735701399,1714078671,1688944448,380949186,975280652,581189410,24668841,772891741,1250560782,1333714639,878168125,1278463495,1982417444,1110932408,1685951210,500112247,1922196345,745012218,1203258485,1772892166,60596526,810491450,1197111272,1035960277,1281355328,305719525,2027992619,2006251231,282565898,462878658,781624591,1854883675,1408439058,2038892177,842428094,1565769351,1188027839,2078200576,230425512,136032079,1167906499,1038332216,914000994,373432517,685326184,1337401133,1088693157,1774201788,68567814,1652776339,1001835164,1289531668,1426806931,694653020,832639400,513099238,862621404,2045811770,1374391137,883164154,50783504,1142945948,1309507651,1298611281,1363519824,777313386,733728911,2022160896,790563516,1165587465,1035755339,1194439021,37663703,1582009507,810502471,508975065,935072800,972920070,275208886,1024000077,1610750274,1966871060,1652201344,1799172353,1651735952,184822101,143580779,896550628,518505642,105371405,1522914705,401796349,346554112,90100384,661063393,255161170,451258138,105900691,635098716,213471182,201582490,609280645,1486917743,1986119862,48923750,2074711658,1009314898,2080600794,1998429524,206718325,1424062987,886429640,1386411938,9494656,2106668157,616311368,1643042285,1409363705,1556104721,249493828,1104702055,888027893,1213028446,698966815,1045387780,92022299,1445054921,112239389,1819201365,1032349489,1169993685,905332277,160996958,795692625,103468361,236064197,1301898611,690560385,1195606282,1985215097,1768818091,932576108,2117338215,1992465866,1126552332,2089625199,1229488341,2103947624,1820029533,194967954,1057790106,776281113,1522373689,284431992,1713177663,730966005,2027794077,89872463,257964967,1816148725,1166363456,1528773122,582097228,874317506,412564098,1927516417,896063751,259781425,344296877,833735660,903923672,388296618,24220822,1593728191,1752771525,1483224606,1298501188,1454196837,2119733830,545729688,284439914,1916882358,452790464,1081376712,474848761,1747807165,172179667,1335830507,942873169,968322738,2023936145,1175691421,898167278,1390400072,1179245214,1082059708,1517388723,527344096,1472169140,963991576,770296908,1110455210,1277021548,1708515772,981028461,2115537665,1541026514,119435160,1618003856,936159812,1296488177,1940141062,624306533,1691107322,1492498490,1208505762,582785647,1547354229,1332382787,1505519578,1559876327,1406671282,1811148114,1955529591,1633329960,1437744675,1629550412,4414460,632697470,1646646447,1965594768,1244145160,1120843457,2014149481,559388842,2006969069,1001435271,1709420416,1262797565,1515240006,1394657751,15212403,2078014145,1188093277,1017601814,720289945,897185430,268405619,1231018827,1474231824,209825936,124513492,678763608,520603033,27520367,440669308,1145913856,606397529,886827792,407573113,168621483,1062033303,2097392043,1510524161,210216612,827494568,2083638607,1869165001,894625095,2094716938,468492778,311406041,743536825,1319828823,473844762,1671294758,123898651,177921526,1109703979,1944993150,1978466001,1075946365,992913289,1274368300,865654238,758408328,1291409575,23017114,470777156,213075681,487106472,1448875881,1731354156,2125389110,39879510,989741884,1051374236,1356083565,1705727255,1467156601,1164720253,2106416055,1968246640,164243459,1936585119,663061061,727041711,1190273026,1448901921,86689284,401781318,269181551,483757981,1410891820,675988512,723754147,4441573,906904695,1973226364,585606895,542738248,1809762885,77137396,823636170,99085690,924047653,752870238,261684627,304781721,588682495,1552381971,1777014922,1472377114,871937529,1772061795,1330633205,842704829,346965640,1296874387,1392566760,1149846458,2085615292,786144394,225599949,2130466909,64602758,906864411,1639371450,608512932,1563084550,504589116,64424512,303900434,817704649,200660922,954257819,248897170,903337350,1372367344,850056546,1097723842,1711875833,1247651689,970700532,1820721089,1872616675,748024495,2083314068,411267761,2027375872,1366596755,495962495,108253250,1330846967,573160875,1916041378,1937487259,1539768725,1747556673,859599020,282138540,63894800,1711505402,1293705170,1876952535,1851616790,1520649681,1250701761,586413138,634013326,1579511061,793532635,113852661,177856420,765221233,368516754,266129839,291711317,941360268,857306876,526429241,1417056994,91976914,286430417,518191804,1123068043,991721011,1334552139,1725588503,217305251,1619060183,1028301934,808158908,1345860544,248252507,110966139,1208109163,1254755867,1145746124,1743971000,196021637,1696780776,1226589329,323632800,1474585048,770653817,1698319170,878367332,889508800,1809887158,702254556,173610711,638893645,679759337,1572941025,1194021900,1494959537,1509822887,1354905237,1496882319,1793750706,455622284,1838886142,1398156778,704073010,1175143234,695913247,129055319,349119924,984275877,241825287,503453932,888650000,169161155,899460487,794253563,896792807,693396827,746944926,57385622,203348472,1756518236,524747014,586992703,1082691297,704363145,1253349504,174266196,1038372965,2096882247,560213123,1012680231,276756163,1495181409,120990781,563534586,558185838,79795542,901447904,190237051,1878913699,947814733,2030790758,120999025,328578495,435081837,182247838,1834158293,526272981,722609708,202950134,434443044,2024117581,435383339,853350474,2019611824,486649358,6695644,1159837183,895126258,1684987646,1571571194,1860223739,785305427,2091806847,522316620,1150511996,285702090,1555192421,1432112845,1863776015,399405996,251361703,1379903944,1747221078,817242182,387875556,1017252802,674504137,171095315,596581666,679871249,382215115,687409182,1005314838,1959660478,567341464,58214394,1220616210,1371199446,520384555,1381857627,184483838,1506031307,1025826184,1581132108,1013911458,291281795,412622002,2043749136,882946872,819058602,1229632885,252817033,1800288289,1845147206,1470109778,795873673,1362582739,1101040854,792035761,122440596,2018468718,1770410645,1433373993,1579944808,612708412,505372159,1655714944,1768405580,1690067040,161885067,2005251401,1935615969,1887827269,1562205971,147755936,1189376904,845123809,37847916,1539904759,1079967691,1836178092,1350687053,1840851452,153091710,5267407,1329825192,1025467202,1093990608,1558905683,1510807556,522861597,557241751,1438538560,86701428,1724151160,2103931301,351477408,1883635178,1568435083,614317244,847836737,417082164,2097865490,1399710628,1288785651,83273266,1389707562,1786481078,440865734,97219676,543733268,379701062,1515222398,322226993,861067379,1380225062,201316541,2030334412,670650717,1917711716,1038819015,1261930033,452595516,568441207,1494199982,2104845106,1219841358,175113371,796219383,731549852,972488549,182041459,365493149,987234790,2069221388,1814929340,1135355572,1591991384,1708082708,818413378,596505545,844793607,470951286,1752537919,1304614892,1059769261,953298045,1812904657,1920024296,220702682,1398499990,596766719,315001254,2088846338,1365869770,1473205310,1932400637,837130614,1658779625,1657564989,1592441133,1088560140,780779372,1387779575,847561214,889018462,1679009314,1064578978,1802911200,625727188,1877995550,235382743,2003599392,1015620875,293731701,321651511,1330407238,1958952330,857158683,1579170658,1432840753,1219645450,328838401,1673457939,1050789513,1643264681,1379678953,2016611866,604502664,810080360,1770428961,1673462128,303006667,55505655,2001260765,186242227,439441252,704287092,459706057,1172745578,1508198881,629379647,1646339937,668385409,512728398,280298810,86196107,420039641,781743803,528381983,557954428,1135130001,1709659743,1007744295,262607605,1688131149,17764104,1573666555,201533784,1102773009,1979240579,1576016721,1811590235,1802479703,1476557024,2074171082,392400781,91250537,1401837088,393661667,1863479337,2091168653,786581808,357056555,1413785748,1313075506,488083573,1160814034,1833137367,149362588,1797966037,593294689,996136146,936617684,1618185634,1222918463,1882715153,1585243995,864084984,479684807,1280511859,1137572522,874233062,1154484879,1972100238,1754403654,2054584160,1167212125,285883165,2038992992,131965424,1073089034,822176857,1786943321,877693789,108778875,1138723377,2052299310,109186487,1828731626,218038651,1580817377,1163987285,1002662101,1876063997,1547877097,1492258133,1554754229,1761869088,1270496505,99636928,220581928,248135488,1717381089,1830556364,1795313507,1796376209,652777284,1856257203,440502600,1198702544,84000529,43255503,174886730,1909932930,824413606,765590755,1748057451,224239278,277055136,1572931720,1370697326,404997666,342249492,760504759,243754232,1101591768,523522748,1606881151,2085974394,1960603006,693338089,955515350,2055881017,1626673477,205704969,1451025540,1375008379,204675619,402956258,1740620951,1515877014,1295287200,1753984572,446355186,1902654376,1498598497,1843191935,736603110,1759593403,284933951,1636895792,2093176574,1672962124,1952600795,283853145,1764290434,236810606,361642955,1103014269,597013272,1917503147,817140969,210353612,501677914,1206451715,1007033078,623759706,1131493282,182632446,14717714,678906111,907629063,1247580216,1684089722,360246589,1956962443,442039627,1678180440,237225890,1891245806,1495721583,1783954600,213469259,1153110793,1375261236,1226787689,392147820,523544881,1918706715,686450422,596622615,2074790963,909503010,2079946491,1279293341,416664861,483575731,2050553395,1031659608,359758545,1232038167,1422871079,2094600487,1770232271,1309538403,509840688,1699376618,1616845686,212986659,742062647,1390460732,1609308936,1377292465,129338971,612944560,809442382,1249960449,1926983596,1330813564,1492758947,1711562698,359019676,407214540,1669036236,345589974,608351316,342447456,906806152,1988515653,1150201985,2046463783,19336385,1812993436,195310177,401133916,1445923832,1267696363,401468810,826682062,1627304520,259118411,788396340,87662803,1906532016,1996472209,674978804,379287256,1187139010,1858340795,773854851,1200735888,1963581454,1077205869,508502522,833926961,2010691743,17381037,251035026,2058320072,1821431081,1109284878,746564424,205917116,1136309222,1002211606,1247036177,479330314,1696089104,297271284,1402071232,880063403,1554912111,1099695434,1778916232,900760739,67483007,242065273,1029669688,365195995,94009131,1622941297,1340659966,1874166687,863347038,2021956609,769752918,219857277,1693652439,2050710113,563587719,584891462,499080737,46152187,1984705932,499193982,1790373525,1724680260,264347052,1050372876,1284339521,1021203111,859929789,150742466,2105481091,1556340281,1188570905,206096917,793682849,1685556719,876471571,449498295,1670476446,2008646400,372550232,1261509907,530365165,1803426393,277513315,1758138600,1173046250,1335689755,134554708,1147930817,1945657538,959384559,160356889,334733488,2057950481,2045282823,348906520,1504195038,600063358,1651124273,1177667009,12199736,1750931700,2078981415,1306107254,1126230717,109531780,1358001361,486440427,1735441426,1349250911,1997683146,1155995733,704951005,1342263557,1811361152,1142199666,1493806793,126332047,1324496641,1749072017,227139672,1837076981,1820275883,14716536,17479603,1274597356,1020132213,1587098411,980493756,1422192188,521963806,1256268083,1323470253,1695140820,580781498,2092048079,2046334279,1487879943,1472158338,1385751485,727742358,429901033,689752371,1606684311,667074245,1729152241,1314389813,2104769248,758902669,662881407,1693476303,1039999634,1445581274,827305339,1679194912,1611408610,2085847832,1085471929,1350017616,706846794,1946195420,371442946,1534407995,208160046,1838786458,856926129,264857081,305320361,477382399,1078502276,2127814701,1472838833,1747461030,913131671,605082143,438327987,915635821,1156622803,1774386005,114338361,453322963,1280012911,575111220,1381044867,979619746,145624773,889465130,1332992618,1849351661,438185774,1405403408,819651306,99554377,569744392,1031867537,503401487,690139023,295439790,1847151681,53233600,1723275212,1637055021,802915893,843086007,1736131058,1665237619,577265641,2090472421,403102008,1165227216,255270444,352273530,2053439725,1165943500,517501803,1141360108,585262903,2043111513,2069256675,1658006138,1422521882,322686916,848036057,1515402787,619448877,170468003,667981568,991869524,912050661,1109187950,1841391756,595251182,1707654869,1140324936,1604370889,971083111,1504552402,665368229,466004722,1166013373,877125537,748387712,366030386,1779744038,1381104303,1393116202,88631155,697621277,1082974169,931929997,791527965,2028834314,93155928,375801258,2089542927,1158508926,1812586164,214567892,887496602,625402472,190189523,601438148,1245839301,773985202,2075417228,790196114,571993092,49924876,719603532,1588234488,1948573282,1363552635,1778156429,1654290090,635797677,1635242524,898200444,1832782985,1808613971,1665398650,1385283698,1523796744,1644741187,1032024167,1816147245,1455472096,1439961573,442338140,1842637002,1571004221,1527130184,1508130084,1341832846,287785295,322119901,362814115,1399076839,487946124,185721542,523561506,1906006035,1450050690,1847298288,81599499,2099510325,1255794717,1803937782,2110621657,225658334,1331096444,1366473481,323543614,2023087092,1653996517,1530508827,1267328461,1339803961,585265228,57740293,653174241,269904821,927583032,186546981,445707315,1448309307,1227304064,1170163928,1785906991,701624696,552763585,1650101677,2018872350,1167887890,1240358940,1735277795,127821767,298438853,1586668310,672219919,59493507,1735575157,1893796361,1722395162,710442182,900285050,1831277192,819261550,16318649,2094708618,1946304899,359236041,1447939316,825112371,1189483965,1260031605,2126298440,952300647,10931444,1522807387,52724623,1171559033,1396758810,881032837,936160673,2117927468,1496023785,1805817789,1914954118,1122093285,261652425,502529030,821298185,364737291,1223239044,1247633136,1768727751,9913391,716917537,1187141537,378102055,1612359129,1145174301,1658530752,322080885,1148161932,446904991,2028679076,1284578294,9835422,867407612,2111325968,1332392484,22432668,2128056058,1611593198,1942929853,802947027,1360516923,1448631082,1855598753,1390937643,47759099,1440195123,1342753230,1537107802,206801396,387703278,2094183793,433573504,1023673703,783735767,98877071,278188829,1036058019,42091227,918578975,238058697,13875827,1292936719,1071177380,1996310101,1185989568,1989333173,1201264345,1037158070,414376866,1425059374,754108768,1163344238,2097114355,1948096612,1971047024,1517984198,1614813048,1739849108,1165485743,677111727,1390403278,632982706,802613999,52010518,301269548,436109021,1838965751,1970408674,1707499673,237847530,1696632245,33714801,1692533218,163803122,1368276674,1357708128,265893882,797203922,1411914421,685510927,1393011332,504454929,1781893979,1514508441,51056228,143568443,1041514017,1316974213,460396040,142818083,1393361615,1210508165,1804844670,1587433502,2059879654,503434227,166198541,1257725141,418825159,770474951,285492233,474199797,1538097135,603533488,1142115007,1519898693,1246024226,377030841,532130978,1195386366,902023949,452299380,596362000,1459125323,1185128249,1151415058,1070181340,1124962339,109440299,1102521930,1962378132,471492642,134518130,1478619127,761467113,1118370334,652454242,950953115,1416724509,1758655923,947707000,952244309,1698927406,1567022090,1358141560,2016760285,1341278149,593758829,626280914,1382362247,23506066,473984927,877647681,2094354327,305410265,872129066,1643967064,1031363401,227041736,611159140,2110771589,1577032389,420488096,471476010,1725985008,476960340,499405281,1058883294,60570270,1146574066,248637268,372627244,294677725,1243935710,1317039381,1386815510,1175001506,1615540310,925429595,1249681779,507258350,1904713758,1616371573,216181123,1672219765,1417738171,902558505,919787254,171089532,1038499373,1491725859,1084233323,1021860254,618942600,1777273581,1546112876,1508664335,2053157044,861822976,215447321,553868857,2069579113,1505560675,731685523,1928334247,2124694618,1733312343,1233799062,1750280907,1843188717,360258450,890540559,1290583103,1590352785,1591067893,1232656242,893643028,1367961757,257050986,1766831936,1541246231,387236521,656204346,278509772,1523810394,895370389,589995591,637376932,99756670,556932648,626979730,1858777179,580888648,1709200115,1869941472,813256861,869061670,431037664,1829176442,1924274831,1153332712,2057561741,1259743493,2125529383,1595333118,1004593822,1638533690,32240608,1923127393,354402874,1469098657,1698421943,1003113847,1986924482,43078855,2026320290,584114378,1216907461,148009886,653897611,1593601737,1012439199,82162460,2027266891,1302134882,776639793,227415683,1495742353,1756371347,917357871,715948348,2003904348,404437046,762533291,1759810858,556524135,1033607098,1161474175,504595713,497978461,1721423330,1382679578,133638465,75188529,648157341,2107955312,1452393403,1496214951,1214000583,1298076033,1870205397,926530942,1801390960,1619617453,1845270846,1621112406,28872974,1724030937,405026117,516082229,470898689,927093846,1182479041,1856500244,2074837501,1967544038,281408823,258170675,398643117,1826236155,1655457827,1990815045,1514833930,567913962,1688542119,2121132090,1161449334,1907214138,276948812,1375526700,1182487977,847291200,1838954951,1670407083,1604703975,1704846532,565943441,1297019447,171810369,1556570947,1157505345,1241630865,1449519057,1589903879,598662752,283646112,985051265,20182395,1635543354,682692116,794804635,1017177148,337771655,877709793,396501517,1312765791,1559014372,841266950,365431425,550314137,582659405,661984654,1485634069,1748590371,1880503170,787049095,1973124794,1187213509,573142246,1066315106,770519058,1430609484,1795461649,1751206040,718836502,2053517064,1534461090,568941985,205293267,1077611578,1980934715,505062975,1712459538,1939854870,1324532127,1704494081,796043991,1284294452,1103785777,209466899,1192089746,1348794509,1010556303,298233855,1528514774,751836502,260788037,1025814745,1768288851,2127747909,630990275,1305597285,812731645,589421947,237807851,1089910282,1644269904,760579292,1050469269,1971549328,750332394,10674713,916792824,584645861,1097818403,1617723443,1534659858,1643468476,1845921170,797933090,467656300,685595542,792413904,661209657,591000427,2104315507,650070683,487003467,1668963202,587573529,286115197,471381664,1633241455,1485361418,1515577160,482609416,811301835,122998902,1243898799,920217654,904304869,974667339,621712819,183975894,141887287,619542197,1336551903,1581163523,779644615,23474340,1046544629,2098644191,1608027856,946182151,1293488299,939785254,515979967,212580415,1499475227,2117426941,2054596303,2014821791,970401130,1921354292,221616140,404851867,365155765,629177028,1015071276,1099494766,1279111341,631503171,334444738,389138157,1680803474,938366450,734438560,776652153,2066905340,121890454,272545066,153899861,1388151106,1116761828,1715403779,1108755187,142296323,1157053596,671704589,22804332,78762031,474918963,547077435,1217901380,886218122,426822853,994358270,1667888666,452322950,1368147320,826931864,322520226,239724011,2126973055,2017847024,1224328237,162704420,1455744950,1370410424,449563237,1709799696,1157304165,1895041783,129169012,452236708,984237610,1800943886,1815311964,1954833180,983673114,291652866,1086997485,1147600953,2105357336,512050839,1789804676,1936518372,113770033,555850470,1822380560,1980277516,529245105,1247833232,1150334138,142427323,1000434016,1889197180,800627706,600793042,339432144,1423976074,782274279,1003543691,1970853286,874243607,564744225,1593165843,587185573,1929445313,428886279,1274359274,1456209638,1708337106,590924699,418508893,1594253973,60464355,36896861,1615550593,1568921728,1675991107,236282141,1217818290,1041898719,1781784160,1623033755,1211084441,1629734546,664916950,177864240,1780713906,1664116719,1690068630,1892547380,529047989,1286761018,1579613505,1618053480,1980640500,1400110821,2117565887,781755987,1359451423,763845135,953908281,1750069088,1850016806,1556642488,1104908652,1329744056,948256391,1807882537,312965865,313989303,1668342494,1189852724,1555431424,1711777375,1837351269,536181878,2062342315,1123420684,177765924,439236362,1483875162,909358837,226089040,2097673600,190173533,2078514126,658790877,1087262936,1450899499,1692505735,570293869,1935571670,1037760882,24719467,84484971,1730721807,911961206,383293245,1890922951,1634876355,1477105346,2092646264,635265037,212047971,1450436459,749960589,1195096698,895513828,86228692,662396703,740623858,341434569,193752675,286263791,614944430,1849588233,354003936,617253430,318034081,814619176,1091291921,1011657916,150812327,1668684807,50832406,728223443,360698247,212919704,446901798,970785177,1378813275,214416415,1468939546,294877416,358730109,1091015987,1874481407,2010609295,1767504548,733664827,501982616,88741842,547814768,588169204,3923041,1598520743,148779090,1764757325,599223436,521818663,263506200,400051480,1640131652,1997469845,592372996,240187679,1442252135,1348139123,450172962,1928544439,1745596885,132212503,998645182,1481236448,82942501,1399018795,624414821,2113225116,151151579,1860097082,1733214633,1072964428,933932333,1548157172,316291751,46772766,2031269216,1404284978,1533994688,189340046,1684639552,1751005804,1579479746,1160323497,165013357,632225478,1064308014,1547491977,1374732031,691076437,1799149908,1950326247,1699557554,371705127,805840677,1652315226,446216316,1285659906,626584815,1503602008,579523151,1084323270,972034125,1849269947,134489763,1602598249,680857184,1611724010,189711094,1703655575,954602800,546262173,1903017638,194519536,213568694,253298967,1482284243,1372500763,876440140,1930813164,543646813,2041241353,470491544,1251956273,1274395521,159085393,1255402912,2101477264,1151231593,842285205,2040649501,372740653,1045907688,679603965,775526714,1315669537,1605603937,293077084,1474116988,1932209785,300603799,1904263669,1154850062,889562186,1913891868,1766128571,676350667,227424915,248667802,578435333,1634712001,1708459018,550464743,872539291,875360712,868403575,1282051121,483899647,2082431385,369858660,1130482748,1550359406,1591492680,578238430,1130162002,406198142,30981447,812456098,28419843,978223534,1069882018,1450704871,128071401,481420427,1246344348,705719756,589662077,264066283,167451073,1148229373,611095200,1018869120,1314161222,1258238484,201550869,608962584,1600417676,1791577532,796866869,213911371,1114176507,1250065172,1786813764,1907163923,577008763,429911431,1645652450,556197748,222500103,1709190902,1865716722,1183686277,423252241,1231526939,2129029459,780332672,528371026,1476578626,1551228701,1965592428,732106500,1270400850,685783947,1522585200,572324872,281068176,381767747,405437546,1772430044,1242020218,1013309107,1379244565,169930768,279380136,2095457915,1043493767,2126462693,2011891975,596059042,582472476,19986363,1557708691,130699475,1212332174,1736856129,2087860658,799499025,985563903,486566085,1801939389,1162821446,840472759,97701461,2036687501,1741867112,818974625,1863466198,1868688337,1572965637,1141545474,2023273188,2007673918,783654939,1807413591,2069165530,272131045,147795694,1850908981,606516351,246535065,201536264,1348820552,1405678974,1335524242,1402033285,709566930,2080029285,1244356749,692290090,1631445957,494433223,1342452180,216103056,605166265,382552611,664939175,1531385400,1968688375,1967280728,505288646,1675603051,1633294102,1080861318,236446116,1280838300,1749280005,626552936,222434557,984298674,997234592,1564835839,330325413,684762429,90980877,723133422,1643070905,2026840557,2113980825,1127418002,1365292287,1219666553,1866995675,1057356577,945396129,45491274,611041924,249259828,938681801,361533689,1037051152,1438773808,2070523721,914046529,393968909,1318200678,598351028,576628701,179562400,1489485474,1842246748,898918245,1697041732,949668338,994798900,1162779059,1611150293,582104914,1579014204,102395073,1050042174,875349545,554198109,780067554,980897150,134552296,150105758,731367254,284637257,1753921726,685711723,596520333,531292914,276008239,574438477,610608530,534243235,190349774,77167217,1959218901,106555976,1360495256,1613413112,821610769,1511131260,540235927,1681360003,2059071200,2125287590,1399744156,2019671216,718798227,925291445,224546418,1905539990,563300606,1216393664,1983223941,705249247,467467211,13424498,609487632,369141392,1409151397,1090121476,438275051,156365344,1874731627,1658095537,1253194088,1658403799,969914557,482772589,1215150644,511940530,689149888,1858239967,2103941883,418712158,235926497,1068837375,1801249616,1188510911,236307852,1125046112,963297584,1564624756,265337134,161985183,376695866,563288995,486715841,1579931958,439781870,1274810091,399411392,610846702,1921176358,1418497504,1304563264,76982303,1548605421,1081210138,1103784901,541038287,271066499,2058673185,1168468464,181718036,1064380780,315274422,1752250144,532061132,2039188953,1684441867,1852677658,1930354058,1035978723,903905770,1215331641,822559426,550152330,1777386559,509446107,437127075,758802810,322186832,101468168,1483498443,1055472843,1989368303,1500078996,233448317,424047877,955666280,810193480,27722658,1750186031,295342998,1246330653,1205403113,1956583841,2019310362,1784049918,1255427452,730699363,1604359294,455605415,2039117726,2117511332,810424316,689905858,891195259,2092033067,44677218,1043304524,367254316,748567290,477058007,197801294,244084457,605605810,1802494922,1473258872,1473303924,196516390,329359684,1304095698,2030153255,1380763885,761180634,889326608,532670469,1851346106,1322044299,222746777,110188599,537849930,1897748935,2013095096,681168353,671457877,1138405364,719974948,975887361,278848465,1504176127,1504534013,1996539097,74139542,1677868655,801008874,86853263,1060874413,1590030953,1778114845,1623332591,1288818075,1543934237,263351960,983167821,962562644,960634954,1727407220,212009584,1200844085,587687451,349570228,1153840126,1378079174,244486046,1343492466,1188355923,674155261,1269465715,208604564,230768123,632492267,1163335005,1162743974,339990525,1140522165,381332716,1305127869,1332348817,315893678,1904505228,461268796,706062852,1231975968,449029588,1498544899,181667691,1774766237,1676700696,381323005,1065818767,1100454203,1939376258,736847991,1324010960,328463109,468276104,1939375906,454099117,1661397223,559430315,757643346,1666045389,1462867650,394570165,606944295,1169267410,626243061,1010087365,19368495,1626599908,1720957565,378426609,1874669354,966142356,573794343,1752807754,1852475700,1811875215,400529240,419494665,1805451500,1079822815,239072727,1812451171,1609378281,719857550,1665581173,1100637513,799467777,1617075547,1197936145,2103247375,606511787,799470382,341104042,1342633424,2055216119,1526359825,863010752,1048323822,2026228671,40843528,2110771617,226922263,1773140834,757232537,1030567206,1909789967,2105660798,1269387190,607954518,576474535,1155295195,474399074,1875233662,263029751,1541994209,528364257,1310378695,1649120584,511094198,952267950,846524270,1192837121,1246532970,1485879023,2076472377,1872734535,1320315507,1994613437,850470424,1252374657,1263835862,1606358447,2027960957,414044511,139145108,539343237,263578116,1724301662,1361377543,1991655785,492542547,1030814980,1415269412,1151718068,1974998016,1223146177,2058342428,199566373,395846304,1564828351,1442464260,17238640,2080273897,1603937981,1131525685,1930377334,1366862079,1931275994,680460606,1009354033,109797985,1392864139,520964434,675719967,741696468,1731410174,901180273,1070500321,1510467309,1583949441,885330455,39489702,1214456617,362871338,691572761,2109938378,1177283992,1634816776,1760583345,1577755353,289763509,1058030674,339252508,1464384592,1947143092,103630369,2069607234,51610915,866083352,1594541718,1602880140,1947347073,1958014216,63381421,398219597,1783585630,1083569316,1813054244,1400037739,693218051,132327405,1902789986,1879419933,905524653,510112370,997536898,416338200,742240261,1394455117,2116358329,298503187,1653141149,1583164368,317310711,1863948207,1181779629,929127966,634126754,1573258180,365293058,1769400818,1805021720,544577163,1097751022,152552790,1027519900,815887725,1057860206,1726773021,1817324032,1507404706,1608776077,1984028878,89801236,1163216361,2002562292,2073865640,1695185988,596493605,378938492,1182295796,70240671,1343146304,1452175502,2103881937,685995805,1238671586,1809449750,343124032,1222953776,696690676,1859702828,751268843,505941365,1523521112,208800817,1555261454,207396216,1949284469,1779650701,695684252,1082678235,1661326981,1656954698,1937198313,1852642096,983795326,1938583909,801477193,1946082932,959773931,1564010833,1937696625,1498114669,483192309,1617856073,207696223,506647080,2050903866,78807088,1053225873,2129220609,2029276837,1625968492,2113677950,427915834,1783077651,1342770149,1052664982,1172597057,115602347,121769901,806217312,2017804461,775760395,1610858647,110396412,1709858905,1214544429,247115184,1380300565,995569737,1530254847,862293734,302229213,633135742,1439332933,1636435516,1991386601,578205895,1242890018,927966161,1145046471,1765579282,2012202225,1421484666,1623923440,37122651,312998598,1284668873,1050049756,1177160631,589658775,6719293,1461641787,670427954,1668884956,1022550222,277864844,748140784,1925129415,1790230039,1277846218,438034565,907479033,1508053990,1766579346,726343870,824262429,1943756645,285592854,1674766252,914794748,472075357,3924261,1474333936,222762590,1762231444,989886719,987948112,1095685176,977308624,1964226878,1095484236,1259753131,1504218313,1239981037,109954402,1544839130,1961469178,1738216780,1443506679,1081579082,1506826538,845308083,396591052,1272699230,1186873328,459934793,255417728,323429542,1267318284,561005241,173660073,1157830356,1252936678,1391641921,1646750378,1227170186,1679100444,1762585473,713072934,363414263,804550570,446380162,1268414720,1725517236,987610977,1036609755,936487702,1822005975,1804796932,236530139,1338381500,1934022194,1352134703,422041039,1157668653,417310471,2071870120,1071439238,1530231509,1526856629,1581314769,1978843300,342964906,1324850699,632243077,740115623,88709968,946273353,36939516,1089189841,172592652,1180118404,2064185650,1965293233,1456911982,1527045222,936795141,559160962,320604090,386034892,1119582316,456888286,1729112101,1362215825,113665543,1141593649,1394184872,560132258,1640280400,848422447,1498709453,1396520608,42775485,492830879,1430549875,1526190490,556754019,1063856113,1729481179,1082214690,656505544,63318391,1104745318,865031143,1983485045,1824805897,1884441,2026210204,719912114,1746531821,1627660754,1356821743,1997104338,1649288430,1558387248,1286915292,1684901210,92323297,2027814464,1964508819,624801259,793307512,1404059027,1293941329,341865977,17685939,981494262,1970295141,1414469534,1646612670,1893956594,1953523508,513802944,1797866073,1188183334,1470620314,1185873675,506176215,397416453,1903828479,1180478627,1407310877,1338442607,1284897648,1829305236,787174804,156362914,749010014,1767632747,1585324464,1551475629,1340233167,95683182,1852148700,1326331269,2094079599,1553157809,741923913,2094660805,1402116455,1349008422,451360511,836008028,1054426548,500398989,1287420243,1009290783,120841050,1959750614,400155632,145938580,859457189,736303850,874623724,1741800428,2059583460,221763150,1823971997,1250326400,203013374,2110749861,1677808299,1358943109,529610839,216730727,832326733,1446662458,958861937,1622666254,1547104733,337466676,1911520102,539481311,223207315,454032325,417669867,1282661730,323754847,1401070332,1078772940,371910862,1045210504,1395430161,1228667179,2117029755,1933539876,1591558023,374935265,1484336661,292476484,1559229051,1987234675,1873667398,344375730,594122359,1959139634,2006108314,1974404179,597080032,193307002,987398077,1302980257,325506565,872288863,886478974,75237274,796516159,1787847815,1547705220,164964383,751479374,1085629757,1597662454,2059345885,435528497,1398579801,1076753291,193928276,1347371504,272105091,810195391,603682810,638449564,1008785146,1919590748,1670923581,1590338542,344805421,945957665,1775927863,39294685,2059329812,1225936720,1263858977,882390946,587444227,999104602,1466879748,1815905022,1782348784,765980598,1077505989,1918623961,352701778,2033179726,468416311,763151487,1459281833,594667745,927517366,465995865,1944676950,2041803107,738173260,984372031,1463089598,1956660975,1640654406,1491310541,850688414,325852453,814348138,944070410,771757475,1592318246,320568323,1971900788,849827549,904762621,1282752784,2117793041,1624739396,552842640,1399301119,391890762,1121484677,21068117,2082768590,725111917,540613671,902415775,2062473975,569578735,1447744479,270634454,1744087228,633321923,885690998,1296942417,1184269044,1431898131,589887068,1173297639,249054905,1523760060,518246598,675655988,1827984267,1142902213,72105168,660981713,338153122,1505276886,1873828190,1717954817,1099150414,1785132951,1933597302,1122319556,1161626817,2126074537,2082607115,816006704,180612664,1073108971,2005261807,15576324,2022513341,1097966708,1354389867,103102504,1499964189,647525549,1809096122,1419270621,510888497,1273302166,2037157370,273235858,2088842135,2024383032,2128908811,1607074182,1352505051,1299887950,1026775502,76050729,423688504,1227511471,298038833,1004197475,491879046,1806363329,869385831,1584150241,1810872549,2043335444,918420997,1000792966,882732928,664338621,780927016,1938291436,1548251942,559183012,786847027,1993114383,1963474660,2038274418,289055918,2005739182,510278190,243197980,546394496,171161125,901686564,1767262651,1795316666,72483083,1130201775,378747986,1630511536,1844704435,135186724,1874577822,775204526,1143920813,251013053,30084873,21100389,2045187436,1102423944,471157465,394839418,425581510,37839092,405931237,642861840,1462519634,603443570,1290793555,587067880,1679277355,528503423,1584070818,1003858957,626013710,2011424149,154062165,1784193120,669269444,2842579,2072305800,693284363,1177260484,152179208,421000312,1054524686,395415061,1423426794,1761699923,794238501,1373324773,186427922,226753765,364468103,1951494867,2097747845,2045188783,795663608,1583213434,1855606329,535742082,1781832170,1959495614,1973625579,1433142667,1909999409,318361359,1358267996,489879472,689865015,709827388,906719517,116517650,1373756750,941483654,1093099371,219136304,1543338878,1330695360,2073843195,576555337,154502614,308933762,811792010,1233311527,354614543,1134402106,633683327,1505748967,18451248,1735706373,2074199213,1971545596,1889703054,930376438,1582211159,595920089,970280457,1958192177,99400527,1565147182,1752635232,650740935,828628157,1733540518,1263328633,97170356,1884974896,1609544690,590756477,755979560,509432505,1886578984,448842379,113601321,2072213607,1496034625,1377971164,1942458738,833614737,224168111,1921676234,2021482246,175142533,114025521,100348209,477053392,1953147860,460462826,1251446560,1068300662,1692940178,1416605698,1039122428,1937045365,2063106855,1427073119,1121440465,2117563537,621162596,215551686,822685184,905554953,2052294548,2034143731,1485063238,141674969,1645418604,1968277350,484425723,1515455247,853821109,1190017182,463530909,564078296,1122481647,1572732906,1468688459,1005624585,1457250133,219977411,2086771740,32941863,431075039,621404748,1857298127,967784039,638238383,1415822875,1952914706,1461269408,946644780,119489362,172340933,2054249313,1862147850,1857150227,211445265,609114283,1091482164,650281510,879228527,1599896175,2107941913,1914694406,721627407,857929391,1775693913,539209601,635396596,626008312,1675242986,78395442,594504683,790256942,1934964807,1072671567,433452714,1841036291,565584172,1225851793,1372756728,1657153626,2030994281,945943261,378213406,102065310,34337217,1342413713,1540292336,1692122280,431998409,2030663708,1450642397,949673551,1680538354,264564916,1321699744,507873678,420682052,2020380066,6207991,441024671,235627493,372181886,1372552072,1610415829,1058921217,1368935713,1156099393,1864723640,140903546,1381220992,227142085,599151888,1824472763,264761297,1626273336,1838742878,500679394,1805925138,641027082,1098254045,179542813,1035731694,1082460071,84084466,1567061746,837901704,1879439890,1065870712,1807115266,1446454367,191098473,622650585,1168633654,1087122645,1153773231,1177689574,869823629,32177963,250649490,487152922,205362978,1147478314,878566155,623613071,1762419353,1345198070,1050163234,1262621249,1446176218,1208420685,1933697466,2042700753,982294557,607920321,699932232,1430552557,108182636,1279392479,44420179,1801010491,1806227340,1092936878,77958763,1452089756,960015961,421796537,1133029420,602255281,1759681816,537869337,1352473289,1265796104,1025793359,1163311055,1466508138,1817925057,1826474556,1494193038,1541731240,274228695,1720834628,173702256,9585097,1855909246,196682179,697961643,1294738409,1801512488,1138148439,85974108,1278105833,304868004,385726133,1094218844,1784913878,33340899,672165453,166525078,2049102037,442731361,181454958,532036981,737592188,1101111730,1208902895,1312632047,2573430,469137560,2116744630,920795454,68824782,155023322,1582464640,1824903397,169135216,2090218878,1812087053,1129728695,199451671,1921315361,326999730,1888589838,2080415690,1569067742,712963210,86579758,1277738105,844652917,1373508276,966349100,1218380048,1042638093,1096186797,916476439,1531269508,696025257,693549028,162842075,960644997,1111399785,459566428,2083941194,992689004,1904686307,1740490703,1496530794,1274223564,224544131,201731454,820234614,739109308,63731438,1026221488,715216595,1604146399,1096626807,516643205,1026058661,1104988700,265080889,1533673558,1078028926,1650390120,665744661,700513904,2094015416,2064384089,1480755958,1634139928,809187387,167497606,1456973099,516489155,431976943,1454405117,1953459983,1471896273,407309000,1136449235,1987059868,1423208296,1160300881,2064184243,1625773893,415880760,524102570,53697979,1601584572,512204147,668515371,14947445,146757432,966597051,477531316,1450980332,1667606213,153195295,347829082,268195550,944866176,1341981222,255072951,1832122726,33843644,1186303082,1267921356,1456558695,1935994518,1270108645,144229720,347438319,754944253,583718435,979987598,2074298008,973324056,844863197,524549980,1073052129,642627482,723104717,1251768368,679552293,324241356,1647607814,706957494,1245575939,622687325,565330517,1497312541,2095804316,303961874,36158587,68563334,129043028,756866574,1695637941,1428194062,141577896,855236372,1485136093,265939717,31017765,1795670858,1219280098,57412710,161931976,339151067,273841464,677233158,720093924,1859619320,1050359741,1768447398,1093583945,605618210,328665678,751514503,1676238642,248967458,1273604770,169641971,1970142498,864035757,947335792,1607616869,1348524502,1917440235,1716698571,630250276,1885961687,51676666,560015183,1743129481,2089255778,2079197055,1094240779,1289952761,1878176988,732550719,1061625349,176581351,1761320123,129679971,1309686845,319150196,1842901031,1895336388,25662670,346739348,280190320,37082549,1658677107,555924219,857019761,1919166371,2016802580,1843289260,1584876836,191302942,1860819241,1125184037,1642910203,712861767,1004645289,240118400,1286958733,1869448777,1522820240,1134630160,500865104,247250151,1424343643,1893596534,2055861421,1468651196,1339765851,1854536623,1136050667,74313765,2024101134,1716213903,242985469,2035109394,625035134,662075270,646391979,1435917534,1812619026,208079419,506013781,789152301,744637181,316847599,983931382,447383215,1322651029,2085278264,770685184,460207796,172648739,1206498761,1231474039,1508213972,1661944908,336357904,879017231,799041776,598222810,1200223373,253432388,1585399236,492868922,1301167946,2061299553,596849667,1029096153,1404785283,1408832760,1337384425,156163380,125484871,1925691437,1572852767,817049761,831719894,2072235074,2067328604,454139197,2073107255,1269952056,1758404143,62095057,1690638983,7722981,1254805087,495179247,669884522,911180713,86962109,1722614052,1274179620,800364081,1837979772,1611438540,387164592,1056416406,107426893,891220247,301204767,422928975,1437269300,657529404,484382056,1871860966,1034108148,966692011,1960352192,1823497987,1605849676,1238957849,1180858683,582666191,615180303,1524927311,378005213,1012903788,241681444,1376726612,1553720627,851058766,1794632688,2066526076,993161622,1745472375,289329122,104842214,1398753926,1556262681,131612949,1154183760,1309274323,121616333,1324453546,1008486043,1131470209,897871907,2099542078,1404718468,1703518092,85587685,1419744357,858549450,1975341701,2016012432,1255280293,2127787406,729368300,1068698915,133059027,1294493838,1735945496,1612529540,1850526962,927742605,1168538105,1359637321,1322469369,485727579,1730083052,1536786511,1234758754,1386425402,1615788031,1767371344,1546611344,598734149,1174863499,297556188,1039842802,1903864799,1692777242,2026341524,280560327,755904614,392163940,862007516,1222017201,361585855,418525696,1527007127,167454853,1607540538,1507281923,1787343095,1310969001,305185641,1245486715,1113543638,762893910,453945059,767572675,921112565,95796174,1403459242,1804976644,209738363,1802116246,807922132,575441994,1667645007,1727425309,334576870,1984392193,159221698,805460239,429568993,148582883,788267437,703236267,2052047267,974286008,2117816968,365811334,549705603,741941347,468848278,116482208,324076768,2046476157,1760311788,1742607744,2092474782,1246577401,952437731,782226572,1956778955,27540686,343666636,406046299,1918398838,1445964307,1674752217,623932114,81700714,868174338,1367485917,1324952768,2056642834,228476194,393956171,1944879875,983470611,1549925213,1761601751,532464345,1527945711,1658971491,282061274,1819130853,1590433952,1246417813,1623756682,1810282184,1543743207,876811590,1501862973,758069031,352214708,1448737053,58705027,787446413,1734155901,864752149,3466116,2014036855,806742133,1370216514,370161853,1009760455,1390269219,1163737373,1937708776,1814409308,1130150205,136501278,117287370,557471794,290705570,414188956,1567101474,2015767397,1958142594,1903319923,734665624,285107261,1499288971,610293788,1925028576,1176652550,454893182,468192086,904398376,946180526,499204095,843899843,1988107036,2017733435,1779994349,170347640,907507386,1580307543,1602091160,1221350461,579289117,1447609974,1650110605,232787849,694846688,2070249614,933776896,1500877619,1233165951,672669454,1693793652,1114626613,1491692416,1241873017,1855150370,301392482,1903911629,320438891,2071464817,1796679211,884511821,1981135587,1679553114,366616584,1854639278,515590772,2040229184,1919257187,1397586085,2038438551,1298242743,1824386603,555630789,1492376591,82449360,636265144,869257906,1502595474,973365047,2124957760,1774715855,1280946672,1361795189,502588272,1842489217,1567057543,26476928,1115183537,773253710,937881770,1427503268,279228852,1837067053,747901056,233904330,851575763,1253027294,2119939961,1566061210,346737682,838291820,311045824,1359000510,1528741718,188752170,1902071944,796132832,674058922,1617246740,873917418,1500460253,1398815028,1897204120,1062558463,497382076,2033534227,919294879,1938121359,1016026347,1130938543,2127247867,1206333718,1643565227,1992320397,952282193,1869627491,734044313,274352835,177248172,1510881690,301646705,813292731,1837269233,1973972420,1826837765,1650458114,253510885,1201370356,1530080629,878855872,1329093357,1434493262,740447295,895362489,1876715125,1775627782,1368055147,68269055,1292930292,1492234338,776751459,332041413,109578348,1540354305,1260978115,637479100,625099139,1993197714,1399155679,1746748724,1541469525,1538075025,630637004,1580078762,1338156096,306204087,1053484198,983959006,1067709284,852257504,1352094615,588713545,1771501980,2001652758,1915373428,929759659,1543752210,1954719249,1179154302,752478431,668439650,441575054,1306743252,925143003,2055772245,1533708019,75612313,11381635,485747774,77164099,628479127,2087696358,87040059,944222574,470044255,678331491,1515676982,261999189,97040840,2109780698,1985228044,162017084,1494414240,680257419,1872110258,290131568,1881482395,135554478,1049270518,1609524566,2122450595,46314445,1512357671,869263139,639486441,1695500262,1722736157,1152369212,1431566605,1675308954,1936719995,585429717,255408064,1231019876,1273664771,1093464116,2116009754,52783094,111567262,1472385428,445908332,690180692,932907561,1287802237,1179494118,641934925,699270164,1694543789,1837924346,1757821936,281131232,853541263,1779895164,1412218978,1154091001,345913026,1341182528,2058011598,1893683619,1878063253,990205537,1483041893,279557104,1057339648,618562490,379869235,1362568572,1512890195,502132041,1097418558,1181533432,979492808,2023190038,1013324173,2062005885,323770806,1129612021,1952510172,1599446905,1906246362,1746859140,1201851795,975108062,1260970349,831482851,494612315,1220394579,1024633440,861054215,1808162842,844645172,1074316941,326553762,1692108481,196057660,1847039222,612528688,1853297243,1085631989,1071878137,2031408210,1800477311,995691990,1882159545,848906054,1220905674,16173553,598010037,799686158,891840335,136164025,256683206,520906194,375442638,1293263961,843278255,218345554,2016815157,1346114731,2130033543,1572476345,1025837848,23428515,1643794569,854780323,557919613,436796021,124235602,437252034,267404664,1849706162,643878287,1515230176,1942372434,646252403,1543403389,853530485,1917507487,524495540,1651535994,1029392759,393893470,956078351,644246691,174733260,1284687331,953747937,305714655,108923435,842526306,132603957,1597388043,616019415,1909947089,1512037182,2019787872,1141582520,802790195,1345001231,1988141609,21982261,1110508986,2127530106,747268089,572101303,1930813176,188881762,572709733,737558509,350154422,843210995,2122326912,1812082902,1929014732,1678154262,397563727,1776026956,782121850,1896051522,1575647137,1760580552,838651736,418625625,662571177,23791408,441925039,1822124860,700735462,12155260,581869435,1729013633,889637822,993367397,660002171,1423054532,922963222,1907801477,1188931067,1865586792,1002920363,1519410486,949942699,1009146239,1391718877,1422080748,1767380171,1539989669,1322307029,1068629396,1257482118,1739525303,2058248893,2105758199,1794350139,1604882451,1135705739,636643178,697091923,1878300925,562506295,2027389892,1941819435,583829465,1286738107,89209131,937012997,176840608,878997971,507833039,509598989,1183191141,133211639,37764251,212932072,1270956888,583522871,1653752955,219134998,971998895,1140134928,1014991998,235385059,200118879,1496225793,1367906732,324891125,1877758642,1606312150,433398280,1642702538,85139304,452347600,1826095544,1661324878,2103985101,991791502,1136017691,1950906725,395236340,182430261,1847638556,1528844785,21340021,775809936,1455929340,1104507608,1970372658,448099379,873099782,166295079,1177838468,1357174200,1343446365,1998440607,306479327,486868737,802091417,1538235487,1251077960,1749911292,296126916,1960820744,1493981915,1885640049,392399632,1912172360,49072683,599188757,313774312,2018154040,1295932306,485298413,1798804455,1432182056,708298769,2085017714,1161701203,1488888514,1705777488,1864914224,1259029350,1132683174,2085875547,1322654944,1508666841,832435403,1556293521,1783471257,481460619,569922184,1095363291,1821155424,485074119,1070790333,1523186286,832794766,1757107676,1750773900,584188210,1831378634,110185419,1177408198,872797925,1059430030,1225467962,1765375818,225694683,421788521,448672324,767298171,144165833,1525140751,104738146,604932237,221425004,1244643179,2079170391,720271472,1758350036,1395835503,1377368529,836239726,1031193598,1229769129,1243072801,1535146108,1701231095,47087193,424504340,573116768,1873858885,1548010778,16463584,255365630,856422324,185577357,1857611935,1277093299,1111856180,1871688095,1178094608,217891131,1721422332,990676891,84727726,1271864159,450320045,1414600072,206793695,643720713,1364460217,371203781,607409812,461903096,840488750,1866167012,523802259,1440167589,2017644930,114152940,256780250,375037498,1644346660,56913503,787437097,104313142,1096649787,973129613,1038929435,660148657,379132009,1337440851,1970459131,285231602,717638989,1303814745,2004560480,87658044,1288695143,61261955,1165734026,871927591,1683978274,1131727894,206213276,1190813930,1994909762,1193497804,1891027077,1258716765,1503334096,586268311,71419367,480003716,437126190,1976721426,603721166,1748724505,897608710,112644715,2026269076,1039165217,911096326,1385228750,1869721325,1504220284,560446481,268380495,1486383725,1633641747,1119999854,1531996081,786810093,1092003549,638422136,1907317199,555512549,1307843284,1282575604,1477885538,1842497356,1960034517,1656743469,1862935908,102613344,2014079773,1108724123,1604920953,1027024590,2044921399,14398881,1889597738,1259066873,2057101815,1890457671,296940268,2001067486,458972378,1686953560,266571259,1958425850,1569098176,561361671,1882908895,1986627575,1072758102,527813418,1189421837,1572745156,1925195282,1316310473,73341578,857925380,601247380,1161014827,1778997673,1232852333,727307583,2093277172,1684833646,1201983901,1177496530,1411601909,577321699,690379222,1682135277,322766581,159219864,351184952,877373190,971570114,589326161,302899008,1594845597,195066723,846449637,776667948,1723124414,65642954,614507255,2104016372,143364129,2107397981,1027130382,350273543,1802456755,1602462424,1275602989,1952338942,676093751,864456885,1914706586,647153294,315635022,329030227,519789948,171034936,1899080910,2063649067,87522771,2110907298,1484343040,1604790867,546413636,1011518732,411477488,1398723095,1604967299,1269644870,499842682,1629680187,55634867,711988060,2044881664,2080422845,2118504774,31180954,940044970,1294252422,1782441777,930321013,1782389538,1223395677,1204216403,1961265199,1320169591,1148871721,986716457,935833806,1748832511,1067475983,406123958,106264579,1733534498,1698098098,116075831,1783292502,2046443717,2121921,2109450386,573840518,1651951030,1172658137,1115920953,965479602,1815446426,429378593,1985976777,165829471,519226166,975717091,1814677040,552347016,550935806,96094991,1288302228,300027305,1887119471,366721666,1691617264,1172828198,1530314093,237763973,417437831,551027278,1124471059,1488758795,485352833,1061570689,259804932,861790331,592680994,1844892967,531675466,394325983,2126430860,26478728,829130985,1542017417,900879648,1699693427,610015561,1183093875,869167915,1413444278,1386461764,1273670462,116095900,840304243,1797625797,475702464,1259862357,1494044222,126282288,978879265,532566474,765343757,804215578,433840290,60253706,705859336,757562737,532940102,888586492,1863913492,1410978763,1362819156,248247798,2077046342,1982603446,2112723519,890015521,1282862262,593123576,1249482866,542393467,515668055,1880312751,1170488410,430777382,1372782906,874618643,1637632677,135440861,298659570,272167166,1885932827,1244959051,1156833823,5369192,1862222162,566078985,752993737,2069042729,1304332725,1443125674,1401368582,1606335844,1785498482,1484470627,571874799,307495957,1832914451,1863068655,1982406388,2034314127,1200740716,859296434,1106562993,624788955,2098573413,434864779,1521415785,1585434722,1911922247,2099621491,1735305976,1002126703,29641197,833015099,1236997445,703254830,764975874,694613101,1902704642,1908263678,1572992140,438689503,852971243,1367088162,662157319,1635076450,1670447037,722358493,1363518316,1323861791,1988663393,1082046241,661904025,2115649700,1758043957,730593284,468705322,234064952,1532146550,438683518,1776832166,1949101588,1167456794,1269211036,1395849270,1884228764,1877382802,1182603293,998602,505216142,2063263606,432744001,1355276484,1049487143,1669165754,2091540309,819748454,482976048,499085152,34716848,1782008516,1845080066,1463235698,1724088371,966329942,1621767058,632456547,683015238,1940087644,397810268,373217703,980429851,1753257631,1899750756,919900322,193542430,1691796942,1451761150,660599514,90536142,1030437826,697929451,313279535,1274406168,671984814,1581194433,322435905,1165756030,915604623,1583467248,2088020423,1039079829,295925345,1957333460,2128693753,1989192473,838937670,2006760773,1564459235,1172556676,638216007,1423704876,532313346,1801999695,2056239772,549796897,678241498,1384462475,295748562,1097762423,1553705641,104726796,1075645547,1921947570,155025906,2021911150,1933704273,1032203042,704000297,354398748,1692561960,992004806,874584762,1386628672,615855998,391313521,2059793150,1597857661,1902622139,1881245365,1486071235,1368911860,2017918760,1310356524,723889049,540846364,1141520385,499872085,961071952,921304033,700674955,1551650106,440835198,272947727,333093809,775905123,879474647,1456772121,274305009,1885082924,1561442073,947224458,271265950,2001470772,1293969497,1083708726,932082897,69905703,1079364857,974264012,534778683,1767252570,431665191,47484131,1261526083,1459479750,80099007,945515950,1199339822,36966248,899833396,1266547920,427459625,1477843349,657908403,718488748,465131129,1508397401,151343742,1367843746,1310904420,942277723,1435519660,1330609851,1338929450,1209410825,1297581208,281861380,26746584,1905625197,668996761,1869606548,876998509,1452070576,37969861,1502527448,1331141111,1791397451,1191457639,39445645,247904103,814830807,611944465,1152250278,1179322029,1137376540,828151920,251490332,1695654158,1120487702,2056232628,1977182556,529619470,1179542323,728404465,94632350,979092748,418867565,1465390707,1378288396,850086268,933473220,2032633544,839719802,1755289398,1541904016,1626395496,1240061395,146556850,510897284,352237253,279162639,410994634,720716187,1972904950,1009405250,1943804993,1765807633,1264279353,296949034,799455095,415503452,2017504387,1336632620,987620638,293116237,1385387702,1906332397,1861013029,647039716,2120995588,1486221380,1396833444,2102216446,2083576145,2099288703,2005242265,306576903,1589673748,571103021,1664949557,1035515197,386278824,1847424089,1420935472,1869609731,612782539,1523693759,4683530,1217722594,539584402,1702943019,388002374,245527421,817587475,1787537444,545177381,2031892034,947194513,971872857,810226603,623604954,137923683,366409242,1130286134,47274123,492134108,32925736,85843919,43525649,1071477075,1493844383,1669954367,446915525,2030682581,979624618,468202865,1586830136,1569670251,156700226,799844137,727863003,1750408987,1444280894,289055934,807411468,993838935,323854066,366585659,869051358,1134455992,1547140189,261886811,1349039506,1847554303,1014933265,187731217,109272165,1727397505,951481524,1079155738,376463522,1737713867,1821514374,2023213924,337765344,1562287981,1334573567,1484376064,457536444,1252979180,623905086,1934975606,268976303,832992254,22707114,1545921380,498990949,223589150,1119723736,322020649,2118786256,496037234,816950109,951737387,1415006948,1849924688,698065111,1815277331,511224297,1549697002,537422314,1518496559,498287900,434806578,1762691171,1743999472,236026674,2040425103,1268010793,831426214,1522092105,2014282792,531683401,1178314535,1399449637,1582443083,1547993329,2052475846,1399508203,400388698,867728465,430318479,401468174,660806388,850991380,1329231607,725621676,522853110,1608720750,67933040,1989760199,2051305575,2107948102,452058342,681476308,1036037683,1797261262,288861637,854209248,149175835,243926944,1995322688,1513309725,284156401,400248825,1050759918,1173560795,102174484,92371485,1654253563,1841191460,588833791,1127677139,1613723854,1190432972,1752309444,863751110,1000283510,1973897969,537965938,1141539022,2122021995,988198228,1337464160,635846566,1556322614,1510185457,1678479972,1492130512,1658304426,1331220842,737305955,959335482,318448581,1602846534,1815810010,1825807426,2025205495,131935809,2073905032,1730901198,1019056689,1998940857,486443200,1689104620,1862991702,1692964486,808129337,1360666476,414861381,787870777,972282465,1425892719,795237727,57087486,1930687058,732790078,2109074893,1896676048,1517265645,2023956422,2003558655,422606044,240359659,1158708322,192588102,181654951,1452352548,1424478907,777283707,1811587137,228509011,728668753,94975951,35388640,656468241,1916982094,1185446579,205115940,1947206714,1240575958,646660442,2068457339,1606802500,351108944,1354977704,200901143,937253886,158113598,1068437991,1732657260,1014418062,581989931,832996887,397971593,151392550,594075702,1620802034,1616766873,327271094,1383875369,294249670,663249898,2060469358,273336286,102300769,1871225715,498105630,1203213040,1330488693,1782779714,610248145,43827744,299126844,814007717,649547,1011671337,1960016843,114951569,813869124,85958827,641052044,1545876639,1163169192,1573237706,285416152,1035842581,1179156235,1180077574,151874235,692167489,56494966,1295509599,1740269304,1965526464,979605121,534098215,957023779,1067733038,1151963067,1154468355,542597479,1518808126,1554415090,1569179421,2079840977,172794918,580547423,327634148,692380329,1767290574,872549213,1756536500,994151584,802068466,1422567256,866470021,889267467,63446722,1321717536,1801779711,862806562,1356458830,198632543,627861265,904459605,1493232826,146701261,74748516,659428376,645469849,515673713,473980728,2017928907,1061041135,90374434,1463347927,64731422,2099547128,632738830,140203129,417306735,318883357,63719064,672425651,305495761,1112567107,2044964934,259507484,496039179,1625339344,1666780304,1485649017,2038827718,1443534820,98207686,1592858769,715245301,528106765,1992666559,1359658610,1988867631,1807492637,457519190,146956040,1281532674,1537415419,677671772,1013690629,126890716,360365833,1421421106,208002605,22068957,660490918,528966836,1552757363,1060274779,1707017755,1004863805,1285868063,1475437344,1924893065,1860474870,1766423159,1220338231,1651205733,1077970656,1962667310,1889477916,829243365,2058675841,2050782512,1846035824,1862553182,430384938,2116984064,1053253520,197497535,610239897,1683699837,1399532920,1635092785,1707014369,837010494,603809560,1258813284,59864396,1492808865,551248642,1406079053,331008823,1942725320,95053718,421943413,1420308463,1655374993,1878699901,900049993,502364193,1456326184,1729779571,155541307,866468505,1676843891,420591912,1546447584,1635835685,1750973405,787181649,413457360,1354664738,20213997,1048962282,1057205960,1058878419,1774578925,128166758,493291741,708807726,413884185,1962388668,1779680329,706919083,902532802,57746092,263640792,1793420439,1501207399,1226208190,90388092,1486174245,703466419,2005172651,581245599,1200952111,1388797856,1475237109,317039222,1832740669,881999262,99236953,1273056547,354784153,1008811026,591020082,1035999634,1192141319,1935425942,538878980,1284172622,1422223958,865761985,1072850027,719000441,1088864614,1125605638,537430962,1175121695,265743208,1462950019,427898782,818965483,775349386,299823184,1682115226,948659870,1011856964,1357755894,1879922197,1929399223,1424295900,636036416,718968444,191403519,1943081114,160799936,1984950771,1028804639,44445457,1532934039,1425923884,1035681800,1351256020,1747711218,1569121611,918701946,1990966888,1175847160,700608762,714798880,1095972894,1248410498,1135999539,349052394,1998351949,1188392725,574768435,1671501763,1835566619,927265188,334027087,1890212856,1089304122,507328632,1393373386,1198992362,87356449,1932053392,453290179,1508167179,1237329300,1784060662,293187650,616906651,1777101774,1596395592,74222477,64563612,417872292,548901425,826642759,711347635,654493492,1856393691,1618222703,7970089,814171043,911410861,1727202776,92204276,222622880,1177396015,247053262,130381058,1853882760,42621120,1088790071,1376670396,733886540,1681337818,1142336606,796081576,1402706240,1416220392,928564688,667092327,349007401,475024467,183746405,1384640784,217000656,518645197,924721033,906595238,669793288,1242603132,337469620,1506100761,808246745,210600942,1945477009,270733103,298644790,144743975,841301838,813586778,1910450079,233649375,149045763,510745102,1276373646,1019600888,210397359,150408065,1457730325,144558535,306476928,944829245,899073672,1460424771,1324358265,143198502,1031976728,334308504,1468750739,1214402465,928937761,1960764192,413299378,1080069516,114160784,100256189,1384521336,1127001169,829434378,1797052828,469334366,35358580,532590223,1662096159,957568939,1139791236,760137335,317572329,1241537184,355956766,377502054,822904650,2002158602,451871918,1228979226,642478614,569071616,1033048800,43455149,1631057710,1306943517,1207320823,1077426481,1602675582,1911239657,77681079,1653618347,1105488058,576644463,1257959215,684983979,226400068,1069709950,877438784,1318607781,112463121,77600398,1180991511,1534688854,1891745048,171396576,67754355,257034105,1209523562,828614816,88795163,1665270293,2099700406,1754254752,1000876553,461661153,1425244987,182676765,1527269623,1894345241,77261343,234892159,415068064,1117953324,321861079,1419995608,688864151,1828216236,1713935536,1154811978,1049151528,1714173837,1866084357,1984671096,372151768,179310034,1048686334,737042570,1617145368,472417439,2104523106,883462813,1657741308,1498005725,1562392291,1374489675,1923502712,904953356,379024367,1543197320,1012615070,641850045,1366356518,1052212306,196117671,434639503,1455224012,1440675740,371684980,358136836,958869611,1549846783,1947546204,1258020859,2006649904,1007877515,2079298381,958676843,1898922376,270323199,1782594895,1319909546,1041469286,1287708963,1383483848,689937975,917823926,1929377489,730843994,1574522190,850824265,1431345137,261872594,1752789411,1837957552,298010788,1321031803,1121642646,676664584,1210986273,1384233031,370005483,808984997,38254829,1666977388,1634147849,2074856442,268911471,1303632759,1756609521,1005541429,725662381,613129795,1321420258,696865204,1455403085,2001065048,329617294,1464512054,553505572,1179067834,1657810276,264905254,1431010768,38695240,1953368135,150924997,1948024033,312082560,1292909038,1058391615,1324817631,1074728409,1074132028,904185790,870585612,771761638,954220725,371625824,1718866415,622302340,346148333,1971659717,1302641184,1064532979,1314977288,2111437275,303591080,1168671112,1169498448,117951073,1556853905,922847731,663998834,1817353344,1696852285,2026406651,739987590,1952148546,339610427,1904360292,1951567191,566098689,2051934476,448725153,867739628,1449767486,170411066,1815221605,1308682534,1270602801,965236574,1190968480,1156542035,834156951,1276624175,1920155,1545473685,74999782,1895825905,1802927506,2068366899,570967659,1627561684,805945935,1445876192,838045614,1307824884,98957475,1430076719,676701527,1057573787,255978491,2030049479,867837407,810386481,311953317,2040116166,2042304689,303006190,249770101,1514371946,1613832112,702593436,298707950,481076965,1822685590,605046535,858443249,1361327768,311276860,1494127784,1350066320,1125489084,1605184057,1908889190,1193851694,310491587,1497687266,1991030224,1518969077,1386189679,2014856784,2013563819,1232690124,806653921,1372446125,1896491792,571156154,110901073,511030631,1311790062,1555866894,27152234,379927942,1095303433,206997382,364368993,1489266545,631655927,1670305819,2003523031,1415505367,863917253,1693540705,1628805394,1150030051,1739614926,1283868952,707264224,87203593,1094049921,1662446843,1752814456,1208366044,233135086,297870978,1407352654,1395733471,1957818611,1716069655,1110938617,1763471301,1495884839,1412744895,403734198,700051656,12423069,1862154071,763598600,1236503694,651459025,796415431,1651147196,1246227647,2115506160,1761830958,961786041,1914154073,855710098,572087361,2043166934,2074682672,758559841,1409971553,1335864265,878596195,2044949126,39140000,424792354,993375917,366143319,1332998486,2040654367,1906675331,2062736837,1691923988,142429151,175238364,2081771416,809713689,1147241065,858098780,1851476578,2013963061,874046120,1512707290,842878583,1340386203,198139420,166959712,789632425,260474135,145630421,2041975501,348369835,1744155795,1960722371,1757283171,950155045,886110724,438104573,1819054603,1276380684,1144223019,275658916,163945036,1116541137,980012781,256774901,1323997576,448654134,1199051675,2081583561,2008655933,812743923,1889371084,1768278563,2023314463,82138012,420066356,1160695546,1879434234,1118744230,1690206375,439163182,443505387,1574660178,860156891,489925733,214508358,1528883704,667701088,2111260450,1746985262,2060186545,1980241446,1096250468,922492891,601870916,951982016,1973209598,1221788330,710453941,1655242628,2007577014,1837225465,2048418112,306117191,520392896,1813173159,121849656,48887320,1640767912,1217066137,1957111539,1302308129,28095858,1856052216,1120283620,1729030840,1293328902,1334336060,1868728361,1209225285,170693300,957119452,2097380923,1423686801,1860937067,701660707,664469712,273890030,2123843039,845440494,1508476480,893829225,154368516,1052588448,1077624263,1906966719,1573570695,1105934049,2052382749,19217509,110209660,466528974,1233709730,397370869,2024934384,1614972852,878766008,646167383,186546089,2024508969,223725348,834844235,1559938662,1910411352,243815846,1855920210,1663610342,1722160742,1994300442,398776941,962826053,1137790705,16793110,1413322925,194458942,204682013,1043412463,1185156067,1153036121,870024428,425458005,437511806,1462603735,575420531,1456522244,1014479698,383000329,1988572598,1829085172,1503960773,1279649792,1775293894,1421151197,200993384,2056582703,26792142,2039952655,1991883923,595913871,1764465380,419187155,1499140394,220822102,1291827818,1385656105,2111006482,856679795,364798062,1232396022,805483369,1069332654,764514387,637366070,1475469830,1946868609,381897651,1261003023,1217273269,1889943546,1257159555,161709039,1154430262,1081055770,98912480,634175886,1864254769,613239259,1279049098,551622342,1223991739,1898424554,1777839245,2023100811,1117048813,835051815,2116765018,599243559,898044635,1999241718,1398075367,1734904161,1994476711,1415444635,97466688,1885134988,642184692,1622560997,1148104096,1280831961,722000133,772226291,1641249284,590462341,11361201,345126049,1599190204,143749714,389382106,1718043943,430129028,1465646575,1036858365,1509018068,367405409,12366637,752003815,490147913,1614863789,827713707,1538938477,1824319242,1447082350,1102577723,248867410,707129132,1641112251,1758094015,1456996415,1252452405,1286269582,507283905,1966476892,1905230791,1223707737,1407038735,1393644664,2122080472,1000014742,1040896686,1843882568,2067554512,172460714,1653000497,1871528707,205046197,1615224624,307891856,878101058,12725411,1765048729,1593548130,830558830,2012018545,942056048,1981149870,222333413,1920596870,440632407,1380216788,1951903744,183051128,1900987592,1624626743,713783101,170554663,1265217219,899989162,297729432,1720134586,643522489,1585250814,519731873,2066855345,50155623,993404527,538119854,458298280,1823692887,1533727065,686927017,1242422794,830717575,330144470,1598538367,913499396,78978971,1811808933,1930160823,1828751968,1519979994,108131407,1336221625,488520520,224121782,765049896,1188208596,1483564130,768709732,2107262662,1602038850,921799535,759743611,1006477727,1309076600,322266936,2043738458,1933490560,364535082,1925821742,1406405514,8116590,481044086,1366410938,258938095,230752192,18908814,451064865,1143024033,2130132098,184953598,643997911,477918133,290531433,412386242,1062171180,1629501604,1299649057,397022085,1122864668,1785518917,1880001305,7457272,1051931275,1931962433,1322330781,1291202533,950635849,1593791893,266660771,1062706947,590969753,2000585275,1391807128,1961706963,1050711785,2071575035,1022510720,957830178,1568406003,1598541487,672191673,488499391,324115869,1819548138,1462892474,1302275387,1422494452,873318007,2094637206,144977331,1638944273,1892648582,1771847696,140641335,1798524785,1506340049,1725699169,343342882,2001746933,81277,1519817888,664687716,972593134,20001452,928435648,177045794,2080772676,30729513,6827675,374790180,1231694809,1917876124,1040789344,39646947,645324533,539460536,2115250272,164337821,670394153,325697968,2063077371,1863111598,503519127,1154261217,1076499552,321945791,1248707159,1008110570,188697240,1743502314,2113581239,258939783,700120167,1187362841,1136890574,1175699837,1429570680,377580847,1761889496,357867883,634400546,744583921,710410361,1868543903,1386557011,66852413,897620226,1460492743,1690108230,1072966687,969387098,1596184029,893876622,1431375545,613232982,408045865,2095916505,2102493036,367005866,1834149606,1791909292,902341339,970088688,454276711,166091926,1817235206,25159985,832294226,1915021020,1930810309,111303621,1042153193,364839604,754413501,1252577286,666318230,464050908,932959528,791578155,1442081445,1785167447,1853549494,1714053688,1041666274,401349908,1802999200,1545765225,851495223,1033774342,204136707,1875983606,1938592468,925312270,1366357394,812421051,2007737425,1850229320,32000057,85029023,1903620835,119852656,810308657,1435015672,458453742,1572647669,1012401558,914463718,676479884,528040946,1138505592,697372446,1090770224,895530739,1162759885,489827995,737768809,907623763,1669518876,1930023772,1969018956,952382581,2103116989,200917332,1842293935,2828521,179751937,2083584054,941548594,195335586,75899989,1919390268,928004587,1588033798,1834601987,1775313280,124960801,881293315,1709682580,1606796699,1612246312,861286301,278927446,779933548,516138658,1862241190,726423649,172563481,452947571,1290002826,803353843,1346113678,1412574363,326376067,128040234,2017043029,911299728,1287453435,1882125410,1693115602,136493858,1248525626,1248622621,1421685611,200477902,1512895724,1676880899,734595678,832620647,444835679,1032403612,1360932101,2040472804,877740777,1691970031,87787444,925097839,1523406711,537747530,87317312,1913983758,1307293445,226013497,1157426394,345607820,615093583,1996235889,269291299,1346229981,1545092928,1042724400,1390645687,949338147,187750820,1708097748,1556254438,663311203,781080230,713094360,1181783008,1266535596,2125207268,1778641246,502132526,1033332562,1350243620,1236831778,603948360,1628453067,435141958,478415581,1371309026,1560840398,312776442,1342442772,1219122588,713721543,1852709122,683093877,786147416,1210992225,2068920305,253461317,1342257976,26786604,2111400545,1539997690,2021749696,1751847966,1417186166,932575319,1589742818,173368746,2030956196,65232779,1717220747,562610073,1649515781,788417182,478248499,1389809012,1801205818,292779897,1625313522,1407639215,356299193,668978160,1657465693,1288620333,858379947,313781194,1579922904,896299025,1303580355,880331406,1538726304,1723115941,1302971183,1175968645,1427813823,1848130780,1588766398,2064763520,146984190,218476183,1418900283,800064853,460918244,172259695,1106510788,535810228,54209010,546763215,155430641,2007609829,897917016,1891000346,1229883346,185825666,45693229,100983563,139832601,2107142458,574700181,747423250,2044796784,1638613312,276447709,164302512,1464849822,210012168,1074782930,839092222,284790589,1284316474,2111834003,2111374673,1772095053,737726576,1880690064,601862659,1988755145,666037233,1963338683,480565111,372868122,928454732,1732659866,1722682573,1314119610,1059006238,1285483688,1505908817,571452796,933349786,242622348,839914209,2015209700,1860362154,1396030389,1395104514,1752350618,614601836,1630231299,667956837,731552831,1482481757,1086348526,639012514,267556898,889099702,404370789,682271191,445448341,1340210128,1190669742,2011408374,636541345,1753413934,699702573,1646672830,1842940163,2023979342,1330500555,405967432,928144370,1832582660,693322183,953403928,2074173845,832931954,1472635887,1347437218,1648717391,35357523,1891920398,203500228,1877808784,1103507604,1688857529,1034640088,1942877044,301897596,2085996948,637212563,1073593622,398565162,1368272862,1895080434,2102693325,660639893,23586539,866042409,567716366,1372285429,1710102863,1856230806,79326223,1998385538,1094635383] \ No newline at end of file diff --git a/crates/xmss/tests/xmss_tests.rs b/crates/xmss/tests/xmss_tests.rs index 7e60cae5..40bbb637 100644 --- a/crates/xmss/tests/xmss_tests.rs +++ b/crates/xmss/tests/xmss_tests.rs @@ -8,9 +8,12 @@ type F = KoalaBear; fn test_xmss_serialize_deserialize() { let keygen_seed: [u8; 20] = std::array::from_fn(|i| i as u8); let message: [F; MESSAGE_LEN_FE] = std::array::from_fn(|i| F::from_usize(i * 3 + 7)); + let slot_start = 100; + let slot_end = 115; + let slot = 110; - let (sk, pk) = xmss_key_gen(keygen_seed, 100, 115).unwrap(); - let sig = xmss_sign(&mut StdRng::seed_from_u64(100), &sk, &message, 100).unwrap(); + let (sk, pk) = xmss_key_gen(keygen_seed, slot_start, slot_end).unwrap(); + let sig = xmss_sign(&mut StdRng::seed_from_u64(slot as u64), &sk, &message, slot).unwrap(); let pk_bytes = postcard::to_allocvec(&pk).unwrap(); let pk2: XmssPublicKey = postcard::from_bytes(&pk_bytes).unwrap(); @@ -20,7 +23,7 @@ fn test_xmss_serialize_deserialize() { let sig2: XmssSignature = postcard::from_bytes(&sig_bytes).unwrap(); assert_eq!(sig, sig2); - xmss_verify(&pk2, &message, &sig2).unwrap(); + xmss_verify(&pk2, &message, &sig2, slot).unwrap(); } #[test] @@ -28,10 +31,12 @@ fn keygen_sign_verify() { let keygen_seed: [u8; 20] = std::array::from_fn(|i| i as u8); let message: [F; MESSAGE_LEN_FE] = std::array::from_fn(|i| F::from_usize(i * 3 + 7)); - let (sk, pk) = xmss_key_gen(keygen_seed, 100, 115).unwrap(); - for slot in 100..=115 { + let slot_start = 100; + let slot_end = 115; + let (sk, pk) = xmss_key_gen(keygen_seed, slot_start, slot_end).unwrap(); + for slot in slot_start..=slot_end { let sig = xmss_sign(&mut StdRng::seed_from_u64(u64::from(slot)), &sk, &message, slot).unwrap(); - xmss_verify(&pk, &message, &sig).unwrap(); + xmss_verify(&pk, &message, &sig, slot).unwrap(); } } diff --git a/minimal_zkVM.pdf b/minimal_zkVM.pdf index ba8f3f45..e769e926 100644 Binary files a/minimal_zkVM.pdf and b/minimal_zkVM.pdf differ diff --git a/misc/bibliography.bib b/misc/bibliography.bib index 1a9baac3..efb291f9 100644 --- a/misc/bibliography.bib +++ b/misc/bibliography.bib @@ -88,6 +88,15 @@ @misc{top_hypercube url = {https://eprint.iacr.org/2025/889} } +@misc{poseidon1, + author = {Lorenzo Grassi and Dmitry Khovratovich and Christian Rechberger and Arnab Roy and Markus Schofnegger}, + title = {Poseidon: A New Hash Function for Zero-Knowledge Proof Systems}, + howpublished = {Cryptology {ePrint} Archive, Paper 2019/458}, + year = {2019}, + url = {https://eprint.iacr.org/2019/458} +} + + @misc{poseidon2, author = {Lorenzo Grassi and Dmitry Khovratovich and Markus Schofnegger}, title = {Poseidon2: A Faster Version of the Poseidon Hash Function}, diff --git a/misc/images/fancy-aggregation.png b/misc/images/fancy-aggregation.png index 67d6f2d0..4f633d09 100644 Binary files a/misc/images/fancy-aggregation.png and b/misc/images/fancy-aggregation.png differ diff --git a/misc/minimal_zkVM.tex b/misc/minimal_zkVM.tex index 65c187c0..afc503cc 100644 --- a/misc/minimal_zkVM.tex +++ b/misc/minimal_zkVM.tex @@ -47,7 +47,7 @@ \newpage \section{What is the goal of this zkVM?} -Post-quantum signatures are at least an order of magnitude larger than their pre-quantum counterparts, but the migration is necessary to ensure Ethereum's security. Hash-based signatures offer strong security guarantees and conceptual simplicity, making them a promising candidate: leanXMSS at the consensus layer (where statefulness is not an issue, see \cite{ethereum_signatures}, \cite{top_hypercube}, and \cite{LeanSig}), and leanSPHINCS at the execution layer. A promising choice of hash function is Poseidon2 \cite{poseidon2}, for its snark-friendliness. +Post-quantum signatures are at least an order of magnitude larger than their pre-quantum counterparts, but the migration is necessary to ensure Ethereum's security. Hash-based signatures offer strong security guarantees and conceptual simplicity, making them a promising candidate: leanXMSS at the consensus layer (where statefulness is not an issue, see \cite{ethereum_signatures}, \cite{top_hypercube}, and \cite{LeanSig}), and leanSPHINCS at the execution layer. A promising choice of hash function is Poseidon \cite{poseidon1}, for its snark-friendliness. Since post-quantum signatures are much larger, we need to aggregate them. However, they lack the algebraic structure that makes aggregation easy for elliptic-curve schemes like BLS. Instead, we can aggregate them using a snark---itself hash-based, keeping everything post-quantum. @@ -133,7 +133,7 @@ \subsection{Field} Advantages: \begin{itemize} \item small field $\xrightarrow{}$ less Poseidon rounds - \item $x \xrightarrow{} x^3$ is an automorphism of $\Fp^*$, meaning efficient S-box for Poseidon2 (in BabyBear, it's degree $7$) + \item $x \xrightarrow{} x^3$ is an automorphism of $\Fp^*$, meaning efficient S-box for Poseidon (in BabyBear, it's degree $7$) \item $< 2^{31}$ $\xrightarrow{}$ the sum of 2 field elements can be stored in an u32 \end{itemize} @@ -263,16 +263,16 @@ \subsubsection{JUMP (Conditional)} \subsection{Precompiles} -There are two "precompile" instructions: EXTENSION\_OP and POSEIDON2, used for special computation (extension field operations and hashing). Each precompile instruction has three (potentially runtime) parameters $\nu_A$, $\nu_B$, $\nu_C$, and a compile-time value \texttt{PRECOMPILE\_DATA}. +There are two "precompile" instructions: EXTENSION\_OP and POSEIDON, used for special computation (extension field operations and hashing). Each precompile instruction has three (potentially runtime) parameters $\nu_A$, $\nu_B$, $\nu_C$, and a compile-time value \texttt{PRECOMPILE\_DATA}. $\nu_A$, $\nu_B$, $\nu_C$ are defined similarly to the ADD/MUL instructions, with the additional possibility of $\nu_A = \textbf{fp} + \alpha$ and $\nu_B = \textbf{fp} + \beta$, but these two must be used simultaneously (if $\nu_A$ is fp-relative, then $\nu_B$ must be fp-relative too, and vice versa). -\subsubsection{POSEIDON2} +\subsubsection{POSEIDON} Compression of 16 field elements (two blocks of 8) into 8 field elements. $$ -\textbf{m}[\nu_C..\nu_C + 8] = \text{Poseidon2}(\textbf{m}[\nu_A..\nu_A + 8] | \textbf{m}[\nu_B..\nu_B + 8]) + \textbf{m}[\nu_A..\nu_A + 8] +\textbf{m}[\nu_C..\nu_C + 8] = \text{Poseidon}(\textbf{m}[\nu_A..\nu_A + 8] | \textbf{m}[\nu_B..\nu_B + 8]) + \textbf{m}[\nu_A..\nu_A + 8] $$ \vspace{2mm} diff --git a/src/lib.rs b/src/lib.rs index 0b3c0925..092f00a0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,62 +16,3 @@ pub fn setup_prover() { pub fn setup_verifier() { rec_aggregation::init_aggregation_bytecode(); } - -#[cfg(test)] -mod tests { - use super::*; - use rand::RngExt; - use xmss::signers_cache::{ - BENCHMARK_SLOT, find_randomness_for_benchmark, message_for_benchmark, reconstruct_signer_for_benchmark, - }; - - #[test] - fn test_xmss_signature() { - let start = 555; - let end = 565; - let slot = 560; - let key_gen_seed: [u8; 20] = rand::rng().random(); - let message_hash: [F; MESSAGE_LEN_FE] = std::array::from_fn(|i| F::from_usize(i * 3)); - - let (secret_key, pub_key) = xmss_key_gen(key_gen_seed, start, end).unwrap(); - let signature = xmss_sign(&mut rand::rng(), &secret_key, &message_hash, slot).unwrap(); - xmss_verify(&pub_key, &message_hash, &signature).unwrap(); - } - - #[test] - fn test_recursive_aggregation() { - setup_prover(); - - let log_inv_rate = 2; // [1, 2, 3 or 4] (lower = faster but bigger proofs) - let message: [F; MESSAGE_LEN_FE] = message_for_benchmark(); - let slot: u32 = BENCHMARK_SLOT; - - let pub_keys_and_sigs_a: Vec<_> = (0..3) - .map(|i| reconstruct_signer_for_benchmark(i, find_randomness_for_benchmark(i))) - .collect(); - let aggregated_a = xmss_aggregate(&[], pub_keys_and_sigs_a, &message, slot, log_inv_rate); - - let pub_keys_and_sigs_b: Vec<_> = (3..5) - .map(|i| reconstruct_signer_for_benchmark(i, find_randomness_for_benchmark(i))) - .collect(); - let aggregated_b = xmss_aggregate(&[], pub_keys_and_sigs_b, &message, slot, log_inv_rate); - - let pub_keys_and_sigs_c: Vec<_> = (5..6) - .map(|i| reconstruct_signer_for_benchmark(i, find_randomness_for_benchmark(i))) - .collect(); - - let aggregated_final = xmss_aggregate( - &[aggregated_a, aggregated_b], - pub_keys_and_sigs_c, - &message, - slot, - log_inv_rate, - ); - - let serialized_final = aggregated_final.serialize(); - println!("Serialized aggregated final: {} KiB", serialized_final.len() / 1024); - let deserialized_final = AggregatedXMSS::deserialize(&serialized_final).unwrap(); - - xmss_verify_aggregation(&deserialized_final, &message, slot).unwrap(); - } -} diff --git a/src/main.rs b/src/main.rs index ee9a6603..0320717d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,16 +17,16 @@ enum Cli { }, #[command(about = "Run n->1 recursion")] Recursion { - #[arg(long, default_value = "1", help = "Number of recursive proofs to aggregate")] + #[arg(long, default_value = "2", help = "Number of recursive proofs to aggregate")] n: usize, #[arg(long, help = "log(1/rate) in WHIR", default_value = "2", short = 'r')] log_inv_rate: usize, #[arg(long, help = "Enable tracing")] tracing: bool, }, - #[command(about = "Prove validity of Poseidon2 permutations over 16 field elements")] + #[command(about = "Prove validity of Poseidon permutations")] Poseidon { - #[arg(long, help = "log2(number of Poseidons)")] + #[arg(long, help = "log2(number of Poseidons)", default_value = "20")] log_n_perms: usize, #[arg(long, help = "Enable tracing")] tracing: bool, diff --git a/src/prove_poseidons.rs b/src/prove_poseidons.rs index f14d6f77..ee3a8899 100644 --- a/src/prove_poseidons.rs +++ b/src/prove_poseidons.rs @@ -1,8 +1,9 @@ use air::{check_air_validity, prove_air, verify_air}; use backend::*; use lean_vm::{ - EF, ExtraDataForBuses, F, POSEIDON_16_COL_A, POSEIDON_16_COL_B, POSEIDON_16_COL_FLAG, POSEIDON_16_COL_INPUT_START, - POSEIDON_16_COL_RES, Poseidon16Precompile, ZERO_VEC_PTR, fill_trace_poseidon_16, num_cols_poseidon_16, + EF, ExtraDataForBuses, F, POSEIDON_16_COL_FLAG, POSEIDON_16_COL_INDEX_INPUT_LEFT, POSEIDON_16_COL_INDEX_INPUT_RES, + POSEIDON_16_COL_INDEX_INPUT_RIGHT, POSEIDON_16_COL_INPUT_START, Poseidon16Precompile, ZERO_VEC_PTR, + fill_trace_poseidon_16, num_cols_poseidon_16, }; use rand::{RngExt, SeedableRng, rngs::StdRng}; use utils::{ @@ -28,9 +29,9 @@ pub fn benchmark_prove_poseidon_16(log_n_rows: usize, tracing: bool) { *t = (0..n_rows).map(|_| rng.random()).collect(); } trace[POSEIDON_16_COL_FLAG] = (0..n_rows).map(|_| F::ONE).collect(); - trace[POSEIDON_16_COL_RES] = (0..n_rows).map(|_| F::ZERO).collect(); // useless - trace[POSEIDON_16_COL_A] = (0..n_rows).map(|_| F::from_usize(ZERO_VEC_PTR)).collect(); - trace[POSEIDON_16_COL_B] = (0..n_rows).map(|_| F::from_usize(ZERO_VEC_PTR)).collect(); + trace[POSEIDON_16_COL_INDEX_INPUT_RES] = (0..n_rows).map(|_| F::ZERO).collect(); // useless + trace[POSEIDON_16_COL_INDEX_INPUT_LEFT] = (0..n_rows).map(|_| F::from_usize(ZERO_VEC_PTR)).collect(); + trace[POSEIDON_16_COL_INDEX_INPUT_RIGHT] = (0..n_rows).map(|_| F::from_usize(ZERO_VEC_PTR)).collect(); fill_trace_poseidon_16(&mut trace); let whir_config = WhirConfigBuilder { diff --git a/tests/test_lean_multisig.rs b/tests/test_lean_multisig.rs new file mode 100644 index 00000000..d013a779 --- /dev/null +++ b/tests/test_lean_multisig.rs @@ -0,0 +1,47 @@ +use lean_multisig::{AggregatedXMSS, setup_prover, xmss_aggregate, xmss_verify_aggregation}; +use rand::{RngExt, SeedableRng, rngs::StdRng}; +use xmss::{ + signers_cache::{BENCHMARK_SLOT, get_benchmark_signatures, message_for_benchmark}, + xmss_key_gen, xmss_sign, xmss_verify, +}; + +#[test] +fn test_xmss_signature() { + let start_slot = 111; + let end_slot = 200; + let slot: u32 = 124; + let mut rng: StdRng = StdRng::seed_from_u64(0); + let msg = rng.random(); + + let (secret_key, pub_key) = xmss_key_gen(rng.random(), start_slot, end_slot).unwrap(); + let signature = xmss_sign(&mut rng, &secret_key, &msg, slot).unwrap(); + xmss_verify(&pub_key, &msg, &signature, slot).unwrap(); +} + +#[test] +fn test_recursive_aggregation() { + setup_prover(); + + let log_inv_rate = 2; // [1, 2, 3 or 4] (lower = faster but bigger proofs) + let message = message_for_benchmark(); + let slot: u32 = BENCHMARK_SLOT; + let signatures = get_benchmark_signatures(); + + let pub_keys_and_sigs_a = signatures[0..3].to_vec(); + let (pub_keys_a, aggregated_a) = xmss_aggregate(&[], pub_keys_and_sigs_a, &message, slot, log_inv_rate); + + let pub_keys_and_sigs_b = signatures[3..5].to_vec(); + let (pub_keys_b, aggregated_b) = xmss_aggregate(&[], pub_keys_and_sigs_b, &message, slot, log_inv_rate); + + let pub_keys_and_sigs_c = signatures[5..6].to_vec(); + + let children: Vec<(&[_], AggregatedXMSS)> = vec![(&pub_keys_a, aggregated_a), (&pub_keys_b, aggregated_b)]; + let (final_pub_keys, aggregated_final) = + xmss_aggregate(&children, pub_keys_and_sigs_c, &message, slot, log_inv_rate); + + let serialized_final = aggregated_final.serialize(); + println!("Serialized aggregated final: {} KiB", serialized_final.len() / 1024); + let deserialized_final = AggregatedXMSS::deserialize(&serialized_final).unwrap(); + + xmss_verify_aggregation(&final_pub_keys, &deserialized_final, &message, slot).unwrap(); +}