From 1fc74cc75acae8b6fc4a14069bc4f01c05ccbf63 Mon Sep 17 00:00:00 2001 From: Al-Kindi-0 <82364884+Al-Kindi-0@users.noreply.github.com> Date: Thu, 25 Apr 2024 16:40:39 +0200 Subject: [PATCH] feat: add test vectors for Falcon DSA --- src/dsa/rpo_falcon512/keys/mod.rs | 43 - src/dsa/rpo_falcon512/keys/secret_key.rs | 98 +- src/dsa/rpo_falcon512/math/samplerz.rs | 187 +- src/dsa/rpo_falcon512/mod.rs | 7 + src/dsa/rpo_falcon512/tests.rs | 2030 ++++++++++++++++++++++ 5 files changed, 2163 insertions(+), 202 deletions(-) create mode 100644 src/dsa/rpo_falcon512/tests.rs diff --git a/src/dsa/rpo_falcon512/keys/mod.rs b/src/dsa/rpo_falcon512/keys/mod.rs index d29af1c8..d1eebfd2 100644 --- a/src/dsa/rpo_falcon512/keys/mod.rs +++ b/src/dsa/rpo_falcon512/keys/mod.rs @@ -9,46 +9,3 @@ pub use public_key::{PubKeyPoly, PublicKey}; mod secret_key; pub use secret_key::SecretKey; - -// TESTS -// ================================================================================================ - -#[cfg(test)] -mod tests { - use crate::{dsa::rpo_falcon512::SecretKey, Word, ONE}; - use rand::SeedableRng; - use rand_chacha::ChaCha20Rng; - use winter_math::FieldElement; - use winter_utils::{Deserializable, Serializable}; - - #[test] - fn test_falcon_verification() { - let seed = [0_u8; 32]; - let mut rng = ChaCha20Rng::from_seed(seed); - - // generate random keys - let sk = SecretKey::with_rng(&mut rng); - let pk = sk.public_key(); - - // test secret key serialization/deserialization - let mut buffer = vec![]; - sk.write_into(&mut buffer); - let sk_deserialized = SecretKey::read_from_bytes(&buffer).unwrap(); - assert_eq!(sk.short_lattice_basis(), sk_deserialized.short_lattice_basis()); - - // sign a random message - let message: Word = [ONE; 4]; - let signature = sk.sign_with_rng(message, &mut rng); - - // make sure the signature verifies correctly - assert!(pk.verify(message, &signature)); - - // a signature should not verify against a wrong message - let message2: Word = [ONE.double(); 4]; - assert!(!pk.verify(message2, &signature)); - - // a signature should not verify against a wrong public key - let sk2 = SecretKey::with_rng(&mut rng); - assert!(!sk2.public_key().verify(message, &signature)) - } -} diff --git a/src/dsa/rpo_falcon512/keys/secret_key.rs b/src/dsa/rpo_falcon512/keys/secret_key.rs index d3ca339c..32ed85c8 100644 --- a/src/dsa/rpo_falcon512/keys/secret_key.rs +++ b/src/dsa/rpo_falcon512/keys/secret_key.rs @@ -76,7 +76,7 @@ impl SecretKey { } /// Given a short basis [[g, -f], [G, -F]], computes the normalized LDL tree i.e., Falcon tree. - fn from_short_lattice_basis(basis: ShortLatticeBasis) -> SecretKey { + pub(crate) fn from_short_lattice_basis(basis: ShortLatticeBasis) -> SecretKey { // FFT each polynomial of the short basis. let basis_fft = to_complex_fft(&basis); // compute the Gram matrix. @@ -196,6 +196,98 @@ impl SecretKey { } } } + + // HELPER METHODS FOR TESTING + // -------------------------------------------------------------------------------------------- + + /// Signs a message with the secret key relying on the provided randomness generator. + #[cfg(test)] + pub fn sign_with_rng_testing( + &self, + message: &[u8], + rng: &mut R, + skip_bytes: usize, + ) -> Signature { + use crate::dsa::rpo_falcon512::{ + hash_to_point::hash_to_point_shake256, tests::ChaCha, CHACHA_SEED_LEN, + }; + + let mut dummy = vec![0_u8; skip_bytes]; + rng.fill_bytes(&mut dummy); + let mut nonce_bytes = [0u8; SIG_NONCE_LEN]; + rng.fill_bytes(&mut nonce_bytes); + let nonce = Nonce::new(nonce_bytes); + + let h = self.compute_pub_key_poly(); + let c = hash_to_point_shake256(message, &nonce); + + let s2 = loop { + let mut chacha_seed = [0_u8; CHACHA_SEED_LEN]; + rng.fill_bytes(&mut chacha_seed); + + let mut chacha_prng = ChaCha::new(chacha_seed.to_vec()); + + let s2 = self.sign_helper_testing(c.clone(), &mut chacha_prng); + if let Some(s2) = s2 { + break s2; + } + }; + + Signature::new(nonce, h, s2) + } + + /// Signs a message polynomial with the secret key. + /// + /// Takes a randomness generator implementing `Rng` and message polynomial representing `c` + /// the hash-to-point of the message to be signed. It outputs a signature polynomial `s2`. + #[cfg(test)] + fn sign_helper_testing( + &self, + c: Polynomial, + rng: &mut R, + ) -> Option { + let one_over_q = 1.0 / (MODULUS as f64); + let c_over_q_fft = c.map(|cc| Complex::new(one_over_q * cc.value() as f64, 0.0)).fft(); + + // B = [[FFT(g), -FFT(f)], [FFT(G), -FFT(F)]] + let [g_fft, minus_f_fft, big_g_fft, minus_big_f_fft] = to_complex_fft(&self.secret_key); + let t0 = c_over_q_fft.hadamard_mul(&minus_big_f_fft); + let t1 = -c_over_q_fft.hadamard_mul(&minus_f_fft); + + let z = ffsampling(&(t0.clone(), t1.clone()), &self.tree, rng); + let t0_min_z0 = t0.clone() - z.0; + let t1_min_z1 = t1.clone() - z.1; + + // s = (t-z) * B + let s0 = t0_min_z0.hadamard_mul(&g_fft) + t1_min_z1.hadamard_mul(&big_g_fft); + let s1 = t0_min_z0.hadamard_mul(&minus_f_fft) + t1_min_z1.hadamard_mul(&minus_big_f_fft); + + // compute the norm of (s0||s1) and note that they are in FFT representation + let length_squared: f64 = (s0.coefficients.iter().map(|a| (a * a.conj()).re).sum::() + + s1.coefficients.iter().map(|a| (a * a.conj()).re).sum::()) + / (N as f64); + + if length_squared < (SIG_L2_BOUND as f64) { + let bold_s = [-s0, s1]; + + let s2 = bold_s[1].ifft(); + let s2_coef: [i16; N] = s2 + .coefficients + .iter() + .map(|a| a.re.round() as i16) + .collect::>() + .try_into() + .expect("The number of coefficients should be equal to N"); + + if let Ok(s2) = SignaturePoly::try_from(&s2_coef) { + return Some(s2); + } else { + return None; + } + } else { + return None; + } + } } // SERIALIZATION / DESERIALIZATION @@ -304,9 +396,9 @@ impl Deserializable for SecretKey { fn to_complex_fft(basis: &[Polynomial; 4]) -> [Polynomial>; 4] { let [g, f, big_g, big_f] = basis.clone(); let g_fft = g.map(|cc| Complex64::new(*cc as f64, 0.0)).fft(); - let minus_f_fft = f.map(|cc| -Complex64::new(*cc as f64, 0.0)).fft(); + let minus_f_fft = f.map(|cc| Complex64::new(*cc as f64, 0.0)).fft(); let big_g_fft = big_g.map(|cc| Complex64::new(*cc as f64, 0.0)).fft(); - let minus_big_f_fft = big_f.map(|cc| -Complex64::new(*cc as f64, 0.0)).fft(); + let minus_big_f_fft = big_f.map(|cc| Complex64::new(*cc as f64, 0.0)).fft(); [g_fft, minus_f_fft, big_g_fft, minus_big_f_fft] } diff --git a/src/dsa/rpo_falcon512/math/samplerz.rs b/src/dsa/rpo_falcon512/math/samplerz.rs index af4057f6..033eebff 100644 --- a/src/dsa/rpo_falcon512/math/samplerz.rs +++ b/src/dsa/rpo_falcon512/math/samplerz.rs @@ -1,4 +1,3 @@ -use core::f64::consts::LN_2; use rand::Rng; #[cfg(not(feature = "std"))] @@ -28,7 +27,11 @@ fn base_sampler(bytes: [u8; 9]) -> i16 { 198, 1, ]; - let u = u128::from_be_bytes([vec![0u8; 7], bytes.to_vec()].concat().try_into().unwrap()); + + let mut tmp = bytes.to_vec(); + tmp.extend_from_slice(&[0u8; 7]); + tmp.reverse(); + let u = u128::from_be_bytes(tmp.try_into().expect("should have length 16")); RCDT.into_iter().filter(|r| u < *r).count() as i16 } @@ -72,16 +75,20 @@ fn approx_exp(x: f64, ccs: f64) -> u64 { } /// A random bool that is true with probability ≈ ccs · exp(-x). -fn ber_exp(x: f64, ccs: f64, random_bytes: [u8; 7]) -> bool { - // 0.69314718055994530941 = ln(2) - let s = f64::floor(x / LN_2) as usize; - let r = x - LN_2 * (s as f64); - let shamt = usize::min(s, 63); - let z = ((((approx_exp(r, ccs) as u128) << 1) - 1) >> shamt) as u64; - let mut w = 0i16; - for (index, i) in (0..64).step_by(8).rev().enumerate() { - let byte = random_bytes[index]; - w = (byte as i16) - (((z >> i) & 0xff) as i16); +fn ber_exp(x: f64, ccs: f64, rng: &mut R) -> bool { + const LN2: f64 = std::f64::consts::LN_2; + const ILN2: f64 = 1.0 / LN2; + let s = f64::floor(x * ILN2); + let r = x - s * LN2; + let s = (s as u64).min(63); + let z = ((approx_exp(r, ccs) << 1) - 1) >> s; + + let mut w = 0_i32; + for i in (0..=56).rev().step_by(8) { + let mut dest = [0_u8; 1]; + rng.fill_bytes(&mut dest); + let p = u8::from_be_bytes(dest); + w = (p as i32) - (z >> i & 0xFF) as i32; if w != 0 { break; } @@ -100,14 +107,20 @@ pub(crate) fn sampler_z(mu: f64, sigma: f64, sigma_min: f64, rng: &mut R let r = mu - s; let ccs = sigma_min * isigma; loop { - let z0 = base_sampler(rng.gen()); - let random_byte: u8 = rng.gen(); + let mut dest = [0_u8; 9]; + rng.fill_bytes(&mut dest); + let z0 = base_sampler(dest); + + let mut dest = [0_u8; 1]; + rng.fill_bytes(&mut dest); + let random_byte: u8 = dest[0]; + let b = (random_byte & 1) as i16; - let z = b + ((b << 1) - 1) * z0; + let z = b + (2 * b - 1) * z0; let zf_min_r = (z as f64) - r; - // x = ((z-r)^2)/(2*sigma^2) - ((z-b)^2)/(2*sigma0^2) let x = zf_min_r * zf_min_r * dss - (z0 * z0) as f64 * INV_2SIGMA_MAX_SQ; - if ber_exp(x, ccs, rng.gen()) { + + if ber_exp(x, ccs, rng) { return z + (s as i16); } } @@ -115,80 +128,7 @@ pub(crate) fn sampler_z(mu: f64, sigma: f64, sigma_min: f64, rng: &mut R #[cfg(all(test, feature = "std"))] mod test { - use alloc::vec::Vec; - use rand::RngCore; - use std::{thread::sleep, time::Duration}; - - use super::{approx_exp, ber_exp, sampler_z}; - - /// RNG used only for testing purposes, whereby the produced - /// string of random bytes is equal to the one it is initialized - /// with. Whatever you do, do not use this RNG in production. - struct UnsafeBufferRng { - buffer: Vec, - index: usize, - } - - impl UnsafeBufferRng { - fn new(buffer: &[u8]) -> Self { - Self { buffer: buffer.to_vec(), index: 0 } - } - - fn next(&mut self) -> u8 { - if self.buffer.len() <= self.index { - // panic!("Ran out of buffer."); - sleep(Duration::from_millis(10)); - 0u8 - } else { - let return_value = self.buffer[self.index]; - self.index += 1; - return_value - } - } - } - - impl RngCore for UnsafeBufferRng { - fn next_u32(&mut self) -> u32 { - // let bytes: [u8; 4] = (0..4) - // .map(|_| self.next()) - // .collect_vec() - // .try_into() - // .unwrap(); - // u32::from_be_bytes(bytes) - u32::from_le_bytes([self.next(), 0, 0, 0]) - } - - fn next_u64(&mut self) -> u64 { - // let bytes: [u8; 8] = (0..8) - // .map(|_| self.next()) - // .collect_vec() - // .try_into() - // .unwrap(); - // u64::from_be_bytes(bytes) - u64::from_le_bytes([self.next(), 0, 0, 0, 0, 0, 0, 0]) - } - - fn fill_bytes(&mut self, dest: &mut [u8]) { - for d in dest.iter_mut() { - *d = self.next(); - } - } - - fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { - for d in dest.iter_mut() { - *d = self.next(); - } - Ok(()) - } - } - - #[test] - fn test_unsafe_buffer_rng() { - let seed_bytes = hex::decode("7FFECD162AE2").unwrap(); - let mut rng = UnsafeBufferRng::new(&seed_bytes); - let generated_bytes: Vec = (0..seed_bytes.len()).map(|_| rng.next()).collect(); - assert_eq!(seed_bytes, generated_bytes); - } + use super::approx_exp; #[test] fn test_approx_exp() { @@ -230,69 +170,4 @@ mod test { ); } } - - #[test] - fn test_ber_exp() { - let kats = [ - ( - 1.268_314_048_020_498_4, - 0.749_990_853_267_664_9, - hex::decode("ea000000000000").unwrap(), - false, - ), - ( - 0.001_563_917_959_143_409_6, - 0.749_990_853_267_664_9, - hex::decode("6c000000000000").unwrap(), - true, - ), - ( - 0.017_921_215_753_999_235, - 0.749_990_853_267_664_9, - hex::decode("c2000000000000").unwrap(), - false, - ), - ( - 0.776_117_648_844_980_6, - 0.751_181_554_542_520_8, - hex::decode("58000000000000").unwrap(), - true, - ), - ]; - for (x, ccs, bytes, answer) in kats { - assert_eq!(answer, ber_exp(x, ccs, bytes.try_into().unwrap())); - } - } - - #[test] - fn test_sampler_z() { - let sigma_min = 1.277833697; - // known answers from the doc, table 3.2, page 44 - // https://falcon-sign.info/falcon.pdf - // The zeros were added to account for dropped bytes. - let kats = [ - (-91.90471153063714,1.7037990414754918,hex::decode("0fc5442ff043d66e91d1ea000000000000cac64ea5450a22941edc6c").unwrap(),-92), - (-8.322564895434937,1.7037990414754918,hex::decode("f4da0f8d8444d1a77265c2000000000000ef6f98bbbb4bee7db8d9b3").unwrap(),-8), - (-19.096516109216804,1.7035823083824078,hex::decode("db47f6d7fb9b19f25c36d6000000000000b9334d477a8bc0be68145d").unwrap(),-20), - (-11.335543982423326, 1.7035823083824078, hex::decode("ae41b4f5209665c74d00dc000000000000c1a8168a7bb516b3190cb42c1ded26cd52000000000000aed770eca7dd334e0547bcc3c163ce0b").unwrap(), -12), - (7.9386734193997555, 1.6984647769450156, hex::decode("31054166c1012780c603ae0000000000009b833cec73f2f41ca5807c000000000000c89c92158834632f9b1555").unwrap(), 8), - (-28.990850086867255, 1.6984647769450156, hex::decode("737e9d68a50a06dbbc6477").unwrap(), -30), - (-9.071257914091655, 1.6980782114808988, hex::decode("a98ddd14bf0bf22061d632").unwrap(), -10), - (-43.88754568839566, 1.6980782114808988, hex::decode("3cbf6818a68f7ab9991514").unwrap(), -41), - (-58.17435547946095,1.7010983419195522,hex::decode("6f8633f5bfa5d26848668e0000000000003d5ddd46958e97630410587c").unwrap(),-61), - (-43.58664906684732, 1.7010983419195522, hex::decode("272bc6c25f5c5ee53f83c40000000000003a361fbc7cc91dc783e20a").unwrap(), -46), - (-34.70565203313315, 1.7009387219711465, hex::decode("45443c59574c2c3b07e2e1000000000000d9071e6d133dbe32754b0a").unwrap(), -34), - (-44.36009577368896, 1.7009387219711465, hex::decode("6ac116ed60c258e2cbaeab000000000000728c4823e6da36e18d08da0000000000005d0cc104e21cc7fd1f5ca8000000000000d9dbb675266c928448059e").unwrap(), -44), - (-21.783037079346236, 1.6958406126012802, hex::decode("68163bc1e2cbf3e18e7426").unwrap(), -23), - (-39.68827784633828, 1.6958406126012802, hex::decode("d6a1b51d76222a705a0259").unwrap(), -40), - (-18.488607061056847, 1.6955259305261838, hex::decode("f0523bfaa8a394bf4ea5c10000000000000f842366fde286d6a30803").unwrap(), -22), - (-48.39610939101591, 1.6955259305261838, hex::decode("87bd87e63374cee62127fc0000000000006931104aab64f136a0485b").unwrap(), -50), - ]; - for (mu, sigma, random_bytes, answer) in kats { - assert_eq!( - sampler_z(mu, sigma, sigma_min, &mut UnsafeBufferRng::new(&random_bytes)), - answer - ); - } - } } diff --git a/src/dsa/rpo_falcon512/mod.rs b/src/dsa/rpo_falcon512/mod.rs index 8d9c1e6f..59343fc3 100644 --- a/src/dsa/rpo_falcon512/mod.rs +++ b/src/dsa/rpo_falcon512/mod.rs @@ -9,6 +9,9 @@ mod keys; mod math; mod signature; +#[cfg(test)] +mod tests; + pub use self::keys::{PubKeyPoly, PublicKey, SecretKey}; pub use self::math::Polynomial; pub use self::signature::{Signature, SignatureHeader, SignaturePoly}; @@ -48,6 +51,10 @@ const SIG_L2_BOUND: u64 = 34034726; /// Standard deviation of the Gaussian over the lattice. const SIGMA: f64 = 165.7366171829776; +/// Length of the seed for the ChaCha20-based PRNG. +#[cfg(test)] +pub(crate) const CHACHA_SEED_LEN: usize = 56; + // TYPE ALIASES // ================================================================================================ diff --git a/src/dsa/rpo_falcon512/tests.rs b/src/dsa/rpo_falcon512/tests.rs new file mode 100644 index 00000000..166ebc98 --- /dev/null +++ b/src/dsa/rpo_falcon512/tests.rs @@ -0,0 +1,2030 @@ +use super::{math::Polynomial, Deserializable, Serializable, Word}; +use crate::{ + dsa::rpo_falcon512::{SecretKey, CHACHA_SEED_LEN, SIG_NONCE_LEN}, + ONE, +}; +use alloc::vec::Vec; +use rand::RngCore; +use rand::SeedableRng; +use rand_chacha::ChaCha20Rng; +use rand_core::impls; +use sha3::{ + digest::{core_api::XofReaderCoreWrapper, ExtendableOutput, Update, XofReader}, + Shake256, Shake256ReaderCore, +}; +use winter_math::FieldElement; + +const NUM_TEST_VECTORS: usize = 12; + +#[test] +fn test_falcon_verification() { + let seed = [0_u8; 32]; + let mut rng = ChaCha20Rng::from_seed(seed); + + // generate random keys + let sk = SecretKey::with_rng(&mut rng); + let pk = sk.public_key(); + + // test secret key serialization/deserialization + let mut buffer = vec![]; + sk.write_into(&mut buffer); + let sk_deserialized = SecretKey::read_from_bytes(&buffer).unwrap(); + assert_eq!(sk.short_lattice_basis(), sk_deserialized.short_lattice_basis()); + + // sign a random message + let message: Word = [ONE; 4]; + let signature = sk.sign_with_rng(message, &mut rng); + + // make sure the signature verifies correctly + assert!(pk.verify(message, &signature)); + + // a signature should not verify against a wrong message + let message2: Word = [ONE.double(); 4]; + assert!(!pk.verify(message2, &signature)); + + // a signature should not verify against a wrong public key + let sk2 = SecretKey::with_rng(&mut rng); + assert!(!sk2.public_key().verify(message, &signature)) +} + +/// Tests the Falcon512 implementation using the test vectors in +/// https://github.com/tprest/falcon.py/blob/88d01ede1d7fa74a8392116bc5149dee57af93f2/scripts/sign_KAT.py#L1131 +#[test] +fn test_signature_gen_reference_impl() { + // message and initial seed used for generating the test vectors in the reference implementation + let message = b"data1"; + let seed = b"external"; + + // the reference implementation uses SHAKE256 for generating: + // 1. The nonce for the hash-to-point algorithm. + // 2. The seed used for initializing the ChaCha20 PRNG which is used in signature generation. + let mut rng_shake = Shake256Testing::new(seed.to_vec()); + + // the test vectors in the reference implementation include test vectors for signatures with + // parameter N = 2^i for i = 1..10, where N is the exponent of the monic irreducible polynomial + // phi. We are only interested in the test vectors for N = 2^9 = 512 and thus need to "sync" + // the SHAKE256 PRNG before we can use it in testing the test vectors that are relevant for + // N = 512. + // The following makes the necessary calls to the PRNG in order to prepare it for use with + // the test vectors for N = 512. + sync_rng(&mut rng_shake); + + for i in 0..NUM_TEST_VECTORS { + // construct the four polynomials defining the secret key for this test vector + let [f, g, big_f, big_g] = SK_POLYS[i]; + let f = Polynomial::new(f.to_vec()); + let g = Polynomial::new(g.to_vec()); + let big_f = Polynomial::new(big_f.to_vec()); + let big_g = Polynomial::new(big_g.to_vec()); + + // we generate the secret key using the above four polynomials + let sk = SecretKey::from_short_lattice_basis([g, -f, big_g, -big_f]); + + // we compare the signature as a polynomial + let signature = + sk.sign_with_rng_testing(message, &mut rng_shake, SYNC_DATA_FOR_TEST_VECTOR[i].0 * 8); + let sig_coef: Vec = + signature.sig_poly().coefficients.iter().map(|c| c.balanced_value()).collect(); + assert_eq!(sig_coef, EXPECTED_SIG_POLYS[i]); + + // we compare the encoded signature including the nonce + let sig_bytes = signature.to_bytes(); + let expected_sig_bytes = EXPECTED_SIG[i]; + let hex_expected_sig_bytes = hex::decode(&expected_sig_bytes).unwrap(); + + // we remove the headers when comparing as RPO_FALCON512 uses a different header format. + // we also remove the public key from the RPO_FALCON512 signature as this is not part of + // the signature in the reference implementation + assert_eq!(&hex_expected_sig_bytes[2..], &sig_bytes[2..2 + 664]); + } +} + +/// A function to help with "syncing" the SHAKE256 PRNG so that it can be used with the test vectors +/// for Falcon512. +fn sync_rng(rng_shake: &mut R) { + for (bytes, num_seed_sampled) in SYNC_DATA.iter() { + let mut dummy = vec![0_u8; bytes * 8]; + rng_shake.fill_bytes(&mut dummy); + let mut nonce_bytes = [0u8; SIG_NONCE_LEN]; + rng_shake.fill_bytes(&mut nonce_bytes); + + for _ in 0..*num_seed_sampled { + let mut chacha_seed = [0_u8; CHACHA_SEED_LEN]; + rng_shake.fill_bytes(&mut chacha_seed); + } + } +} + +/// A PRNG based on SHAKE256 used for testing. +/// +/// DO NOT USE IN PRODUCTION. +pub struct Shake256Testing(XofReaderCoreWrapper); + +impl Shake256Testing { + pub fn new(data: Vec) -> Self { + let mut hasher = Shake256::default(); + hasher.update(&data); + let result = hasher.finalize_xof(); + + Self(result) + } + + fn fill_bytes(&mut self, des: &mut [u8]) { + self.0.read(des) + } +} + +impl RngCore for Shake256Testing { + fn next_u32(&mut self) -> u32 { + impls::next_u32_via_fill(self) + } + + fn next_u64(&mut self) -> u64 { + impls::next_u64_via_u32(self) + } + + fn fill_bytes(&mut self, dest: &mut [u8]) { + self.fill_bytes(dest) + } + + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { + self.fill_bytes(dest); + Ok(()) + } +} + +/// A PRNG based on ChaCha20 used for testing. +/// +/// DO NOT USE IN PRODUCTION. +#[derive(Clone, PartialEq, Eq)] +pub struct ChaCha { + state: Vec, + s: Vec, + ctr: u64, + buffer: Vec, +} + +impl ChaCha { + pub fn new(src: Vec) -> Self { + let mut s = vec![0_u32; 14]; + for i in 0..14 { + let bytes = &src[(4 * i)..(4 * (i + 1))]; + let value = u32::from_le_bytes(bytes.try_into().unwrap()); + s[i] = value; + } + Self { + state: vec![0_u32; 16], + ctr: s[12] as u64 + ((s[13] as u64) << 32), + s, + buffer: vec![0_u8; 0], + } + } + #[inline(always)] + fn qround(&mut self, a: usize, b: usize, c: usize, d: usize) { + self.state[a] = self.state[a].wrapping_add(self.state[b]); + self.state[d] = Self::roll(self.state[d] ^ self.state[a], 16); + self.state[c] = self.state[c].wrapping_add(self.state[d]); + self.state[b] = Self::roll(self.state[b] ^ self.state[c], 12); + self.state[a] = self.state[a].wrapping_add(self.state[b]); + self.state[d] = Self::roll(self.state[d] ^ self.state[a], 8); + self.state[c] = self.state[c].wrapping_add(self.state[d]); + self.state[b] = Self::roll(self.state[b] ^ self.state[c], 7); + } + + fn update(&mut self) -> Vec { + const CW: [u32; 4] = [0x61707865, 0x3320646e, 0x79622d32, 0x6b206574]; + + self.state = vec![0_u32; 16]; + self.state[0] = CW[0]; + self.state[1] = CW[1]; + self.state[2] = CW[2]; + self.state[3] = CW[3]; + + for i in 0..10 { + self.state[i + 4] = self.s[i] + } + + self.state[14] = self.s[10] ^ ((self.ctr & 0xffffffff) as u32); + self.state[15] = self.s[11] ^ ((self.ctr >> 32) as u32); + + let state = self.state.clone(); + + for _ in 0..10 { + self.qround(0, 4, 8, 12); + self.qround(1, 5, 9, 13); + self.qround(2, 6, 10, 14); + self.qround(3, 7, 11, 15); + self.qround(0, 5, 10, 15); + self.qround(1, 6, 11, 12); + self.qround(2, 7, 8, 13); + self.qround(3, 4, 9, 14); + } + + for i in 0..16 { + self.state[i] = self.state[i].wrapping_add(state[i]); + } + + self.ctr += 1; + return self.state.clone(); + } + + fn block_update(&mut self) -> Vec { + let mut block = vec![0_u32; 16 * 8]; + for i in 0..8 { + let updated = self.update(); + block + .iter_mut() + .skip(i) + .step_by(8) + .zip(updated.iter()) + .for_each(|(b, &u)| *b = u); + } + block + } + + fn random_bytes(&mut self, k: usize) -> Vec { + if k > self.buffer.len() { + let block = self.block_update(); + self.buffer = block.iter().flat_map(|&e| e.to_le_bytes().to_vec()).collect(); + } + let out = (self.buffer[..k]).to_vec(); + self.buffer = self.buffer[k..].to_vec(); + + out + } + + fn roll(x: u32, n: usize) -> u32 { + ((x << n) & 0xffffffff) ^ (x >> (32 - n)) + } +} + +impl RngCore for ChaCha { + fn next_u32(&mut self) -> u32 { + impls::next_u32_via_fill(self) + } + + fn next_u64(&mut self) -> u64 { + impls::next_u64_via_u32(self) + } + + fn fill_bytes(&mut self, dest: &mut [u8]) { + let len = dest.len(); + let buffer = self.random_bytes(len); + dest.iter_mut().enumerate().for_each(|(i, d)| *d = buffer[i]) + } + + fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> { + self.fill_bytes(dest); + Ok(()) + } +} + +/// Helper data to indicate the number of bytes the should be draw from the SHAKE256-based PRNG +/// in order to sync its state to the state of the PRNG in the reference implementation during +/// testing of the Falcon512 test vectors. +const SYNC_DATA_FOR_TEST_VECTOR: [(usize, usize); NUM_TEST_VECTORS] = [ + (135376, 1), + (127224, 1), + (61580, 1), + (41060, 1), + (28736, 1), + (123204, 1), + (49268, 1), + (151816, 1), + (106628, 1), + (49212, 1), + (65672, 1), + (53332, 1), +]; + +/// Helper data to indicate the number of bytes the should be draw from the SHAKE256-based PRNG +/// in order to sync its state to the state of the PRNG in the reference implementation before +/// testing of the Falcon512 test vectors. +const SYNC_DATA: [(usize, usize); 96] = [ + (75776, 2), + (8192, 3), + (29696, 1), + (20480, 1), + (12288, 1), + (4096, 1), + (48128, 1), + (24576, 1), + (6144, 1), + (37888, 1), + (39936, 1), + (56320, 1), + (18432, 1), + (29696, 1), + (10240, 2), + (5120, 1), + (27136, 1), + (39424, 1), + (11264, 4), + (15872, 1), + (15360, 3), + (10240, 2), + (11776, 1), + (7168, 1), + (18176, 3), + (30208, 2), + (163072, 1), + (17920, 1), + (110848, 2), + (18944, 2), + (119296, 1), + (19200, 2), + (14080, 1), + (69376, 1), + (75776, 2), + (109056, 1), + (9344, 1), + (37632, 1), + (17152, 2), + (118528, 1), + (4608, 1), + (4352, 2), + (20736, 2), + (27392, 1), + (4096, 1), + (8576, 1), + (26880, 1), + (26880, 1), + (75456, 1), + (4928, 1), + (16704, 3), + (12352, 1), + (16832, 1), + (67456, 1), + (46720, 1), + (24960, 1), + (45760, 1), + (20800, 1), + (8320, 1), + (13184, 2), + (53696, 1), + (8320, 1), + (66112, 1), + (12640, 1), + (4192, 1), + (8224, 1), + (4192, 1), + (4128, 1), + (37504, 1), + (4160, 1), + (12384, 1), + (16704, 1), + (86672, 1), + (37088, 1), + (24800, 1), + (32944, 1), + (12400, 1), + (12368, 1), + (12352, 1), + (29072, 1), + (45440, 1), + (8256, 1), + (4160, 1), + (53664, 1), + (37040, 1), + (20536, 1), + (4112, 1), + (16456, 1), + (20536, 1), + (20544, 1), + (69912, 1), + (28824, 1), + (36992, 1), + (8216, 1), + (74048, 1), + (12352, 1), +]; + +/// The encoded test vector signatures. +const EXPECTED_SIG: [&str; NUM_TEST_VECTORS] = [ + "39938882ef322e8a46b93c6d67c47f31f92a30e31e181b6c6e57760d2a08f254a7e798b27956333e7f928bc01928dac4dcfbf93ba6decb4c21f5c30cd8796cece9626113f8dae0e21e9cef91a383bfa6f139462d5a964b567efb1269bb2989f24acd165110d6a50caa263eb8e8f60fd5fed2f231498167beccf199ca66d347378794b719665f6c74194d89308b2119acf270cf5ff9f1f70b45dd93a67b5dcc41b28c0a6a9db0a2275f470a3fc1620843d1ad45b44687a3ca692935d675df9bbefe5cec12f9af8cc53e04175d56b92a29b40d869836698a0e8452c992856cb74a906f0ed4ddb8aa1e0a2f645db18903d046768e5fb7ef13d1b3a8064129987e4b53428b7549d735e672908eb08861a63c3ee698b5c8a0dab8aed4acea186a89bd33ac92576ab758ad30fddd11698f54717afc36b093a053166b022f99e50dbb718bba87eea9ad491e1e778e1afd4ed92dd05621b48847ebbf0d517e3a2a943f33803434854b225d8cbb8f1e4bd252c9826a629b3ca9da85216d07771ca6538cf6f198f1e55cfd52c9232ffb941445533d30dfae6fd4e5cf63e2250e0593ed92a3df09898ea7dbb6d941179a42275dd93afab392d959075eb104b97375c7259e23703d036f25c92a8f9e6904e64675504bad272068a7bf34d18f665818899fddbf3a5c9bc694cd99a9913bd74f7c36e5422af91eb64371f16c5b28c3454dc360df8442ed2a4edc6956abd7adc4091302ddc3b98cbc47899eaacf250a476b4faa72e434f6767135b24d747e65eb9100e86f3084beb952c3be19369908cade8923d7e4ca32edabb2a593d4b7a5fd82b5d34ca9204010ec9161847d604c7b288a59f8848b548970d814b8d0a4f96e1b433848343a2c6c6cf7af3f84aec9d269d9be632c5c57672d948839ea863208cdc0000000000000000000000000", + "3990524b2f19ea93992641f81adfa0779d4aa5db24a4ddc243e94b85f8f63da5e443658926af37d1b506a9a992d428b32748aa3a80e911d4564a4332878b5d32779af56668bfdcd5faa414bfa77b95031e47373778eb2ceacef0e9aed21a97f0700f5d918d8a606384adf0c0eeb6797c00d4ba5f26273538569135cd586230b767d952b6c192521d1aaee594ea3d6b1fe363b21064abe172867919c825ad528e39877b11569662b6c5c73b4932dc159b71069398bfaea1b487fcd9583e192fea62da26dfaa287d8fbf9d5eae42b7895a63524c79265352b13b880989ea9bfe02f0f9f975532d931fccfe5d60da05c39a62c836792f8a3e12e6e7759b7753d5198c95b2f644690a5f58763d3b5b14a97a72cda6d97a6b4daecf97c7111c5275b44437cb8ecdc25a0a0ff1bef8b250a5a2e699b368c7bbe6eab4be97a2957957d6e9bb0faa9326f9568cca5a636f2653c6ee635c986d9d84753cff5ac17834c1385a066adf43c5633719cf34c15588d997d7a13782d19704363ea1d22858d41be56eb5c0842d0422fcf4261075f1af2178e849715249dce1af4c8583427258eadac0b03f721c62b7fcf33939a5fccadd264e830f0b58a7992b1c99f69c406ef03912e7b54342a11a8930d3259332c555e891119bca3c8d3905e2229ef334c854e405ba53431af462a74e48d9aa06cfed3b30897f3bf6e9d0496a549cc6636d9cd7287178947682bf8b982ab2b44a976071d3230233332189ca405256e776b25c881a85932c6a2a1af6f29e2abeda2d4a5f53be39f37e5d99db15af4a288dde537117d4153ebd5297946b99cebacabc4ee265cb698da59cc5f5492389dc964fc92cd2d665c64eb7f08f2a8ad660c8bb90c3dc0866111bde7c91d60f6a81d2ebd16af48ed7cd6079741abc414c922470680000000000000000000000", + "3919c9011564865ced4e03fa8e7c9b2b0f103e9fe24dbe9f28a4b5db5821dce0d70495ac617fcfd6038cba4de75bf78737b3b317a6478268f08d7c95f7d9202e4a04de2434ee86d988d4397557a2c78122b475bfe9a7b2e75388ba0344cebaea22c335267ba2f48e61d1c58b785473525271baa911bd35e8def50900ed4caa7854d709afc8f36cd02562199dc76fe6b644111d833cda7819cc7a5b58947e8c8cccf9af2cb07963c9f699516018b481cf61c80a248fa1bd78c18048efc86f366293a4847902224bcf1d3cb8bc54e4d0c7149c45df69377a6c6c4474ee1403f336b0e7673d4be6c1ea54361452009e266b6b0d1181221cf814f7779ef8dab9183fe94ea54730eace00a3fcab9ab0a8f6fe9374bb292868236a2640c4680a7410a540b5f10849a4dbcb6c7093bb49b6a9878b88d4601bdd6559b1649e8e019e54eeb508ee2e9c8636105670c5a76ef336fa9c76eea7b29871660fe6bf2ae8dd5878c72ea7b8405f08b3785d2ebb88f92bbaffac17f41f38c9d554bb3134afa8d834415cce30e40e4369e85dfe464b6f3aec13552e1b3376f026a108d9f4120b5a39b4fa9634390cb9c5ba484e6e36ad62fbd27468beb61d62b36785cfd1853e339ca365342ed315838a78c8495d80df73481e077cd5153671c4deccbb46051c70d1751afca525edd91ec53636b8d220db78a4308fecb5515cbebba4bfcdeaf3acc7fbeffd9a62d5f8fdd9335dd297013b8295b5b3dad5f0bbaf83aecaf3b1449917a5699aef39f5c25899782f4c8dadc8db0bf68067f1ee6a6d8835c9445dbccec54dcc43757d4396083c3a185e5cc2f7583e3148ac56ba7991152d075aedfb8c76e48ee1f5431d048cf1599659f3f366e669c1674433f1e75e666fd41b5ecb39b577dbea1ff2ebc2aaa3d398bffab1000000000000000000000000", + "39e40755a7c0fa1c134750a89c9316b75d5fa430de8cd0b9a15cfaaad412cfdf409ce8aef76ee383ee56d7a62adc07d4f2dab1c46ea1ef9a467ab1d8cc8d603f72f6564e741059b2ae93aaac86abf7e77e605c5e076d3cde6e1775ee4c8e310ee25b371a9d78d641c27eb022a98a5e52fbd84f3f9233825458257f369938707b556a0d85e553f497457e3b19b94d31f50e637d31415b4a3c522e87e129cb3187fda068e678f5fc31e7af18fe3ecd15f3dd844bb83a0f57c8cb32ad74f9a29de5e6733bd681f742ff66b8405bf8ae8c49644b63cf7066d93d3d4f755dd03badceebaa315b67811de3f36d047baf4a4d520ab76d1952eeb93a3ab31c54abfc763102c57f51a6733ccab1686aa6cfded9c450e930072d0ca9b8aeb69648f2de9302fff972b6382631db24ab9d39d2786ad56ce2b308aa2e563621427de8f0713cd653fb176d5937f2e47850ca6d016d6192390e755fd912878724db7b33129f6529fb78d1279923dd21d11a3e7b78b74c680cfbcfaa79d4388d46d46852de566b14e5c01b8cdc1d1afa7ae02200df2f2e5b05b65066fb717c8bbb9e84a6891895e12c98c52c43b639a527549fb050b40cf24e7f4aa2df91fcba2decaa6081d518161483bebe624b2a457ede5411d4b3b258954b86c2ca9b7475419c633743f25cf50b62cfb5abffd5cdc50ed6d1a4ecaae35cf961a67a7f1c7b7326252f0084cfd39c0298a844c9d92f79209d64fd53bbf919152fbac9d08af449d145e245364efdb32aa632cfabc0fb7b899d3e14f27bf2f0b76575bb99ecd84133ddeaa8ed19776d21be589bf50985f733e6edbcabd3e7ca7c93cfe19fb22af569e66791c321ab23ba421d82f85b5151d7bee532596c8bcf70a32edbc8044a86a6703dbb66925ce8cc5a9dfd29a44b75696108d1b5300000000000000000000000", + "396eb67cbb302365e81f5bcecabc6a80f1c2419de4369eec77b35421e777ec63595c39ec77d4b1db6aa06488839e8a5daebd750537e2b136582cdba9b1479a6402ccd0c6931face2e1bf79d8ac5bbf34751793c65124542fd1b0f8aee699c93accf187679ce809f1b63a18d049bb6d626f4e7f7495b85487a3a9b6e7c9ae67c33b8bdb681f984eb1eb44e3a3ebddf85cb00624d4c6de2efdcd69e498db8e3956e818e7d29c8612f85feaddc65ca635d91b82fe7132effde5aa6f108bad1e3dd5656b6ee2d0fd482ad54c355f00fbca12e9fbd6dace18ff5c2100370e8a15c0925298137ad2c335b2e20470d86ce3c1bb48be93fa6b47ba95ff2f8df54113566ffd261f4a5c117fa46f66ffaa1ece7b5ddda7579e68d40e67256e7bcfacc050731ceeb6d6a5f764e4ed9cd963409c8f21ee98f99259474a557abfef9635ef2ac91b9b7e7660aca456d83319bb414a81d62114367b150e11728d8a3f3b9fea6fd0733a9b0335f1cae90cd230580712689ab03f9c56e50cac6952c4a3922a6a6368794c26bd9bcda250568d45df72158dfc7651798eb3d1ccbd909c95f1362607a30294b639136ad75373e479134f3092d5cf4573a913a45e4dee70a2f06b2f077150e3b4cd0e8d19517406b44d9a5a8c9ee123497fb514ed7c71330c628685f735c7a2d3a4292dba5a8cebe0160c55fdf3e9e8afe801719aa62db8e29b73ab1d208eeacccaa91b5e7efe9bd09cba32c2048039e8b9e1c2d66e54a84f5de9af6bf5cf04074d6b8169fa0ce29ae2547936f32acdcb0dd3a6f7c07a9788dd75c4d3bdfb3fa387b0efcfcd5caaed5c809d5bed15e3ea6eff4c769883a7cc62f9b8565a85f4d95cc8aa0484bcd11b7fde224567134b475a0a3c5f1380bee76cd9838edb4469285af0c2752bf52b5cd7b2a6d7e000000000000000000000", + "39a3040e1e17129693200dd7ddf41b55e3c3bc64524b86b7c30f77d1897c53aa06a2663b71f7874b7d5393408dbe6163dbcf9aac4c13a748b1e6ef9a7f52a567b8c6281d448d00a266d895cf9a462e520699b22a4bf76e645f588f1ab07e70fa988c5d41c6a3700c9205b630f8d431e10c03bd2c9ca5ae1757d12cbb0a63b6ca2edf5340743154c8b8b44f1414cddece5820fd75bf03da6c2c2e2257a14f78bbd4f999671b999c05e29826a939c366e199d756150a8bd6db2745f68d1a9d0abca93eff14c143b94fa50fd7af41968eee278ce415057097bf66ff3b7ce6e9d3249e9e222d7763faf1b2ca3bacbf658e37011550b6390cee1e58876867198fa2ebb740fbfd19b4622f69f7b5770f57ab924b6d1d6c2192e759f68967618336be5dfd7d6a5ab84dd3ae95a0b23a31da65540c2241039860b2e631a44b6c3296171fc982bd8f9acc9cfd166c4e6e3368f27a70456692b0e43f26319cfb6ac6cee088d9ec4607de3c6ed5413e797c7519c445cef417953288d3dd98044b77eb5d32f18bad74c10ccfe52d4a54bafc674f33c64d2b12343b6b277729f60329013d9e0b55eee097468ccd2f423050270fb19af8c298069e606c56ec18f959ecdc9733510bb6fd500b06a1f9c8d7d922f47faeacc1b83e15daec9224c0e7ed0ddc272c9c6f92398b704898e1d4c72718d7ef46c6687a5a84be9c3216772d93a2a9f5c77b21e75574e6767f5bc8d9ceed47c99aa47534f2aeed56bec7f6b0f6cc0a3e20ec8465030d9c67c321cf3b5c9d02ea5523af629170ebe8ec70744b5303fc66e67c6b9ae6b1676fb43ebe7ad1543acedc1ea6d41588d571891548ee24c6beaf4a26a359521f352176753588afb116f22c86ae606579081bb3c5ab9243ae5c53afc699063be8713a621bece46aa72320000000000000000000000000", + "39fa7971d10c07ff2f265fd449591aac4d48cf198a8b58145d2fd0a5864b14f2daf90b272f282484eff796963638fffdb3c72d5bbd9e89aac5273a5707b0a29428fec3b586d7c0602e27cde8d0297386e0f2e9e558368d0a3d1c8dfacac8dd9fdd1d6d56faf02089c20b887d60d146f5cca492655b5ce1e5274c82a98665b66d2d476cc126d33adb2a8c9929249759cf4fd144e30ae54058a4f1803f9c9455ddd8e2a007df512a31d96f8d33243dede21e6eb8f6bdadd9a3653379bf3dca55a1aa33c85bff83cb3194effa3e67a6254a4537d5ae49b2eb3d879e0f9c1702c7bcd3a7e72bf8c2347eb4410ddcd8fabb7372579bab0e219a203a995ef3ecac0da461d0b3481d486765cce440b58125a2fccc30d064dc4fc3b2fe2e31ac5a0c74eac34300cd14d9cab1ba3206f8d56f77e5113aa596ca160cae39cb034eea7a499e6236e7aac94b22cb4694797a5ae0088997abea76ce4c4b401af3b07409d16e9952a33aae7f2f3520433b75cba34b186938103eb719b1d4bbf1d22cac63a1e4e53a4389460b80420a0e1b3891ab113e62ae92e0b3c75d644713f673dd36cf6b27ec3c5f9f3b6720d42babe12470a451b489a563d8c5e622d47eae11643cde922728ae68a943076be2ce5b7a2c731fd5bacd95fa47e5aca0c86e9b64389aa9a64b65aaa7a28ecec4a1770601d099cd100829e8d438cc72af867f3831a7bae1b2c3bf5f7e8ba2bc6d1494590267af6e76b991c1e89d965a0426ee965799ac54dfe50fe78529f98b4d0522545351ae4cd62b9a92f63d90b9e392eaced119720c9d72d17914fd5a4cb0f4e14af1762a39be3aae98a698ec56d1d28937ee5d722ac42c51d73d8be8a7082dff6f314057fd0e5b5a6391c682c291b20894b1c2843636377d853581a339f55c651ecc8a41f9ff8e9e104000000000000000", + "39aa4cac72b666b9847d138ef6f0698fe9e58317bc6e2d1913240da31cbc639e182165f25bfbb16549c495abee5ef1437eacfa6b14c8d6afdfaee611c9c0bf2b56ab40eea44163ba3072ca498a6265a6a4cda6f17670ed51ec3dbefc97174aca4ea765c208ad7865e7ab41df4037d810f637dc10a831b4923ac29299b903bca99e06e65d1445f478494f9757e014043212c2e4f26ca225046448ca9bc434d27615989b1dccc3c5aa8b31321495a0a70e3495b0b7d86d88c6b1e2bf28e81a14c6e519aaede3e46ad26a0f0a21a6a21b195f07e52bc01985b3a450edb66c1e2864b98fcab2f0f34cbeeaf191dc160e2ee9073cba960e6c8d67238e66d2f29146beaa5a37e936b13fe376cd5aa2f372179f586bf0180c02a3d2c2f39ae8839a8fddbfbc48c35192ffdb6c6cda34b01509ef50c5c99a651ecb67ffaac6b13daaa641686b2cd142856372346dbf508bfb100476324494b52e9130404d54315f573fecc9489645a26248668978b9a35156fed9c88c304f951598bd4311924cf8311b4e5fd35de5d6d9de9c0e0185d4149df5f79f12e1c1bfb009b44dcaae704b5ec1aca1ac363c5216ae3dc4c5682c9a56ca1abe222d9da718d2e87b6d3217b7e0105c1d11c5d4f26b7b6d53086514025a52bcc7278dd5cead321ec5764d4d7cc8177134ab125541b290268d7c18d13cbbca1271e18ee73a04b307c269a15522daba23d004648ba8d84de4f72f8a5015a80be91e863188549cdffc92df043592b44ba7a926b67add310fcf0326a04f9e9c6ab7bd5f59295e7d52395015216fe4dcf0719cf867eb25df8b30c0caac261d1a2bbc7e1f879ed71edc8a77832916b5fb7ae4b1e867d9aba2c02b6c43f1f7b8c07810dcb1c9219977e3bd9fde324a82bb91bdf2f2aac6c139c9bc2539005f6e46ab4480000000000000000000", + "3942143340bb245de675d10769dc963a1a3c190360b60f6dbe3d6c5915bc72aaeb0d219ff0d8a7700464854b953e024e368bd64aba8ae05dee5ad1b9b1765334cfbf1a2407c2b0448446170ed9adafba2c54de08618bca21ee3a17c710358d974408b2fcc0b12e1bd1d5cb4832e476bc843f4b9b8710ba23309fb187895834b9e4558a8e9f5bda0921e06268ec0194fb294dca82820bb791d28461572e488f4f77642e904c3af007e5d9b08a1464c8a1b4de9c5d89e23ed7d4716e72311395b7fa705101e94aa2d436d127494a6189b042f1d29b3a16c8f464b74303884c0cae8537bbde91356d11446b13139cd4572f8771325614f59612443c90f24b85f1381f944bbbbd83ae7f4826f2791e19a7131b74327d3b45c5fc60e529943a0a60100925c6788e7aeb4b5d33609934cbc6d189c357d0d2831c99dd72ae0a0b9443b5d2c6dfe787c9f0eb32ca14b4c594ec325d32e0719f6eb997c9e3d8430b378465d17575d2ff1068ea86c4bbed5a4c7b278805c8a7eef2758d6f53fbbed6636517241f159bef4d9648b22de57d7e49a55be8f94db14c892a211f083b12687b6f846588569305d2c7bfeba7b077935b98527e98f9743385662078a41b0e6fda318f6f19fd0c227b19e0c1939f24ba14fad5d8adc72b94ccb7aad27086e721fb0d4a9d4cd8e762c577b88e9cc7d29674a1ce46573db59ea6dc82091a5eac7f9ea77ec4e7186d120497342e0e08dbb1cf4d857268d24c9f0253558a28cc975796c3d68f2f788962101318d3214da9b8409896450244b4712a03d10b4d656d0701c376551e42c57760e0e4e330dcf8f2f7bdc91b9e4b539d8beee86d510e45f0d7f5328e258214609524c128b0c514cddd0b0947acc75d0539af7c940dd33068e9519c4e59967fea716829c17377fd6afcf64680000000000000000000", + "396ce0802634c44851f6aaa20b4494967e4b7dfd7d9a54311232fa9b41058394bbb1b940f3feac871022da639d2c01caac10c93311116e757785c32997c2d9f5711269a8db62925ce1f4adbd89fa965474b2654307d26e54f849ac8b6e0ad609c9a12e091f3e035eeef834bdb31bfd5aea71a917075ac81974ea68714ec317238ff9d2520b77ba2854bbc6c9a7608cfeaeb673a1451d949950874358c4d909e4350c60082c0886a80c13725c9d2f3d55224f5644a9a736265f04faa5872df088f4f96e26d5a46d1648b30709dcc9849b04f673f149e981fc5cf5058170f974d3e7b21f8ac2269f6db13544f4925c12e7cdd1ccb70890a0e28a4d9f6bb2333cb600cf5966d7f429a22c62005472786c5528e0430cd6388fbb89ca0b2f1945128ddf88587331d6bb41d0634a52011338b90779277eee08133a82230e1b24aae65b793d18d73b5e51e7f12cb6396ad1d9927f1aaf440d526ecde9b996a2dae31257a516a84c84dd9c05862fd9625c96e4d92a733724cca430694d5623475bd643a2c73616d639f78942e0ea64654f5f67ebaf3f0b072279b6c14f6c3fb2bf9ca91f48fbb012352635475f1036659cae51f1de8e052d0b70a21986a5f6fa51a43344e48ec6f59c84b189ac9cfcbbaee16fa0073b9c8c2a6d5998dc2486c673bed41388cd520da0cb9e6ae271e188535337add11d1f4d2e1264d45c19a56ddc9e77d20f6466d0f41a81b0b6b6ee4940d3751479abca5b7f249608d0f17e1a1e1f157df944a590833eb1e2e3271b65c390cd2d17cffaab31d424fc0331b494324deeadac6fd2045cc62ecc5c87bd79db16f306677a4ec359e2cecabaef4efb9461de940774c5125f08f0b6a59900bcfc4ef407c6aa6cc8b8dc2e55aeae5b2f25fe9acf1533334c84ca7b558ff45efcedc2bebb4a4e6200000000000000", + "397debc135313dbd031dc06b5b3c7219ef6bd2ae1eddda47026b2efc71a4260a157f565602e39820702870f7f714c8d8d8f76c3b549aaf513bb4dba7ab620404704d1a17c8cdcefb14c341c7997e90f227add8476664813f8c2b78193345ea4c48a549097c9d4b757efa76a2c84c4747c7f8d49223298c68f77871b99decff52088f0e235ffca3081c5a38d2a3c69bbe8acab4044661ff5e5cec8d2af6e9771c29bee2c919242f1a36ae5717fc22c035bc6767e49bcc5126a735028ccba55e9ca35675b4fb9dbab56d3832f94b0d7d83c57128b35682188b23cae3e229dc5de9d782117222ae68e97ecd122bbdcca7a184d84a236946f6148cec234e1c5bf1454b0d82c7e0ce251297beeb02bec1b1489282b61ed60988d0a9eb5da3757d967cd355388463b457a6a3f9867efd1cee9a01658ea4156e973f0d53d0e6a7944dec008050d5f455d545900286e5c8153bd396b8bc93ebdcacc9ab57664f14b1593676162f4367dc7c2378681a4e861d06ea30ac382b8c49b691b3dba9a5cb2a442bbb6d56bb71b9b524ad113034ca9339ad921fc21a91672974272c8de41ff8593b4bdb77866ccadcd026d34517b1166c57d52f41d9450b14cd60e754060edd2a9c7ff405751352343f670f82a2ffecf948eb47b9a7e5c20b1269bf7b365cc3a28832a6c956cd6ed2379994e6345e7a677f3882922b062fbd9ecc93427db6d1a4ca1f58c56aa2bdc9e54379da71a050c307bda25970db43f7b0419be65cc88dacb35b5d709003296d21259f848d3170c86c1fa4a79b2d8a59e9ed4c2af4f43707b288ffe2d30325a345a32498e07d59356b02a5204a7a1ac31ced81854633109e1f0f088a9947e1177392863a8673be2c8ed234d0ac3012459cc99ab454a42cf988d0d7546e760e7b475e6bd59cf3d2400000000000000000000000", + "396ef355a73884a445da06224862bff01b287645d9d7f5a187302b60dd511a377cbac676d9711835365bce36f14442da80ee3ab713d30aad4b90378fda5d0b1567cb6f9b57df363edde062dada21c547aef9ea9dd9a308fc4638c33129f5ae8fc46291a1f659bf480ac09c2238ff8f469e8aa7938a64da8faa85fca2d048bd659e2a5ad63d53cd380749d0bfed523b293868e78e4cb96418c46cb3eda764868dc688fe1ce773a48e48f3e9072a0cc4d4366b7e211f9b4b382e460e9b475bd999ad718a927ada526da52e867300dd91bd01cd6d8e64c1414358249f0df8fffaf2906ad669c4d86b50e89a1ab44ee44b22353842e3286f412ce26756d6d30084f1f19cbeed013ebcf958fedf31f59643d3b5b322da109828eee6c964b896ce5446ab697c89be9bec9097b44c891ee528e4689d10c26e649874518066d4f4148313e6caf12f4454bcd791864305b3d7e0fec8b1295ba1309893e7c706c2c2ad9a67063e94fda738e8073114e37e7219fde753792973940674c1356c5625ee45f2b1bd7f97b7a41519640914b49a5cf3dae96e989e9d29289abe93ceb4a5c785992a6d84dc259b19a5e78523e0a7f4170e4365485a75f53896a30ec24150784ce1912659071e1d0b9a224d817b9eb35a034daa67ff1115c94774ee382dbfee614d42de95f65c4c67d3bdd1936559c24e89b1d27be6c33b20204f06ae70cd3d636c929c393244f9c2fbb3a69e10ebb80e7f6e359b4959291babb558a5e872d19e217485c4af42b2398477c3fcc26cd75a5c3cf0a28c231950dbd0795edb1644cb2104548439b44420f944130fb28b9588197c092dfc2870fa9d5e34e7e0e04adaf3c3ad4edb4330751e76e11f211b05e23f197b1527dccf74e3c44a248298431759d564bc4f4fa5552e3e442d6cbbb45fa8278a000000000000000000", +]; + +/// The polynomial test vector signatures. +const EXPECTED_SIG_POLYS: [[i16; 512]; NUM_TEST_VECTORS] = [ + [ + -18, 23, 128, -18, 155, 226, -57, -111, -73, -186, -55, 101, 332, 15, 348, -134, -48, -101, + 231, -285, 226, -132, 63, 155, 240, -324, -105, -29, -228, -35, 135, -381, -188, 185, 24, + 106, -169, -18, -299, -123, -88, 38, 183, -20, -9, -100, 299, -34, -148, 16, -173, 168, + -149, 403, -117, -14, 30, -3, -106, -126, -37, -72, -138, 304, 103, 125, 51, -12, -28, 76, + -52, -35, 55, 271, 203, -198, 230, 125, 99, 65, 41, 226, 48, 150, 8, -26, -158, 184, -30, + 127, -79, 159, -66, -34, -93, 167, 51, -53, -57, 144, -50, 408, 205, 78, -48, 196, 58, + -244, -66, 31, -193, -264, 136, -104, -173, 22, -290, -33, -81, -202, -36, 73, 221, -157, + -95, 183, -119, -101, -29, 4, 124, -47, 25, 20, -368, 5, -46, 86, 242, 209, 54, 131, -6, + 176, -179, 177, 135, 8, 331, 178, 66, 108, 110, 170, 6, -97, -309, -187, -197, 67, -2, 23, + 228, 118, -140, 160, -360, 25, -180, -75, -109, -119, 19, -163, -157, 0, -144, 41, 48, + -377, 234, -161, 22, -341, 58, -205, -230, -202, 8, -470, 16, -6, 49, -67, -92, -294, 107, + 34, 6, -43, 21, -309, 89, -168, -6, 337, -317, -157, -146, 43, 106, 110, 98, 105, 15, -59, + 196, 105, 30, 81, -11, -47, -6, -300, 167, 2, 177, -26, -385, 124, -158, 195, -187, -326, + 247, 67, -110, 211, 234, 35, -7, 59, -398, -47, -41, -182, 45, -32, 88, 13, 72, 8, -122, + -95, 141, 69, -113, -34, 82, 15, -25, -256, -33, 200, 82, -273, 374, -151, -71, 158, 175, + 293, 100, -130, -41, 20, -51, -277, -90, 138, 139, -32, -93, -142, 76, 334, -30, -188, -24, + -99, -149, -79, -170, 100, 291, 127, -185, 389, 149, 51, -422, -191, 243, -122, 185, -207, + -15, 273, 67, 2, -19, -347, 298, -111, 9, 403, -84, -118, -219, -50, 132, 121, 200, 19, 93, + -178, -87, -299, -201, -50, 484, -87, 88, 4, 114, -77, -302, -201, -286, 27, 3, -160, -55, + 37, -146, 212, -115, -154, 4, -76, 25, -42, 4, 117, 73, -272, -34, 61, -243, 180, -143, + -153, -1, 273, -31, -187, -121, -37, -147, -227, 41, 182, -26, 306, 59, -46, 61, -97, 238, + 80, 149, -370, -235, -16, -56, -241, -177, -50, 152, -34, 77, -6, -131, -248, 16, 118, 170, + 187, -70, 42, -42, -107, -45, -392, 162, -129, -59, 14, -204, -23, 17, -68, -30, 85, 60, + 168, 72, -90, -39, -170, -75, 33, 207, -29, 56, 53, 100, 53, -35, -230, 122, -72, 0, -80, + -60, -260, 47, 92, 82, -135, -112, -147, -166, 8, -21, 378, 164, -107, -100, -148, -151, + -181, -217, 331, 189, 45, -82, -125, 133, -46, 52, -277, 160, 128, 14, -274, 97, 8, -117, + 130, -143, -148, 20, 103, -324, 34, -170, 18, -195, -129, 302, -161, 39, -22, -195, -33, + 184, 32, -33, -34, -13, 283, -239, 121, -248, 43, 100, -210, -167, -27, -204, -278, 241, + 246, -203, -20, 144, -207, 80, -12, 132, -27, + ], + [ + 6, 211, 76, 173, 266, 230, 186, 149, 157, 1, -164, 157, 21, 293, 12, -276, -98, -46, 178, + -222, -175, 89, 180, 127, 243, 95, 84, 261, 255, 59, -185, 64, -271, 28, -57, 119, 157, + -150, -85, 59, -135, 53, -52, 141, 47, -65, -128, -107, 228, -13, 20, -1, 284, 171, -112, + -1, -58, -51, -23, -384, -169, -82, -242, -9, -26, 184, 218, 147, 243, 216, -8, -5, 246, + -246, 82, 109, 134, 293, 14, 26, 93, -150, 78, 71, 90, -15, -227, -14, -16, 134, 42, -112, + 114, 12, -228, -28, 4, 235, 82, 156, -332, -94, -8, 86, 44, -10, -310, 113, -29, 329, -22, + -193, 102, -56, 6, 295, -11, -117, -168, -52, 15, -243, -21, 7, -134, 47, -84, -139, -162, + -55, -469, 67, -88, -119, -231, 94, 92, 10, -188, 171, 49, 210, 49, -329, -20, -169, 226, + -220, 257, -9, -341, -63, -192, 248, -115, -101, -42, 50, -178, -15, -76, -124, 117, 6, + -160, 112, -333, -267, 6, -158, 47, 148, -112, 174, -57, -58, -155, -221, 189, 198, -12, + 171, -23, 228, 154, 138, 253, -135, -143, 187, 236, 74, 175, 185, -155, 54, -23, 205, -38, + -46, -287, 252, -196, 156, 73, -45, 196, 13, -101, -14, -27, 137, -32, 65, -252, -62, -241, + -18, 138, 104, 243, 179, -155, 24, -110, -243, -213, -37, -233, -104, 74, 249, 223, 110, + 183, -7, -42, 166, 55, -149, -291, -20, 105, 155, -100, -20, -227, -92, -141, -73, 13, 231, + -132, -84, -103, -117, 344, 376, -550, 184, 488, -26, 111, 67, -10, -12, -56, -28, -102, + 176, 85, 17, 230, 253, -232, 55, 5, 198, 240, 13, 159, 67, 72, 66, -141, 6, -114, 110, 107, + 386, 139, 260, 23, -207, 9, 264, -87, -141, -356, 120, -80, 37, -10, 36, 59, 184, -175, + 434, 96, -289, -201, -14, 219, 224, 224, -123, 33, -140, 91, -124, -230, -73, -154, 383, + -21, 116, 178, -208, -7, 139, 98, 60, -18, 99, 166, -118, 56, 1, 119, 3, 162, 115, -181, + 525, 80, 26, 146, -6, 178, 100, -153, -10, 87, 68, 401, -27, -148, -228, -295, 5, -196, 20, + -367, -154, -16, 83, 288, 110, 41, 451, -175, 24, 83, 206, 163, -26, 64, -51, -118, 315, + -132, 47, -78, -251, -83, 321, 173, 170, 57, 25, 155, -51, 53, -276, -69, -68, 199, -32, + 95, -11, 176, 85, 171, 18, 75, 224, -199, 306, -385, -25, 434, -9, -20, 129, 165, -57, + -187, 100, 370, 131, 66, -275, 227, 197, 141, -109, -202, -98, 87, -54, 22, 202, 253, 59, + -327, -243, -249, -89, 187, -10, -175, 40, 196, -59, -20, -56, 23, -296, 83, -87, 84, 75, + -148, -174, -28, -215, 229, 120, 59, 275, 114, -52, -13, 331, -204, 253, 329, 156, 59, 37, + 39, -329, 102, 173, -153, -198, 58, -63, 8, -229, 197, -44, -259, 151, -200, -7, 368, 12, + -132, 27, -60, -242, 157, -3, -181, 3, 75, 94, 22, 94, 35, 107, -205, -1, -75, 65, 87, 144, + 76, 164, 35, 6, + ], + [ + -12, 116, 55, 58, -191, -97, -27, -51, 358, 250, -17, -321, -35, -132, -47, 165, -119, + -178, 129, -201, 130, -188, 33, 78, -80, -182, -8, -168, -75, 213, -104, 99, -257, 21, 199, + 111, -116, -39, 101, -157, 56, 151, 1, 68, -157, -215, 196, 97, 309, 51, -314, 250, 28, + -135, 156, 98, -316, 81, -26, 293, 56, -58, 338, 27, -38, 378, -61, -340, 416, -90, 50, 83, + -133, 53, -4, -47, -17, -77, 102, 130, 88, 12, -29, -14, -63, 53, 228, 132, 29, 134, -102, + -39, 259, -204, -233, -53, 18, 31, 198, 25, 51, -205, -101, 428, -101, 158, 62, -166, 209, + -128, -139, 160, -207, -263, 129, 146, 159, 13, -87, 280, -128, 35, 254, 13, -77, 177, 167, + 292, 158, 258, 146, 121, -199, 60, 241, -98, 206, 308, -270, 73, -8, 119, -52, 183, -105, + 227, -8, 285, -348, 320, -121, 54, 97, -29, 57, -84, 124, -176, -234, 80, -48, 325, 128, + 188, 179, 237, -6, 17, 130, 16, -79, 2, 61, -59, -30, -113, 106, -72, -3, -381, 78, 74, 28, + -135, 89, -256, 71, -114, 92, -555, 81, -91, -116, 183, 46, -20, 168, -32, 155, 68, -272, + -8, -288, 78, 260, 74, 2, -47, 16, 265, -36, -55, 45, 99, 265, -93, 73, 237, 332, -98, + -196, -40, -128, -61, -44, 214, -177, -146, -104, -320, -158, 83, 117, 80, 29, -11, 206, + 140, -48, 133, -284, -139, 187, -222, -155, -373, -199, -59, 83, -50, 48, -69, 176, -124, + -47, -149, -81, 245, -7, 24, -75, 83, -184, 129, -112, 150, -316, 116, 117, -56, 287, 43, + 117, -126, 96, 255, 7, -156, -19, 213, 75, 358, 52, 223, 70, -131, 144, 92, -156, -263, 3, + 33, 105, -80, 119, -370, -18, -55, 58, -344, 181, 75, 13, 179, -91, -257, -168, 8, -51, + -208, 32, 235, 28, -52, -373, 227, 142, 12, 115, 22, -210, 9, -27, 155, 90, -11, -94, 167, + 282, 253, -48, -342, 89, 103, 11, 191, 152, 79, 25, -28, 70, -20, -161, -218, -10, -3, 20, + -355, 265, 93, 1, 125, -154, 3, -1, -190, -298, 211, -156, -68, -61, 50, -346, -129, 156, + -195, 151, 70, 254, 202, 175, -315, 30, -138, -49, 107, 154, 144, -54, -98, 33, 8, -125, + 173, 209, 114, -117, -186, 47, -102, -106, -231, 358, -126, -119, -125, 52, -139, 95, 31, + 246, 179, 247, 169, -192, 59, 261, 219, 108, -237, -43, -66, -221, -240, -215, -21, -78, + -266, 166, 23, 74, -166, -46, -359, -117, -4, 226, -23, 5, -339, 155, 238, 155, -5, -118, + 0, -31, -143, -205, 54, -264, -174, 40, 151, -60, -29, 277, -57, 16, -58, 253, 142, 96, 7, + 14, 268, 249, -332, 123, 344, -113, 20, 21, 21, 349, -230, 145, 203, 135, 107, 111, -56, + -14, -313, 29, -7, -426, -14, 4, 25, -197, -153, -150, -115, -102, -27, 179, 312, 231, 16, + -31, 158, -87, 307, -191, 65, 107, -50, -28, -181, -223, -62, 67, -124, 117, -66, 213, 30, + 57, 23, -126, 88, + ], + [ + 86, -175, 177, 91, 1, -234, -101, 106, -270, 27, 80, -111, 52, 25, -85, 29, 25, 163, 352, + -123, 175, -21, 295, -208, 5, 182, 215, 167, 213, -16, -42, -123, -231, -121, 2, -69, -64, + -219, 60, -60, -184, 247, 123, 166, 156, -136, -220, 45, 439, -41, -431, -44, 519, 191, + 224, 149, 177, 303, 75, -94, -4, -103, -100, 25, -130, 209, -130, 95, -155, 178, -67, 7, + 106, 90, 6, -5, -74, 79, -36, 244, 95, 29, 25, 114, 52, -15, 80, -204, -62, 177, 133, -52, + 71, 20, 151, 15, -4, 206, 358, -7, -251, 131, 28, -286, -107, -112, -271, -107, -140, -252, + -246, -34, 124, -110, -132, 46, -65, -32, -106, -370, -150, -149, -46, 190, -34, 59, -23, + 51, 51, 122, -160, -247, 11, -379, -430, 129, -63, 21, -419, 37, 162, 236, -103, 240, -155, + -19, -39, 83, -58, 93, -160, -221, -57, -58, -469, -10, -182, -224, 29, -71, -77, 360, 30, + -87, 202, 181, 32, 86, -219, 153, 75, 117, -19, 199, 89, 156, 82, 95, -199, -140, 2, -10, + -253, 154, -28, -158, -149, -139, 141, 211, -31, 251, -156, 276, -210, -256, -203, 12, 211, + -197, -86, -37, 164, -101, 250, 304, 127, -249, -74, -49, -130, -140, -347, 165, 115, 206, + -210, -97, 86, 86, -156, 89, 8, 212, 114, 227, -136, 194, -119, 71, 391, 60, -44, 79, -88, + 118, -299, 55, -101, -17, -66, 12, 77, 192, 237, -134, 35, 33, -157, 95, -306, 168, -97, + -146, -54, -108, -24, 41, -108, 202, -251, -227, 146, -230, 35, -186, 14, 17, 71, -30, + -188, 110, 49, 192, -159, -103, -170, -231, 67, 17, 81, 362, -161, 45, -74, -26, -138, -75, + 128, -56, -27, 135, 26, -116, -107, 385, 128, -190, 249, -203, -2, -182, 65, 55, -439, 124, + 151, -92, -232, 41, 68, 24, 43, -4, 100, -140, 459, 14, -49, -154, 73, -170, 191, -2, 139, + 259, -100, 57, -250, 212, 111, -17, -249, -209, -61, 42, 176, 3, 212, -129, -261, 135, + -117, -358, 37, 170, 21, -118, -229, 132, -84, 231, -18, -137, 82, -195, -5, 170, -183, + 157, 65, 56, -12, -442, -377, 115, -168, 236, 103, -53, 87, -255, 92, -56, 67, 235, -163, + 167, -149, 113, 92, -114, -6, 51, -39, -99, 30, -57, 294, 169, -480, 9, 191, 57, -128, 204, + 80, 275, 315, 175, -100, 4, -214, 191, 83, 119, -228, -145, 75, -221, -19, 322, 94, 146, + -209, 23, 274, 77, 167, -251, -153, 84, -12, 103, -43, -1, -109, -220, 51, 79, 138, -100, + -111, -23, 139, -217, 117, 375, -30, -539, 4, -30, -94, 469, -346, -151, -219, 33, 124, + 226, -191, 194, -5, -238, -287, -187, -60, 87, 79, 190, 79, 36, -103, -97, 191, -145, 94, + 218, -230, -158, 284, -16, -299, 29, -292, 14, -2, -112, 237, 405, -87, 125, -20, -18, -22, + -145, -103, 112, 198, 118, -60, 0, 18, 195, 76, -64, -109, -182, -36, 174, -81, 177, -41, + -63, 202, -164, 45, -171, 300, 8, -163, -41, + ], + [ + -160, -274, 144, -207, 20, 118, 117, -215, 193, 55, -197, -9, 101, 5, 54, -84, -177, 158, + -166, 0, 230, -33, 154, 49, -117, 56, 112, -191, -231, -10, -139, -95, 180, -212, 377, + -355, 68, 34, 66, -378, -48, -241, 375, -166, -329, -214, -286, -135, -158, -78, 257, -113, + 236, -80, -653, 38, -219, -172, 55, 206, -125, -36, 91, 10, 33, -81, -41, 109, -287, 53, + -25, -97, 59, 23, 109, 64, -121, 9, -172, -235, 19, 413, -117, -93, -112, 114, -256, -265, + -41, 155, -98, -95, 243, 105, -329, -13, 113, -142, 86, -336, -142, -116, 206, 268, 47, 11, + -122, 110, -198, 114, 49, 93, 163, -193, -124, -68, -151, -127, 249, -170, -188, 8, 117, + 71, 30, -213, -21, 219, -220, 232, -122, 32, 86, 84, -6, 87, -128, -119, 168, 46, 191, + -235, -53, 184, -15, -107, 136, 256, -184, -209, 10, -64, 36, 202, -257, -189, -37, 12, + -45, 302, 258, -195, -6, -156, -96, -187, 34, -116, 63, 205, -35, -58, 43, -124, 252, -62, + 208, 147, 89, 127, -210, -7, -293, 240, 23, -116, 27, -179, -255, 80, -108, -207, -46, -93, + 78, 222, -102, 26, 3, 51, 165, -57, -222, -117, 432, 65, -24, -78, -86, -53, 82, -247, -19, + 167, -51, 182, 227, 130, -72, -356, -110, 49, -230, 37, 40, -82, 42, 122, 127, -190, 227, + 123, -149, -274, -57, 111, -29, 176, 217, 34, 109, 134, -12, -187, 261, 336, -342, 8, 195, + -30, -10, 398, 279, 70, -266, -121, -57, -253, 55, -208, -76, -84, -304, -26, -113, -21, + -292, -154, 280, 480, -68, 180, 181, -1, -121, -10, -185, 12, 88, -165, 172, 40, -457, 211, + 204, -308, -357, -4, -175, -27, -155, 18, 133, -163, 69, -62, -200, 88, -63, 29, 40, 121, + 157, -30, 28, -23, 356, 313, 479, 310, 304, -104, -129, 169, -49, -273, -181, -46, 77, + -287, 158, 147, 60, -4, 173, 115, -34, 115, 338, 186, 23, 38, -238, -66, 23, 6, 101, -65, + -56, 80, -199, -166, -33, -163, 153, 69, -288, -429, 182, -37, 81, 39, 112, 163, 37, -125, + 209, 187, 252, -68, -152, -140, 195, 11, -92, -302, -104, 105, -292, 201, -183, 173, 25, + -47, 0, 96, -10, 255, -115, -83, -34, 255, 256, 113, 181, 177, -439, -325, -311, -85, 285, + 132, -221, 230, -149, 72, -53, -79, -63, 77, -80, 185, -81, 300, 130, 128, -207, 279, -97, + -5, 89, 114, 74, 9, -215, -105, 94, -47, -174, -96, 1, -38, 107, 2, -39, -208, -156, 205, + -68, 81, -73, 367, -149, -27, 300, -186, -211, -111, 1, -84, 120, 27, 221, -68, -167, -111, + -51, -244, -67, -48, -95, 319, -43, 42, 118, 92, 257, -85, 125, 197, -99, -84, -59, -250, + -14, -294, 135, 190, -140, 124, -184, 217, -168, 381, -50, 371, 149, 130, 137, -102, 17, + 111, -119, 273, 21, 56, 52, 104, -86, 389, -98, -369, -192, 125, -29, 102, -280, -199, -54, + 17, 201, 139, 248, -4, -84, 95, 82, 107, 53, -217, 77, 95, + ], + [ + 83, 38, 258, -55, -152, 99, -55, 190, -42, -9, 4, -83, 72, 99, -27, 124, -39, -234, 82, + 103, 113, 24, 64, -212, 163, 0, 68, -155, -137, 115, -333, 24, 114, 160, -166, -306, 210, + 126, -91, 306, 253, -8, -227, 344, -121, -7, -41, 17, 151, 65, -141, 27, 0, -146, 2, -310, + -7, -141, 140, -609, -128, -94, 44, 185, 173, -66, -85, -104, 44, 502, 204, -219, -148, + 118, -373, -288, -80, -10, 76, 407, 104, 188, 193, 179, -94, -28, 96, 7, -215, 111, -1, + -218, -48, 225, -196, 43, -161, 61, -69, -189, 190, -153, -156, -57, 51, 129, -98, 176, + 181, 295, -195, -27, 12, -157, -85, 10, 10, 23, 219, -178, -209, -118, 282, -41, -161, 222, + 210, -119, -241, 176, 67, 114, 62, 168, -122, -107, -32, -22, 29, -56, 188, -28, 133, 133, + -194, 123, -108, -63, -29, 124, -77, -167, 178, 39, 463, 145, -46, -88, -253, -227, -150, + 199, -214, 126, -278, -70, -192, 149, 66, -49, -16, -29, -7, 172, 14, -33, 56, -24, -244, + 117, -183, 3, -95, -81, 54, 24, 23, 105, -239, -43, 112, -106, -106, -329, 45, 104, -86, + -260, -18, -78, 103, -180, 44, -216, -259, -53, -101, -63, 223, 234, 106, -194, -186, -215, + 171, 5, 35, 326, -218, -149, 64, -132, 32, 3, 48, -2, -279, -140, -164, 45, 97, 169, -5, + -15, -73, 133, -236, -243, 230, 57, -244, 102, -9, -27, 25, 104, -100, -105, -258, 89, 201, + 97, -16, -377, -140, -28, -118, -427, -51, 240, 17, 103, 354, -1, -495, -227, -90, 208, + 190, -101, -99, 81, 56, 145, -78, -360, 249, 76, 196, -39, 246, -128, 18, -59, -235, 116, + -23, 24, 117, 349, -386, -25, -249, 173, 169, 75, 95, 25, -39, 51, -12, 52, 88, 163, 14, + -53, 167, -92, 79, 352, -20, 257, -108, -96, 106, 123, 240, 46, 282, -25, 75, -417, -2, + 130, -67, -88, -26, -113, 138, -128, -39, 304, -177, 110, -387, -114, 103, 102, -201, -76, + -40, 11, 109, -245, 0, 96, -168, -121, -17, 223, -274, 378, -126, 245, -280, -312, -112, + 93, 93, 36, 146, -1, -31, 232, -59, 9, -150, 56, -190, 35, 177, -312, 162, -398, -84, -142, + 56, -141, -123, -163, -12, -33, -82, -168, 47, 462, -16, 231, -203, -19, 197, 79, 220, -94, + -16, -231, 85, -295, -29, 63, 91, -17, 359, -93, 81, -100, -26, 72, -84, -39, 42, -93, 85, + 223, -15, -90, -7, 108, -129, 415, 135, -16, 153, 515, -51, 25, -97, 33, -158, -90, -73, + -160, 373, 84, 157, -236, 72, 112, -87, -35, 99, 135, 18, -41, 3, -120, -27, 51, -70, 243, + 243, 98, -29, 125, 67, -87, -30, 104, 340, -214, -91, 7, 211, -296, 88, 26, 220, -393, 84, + 29, -265, -141, -245, -233, 147, 70, 229, 33, -102, 200, 246, -84, -172, 21, -236, 22, + -228, 356, -43, 304, -21, -200, 131, -89, -69, 343, 292, -343, 241, 58, -120, -166, 262, + -223, 270, 186, -136, -62, -28, 26, 83, 291, + ], + [ + -119, 301, 227, -270, -127, -118, -286, -203, 91, 379, -104, 181, 98, 295, -82, 240, -364, + 325, 66, 31, -48, -90, -6, -47, 1, 129, -68, -243, -104, -160, 75, 184, -312, -101, -39, + 42, -131, -163, 266, -104, -72, -191, 229, -17, 246, -125, -35, 219, 86, -117, -64, 132, + 184, 5, -136, -117, 6, 148, -189, -76, 329, 166, 86, -174, -67, -20, 186, -144, 84, -134, + -22, -179, -37, 81, -182, -130, 54, 51, 219, -149, 281, -18, 36, 37, -44, -207, 191, 148, + 56, -133, -74, 129, -138, 188, -256, -124, -201, 149, -93, -49, -10, 256, -119, -40, 298, + -14, -22, -113, 76, -402, -239, -188, 271, -58, -71, 107, -53, 246, -163, -20, -27, -27, + -103, 114, 42, -33, 212, -158, 139, -127, -3, -150, -12, 78, -255, 287, -30, 305, 82, 34, + 55, -171, 242, 182, 117, 61, 271, -96, -115, 5, -129, -143, -102, 186, -121, -21, -120, + -132, -35, -235, 144, 13, -57, 99, -85, -311, -313, 222, -58, 97, -136, -282, 1, -41, 43, + -60, -246, 472, -52, 152, -80, 102, 160, -84, 12, -217, -76, -72, 2, -556, 37, 69, -371, + -390, -32, -147, -68, -248, -217, -252, 113, 26, -139, 262, -83, 470, -33, 0, -282, 77, + 185, 88, -314, -272, -318, -42, -61, -319, 196, 58, 331, 108, 66, -259, 220, -206, 224, + -167, -84, -361, 51, -24, 155, -207, 214, 169, -145, -22, 154, 71, 175, 173, -448, 273, + -23, 87, -41, -182, -73, 18, -544, -303, -344, -336, 314, 110, 50, 74, 25, -42, -79, -75, + -26, 160, 12, -91, 92, 244, -37, 152, -36, -64, 3, -86, -198, -49, -169, -95, 285, 150, 88, + -14, 271, 185, 186, 270, 40, -2, -320, 264, 65, -6, -156, 163, 88, 19, -204, 215, 37, -2, + -286, -215, 228, 156, 191, -28, -110, 54, -30, -44, 191, -7, 23, -79, 187, -28, 6, 66, 245, + -112, 164, -66, 34, 155, 162, -165, -143, -140, 121, 145, -40, -122, 112, 150, 271, -317, + 162, -330, 92, -34, 458, -3, 107, -69, 185, -55, 69, 28, -15, -85, 117, 182, 95, 72, -249, + -44, 65, 33, 116, -182, 270, 181, 333, -18, -50, -42, 207, 148, -89, -305, 66, -476, -128, + -80, 51, 180, 0, 261, -104, -168, -198, -142, 87, -134, -124, -65, 154, -110, 112, -50, + -135, -122, -119, -209, -209, 120, -180, 201, 150, 130, -30, 251, -78, -174, -17, -3, -162, + -217, -22, 386, 183, -82, -21, -76, -172, 211, -254, 67, -115, -261, 79, -24, 105, 193, + 162, 209, 437, -174, 179, 98, 243, 201, -236, -108, 11, 188, -201, -85, 187, 17, 174, 134, + 58, -203, 23, 34, 191, 218, 50, -7, 462, 74, -98, -88, 81, -27, -199, 215, 177, 52, -14, + -10, -180, -82, 146, -191, -75, 92, 149, -136, 98, 157, -207, -11, -209, 184, 5, 127, -55, + 177, 129, 127, -33, -22, -301, -142, 156, -32, 225, 163, -144, 18, 172, -66, 136, -49, 227, + -223, -261, -556, -291, -79, 85, -12, 71, 230, 20, 7, -79, -120, -83, -388, + ], + [ + -68, 171, 223, -75, -188, 195, -122, 103, -38, 98, 306, -173, 126, -122, -92, -132, -73, + -129, -249, 106, -42, -160, -221, 546, 99, 244, -3, 44, 329, -138, -9, 301, -297, -155, 55, + 151, -284, -90, 71, 97, -91, -95, 37, -11, 74, -20, 58, 315, 112, 132, 90, -97, 303, -106, + -32, -223, 0, -62, -513, -236, -62, -577, 208, -13, 329, 157, -261, 41, 311, 3, 249, 76, + -224, -57, 46, 148, 23, -35, -4, 41, -101, -43, -480, 192, 12, 137, -5, -19, -147, -148, + 18, 132, -273, 153, 77, -324, -38, 167, -133, -24, 310, -92, -152, -98, -42, 150, -9, 161, + 165, -32, 462, -70, 165, -48, 111, 97, 236, 24, -172, -98, 254, 199, 131, 138, -13, -148, + -26, 93, 120, -370, -171, 38, 65, -66, 16, -38, 324, -49, 43, -65, -114, 43, -256, -152, + 108, -338, 67, 109, 102, -3, -394, -18, -204, -249, 217, -97, -333, -23, -58, 120, -17, + -312, 96, -69, -186, 263, -101, -169, -3, 182, 26, -28, 156, -76, -52, 249, 34, 26, -245, + 203, 27, -361, -53, 19, -252, -187, -26, 106, 23, 311, 11, -159, 97, 95, 1, 1, 0, 81, -82, + -5, -206, -46, 144, -205, 31, 118, -125, -68, 152, -40, -18, -127, 109, 227, -155, 154, + 352, 80, 61, -340, -11, 166, -166, 71, 101, 103, -255, 342, -172, 61, 213, 562, 232, -44, + 102, 276, 66, 227, -72, -163, -55, -340, 23, -236, 128, 29, 281, 146, 203, 75, 72, 176, + 257, -42, 140, 223, 92, -255, -281, 72, 44, 22, 403, 292, -282, 431, 243, 26, 149, -63, + 108, -72, 152, -130, -114, 197, -24, 122, 140, 281, 166, -240, -8, -52, -75, -116, -46, + -101, -45, 231, -105, -1, -128, -5, -296, 73, -62, 125, -79, 18, -67, 6, -125, 0, 54, 147, + -74, 92, -321, 107, -176, -44, 195, 97, 99, -138, 139, 220, -366, 177, 360, 100, -165, -50, + 141, 252, 145, -51, 105, -140, -37, -33, -219, -166, 11, -55, -320, 5, -3, 196, -69, -41, + -73, 91, -54, -170, -260, -148, 320, 301, 74, -358, -73, -70, -85, -157, 105, 33, -88, 93, + 38, 205, -371, 2, -220, 52, 342, 165, 208, -50, 160, 180, -47, 262, -162, -101, -60, 194, + 56, -97, 29, -28, -336, 44, -3, -194, -38, 10, 338, 237, 244, 30, 128, 281, 151, 70, -4, + -60, 61, -23, -138, 192, 90, 129, -116, 30, 140, -140, 10, 295, -63, -242, 45, -96, 141, + -18, 104, 46, 189, 36, -45, 189, -186, -136, -121, -64, -147, 64, 190, -105, -141, 91, + -189, 253, -18, 43, -159, 338, -74, 129, 200, 111, -73, 115, -3, 25, -543, -31, 345, 119, + -69, 48, -1, 42, 353, -135, 282, 93, -71, -67, -97, -207, -302, -109, -145, 59, -259, 72, + 235, 126, -189, -201, -143, 12, -246, -43, 69, 0, 219, -136, -120, -119, 113, 1, -64, 13, + -278, -329, 12, -151, -120, -94, -31, -188, -146, 208, 93, -17, 123, -75, -149, 88, -176, + 57, -147, -353, 206, 128, 125, 370, -42, -162, + ], + [ + 100, 10, 174, 83, -192, 423, -180, 122, -18, 221, 21, -129, -94, -203, 104, -57, 98, -217, + 179, 51, -95, 282, 288, -112, 344, 402, 17, 11, 14, -179, 237, -247, 278, 211, -96, 268, + -11, -148, 143, -199, 11, -455, 131, 227, -151, 272, 150, 254, -129, -137, -195, -104, -85, + -22, 32, -279, 29, 222, 136, -250, 243, -67, 16, 244, 25, 9, -374, -7, 18, 96, -37, -158, + 149, -10, 285, -117, 251, 4, 33, -64, -9, 199, -256, -20, -246, 202, -185, 193, 388, 118, + -228, -82, 8, -133, 114, -457, 30, 61, -315, 11, 328, 48, -87, 128, -249, -89, 481, 66, + 281, -145, 13, 77, -83, 151, -9, -196, -118, 253, 156, 238, -72, -8, 185, 109, -381, -193, + 400, -233, 42, 22, 195, -180, 167, 293, 332, -9, 96, 11, -14, 41, 231, 139, -17, -81, 37, + 372, -1, -136, 304, -21, -161, 55, 119, 250, 147, 219, 145, 17, 88, 305, -206, -40, 92, + 380, -220, 178, 216, 207, 101, 265, 16, -100, 271, 37, -5, -226, -64, -249, 18, -93, -61, + 135, 115, -116, 4, -60, 60, 414, -154, -68, -13, 372, -19, -83, 104, 241, -252, -3, 169, + 50, 14, 261, -128, 0, 36, 113, 188, 28, -107, 218, 107, 76, -176, 178, -166, 120, -180, -9, + -6, 223, 269, 65, 28, 51, 117, -149, -193, 5, -148, 14, -46, 172, -55, -115, -7, -19, -67, + 89, 44, 66, 301, -267, 78, -134, 46, 50, -64, -198, -118, -343, -23, -19, -143, -260, -5, + 55, 8, -151, 151, 221, -82, -382, 6, 157, 195, -137, -223, -171, 294, -108, 188, 0, 370, + 79, -59, -19, 88, -45, -84, -125, -62, -44, -13, 40, 242, 7, -10, -27, -94, 182, 100, 150, + 22, -229, -117, -242, 52, 86, -244, -114, 54, -138, -273, 298, 8, -112, 135, -265, -33, + -219, -112, 153, -136, 218, 176, 116, 99, -63, -215, 61, 135, -100, -45, -152, 73, -116, + -15, 46, 12, -66, 358, 3, -138, 6, -263, -191, -419, -143, -188, -31, -33, 8, 61, 25, -65, + 134, 57, -100, 46, 138, -117, 215, -10, -56, -74, -202, -153, -189, 218, 184, 13, -28, 15, + -48, -169, 78, 76, -49, -29, 278, 93, -220, 285, -204, -116, 331, -82, 142, -72, -21, -30, + -53, 189, 54, -328, 4, 154, 122, 99, -121, -84, -95, 226, -334, -6, -162, 130, 174, -161, + -65, -258, -183, -142, -105, 225, 242, -163, 36, -19, -64, 41, 85, 148, 198, -18, -85, + -203, -7, 346, -101, -350, 18, -136, 257, -140, -166, 138, -309, -184, 130, -137, -145, + 130, 18, -35, 18, 192, -104, 139, 53, 171, -32, -192, -195, -217, 81, -200, 98, 247, -3, + 263, 56, -152, -57, -99, -23, 123, -313, 27, 60, 173, 57, -177, -247, -80, -181, 16, -72, + 380, -47, -84, -148, -68, 96, 266, -130, 210, 176, 40, 97, 148, 76, -59, 66, -4, 71, 89, + 157, -208, 206, -175, -242, 64, -186, -280, -35, 74, 25, -9, -150, -150, -127, 83, 22, 261, + -193, -77, -63, -86, 95, 61, 163, + ], + [ + 34, -52, -142, -82, -256, -74, 344, 12, 166, -8, 145, -57, -43, 248, 112, -20, -23, -5, + 103, -43, 273, 52, -40, -54, -138, 37, -284, -116, 219, -236, 191, 331, 81, -37, 166, 80, + -3, -210, -185, 79, 265, -44, 22, -312, 90, -130, -73, 194, 240, 35, -79, 1, 94, -93, -96, + -37, -347, -13, -253, 107, 83, 26, 34, -65, -173, -272, -151, 58, 308, -325, -216, -11, 35, + 31, -231, 293, 5, 119, 244, 66, 75, 120, -178, -167, -258, -31, -43, 347, -78, 266, 199, + -20, 50, 450, -80, -172, -9, 356, 60, 141, 140, -256, 5, 258, 141, 192, -130, -313, 242, + -82, -103, 213, 162, 189, 228, 170, -295, -305, -23, -130, -245, 300, -203, -112, 17, -83, + -203, -68, -181, -164, -180, 100, 150, -3, 9, -57, 422, 38, -130, -108, -79, -138, 317, -1, + -120, 115, -296, 224, 112, -114, -211, 190, -108, 15, -10, -132, 52, -118, -310, 181, 19, + -36, 37, -130, 115, -77, -35, 50, -184, 402, 65, -266, 73, 103, -53, -306, -25, -203, -256, + -30, 101, 54, 255, 138, -290, 483, 256, 81, -19, -6, -10, 330, -64, 268, -26, -270, 159, + -220, 185, 5, 431, -148, 68, 70, -95, 16, 97, -25, 157, -46, -32, -208, -269, 202, 0, 275, + -69, -144, -222, 167, -123, 240, 130, -157, 132, 152, -195, -146, 85, -153, -55, 39, 326, + -174, -90, -485, -103, -226, 101, 99, 173, 104, -89, 36, -252, -42, -104, 131, 210, -315, + -317, -57, 173, 22, -302, -265, 94, 40, 106, 9, 289, -315, -192, 97, 23, -217, -137, -201, + -313, -178, 83, 179, -329, -153, 33, 6, 41, 85, 17, 199, 239, 356, -209, -142, -48, 237, + -142, -119, 18, 11, 135, 76, 153, 207, 125, 191, 117, -79, -5, 263, 19, -155, -176, 207, + -48, -125, 43, -115, 170, 159, 35, -93, 257, 26, 294, -298, -87, -392, -307, 359, 92, 71, + -14, -104, -64, 203, 139, -66, 16, -152, -169, -118, -116, 70, 33, 180, 313, 29, 27, -44, + -200, 172, -9, 345, -79, -151, -215, -66, -62, 256, -78, -206, 152, 211, -299, -24, -184, + 292, -49, 57, -62, -296, 56, 25, 84, 6, -32, -279, -102, 220, 56, -97, 16, 205, 179, -235, + -465, -81, -105, 75, 265, -147, 69, -259, -165, -183, -73, -78, -116, 7, 228, -155, 143, 6, + 64, -48, 237, -183, -329, 64, -38, -212, 71, 181, -357, 109, -377, 37, 132, -33, -69, -112, + -33, -67, -197, 125, -114, 18, 44, 264, -159, 99, -11, 281, -70, -50, -67, 33, 52, 104, + 124, -255, 85, 49, -168, 39, -320, -24, -52, 168, -146, -61, -171, -172, -191, 160, 279, + -140, 246, -11, 33, -94, 121, -310, 367, -259, -29, -210, -216, -44, -98, -29, 42, -215, + -105, -62, -330, -135, -233, 1, -186, -266, 37, -481, -225, -309, 230, 0, 121, -369, -94, + 1, -227, 84, -307, 407, -184, 114, 90, -85, -22, -23, 37, -381, -44, -98, 76, -25, 76, 9, + 41, -90, 88, -126, 23, 254, -91, 10, -117, -52, 73, -24, + ], + [ + 168, -67, -63, 241, 306, -49, 99, -187, -135, -170, 181, 122, 19, 118, 54, -83, -171, -392, + 385, -321, -163, 11, -72, -27, 59, -88, 332, -32, -71, 50, -250, 271, 19, -45, -48, 29, + 307, 160, 63, 152, 91, -1, 166, -34, -234, 305, 20, 210, 137, -242, -84, 110, 95, 381, -90, + 150, 9, 17, -35, -71, -113, 210, 290, -20, -140, -35, -59, -391, -57, 59, -51, -122, 32, + 17, -67, 17, 95, -249, 152, 3, 22, 156, -165, 286, -38, -223, 21, 42, -288, 17, 48, -255, + 249, -78, -17, 74, 251, -82, -220, -66, 55, -56, 100, 281, 161, -227, 155, 92, 220, 127, + -132, 480, -45, -198, -89, -242, 55, 177, 146, -41, -26, 2, 25, 46, 42, -105, -148, -299, + -86, -39, -57, -183, 90, 365, -65, 47, 169, -6, 125, 7, 21, -137, 150, -171, 260, -8, 228, + -229, -71, -8, 78, -69, -317, -87, 260, 279, 145, 92, -35, 75, -108, -162, 21, -61, -153, + 573, -4, -48, 40, 155, 40, -61, 138, 25, -48, 154, -67, 22, -120, 197, 300, -176, 99, -96, + -156, 40, 169, -111, 117, 2, 125, 6, -138, 146, 193, 364, -237, -130, -8, -161, 207, 107, + 104, -58, 125, 44, -243, 181, 334, 8, -14, -34, 250, -40, -124, -134, -123, -104, -78, + -211, 0, 101, 157, 32, 86, -82, -79, -6, 83, -33, -26, 60, 68, -61, 256, 0, 195, 223, 149, + -213, 150, 256, 195, -75, 160, 83, 250, -203, 241, -100, 62, 123, 299, -147, 90, 246, -19, + -138, 98, 100, -51, 225, -11, -33, 103, -56, -112, 27, -6, 131, 167, 268, -208, -58, 152, + 216, -193, 113, 146, -54, 163, -30, -58, 52, 114, -277, 16, 93, -54, -42, -46, -56, -57, + 234, 165, -290, 304, -166, 210, -28, -45, 292, -380, 141, 34, -28, 75, 194, -331, 27, -144, + -127, 267, 187, 175, -183, -97, 182, -21, 243, 130, -52, -34, 23, 354, 102, -10, -245, 175, + 135, -148, 66, -138, -26, -3, 58, 192, -3, 110, 42, 56, -127, -288, 221, 147, 72, -33, + -246, -67, -193, 69, -127, 103, -20, 157, -35, -57, 79, -535, 5, 146, -38, -123, -179, + -279, -135, 148, 134, 211, -18, 347, -45, -52, 27, -25, 41, -24, -34, -103, 76, -95, -156, + 261, 34, 96, -11, -94, -30, -281, 308, 62, -54, -163, 166, 67, -342, -10, -42, 21, -92, 60, + 80, -60, -218, -70, 2, 268, -3, -61, 68, 101, -6, -308, -123, -176, 134, -190, -279, -401, + -53, 44, -45, 221, -194, 256, -20, 365, 265, 103, -194, 154, -11, 12, 13, 7, -210, 335, + -50, -177, 44, -105, -90, 48, 87, 207, 13, -3, -50, 17, -127, 22, 304, -18, -163, 22, 281, + 294, -64, -245, -147, 90, -129, 202, 130, 207, 141, -262, -78, -304, -133, 24, -24, 9, -67, + -67, -132, 277, -148, -248, 151, -206, 168, -14, 323, -78, -241, -17, -52, 154, -161, 97, + 257, 34, -28, -275, -171, 277, 200, 103, -24, 410, -46, 81, 115, 96, -207, -35, 222, -175, + 89, -158, -361, + ], + [ + 91, -156, -55, 148, 16, 237, 1, -56, -85, 369, -105, 10, 90, 174, 131, -99, -365, 372, 98, + 89, -101, 111, 54, 223, -243, -15, 110, -224, -139, -45, 324, -197, 30, 119, -30, 83, 246, + -547, 31, 17, 156, -134, -137, 62, 107, 71, -196, -138, 410, -246, 102, -250, 129, 224, + 184, 17, -15, -113, -81, 207, 149, 60, 56, 76, 54, 71, -42, 11, -114, 22, 4, 23, 217, -286, + 82, -173, -143, 83, -154, -320, -210, -80, 127, -181, 35, 357, 184, -35, 188, -73, 174, + 484, -140, 283, 103, -54, 315, 33, 70, -70, 17, -248, -206, -92, -210, 28, 35, -159, 32, + -74, 134, -9, 80, -179, 111, -136, 31, 54, 44, -193, -72, -3, 77, 199, 239, -25, 53, 220, + -10, 36, -235, -293, 54, -293, 372, -28, -128, -315, 27, -288, -205, -310, -76, 176, 193, + 141, -130, 39, -6, -120, -127, -107, -20, 6, 90, -154, -68, -48, -173, 14, 147, 141, 104, + 59, 162, 228, 26, 184, 11, 153, 13, -208, 44, -68, -157, 237, -52, -128, 9, -71, -12, -75, + -93, 192, 62, 121, -229, -15, -91, -204, -117, 44, 143, 187, 108, -145, -308, 9, 389, -93, + -283, 44, 302, 45, 185, 196, -42, -52, 124, 147, -116, -62, -402, 175, -162, -273, 30, + -202, 327, 282, 314, 268, 311, -146, -135, 148, -128, -155, 207, 261, 262, 190, -50, 120, + 175, 145, 75, -26, -228, -134, 396, 108, -107, -96, -125, 34, -137, 171, -80, 48, 305, 190, + -113, -131, -5, 10, 108, -166, -65, 159, 41, -118, 57, -14, 0, -204, 20, -70, -121, -16, + -31, -60, -84, -60, 169, -206, 192, -285, -130, -171, -10, -137, -238, 23, -21, 27, -47, + -101, -91, -420, 81, 44, 130, 20, 361, -37, -158, -237, -82, -186, -9, -83, 202, 40, 181, + -116, 60, -86, 169, -71, 267, -18, 77, 353, -184, 44, -49, 52, 121, -66, 35, -193, 63, 193, + -67, 33, 229, 161, -167, 253, 56, 173, 152, -216, 32, 208, -353, -284, -273, 50, -144, -71, + 14, 11, 180, 146, -304, 123, 189, -26, -288, -38, -170, -31, -120, 145, 242, 199, -83, 113, + -2, -55, -123, 48, 205, 139, -233, 125, 302, 49, 62, 59, -314, -147, -149, -284, 167, 147, + -14, 39, 124, -48, -29, 288, 130, -96, -43, 184, -154, -491, -182, 293, -67, 166, 162, + -115, 11, -93, 186, -39, 136, -215, -192, -79, -91, 26, -155, 165, -18, 163, -85, -181, 98, + 175, 142, 104, -286, 11, 200, 369, 94, 10, -17, -152, 29, -97, -124, -4, -179, 117, 75, + 271, -225, 148, -132, -12, 80, -55, 65, -74, -109, 98, -273, -150, 264, 277, 136, -77, 196, + 264, -114, 144, 48, -246, 69, -21, 272, -23, -257, 45, -248, 67, 15, 83, 87, 154, -79, -3, + 130, 219, 121, -67, 90, 187, -308, -280, -212, -231, -184, 287, 8, -176, 120, 31, 153, + -236, 210, -375, -30, -83, 286, 18, 146, 261, -260, -11, 89, -42, -18, -226, -105, -233, + 341, 113, -228, 139, 108, 247, -34, -122, 4, -98, + ], +]; + +/// The secret key polynomials used for generating the test vector signatures +const SK_POLYS: [[[i16; 512]; 4]; NUM_TEST_VECTORS] = [ + [ + [ + 1, -3, 0, 4, 0, 5, -3, -4, 4, -2, -6, 4, -2, 6, -5, 7, 7, -1, 1, 6, -2, 1, 6, -3, 3, 0, + 7, 0, 3, -1, 0, 1, 0, 0, 2, 2, -7, 2, -7, -5, 1, 7, 3, 0, -3, 2, 7, -3, -8, -1, 5, 2, + 5, 1, 5, -6, 2, -2, 3, 0, -9, 0, 1, 2, -11, 1, -7, 0, 5, -2, -3, 7, 4, 3, -3, 10, -1, + -2, 10, 2, 8, -8, 0, -2, 6, -5, -1, 2, 0, 1, -4, 1, -6, -2, 0, 0, 2, 2, 0, 0, -7, 8, + -3, 1, -9, 0, 4, -8, 2, 2, -2, -2, -6, -7, 4, 1, 0, 2, 4, 6, -2, 1, -6, -1, 0, -9, 5, + 2, 0, 1, 2, -4, -3, 4, -3, 6, 2, 7, -2, -1, 2, -5, -6, 2, 6, 1, -2, 4, 10, -4, 0, 1, 2, + -6, 0, 3, -2, -1, 1, 2, -4, 6, 0, -7, 2, -4, 3, 4, 0, -5, 2, -4, 0, -1, -1, -4, 3, -4, + 2, -3, -2, 0, -7, 3, 5, -5, 0, 4, 1, 3, 6, 9, -1, -2, -2, 4, 1, 11, 4, -2, 5, -4, -4, + 2, -1, 4, -1, 0, 0, -2, 3, 0, -4, -6, -1, -2, -1, -6, 2, 2, -1, 1, 1, -4, -9, -4, -5, + -2, -3, 0, 2, 3, -1, 2, -1, 0, -4, -5, -4, -2, 0, 4, -4, -6, -2, -1, 0, -3, 0, -4, 7, + 2, 1, -4, 4, 3, 6, -5, 2, 1, -2, 2, 2, 0, -4, 0, -1, -4, 5, -1, 1, -1, -3, -3, 3, 6, 2, + -7, 5, -3, -2, -1, -1, 3, -2, 2, -2, -5, -5, -6, -8, 2, 0, 3, 1, 3, -7, 7, 2, -4, -4, + 0, 0, -10, -1, 0, -1, 0, -9, 2, -5, 2, 4, -6, 3, -1, 5, -2, -6, -3, 1, 4, -4, 0, -3, 1, + 3, -5, 4, -2, -2, -3, 9, -2, 1, -1, -3, -2, 4, 8, -1, -3, 4, 2, 3, 4, -4, 1, 7, -8, 0, + 2, -2, -3, -1, 1, -5, -3, -10, -1, -5, 2, -1, 3, -1, -1, 5, -1, -5, 1, -6, -1, 1, -5, + -4, -10, 3, 2, 3, 1, 6, -5, -3, 3, -9, -1, 4, -6, -2, 2, -1, 4, 2, -8, 1, 3, 2, -1, 3, + -3, 3, 2, -3, -11, 4, -2, 2, 2, -4, 5, 1, 8, 1, 2, 5, -2, 3, -7, -5, -2, 0, 5, 3, -3, + 3, 6, -3, -3, -4, -4, 0, 2, -2, 5, -7, 7, -1, 3, -1, -4, 3, -1, -3, 1, -3, 4, -3, 1, + -1, -1, 2, 3, 2, -3, -6, -2, 5, 3, 0, -3, -2, -5, 7, 4, -3, 8, -1, 4, -3, -4, 1, 1, -1, + 5, -1, 0, -1, 2, -3, -1, 0, 3, -2, 0, -2, 7, 1, -5, 5, -2, -3, 4, -5, 5, 2, -3, 0, -5, + 0, -4, 0, 3, 3, -1, -5, 3, 3, 4, 2, 0, 8, 7, + ], + [ + -4, -7, 4, -2, 3, 3, -2, 4, -7, -1, -2, 6, 5, 0, -1, 5, 1, 3, -5, 7, 1, 2, -9, 5, -1, + 1, 7, 3, 1, -2, 4, 0, 2, -3, 2, -4, 5, 5, -4, 0, -2, -2, -5, 3, -7, -2, 3, -3, -7, -5, + 5, -3, 3, -5, -1, 0, -2, 7, 6, -2, -10, -3, 4, -2, -3, 2, -4, -1, -6, 1, 1, -6, 2, 0, + 7, 3, -3, 1, -8, -3, 0, -5, -4, -3, -2, 1, 0, -3, 6, -7, 4, 2, -3, -1, 4, -7, 0, 5, -1, + 3, 3, -8, -3, 1, -3, 0, -5, -2, 0, -3, 3, 1, -7, -4, 4, 3, 1, -1, -7, 1, 0, -4, -1, 2, + 0, 6, 3, -3, 5, -3, -2, 5, 0, -4, 0, 2, 0, 0, -1, 2, -1, -7, 3, -1, 3, -1, -1, -7, 2, + -4, -5, 9, -2, 1, 1, -8, 6, -9, 2, 2, 3, -3, 4, -3, 2, 3, -3, 2, -3, -3, -2, 1, -3, -5, + -7, -4, -2, 11, 1, 0, 0, 4, 4, -3, -1, -4, 3, -2, 1, -10, 9, 4, 1, -3, 0, 2, -3, 5, 0, + -8, -3, 0, -2, -1, 1, -3, 5, 1, -2, 2, 0, 2, 11, 2, -2, 1, 0, 3, 0, 8, 1, 6, -1, 1, -2, + -2, -1, 8, 0, 0, -3, -1, 7, 4, -3, -6, -5, 4, 1, 1, 4, 5, -1, 0, -6, 1, -4, 2, 4, 5, 3, + -1, -2, 4, 2, -8, 0, 1, -2, 1, 5, -1, -8, 6, -1, -3, 0, 5, 0, 4, -1, -4, 1, 2, 11, 1, + -6, -2, -5, -4, -3, 3, 2, 4, 1, 6, 4, 4, -2, -3, -3, 3, -9, -1, 6, -2, -1, -3, 4, 1, 4, + 1, 3, -8, 0, 2, 0, 3, -2, -2, -2, -7, 2, 1, -5, 0, -8, -1, -7, 2, -1, 2, 4, 6, -5, 0, + -5, 1, 7, 3, -1, 8, -1, 4, -3, -5, 0, 0, -6, 0, -2, 8, -3, -9, -4, -5, 3, -5, 2, -4, + -2, 1, -1, -1, -4, 2, -2, 6, -6, 3, 0, 3, -7, 4, 2, -3, -5, 3, -7, 3, -3, -2, -4, 4, 4, + -3, -3, -4, 5, 0, -2, -2, 2, -2, -1, 3, -5, 1, 3, 3, -6, 2, -2, 1, -3, -7, 2, 4, 2, -4, + 0, 0, 7, 1, 6, 2, 3, -3, 7, 3, 3, -4, 3, 4, 5, 0, -5, 0, -8, 0, -5, -1, 2, 4, 0, -2, 0, + -3, 4, 4, 5, -3, 5, -4, 0, 1, -7, 0, 1, -1, -7, -4, -4, -5, 5, 7, 0, -3, 0, -3, -2, -6, + -8, -3, -6, -1, -3, 1, -4, 2, 5, 7, 1, 2, 1, -2, -6, 1, -6, -4, 0, 7, -1, 0, 6, 3, -3, + -7, 1, -5, -6, -8, -5, -1, 0, 2, 4, -8, 2, 2, -8, -3, -2, -1, 0, 4, 5, -2, 1, 3, 4, -3, + -4, 6, 1, -1, -6, 2, -12, 2, 4, 2, + ], + [ + 30, -32, -19, 0, -14, 46, -28, -18, 1, 19, -26, -9, 41, -47, 17, -16, 31, 17, 2, 27, 0, + 15, 13, 25, -14, -2, -19, -29, -18, 19, -3, 13, 16, 48, 1, -13, -24, 3, 7, -11, 75, 18, + 10, 7, 11, -25, 47, -32, -21, 18, 14, 40, 14, 8, -42, -15, -12, 20, 43, -14, 54, -24, + 23, 29, -13, 46, -38, -7, -4, -29, -17, 39, 10, -6, 11, 18, -12, -23, -36, 52, 3, 5, + 29, -11, 35, -34, -9, 40, -7, 26, -15, 67, -67, -2, -40, 4, 1, 38, -25, 11, 42, 36, 36, + 55, -10, 13, 6, -31, 78, 43, 26, 7, 9, -11, 21, 30, -4, -6, 5, 40, 0, 21, 15, -37, 67, + 13, 79, 11, 21, -21, 11, -60, -2, -6, -36, 14, 26, -2, 23, -15, -22, -18, -30, 64, 9, + 10, 22, -6, -57, -13, -44, 7, 6, 8, 6, 25, 7, 21, 24, 51, -47, 9, 41, -12, -17, 26, + -24, -3, 20, -20, -39, -2, 11, -13, 27, 23, 65, -81, 22, 12, -12, 1, -4, 37, 38, 5, 31, + -30, 32, -4, 34, -16, 15, 28, -36, -2, 35, 45, -27, -3, 39, 16, 6, 4, 26, -13, 45, -38, + 28, 24, -10, 12, 26, 13, -15, -4, -25, -31, 37, 20, -36, 77, -18, 29, 1, 28, 6, 12, + -26, 53, -4, -18, 18, -9, 2, 3, -29, 2, 8, 34, 26, 5, 19, -8, 25, 10, -4, 14, 2, -2, + 30, -24, 41, 9, -5, -10, 14, -9, 36, 47, 13, 19, 5, 13, -32, -16, 1, 4, 40, 33, 23, -5, + 0, 25, -15, 28, 28, -28, 4, -6, -18, -10, -14, 46, -46, 37, 49, -7, -2, 21, 33, 6, -29, + 7, -20, -3, -30, 45, -2, 11, 4, -1, -48, 37, 47, 0, 8, -20, 4, 9, -30, -56, -34, 10, + 13, 31, -52, 39, -14, 26, -25, -13, -6, 22, 27, 18, -16, 9, 13, 10, 34, -26, 18, 9, 13, + 7, 46, 14, 24, 35, -25, -2, -5, 22, 8, -7, 2, 22, -1, -1, -11, -8, 25, -13, 40, -37, 5, + -24, 53, -37, 2, -31, -18, -1, -6, -10, -19, -37, -20, 15, 47, 32, 14, -6, 67, -25, 3, + -7, 14, 21, 28, -14, -18, -2, 13, 8, 13, 16, -14, 85, 12, 19, 34, -11, 5, -30, -48, 5, + -12, 41, 3, 56, -8, -36, -11, -6, -16, -5, 5, 27, -14, -22, -24, -9, 22, -16, 36, 31, + 6, -4, -1, 7, 25, 7, 10, 12, -4, -35, 24, 13, -16, -24, -5, -31, -27, 8, 16, -14, -4, + 31, 23, 9, -6, -7, -39, 32, -4, 24, -3, 0, -9, 7, -60, -13, 20, 4, -7, 9, 34, -29, 20, + -25, 5, 21, 4, 8, -29, -4, -18, 51, -5, -8, -29, -5, -3, -26, 2, -33, 16, -4, 27, -6, + -3, -22, -7, -5, 22, -39, -5, -8, -83, -18, -33, 14, 17, 18, 23, 1, -9, 5, -5, 35, 16, + -22, 41, 19, -25, -5, -6, -14, 42, 8, + ], + [ + -25, -14, 10, 8, 28, 18, 7, 12, 34, -18, -5, 2, 12, 17, 4, -18, -30, -12, -11, -18, 27, + 39, 42, 53, 55, 16, -56, -33, 9, -15, 20, -3, 6, -35, -8, 12, -2, 28, 25, 30, -38, -6, + -34, -3, -14, -2, 21, -27, 32, 40, 53, -15, 18, 6, 19, -20, -33, -4, 22, 4, -5, 7, 60, + 3, 21, 17, -57, -19, 7, -8, 18, -13, 9, 2, 3, -29, -7, -22, -1, -19, -18, 7, -12, 40, + -2, 48, 0, 17, 0, -11, 2, -43, -19, -20, 41, 5, -30, 16, -19, 32, 33, -14, -9, 15, 14, + 26, -35, -40, -31, 52, 5, 52, -11, -2, -1, 2, -12, -21, 52, 9, -2, -24, -33, -41, 29, + -1, 5, 41, 33, -2, -37, 1, -34, -21, 3, 23, 2, 37, -23, -24, 14, -9, 5, -19, 0, 40, 15, + -42, -26, -1, 1, 35, -3, 45, 32, 8, 43, -18, -3, -18, 6, -52, 30, -12, -24, 28, 1, -3, + 8, 44, 49, 13, 33, 18, 36, -31, -37, 32, -19, 31, -13, 27, -7, 23, -43, 47, 27, -9, 45, + -9, 24, 50, -6, 15, 44, -29, 2, 59, 2, 30, -4, -24, 5, -26, 14, 29, 36, 38, 66, -16, + 34, -9, 31, -11, -21, 12, 2, -14, -14, 41, -22, 31, 7, 21, -45, 48, -13, -8, -41, -43, + -40, -2, 19, 20, 37, -22, 54, -27, -7, 7, 10, -20, -14, -12, -26, 53, 18, 19, 15, -8, + 9, 3, 10, 9, -3, -19, 3, -20, 27, 29, 43, 22, -28, -42, -44, -4, -20, -12, 10, 23, 29, + -28, -32, 3, 51, 57, 21, 19, 41, -45, 7, 3, 0, -40, 40, 32, 19, 39, 5, -10, 26, 22, 14, + -1, 29, 66, -49, 24, 4, 3, -29, -3, -3, 12, -42, -16, 44, 9, -3, -21, 1, -27, 33, -22, + -8, 5, 27, 3, -49, 66, -23, 6, -48, 26, -27, 31, 5, 5, -29, 24, 9, 44, 53, -34, -16, 1, + 69, -3, 27, -10, 10, 5, -9, 11, -9, -16, -39, -8, 20, -13, -31, -26, 23, -3, 15, -1, + -7, 32, 27, -52, 14, -18, 4, 9, 1, 20, 11, 42, -4, -11, 19, 19, -28, -9, -38, -36, -6, + 6, 36, 6, 37, 7, 53, -33, -25, -11, 23, -39, 39, -34, 13, -16, 11, -34, 22, -9, -14, + 23, 3, 7, 15, -30, 38, -28, -6, 4, 75, 3, 33, 20, -32, -41, -36, 24, -40, 5, 14, -5, + -27, -16, 33, 27, 25, 27, 19, -27, -11, -19, -38, -24, -31, -28, 2, -10, 23, 15, 42, + 56, 2, -11, 24, -12, -14, -10, -26, 2, -47, 26, 13, -4, -20, -12, -12, 40, 21, -33, 13, + 22, 21, 17, -26, 39, -29, 40, -11, -7, -1, 9, -1, 32, -8, 8, -9, -34, 28, 20, 1, 24, + -22, -6, -33, 17, 38, -6, -12, 0, 29, -33, 56, -27, 21, -16, 12, -47, 16, 25, -61, 7, + -6, -45, 0, 11, 34, 24, 30, 15, -23, -28, -24, -45, 25, -30, + ], + ], + [ + [ + 1, -3, 1, 4, 1, 3, -1, 0, 6, -1, 2, 1, -2, 0, -2, 2, 2, 4, -1, 4, -5, 1, -2, 1, -4, 1, + -3, 4, -6, -2, -1, 4, -1, 10, -1, -3, 9, -4, 2, 5, 1, 1, -3, 5, 5, -8, 10, 3, 2, 6, 1, + 8, 7, 2, 6, -1, 1, -1, 7, 3, -2, -4, 5, -1, -1, 0, 3, 0, 3, 13, 0, -1, 7, 5, 6, -5, -1, + 0, 3, 3, 0, 1, 0, -4, -4, 5, -3, 3, 4, 0, -2, 3, 6, -8, 0, 2, 5, -3, -2, -3, 4, 0, 7, + 6, 5, -3, -6, -3, 7, -2, -6, 1, 0, 0, -3, 8, 2, -2, -4, -2, -1, 0, 9, -1, 7, 5, 5, 0, + 1, -3, 3, -3, -8, 1, -2, 7, -4, 3, -3, -6, 0, 0, -2, -5, 4, 1, 0, 4, -2, 2, -2, -3, -1, + -3, -1, -5, 4, -2, -6, -4, -2, -1, 1, 0, 5, -3, -2, 2, -1, -1, 0, -2, 0, 6, 2, -5, 1, + -6, -1, 3, 2, -1, -4, 11, -4, 4, 6, 1, -3, 2, -1, -4, 2, 1, -4, 8, -6, -1, 3, 2, 6, -1, + 5, -3, 4, 1, 7, 3, -3, 5, -2, 2, 6, 0, 1, 2, -1, 0, -6, -1, 0, 4, -10, 2, 2, -4, -4, 6, + -5, 7, 0, 3, 2, 8, -2, 3, -3, 0, -1, 2, -1, -6, -9, 2, -2, 0, 6, -1, 1, -3, 1, -2, -3, + -1, 0, 5, 2, 4, -3, -2, 5, 8, 2, 2, -5, -4, 6, -3, 4, 1, 2, -3, 1, -2, 0, 2, -1, 2, 3, + 1, 3, -1, -1, -3, 1, -3, 2, 6, -4, -1, -1, 3, -3, 2, -7, -9, -2, -11, 2, 3, -3, -6, 7, + 1, -3, -3, -3, 5, 1, 2, -1, 0, 3, 1, -1, 2, 5, 1, 2, 1, -2, 5, -1, 0, -5, -2, 0, -4, 1, + 4, 4, -2, 3, -2, 0, -3, -3, 0, 0, 1, 8, 1, -4, -10, 0, -3, -8, -1, 1, -2, -1, -4, -3, + 4, -6, 1, 0, 3, 3, -1, -5, 9, -7, -2, -3, 4, 0, 1, 3, -4, -1, -5, 6, -9, -7, 0, 8, 1, + 5, -5, 8, -3, 1, -3, 1, -2, 4, -7, -1, 1, -8, 3, 0, 5, 1, -8, 0, 1, -5, 0, 5, -1, -5, + 6, 3, -7, 3, -6, 0, 5, 0, 0, 1, 4, 6, 1, 4, -9, 3, 0, -6, -4, 0, -1, 4, 4, -2, -2, -1, + -3, 7, 6, -6, -4, 10, -3, -2, 3, 4, 1, -3, -4, 4, -1, 3, 10, 13, 4, 9, -3, 3, 2, 7, 8, + 0, -2, 3, -5, -6, -1, 0, 2, -6, 6, 5, 3, -2, -4, -3, 4, -2, 1, 7, -6, -4, 2, 2, 0, 0, + -3, 5, 1, -5, -4, -5, -1, -5, 0, 0, -7, 3, 1, 1, -10, -6, -10, -1, -1, -7, -2, -6, 2, + 4, 0, -7, 1, -3, -6, 2, 0, 7, -1, + ], + [ + 1, 5, 4, 2, 1, 9, -6, 3, -4, 4, 5, 6, -5, 0, 7, 0, -1, 5, 9, 1, -8, -5, -8, -1, 0, 5, + -4, -2, -1, 4, -2, 2, 2, 8, 4, -4, 11, 6, 0, 2, -3, 0, -2, -8, 5, -7, -4, -5, -3, -1, + -3, 5, 1, -1, -1, -2, 9, -9, 2, -4, 6, -3, -5, 7, 4, -2, 4, -4, -1, -9, 5, -1, -2, -2, + 2, -7, -2, 3, 4, 1, 2, 7, 1, -3, -4, -1, 2, -4, 1, -5, 5, 9, 3, 1, 0, -7, 3, -1, 6, -2, + -1, 4, -6, -3, -2, -7, 7, 7, -1, 2, 2, -3, 1, 4, -1, 4, -3, -1, 6, -3, 0, -2, -4, -1, + 2, 10, 6, -9, -3, 4, -5, -3, -10, 3, 1, -1, 0, 2, 3, -1, 2, -2, -2, -9, 3, 0, -1, -1, + -3, 4, -4, 3, 4, 1, -6, 1, 4, -4, -3, 0, 0, 0, -3, 1, 8, 6, -3, -1, 0, -1, -11, 4, 1, + 0, -3, -1, -3, -2, -6, -4, 0, 1, 5, 2, 4, -4, 0, 8, 3, -2, 5, -11, -6, -8, 0, 0, -1, + -2, 0, 3, 7, -6, 5, 6, -1, 3, 4, -6, -3, 2, -4, 9, 4, 2, -4, 2, -3, -1, 0, -4, 3, -2, + -5, 2, 1, -6, -4, -1, -2, -1, 0, -8, -5, -1, 0, 0, 1, 2, 2, -6, 0, -1, -11, 0, 7, 3, 0, + 1, -2, -4, -5, -4, 4, -3, 2, 3, 4, -2, 0, -3, 1, -5, 1, -5, -2, -1, -6, 1, 2, -4, 6, + -4, -3, -4, 2, 1, -2, 2, -4, 0, -3, 2, 0, 1, 1, 2, 7, -1, 3, -5, -2, -6, -1, 0, -3, 1, + -3, 3, -1, 2, 2, 5, -2, -5, 0, -3, 2, 1, 2, -2, -4, 0, 0, -3, 1, -8, 1, 1, 5, 1, 5, 5, + -6, 1, 0, -3, 5, 1, -5, -2, 4, 1, -4, 6, -6, -2, -4, 3, 3, 0, 5, -3, 1, 7, -1, 3, 1, + -9, 2, 3, 0, 1, -3, 2, 7, -2, -2, 6, 8, 4, 2, -5, 1, 6, 2, 2, 7, 1, -3, 2, -4, -2, 2, + 5, 3, -3, -1, 2, 6, 0, 0, -5, -4, -2, -1, 5, -12, -3, -3, -2, -2, 1, 0, 2, -6, 3, -4, + 0, -3, 4, -9, -1, -7, -4, 2, -3, 7, 4, -5, -1, 7, -3, -3, 5, 5, -1, 10, -2, 3, 5, 0, 4, + 3, 1, -3, -1, 0, -6, 0, 3, 1, -9, 4, 5, -1, -4, 7, 0, 7, -6, -5, -1, -3, 4, 0, -5, 4, + 1, -11, -3, -3, 4, 4, 1, 1, 3, -6, -4, 2, 3, 2, 9, 1, -1, -2, 2, 5, 5, -1, 1, 3, -1, 3, + 2, 4, 1, 3, 4, -1, 2, 0, -1, 1, 0, -3, 3, 6, -3, 2, 2, 1, -2, -7, 1, -1, -4, 2, 0, 2, + 3, 0, -2, -2, -4, -3, 6, -2, 2, -4, 3, 0, 2, + ], + [ + 37, 14, 1, -10, 2, -6, 18, -37, 3, 13, -29, 7, 36, -39, -2, 24, 18, -28, 9, -15, 27, + -20, -30, 34, -43, -30, -6, 57, 3, -45, 0, 41, 26, -14, -12, 14, 29, 16, -8, 15, 3, + -38, 19, -59, -9, 3, -10, 35, 9, 25, 31, 16, -20, -6, -11, -28, 4, 7, 12, 15, -32, 18, + -21, -25, -28, -29, 5, -43, 12, 40, 44, -19, -19, -58, 4, 18, -10, 11, 33, -37, 7, -6, + 2, 63, -36, 21, 48, -5, 5, -36, 25, -21, -21, 14, 23, 24, -2, 15, -10, 7, -6, -2, 24, + 1, 6, 1, 48, -24, 4, 8, -21, -10, -6, 24, 10, 2, 13, 23, -2, 3, -44, -10, 11, 29, 45, + -4, 17, 1, 8, 0, -41, -22, -12, -2, 16, 11, 23, -2, -25, -12, 11, -11, 27, 4, -42, 50, + -7, 8, -7, 45, -5, -44, 25, 18, 2, -3, -4, 27, -10, 13, 29, -7, 17, 16, -23, 3, -21, + 36, 5, -2, -48, -49, -20, -3, 1, 11, -11, -6, -17, 50, -22, 37, -25, 11, -44, -59, -21, + -9, 34, -17, 1, 28, -7, -32, 3, 13, -59, -61, -10, -44, -50, -14, -27, 10, -42, 9, -39, + 11, -50, -34, 5, -20, 14, 14, 23, -36, -48, 2, 27, -32, -27, -19, 14, -8, 28, 19, -12, + 14, -1, 24, -25, -25, -36, 24, 2, -10, 4, -16, -14, 44, 15, -23, -25, -43, 41, -15, 40, + 46, -7, 15, -16, 61, 11, 7, -33, 4, 11, -51, -13, 16, 6, 0, -24, -1, 6, -5, 7, 31, -29, + 0, 28, 70, -20, -31, -19, 2, -22, -41, -13, -25, -6, -31, 11, 17, -3, -10, -13, -18, + -53, 39, -11, -28, 9, 2, -59, -16, -52, 24, -22, 10, 40, 48, -2, -19, -14, 11, 14, -28, + 35, 27, 12, 16, 19, 24, 48, -3, 9, 31, -45, -23, -2, 44, 6, 45, 23, 33, 24, 36, 10, + -32, 5, -11, -29, -13, 16, 30, 37, -8, -82, 14, 10, -7, 5, 80, -3, -19, 2, 2, 11, -26, + 13, 3, 20, -7, 10, -4, 45, -40, -5, 16, -13, 1, 17, -23, 19, -83, 8, 2, 16, -21, 28, + -6, 19, 25, 3, -7, 9, 67, 15, -2, 19, 43, -17, -15, -20, 21, -23, -4, -56, -14, -10, + -14, 34, 20, 11, -40, -49, -33, 13, 33, 3, -46, -5, -13, -12, 18, 10, -37, 20, 11, -33, + 0, 20, -2, -16, -29, -2, -76, -19, -46, -4, -25, 13, -20, -13, 11, -9, 21, -42, -9, 16, + 28, 7, 0, -27, -27, -11, -30, -8, 5, 9, -8, 7, 34, 10, 17, 5, 0, 11, -14, -19, -20, 24, + -1, -5, -74, 32, 23, 21, -34, -10, 2, -20, -10, 21, -34, 0, -22, 68, 12, -1, -1, -15, + -29, -25, 28, -17, 42, 8, 14, 21, 23, -48, 9, 14, -17, 0, 42, 44, -15, -49, 15, 13, + -38, -40, 25, -7, -14, -7, 28, 41, -25, 7, 17, 8, -6, -2, 36, -11, -12, 3, 44, + ], + [ + -28, -47, -5, 4, 11, 24, -3, -22, -50, -26, 20, 44, 22, 14, 12, 2, -43, -22, -35, 28, + -14, -29, -6, 36, 22, 21, -22, -28, 23, 4, 37, -6, 10, -48, 24, -6, 4, -13, 8, 49, -3, + 20, 44, -19, -19, -12, -5, -14, -19, 52, 2, 23, -24, -29, -13, 48, 45, 42, 48, 3, 30, + 6, -56, -48, -35, -28, -19, -26, 17, 43, -4, 19, -24, -11, -41, 46, 32, -1, 7, 11, -43, + -51, 2, 21, -30, -4, 16, 13, 4, -40, -10, 12, 12, -15, 20, 26, -43, -4, -25, 16, -23, + -29, 16, -4, -46, 32, 15, 28, 8, -47, -3, -17, -41, 29, 18, 4, -19, 11, -4, -39, 19, + 26, -25, -32, 16, 5, -19, -31, -58, 2, 16, 22, 73, 22, 7, -8, -23, -10, -23, 10, -20, + 31, -26, 9, 31, -8, 16, 20, 38, -27, 26, -2, 30, -21, -32, -19, 33, 8, 61, -11, 9, -1, + -23, -15, -3, 13, 6, 13, -39, -33, -41, 3, -35, 4, 40, 13, 32, -21, 15, 57, 55, -51, + -49, -2, -49, -24, -11, 18, 21, 29, 2, 3, -21, -36, -12, 36, -13, 7, -6, -32, 5, -23, + -1, 12, 36, 2, -14, -36, -1, 13, 22, -4, -18, 7, 6, -8, -1, 17, 23, -21, 32, -25, -40, + -84, -26, -16, -33, -7, -16, 34, 12, -6, 49, -10, 2, -6, 8, 13, -26, 28, -49, 16, -21, + -36, 45, -23, -11, 28, 13, 12, -16, -26, 0, 54, 14, 22, 18, -7, -30, -22, 5, 36, 5, 15, + 22, -26, 11, -7, 41, 23, -18, 16, -17, -34, -17, 23, 28, 41, 31, 24, 55, -29, -58, -10, + 41, 35, -46, 6, 56, -22, -5, 31, 15, -7, -6, -14, -29, -17, 34, 37, -18, -9, -39, 3, + -6, -18, 25, -6, 3, 21, 3, 42, -1, 15, -26, -30, -50, -25, -4, 39, -10, 0, 53, -15, + -51, 35, 10, 24, -17, -44, -18, 6, -35, 3, 9, 17, 4, -9, 35, -59, -9, 4, 13, 0, 32, + -27, 36, -46, -32, -21, 15, -46, 42, 17, 39, -14, 25, 47, 64, -27, 19, -5, -56, -5, 56, + 44, 8, 6, -21, 35, -37, -6, 32, 1, 12, 11, 16, 17, 33, -87, 20, 43, -19, 4, 35, -3, + -34, -38, 5, -15, 14, -28, -30, 15, 19, 0, -5, -6, -38, 32, 8, -7, 15, 22, 9, -23, -16, + 45, 63, -37, -6, 52, 14, 7, -11, -9, 5, -7, -11, 51, 7, -16, -1, 48, -53, 5, -28, -6, + 8, -13, 40, 25, -20, 5, -2, -31, -29, -27, 18, -35, -7, -29, 11, -7, -30, -18, 41, -2, + -10, 21, -12, -67, 12, -9, 17, -17, 10, 69, -20, 1, 21, -4, 10, -35, 38, 16, 42, 25, 9, + -24, 36, -39, -26, 56, -23, 22, 2, 12, -11, -31, 26, 0, -18, 17, -12, 45, 15, 59, -37, + -33, -20, 5, 1, -12, 9, -49, -39, -41, -45, -5, 22, -5, 19, -14, 9, -27, -2, -22, -20, + -40, -54, 21, + ], + ], + [ + [ + 3, 5, 0, -2, -1, 7, 4, 2, 0, -3, -4, 3, -2, -4, 6, -1, -5, 9, 1, -6, 4, 0, 3, 0, -4, + -5, -1, 1, -6, 3, -6, 5, -4, -3, -2, 1, -7, 1, 3, -6, -5, 6, -3, 0, 1, -3, 5, 3, 1, -1, + -4, -5, -2, -4, -5, 3, 2, 2, 2, 0, 1, 0, 5, -1, -2, 10, -4, -3, 2, 2, 3, 5, -1, 2, -5, + 0, 1, 0, -3, -4, 4, 6, -1, 1, -10, 0, 7, 2, 4, 4, 2, 9, -4, -2, 5, -7, 5, -1, -4, -8, + 3, 1, -3, -3, -5, 2, 3, -8, 6, 1, -4, -1, 0, -1, 4, -3, -3, 4, 1, -5, -2, 1, 3, 5, -4, + -3, -2, -2, -3, 1, 2, -2, -4, 2, 4, -2, -1, 5, -4, 9, -6, 4, 7, 2, 5, 6, -4, -1, 3, -6, + -1, -5, -4, -7, 0, 0, -1, -4, 5, 1, -3, 4, 4, 0, 1, -2, 2, 6, 0, 1, 9, 0, 0, -5, -7, 1, + -4, -1, 1, -4, 1, 2, 0, -3, 5, -6, 1, -1, 2, 0, 0, 5, 8, -2, -1, -5, -1, 3, -6, -1, 3, + 1, 4, 1, -1, -5, 3, -4, 2, 0, 9, 1, 2, -3, 5, -2, 6, -3, -4, 1, -6, 1, 0, 4, -4, 4, -5, + 13, 6, -6, 2, 1, 1, 3, 5, 7, 5, 1, -3, 0, -6, -1, -5, 5, 3, 5, -2, 6, -2, 9, 3, -2, -5, + -4, -6, 6, 0, -5, -12, -1, 0, -3, -4, 3, -3, 4, -1, -2, -2, -2, -4, 4, -1, -7, 4, -1, + -3, -4, 3, 4, 11, -10, -4, 2, 3, 3, 1, 2, 7, 0, -4, 2, -8, -2, -1, -7, 2, 4, -1, -4, 5, + 1, 6, 1, -1, 7, 1, 7, 3, 0, 3, 7, 7, 0, 0, -1, -1, 1, -4, -4, 6, 4, 3, -1, -1, 3, -3, + -2, 4, 5, -3, -1, -2, 0, -3, -3, 2, 2, 7, 0, 5, 6, -5, 2, -3, 1, 0, 1, -1, -5, 8, 6, 4, + 3, -2, 1, -1, 0, 0, -1, -6, 1, -4, 2, 0, -2, -6, 6, 2, -3, 6, 6, 4, -1, 1, 1, -5, 4, + -4, -3, -3, -5, 0, -7, -6, -3, -1, -4, 2, 0, 4, 0, 1, 6, 1, 8, 1, 4, 1, 3, 3, -1, -1, + -2, 2, -3, 0, -3, 0, 0, -5, -6, -1, 1, -2, 4, 3, 5, -4, 2, 3, -2, -3, -4, -1, -3, 0, 5, + 1, -9, 1, 8, 1, -7, 2, -5, -3, 1, 3, -1, 1, -4, 4, 1, -8, -5, -1, 6, 2, 1, 5, -2, 4, + -5, -4, 5, 2, 0, -1, 5, 2, 5, 4, 0, -4, 0, 9, -2, -6, -8, 2, -3, 5, -3, 7, -15, 0, 0, + -8, -6, -5, 6, 4, -6, 2, 5, -5, 0, 4, 5, -2, 2, -5, 2, -6, -6, 0, 3, 4, 4, 6, -4, -1, + 5, 0, -5, -11, -2, -1, -4, 1, 4, + ], + [ + 7, -1, -4, 0, 2, -1, 1, -6, -5, 8, 0, 2, 2, -3, 2, 6, -1, -1, -4, 2, -2, -2, -6, -1, + -1, -7, 3, -6, 0, -3, -1, 5, -2, 6, 2, 2, -2, -6, -5, 1, 4, -9, 1, 1, 0, 2, 6, 3, -1, + -7, 6, -3, -2, -5, -7, -6, -5, -4, 9, -2, -2, 9, -9, 5, 3, 4, -3, -5, -5, 4, 0, 8, 0, + -1, 3, 5, -10, 2, 4, -3, -4, 2, -3, -4, 0, 1, -7, -3, 3, 4, -2, -2, 4, -2, 5, 3, -2, + -5, -2, -3, -2, 4, 1, -3, 6, 0, 1, -2, 11, -5, -3, 4, 1, 3, -3, -7, -7, 2, 1, 3, -2, + -2, 0, 3, 8, 3, 10, 0, -1, -6, -12, 2, 5, 2, -6, 3, -3, 0, -1, 3, 4, -1, -1, -3, -8, 2, + -5, 3, 3, -5, 2, -9, -3, 5, 0, 6, -4, 5, -2, -2, 3, 2, 4, 10, -3, 1, 0, 7, 2, 1, 2, -2, + -6, 1, -2, 1, 2, -2, 6, -7, 1, 1, 4, 2, 2, 7, 7, 5, -5, -1, 4, -3, -2, -2, -2, -1, 2, + -6, 11, 4, 1, 2, 5, -2, 1, 3, -2, -5, 1, 5, 4, 1, -2, -1, -2, 3, 0, 3, 0, 7, -7, 5, 2, + 0, 8, -2, -7, 8, 2, -3, -2, -1, 4, 5, 6, -5, -2, 2, 0, 4, 0, 7, 4, -7, 1, 4, 0, 3, 2, + -1, -3, -4, 3, -1, -1, 3, 3, -2, -3, 9, -3, -1, 3, -6, 1, 0, 0, -1, -7, -6, 0, -7, 0, + -1, 8, -3, 0, 3, 0, -5, 1, 4, -2, 5, -3, 2, 0, 5, -2, -8, -2, 8, 0, -1, 5, -1, 1, -3, + -3, -1, -1, -4, 1, 5, 3, 0, 6, 4, 2, 6, 0, -2, -3, 1, -1, 1, 5, -4, -1, 2, -7, 0, 0, 0, + 4, 6, 2, -3, -1, 7, 5, 2, 2, 4, 3, -4, -1, 2, 2, 2, 4, 2, -2, 0, -6, 3, -2, 1, 4, 6, + -4, -3, 1, -2, 2, 5, -4, 4, 6, 13, 1, 0, -1, -3, 2, 4, 2, 2, 4, -4, 1, 0, -1, -4, 3, 5, + 1, 7, -5, 0, -7, -2, -9, 0, -2, 0, -2, 0, 4, -2, 2, 4, 2, -1, -8, 4, 0, -9, -2, -8, -1, + -4, 1, 0, 1, 1, 2, -3, 3, 2, 0, 2, -9, -1, 0, 6, -2, 5, -8, 3, 4, -1, 8, -2, 5, -2, 6, + 1, 1, 9, 0, 1, 4, -2, -2, 2, 0, 5, 2, -1, -2, 0, -5, -2, 4, -2, 6, -1, -2, 2, 3, -3, 7, + -2, -1, -3, -2, -2, -4, -2, 0, -4, 1, 1, 3, -5, -1, -2, -3, 4, 3, 3, -1, 2, -2, 3, 1, + -3, -1, -5, -1, 4, -4, 0, 0, 4, -5, 0, -7, -2, 3, 4, 7, 4, 4, 0, -4, 0, -6, 0, 2, 5, + -3, -5, 1, 0, -5, -1, 0, -4, 1, -1, + ], + [ + -26, -49, -55, 0, 5, 50, -10, -3, -16, 36, 0, -28, -26, -4, 1, -46, 31, -22, 3, -27, + -9, 39, -46, 8, -10, -10, -35, 27, 46, 27, -9, -5, 31, 40, 21, -39, -36, -11, -6, 14, + -38, 9, -37, -7, -9, 40, 10, -29, 5, 10, -25, 20, 1, -39, -14, 30, -12, 17, -13, -15, + 81, -14, -60, 27, -1, -35, -7, -29, 27, 6, -8, -11, 2, -8, -2, -5, -42, -25, 24, -13, + 13, -9, -5, -42, -18, 14, 39, -28, -23, 21, 20, -6, -55, 40, -31, -1, 10, 62, 18, -13, + 21, 58, 7, -17, -38, 1, -41, 32, -9, -33, -15, -35, 66, 5, -52, 13, 2, -29, 27, 5, -7, + 52, 0, -14, 43, 46, 19, 49, -1, 17, -14, -31, 10, -25, -15, 32, 4, -29, -34, 6, -8, + -37, -42, 3, -41, -46, 0, -43, 8, -20, 2, -21, 3, 45, 5, -11, -1, 4, 22, 11, -9, -27, + -19, 16, 32, -8, -38, 11, 49, 5, 46, -28, -44, -25, -24, 24, -14, 10, -2, 43, -7, -5, + 26, -6, 0, -36, 18, 23, 0, 3, 42, 26, 35, -16, -1, -16, -12, -33, -56, 12, 16, 62, -13, + 46, 8, -15, 15, 12, 28, 61, 45, -12, 17, -5, 9, -5, -2, 2, 69, -20, 39, -5, -29, 11, + -40, -44, 20, -12, -26, -55, -29, 30, 11, 5, 43, 20, -12, -36, 2, -22, -28, -32, -3, + 10, 16, -34, -57, -27, -22, -38, 25, -30, -12, -50, 1, -21, 39, -13, -10, 22, 13, 1, 6, + -6, -5, 23, 19, -12, -41, 17, 35, 34, -1, -1, 30, -2, 14, 17, -2, -3, -40, 5, -13, -9, + -12, -8, -47, -15, 0, 3, -7, 37, -7, 5, 8, -30, 8, 21, 16, 14, -3, -14, -3, 45, -27, 2, + -13, 9, -12, 45, 10, 19, -36, 6, 38, 32, -3, -58, -17, -2, 16, -7, 40, 4, 17, 16, 1, + -2, 17, -45, 35, 18, -15, -10, -10, 13, 7, 0, 3, 16, 27, -18, 1, 16, 13, -16, 3, -11, + 24, -10, 68, 12, -32, 4, 10, 36, 5, 35, -5, -1, -18, -22, 14, 6, 13, -8, 33, 18, -24, + -61, -30, 42, 36, -3, -37, 49, -53, 38, 60, -13, 12, 8, -14, 35, 11, -45, 19, -46, -16, + -28, -1, -26, -60, -32, -21, 52, -73, -18, 31, -10, -2, 22, -20, 38, -14, 3, 19, 30, + 21, -7, -39, -21, 23, -14, -16, 16, -6, 12, -2, 30, 31, -29, -33, 30, 13, 19, -12, 30, + -3, 58, 24, -30, 3, -35, 39, -6, -2, -34, 34, 27, 6, 93, 4, -15, -15, -7, 15, -1, 2, + -16, 30, -2, -42, -22, 14, -8, -9, 18, -14, 40, -16, -42, -14, -11, -36, -25, 1, -9, + -46, 4, -6, -29, -36, 8, 23, -14, -72, -34, -10, 5, -17, 6, 16, -2, 24, -34, 7, 16, + -18, 13, -1, 14, -14, -1, 4, -40, -40, -4, -35, -22, -6, -18, 11, 6, -44, 20, -48, 27, + 34, 26, -37, -67, + ], + [ + 23, 62, 37, 50, 0, -28, -5, -15, 16, -34, 19, -42, -43, 8, -14, -29, 60, 58, 4, -10, + -33, -9, -15, 26, 2, -2, -43, 20, -18, -9, -6, 21, -14, -10, 28, -33, -12, 38, 10, -75, + 5, -10, -4, 19, -35, 30, 48, -42, -20, -38, 3, -3, -19, -4, -29, -41, 12, -18, -22, -4, + -12, 5, 32, -8, 35, -26, 21, -47, 12, 1, -28, 28, -63, -63, 27, 20, -8, 53, 17, -5, + -19, 5, -25, 8, -4, -6, 2, -36, 37, 14, -50, 29, 25, 0, -2, 34, -26, 4, 35, -27, -31, + 13, -29, 3, -24, -36, 28, -20, 38, 30, -35, -10, -25, -19, -35, -17, 11, 2, 24, -64, + 15, 45, -20, -15, -3, 53, -30, 48, -21, -6, -9, -14, 10, -29, -7, 26, -6, -18, 66, 2, + 4, -37, -62, -22, -15, 24, 3, 20, -15, -4, 45, -19, -7, 38, -12, -12, -19, 0, 16, -32, + -6, -56, -14, 8, -16, 28, 2, 38, -29, 5, 2, -6, 7, 1, -31, 7, 14, -1, 5, 45, -15, 17, + 1, -18, 5, 3, -14, -46, 45, -6, 53, -31, 3, 15, -28, 65, 19, 7, -15, 35, 24, 21, 2, 19, + -3, 2, 7, -23, 17, 51, 45, -58, 27, 35, -11, -3, -57, -6, -10, 24, 25, -8, 4, -19, -16, + 32, 6, 40, 3, -27, 33, -6, -5, 4, 31, 1, -33, 1, 10, 6, 30, -5, 23, -36, 35, 19, 5, 5, + 0, 1, -5, -3, -2, -16, 42, -30, -4, -8, 27, 10, -24, -23, -37, -19, 58, -43, -59, 2, + -19, -12, -12, -50, -20, 1, -19, -32, -12, -4, -62, -9, -6, 27, -5, 3, 5, -19, 40, -2, + 6, -24, 15, -42, -13, 33, 5, -29, 12, 60, -34, 24, -58, 21, 1, -14, -9, -16, -28, -18, + 24, -34, -11, 16, 27, -21, 48, 4, 18, 18, -2, 31, 8, -14, 32, -20, -33, 2, 4, 1, 43, 4, + 14, -3, 15, 23, 14, -40, -16, 3, -21, 30, 5, -28, 12, -23, -21, -21, 9, 10, 28, 10, + -68, 49, -10, 16, -26, 19, -1, -3, -29, 2, 17, 23, 16, -44, -31, -23, 23, -17, 5, -9, + -28, 33, -9, -19, 17, 2, 12, -8, 6, -10, 32, 6, -16, -4, 45, -4, 18, -48, -22, -15, 9, + 32, -36, 23, -11, 33, -1, -7, -38, -6, 11, -15, 22, 59, 14, -41, -34, -4, 5, 13, 53, + -21, 43, 36, 17, 14, -5, 53, -11, 2, -33, 33, -27, 15, -29, -13, 17, 12, 18, 2, 26, + -14, 8, -23, -4, 15, 8, -15, 10, -23, 30, 11, -6, -23, -6, 22, 7, -12, 21, -9, -24, -7, + 28, 39, -18, 13, 2, -32, 19, -10, 36, -13, 32, 4, -37, -36, -4, -53, 9, -25, -1, 6, 49, + -31, -72, -34, -36, 38, 27, -16, -24, -41, -4, -31, 6, 1, -32, 48, 4, -40, -31, 8, 32, + 16, -42, 9, -26, -10, -32, -25, -6, -7, 2, 29, 12, -35, -36, -34, -17, 8, 24, -45, + ], + ], + [ + [ + 5, 0, 1, -6, -1, -1, -3, -4, 2, -2, 2, -3, -4, -6, 2, 2, -1, -1, -3, -5, 3, -3, 5, 2, + 1, 0, -10, 2, 1, -2, -1, 6, 0, -4, 5, -2, 0, 8, 1, -4, -1, 4, 5, 3, -9, 5, -3, 8, 6, + -3, -5, 2, 5, -6, -4, 2, 0, 0, -1, -6, 2, -5, 3, -1, 2, -2, 6, -2, -6, 1, 3, 1, 4, 4, + 0, 5, 4, 1, 8, -1, -7, -6, -4, 1, 2, 8, -2, -7, 2, -1, -6, 0, 0, -1, -3, 7, 1, -3, -3, + 9, 0, -6, -6, 2, -5, 2, -2, -5, 8, 6, -4, 2, -1, -4, 0, -3, -4, 3, 8, -3, 1, -1, -5, 0, + 2, -1, -3, 0, -2, 1, 6, 1, 3, 3, -2, -9, 1, 1, -5, 0, 1, 5, -6, -1, 0, -6, -2, -3, -3, + 1, -11, 7, 0, 3, 1, -3, -6, -5, 2, 5, 0, -1, 3, -5, -5, 2, 1, 3, -2, 0, -1, 0, -2, 2, + 5, -5, 7, -2, 2, -3, -2, -2, 0, -9, 2, 1, -1, 1, 3, 1, 1, -3, 2, -6, -2, -1, 4, 2, -5, + 2, 6, 2, -4, 0, 1, -1, 0, -5, 0, -6, 0, -3, 0, -1, 5, 8, 4, 1, 2, 3, 3, 8, 2, -8, 2, 0, + 1, 4, 3, 2, -2, -7, 3, -3, 4, -2, 4, -4, 4, -4, -2, 1, 2, -2, -10, 1, -1, -8, -2, -2, + -2, -2, -3, 0, 1, -5, 3, 7, -2, -9, 1, -2, 1, -4, -2, 3, -4, 2, 0, 3, 0, -4, 2, -1, -6, + -4, 3, 8, 10, 0, -3, -8, 3, 1, -2, -4, 1, -5, 0, 10, 3, -3, -3, -9, -2, 1, 2, 1, -5, 2, + -9, -8, -5, 4, -1, -1, -1, 2, 0, 0, -6, -3, 1, -1, 11, -3, -7, 0, -2, 4, 8, 0, -5, 3, + -3, 0, 4, 2, 2, 2, -4, -1, -3, -2, 2, 4, -8, 8, 4, -2, 1, 0, 3, 7, 6, -2, -2, -1, -1, + -5, 7, 2, 3, -1, -1, -1, -7, 1, -2, 6, 5, -4, 0, -4, 3, 6, 0, -2, 1, -6, 5, -3, 3, 4, + 1, 3, 1, -7, 5, -3, 2, -7, 0, 1, -4, -1, -2, -2, -10, 5, -2, 1, 8, -1, -2, -2, 6, 8, 4, + 4, 9, 3, 0, 2, 4, -2, -7, 7, -1, 4, -2, 2, 1, -2, -2, 1, -2, -9, 3, -4, 6, -2, -1, 1, + 0, 1, -10, -2, 4, -2, 1, 2, -4, -2, 2, 4, 4, 7, -2, -4, 3, 2, 0, 2, -4, 1, 2, 5, 0, 2, + 3, -12, 2, -4, -1, 4, 0, 8, -1, -3, 5, -11, -4, 2, 3, 3, 1, -8, -3, 0, 0, -1, -2, 3, 6, + -7, 3, -1, -4, -4, -9, 5, -4, 7, 5, -1, 3, -4, 2, -5, -1, 1, 2, 2, -5, -1, -4, -3, 4, + -2, 1, 2, -2, -3, -6, -2, 2, 2, 1, -1, 5, -1, + ], + [ + 1, 3, -2, -1, 5, 4, 3, -3, -5, -4, -1, -3, -2, -2, -1, -4, 2, 4, -8, 2, 4, 5, -7, 3, + -1, -1, -1, 8, 0, -6, 1, -3, 2, -8, -1, -2, -1, 2, -1, 4, 5, 1, -3, 4, 8, -4, 2, 5, 1, + -4, -9, -3, -4, 1, -4, 1, 0, -1, -6, 0, -4, 5, -4, 2, -7, 2, 2, 0, 5, -2, -2, -1, -3, + -5, 6, -1, 4, -3, -3, -2, -1, -9, 4, 2, 2, 8, 4, -3, 3, 0, 4, 3, 0, -3, -1, -6, -7, -9, + 3, 1, -1, 0, 0, 0, -4, -2, 10, -3, -6, -4, -4, -7, 0, 0, -5, 7, -4, 6, 2, -9, 0, 4, 3, + -4, 1, 1, 5, 3, 6, 0, -5, -7, -3, -4, -1, 6, -4, 0, -3, 2, -8, 1, 1, 0, 3, 5, 1, -1, 2, + 0, 1, -5, 0, -3, 3, 3, 4, -2, -5, -2, 1, -1, -9, -6, 10, 0, 0, 4, -2, 6, 2, 4, 0, 1, 0, + -5, -4, -4, 0, 2, 4, 2, -2, -6, 3, -3, -1, 1, 3, -7, -1, -1, -2, 1, -2, 8, -2, 2, 0, 1, + 4, 7, 0, 2, 0, 4, 3, 1, -4, -8, 0, 12, 2, 13, 4, -3, -2, 5, -6, 0, -5, 10, 1, -4, -3, + 0, -3, 0, 0, 4, -3, 3, 2, -1, 3, -3, -3, 3, 3, 0, 0, -5, 2, -2, 3, 2, 3, -3, 11, 2, 0, + 5, 1, 0, -2, 3, 0, 0, -4, -6, 6, -4, 11, 4, -2, 0, -2, 0, 6, -7, -3, -8, -8, 1, 0, 5, + 1, 2, -1, -2, 6, -1, 3, 2, 6, -1, 5, -2, 9, 10, -5, -5, -4, 3, 7, 1, 1, 0, 3, 0, 2, 1, + 2, -11, -3, -2, 1, -1, 0, 4, -2, 4, 4, -4, -3, 4, 2, 2, 0, -5, -3, 3, -3, 0, 5, 3, -1, + 1, 0, 2, 4, 5, 1, -2, -2, 0, -1, 1, -2, -5, -5, -1, 2, -4, -2, -2, -6, -6, -5, 0, 4, + -3, 3, 2, -4, 0, 2, -5, 0, -2, -2, 2, -2, 6, -5, -1, 2, 0, -1, -7, -2, 1, -2, 1, 0, 6, + 0, -4, 1, -8, 2, 2, -6, -3, -3, -6, 4, 1, -5, 3, -2, -3, 0, -1, 0, -1, 1, -1, 0, -4, + -3, 4, 1, -2, 3, -1, 4, 2, -4, 9, -2, 1, 2, -3, -2, 3, 4, 5, -3, -7, 5, 0, -2, 12, 4, + 4, -8, 4, 8, 3, -6, -3, 0, -6, 0, -3, 1, 2, 2, -6, -1, 5, -1, -1, 3, -1, 3, 1, 1, -4, + -4, 3, 0, -8, 6, 7, -3, 2, 2, -1, -2, -2, 7, -1, 4, -3, -1, -5, 4, -2, -7, -5, -4, 2, + -2, -3, -3, 6, 9, 5, 2, -3, -6, -2, 2, -1, -6, 1, -2, -1, -1, -4, 7, 0, -1, -3, -7, -4, + -3, 5, -4, -5, 3, 7, -2, 7, 5, 2, 5, -7, -2, 0, + ], + [ + -15, 27, 0, 18, -32, 60, -11, -31, -20, -22, -2, -26, -50, 15, -15, 0, 23, -46, 15, + -12, 53, 15, 9, 0, -40, 15, -7, 25, -12, -60, 28, -23, -28, 18, 31, 16, -20, -37, -6, + 30, 33, -17, -32, 29, 14, 34, 43, -24, -4, -15, 5, 35, -14, -30, 13, 30, 39, 9, 2, -49, + -9, 28, -19, 31, 6, 26, 30, -17, 28, -7, -8, 14, -56, -1, -24, 19, 48, -23, -2, 35, + -26, 31, 29, -5, 50, 8, -11, 0, 21, -21, -6, 34, 16, 27, -37, -68, 38, 0, -5, 0, 52, + 59, -27, -3, -10, -13, 9, -20, 77, -17, 0, 17, 17, -22, -3, -11, -9, 15, -21, 9, -3, + -33, 38, -1, -11, 9, 16, 9, -23, -5, -25, -4, -10, -19, 4, -55, -11, 15, 21, -21, -25, + 16, 0, 14, -4, -23, 38, -18, 4, 45, -58, -32, 11, 25, 33, -26, 5, -27, -24, 6, 34, -3, + 27, -18, 5, -23, 3, -6, -22, -36, 7, 28, -42, 49, 18, -3, 25, -36, -44, 1, -10, 29, 19, + 17, -9, 2, -7, -5, 4, 42, -73, 9, 12, -25, 31, -16, -39, -36, 12, -2, 45, -6, 0, 36, 6, + -40, 9, 9, -21, -51, 6, -6, -46, -25, 4, -6, -7, 16, -6, -17, -28, 42, -8, -29, 46, 21, + -28, 5, -33, 59, 0, -43, -8, -28, 8, 8, 3, 58, 2, 14, -27, 6, -19, 13, 40, -21, -18, + -2, 2, 27, -6, -24, 32, -34, -1, 7, 23, 9, -29, 2, -4, -7, 4, 11, -5, -18, -16, 12, 14, + -4, 54, -26, -40, -43, 2, -22, 21, -1, -22, -1, -10, 14, 38, 2, -20, 13, -38, -9, 23, + 21, -3, 7, -2, -11, 26, 17, -2, 3, 14, 11, 47, -20, 36, 17, 0, 45, 16, -38, 12, -12, + -7, 39, 11, 7, 2, -22, 31, 67, -4, -7, -19, -15, -15, -21, 3, -2, 33, -38, -3, 8, -22, + 14, -28, -18, -15, -24, -46, 7, 6, 2, 9, 28, -2, 3, 25, 39, 22, -32, 3, -5, 70, -28, + -19, 36, 2, -65, 20, -10, 10, -28, 23, 7, 23, 4, 25, 52, -22, 40, 10, -10, -2, -8, -2, + 27, -41, 15, 31, 23, -31, -15, -37, -39, -9, 40, -23, 33, 11, 14, -11, -7, -36, 26, + -30, -37, 20, 26, -8, 31, 24, -44, -16, -6, 20, -4, -20, 27, 69, -4, -33, -21, -5, -14, + 15, -32, -1, -7, -43, -63, -3, 0, -13, 59, -40, 29, 0, 25, -4, -16, -15, 20, -24, 26, + -41, 35, -6, -40, -5, 7, 31, 7, -28, -30, 2, -36, -48, -12, -26, 47, 29, 11, -11, -17, + -20, 0, -26, 5, 35, -6, -16, 0, 18, -14, -3, 3, -52, -18, 18, -7, 61, -29, -50, 40, + -27, -2, -45, 41, -12, -26, 41, 5, -25, -31, -28, 30, -5, 7, 45, 25, -44, 46, -5, -35, + 4, 34, -13, 7, -8, 27, 18, 19, -5, 14, -21, -17, -11, -17, -26, -22, 20, -25, -2, 28, + ], + [ + 12, 1, -9, -42, -2, -77, 18, 4, 27, -16, -57, 11, 49, 23, 10, -9, -44, 3, -4, 13, -58, + -56, -20, -29, -30, 33, 35, -23, -27, -30, 6, 21, 32, -7, -6, 6, -47, -16, -1, 18, 13, + -10, -23, -22, -22, 2, 17, 2, 10, -53, 15, 4, -4, 28, -39, -38, 28, -8, -25, 13, 4, + -29, 8, -29, 1, -1, 4, 51, 7, 12, -5, -10, -63, 13, 22, -58, -21, 20, 9, -7, -8, 4, 25, + -85, -51, -1, 4, -8, -8, -39, 6, 17, 15, 13, 11, -22, -6, 40, -11, -17, 9, -12, -36, + -3, -18, 9, -21, -19, 35, 14, -23, 0, 31, 34, -1, -3, -11, 22, -5, -1, 0, -23, -58, -1, + 31, 21, -10, 41, 32, 39, 10, 9, 10, -48, -44, 20, -4, -51, 6, 1, 18, 15, 5, 9, 8, -21, + 40, 36, -5, 12, -49, 18, 0, 18, 49, 29, 49, -16, -20, 15, 19, -10, -7, -11, -11, 30, + 20, -21, 34, 35, 52, 10, 14, 18, 29, -39, -11, 12, -13, -4, 6, 7, -10, -17, -3, 29, 5, + -25, -29, 15, 31, 25, 33, 23, -11, 30, 4, -32, 42, -33, -26, -15, -42, 48, 4, -12, 37, + -9, 13, -5, 25, -19, 10, 4, 14, 26, 12, -6, -20, -44, -7, 19, -2, -50, 4, -3, 24, -4, + -24, 16, 4, -6, -22, -15, 61, 46, 0, -26, -35, -17, 16, 6, 24, -13, -28, -41, -31, 23, + 5, -9, 19, 2, 10, 49, 34, 6, -10, 32, -30, 3, -39, 3, 41, 6, -48, 11, 8, 13, 18, -16, + -2, 6, -1, -17, -14, -17, 55, 35, -4, 8, -18, 10, -3, 13, -22, 43, 3, -28, -18, 42, + -12, 4, -11, 18, -44, -9, -16, 36, 16, -1, -21, -7, -18, 14, -23, -22, -1, -8, 50, -2, + 16, -4, -4, 34, -26, -36, -6, -36, 32, -23, 13, 30, -16, -13, 18, 6, -4, 17, -6, -25, + -28, 3, 13, 38, 3, -56, -41, 26, 21, 47, -21, 21, 9, -14, -15, 18, 4, -11, -16, -24, + -8, 6, -26, -22, 36, 16, -10, 12, -25, -15, 26, -23, -2, 6, -15, 34, 7, -74, 3, 2, -8, + 33, 24, -4, 28, -18, -34, 44, -5, -43, 10, 4, -8, -15, -1, -26, 52, -24, 35, 63, 0, + -58, 25, -4, -12, -14, -9, -14, -67, 5, 10, 41, -22, 6, 15, 24, 3, 15, -15, 37, 10, 27, + 4, -54, 6, 3, -21, -17, -13, -34, 33, -53, 12, 16, 15, -12, 12, -6, 18, -22, 0, 0, -11, + -6, 17, -36, 4, 15, 4, 30, -32, -33, -40, -35, -41, 18, 21, 9, -17, 24, 14, 30, 6, 38, + 15, -25, -34, 13, -2, -4, -4, -19, -32, -26, -77, -56, 41, 0, 50, -46, 3, -3, 28, 24, + -9, -5, 1, -18, 7, 5, -7, -21, 13, -15, 11, 19, -16, 13, -12, 14, -23, 21, -42, 37, 24, + 25, -17, -35, -13, 51, 17, -1, 30, -6, -8, 16, -12, -14, 8, 8, -7, -39, + ], + ], + [ + [ + 1, -1, 3, -8, 2, 0, -7, 1, -4, -2, -1, -5, -3, 0, 0, -4, -10, 1, -2, 0, 2, 4, -1, -5, + 2, -2, 4, 6, -2, -4, 3, 9, -1, 3, 4, -1, -7, 4, -3, 7, 9, -1, 0, -7, -4, 6, 5, -3, 1, + -9, 2, 1, 4, -1, -3, -5, -9, -6, -4, 6, -9, 0, -4, 3, -4, -1, 4, -2, -2, -4, -5, 3, 6, + 9, 3, 0, -2, 6, -3, 3, 3, -4, -4, 6, -5, -3, 3, -4, -4, 6, -10, -2, -7, 4, 2, 5, -5, 2, + 1, 4, 1, -1, 0, 2, 3, -2, -5, -2, -2, 1, 13, -2, -1, -5, -4, 0, 0, 2, 1, 8, 2, 4, 0, 6, + 2, -4, 5, 0, 1, -10, -4, 2, 10, -8, 0, 2, -2, 2, 3, -4, 3, 4, -1, 4, -4, -5, 3, -5, -4, + -8, -4, 3, -6, 3, 2, -2, -3, -1, -4, -3, 1, -1, 1, -5, -2, -5, 1, 3, -7, -6, 6, -6, 5, + -2, 10, 0, -8, -5, 0, 4, -2, 3, 3, 0, -3, -8, -1, 2, -8, -5, 2, 2, -1, 1, -1, 5, -1, 0, + 7, 7, -2, -4, -5, 0, 2, 6, 2, -3, 2, 5, -5, 5, 1, 6, -2, 6, -1, 2, -1, 5, -3, -2, -7, + 0, -4, -1, -3, 0, -4, 4, 0, 2, -2, -1, 1, -7, 2, 1, 1, 0, -6, 2, 0, -3, -7, -1, -3, 4, + -1, 1, 0, -5, 8, -4, -2, -3, -2, 1, 2, -4, 0, 1, 8, -3, -5, 2, 3, 1, 3, -5, 6, 1, 3, + -2, -4, 5, -1, 4, 0, -8, -9, -2, 2, -6, 0, -3, -5, -1, -6, 0, -1, 0, -5, -8, 3, 8, -8, + -1, -5, 3, -2, 1, 7, 2, -1, -3, 1, 1, -7, 1, -8, -1, 5, -1, -3, -3, 2, 6, 3, -2, 1, 0, + 0, 3, 5, -1, 8, 1, 3, -1, 0, -5, 6, 1, 2, 6, 2, -2, -3, -5, 3, 1, -1, -2, -1, 5, -1, 1, + 3, 6, -1, 4, 1, 2, 3, -6, 4, 4, 0, 5, 4, -5, 1, -1, 7, 3, -4, 5, -1, 1, 4, 4, -2, -1, + -6, 0, 7, 0, 4, -6, -7, -5, -2, 1, 1, -6, 0, 1, -5, 7, -7, 0, 0, -4, -3, 4, 0, -3, -4, + 2, 3, 3, -3, -3, 0, -8, 3, -4, -6, -4, 3, -9, 0, -1, -3, -3, -3, 0, 1, -8, -1, 7, -3, + 1, -3, 5, 5, 0, 0, 0, 6, -2, 7, -10, 2, -8, 0, -6, 0, 5, -1, -3, 6, 4, 1, 0, 1, 0, 3, + 1, -3, -4, 1, 2, -6, -1, 1, -1, -3, 1, -2, -7, 2, 1, 0, 2, 1, -5, 4, 5, -2, 6, -9, -1, + -4, -1, -6, -2, -2, -4, 5, -5, -8, 2, -3, 0, 0, 2, -5, 1, -8, 5, 1, -4, -1, 7, -8, 1, + 5, 6, 3, 6, 4, -1, -1, -7, 3, 5, -1, -1, 8, -1, + ], + [ + 7, -5, 1, -1, -1, -9, -1, -1, 0, 3, 1, 2, 2, -2, 9, -3, 0, -4, -2, 2, -7, 8, 7, -6, 2, + 3, -1, -2, 5, 4, -3, 4, 5, -2, 4, -4, -2, -2, -1, 0, 0, -5, -3, 8, 2, 3, 1, 3, -3, 1, + -3, 1, -6, -7, 2, 0, -4, 1, -3, -3, -4, -3, 1, 0, -3, 0, 2, 5, -3, -1, 1, 7, -8, -7, 4, + -1, 3, -7, -3, -5, -5, 6, 0, -6, -5, 1, -3, 3, 6, -2, -3, 1, -1, 0, -2, 2, 1, -1, 0, 1, + 2, 3, 5, 6, 0, 2, -1, 3, 5, -2, 3, -1, 1, -6, -4, -1, -4, 3, -4, 0, 1, 3, -2, 0, -2, 6, + -1, -2, 2, -3, 3, 2, 0, 1, 2, 4, 1, -3, -5, -1, -3, 2, -4, 1, 3, -1, 4, 2, -6, -2, -3, + -3, -3, 0, -4, 2, -6, 4, -2, 8, 1, -1, -1, 1, -3, 0, -4, -12, -8, 2, 3, -6, -7, -1, 3, + 6, 0, -9, -4, -1, -1, 1, -1, 7, -1, 3, 2, -8, 5, -6, -8, 1, -1, 1, 3, 6, 3, 5, -4, -10, + -3, 2, 4, 1, 1, 1, -5, 0, -2, 8, -2, -6, 1, -1, -1, -1, 2, 3, 3, -6, 2, -12, 3, 4, 3, + 0, -1, -6, 5, -2, 3, 0, -3, 4, 3, 0, -6, -4, 3, -1, 6, -9, 3, 1, 5, 1, -4, 1, 4, 1, -1, + -2, -1, -3, 1, 1, -3, -6, -1, 6, 0, -1, 2, -1, 2, -6, 0, 2, 3, 1, 3, -5, 1, 3, 4, 1, 4, + 1, -4, -5, 4, 3, -1, -12, -8, 4, -1, -4, -5, -2, -4, 5, -1, -1, 1, -3, 1, 6, 3, 4, 2, + -4, -3, 8, 1, 3, 2, -2, -7, 1, -4, 3, 2, 1, -1, 0, -1, -2, 0, 0, -3, 4, 3, -2, 3, -1, + 7, 3, -3, -4, 2, 2, -1, -6, -4, 7, -6, -8, -4, -3, -2, 6, -3, 8, 4, 6, 7, 6, -1, 0, -1, + 1, 2, 1, 3, 0, 6, 3, -1, 2, 9, 2, -1, 5, -3, 2, 5, 8, 0, 2, -6, -2, -4, 1, -8, 4, 5, 5, + 9, -2, -6, 0, 2, -2, 0, -2, 4, 4, -13, 2, -1, 1, -3, -1, -4, -2, 2, -2, 9, -4, 3, 3, + -6, -4, -4, -2, 1, 10, 4, -1, -7, -1, 2, 7, -2, 2, 0, 2, 0, -1, -1, -2, 1, -2, 3, 4, + 14, -1, 2, -2, -4, 0, 6, 0, 2, 0, 8, 6, 4, 1, -1, -2, -1, -2, -5, -6, -3, 1, -4, 0, 2, + 4, 2, -2, -7, 4, 4, 2, -1, 1, -9, -6, -3, 4, 2, -4, 2, 0, 1, 1, 0, 0, 0, 2, -5, 4, 9, + 5, -4, -1, -2, -1, 10, -1, 3, -3, 2, 7, 7, 4, 3, 1, 0, -2, 0, 2, 2, -6, -2, -1, -1, -4, + -4, 0, -3, -2, 3, 0, 0, 5, 5, 6, + ], + [ + 4, -45, 38, 41, -3, -57, 26, -7, 70, -36, -17, -41, 18, -19, 11, 13, 28, 12, -41, 16, + 16, -4, 42, 12, 25, 6, 16, -17, 11, -13, 38, -44, 24, 42, 0, 48, 30, 9, -6, -21, 33, + -5, -27, 57, -42, -19, 43, 15, -30, 6, 10, 5, -87, 27, 37, -9, 10, 22, -5, -18, 2, 37, + 13, 21, -10, 20, -4, 15, 52, -15, -15, -40, 3, -21, 94, 10, -37, 18, -18, -4, -24, 19, + 32, 27, -33, 0, -18, 38, 8, 51, -44, -36, 6, -2, -10, 28, -4, 18, 13, -34, 61, 20, 2, + 8, 11, 36, 3, 53, -45, 51, -43, -1, -27, 22, -9, -12, -20, -6, 13, -31, -30, 46, 1, 52, + 2, -9, 6, -38, -6, -22, 27, -62, 10, -28, 4, -21, 13, 14, -9, -15, -63, 4, 14, 5, 32, + -11, 46, 15, -20, -21, -1, -56, 25, -29, 45, -24, 14, -13, -33, -22, 39, -49, 14, 14, + 23, 20, -40, -22, -25, 9, 21, -10, -3, 2, -17, -31, 25, 24, -36, -36, 15, 31, -6, -37, + -12, 38, -14, -13, -2, 22, -2, -5, -34, 6, 31, -7, 25, 32, -13, -29, 1, 27, -54, -12, + -21, -38, 3, -21, 29, -49, -81, -9, 7, 20, -2, -11, 1, 31, 15, 9, -36, -5, -45, -22, + 44, -87, -21, 20, 19, -10, -13, -4, 37, 7, -28, 49, 23, -6, -34, 20, 29, -5, 19, -16, + 30, 56, 4, 63, 1, 34, -13, 29, 32, 2, 44, -8, 17, -10, -35, 10, 2, 2, -36, -16, 12, 30, + 41, -62, 18, 0, 0, 0, 40, -21, 13, -2, -36, 1, -36, -48, 5, -21, -28, 22, -14, -12, 20, + 31, 19, -4, -15, -16, -5, -6, 54, -28, 1, -60, -32, 59, -4, -11, -44, -62, 26, 3, 12, + -22, -26, -25, -30, -3, -16, -8, -30, 39, 6, -5, 33, -21, -13, -18, -24, 38, 38, 0, 41, + -9, -6, -55, 9, 25, 3, -67, 3, -18, -33, 20, -28, -10, -15, -16, 30, 20, -16, -23, -26, + -11, -12, 13, -11, 13, 48, -18, -13, -12, -8, -17, -7, 23, -70, -4, -33, 9, -37, -22, + 2, -26, -23, 2, -40, -2, -17, 38, -12, 5, 4, -2, -24, 25, -9, 6, -7, 26, -37, 29, 68, + 2, 22, 23, 23, -15, 5, 5, 10, 82, -24, 50, 30, 5, -1, 29, -13, -15, 25, -25, 41, -31, + 2, -4, 42, 11, 28, -6, 27, 10, -11, -2, 23, -5, 25, 14, 50, 0, 2, 19, 1, -44, 6, 53, + 49, -24, -8, -45, -7, -50, -22, -21, 38, -57, -59, -40, 19, 0, -30, 43, 20, -7, -9, 1, + -4, -27, -3, -4, 28, -3, -85, 18, 4, 33, -73, 14, -15, 13, -9, 17, 74, 46, 36, -25, + -18, -2, 42, -4, -12, -21, -3, -16, 53, 7, -6, 21, -18, 57, 57, 50, -3, 51, -3, 38, 24, + 28, 30, 38, -43, 11, 29, 5, 22, -8, 42, 5, 12, 3, -6, 21, -45, 15, -56, 30, 11, -34, + ], + [ + -67, -18, 20, -20, -29, 0, -47, -7, -23, -2, 14, 19, -15, 21, 21, -28, -3, -25, -6, + -12, -28, 34, 29, 53, -11, 12, 18, 14, -19, 10, -9, 23, -22, -12, -20, -25, 6, -27, + -21, -35, -11, -27, -37, 40, 36, 25, 23, -13, -44, -26, 17, 6, 20, -13, -46, 21, -29, + 11, -5, -8, -41, -39, 33, -37, 28, 19, -54, -29, 15, 8, 4, 4, 15, 29, 7, -5, 25, -10, + -15, 20, 9, -7, -5, 23, 2, -20, -19, -32, 13, -14, 19, 22, -11, 63, 28, -34, -17, 43, + 47, 18, 40, -8, -4, -7, 51, 19, -11, 14, -33, 6, -29, -23, -6, -32, -17, 16, 0, -15, + 33, -46, -14, -24, 28, -15, 22, 5, -31, -6, 8, 7, -10, 12, 12, 23, -22, -33, -26, -9, + -46, 18, -20, -53, -16, -6, 31, 38, 34, 8, 52, -1, -46, 31, -22, 6, 7, 13, 0, 29, 11, + -12, 11, -7, 55, 36, 17, 7, -28, 15, 49, -15, -28, 8, 73, 27, 35, -24, -43, 3, -8, 8, + -29, 25, 63, 20, 31, 42, -20, 18, -27, -13, -24, -14, -8, 15, 19, -4, 42, 22, 8, -2, + -6, -54, -16, 7, -25, -31, -27, 26, 2, -13, -15, 48, -19, -29, 26, -15, 17, -3, -4, + -29, 9, 3, 23, -63, -19, -6, -20, 14, 61, 41, -9, -3, 43, 35, -22, 6, -17, 18, 33, -11, + -2, -27, 21, 10, 42, -31, 29, -14, 16, -13, -21, -10, 2, 5, 40, -41, 20, 5, 56, -19, 4, + -1, -9, 24, -14, -9, 14, 6, -1, -2, 18, -1, 19, -22, -43, 0, 1, 40, 29, -21, 0, -46, + 15, -19, -14, -45, -1, 0, 30, 4, -33, -15, 36, -13, 62, -14, -3, 31, 32, -43, 4, 7, 0, + -4, -5, -3, 35, -18, 21, 65, -21, -19, -25, 22, -20, 5, -30, -12, 9, -37, 23, -2, -34, + 11, 14, -40, 12, -18, -6, -33, 20, -47, -21, -36, -7, 36, 0, 0, -39, 11, -47, 20, -17, + 9, -65, 14, -2, 8, -40, 26, 1, 8, -35, -34, -24, 24, 14, -5, -23, 36, 3, -38, -78, 38, + -44, 14, 17, -16, -2, -3, -16, -15, 22, -6, -13, 6, -16, 31, 4, 15, 32, 31, 33, -21, + 27, -3, 4, 10, -9, 1, 43, -44, -24, 23, -11, 30, 1, -16, -8, 39, 15, 51, -29, -30, -2, + 6, 27, -9, -28, 19, 16, 13, -17, 61, 44, 18, 25, -11, -62, 22, -9, -17, 19, -1, 2, -43, + -13, -35, -21, -28, 31, -5, -20, -5, -12, 29, 20, 28, -3, 11, 49, -17, -45, -55, 7, + -34, -49, 18, 21, 31, 0, 4, 2, -6, 3, 17, 7, -32, 61, 26, -1, 20, -9, -27, 14, -8, 60, + -13, -4, -11, 28, 17, -23, 15, -29, 15, 0, 38, 23, 26, 50, 15, 17, -58, -42, -16, 49, + 41, -16, 19, 17, 24, 26, -39, 30, 5, 48, 11, 5, 25, -27, -23, -4, -18, 17, -13, 12, + -16, 34, 53, 9, -1, + ], + ], + [ + [ + 2, -2, -4, 5, 0, 10, 0, 2, -1, 4, 0, 0, -6, 3, 5, 5, 5, -2, -2, 2, -5, -3, -1, 3, 2, + -2, -1, -6, -2, -4, -4, 3, -2, 1, 2, -5, 3, -1, -4, -1, -3, 1, -3, -3, -1, 2, -2, -5, + -2, 1, -5, 1, 5, 4, 0, 3, 7, -8, -3, -7, 0, 1, 3, 1, -3, 5, 3, 2, 5, 0, -4, 4, 3, 0, + -8, -3, -2, 1, -4, -3, -2, -8, 1, -4, -7, -4, -3, 2, -6, 0, -6, 4, 7, 4, 3, 0, 0, 1, + -5, -3, 0, 5, -2, -4, 3, 1, -1, -5, 6, 11, -8, 2, 3, -2, -1, 0, -4, 0, -1, -6, 1, -5, + 5, -1, 3, 2, 3, 9, -1, 2, 1, 1, 2, 3, 1, 4, 4, 0, -1, 6, -5, -2, 0, -6, 6, 1, 0, -3, + -4, -3, -3, 4, 1, 2, 4, -5, 1, 1, 5, 3, -7, 0, -1, -4, 3, -1, -3, 2, 3, 0, 8, -8, 7, 5, + -4, -5, 5, 0, 3, 1, -7, -5, 0, -6, -1, 0, -5, -3, 5, -3, -1, -3, 3, -2, -2, -12, 1, -4, + 4, 9, 4, -1, -1, -1, 4, 0, -4, -8, -2, 1, -1, 11, 8, -3, -5, -1, 3, 0, -6, 2, -3, -3, + -5, 1, 3, -4, 5, -1, -6, 2, 2, 3, -4, 3, -13, -8, 3, 1, 5, 4, -2, -2, 1, -1, 13, -2, 0, + 1, 3, 2, 6, -4, -2, 9, 10, -5, -7, 10, 2, -1, 4, -2, 4, 4, -2, -3, 3, 2, 3, 0, -2, 0, + -2, 0, 4, -3, 1, 1, 0, 3, -8, -8, -3, 1, -2, -5, 0, 2, 4, -3, -5, 2, -2, -2, -4, -8, 5, + 1, 0, -1, -4, 4, -1, 0, 3, -9, -7, -3, -3, 5, 2, 10, 2, 2, -7, -4, -2, 0, -3, 2, -6, 3, + 4, 4, 2, 1, -2, 5, 0, -5, 2, 2, 4, 5, -7, -1, 12, -3, 0, 1, -2, -3, -4, -4, -4, -3, 1, + 0, -4, -1, 3, 6, 5, -3, -1, -7, 3, -5, -2, 12, -1, -4, -4, -1, 9, -1, 0, -6, -1, -2, + -5, 0, -1, -4, -1, 5, 0, 0, 4, 5, 2, -6, 1, -1, -3, -2, 0, 10, -6, 0, 1, -5, -6, 5, -2, + -4, 3, 1, 4, -4, -1, 0, 0, -1, 1, -5, -3, 5, -5, 1, 2, -3, -3, -3, 4, -2, -5, 8, 3, 6, + 0, -2, 5, -2, -2, 1, -1, 5, 0, -1, -2, 0, -1, 0, -2, -3, -7, -3, -5, 0, -2, 7, 2, -6, + -2, 0, -3, -2, 9, 0, -1, 0, 1, 1, -6, -5, -2, -3, -4, 3, 5, 8, -2, -2, 1, -2, -7, -3, + -8, 1, 5, 0, -1, 2, -1, 2, -4, 3, -5, -3, 2, 4, -7, -2, 5, 5, 6, 5, 2, -4, 0, -2, -7, + 0, 1, 0, 4, 1, 0, 4, 0, -2, -2, -1, -6, 3, 0, -9, -2, 5, 7, -1, + ], + [ + -1, 10, -8, 6, 5, 3, 7, -2, 10, 5, 0, 5, 3, -1, -1, -5, 3, -1, 1, 0, -2, 0, -4, -2, 2, + 7, 2, 5, 8, -4, -7, -2, 5, 3, -6, 1, -3, -1, 11, 2, -4, 7, 2, -2, 4, 7, 4, 0, 9, -1, 1, + -6, 4, -4, 0, 7, 10, -2, -3, 1, 4, 1, -1, 2, 0, -7, 0, -3, -5, 6, -3, 3, -3, 4, 3, 0, + -5, 7, 3, -3, -6, 1, -2, 3, -3, -1, -5, 7, -5, -2, 0, -3, -5, -1, -9, 6, 3, -7, 3, -1, + 1, -6, 0, 2, 0, 4, 1, 1, 6, -3, -4, 4, -1, 0, 2, 0, 2, -9, 7, -4, -5, 5, -2, 7, -1, -4, + 1, 0, -10, 3, -1, -4, 0, -6, 5, -1, -3, -2, -2, -6, -6, 6, -1, -2, 5, -4, 2, -6, 6, 2, + 1, -1, 4, 3, -2, -1, -2, -5, -3, 0, -4, -6, 2, -2, 4, -2, 0, -4, 0, 5, -3, 1, -3, -2, + 1, -4, 1, -3, 1, 1, -1, -2, 4, 0, -6, -7, 4, -5, 2, 5, -3, -4, -2, 2, 3, -2, -2, -8, + -2, -4, -7, -2, 6, -3, 4, 0, -3, -8, 5, 0, -2, -2, 4, 0, 2, 6, 4, -1, -7, 2, -1, 5, 2, + -1, 6, -2, -1, -1, 7, 4, -2, 5, 3, 2, 3, 4, 0, 1, 3, 1, -7, 1, 6, 2, 4, -3, 0, -5, -1, + -4, 6, 0, -1, 4, -6, 0, -8, -3, 6, 0, -1, -6, 0, 0, 1, -2, 1, -1, 1, 0, 3, -1, -2, -3, + 3, 3, -2, 1, -3, 2, 4, -2, 0, -2, 3, -4, 2, -3, 4, -4, 3, -8, 2, 0, -4, 11, 9, 4, 6, + -1, 4, 2, 5, 3, 7, -4, 4, 4, -3, 5, 2, 5, -7, -5, 3, 3, 3, -2, -2, 0, 4, -4, -5, -5, 2, + 2, 2, 5, 4, -7, 6, -10, -4, 6, -3, 3, -7, -1, 5, 3, -3, 0, -3, 5, -2, 3, 4, -3, -10, 1, + -5, -8, 2, -1, 1, -10, 6, 1, -1, 7, 4, 0, -5, 0, -4, -1, -1, 1, 3, -6, -3, -5, 1, 3, 2, + 3, -11, -5, -1, -2, -5, 6, 4, 1, -2, 0, 3, -1, 5, 3, -2, 1, 1, 0, 4, 7, -5, -6, 5, 1, + 6, -2, 2, 0, 3, 5, -1, 2, -7, -5, -3, 2, -1, 4, 2, 2, 0, -7, 3, -1, -5, -2, 0, 0, 1, 2, + -5, 2, -3, 2, -4, -3, -8, -5, 4, 1, 0, -5, -8, 5, -1, -4, 0, -2, 1, -2, 2, -1, -1, -4, + 4, -3, 5, 2, -2, 0, 0, -4, -4, 6, -2, 5, -2, 8, -2, -3, 5, 2, 5, 0, -9, 1, 1, -4, 1, 3, + -4, 0, 5, -4, -4, 7, 2, 3, -3, 0, -4, -1, 4, -5, -7, -1, 8, 3, -2, -5, 2, 4, 1, 2, 1, + 1, 6, -6, -1, -8, -2, -5, -2, 0, -2, -1, + ], + [ + -43, -39, -37, -14, 14, 27, 39, 22, 25, 10, -36, 27, 49, -24, 2, -7, -22, 52, 42, 22, + -14, 12, -24, -35, -29, -21, 2, 62, -52, -3, -41, -13, 28, -27, -60, -15, -15, -29, 4, + 6, 6, 16, -40, -12, -15, 0, -24, -15, -7, 10, 57, 1, -28, 35, 23, -43, -38, -13, 11, + 10, 40, 18, 22, -17, -32, 38, -30, -37, -20, -34, -18, 57, 59, 2, 40, -22, -39, -40, + -9, -16, 6, 18, 18, 18, 6, 18, 12, -15, -25, -7, -53, -38, -32, 5, -4, 20, 37, -20, 47, + 4, 7, -3, -9, 58, -17, -6, -22, 7, 10, -18, -32, 66, 23, 9, -8, 28, -5, 25, 28, -25, + -29, 14, -19, 11, -27, 20, 23, 13, -23, -36, 14, 6, -20, 22, -14, -1, -15, -2, 29, 19, + -15, -15, -14, 5, -6, 16, -28, -12, 42, 15, -14, 37, -26, 3, 13, -44, 26, 23, 17, 36, + 71, 23, -19, 14, -33, -22, 44, -52, -28, 10, -6, 69, 45, -30, -30, -15, -60, -57, -44, + -9, 19, 4, -43, 7, 2, 30, 28, 7, -3, -35, 29, -9, 45, 36, -13, 40, -47, -71, 4, -38, 0, + 6, -22, -21, -14, 1, 10, -60, -20, -7, 23, 4, -41, -24, 43, 6, -31, -7, -52, 37, -5, + -30, -21, -13, 15, 24, 34, 12, 2, -11, 7, -17, 8, 36, 26, 8, -51, -8, 30, 25, 11, -52, + -78, -25, -23, 0, 28, 26, 12, 29, 24, 13, -15, 33, -16, -3, -16, -1, -4, 22, 78, 21, + -6, 32, 36, 0, 43, -18, -9, -34, 15, 27, 61, -9, 11, -12, -1, -10, -10, -29, 23, 24, 2, + -38, 35, 20, -9, -26, -10, -11, 50, 21, 40, 19, -1, -37, 32, -29, -1, 57, 36, -25, -51, + -48, -1, -24, -26, -40, 16, -38, 5, 82, -55, -28, -12, -1, 10, 9, 1, 20, 32, -8, -20, + -28, -7, 32, -17, -14, -34, -23, -20, -2, 7, -63, -18, 34, -13, 22, -1, 9, 5, -54, -32, + 3, -4, 3, -8, -14, 5, -6, 5, -35, -27, 10, 4, 4, 12, -7, 39, 30, 13, 23, 11, 22, -55, + -8, 55, -21, 8, 6, 3, 28, 14, -75, 19, -44, -25, -4, -3, -2, -7, 31, 15, 15, -26, -25, + -8, 20, -13, 40, 5, -2, 61, 12, -6, 10, 1, 15, 9, -60, 45, 19, -24, 45, -16, 16, -36, + 11, -4, -17, -12, 12, -38, -14, 18, -8, 22, -6, -50, -19, -9, 24, -16, -1, 4, 34, 5, + -6, 14, 29, -7, 26, -34, 32, 9, 7, 18, -5, 10, 14, -51, -3, 4, 6, -40, 0, 5, -8, 12, + 12, -24, -44, 16, -4, -36, -5, -49, 19, 19, 18, -7, -25, -31, -46, -47, 32, -8, 16, 31, + 9, 8, -7, -8, 9, 34, -11, -50, 4, -13, -1, -14, 63, 44, -21, -43, -26, 5, -25, 44, 27, + -48, -16, 24, 28, 1, -55, 1, -15, -31, -18, 6, 20, 65, 5, 9, -8, -8, -15, 3, -2, -20, + -12, + ], + [ + 64, -9, 13, -38, 18, 34, -37, -16, 27, 3, 0, -58, -44, 64, -5, 16, 7, 4, -12, 13, 20, + 13, -5, 32, 19, -36, -3, 24, -9, 10, -37, 27, -31, -51, 39, 44, 55, 19, 31, -13, -6, + -2, -9, -18, 61, 61, -10, -27, 8, 10, 21, -31, -4, 9, -6, 27, 50, -23, 20, -5, -4, 9, + 22, 61, -19, 18, 33, 37, 14, -33, -16, 38, -33, -44, 49, -34, 39, 16, -35, -29, 20, + -19, -27, 21, -19, 3, 2, 25, -51, 37, -5, 7, -31, -27, -35, 0, 8, -26, -31, 0, -12, 14, + 1, 15, -38, 7, -26, 32, -51, 51, -40, 6, -10, 30, -16, -4, 5, -22, -23, -34, -15, -8, + -25, 9, -3, 40, -44, -20, -16, -12, -18, 41, -28, 13, 48, 13, 4, -35, 17, 4, -11, -9, + 0, 12, 62, 12, -20, 17, -30, 33, 18, -14, 6, -15, 43, 3, -28, 41, -40, -44, -4, -29, + 55, 5, 23, 51, 1, 43, -10, -9, 15, 9, -39, 25, 9, 13, -14, 29, -4, -53, 25, 13, -10, + -15, -33, 2, -11, -2, -39, -4, -20, -33, 1, -6, 2, 7, 19, 14, -3, -37, 17, -6, 30, 17, + -46, 0, -18, 0, -23, -19, 36, 14, -13, 4, -38, 15, 7, 7, -32, 36, -26, -30, 80, -33, 6, + -29, -22, 24, -11, 16, 51, 10, -5, 41, -22, -2, -29, 90, -5, -40, 59, 21, 26, 18, -16, + -4, -50, 15, 20, -32, -13, 2, -19, 21, -29, -8, 31, -20, -23, -21, 8, 26, -1, -18, 19, + -71, 40, 5, -8, 47, -29, 36, -5, 17, -12, 11, 34, 24, -40, -73, -10, -20, 26, -21, -18, + -11, 30, 42, -8, -23, 4, -27, -15, -40, 31, 12, 2, 20, 21, 20, -2, -14, 43, -38, 52, + 41, -4, -20, 40, -6, 36, -21, -35, 1, -33, 14, -20, 7, -17, -27, -7, 21, 17, -18, -68, + 13, 31, -5, -8, 6, 37, 67, 4, 32, 23, -31, 4, 37, -8, -24, 10, 37, -27, 29, -1, -29, 0, + 31, 10, -9, 9, 6, -7, -15, -10, -1, -27, -13, 1, -42, -10, 17, 12, 28, -61, 10, 44, 10, + -40, 5, -6, -10, -25, -10, 1, 3, 19, -31, -33, -15, -53, 39, -5, -14, 13, 14, -59, -14, + -7, -48, 8, 57, 15, 22, 2, -14, 1, -11, 38, -4, 4, 47, -31, 19, -11, -15, 11, -12, 40, + 0, -68, 3, 19, 10, 54, 16, 6, -25, -22, 26, -24, 41, -15, -25, -4, 5, -6, 30, -1, -1, + 27, -66, -31, 46, 19, -19, 35, 46, 9, -4, -15, 5, -33, 20, 8, 16, -1, 13, 26, -17, -32, + 28, 14, 22, 0, 42, -2, -1, -11, 8, -6, 16, 3, 9, -37, 25, 19, -32, -62, -2, -41, -16, + -21, 31, 18, 2, 8, -43, 1, 4, -43, 76, -12, -7, 12, -12, 26, 55, 21, -27, 0, 28, 13, + -72, 32, -13, -17, -24, -34, -10, 2, -16, 15, -62, -33, 15, -20, -5, 15, -14, 2, 7, + ], + ], + [ + [ + -1, -6, 2, -7, -3, 3, 0, 1, -3, -4, 0, 5, 7, 6, -2, 2, 2, 4, -2, 0, -1, 2, 0, -7, 4, 6, + 0, 0, 0, 5, 2, -4, -9, -6, 4, -4, 1, 6, -2, 4, 5, 1, 7, -2, -4, 4, -2, 1, 2, -2, 5, -4, + 7, -3, -7, -7, 0, 1, 2, -9, 4, -7, -3, 4, 0, -3, -3, 4, 3, 4, -3, -4, 2, -3, 0, -1, 0, + -2, 2, -6, 0, 2, 1, -1, 2, -4, 1, 0, 6, 4, 1, -7, 1, -1, 2, 6, -7, -3, 0, 2, 2, -6, 1, + -1, 0, 6, -2, -6, -2, 3, 5, -2, -8, 1, 1, -5, 7, -2, -4, -7, 5, 2, -5, -1, 1, 1, -1, 2, + -2, 0, -3, -4, -2, 1, 5, -7, -3, 5, 7, 0, 0, -4, 2, -4, -11, -2, 6, 2, -1, -1, 4, 4, 3, + 1, 6, 2, 4, 2, 1, 2, -2, -1, 2, 7, -4, -4, -1, -3, -7, -2, 1, 6, -1, 3, 2, 0, 4, 5, -6, + 3, -1, -1, -4, 2, 6, 3, 2, 1, -1, 1, -3, -2, -5, -3, 1, -6, 4, 2, -6, 2, 5, 4, -5, 0, + 9, 1, 0, 1, -3, 3, 1, 0, 1, -3, 0, -3, 5, 0, -3, 1, 3, 3, 3, -1, -5, 1, -7, -6, 5, 5, + -2, 2, 3, -5, 0, -7, 2, -3, 4, -6, 5, -4, -3, -3, -3, 2, -1, 2, -3, 0, -5, -6, 1, 1, + -2, 0, 3, 4, 1, -3, -1, 0, 5, -4, 4, 5, -6, -2, 2, -4, -2, -6, -4, 5, -2, 1, 4, -5, -4, + -2, -2, -9, -2, 3, 2, -3, 5, 3, 5, -8, 0, 5, 0, -3, -4, -1, 5, 4, 0, -1, -4, -4, 4, 0, + 1, -2, 0, 3, -11, 2, 4, 0, 1, -4, 3, -4, 3, 9, 8, -2, 3, 4, -3, -5, 6, -5, 4, 4, -2, + -4, -3, 2, 3, -4, -6, 3, 0, 3, 1, 3, 0, 4, 1, 3, -9, 3, -1, 1, -1, -2, 5, 1, 2, -2, -7, + 0, 1, -2, 11, 3, 8, 1, -3, 3, -3, -3, 2, 3, 3, -2, 3, -5, 3, 9, -3, 6, -2, 10, 4, 9, + -2, -5, -1, 2, 0, -3, 1, 2, 2, -5, -1, -6, 2, 3, -2, 4, 3, -8, -5, 1, -4, -6, 5, -3, 4, + -2, 3, 0, 3, 5, 4, -8, -3, 5, -2, 0, -9, 0, 7, -6, -2, 2, -1, -2, 3, 2, -6, 1, 1, -4, + 6, 1, -11, -4, -1, -7, -1, 1, -3, 2, 4, 2, -10, 3, 1, -2, -7, 5, -6, 2, 0, -2, -4, -1, + -4, 0, -5, -1, 8, 3, -1, 0, -1, 0, 2, 0, 7, -2, 8, -5, 1, -1, 7, 1, -6, -1, 5, 2, -1, + 3, 9, -11, -2, -4, 1, 0, -1, 0, -2, 2, -5, -8, -3, 6, 11, 2, 1, 2, 6, 0, -2, -3, -1, 6, + 1, 3, 5, 0, 1, -2, 4, -3, + ], + [ + -1, 1, -6, 3, 0, 0, 2, 3, -5, 0, 2, 1, 2, 0, 2, 6, -3, -2, 1, 0, -1, 3, 2, -2, 2, -4, + -5, -2, 3, 2, 2, 6, -1, 4, 2, -4, 6, -4, 2, -1, -7, 1, -5, -2, -4, 2, 0, 0, 2, 5, -1, + -1, -2, -6, 5, -3, -7, -3, 3, 2, -4, 5, -2, -5, -8, 4, 4, -1, 5, 1, 8, 1, 4, -9, 1, 1, + 5, -1, -1, -2, -4, 3, 2, 1, 4, 3, -3, 0, 1, -2, 2, 1, 8, 2, 8, -4, -1, -4, -7, 3, 4, 1, + -6, 3, -1, 4, 7, 3, 10, 4, -9, 3, 3, 0, 6, -1, 6, 0, 0, 1, 0, -5, 4, 2, 2, 3, 4, -1, 0, + 3, -4, 0, 4, 2, -2, 1, 0, 0, -1, -2, 1, -9, -3, 3, 2, 6, -1, -5, -3, 0, 7, -4, -1, 1, + -4, 1, 1, 0, -1, 0, 0, -4, 4, -9, -5, 1, 2, -1, -1, 5, -2, 2, 0, -6, 1, -9, -1, -1, 3, + -7, 2, -3, -1, 1, 5, -5, 3, -1, 2, 6, 4, -2, 3, 2, 4, 0, 0, 4, -5, -5, 1, 1, 2, -6, 7, + 5, 3, 2, -6, -5, 5, 9, 1, 2, 6, 2, -5, 3, -1, -3, -6, -4, -3, -5, 0, 3, -2, 1, -1, 2, + -3, 6, -2, -2, 0, -2, 3, -7, 1, 3, -1, 4, -1, 0, -2, 0, 1, 0, -3, -3, 5, 1, -2, -3, 1, + -2, 7, 0, -2, 2, -4, 3, 6, 5, 5, -1, 9, 4, 4, 8, -4, -9, -5, 9, 0, -6, 5, 3, 4, 1, 5, + -1, 1, 2, -7, 0, -2, -6, 4, 0, -3, -4, 1, -6, 2, 1, 0, 0, 5, -3, 5, -2, -4, 3, -4, 3, + 4, 1, 0, -3, -2, -2, 2, 4, -3, -8, 2, 4, 7, 3, 6, -1, 4, -3, -7, 3, -3, 0, 6, -1, 8, + -7, -2, 8, -7, 0, -4, 1, -2, -3, 1, -3, 3, 4, -4, -5, 1, 4, -3, 1, 2, -1, -5, -5, -1, + 0, 3, 3, 1, -3, 0, 1, -3, -6, 5, -3, -6, -6, -7, 8, -2, 0, 4, 1, 0, 1, 3, 2, 0, 2, 4, + 1, -1, 10, 0, 12, -2, 0, -1, -1, 0, 7, -3, -3, -2, 2, -2, 2, 2, -6, -2, -1, 2, 3, 5, + -4, 1, -9, 2, 0, 1, 4, 2, 1, -8, 2, -11, 0, -5, 0, 0, 7, -8, -2, 7, -10, 1, -1, 5, 1, + -1, 4, 1, -1, -5, -7, 2, 0, 3, 3, -2, -1, -9, -1, 3, -2, 6, -3, -3, 6, 8, 3, 3, 2, -7, + 8, 5, -2, -8, -1, 3, -5, -3, -1, 0, 2, 1, 6, 4, -6, -3, 2, -1, -2, -1, 7, -2, 2, 3, -6, + 7, -2, 1, -2, -4, 2, 6, 0, -6, -13, 2, 6, 0, -5, 5, 8, 7, -2, -3, 4, -2, -4, -4, 8, 9, + -3, -4, 1, 5, 4, 4, -3, + ], + [ + -9, 1, -14, -22, 20, 43, 37, 21, -12, -20, 38, 19, 21, -3, 20, 13, 28, -36, 23, -9, 44, + 79, 11, 4, 8, 26, -1, 6, -18, -37, 43, 19, -28, 11, -29, 0, 29, -15, 0, 5, -16, 82, + -11, -6, -13, 4, 25, 32, -27, -2, -25, 21, -6, -33, -3, -2, 15, 32, -32, 22, 21, 10, + 52, 18, -1, 6, -6, 8, 42, -10, -6, -25, 5, -5, 17, 35, -69, -14, -7, -11, -14, 5, 2, 5, + -9, -48, 3, -1, 10, -34, 14, 41, 6, -14, -2, 0, 1, -12, -69, -30, 4, 20, -22, 3, 12, + -25, 7, -74, -2, 39, 11, 20, 20, -33, -42, -13, 0, 11, -16, 6, 5, 13, 26, 9, -15, -70, + -34, 60, -22, -33, -15, 1, 20, -38, -10, -35, -39, 31, 2, -32, -15, -4, 30, -28, -41, + -9, 18, 27, -11, 6, -38, 7, 32, -19, -8, -10, 23, 44, -5, -23, 26, 15, 7, 26, 1, -52, + 10, 43, 40, 1, 11, -37, 46, 3, -12, 0, -21, -7, -13, 4, -17, -7, 71, 7, 2, -1, 32, -16, + -29, -54, 34, -11, -3, -20, -3, 34, 9, -14, -19, 45, 16, 61, 34, 24, 27, 19, 7, -17, + -16, 7, 23, 5, -40, -1, -11, -8, 21, 2, 40, -27, -13, 36, 3, 2, -3, 2, 22, 12, 10, -1, + 16, 61, -13, -66, -28, -33, 2, 4, 58, -2, 16, -49, 6, 21, -25, -38, -6, 27, 19, 20, 20, + 29, 0, -6, -27, -25, -21, -6, 25, -1, -24, 8, -49, 56, 20, -50, 4, -3, 21, -24, -21, + -13, 19, -1, 0, -2, -22, -6, -32, -24, -37, 33, 23, -7, 34, -5, 18, 31, -4, -40, 1, + -54, -10, 52, 3, -18, -18, -19, 11, 30, -30, -47, -5, 27, -5, -12, 17, 28, -1, 22, -11, + 25, -23, 9, -6, -19, -45, 8, -10, 1, -23, 8, 24, -47, 16, -16, 32, 8, -10, 8, -6, -17, + 25, -19, 17, 40, 3, -28, 70, 5, -8, -35, -2, 16, 45, 0, -50, 18, 50, -48, 31, -7, 4, + -35, -18, 2, -22, 22, 56, 8, 15, 8, 5, 53, -17, 1, -11, 7, -31, 1, -10, -28, 19, 4, + -18, -9, 19, -21, 12, 4, 17, -31, -19, -8, 75, 21, -1, -19, 57, -41, 18, -51, -28, 13, + 27, 3, -20, -37, 28, -17, -6, 13, -17, 59, -34, 20, -11, 33, 35, 49, -15, -4, 3, 4, 46, + -9, -31, 8, 17, -17, 40, -3, 28, -1, 11, 4, 24, 12, -38, 48, -2, 13, -37, 12, 2, 12, + -7, -38, 27, -27, -23, 57, -75, 6, 16, -10, 0, 37, 18, 6, -2, -17, 27, 16, 46, -32, 30, + -21, 23, 20, -19, 9, -13, -1, -6, -19, -10, 31, 4, 22, 45, 24, -33, -6, 19, 7, -23, + -19, 32, 47, 18, 8, -3, -10, 2, -7, -26, -68, 28, 19, -5, -25, -38, -24, 11, -8, 27, 4, + -12, 43, -8, -49, -54, 9, -6, -66, 26, 7, -23, -8, 12, 11, + ], + [ + 6, -3, -57, 13, -19, -21, 3, -82, 8, -56, -23, -1, 21, -19, -23, 17, 29, 8, -53, -33, + -12, 2, -14, 11, 15, -52, -27, 23, -5, -5, 22, 6, -34, 29, 29, -9, -40, 5, 12, -9, 7, + -16, 37, -41, -25, -24, -17, -10, -42, 1, 9, -2, 11, -6, -4, 17, 39, 26, -1, -34, 19, + -29, -28, -47, -7, -28, -1, 9, 1, 7, -26, -8, -7, 22, -21, 4, -7, 29, 10, 28, 14, 22, + -22, 2, -24, -9, 3, -21, -44, 26, -13, 14, 1, 50, 29, -34, -5, 1, -24, 27, 36, 39, 1, + -13, 31, -28, -33, 33, 10, 15, -27, 74, 2, -19, 24, 40, -45, -18, 10, 23, 19, -64, 51, + 7, 10, 6, -47, -20, 22, -1, -53, 1, -23, 7, 2, 11, -23, -25, 17, -19, -16, -27, -24, + -41, -31, -4, 39, 20, 17, -32, 17, 25, -18, 23, 4, 48, 35, -17, 27, 6, -19, 4, 12, 34, + 7, 9, -22, -6, 46, 13, 29, -33, 41, 18, 12, -21, 35, -9, 15, -49, 5, -2, 39, 11, -49, + -10, -1, 10, -3, 22, -45, -22, 28, -46, -16, -40, -61, 79, -19, 45, -2, -9, 10, -11, + 25, -29, -37, -25, 26, -64, 24, 38, 46, 8, -4, 6, -15, 8, -22, 36, 30, -38, -26, 23, + 21, -2, -29, 0, 40, -26, 19, -28, -4, -25, -19, -7, 26, 40, -29, -7, -15, 53, -1, 3, + -13, -25, 29, 22, -32, -16, -38, -31, -28, -13, 23, 25, 8, -60, 8, 9, -10, 14, -9, 34, + 10, -65, 14, -14, 7, -16, 18, -21, -4, -10, 9, -40, 15, -35, -24, 19, 13, 15, 19, -9, + 2, 23, 10, 6, 12, -28, -42, 36, -11, -6, 51, -3, 17, 20, -37, -8, 18, -36, -27, 13, + -33, 24, 8, -29, 50, -36, -22, -3, 13, -10, -23, 13, -15, 3, 35, -33, -4, 26, -31, -1, + -24, -41, 16, -23, 17, 11, 1, 26, -20, -27, -52, 2, 78, 14, 1, 18, -1, 12, 18, 10, 41, + -6, 21, 12, 4, 11, 25, -16, -25, 1, 18, 52, -20, -26, 20, 9, 44, -34, -28, 12, 24, -34, + 43, 38, -22, 17, -41, -16, -13, 2, -5, 49, 2, -36, 5, 7, 8, -27, 16, -28, 43, 34, -4, + -3, -43, -13, 49, 2, 7, 16, 38, 12, -6, -3, 8, 21, -8, -9, 19, 34, 7, -22, -51, -24, 1, + 4, -34, 24, -17, -1, 36, -10, 15, 8, 8, 25, 1, -4, -33, -32, 4, -50, -14, 18, -6, -20, + 55, -34, 5, -25, -29, 21, 1, 22, -8, 24, 7, -20, -39, -20, -11, -38, -50, -5, -34, 22, + 28, 44, 33, 9, -7, 10, 8, -6, 14, 4, 16, 1, -45, 3, -10, 31, -12, -6, -45, -38, -59, + -2, 18, -1, 17, 13, 26, 24, 10, 36, 27, 9, -19, -35, -91, -13, 31, -40, -61, -8, 0, 4, + 22, -13, 12, -37, -10, -30, 38, 9, -10, 24, -30, 27, -13, 40, -27, -28, 21, -20, 33, + -31, + ], + ], + [ + [ + 1, 0, 3, 3, -2, -3, -2, 2, 0, -3, -3, -2, 1, 0, 0, -2, 5, 3, -1, 3, 3, 1, 9, 1, -3, -2, + -1, 6, -1, -2, -1, -5, 2, 0, 5, -2, -3, 2, 1, -3, -3, 10, 0, 3, 5, -1, -3, 6, 5, -4, 1, + -5, 5, -3, -1, 5, 5, 2, 4, -2, -2, -5, -2, -3, -5, -6, -8, 0, 4, -2, 4, 0, -1, -7, 7, + -4, -6, 2, 1, 7, 1, -5, 3, 2, -6, 6, -1, 4, 2, -4, 5, -4, -8, -2, 0, -2, 8, -1, -1, -1, + 2, -5, -2, 3, -2, 7, 1, 1, 3, -3, -2, 5, 0, -2, -1, 1, 6, 5, 2, 0, -4, 2, 1, 1, 3, 4, + -6, -2, -2, 0, -3, 1, 0, 4, -4, -9, 0, 8, 0, 4, -3, 3, 1, 2, 2, 4, -7, 3, 9, -1, 1, -3, + -1, -4, -1, 3, -1, -1, -1, 0, -5, -5, 5, -6, -4, 0, -3, -2, 4, -1, -3, 7, 1, -4, 1, -1, + 7, -7, -2, -2, 6, 5, 1, -5, -7, 1, -1, -3, 0, -8, -2, -7, 0, -10, 2, 4, 0, -4, -2, -5, + 5, -2, 3, 4, 5, 4, 2, 2, 4, 2, 1, 1, -7, 6, 3, 4, -6, 8, 0, -1, 8, -3, 2, -3, 6, -5, + -5, 5, 7, 0, 0, -1, -1, 2, 1, 0, 1, -4, -1, -1, 5, 2, 2, -7, -4, 0, -3, -5, 1, 3, 1, + -2, 6, 5, 9, -6, 8, 2, 4, -3, 4, 10, -5, -1, -2, 0, 2, 6, 3, 1, 7, 1, 2, -1, -3, 5, -2, + -6, -2, -3, 5, -4, -2, -2, 1, 1, 6, 0, -1, 6, 6, -4, 6, 1, -1, -3, 3, -8, 5, 6, -8, -3, + -3, 8, -1, -5, -4, 0, -1, -1, -1, -6, -5, -11, 3, -6, -4, 3, -2, -1, -2, -5, 3, -2, 2, + -7, 2, 9, 1, -2, 2, -1, 0, 1, 7, 0, 4, 0, -2, 1, 3, 0, -3, -1, -3, 1, 7, 0, 0, -1, 0, + 3, 0, 6, -5, -8, 4, 0, 5, -3, 0, 4, 5, 5, -9, 4, 0, 1, 1, 2, 0, 6, 1, -6, 0, 5, 2, -2, + -4, -7, 1, 0, -3, 3, 2, -5, -3, 1, 3, 5, 0, 4, -3, -4, 4, 12, 4, 0, -2, 0, 3, -8, 4, 0, + 1, 8, -3, 2, 2, -3, -5, 5, -1, 2, 3, 1, 2, 6, 1, 4, -5, 7, -9, 1, 2, 6, -4, 2, 2, 3, + -4, 2, 0, 2, -11, -4, -1, 0, -6, 0, 3, -1, 5, -2, 4, 4, 1, -1, 1, -6, -4, 0, -2, 2, 3, + -4, -3, 0, 7, -5, 7, 3, -4, 2, 1, -4, 4, 2, 3, 4, 1, -5, -5, -6, 0, 8, 1, 5, -2, 3, 7, + 1, 8, 1, 7, -3, -5, 1, 1, 0, 1, 2, -7, -6, 4, 6, -2, -1, 1, 4, -2, -3, 2, 3, 0, 3, 2, + 0, 3, 0, -4, 0, + ], + [ + 2, 2, -1, 6, -2, -3, 0, 6, -3, 3, -3, 2, -7, -2, 4, 6, 1, -1, -7, 2, -3, -2, 3, 3, 4, + -2, -2, -1, -5, 3, 6, -1, -2, -10, 1, 6, 3, -5, 6, 1, 6, -2, -2, -2, -3, -6, 1, -5, 1, + 1, 3, 2, 4, 1, -6, 0, -2, 4, -2, 6, -3, -5, -2, 1, -3, 2, 0, 2, 1, 0, 0, 3, 6, -3, 0, + -2, -7, 3, -2, -3, 6, -6, 3, 3, -4, -3, 1, 0, 0, -1, -2, 4, 3, -1, -3, -5, 4, 6, 3, 3, + 5, -2, 0, 2, -3, -2, -3, -2, 1, -4, 2, 7, 10, -1, -2, -3, 5, 1, -3, 7, 1, 0, 1, -2, -2, + 5, 3, -2, 6, -2, 8, 0, -4, 2, 9, 11, -3, 8, -4, -4, -5, 0, -1, -1, -7, 3, 4, 0, 0, 6, + 5, -2, -3, 0, 0, -4, -3, 0, 3, 0, -9, -2, -8, 8, 1, 1, 3, -3, 3, -2, -8, 1, 2, -2, 6, + 1, 1, 7, 9, -5, -4, 6, 3, 5, 7, 0, 0, 4, 6, 10, 0, 2, -3, -5, -3, 8, 1, -8, -2, 1, 4, + -9, 1, 6, 0, 0, 4, 9, 4, 1, 9, 3, 0, 1, 6, -6, -6, -3, -3, 0, 6, 3, -9, -2, 2, 9, -1, + 0, 0, 12, -5, 0, -5, 1, 3, 3, -1, 0, -1, 1, 8, -5, -2, -5, -5, -2, 0, 1, 4, 3, 4, 9, 7, + 0, 8, -8, -5, 1, 0, 2, 9, -2, -4, -2, -1, -12, 5, 2, -4, 0, 0, -1, -9, 4, 1, -6, 3, -1, + 0, 1, -7, -2, -1, 1, -3, -1, 4, 4, 0, -3, -4, -4, -2, -2, -2, -6, 1, 6, 5, 6, 0, -7, 7, + 7, -2, 1, -2, -8, -6, 2, 1, 1, 0, -1, -2, -1, 1, -3, -8, -9, 0, -1, -1, -1, -3, 6, -10, + 1, 4, -3, -3, -8, -1, 0, 0, -3, 6, 4, 1, 2, -3, -7, 4, 4, 1, -1, -1, 0, 3, 1, 3, -3, 2, + -4, 0, 4, -3, -1, 1, -2, 0, -6, 2, 1, -1, -3, -1, 7, 1, -4, 1, 5, 2, -2, 6, 6, 0, -7, + -1, -2, -3, 0, 1, 1, 6, -2, -1, 5, -5, 0, -1, 5, 1, -8, -3, 2, -7, -3, -4, 1, 4, -5, 2, + 1, -5, 3, 2, 5, 2, -7, 3, 0, 4, -1, -7, -2, 3, 3, 3, 3, -1, -3, 2, 1, 0, 2, -2, 2, 5, + 3, 5, 7, 4, 3, -2, -4, -4, 5, 0, 6, 1, -1, 0, 0, 0, -6, -2, -1, -1, -5, -2, -1, 6, 0, + 0, 7, -2, -1, 4, 2, 4, 6, 0, 0, 1, -1, -11, 1, -4, -3, -3, 7, -5, 6, 0, 7, -8, 4, -3, + 4, -1, -2, -3, -2, -7, -1, -1, 1, -2, -6, 2, 1, -3, -1, -2, -3, -8, -2, 4, -2, 0, 5, + -3, 6, 0, 1, 1, -2, 6, -2, 2, 3, + ], + [ + -23, 23, -23, -7, -1, 5, 32, 47, -29, -18, -43, 41, 43, 5, -28, -18, -53, -9, -2, -8, + 10, -18, -16, -54, -24, 6, -3, 6, 26, 15, 5, -2, 52, 22, 36, -26, -6, 32, 13, -3, 28, + -13, 23, -25, -32, 25, -8, 9, 7, 49, 6, -7, -34, -6, 53, 24, 5, 43, 7, -2, 17, 24, 24, + -27, -29, 1, 31, 15, 15, -35, 40, -5, 14, 14, 1, -14, -18, -7, -29, 1, -18, -2, 7, -6, + 28, 8, 25, 24, -36, 23, 2, 5, 2, -6, -8, 14, -26, -1, 52, 2, -12, -27, -7, 26, 5, -25, + -28, -17, 2, -32, 8, 46, 2, 17, 2, 11, -19, 8, -3, -11, 30, -1, -4, 5, 6, 21, -29, -9, + 19, -26, -11, 2, -17, -8, 10, 9, -25, -12, -65, -5, -24, 20, -3, -44, -11, -63, 11, + -10, 0, -25, 14, 16, -43, -17, -8, 20, -4, 22, -28, -18, -4, 24, 32, 3, -2, 12, 9, 21, + -39, -1, 7, -12, 1, -58, 10, 6, 8, 14, 18, 0, 13, 54, -19, 54, 19, 33, -41, -28, 40, + 57, -7, -40, -4, 7, -40, -3, 1, 27, 25, -5, -12, -23, 44, 12, -27, 5, -36, -12, -12, + 18, -13, 28, -44, 17, 13, 30, 26, -12, 10, -15, 52, 29, -47, -5, -42, 6, -12, -21, -29, + 0, -5, -37, -15, 6, 55, -8, -10, -18, 21, 9, -14, -24, 29, 19, 7, 5, -4, 13, 8, -43, + -58, 22, 16, -66, 14, -9, -17, -13, 72, -35, -6, -23, -3, 22, -1, -15, -2, -27, -7, -6, + -2, -21, 13, -31, -24, 28, 41, 16, 41, 32, -27, 30, -16, 10, 8, 12, -42, 0, -21, -4, + -21, -28, -25, -32, 41, -41, 82, -3, -9, -13, 20, 26, 36, -25, 4, 6, 17, -35, 7, 2, 4, + -33, 52, 37, 48, -28, -30, 18, 34, -54, -39, 45, -11, -3, 32, -27, 2, -12, 5, 13, -3, + 27, -19, -37, 8, -28, -15, 39, 2, -36, -40, -27, -1, 50, 21, 6, -8, 13, 35, 6, -18, 19, + -20, -69, 16, 12, 33, 9, -21, -24, -27, 29, 34, 0, -5, -15, 31, -2, -18, -59, 20, -27, + -50, -29, -46, 48, -3, 48, 3, 37, 11, 0, -1, -14, 16, 25, -35, -10, -47, -25, -2, -10, + -23, 43, 10, -27, -52, -29, 43, 45, 34, -1, -61, 35, 13, -17, -53, -1, -37, -12, -12, + -21, -4, 21, 3, -39, -22, 30, 9, 20, -60, -7, -26, -11, -60, 4, 22, -39, 16, 22, 44, 6, + 43, 6, -11, 20, 21, -25, 26, -26, -13, -48, 9, 15, -33, 1, -34, 0, 0, -2, -24, 14, -28, + -36, -20, 3, 56, -8, 4, 27, -30, -5, 29, 12, 42, 31, -2, 23, -12, 18, 36, -13, 12, 31, + -13, -11, 9, 6, -6, 31, -11, -11, -3, -13, 40, 68, -63, -27, -45, 7, -17, 29, 8, 11, 1, + -12, -24, 13, 76, -13, -43, -5, -14, 7, 32, 17, -33, 28, -34, -12, -3, 30, + ], + [ + 17, -17, -39, -70, 26, -3, -35, 27, 5, 34, 4, 5, 46, -9, -13, -14, -45, 10, 46, -34, + 39, 6, -52, -26, -24, 54, 77, -9, 10, 22, 21, 13, -19, 0, -10, -41, -26, -18, 40, -23, + 52, 30, -32, -2, 19, 52, 17, 2, -12, -35, -15, -33, 19, -10, 1, 5, -23, 32, -63, -35, + 35, 16, 2, 7, 4, 28, 40, 46, -21, -35, -2, -39, 1, 11, 15, 36, -40, -20, 20, -36, 0, 6, + 31, 31, -1, -9, -23, 5, -38, -16, 16, 7, -14, -31, 0, -27, 38, 8, -44, -33, -34, -39, + -27, 11, -15, -22, 2, -42, -11, -2, -25, -1, -11, 22, -1, -17, -32, -14, 7, -33, 11, + -8, -52, -52, -16, -31, 4, -11, 12, 4, -7, 45, -24, -1, -41, -18, -11, 37, -26, 18, 14, + 8, -22, 59, 3, -3, -20, -41, 43, -39, -8, -16, -14, -26, -41, -32, -34, -6, 46, -5, 50, + 13, 9, -10, 28, -32, -10, 8, 14, 33, 21, -79, -75, 18, -43, 3, -40, 6, -37, -7, 18, + -17, 20, 23, -23, -13, -20, -13, 55, 35, 6, -3, 21, 29, 19, 19, 20, -8, -19, -2, 3, 4, + -35, 12, 5, -9, 29, 6, -41, 22, 20, 35, -8, 19, 36, 16, -30, 8, -50, 34, -43, 30, 12, + -23, -4, -15, 20, -41, -15, 30, 8, -3, 17, -7, 53, -1, -7, 2, 30, 4, -13, -26, -16, 45, + 64, 31, 0, 7, 7, -29, -66, -15, 2, 29, -33, 4, -10, -22, 38, 20, -48, 50, -35, 12, 46, + 26, -20, -5, -2, -27, -32, 4, 2, -19, 18, -46, 14, 49, -20, 22, 3, 38, -6, -9, -7, 7, + -8, -17, -36, -4, -9, 40, 42, -15, -22, -35, 12, 78, -3, -51, 0, 20, -41, -55, -43, 35, + -10, -34, 9, 23, 41, -8, -7, -21, 43, -35, -3, -16, 45, -4, -26, -16, 17, -4, 47, -11, + 15, 18, -17, -4, 11, -31, -32, -47, 15, 6, -16, 33, -28, 0, -1, -12, 16, 60, -25, -15, + 9, 22, -20, 10, 17, -45, -28, 45, 29, -39, -19, 12, 28, 7, 27, -3, 8, -33, -23, 7, 49, + -31, -12, -13, 51, 32, 55, -26, 6, -37, -29, 7, -28, -21, 23, -14, 3, -21, 0, 21, 2, + 58, 3, 1, 2, -26, 49, 61, 2, -7, -8, 20, -76, -25, 2, -16, -9, -73, -37, 1, 23, -21, + -23, -25, 17, 23, 56, 23, 21, 2, -40, -15, 1, -18, 29, -25, -17, 0, -28, -5, 19, 26, + -34, -1, 17, 27, 20, 2, 33, 8, -13, -29, -29, 28, 0, -4, 15, 30, -5, 22, 11, 29, 57, + -29, -24, 21, -49, -14, -76, -53, -13, 32, 12, 0, 12, -5, 21, 33, -21, 34, -8, 26, -22, + 20, -13, -4, -40, 47, -32, 5, 21, -44, 39, -7, -10, -41, -5, 19, 26, 42, 15, -42, 67, + 15, -30, -22, -1, -25, -3, -20, -9, 42, 30, -2, -20, -31, -24, -24, 7, 3, 0, 48, -11, + 43, -6, -14, + ], + ], + [ + [ + -5, -1, -2, 2, 0, -3, -1, 0, 6, 4, -3, -6, 2, 0, 1, 2, 8, 2, 3, -1, -2, -3, -6, 6, -6, + -4, -4, 2, 3, -1, 6, -6, -1, 6, -3, -5, 7, -2, -1, 3, 1, -2, -1, -2, -8, 6, 1, 4, 1, 7, + 5, -5, 2, 2, -5, -1, -2, -5, -2, -2, -4, -1, 3, -1, -3, 1, 3, 2, -2, 3, 4, 1, -1, 1, 1, + -1, 4, 3, 3, 4, -4, -1, -7, -3, -4, -4, 9, -2, 4, 3, -1, -10, -11, 4, 1, -2, 5, -2, 4, + 0, 3, -4, -2, -1, -1, -1, 4, -4, -8, -6, -2, 0, 1, 0, 8, 6, 2, -12, -5, -3, 2, -6, -1, + -5, 0, 0, -1, 1, 0, 2, 5, -3, 0, -4, -1, -4, -6, -5, -3, 1, 4, -2, 6, -2, 0, -3, 3, + -10, 1, -3, -4, -1, 1, 1, 1, -1, -1, 6, -2, 1, 3, 0, -1, 3, 6, 2, 0, -7, 5, 5, -6, 1, + 5, -4, -2, -3, 0, 1, 0, -3, -4, 1, 6, -4, -1, -3, 7, 8, 2, -3, 0, 3, 3, -3, -1, 3, -1, + -5, -1, 2, 2, -4, 0, -3, 5, -2, -4, 7, -2, 2, 4, -2, -1, 3, -1, 11, -6, 1, -3, 5, 1, + -5, 3, 1, -2, 0, 2, 2, -5, -2, -5, -2, -4, -4, 4, 4, 2, 5, -4, 0, -3, -2, -1, 1, -4, 0, + 3, -6, 2, -2, -9, 4, -2, 7, 6, -2, 6, -5, 2, -9, 4, -3, 12, 6, -1, 3, 2, -2, 2, 4, -3, + -4, -3, 2, -2, 0, 2, -2, 10, 0, 6, -7, 3, 3, -4, 3, 5, -4, 6, -2, -2, 1, 3, -7, 2, -2, + -3, 6, 2, 2, 2, 6, -2, 1, -4, 7, 5, 3, 6, 2, -2, -3, -3, 3, 3, -5, 2, -2, 4, 1, -8, 2, + 2, 1, -2, -6, -6, 2, 1, -1, -2, 2, -4, -5, 0, 2, 10, 0, 2, 2, 1, 4, -6, -3, -2, -2, 0, + 0, -7, 5, -1, 3, -2, -1, 1, -2, 1, 6, 1, -1, 6, 6, 1, 3, 1, -4, 3, -6, -8, -2, -3, 4, + -1, 1, 4, 8, -4, -3, 4, -2, 0, -2, -2, 2, -4, -5, 9, -9, 0, 4, -6, 2, 0, 0, -3, -2, 1, + -2, -6, -6, 3, 2, -1, -9, 0, 11, -7, -3, -6, 0, 0, 1, 2, -3, 1, -6, 3, -3, 3, 4, 1, -2, + 1, 4, -2, -2, -3, 4, -1, 0, 0, 2, 2, 5, -3, -5, -2, 1, -6, -8, 5, 3, 4, -1, -3, -2, 2, + 5, -1, -1, 1, 1, 6, -5, 5, 2, -1, -2, -1, 0, -3, -4, 11, 1, -5, -2, 8, -5, 2, 4, -6, 1, + 7, 5, 0, -3, -2, -2, -5, -5, -1, -4, 0, 0, -2, -1, -1, -3, 3, -2, -8, 1, -3, 1, 0, 3, + 5, 9, -7, 2, -4, -2, 3, 4, 1, -3, 6, -2, -1, -1, -3, 0, + ], + [ + 0, -3, -3, 0, -6, 1, 1, -5, 3, 3, 4, -8, 1, 5, -9, 3, -5, -7, -4, 5, -4, 4, 2, 0, 3, 3, + 2, -3, 8, -6, -5, -1, 2, 0, 0, 0, -3, 0, 1, -1, -7, 7, 2, 0, -2, -2, -1, -2, -3, 0, 1, + 1, -2, -11, -5, 6, -2, 2, -6, 6, 0, -3, 4, 3, 2, 0, -1, 5, -6, -4, 7, 3, 1, 7, 2, 1, 3, + 5, 6, 3, 6, 3, 0, -7, 0, 1, -5, -7, 4, -8, -4, 3, 4, -1, 1, 0, 3, -7, 5, 1, 4, -6, 2, + 0, -2, 0, -1, -4, 6, 4, 2, 7, 6, -5, 2, 7, 0, 3, -2, 4, 6, 3, 9, 0, 3, -1, 2, -3, -2, + 6, -7, -3, 3, -2, -1, -3, 2, 2, 4, 2, -6, 3, -2, -5, -1, 0, 5, -1, -8, 5, 1, 2, -2, 2, + 2, -2, 0, 1, 8, -1, 3, -1, 6, -5, -7, -4, 5, -3, 0, 5, 5, -6, -1, -4, 6, -8, 4, 3, 3, + 3, 4, 5, -1, -1, 0, -2, 4, 11, 2, 0, 6, -11, -4, 6, 12, -1, 7, 4, -6, 1, 4, 1, 6, 1, + -2, 0, 2, -3, -2, 1, 0, -2, -3, -8, 4, -1, 0, 0, 3, -2, 4, -2, 0, -1, 7, 0, 0, -1, 2, + -4, 2, 3, 5, 0, 8, 0, -4, -7, -3, 5, -7, -4, -2, -3, 5, 8, 6, 3, 1, -2, 1, 6, -1, -7, + 5, 1, -8, -1, -3, 1, -3, -1, 4, 4, -1, -4, -5, -2, -1, -7, -3, -4, 5, -2, 1, 2, 6, 5, + 6, -1, 4, -2, -2, -1, 0, 0, 4, -1, 1, -1, 2, 0, -1, -3, -5, 2, -4, -6, -2, 4, -8, -4, + -2, 1, -2, -2, -2, 1, 2, 0, -5, -3, 0, 4, -2, 3, -13, -11, -1, -2, 1, 3, 7, 0, 1, 4, 3, + -1, -3, -1, 3, 7, -3, -5, 2, 2, 0, 1, -1, 1, 3, -2, 6, -3, -1, -3, -6, 5, -7, -6, 4, + -3, -4, 9, -3, -4, 7, 0, -3, 2, -3, -9, -3, 3, -7, 0, -2, -2, 1, -3, 0, -2, 1, 1, 10, + 5, -3, -6, 6, -5, -3, 0, 1, -4, -2, -6, -2, 2, -6, -1, -7, 4, 2, -2, 4, -2, -6, 5, -1, + 8, -1, -1, 3, 0, -5, 0, -5, 2, 3, 9, -1, -6, 1, 0, 6, 1, -2, 3, 2, 7, -1, 0, 4, 6, 0, + -13, 0, 3, -2, 9, 5, 2, -2, 3, -1, -4, 6, 0, 4, -2, -3, -3, 0, -2, 1, -3, -3, -5, 0, + -2, -3, 6, 0, -2, -3, 4, 1, -2, 0, -2, -2, 0, 5, -5, 0, 2, 6, 5, -1, 1, 2, 1, -5, -7, + -7, -4, -1, 4, 6, -4, 0, 3, -2, 2, 0, 4, 2, -7, 2, 9, -4, -3, 1, 3, 4, -9, 7, 2, -3, + -5, -6, -4, 2, 5, 3, 3, 2, -2, 0, 2, -1, -3, + ], + [ + 19, 12, -12, -25, -8, -4, -9, 1, -24, 62, 19, 18, -7, 0, -38, 9, -33, -25, 49, 1, 77, + 2, 16, 7, -51, 29, -42, 13, 9, -13, -22, -13, 50, -3, -53, 54, -15, 22, -69, -18, -12, + -3, 27, -5, -11, 17, -43, 39, 10, -14, 33, -13, 56, -16, 14, 15, -34, -8, 21, 15, -11, + -7, 42, 23, 16, 8, -25, -5, -45, 20, -3, 20, 1, 8, -1, 11, -9, -36, 42, 26, 47, -33, + -4, 58, 11, -4, -71, -62, 9, 27, -33, 25, 21, 79, 34, 20, -57, -2, 30, -7, -22, 58, 4, + 43, 33, 9, 3, -63, -15, -9, 24, 8, -26, 4, -18, 6, -48, 18, -25, 27, 8, 28, -18, 19, + -8, 25, -15, 15, 32, -36, 24, -45, 7, 12, -13, 17, 36, -30, 29, -47, -53, 19, 16, -5, + -3, 60, 12, 0, -44, -28, -21, -48, -31, -12, 60, 59, -11, -31, 45, -29, -35, 13, -11, + -5, -20, -27, -8, 5, -10, -20, -11, 50, 44, -9, 0, 49, -1, 22, -49, -13, 0, 28, -40, + -43, 18, -9, 27, -34, -1, -33, 5, 34, -1, -9, 31, -18, -8, 5, -23, -11, -30, 45, -16, + -18, 13, -2, -40, 68, 28, -44, 27, 9, 8, -7, -24, 39, -2, -14, 19, 27, 6, 4, -32, -41, + 14, 8, -28, 49, -35, 31, 43, -44, -19, -17, -62, -6, -3, -2, 40, -18, -28, 32, -34, + -13, -9, -37, 25, -12, 0, -13, -4, 8, 32, 16, -10, -38, -17, 8, 18, -2, -43, -24, 11, + -25, -26, 23, 22, 30, 54, -10, 2, 0, -11, -42, -3, -12, -17, -5, 51, -20, 14, -17, 4, + -31, -5, 41, -44, -6, 12, -51, 35, 31, 13, 37, -21, 18, -8, -33, 24, -69, -8, -17, 18, + 12, 1, -6, -15, 31, 23, -25, 35, -34, 32, 11, -73, 4, 4, 2, 47, -24, 12, 8, 3, -29, 47, + -24, -57, -41, 53, 13, -10, -26, 20, 8, 35, -12, 4, 23, 17, 14, -24, -24, 55, -10, 16, + -23, -36, -40, -8, -14, 14, 2, -5, -19, 38, -52, 27, -18, -3, 46, -21, 29, 48, 5, 36, + -12, -3, -6, 18, 28, -4, -21, -52, 44, -41, 12, -20, -32, 68, 4, -1, 3, -30, 12, 29, + -14, -13, 17, 11, -9, 8, 43, 9, 33, -9, 21, -35, 5, -30, -10, 21, 28, 27, 11, 49, -24, + 33, 6, -22, 6, -1, -48, 7, 31, 65, -42, 12, 2, -18, 25, 5, -43, 13, -25, -16, 31, -22, + -6, 45, 33, -11, -10, 60, -3, 9, 2, 27, -16, -43, -23, -7, -26, 38, -48, 8, 43, -15, + -2, -3, 9, 36, -7, -20, 32, 0, 0, 4, -5, 15, 12, 14, -9, -6, -12, -39, -12, 3, 18, -9, + -1, 58, -1, 14, -53, -22, 22, 14, 27, -16, 17, 2, -4, -6, -36, -31, 39, 15, 16, 30, 6, + 7, -37, -6, -63, -30, -20, -22, 1, 18, 1, 13, -27, 9, 42, -3, 25, 10, 10, 15, -35, 6, + 20, + ], + [ + -48, -19, -27, 23, -36, -8, 0, 54, -6, -27, 5, 12, 0, -9, 32, -4, -14, 9, 42, -17, -34, + -22, -34, 15, -37, 32, 17, 14, 29, 12, 5, 10, -47, -7, 26, -19, 7, 21, -22, -26, -12, + -9, 4, 29, 58, 22, -16, -2, -19, -24, -34, 16, 34, -48, -31, 0, 14, -11, -79, 8, -5, 0, + -5, -24, 31, -21, -9, -24, -27, -7, -9, 2, 19, -4, -38, 42, -3, -22, -3, -1, -7, -7, + -21, 52, -13, -3, -13, 29, 32, -13, -2, 16, -29, 55, -10, -38, -35, 11, -21, -52, 26, + 10, -22, 16, -8, 6, -1, -53, -21, 33, -30, -34, 25, 24, 5, -7, -23, 25, -4, 6, 21, 31, + -2, -15, 13, 11, -33, 44, 41, -64, -26, 34, -44, -17, -12, 58, -6, -1, 19, 8, 21, 18, + -21, -2, -30, -50, -27, 8, -44, -44, 4, 24, 5, -9, -34, 18, -5, -16, 5, -17, -23, 15, + -11, 19, 4, 47, 15, -29, -3, 18, 3, 13, -5, 25, -29, -2, 9, -22, 38, 6, 7, -11, -70, + -3, -7, 3, 6, 0, 23, 23, -15, 6, 5, 13, -14, -2, -3, 58, 23, 21, 11, 41, 5, -6, -40, 6, + -39, -16, 6, -14, 22, -37, -22, 18, -30, 17, -16, 59, 0, -14, 25, -60, -23, 26, -37, + 50, -31, 19, -12, 6, 81, -21, -20, 24, -23, -7, 16, 34, 3, -49, -33, 47, 15, -11, 47, + -34, 8, 27, 24, -11, -6, 24, -14, -23, 17, -16, -12, -14, 20, -31, 7, -25, -21, 44, 42, + -13, 11, 10, 5, -21, 25, 20, -13, -7, 12, 41, 3, 17, 23, -30, -35, -25, 28, -13, -7, + 43, 8, 55, 54, 2, 18, 28, -33, 26, 38, -32, -27, -67, -25, 4, -2, -3, -8, 9, 18, 11, 7, + 14, 23, 52, 21, -37, 8, -1, 47, 10, 21, -32, 3, 10, 4, 2, 36, -20, 11, 2, 68, 20, -15, + 49, 16, -31, -10, -12, 5, 22, -2, -24, 6, 4, 49, -14, 1, -28, 14, -9, 12, -13, 14, -49, + 6, 25, 7, -2, 14, -11, -8, -7, 36, 13, 39, 6, 29, 10, -23, 27, -21, -12, -2, -20, 35, + 4, 7, 14, -3, -59, 14, -11, -11, -9, 15, 25, -10, 14, 8, -31, 42, -32, -3, -18, -19, + -33, 7, -2, -26, -26, 74, 16, 8, 56, 5, 14, 55, -44, 38, -20, -20, -18, -19, 52, -79, + -35, 1, -43, 31, 51, -27, 21, 12, -21, -50, 37, 34, -20, 35, -18, 11, -65, 18, -19, -7, + 13, 10, -70, 9, 27, 21, 0, 33, 12, -26, -3, 16, -8, 21, 9, 17, -61, 10, -4, 25, 26, -7, + 39, 8, -43, 15, -1, -11, -4, -15, -2, -23, -73, 13, -3, -4, 2, 10, 30, -14, 2, -15, 10, + -22, 19, -42, 6, -42, -22, 6, -5, 12, 13, -7, -11, -18, 17, -16, 5, 2, -29, 48, -7, 19, + 2, -47, -21, 6, -33, 26, -16, -5, -44, -25, 6, -43, -54, 27, 38, 11, -10, + ], + ], + [ + [ + 1, 5, -5, 1, -7, 1, 8, 0, -6, 0, 2, -2, -2, -2, 0, -4, -4, -8, -6, 4, -2, 0, 2, 4, -4, + -5, 4, -3, -5, 2, -2, 10, 1, -2, 1, -2, 3, 6, -5, 6, 4, -1, 0, 4, 2, 1, -9, 0, 8, -6, + 1, -7, -2, 2, -6, 0, -7, 0, -8, 2, 7, -4, 5, 2, -1, 0, -9, -6, 0, 0, 4, 3, 3, 3, 4, -4, + 3, 1, -1, 0, -2, -2, 5, -6, -1, 4, -2, -5, 1, -1, -2, -1, 2, -1, 0, 0, 3, -2, -1, 0, + -2, -3, -3, 1, -4, -5, -2, 0, 1, 3, 3, 0, -10, 7, 4, 4, 0, 7, -2, 1, -4, 7, 1, 7, 0, 3, + 1, -1, -1, 1, -3, -2, -4, 0, 3, 0, -5, -1, -5, 0, -2, 1, -2, -6, 1, -3, -4, 0, -1, 8, + 4, 2, 1, 8, -1, 2, 4, 7, 0, 5, 5, -3, -3, 5, -1, -3, 1, -3, -1, -4, -2, 4, 4, -1, 5, 1, + 3, -4, -6, -6, -2, -1, -12, 0, 0, 9, -1, -1, 4, -6, 0, -2, -2, 4, -2, 1, 1, 2, -2, 5, + 1, -8, 4, 2, -2, 6, -5, -2, 3, 2, -6, 4, 0, -1, -2, 5, 0, -2, -3, 7, -2, 4, 2, 1, 10, + 0, 5, -4, -7, 1, 3, -5, 5, 3, 6, -1, -3, -7, 0, -8, -3, -4, -9, 0, -1, -6, -2, -3, 0, + -3, 6, 8, 2, 1, -6, -4, 4, -2, -1, 1, 4, 3, 0, 1, 3, -4, 0, -7, -1, 2, -1, -1, -1, -6, + 0, 2, 2, -4, 3, -1, 4, 7, -1, 2, 2, -6, 0, 0, -9, 1, -4, 0, 0, 3, 2, 0, -3, -3, 2, 4, + 6, -6, -2, 3, 5, -3, 5, -1, -1, 1, 3, 0, -4, -1, 1, 3, 3, 0, 4, -2, -1, 5, 6, 5, -4, 1, + 3, -1, 7, 0, 1, -5, 1, 3, -4, -3, 4, -9, -3, -3, -7, -3, 6, -3, 3, -1, 2, 7, 2, -1, 3, + 4, 3, 2, -7, 7, -10, -2, 6, 8, 1, 2, -1, -3, -4, 1, 0, 0, -2, -1, 0, 0, -2, 7, 3, -2, + 5, -3, 3, 0, 4, 0, 3, -3, 4, -2, 3, -4, 2, -2, -6, -4, -6, 3, -4, -6, 0, -7, 5, -2, -6, + -4, -1, 5, -5, 2, 1, 2, -7, -3, -3, -3, 0, -3, -1, 0, 3, -8, -1, 0, -1, 2, 12, -1, -2, + 0, 3, -8, -5, -1, 0, -3, -2, -3, 4, 3, -2, -2, 3, 6, -1, 6, 3, -5, -1, 1, -3, -9, 2, 4, + -1, -2, -3, 2, 7, 2, -3, 2, -4, -5, 6, 1, -3, -5, -2, -2, 4, 4, 3, -2, -3, 3, 2, -2, 1, + 4, 3, -6, 3, -1, 7, 0, 6, 3, 4, 4, 0, 3, 0, -1, 1, -1, 2, -8, -8, 0, 4, 4, -2, 3, -2, + -2, 1, -3, -15, 0, -1, -1, 3, -5, -10, 2, + ], + [ + 8, -8, 1, -6, 7, -1, 5, 4, -2, 5, -5, 8, 4, -3, 2, -5, 4, 1, -1, -1, -1, -6, -4, -4, 0, + -1, -9, -2, 4, -4, -4, 1, 6, 3, 1, -3, 0, 2, 4, 7, 0, 5, -2, 0, 0, 0, 2, -5, -3, -4, + 11, 1, 4, 5, -2, 0, -1, -4, -1, 2, 2, -2, 2, 6, 4, 3, 3, 0, 2, 5, -6, 5, 9, -4, -6, 3, + -4, 0, 0, -5, 11, -5, 4, -1, 3, 8, 0, -8, -4, -8, -5, -4, 0, 1, -8, -1, 10, 7, -3, 7, + -2, 2, 2, 0, 6, -4, -4, 1, 3, -8, 1, 5, 1, 5, -3, 0, 4, -3, -3, 3, -2, -5, -4, -1, -1, + -1, -1, -6, 9, 2, 1, 2, 1, 4, 0, 4, 0, 6, 0, 5, -3, 2, -1, 2, 8, 5, -5, -1, 5, -3, -9, + 1, 5, 0, 0, 1, 4, -5, -2, -2, 2, -1, -1, 1, 8, 1, -1, 2, 7, 4, 0, 0, -4, -3, 2, 1, 6, + 7, -1, -7, -2, 2, -7, -4, 1, -1, 5, 2, 1, -1, 0, -4, 11, 3, -2, -1, -4, 0, 0, -4, -3, + 0, 2, -2, 4, 8, -3, 1, 6, -2, -2, -1, -2, -4, -6, -1, 1, 1, -4, 1, -2, -3, 2, 4, 5, -8, + 0, 2, 9, 0, 1, 3, 0, 3, 0, 0, 2, -1, 2, 1, -1, 0, -1, 4, 1, 3, 3, 4, 0, -4, 4, 4, -2, + 2, 3, 7, 5, -8, -2, -9, 1, 1, -6, 7, 5, -1, -1, -8, -3, -2, 4, -2, -4, 1, 5, 3, 2, -2, + 6, 1, -7, 1, 0, -1, -7, -5, 3, -2, 1, -2, 1, 2, -3, 5, 0, -4, -2, 7, 5, -1, 0, -2, 0, + 3, -7, -6, -7, -5, -1, 8, 0, -8, 2, 4, -3, -2, -2, -2, -8, 4, 1, -1, 3, -5, 9, -1, 2, + -3, -1, 3, -3, 1, -5, -7, -2, 1, -1, -1, 4, -6, -6, 7, -2, -2, 2, 6, 1, 3, -3, -4, 4, + 4, -3, -4, -1, -6, -2, -6, -3, -1, -2, 7, -2, 2, 4, 4, 3, -1, -1, 4, 3, 1, 5, -1, -4, + -4, 2, -5, 2, 2, 3, 5, -2, -3, -3, -4, 7, 0, 6, 2, 2, -2, -9, -2, 0, 4, -3, -7, -2, 5, + 0, 1, 1, 3, -3, -2, 1, -5, -2, 3, 1, -1, -2, -1, 3, -6, 0, 4, 8, 8, -7, -6, 2, -7, -3, + 5, 9, 1, -3, -1, 5, -3, 5, -2, 3, 2, 5, 4, 4, 6, 0, 2, -4, 0, -3, 3, 2, 10, 1, 1, -1, + -1, 3, -1, 2, -1, -3, 2, -1, 6, -8, -5, -9, 4, -8, 1, 1, -2, 0, 5, 1, 5, 1, -1, 2, 4, + -2, -6, 4, -3, -3, -1, 0, -7, -1, -4, -3, 3, -1, -1, -2, 2, -4, 1, 1, 1, 1, -7, -2, 4, + 3, -6, 4, -12, -1, 1, -1, 9, 2, -5, -2, 1, + ], + [ + 6, -22, 16, 16, -37, -17, 21, 12, -27, -28, -35, -16, -9, 33, 30, 11, -51, -4, -2, -17, + -27, 21, 4, -1, 64, -4, -56, 3, 8, -8, 8, -11, 43, -5, 45, 4, -6, 11, 32, -11, 28, -37, + -29, 11, -43, -36, -3, -29, -4, -46, -17, 19, -49, -9, 18, 2, 1, -42, -6, -4, -27, 5, + -20, -18, -22, 33, -42, -48, -1, 34, -8, 17, -6, 17, 4, -51, -17, 27, -1, -27, -2, -2, + 1, 28, 12, 49, -35, 9, 16, -23, 27, 4, -8, 34, -46, 30, 11, 5, -30, 4, -45, 10, -57, + -31, -42, -50, -51, -11, -14, 27, 12, 17, -4, 18, 15, -23, 25, 18, 16, 12, 0, 0, 61, + 35, 48, -5, 11, -13, -1, -24, 55, -6, 19, -2, 14, -16, -15, -20, -25, -64, 44, -9, 2, + 22, -35, 33, 46, 28, 21, 19, -11, 41, -5, 34, -29, 0, -28, -27, 6, 22, -17, 22, -6, 45, + 18, 6, -6, -1, -19, 12, -31, 16, 12, -24, 10, 9, 35, 3, -30, -15, -20, -16, 6, -1, -19, + -37, -6, -5, 35, -9, -33, 16, 0, 27, 30, 70, 3, 4, -9, -19, 43, 36, -28, -5, -34, -2, + 6, -17, -4, -22, 29, -16, 25, 9, -15, -56, -10, -10, -38, -10, 48, -4, 16, -30, -17, 0, + -14, -37, 0, -22, -27, -45, -51, 23, -21, 17, -28, -7, -24, 9, -8, 11, 20, 18, -23, 4, + 6, 15, -19, 24, -70, 3, -24, 26, -33, -9, -25, 10, 35, 35, -52, 21, -10, -34, 8, 19, + -43, 17, -47, -7, 20, -5, -2, -3, -1, 39, 16, -9, -7, -28, 18, -14, -16, 39, 16, -5, + 10, 30, 30, 5, 73, 19, 21, -52, -42, 41, -1, 12, 4, 29, -22, 47, 15, 14, -1, -20, -4, + 32, -9, 10, -9, -2, -13, 14, 13, -3, 0, 4, 23, 50, 17, 13, -4, -15, 29, -15, -15, -10, + 33, 16, -5, 17, 1, 16, -59, 55, -19, -14, 16, -14, -30, 26, -18, 31, -2, -12, -21, -9, + 6, 14, 20, 34, -10, -18, 14, -16, 14, -12, -10, 44, -2, 13, 16, -30, 0, 11, -27, -8, + 34, -5, 13, -17, -11, -36, 8, -69, -11, -3, -20, -1, 21, -16, 43, -40, 13, -11, -36, 0, + -40, 1, 4, -11, 21, 18, -55, -12, -16, -35, 9, 33, 10, 28, -12, 46, -2, -1, -27, -24, + 20, 18, 22, 13, -17, 13, 14, 25, -1, 16, -8, -12, 32, -31, 51, -59, 7, -33, -8, 4, 3, + 37, 48, -16, 21, 7, 7, -39, -39, 19, 3, 27, 25, 55, -18, -25, -35, -3, 22, -2, -21, 25, + 13, 18, 2, 42, 5, 10, 47, -15, 27, 7, -5, -14, 5, 7, 9, -39, 10, -21, -30, -15, -35, + 29, 4, -15, 17, 13, -39, -23, -6, 41, -11, 19, -26, 37, -51, -15, -20, -5, -16, 37, 26, + 46, 13, -22, -15, -22, -63, -7, -1, 37, 6, -43, -8, 9, 5, 14, 7, -44, -11, -4, -15, + -24, + ], + [ + 31, 39, -25, -1, 13, -2, -21, -10, 22, 2, -19, 3, 53, -27, -7, -11, -22, 25, -28, -1, + 17, 34, -37, 23, 4, -1, 3, -33, 25, -1, -2, 4, -8, 6, 21, 39, 49, -1, -26, 22, -7, 39, + 26, -16, -53, -16, -24, -26, 26, 11, -24, -9, 12, 17, 20, 35, 11, -5, 29, -22, -25, 1, + -44, -46, -14, 15, -24, -23, 35, 34, 47, -12, -1, 19, 2, -25, 28, 19, 20, -27, 5, 24, + -31, -23, -3, 22, -23, 46, 51, 30, 7, -14, -5, -5, -5, 19, -22, 1, 30, 15, 61, 4, 29, + 31, 9, 3, 10, 10, -50, 4, 6, 28, -23, -26, -31, -1, 10, 14, 43, -39, 9, 23, 27, 3, -15, + 8, -16, -26, -9, -11, -8, 0, -50, -28, -8, -25, 63, 28, -13, 22, 17, -28, -36, 15, 20, + -2, -47, 14, 29, -1, -2, -15, 22, -32, -44, -46, 9, -38, -39, -11, 9, -7, 11, 21, 15, + -46, 28, 27, 40, 17, 18, -31, -46, -16, -32, -2, -35, -47, 17, -18, 20, -15, -21, 15, + 24, 53, -18, -5, 17, 34, -4, 34, -27, 9, -42, 4, -12, -29, -58, -18, 64, 12, -24, 40, + 23, -2, -7, 2, 25, 1, 12, 1, 23, 16, -43, 8, 27, 12, -13, 22, -44, 0, 10, -21, 0, -18, + 38, -11, 8, -37, 14, -45, -1, -38, 2, 43, 19, 30, 19, -4, -1, 30, -4, -23, 8, -6, -7, + 15, 55, 35, -65, -25, -20, 11, 9, 13, -2, 20, -43, 28, -69, 39, -6, -26, -6, 6, -18, + 21, 45, 11, 18, 9, -9, 33, 9, -22, -17, -46, 21, 18, 52, -10, -16, -57, -25, -6, -18, + 5, -28, 20, -1, -34, -3, -18, -8, 17, 12, -62, -5, -52, 9, 15, -22, -22, -44, 10, -17, + -29, 8, -35, 21, 20, 32, -43, 24, -15, -2, -19, -39, -62, -14, -17, -34, 7, -31, -28, + -41, 2, -13, 6, -3, 13, 20, -19, 37, -36, -13, -11, 15, 10, -25, -2, -15, 16, -22, -59, + -23, 36, -10, 16, 32, -36, -63, -18, -9, -25, -22, -47, 12, -3, 13, 34, 59, -40, 47, + -49, -20, -6, 0, 36, -23, -17, -10, 5, 11, -16, 29, -4, 14, 38, 72, -2, 0, -45, 21, + -35, 34, -11, -28, -31, -33, 5, 4, -1, -50, 26, 14, -9, -41, -22, 32, 50, 32, -1, 1, + -22, -1, 37, 19, -7, -7, -34, 24, 13, -24, -34, -60, 24, 3, -22, -4, -3, 25, 5, -22, 4, + -18, -6, 35, -13, -6, 8, 8, 45, 6, 9, 2, -33, -25, 9, 8, -23, -22, 14, 12, 5, -8, -35, + 3, 56, 21, 42, -13, 16, 14, -51, -24, -18, -5, -5, 6, -3, 31, -42, -25, -8, 29, 1, -14, + 23, 26, 27, -13, -7, 33, 12, -16, -44, -36, -58, -31, -2, -9, 31, -7, -12, 26, 1, -23, + -44, 1, -38, 26, 6, -27, 0, -14, 41, 8, 22, -58, 13, -3, 2, 19, 0, 33, -13, 28, -25, + -1, -33, + ], + ], + [ + [ + -2, -2, -2, -10, 6, 1, 0, -7, 0, 3, 4, -12, 1, -3, -5, 4, -1, 4, -3, 4, -4, 7, 3, -2, + -4, 2, 2, 0, -1, 1, -2, 0, 0, 11, -3, -4, -3, -6, 5, 1, -1, -5, 4, 6, -2, -3, -1, -2, + 3, -2, 0, -1, 1, -2, 9, -7, -3, 0, -2, -6, -5, 0, -3, 0, 6, 5, 5, 3, -5, -1, 12, -3, + -4, -1, 4, -4, 0, 2, -5, -1, -2, 2, 4, 7, 4, 2, 12, 0, -4, 8, 0, 2, 2, 0, 9, 0, -7, 1, + -2, -2, -1, 1, 1, -2, 7, -1, -4, 6, 7, 2, -2, 6, 1, -3, -4, -3, 2, 3, -1, 3, -3, -5, + -6, 2, 1, 8, 5, -2, -1, 3, 6, -7, 0, 2, 9, 1, 0, -3, -3, 4, -4, 2, -1, 2, -2, -2, 1, + -3, 2, -5, 0, 7, 3, 5, -4, -1, -3, -3, -1, -1, 8, 4, 4, -4, -4, -6, -2, 0, 5, -1, 2, + -6, 3, 3, -4, 5, -8, -3, 1, 9, 5, 0, 3, 5, -2, 3, -10, -5, 6, 2, 3, -1, -4, -2, 1, -1, + 0, 5, 3, 6, 6, -1, -10, 1, -2, -2, 0, 7, -4, 2, -7, 7, -2, -1, -4, 0, -10, -4, -1, 0, + 3, -1, 3, 0, 0, 1, -5, 0, 3, -2, -9, -3, 3, -4, -2, 5, 2, 2, 6, -3, 2, 5, 2, 4, -2, 7, + 0, 3, 2, -3, 9, 3, -5, -3, 5, -6, 5, -4, 1, 1, -5, -1, 1, -1, -9, -7, -3, 1, 12, 0, 1, + 5, 0, -3, -1, 5, 2, -5, -1, 3, -5, 1, -4, -3, -8, 2, 0, -1, -4, 3, -2, 0, 4, -2, -3, + -4, 3, 8, 3, 8, 5, -2, -1, -1, -3, -4, 0, 2, 1, 3, 7, -3, -1, -4, -3, -7, 1, 0, 5, -1, + -3, 6, -1, -3, 5, -3, 5, -1, 1, -5, -1, -7, 2, 1, -1, 1, -1, 4, 2, 6, 2, -4, -4, -5, + -5, -7, 4, 1, -4, -6, 7, -3, 4, 2, 6, -4, -1, 2, 9, 4, -4, 4, 0, -1, 1, 1, 5, 7, -16, + -3, -2, -2, -1, -1, -2, 4, -1, -5, -1, 0, 7, 3, -5, 4, 7, 6, 8, -5, 2, 3, 2, 0, 1, -6, + -3, -6, 3, -1, 0, 1, -4, 2, -7, 1, -2, 0, 0, 0, -4, 1, -1, -1, 2, -1, 2, -3, -3, -4, + -4, -1, -1, -2, 5, -2, 6, 5, 1, 1, -5, -3, 6, 5, -5, 8, -3, -5, -1, 1, -1, -1, -6, 4, + 1, -1, 3, -4, 3, 2, 2, 4, 5, 5, -2, 7, -2, 0, -4, -4, -4, -11, 0, 2, -1, 1, 6, -2, -6, + -1, -2, -3, -2, -5, 0, 1, -2, -3, -3, -3, 4, -4, -4, -2, 1, -4, -1, -7, -5, 1, 6, -4, + 1, -4, 1, 2, -2, 4, 10, 4, 1, 0, 3, -4, 4, 4, -6, -3, 4, -5, -1, -7, 2, -4, + ], + [ + 1, 0, 1, 0, 4, -8, -6, 0, 0, -1, -2, 9, 3, -1, 3, 0, 0, -2, -2, 4, 3, 2, 3, 1, 4, 0, + -5, -1, -6, 1, -3, -6, -3, 3, -6, -1, -1, -4, 2, 2, -4, -5, 4, -6, -2, 4, -4, 4, -1, 0, + -4, -4, 1, 1, -2, 0, -11, 3, -1, 2, 0, 3, -1, 1, -5, -2, -1, -4, 0, 2, 1, -2, -9, 3, 4, + -5, 5, 2, 2, -2, 2, 2, 0, -6, 2, -1, 5, -3, 1, 1, 0, 1, 3, 0, -1, 0, -5, -4, -4, -8, + -7, 1, -2, 4, 0, 1, -3, -5, 4, 3, 2, 1, 0, 0, -2, -7, 4, -3, -4, -4, 0, 3, 1, -9, 2, 0, + -1, 4, 0, 0, -7, 1, -2, 1, 5, 4, 0, 5, 2, -3, -1, 4, 9, -3, 3, -8, 7, 1, 3, 10, -7, 3, + 4, 2, 0, -1, 0, 0, 0, -7, 10, -9, 8, 0, -11, -1, 1, -8, -3, 1, -1, -1, 2, 1, 1, -4, 0, + -5, 2, -3, -5, 4, 0, -3, -5, -2, 6, 0, 6, 4, -5, -1, -1, 3, 7, -4, -3, 6, 5, 1, 5, -1, + 1, -4, 4, -4, 1, -5, 1, -13, -5, 0, 4, -9, -2, 1, -2, 0, 3, -5, -1, 3, 7, -1, -3, 5, 5, + 8, 9, 5, -4, 3, 1, 1, -2, 1, 4, 4, -3, -2, 3, -1, 7, 4, 1, -2, 4, 7, 2, -4, -5, 1, 1, + -2, -5, -3, -4, -2, 1, -5, -2, -3, 0, 0, -3, -3, -2, -1, -9, -1, 1, -4, 5, -4, -1, 3, + 1, 2, 5, -3, -4, 0, -1, 4, 5, 4, 0, -1, 9, -4, -5, 0, 0, 2, -3, 6, 5, 2, 0, -8, -1, 10, + -4, 3, 1, -7, 1, -6, 0, -3, 9, 3, 6, -2, 2, -4, 2, 5, -3, 2, 1, -1, 5, 4, 3, -1, -1, 3, + -3, -3, -3, -4, -6, 1, -1, 5, -5, 4, 11, -2, 0, -1, 1, 5, -5, -3, 1, 0, 5, -2, -1, -2, + 2, 0, -1, 3, -1, -3, 3, 3, 3, 10, 3, -3, 0, 1, 4, 0, 0, -5, 5, 2, -2, -1, 6, 5, 4, 5, + -2, -3, -1, -5, 1, -2, 3, 0, 2, 2, 4, 0, -5, 4, -2, 5, -4, -1, 7, -2, -2, -1, -4, 1, + -3, 9, -5, -2, 3, -2, -2, 0, 2, -1, -4, 5, -3, -8, 4, -7, -1, -7, 1, 5, -3, 1, 0, 7, 5, + 2, 3, 3, -7, 5, 4, 2, 6, 4, 1, -4, -3, -6, 5, -5, 0, 0, -7, 2, -1, 4, 2, -2, 4, 0, 0, + 5, 1, 0, 4, -8, 6, 4, 4, 1, -1, 4, 2, 2, 0, 6, 2, 1, 5, 0, 0, -3, -2, -4, 0, 3, -1, 3, + -4, -6, -2, -9, -5, 5, 4, 4, 5, 1, -3, 11, -1, -2, -5, -1, -6, -4, -5, -5, 7, 5, 3, 0, + 1, 2, -1, -1, 0, -3, -1, 1, + ], + [ + -21, 36, 31, 26, 40, -4, 4, 6, 2, -7, 9, 60, 19, 5, -36, 13, -19, 7, -5, -20, 19, -14, + -17, 24, -8, 14, -51, -4, -4, 2, 1, -26, 53, -10, 0, 30, -11, 1, -5, -15, -52, -2, 16, + 0, -7, 13, 28, 18, -18, -30, 38, -5, 33, -8, -15, 5, -66, -28, 7, 36, 20, 21, 1, -27, + -11, -19, 22, -21, 29, 22, -1, 13, -14, 13, -20, -38, -30, -26, 18, -21, 7, -50, 39, + -15, 2, -5, 11, -17, -31, 27, 19, 26, 51, -1, -1, -13, 22, -56, 15, 1, 3, -3, -19, 24, + -51, -9, -7, 5, 1, 8, -13, -15, -4, 33, 61, -12, 24, -26, 5, 14, -35, 63, -9, 12, 46, + -10, -5, 10, -22, -19, 9, 1, 0, 30, 4, 11, 16, -59, -19, 17, 18, 13, 34, -28, 4, -29, + 13, -26, -44, 49, 17, -21, -20, -5, -25, -3, -5, 39, -4, 2, -20, 8, 37, 25, 16, -38, + -18, 36, -48, 15, -17, 19, 23, 19, 2, -2, -8, 16, -14, 7, -5, 20, -32, -17, 0, 8, 42, + 24, 5, 54, -33, -50, 11, -49, -15, 61, -9, -49, -25, 48, -13, -27, -13, 34, 10, 4, 13, + 31, 2, -13, -23, 24, -35, 26, -18, -35, -10, 22, -51, -13, -12, 10, -6, -26, -1, -28, + -46, -34, 2, -7, -1, -29, 42, 15, 25, 29, -5, 9, 46, 10, -39, -39, -22, -3, -48, -19, + -29, -51, 26, -25, 4, 20, -2, 16, -39, -30, 15, -37, 12, -33, -9, 2, -37, -21, 80, -5, + 18, -8, -58, -25, 11, 10, 30, -38, 2, 25, 1, -10, 8, 18, -20, -51, -6, -58, 27, 49, 26, + 23, 8, 5, -16, 23, 15, 19, -21, -10, 30, -12, 13, -21, 38, -2, -12, -42, 8, 15, 1, 0, + -52, -33, 40, -10, 17, 40, -17, -15, 37, 3, -9, 17, 29, -65, 0, 26, 29, 22, -14, 15, + 60, -23, -49, -2, -10, 14, 1, 27, -50, -62, -20, -39, 10, -4, 29, -21, -22, -16, 22, + 51, -14, 6, 45, -14, -9, 2, -8, -6, -35, -46, 12, 36, 5, -40, -28, 74, -23, 45, -6, 41, + -25, -58, -50, -30, -36, -27, 22, 43, 16, 44, -35, -26, -38, 9, 9, -16, 27, 36, -7, 25, + 47, -37, -15, 42, 20, -19, -4, 19, -46, 12, -105, -16, -16, -60, -31, -19, 20, -3, 27, + -35, 17, 31, -19, -21, -9, 39, 21, 5, 20, -21, -15, -6, -42, -4, 10, -42, 38, 26, -15, + 27, -19, -35, 30, 43, -31, -2, -4, 1, -10, 17, 31, 7, 35, 3, 1, 11, -9, -4, 9, -44, 22, + -7, 6, -29, -1, 12, -55, -32, -24, 26, 21, 5, -16, -33, -4, 20, -8, -23, 26, -4, 7, 6, + -21, 10, -26, -7, 11, -6, -14, 16, 20, 3, 61, 14, -68, -5, 4, 4, 16, -46, 40, -15, 11, + 31, 23, -12, -19, -68, -4, 5, -9, 2, 15, 16, 34, 36, 26, -29, 20, -68, 37, -16, -6, -5, + ], + [ + -10, -46, 68, 27, 11, 24, -26, 19, 2, 11, -2, 29, 40, 14, 13, -3, -20, -15, -4, 30, 44, + 26, -18, 12, -27, -20, -17, 44, -21, -31, -53, -39, -43, -45, -8, -31, 5, 72, -27, 27, + -9, 2, 7, -32, -2, -10, 33, 4, 1, 33, -9, 12, 8, 19, 18, 35, -36, 3, -3, -12, -2, -34, + 10, -1, -44, -19, -29, 22, 10, 1, 49, -26, 20, 3, 38, 27, -11, 23, 25, 6, 5, -42, -28, + -4, -15, 1, -7, 26, 5, -26, -6, -23, 2, 2, 1, 3, -37, 12, -7, 8, 27, -24, 21, -15, 9, + -4, -6, 34, 10, -14, 33, -13, 8, -14, 2, 14, 11, 3, -13, -24, 15, -36, -16, -18, 19, + -12, 11, 4, 13, 33, 11, 13, -5, 6, -2, 3, 47, 6, 40, -8, -19, 20, -25, 3, -9, -4, -12, + -3, -23, 15, 17, -9, 35, -19, -8, 10, -3, 15, 38, -14, -18, 33, 21, 28, 33, -13, 42, + 15, 43, -22, 39, -14, -4, 0, -16, -45, 16, -53, 11, 41, -56, 14, -18, -1, -24, -24, 44, + 25, 5, -18, 27, 3, -40, 17, 2, 43, 8, 4, 11, -4, 20, 37, 23, 0, -17, -26, -2, 10, 23, + 14, 23, -7, -23, 14, -20, 5, -9, 5, -13, 7, 22, 1, 33, 19, 50, -9, 40, 39, 60, 40, 11, + 3, 21, 0, -27, -3, 23, -9, 37, 22, -15, 30, -33, 20, 9, 20, 31, 25, 36, -2, 5, 8, -13, + 0, 28, 10, -12, -22, -38, -6, -22, 8, 0, 9, -64, -8, -27, -41, 24, -55, 32, -20, -3, + 26, -34, 10, 58, 17, 40, 21, 16, 41, 10, 9, 5, -1, -1, 23, 27, -25, -21, 63, 3, -27, + 16, -31, -5, -72, -1, -27, -3, -5, 38, 30, 35, 28, -64, 18, 9, -26, 10, 29, 22, -3, 24, + -29, 36, -11, 4, 55, -5, 8, 9, 17, -32, 16, 10, 47, 23, -15, -18, -23, 3, -38, 71, -3, + 3, -17, 44, 18, 23, -23, 8, -40, -25, 4, -40, -32, 12, -13, 61, -29, -9, 43, 26, -47, + 2, -33, -23, 8, -17, 12, 29, -5, 33, -3, 10, 49, 38, -23, 15, 50, 7, -26, 27, -23, 9, + 17, -14, -37, 37, 4, -5, -8, -6, 33, 16, 24, 51, -36, -5, 13, -10, 16, -9, -15, 27, + -51, 67, -16, 20, 14, -2, 15, -32, -39, -32, -13, -39, 10, -18, -17, 10, 1, -14, 0, 2, + 0, -43, -25, -11, -10, 0, 4, -20, -17, -31, 33, 42, 43, 14, 47, -10, -41, 18, -6, -52, + -37, -18, 4, -1, -4, -20, -19, -2, -42, -17, 0, -33, -32, 0, -4, 39, 33, 11, 38, -37, + 10, -8, -21, 9, -26, 50, 55, 11, 14, 5, 5, 21, -19, -25, 45, -64, 22, -19, -16, 20, 6, + 7, 7, 64, -25, 9, 48, -24, 11, -11, 16, -1, 13, 3, -37, 14, -9, 6, 1, -46, -32, -21, + -40, -10, 7, 5, -36, 13, 44, 8, 1, 17, 3, -34, 39, + ], + ], + [ + [ + -7, 2, 3, 3, 6, 5, -2, 1, 5, -1, 3, 0, 2, 2, 5, -3, 2, 1, 4, 0, 6, 0, 4, 3, -1, -6, 1, + -2, 0, 1, -3, -7, 2, 2, -1, 2, 6, -5, -6, 3, 0, 8, 3, 3, 8, -1, 1, -13, 0, -1, 4, -7, + -10, -1, -2, 5, 5, 1, 1, -1, 4, -2, -2, 1, 1, -1, 1, 1, -3, 3, 8, 3, -1, 3, -1, 2, 1, + 2, 1, 1, -5, 3, 5, 4, 4, 6, -1, 1, 1, -5, -1, 4, -1, 7, 2, -1, -6, 4, -2, 2, 6, 2, 9, + -4, -7, 2, 5, 2, 6, -2, 4, -2, -4, -3, 3, 3, 1, 0, 10, -6, 11, -2, 10, -9, -2, 1, -6, + 5, -5, 0, -4, 7, -1, -1, -5, 0, 5, 0, 3, 5, 5, 0, 2, -1, -1, 5, -3, 0, -3, 2, -5, 2, 7, + 5, -4, -4, -3, 9, 0, 0, -2, -1, -1, 4, 2, -1, 0, -1, 3, -7, 4, 6, 6, 5, 2, -1, -3, 5, + -8, -5, 4, -3, -2, -3, -5, 9, 2, 0, -1, 1, 7, 0, 5, -4, 3, -6, 0, 3, -1, -6, -4, 3, -3, + 9, 10, 3, 0, 2, -3, 5, 0, -5, -1, 4, 0, 5, 3, 3, -9, -6, 5, -5, 1, -8, -6, 4, 3, -6, 1, + -1, -2, 3, -3, 1, -2, -2, 2, 3, -1, 1, 5, -2, 2, -2, 2, 3, 3, 3, 5, -2, 11, 4, -3, -1, + 5, -7, 3, 3, 5, 4, -1, 5, -4, -7, -5, 2, -5, -3, -2, -1, 4, -2, -1, 0, -3, 2, 4, -3, 3, + 1, 4, 0, 3, 0, 1, -5, 3, 1, 3, 0, -5, -6, -4, -4, 6, 3, 7, -3, 3, 5, -1, -2, -2, -4, 1, + -9, -6, -3, -6, 3, 2, -3, -3, -4, 2, 8, 1, 3, -7, -2, -2, 3, -1, -1, 4, -2, 3, 2, 5, + -4, -5, 0, -2, 4, 1, -1, -2, -1, -2, -4, 1, -1, 1, -3, 1, -1, 0, -3, 5, -4, -3, 7, -2, + 1, 0, 1, 4, 1, 0, 0, -5, 4, 1, 4, 0, -2, 1, 4, -3, 1, 0, -2, -2, 8, -1, -2, 2, -1, -1, + -1, -1, 7, -7, 0, 5, -7, 5, -5, 0, -4, -1, 1, -7, -2, 1, 1, -2, -1, 1, -2, -3, -4, 5, + -4, 1, 4, -5, -7, 1, 4, 0, -6, -7, 2, 9, 0, -5, 1, -8, -6, -1, 3, 1, 8, -10, 2, 0, 4, + -6, -5, -4, -1, 3, 0, 4, -2, -8, 0, -5, 3, -3, 1, 3, -2, 3, 0, 6, 2, 0, -9, -4, 0, -5, + 3, 0, -4, 4, 3, 1, -3, 2, 9, 2, -5, 2, -8, -2, -1, 4, -1, -4, 4, 4, 1, -4, -8, -1, -4, + 5, 2, -3, 2, 0, 2, -1, 1, 7, -1, -1, 0, -1, 0, 0, 5, -4, 2, 0, -5, 5, -5, 8, -2, 2, 3, + 0, -1, -4, -2, -4, 6, 3, -8, + ], + [ + 4, -4, -3, -2, 1, 5, -7, -5, 3, 4, -4, -4, 3, 10, -6, -1, 5, -7, -3, -4, -4, 3, -3, 7, + 2, -4, 2, 2, -2, 0, 7, 3, -2, -1, -1, -2, -2, -2, -1, -6, -6, 0, -3, 4, 7, 2, 1, 2, -3, + 1, -3, -10, 2, 2, -2, 0, -5, -1, -1, 6, -3, -4, 9, 3, -7, 7, 1, 4, 2, 1, 2, 5, -1, -4, + -5, -7, 1, 6, 4, -2, -2, 1, 4, -4, 0, -1, 8, 2, 8, -2, 4, 2, -7, 0, -4, 5, -2, -2, -1, + 2, -3, -7, 2, -7, -1, 5, -4, 3, -4, -2, 0, 3, 0, 3, 1, 1, 2, 3, -8, 1, 1, -3, 10, -4, + 1, 5, 3, -6, 4, -2, -4, -3, 2, -1, -2, -1, -3, 1, -5, 1, 2, 7, 0, -5, 1, 6, -1, 2, 3, + -5, -1, 1, -2, -3, 2, 0, 6, 1, -3, 0, 1, -1, 0, 7, 2, -1, -6, -6, 12, 3, 0, 7, 2, 9, + -4, -5, 4, 0, -5, 5, -5, 6, 0, -2, 0, -1, 3, 4, 6, -5, -1, -7, 2, 2, 1, 3, 0, 6, 5, 1, + 4, -2, -10, -8, -3, 1, 1, -3, -5, 4, 0, 4, 3, 3, -1, -2, -7, 1, 6, 1, 0, -3, 3, -1, -2, + -3, -10, -1, -2, -4, 4, -1, -6, 1, 8, -2, 6, -2, -2, -2, 0, -4, -2, -3, 5, -4, 2, -4, + 0, 4, 1, 2, 2, 3, -1, 2, 6, 9, 2, -6, 0, 6, -2, 1, -11, -1, 5, -2, -5, 0, 3, -2, -1, + -1, -2, 5, -1, 4, 0, -7, -5, 3, 8, 4, 0, -1, 2, -1, 1, 0, -1, 2, -4, 6, -6, -1, -10, + -4, 8, 6, 3, 4, -1, 2, 2, 8, 0, 0, 6, 1, -3, -1, 0, 1, -5, 4, 0, -5, -3, 10, 0, -7, -3, + -3, -6, -2, -5, 0, -7, -4, -3, 4, 2, 0, 1, 3, -2, 2, -3, -3, -9, 6, 1, -6, -1, 2, -3, + -1, 0, -8, 1, -5, 2, 0, -2, -6, -1, -3, 1, 2, -1, 2, 5, 9, -1, 2, 2, 4, 2, 2, -5, 1, 3, + 1, -5, 0, 3, -4, -3, 4, -4, 1, 1, -2, 1, 0, 1, -4, 0, 2, -4, -2, -2, -3, 5, 1, -2, 0, + -3, -8, 4, 3, 5, 6, -3, -5, -2, -2, -6, 5, 1, 5, -1, -9, 1, 3, 0, -2, -3, -5, -5, 1, + -2, 4, -1, 1, -3, 1, -2, -3, 5, 5, -2, 0, -1, 4, 1, -2, -7, -1, 3, -9, -7, 0, 4, 4, 6, + 1, -9, 4, 3, -1, 4, -4, -2, 7, 1, 2, 5, 3, -4, -10, 3, -3, -1, 7, -6, 3, 2, -5, -1, -1, + 4, 0, 1, -5, -1, -1, -5, -1, -5, -2, 2, 0, 5, 2, -1, -4, -1, 3, 1, 2, -3, 2, 9, 6, -6, + 5, -6, -3, -5, 0, 7, -1, -8, 0, -1, -3, 4, 1, -2, 0, + ], + [ + 13, 30, 48, 15, 4, -25, -16, -20, 39, 27, 10, -29, 21, 16, 49, -14, 29, -39, 32, 26, + -17, -33, 19, 0, 12, 4, 30, 9, -27, 41, 66, -29, -3, 26, 39, -58, 22, 0, -17, -18, 32, + 41, -12, -5, 19, 39, -10, 45, -43, 13, 28, 49, -1, -31, 3, -48, -6, 28, 2, 11, -2, 40, + 16, 23, -31, 1, 30, 8, -10, -51, 24, -43, 37, 4, 26, 27, -31, 5, -10, 12, 20, -17, 14, + 22, 10, 7, 5, 14, 5, -14, -3, 20, 19, -5, -20, 5, 10, 7, -13, -53, -39, 4, -24, -10, + -6, -32, -2, 7, -12, 50, 2, -3, 11, 3, 20, 6, -26, -25, -12, 32, -2, 45, 12, -25, 21, + -13, -7, -42, 28, 14, -32, 20, 47, 13, -3, -8, -31, -18, 26, 24, 5, 8, -26, -5, -26, + 27, 4, 0, 23, 63, 30, -3, 13, 41, 42, 4, 54, 35, 25, -4, 10, -3, 5, -8, -36, 6, -56, + 47, -17, 50, 17, -11, -29, -43, -8, -7, -15, 17, 3, -15, -27, 49, -14, 5, -21, 5, -27, + -72, 12, 4, 33, -15, 6, 37, -10, 8, 25, 37, -36, 0, 8, -35, 1, -13, -15, -11, 15, -21, + 20, 11, 2, -2, -65, -5, 23, -8, -1, -33, 14, 9, 28, 40, -19, -10, 12, 43, -5, 57, 21, + -14, 47, -59, -4, -18, -4, 10, -62, 9, -12, -43, 49, 4, -50, -21, 3, 23, 16, -4, -21, + -15, -2, -3, 13, -25, -18, 52, -13, -12, 12, -22, -2, -8, 36, -11, 50, 11, 36, 15, 22, + 34, -24, -6, -16, 43, -36, -19, 9, -8, 12, -7, -17, -9, -3, 11, -12, 45, -1, 25, -8, + -42, -4, -22, 10, -42, 30, -38, 5, -3, 19, 2, -2, 25, -14, -7, 1, -2, 0, -3, -20, -35, + -10, -3, -25, -35, 0, 40, -8, -27, -35, -35, 0, -7, 6, -5, -11, 41, 17, 5, -10, -6, + -22, -37, 11, -10, -28, 10, -27, -2, -17, -3, -80, 11, -5, 41, -3, -2, 17, -22, 7, -52, + 20, -4, -10, 19, -39, 8, 36, -16, -43, 30, 16, -21, 10, -4, 22, 8, 0, -7, -32, 13, -22, + 34, -4, 10, 2, -11, -23, 7, 30, -2, -25, -8, -3, 35, 1, 14, -40, 54, -41, 22, 5, 29, + 58, -21, 15, 1, 23, -44, 26, 8, 8, -36, 29, -9, 70, 3, 4, 5, -15, -15, -4, -56, -9, 10, + 10, -60, 7, -23, -10, -3, -8, 16, -6, -17, 41, -40, -33, -4, -23, -22, 14, 2, 9, -1, + 27, 31, -31, -9, -8, -38, -47, 10, 4, 3, -33, 43, -23, 4, 16, 24, -20, 10, 0, -36, 0, + -74, -42, -17, 50, 3, 8, 28, 29, -2, -29, 39, -6, -26, -12, -10, 46, 1, -1, -17, -12, + -2, -56, 13, -40, 22, -32, -10, 92, -32, 31, -22, 23, 19, -4, -30, -23, 8, -34, 6, -13, + -14, -25, 12, 22, -11, 8, -18, 9, -44, 13, -27, 32, -22, 0, -40, 63, 38, + ], + [ + -72, 21, -29, -41, 28, 23, 27, -61, -68, -14, -9, 1, 22, 43, 26, 22, -30, 41, 11, -25, + 27, -46, -20, 30, -36, -6, -33, 3, 45, 17, -41, -24, -18, -13, 58, -24, 15, 20, -4, + -21, 2, 14, 0, -18, 1, 19, 31, 10, -55, 21, 12, -38, -11, -30, 22, 13, 15, -15, -38, 5, + 14, -23, -1, 24, 24, -52, 1, 10, -1, 59, 32, 9, 9, -1, -3, 6, 29, 53, -44, -44, 12, 24, + 13, 35, -4, -38, 6, 30, 20, -14, -10, 3, 33, 21, 25, 29, 49, -48, 31, 47, -30, -6, -7, + 2, -28, 14, 25, 12, -17, 10, -20, -13, -10, -20, -12, 30, -2, 14, 6, 28, -1, 12, -28, + -65, 8, 36, -60, 4, -29, -20, 39, -7, -19, 45, 15, -55, -11, 19, 57, 14, 12, -48, 15, + 38, -47, 0, 16, -41, -37, -55, -7, 1, 12, -29, -20, 49, 1, -11, 52, 22, 24, -20, -9, + -6, -1, 24, -17, -35, -18, 40, -29, -27, 3, -8, 3, 2, 16, 44, 23, 8, 40, -12, 31, 24, + -91, -14, -2, 39, 15, -23, -39, -9, 7, 38, 45, -42, 16, 16, 34, -39, 48, 52, 45, -15, + 37, -19, -31, 21, 41, 48, -11, -38, 20, -33, -28, 4, -6, 1, -1, 25, 11, 26, -18, 31, + -38, 29, 18, -43, -4, 6, 20, -29, -45, 4, -20, 56, 39, -7, -32, -45, -16, -16, -14, + -32, 21, -31, -9, 13, -25, 9, 15, 40, -32, -12, -1, -40, 4, 4, -13, -1, 0, 37, -4, -67, + -41, -23, 3, -9, -48, 12, 6, 31, -2, 22, 6, -3, -20, -2, 21, 0, -27, -11, 5, 19, 20, + 22, -16, -7, 10, 22, 31, -15, -3, -10, 28, -17, -12, -54, -6, -8, -34, -5, -28, -9, -6, + 10, 41, -17, 3, 24, 23, 9, 15, -1, 1, -3, -26, 15, 15, -15, 9, 17, -2, 13, -32, -23, + -35, 34, 4, 13, 24, 14, -4, -3, 28, -51, 9, -32, -21, 21, -31, -46, -12, 27, 2, -13, + 23, -5, -2, 33, -34, -39, -1, 22, 11, 52, 15, -61, 8, -35, -18, -47, -8, -7, 0, -34, + 29, 1, -1, -25, 30, 12, -2, 13, -11, -14, -6, -11, 22, -19, -5, -29, -9, 38, 14, -33, + -32, -19, -21, -10, 1, 42, -29, 31, -23, -24, 53, -12, -17, -25, 14, 34, 37, -17, 3, + -22, -12, 32, -56, 3, 0, -17, 6, 22, -22, 12, -34, -25, -13, 51, -17, -15, 8, 1, 22, 8, + 34, 12, 12, 1, -44, 0, 31, 2, -25, -25, -11, 8, 22, 15, 47, 35, 15, -31, 8, 17, -8, + -41, -32, -1, 29, 20, -20, -18, 42, 13, -48, 33, -3, -1, -20, 29, -11, -1, -3, -12, + -13, -38, -4, -6, 13, -19, 6, -9, 19, 53, -28, -47, 4, -29, -36, -21, 29, 26, -22, 6, + 14, 19, -16, 15, 3, -43, -23, 8, -9, 28, 1, -48, -22, 18, -28, 17, 2, 19, -19, 18, 17, + 51, 21, -36, -11, 41, + ], + ], +];