diff --git a/Cargo.toml b/Cargo.toml index 1ee579fa2..57d92f5b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,8 @@ members = [ "src/components/contracts/modules/evm/precompile/modexp", "src/components/contracts/modules/evm/precompile/sha3fips", "src/components/contracts/modules/evm/precompile/anemoi", + "src/components/contracts/modules/evm/precompile/blake2", + "src/components/contracts/modules/evm/precompile/bn128", "src/components/contracts/modules/evm/precompile/utils", "src/components/contracts/modules/evm/precompile/utils/macro", "src/components/contracts/modules/xhub", diff --git a/src/components/contracts/modules/evm/precompile/Cargo.toml b/src/components/contracts/modules/evm/precompile/Cargo.toml index a56e57b1f..875e9a0cf 100644 --- a/src/components/contracts/modules/evm/precompile/Cargo.toml +++ b/src/components/contracts/modules/evm/precompile/Cargo.toml @@ -16,6 +16,8 @@ evm-precompile-frc20 = {path = "./frc20"} evm-precompile-modexp = {path = "./modexp"} evm-precompile-sha3fips = {path = "./sha3fips"} evm-precompile-anemoi = {path = "./anemoi"} +evm-precompile-blake2 = {path = "./blake2"} +evm-precompile-bn128 = {path = "./bn128"} fp-core = {path = "../../../primitives/core"} module-evm = {path = "../../../modules/evm"} parking_lot = "0.12" diff --git a/src/components/contracts/modules/evm/precompile/blake2/Cargo.toml b/src/components/contracts/modules/evm/precompile/blake2/Cargo.toml new file mode 100644 index 000000000..cc579abf8 --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/blake2/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "evm-precompile-blake2" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +evm = { version = "0.35.0", default-features = false, features = ["with-serde"] } +evm-precompile-utils = { path = "../utils"} +tracing = "0.1" +module-evm = { path = "../../../../modules/evm"} +num_enum = { version = "0.5.4", default-features = false } + +[dev-dependencies] +baseapp = { path = "../../../../baseapp" } +fp-mocks = { path = "../../../../primitives/mocks" } +ethereum-types = { version = "0.13.1", default-features = false } +hex = "0.4" + \ No newline at end of file diff --git a/src/components/contracts/modules/evm/precompile/blake2/src/eip_152.rs b/src/components/contracts/modules/evm/precompile/blake2/src/eip_152.rs new file mode 100644 index 000000000..187bd95b4 --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/blake2/src/eip_152.rs @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: Apache-2.0 +// This file is part of Findora. +// +// Copyright (c) 2020-2022 Parity Technologies (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// The precomputed values for BLAKE2b [from the spec](https://tools.ietf.org/html/rfc7693#section-2.7) +/// There are 10 16-byte arrays - one for each round +/// the entries are calculated from the sigma constants. +const SIGMA: [[usize; 16]; 10] = [ + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], + [14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3], + [11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4], + [7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8], + [9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13], + [2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9], + [12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11], + [13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10], + [6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5], + [10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0], +]; + +/// IV is the initialization vector for BLAKE2b. See https://tools.ietf.org/html/rfc7693#section-2.6 +/// for details. +const IV: [u64; 8] = [ + 0x6a09e667f3bcc908, + 0xbb67ae8584caa73b, + 0x3c6ef372fe94f82b, + 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, + 0x9b05688c2b3e6c1f, + 0x1f83d9abfb41bd6b, + 0x5be0cd19137e2179, +]; + +#[inline(always)] +/// The G mixing function. See https://tools.ietf.org/html/rfc7693#section-3.1 +fn g(v: &mut [u64], a: usize, b: usize, c: usize, d: usize, x: u64, y: u64) { + v[a] = v[a].wrapping_add(v[b]).wrapping_add(x); + v[d] = (v[d] ^ v[a]).rotate_right(32); + v[c] = v[c].wrapping_add(v[d]); + v[b] = (v[b] ^ v[c]).rotate_right(24); + v[a] = v[a].wrapping_add(v[b]).wrapping_add(y); + v[d] = (v[d] ^ v[a]).rotate_right(16); + v[c] = v[c].wrapping_add(v[d]); + v[b] = (v[b] ^ v[c]).rotate_right(63); +} + +/// The Blake2 compression function F. See https://tools.ietf.org/html/rfc7693#section-3.2 +/// Takes as an argument the state vector `h`, message block vector `m`, offset counter `t`, final +/// block indicator flag `f`, and number of rounds `rounds`. The state vector provided as the first +/// parameter is modified by the function. +pub fn compress(h: &mut [u64; 8], m: [u64; 16], t: [u64; 2], f: bool, rounds: usize) { + let mut v = [0u64; 16]; + v[..h.len()].copy_from_slice(h); // First half from state. + v[h.len()..].copy_from_slice(&IV); // Second half from IV. + + v[12] ^= t[0]; + v[13] ^= t[1]; + + if f { + v[14] = !v[14] // Invert all bits if the last-block-flag is set. + } + for i in 0..rounds { + // Message word selection permutation for this round. + let s = &SIGMA[i % 10]; + g(&mut v, 0, 4, 8, 12, m[s[0]], m[s[1]]); + g(&mut v, 1, 5, 9, 13, m[s[2]], m[s[3]]); + g(&mut v, 2, 6, 10, 14, m[s[4]], m[s[5]]); + g(&mut v, 3, 7, 11, 15, m[s[6]], m[s[7]]); + + g(&mut v, 0, 5, 10, 15, m[s[8]], m[s[9]]); + g(&mut v, 1, 6, 11, 12, m[s[10]], m[s[11]]); + g(&mut v, 2, 7, 8, 13, m[s[12]], m[s[13]]); + g(&mut v, 3, 4, 9, 14, m[s[14]], m[s[15]]); + } + + for i in 0..8 { + h[i] ^= v[i] ^ v[i + 8]; + } +} diff --git a/src/components/contracts/modules/evm/precompile/blake2/src/lib.rs b/src/components/contracts/modules/evm/precompile/blake2/src/lib.rs new file mode 100644 index 000000000..69652059b --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/blake2/src/lib.rs @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: Apache-2.0 +// This file is part of Findora. +// +// Copyright (c) 2020-2022 Parity Technologies (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod eip_152; + +use evm::executor::stack::{PrecompileFailure, PrecompileOutput}; +use evm::{Context, ExitError, ExitSucceed}; +use module_evm::precompile::{FinState, Precompile, PrecompileId, PrecompileResult}; + +pub struct Blake2F; + +impl PrecompileId for Blake2F { + fn contract_id() -> u64 { + 0x09 + } +} + +impl Blake2F { + const GAS_COST_PER_ROUND: u64 = 1; // https://eips.ethereum.org/EIPS/eip-152#gas-costs-and-benchmarks +} + +impl Precompile for Blake2F { + /// Format of `input`: + /// [4 bytes for rounds][64 bytes for h][128 bytes for m][8 bytes for t_0][8 bytes for t_1][1 byte for f] + fn execute( + input: &[u8], + target_gas: Option, + _context: &Context, + _state: &FinState, + ) -> PrecompileResult { + const BLAKE2_F_ARG_LEN: usize = 213; + + if input.len() != BLAKE2_F_ARG_LEN { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other( + "input length for Blake2 F precompile should be exactly 213 bytes" + .into(), + ), + }); + } + + let mut rounds_buf: [u8; 4] = [0; 4]; + rounds_buf.copy_from_slice(&input[0..4]); + let rounds: u32 = u32::from_be_bytes(rounds_buf); + + let gas_cost: u64 = (rounds as u64) * Blake2F::GAS_COST_PER_ROUND; + if let Some(gas_left) = target_gas { + if gas_left < gas_cost { + return Err(PrecompileFailure::Error { + exit_status: ExitError::OutOfGas, + }); + } + } + + // we use from_le_bytes below to effectively swap byte order to LE if architecture is BE + + let mut h_buf: [u8; 64] = [0; 64]; + h_buf.copy_from_slice(&input[4..68]); + let mut h = [0u64; 8]; + let mut ctr = 0; + for state_word in &mut h { + let mut temp: [u8; 8] = Default::default(); + temp.copy_from_slice(&h_buf[(ctr * 8)..(ctr + 1) * 8]); + *state_word = u64::from_le_bytes(temp); + ctr += 1; + } + + let mut m_buf: [u8; 128] = [0; 128]; + m_buf.copy_from_slice(&input[68..196]); + let mut m = [0u64; 16]; + ctr = 0; + for msg_word in &mut m { + let mut temp: [u8; 8] = Default::default(); + temp.copy_from_slice(&m_buf[(ctr * 8)..(ctr + 1) * 8]); + *msg_word = u64::from_le_bytes(temp); + ctr += 1; + } + + let mut t_0_buf: [u8; 8] = [0; 8]; + t_0_buf.copy_from_slice(&input[196..204]); + let t_0 = u64::from_le_bytes(t_0_buf); + + let mut t_1_buf: [u8; 8] = [0; 8]; + t_1_buf.copy_from_slice(&input[204..212]); + let t_1 = u64::from_le_bytes(t_1_buf); + + let f = if input[212] == 1 { + true + } else if input[212] == 0 { + false + } else { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other( + "incorrect final block indicator flag".into(), + ), + }); + }; + + crate::eip_152::compress(&mut h, m, [t_0, t_1], f, rounds as usize); + + let mut output_buf = [0u8; u64::BITS as usize]; + for (i, state_word) in h.iter().enumerate() { + output_buf[i * 8..(i + 1) * 8].copy_from_slice(&state_word.to_le_bytes()); + } + + Ok(PrecompileOutput { + exit_status: ExitSucceed::Returned, + cost: gas_cost, + output: output_buf.to_vec(), + logs: Default::default(), + }) + } +} diff --git a/src/components/contracts/modules/evm/precompile/bn128/Cargo.toml b/src/components/contracts/modules/evm/precompile/bn128/Cargo.toml new file mode 100644 index 000000000..520132cc2 --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/bn128/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "evm-precompile-bn128" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +evm = { version = "0.35.0", default-features = false, features = ["with-serde"] } +evm-precompile-utils = { path = "../utils"} +tracing = "0.1" +module-evm = { path = "../../../../modules/evm"} +num_enum = { version = "0.5.4", default-features = false } +fp-types = {path = "../../../../primitives/types"} +bn = { package = "findora-bn", git = "https://github.com/FindoraNetwork/findora-bn.git", default-features = false } + +[dev-dependencies] +baseapp = { path = "../../../../baseapp" } +fp-mocks = { path = "../../../../primitives/mocks" } +ethereum-types = { version = "0.13.1", default-features = false } +hex = "0.4" diff --git a/src/components/contracts/modules/evm/precompile/bn128/src/lib.rs b/src/components/contracts/modules/evm/precompile/bn128/src/lib.rs new file mode 100644 index 000000000..e53bd057e --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/bn128/src/lib.rs @@ -0,0 +1,306 @@ +// SPDX-License-Identifier: Apache-2.0 +// This file is part of Findora. +// +// Copyright (c) 2020-2022 Parity Technologies (UK) Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use evm::executor::stack::{PrecompileFailure, PrecompileOutput}; +use evm::{Context, ExitError, ExitSucceed}; +use module_evm::precompile::{FinState, Precompile, PrecompileId, PrecompileResult}; + +use fp_types::U256; + +fn read_fr(input: &[u8], start_inx: usize) -> Result { + if input.len() < start_inx + 32 { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other("Input not long enough".into()), + }); + } + + bn::Fr::from_slice(&input[start_inx..(start_inx + 32)]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other("Invalid field element".into()), + } + }) +} + +fn read_point(input: &[u8], start_inx: usize) -> Result { + use bn::{AffineG1, Fq, Group, G1}; + + if input.len() < start_inx + 64 { + return Err(PrecompileFailure::Error { + exit_status: ExitError::Other("Input not long enough".into()), + }); + } + + let px = Fq::from_slice(&input[start_inx..(start_inx + 32)]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other("Invalid point x coordinate".into()), + } + })?; + let py = + Fq::from_slice(&input[(start_inx + 32)..(start_inx + 64)]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other("Invalid point y coordinate".into()), + } + })?; + Ok(if px == Fq::zero() && py == Fq::zero() { + G1::zero() + } else { + AffineG1::new(px, py) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other("Invalid curve point".into()), + })? + .into() + }) +} + +/// The Bn128Add builtin +pub struct Bn128Add; + +impl PrecompileId for Bn128Add { + fn contract_id() -> u64 { + 0x06 + } +} + +impl Bn128Add { + const GAS_COST: u64 = 150; // https://eips.ethereum.org/EIPS/eip-1108 +} + +impl Precompile for Bn128Add { + fn execute( + input: &[u8], + _target_gas: Option, + _context: &Context, + _state: &FinState, + ) -> PrecompileResult { + use bn::AffineG1; + + let p1 = read_point(input, 0)?; + let p2 = read_point(input, 64)?; + + let mut buf = [0u8; 64]; + if let Some(sum) = AffineG1::from_jacobian(p1 + p2) { + // point not at infinity + sum.x().to_big_endian(&mut buf[0..32]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other( + "Cannot fail since 0..32 is 32-byte length".into(), + ), + } + })?; + sum.y().to_big_endian(&mut buf[32..64]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other( + "Cannot fail since 32..64 is 32-byte length".into(), + ), + } + })?; + } + + Ok(PrecompileOutput { + exit_status: ExitSucceed::Returned, + cost: Bn128Add::GAS_COST, + output: buf.to_vec(), + logs: Default::default(), + }) + } +} + +/// The Bn128Mul builtin +pub struct Bn128Mul; + +impl PrecompileId for Bn128Mul { + fn contract_id() -> u64 { + 0x07 + } +} + +impl Bn128Mul { + const GAS_COST: u64 = 6_000; // https://eips.ethereum.org/EIPS/eip-1108 +} + +impl Precompile for Bn128Mul { + fn execute( + input: &[u8], + _target_gas: Option, + _context: &Context, + _state: &FinState, + ) -> PrecompileResult { + use bn::AffineG1; + + let p = read_point(input, 0)?; + let fr = read_fr(input, 64)?; + + let mut buf = [0u8; 64]; + if let Some(sum) = AffineG1::from_jacobian(p * fr) { + // point not at infinity + sum.x().to_big_endian(&mut buf[0..32]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other( + "Cannot fail since 0..32 is 32-byte length".into(), + ), + } + })?; + sum.y().to_big_endian(&mut buf[32..64]).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other( + "Cannot fail since 32..64 is 32-byte length".into(), + ), + } + })?; + } + + Ok(PrecompileOutput { + exit_status: ExitSucceed::Returned, + cost: Bn128Mul::GAS_COST, + output: buf.to_vec(), + logs: Default::default(), + }) + } +} + +/// The Bn128Pairing builtin +pub struct Bn128Pairing; + +impl PrecompileId for Bn128Pairing { + fn contract_id() -> u64 { + 0x08 + } +} + +impl Bn128Pairing { + // https://eips.ethereum.org/EIPS/eip-1108 + const BASE_GAS_COST: u64 = 45_000; + const GAS_COST_PER_PAIRING: u64 = 34_000; +} + +impl Precompile for Bn128Pairing { + fn execute( + input: &[u8], + target_gas: Option, + _context: &Context, + _state: &FinState, + ) -> PrecompileResult { + use bn::{pairing_batch, AffineG1, AffineG2, Fq, Fq2, Group, Gt, G1, G2}; + + let (ret_val, gas_cost) = + if input.is_empty() { + (U256::one(), Bn128Pairing::BASE_GAS_COST) + } else { + // (a, b_a, b_b - each 64-byte affine coordinates) + let elements = input.len() / 192; + + let gas_cost: u64 = Bn128Pairing::BASE_GAS_COST + + (elements as u64 * Bn128Pairing::GAS_COST_PER_PAIRING); + if let Some(gas_left) = target_gas { + if gas_left < gas_cost { + return Err(PrecompileFailure::Error { + exit_status: ExitError::OutOfGas, + }); + } + } + + let mut vals = Vec::new(); + for idx in 0..elements { + let a_x = Fq::from_slice(&input[idx * 192..idx * 192 + 32]) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid a argument x coordinate".into(), + ), + })?; + + let a_y = Fq::from_slice(&input[idx * 192 + 32..idx * 192 + 64]) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid a argument y coordinate".into(), + ), + })?; + + let b_a_y = Fq::from_slice(&input[idx * 192 + 64..idx * 192 + 96]) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid b argument imaginary coeff x coordinate".into(), + ), + })?; + + let b_a_x = Fq::from_slice(&input[idx * 192 + 96..idx * 192 + 128]) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid b argument imaginary coeff y coordinate".into(), + ), + })?; + + let b_b_y = Fq::from_slice(&input[idx * 192 + 128..idx * 192 + 160]) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid b argument real coeff x coordinate".into(), + ), + })?; + + let b_b_x = Fq::from_slice(&input[idx * 192 + 160..idx * 192 + 192]) + .map_err(|_| PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid b argument real coeff y coordinate".into(), + ), + })?; + + let b_a = Fq2::new(b_a_x, b_a_y); + let b_b = Fq2::new(b_b_x, b_b_y); + let b = if b_a.is_zero() && b_b.is_zero() { + G2::zero() + } else { + G2::from(AffineG2::new(b_a, b_b).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid b argument - not on curve".into(), + ), + } + })?) + }; + let a = if a_x.is_zero() && a_y.is_zero() { + G1::zero() + } else { + G1::from(AffineG1::new(a_x, a_y).map_err(|_| { + PrecompileFailure::Error { + exit_status: ExitError::Other( + "Invalid a argument - not on curve".into(), + ), + } + })?) + }; + vals.push((a, b)); + } + + let mul = pairing_batch(&vals); + + if mul == Gt::one() { + (U256::one(), gas_cost) + } else { + (U256::zero(), gas_cost) + } + }; + + let mut buf = [0u8; 32]; + ret_val.to_big_endian(&mut buf); + + Ok(PrecompileOutput { + exit_status: ExitSucceed::Returned, + cost: gas_cost, + output: buf.to_vec(), + logs: Default::default(), + }) + } +} diff --git a/src/components/contracts/modules/evm/precompile/src/lib.rs b/src/components/contracts/modules/evm/precompile/src/lib.rs index a44d7b21d..34a6ca2d3 100644 --- a/src/components/contracts/modules/evm/precompile/src/lib.rs +++ b/src/components/contracts/modules/evm/precompile/src/lib.rs @@ -5,6 +5,8 @@ use std::marker::PhantomData; use evm_precompile_anemoi::Anemoi; use evm_precompile_basic::{ECRecover, ECRecoverPublicKey, Identity, Ripemd160, Sha256}; +use evm_precompile_blake2::Blake2F; +use evm_precompile_bn128::{Bn128Add, Bn128Mul, Bn128Pairing}; use evm_precompile_frc20::FRC20; use evm_precompile_modexp::Modexp; use evm_precompile_sha3fips::{Sha3FIPS256, Sha3FIPS512}; @@ -60,15 +62,17 @@ where a if a == H160::from_low_u64_be(Modexp::contract_id()) => { Some(Modexp::execute(input, target_gas, context, ctx)) } - // Non-Frontier specific nor Ethereum precompiles : - a if a == H160::from_low_u64_be(ECRecoverPublicKey::contract_id()) => { - Some(ECRecoverPublicKey::execute(input, target_gas, context, ctx)) + a if a == H160::from_low_u64_be(Bn128Add::contract_id()) => { + Some(Bn128Add::execute(input, target_gas, context, ctx)) } - a if a == H160::from_low_u64_be(Sha3FIPS256::contract_id()) => { - Some(Sha3FIPS256::execute(input, target_gas, context, ctx)) + a if a == H160::from_low_u64_be(Bn128Mul::contract_id()) => { + Some(Bn128Mul::execute(input, target_gas, context, ctx)) } - a if a == H160::from_low_u64_be(Sha3FIPS512::contract_id()) => { - Some(Sha3FIPS512::execute(input, target_gas, context, ctx)) + a if a == H160::from_low_u64_be(Bn128Pairing::contract_id()) => { + Some(Bn128Pairing::execute(input, target_gas, context, ctx)) + } + a if a == H160::from_low_u64_be(Blake2F::contract_id()) => { + Some(Blake2F::execute(input, target_gas, context, ctx)) } a if a == H160::from_low_u64_be(FRC20::::contract_id()) => { Some(FRC20::::execute(input, target_gas, context, ctx)) @@ -76,9 +80,9 @@ where a if a == H160::from_low_u64_be(Anemoi::contract_id()) => { Some(Anemoi::execute(input, target_gas, context, ctx)) } - // a if a == H160::from_low_u64_be(EthPairing::contract_id()) => { - // Some(EthPairing::execute(handle, ctx)) - // } + //a if a == H160::from_low_u64_be(EthPairing::contract_id()) => { + // Some(EthPairing::execute(input, target_gas, context, ctx)) + //} _ => None, } } diff --git a/src/components/contracts/modules/evm/precompile/testdata/blake2F.json b/src/components/contracts/modules/evm/precompile/testdata/blake2F.json new file mode 100644 index 000000000..f6ef8eef4 --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/testdata/blake2F.json @@ -0,0 +1,37 @@ +[ + { + "Input": "0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b", + "Name": "vector 4", + "Gas": 0, + "NoBenchmark": false + }, + { + "Input": "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923", + "Name": "vector 5", + "Gas": 12, + "NoBenchmark": false + }, + { + "Input": "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000", + "Expected": "75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735", + "Name": "vector 6", + "Gas": 12, + "NoBenchmark": false + }, + { + "Input": "0000000148c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "b63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fba551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421", + "Name": "vector 7", + "Gas": 1, + "NoBenchmark": false + }, + { + "Input": "007A120048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + "Expected": "6d2ce9e534d50e18ff866ae92d70cceba79bbcd14c63819fe48752c8aca87a4bb7dcc230d22a4047f0486cfcfb50a17b24b2899eb8fca370f22240adb5170189", + "Name": "vector 8", + "Gas": 8000000, + "NoBenchmark": false + } + ] \ No newline at end of file diff --git a/src/components/contracts/modules/evm/precompile/testdata/common_bnadd.json b/src/components/contracts/modules/evm/precompile/testdata/common_bnadd.json new file mode 100644 index 000000000..d507884c5 --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/testdata/common_bnadd.json @@ -0,0 +1 @@ +[{"Input":"089142debb13c461f61523586a60732d8b69c5b38a3380a74da7b2961d867dbf2d5fc7bbc013c16d7945f190b232eacc25da675c0eb093fe6b9f1b4b4e107b3625f8c89ea3437f44f8fc8b6bfbb6312074dc6f983809a5e809ff4e1d076dd5850b38c7ced6e4daef9c4347f370d6d8b58f4b1d8dc61a3c59d651a0644a2a27cf","Expected":"0a6678fd675aa4d8f0d03a1feb921a27f38ebdcb860cc083653519655acd6d79172fd5b3b2bfdd44e43bcec3eace9347608f9f0a16f1e184cb3f52e6f259cbeb","Name":"bnadd_0_0"},{"Input":"23f16f1bcc31bd002746da6fa3825209af9a356ccd99cf79604a430dd592bcd90a03caeda9c5aa40cdc9e4166e083492885dad36c72714e3697e34a4bc72ccaa21315394462f1a39f87462dbceb92718b220e4f80af516f727ad85380fadefbc2e4f40ea7bbe2d4d71f13c84fd2ae24a4a24d9638dd78349d0dee8435a67cca6","Expected":"013f227997b410cbd96b137a114f5b12d5a3a53d7482797bcd1f116ff30ff1931effebc79dee208d036553beae8ca71afb3b4c00979560db3991c7e67c49103c","Name":"bnadd_0_1"},{"Input":"0341b65d1b32805aedf29c4704ae125b98bb9b736d6e05bd934320632bf46bb60d22bc985718acbcf51e3740c1565f66ff890dfd2302fc51abc999c83d8774ba08ed1b33fe3cd3b1ac11571999e8f451f5bb28dd4019e58b8d24d91cf73dc38f11be2878bb118612a7627f022aa19a17b6eb599bba4185df357f81d052fff90b","Expected":"0e9e24a218333ed19a90051efabe246146a6d5017810140ef7e448030539038a230598b7d4127f5b4fd971820084c632ca940b29fcf30139cd1513bbbbf3a3dc","Name":"bnadd_0_2"},{"Input":"279e2a1eee50ae1e3fe441dcd58475c40992735644de5c8f6299b6f0c1fe41af21b37bd13a881181d56752e31cf494003a9d396eb908452718469bc5c75aa8071c35e297f7c55363cd2fd00d916c67fad3bdea15487bdc5cc7b720f3a2c8b776106c2a4cf61ab73f91f2258f1846b9be9d28b9a7e83503fa4f4b322bfc07223c","Expected":"22f8aa414eb0b9b296bed3fb355804e92ec0af419d9906335f50f032d87a8bf82643f41b228310b816c784c2c54dcfadeaa328b792dbe0d0e04741cd61dac155","Name":"bnadd_0_3"},{"Input":"0af6f1fd0b29a4f055c91a472f285e919d430a2b73912ae659224e24a458c65e2c1a52f5abf3e86410b9a603159b0bf51abf4d72cbd5e8161a7b5c47d60dfe571f752f85cf5cc01b2dfe279541032da61c2fcc8ae0dfc6d4253ba9b5d3c858231d03a84afe2a9f595ab03007400ccd36a2c0bc31203d881011dfc450c39b5abe","Expected":"1e51b9f09d8fc2e4ca11602326c2cfe191c6c6a47874526e80051197e9f6af842282e508ca489bf881e25cf9590151ff5cf94fa523683a0718d87abcc4d4a16f","Name":"bnadd_0_4"},{"Input":"0e6eab4103302750b22364bd1ec80e5edfb3ad06fa175ff2517ca49489f728e9050a17b5a594d0fd6fafed7fe5c447793fe9b617f0f97c3ee6dd29638f6c9232038de98419e242685862c118253ab7df7358f863a59170c37e606d5bd23c742f076ff3443f4e01b7d7ace1315fe50cf77c365d8d289c65303bcc11ba7961ab95","Expected":"2231ab2eee93d63596f718533ddbb95a86b13d39e1162897d791566e797f82952f39ea566bede8e7ba15f3c61b0e96275b2fc51800ee2baf2f9bd7acfa874f0a","Name":"bnadd_0_5"},{"Input":"1920c53c756f1ec1a40e0264e5f65808eafaeaa7b0885f89852297bc2186ac9d09416cc536a27b6d5616f74dd2bbbfb463b9961752e0aa38d47b5213994959ab015296293a5a1bb5e15a7d019787422cb3409e075e122c6fc5867f0c3f3715731782b870b6641d8d55323e27ebaea17909499877fda62e3ac1e2b2310cad5f9c","Expected":"0fa3236565b78b283f3ce63ca62bafb87c33407b11a077e39230ff37c054cf712a38174368bf872f80f78fb5222e95717183242b9d4da75c66243f043aed2fc5","Name":"bnadd_0_6"},{"Input":"001faaf97b965ffa633612b7c8f9f4be0b286b19662e5cbe6878019d8ba1382b16567ced7a7ee5c272bbc378a95c2436fb0c6133649c77e55a708b28419b5cac0750d51706ced69621c8e4ba1758ba90c39ba8b3b50507bfa545ace1737e360e283d609cd67a291fc3d720c5b1113eececba4ca31d58a1319d6a5a2fa89608f9","Expected":"044fe3c480840e5a8f544efd28a8bf3246f0741a8c61c3116e93d84773399c8b26c5b695120cd724aa2a5f4dfd3042c07f752be4c4a8b750398109d80f4772eb","Name":"bnadd_0_7"},{"Input":"128b65cb80257f3006fc20dbb6af6781da7e0f9213d2b909fd113ee0f2d2bb52251e288387db7be742fe67261f36a4f09eeb4763bbbaa1bb13af3dec65302a4115f64edf27478045bf45eded285544acaa7f2b3a2a36176acefc1a3d7181a73219d4344489688c2a2f16caf1141bc42021738339431b3a64cfbc293a73c1eddc","Expected":"0a20db61d2b74384ca184f20455ad1f380ba081f89e41c87ceb3fdbbba63c7aa1fbda20003ec799f306f70df7f53f91721e59353013ebf1647f5130903fff482","Name":"bnadd_0_8"},{"Input":"16a9fe4620e58d70109d6995fe5f9eb8b3d533280cc604a333dcf0fa688b62e20b972bf2daef6c10a41db685c2417b6f4362032421c8466277d3271b6e8706a809ad61a8a83df55f6cd293cd674338c35dbb32722e9db2d1a3371b43496c05fa09c73b138499e36453d67a2c9b543c2188918287c4eef2c3ccc9ebe1d6142d01","Expected":"005a68cc13a108287aa3ca0bd8bef95096ef22668e15c87f7cbe0167cd1cdc930359b9b2dd28843838cf74cb4af2cfd656690a7f73de771b891142db22fa61fb","Name":"bnadd_0_9"}] \ No newline at end of file diff --git a/src/components/contracts/modules/evm/precompile/testdata/common_bnmul.json b/src/components/contracts/modules/evm/precompile/testdata/common_bnmul.json new file mode 100644 index 000000000..d565dab4b --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/testdata/common_bnmul.json @@ -0,0 +1 @@ +[{"Input":"089142debb13c461f61523586a60732d8b69c5b38a3380a74da7b2961d867dbf2d5fc7bbc013c16d7945f190b232eacc25da675c0eb093fe6b9f1b4b4e107b36ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0bf982b98a2757878c051bfe7eee228b12bc69274b918f08d9fcb21e9184ddc10b17c77cbf3c19d5d27e18cbd4a8c336afb488d0e92c18d56e64dd4ea5c437e6","Name":"bnmul_0_0"},{"Input":"25f8c89ea3437f44f8fc8b6bfbb6312074dc6f983809a5e809ff4e1d076dd5850b38c7ced6e4daef9c4347f370d6d8b58f4b1d8dc61a3c59d651a0644a2a27cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"18a902ac147b2951531770c7c18a25e3dd87765e23f7e0c4e9d62b624a6e37450288473776e7e99b2aaa27e8f4656ea9ce5e634fd1ca1aab45315199ecaced2e","Name":"bnmul_0_1"},{"Input":"23f16f1bcc31bd002746da6fa3825209af9a356ccd99cf79604a430dd592bcd90a03caeda9c5aa40cdc9e4166e083492885dad36c72714e3697e34a4bc72ccaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0c6a880ffdd0737c53bfec9b65c9098a3298747bd4e5fd07026661b4cb804331116aeec88e11f49753df224c60c4bd8b8bc0a98b8d50f24ce64475268d227f4c","Name":"bnmul_0_2"},{"Input":"21315394462f1a39f87462dbceb92718b220e4f80af516f727ad85380fadefbc2e4f40ea7bbe2d4d71f13c84fd2ae24a4a24d9638dd78349d0dee8435a67cca6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1d7985d51e53cdfbd73b051e9a74ab6e621b6b664a7efed00e30c1264f5623d02808eee3baec187160d2499b4aedbc665a532d245212a1be61e0d4b9b36f3075","Name":"bnmul_0_3"},{"Input":"0341b65d1b32805aedf29c4704ae125b98bb9b736d6e05bd934320632bf46bb60d22bc985718acbcf51e3740c1565f66ff890dfd2302fc51abc999c83d8774baffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"15bd6ea71fd264e1bfb04eb6d97b4f3686c5bf36f91356fc13ddde3494e172d90b3f8392fd4cdd5d542887ea4ee0274835bf37b58edf927ef242b8704af52e92","Name":"bnmul_0_4"},{"Input":"08ed1b33fe3cd3b1ac11571999e8f451f5bb28dd4019e58b8d24d91cf73dc38f11be2878bb118612a7627f022aa19a17b6eb599bba4185df357f81d052fff90bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"26ec73a6134f8ebce33d675e1f2e6ff3ec066e8d255ffca6eb55ef2ab7c5c51d06500cfcd6950c92de24b90ca09be110f8f9c2fb4d9cb2a9f9677dd81c1c0607","Name":"bnmul_0_5"},{"Input":"279e2a1eee50ae1e3fe441dcd58475c40992735644de5c8f6299b6f0c1fe41af21b37bd13a881181d56752e31cf494003a9d396eb908452718469bc5c75aa807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"06894837c70570eac651dae1a443b830c292c1801340ca4150c9d339177965e509ad8d4839bc83bd1852e6a8b71dcf01a1f7d6b6b174858ca02893bd5ace3eee","Name":"bnmul_0_6"},{"Input":"1c35e297f7c55363cd2fd00d916c67fad3bdea15487bdc5cc7b720f3a2c8b776106c2a4cf61ab73f91f2258f1846b9be9d28b9a7e83503fa4f4b322bfc07223cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0e56eeb3f168767b21bce1489d9657f694951b25ea8a081f4ebf68469a1eb1e0293446d763ea9c40e52286f2ac504cfabb364b1f899b874b13d78879d25a5ec5","Name":"bnmul_0_7"},{"Input":"0af6f1fd0b29a4f055c91a472f285e919d430a2b73912ae659224e24a458c65e2c1a52f5abf3e86410b9a603159b0bf51abf4d72cbd5e8161a7b5c47d60dfe57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"2f63f5f1275c401356e94adfbe5e8cff21485a9281e55d378a51eb93263a40802a817491a84e40c584481df4a5085b301c6fd66cb97856de55cd04df85a6a1d3","Name":"bnmul_0_8"},{"Input":"1f752f85cf5cc01b2dfe279541032da61c2fcc8ae0dfc6d4253ba9b5d3c858231d03a84afe2a9f595ab03007400ccd36a2c0bc31203d881011dfc450c39b5abeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0aa7b6fda656f23eab50e36db0519cdf79f4624d417253085907ebfd9aef38a414cdd2edce2b313fc6dd390628ac9fac910841706d55f9af2a064548694dc05c","Name":"bnmul_0_9"}] \ No newline at end of file diff --git a/src/components/contracts/modules/evm/precompile/testdata/common_bnpair.json b/src/components/contracts/modules/evm/precompile/testdata/common_bnpair.json new file mode 100644 index 000000000..1f42ca54c --- /dev/null +++ b/src/components/contracts/modules/evm/precompile/testdata/common_bnpair.json @@ -0,0 +1 @@ +[{"Input":"089142debb13c461f61523586a60732d8b69c5b38a3380a74da7b2961d867dbf2d5fc7bbc013c16d7945f190b232eacc25da675c0eb093fe6b9f1b4b4e107b3629f2c1dbcc614745f242077001ec9edd475acdab9ab435770d456bd22bbd2abf268683f9b1be0bde4508e2e25e51f6b44da3546e87524337d506fd03c4ff7ce01851abe58ef4e08916bec8034ca62c04cd08340ab6cc525e61706340926221651b71422869c92e49465200ca19033a8aa425f955be3d8329c4475503e45c00e1","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_0"},{"Input":"23f16f1bcc31bd002746da6fa3825209af9a356ccd99cf79604a430dd592bcd90a03caeda9c5aa40cdc9e4166e083492885dad36c72714e3697e34a4bc72ccaa2e832e2bd419280d247658bb64323d59bbf47df41aa729d2168a272d66e306ff18ab999098bc5b30758183a160fcca776562d9a9370278aee9e6f71053e9358f0edd6252e0584efe53db6b3c40d1976d3849f08db15d39a0d7a6e327fc67f45e24925638e68e59cc22218917c61d2934c4e6353e2f62178a09627aed68c4e57a","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_1"},{"Input":"0341b65d1b32805aedf29c4704ae125b98bb9b736d6e05bd934320632bf46bb60d22bc985718acbcf51e3740c1565f66ff890dfd2302fc51abc999c83d8774ba0d2c492bf135ed45b0d6265c274d145d35b73afd41ee95d3f1da4bc8761038800251d138db1b9748ffc257b147a1aea66413b14df767f98f7ba02489c617eae51065ff2bd9a5b167db36225a35fd712d781309f4e2c8541a335b2c42bd2bcae4191cd528d749c52f3e198e534868d537867109419a32314886f6bb2bcd337773","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_2"},{"Input":"279e2a1eee50ae1e3fe441dcd58475c40992735644de5c8f6299b6f0c1fe41af21b37bd13a881181d56752e31cf494003a9d396eb908452718469bc5c75aa80728695310187ac477bdf3d7fb472e6374b1222f8ebcfcae72a8b1dc714ec853461fde556a4ef408d4a2ce89143674e9985eff87fa3df3ce6e7483c3a2f9b82bcb18df8612ef09775ec815b602e35eb6ec71ea6f7acebdc23667a60eb465e76d590500f7d19190ee1090bffe087045e97c913f7c5730110559665b3e8a9e0a526e","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_3"},{"Input":"0af6f1fd0b29a4f055c91a472f285e919d430a2b73912ae659224e24a458c65e2c1a52f5abf3e86410b9a603159b0bf51abf4d72cbd5e8161a7b5c47d60dfe5712fa10f98bc3c4faa2a9729408e92a8b4e6d304abc539cc396820f696f23ecbb2b30d01fe71a3550fa6780e70305d28ea686b72aff7d23cd550f886fcd60f6b30d1142c81b9b27e329c498e4b241fa2ab0e0c62170cbe2a1e642589e4ff6ca54069ec036f519726e40596ede6cd47577c5cc24746754280add50bf87fe7404c8","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_4"},{"Input":"0e6eab4103302750b22364bd1ec80e5edfb3ad06fa175ff2517ca49489f728e9050a17b5a594d0fd6fafed7fe5c447793fe9b617f0f97c3ee6dd29638f6c9232068b38fd28978b73b64592127317a542e084ea8291e404b88d3a731207104f9624d1ae64196a7d3b8e9fdcf72f9dce16d649fa3971daaca56405a0d331e2aa92210a32dfe27a36ca740e4d668066f7559acddea850fee4ebf9c9a241b337e771191a60da23a028dfc3b3b82c3d15802615f6386f29194e088936e3ffe96809eb","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_5"},{"Input":"1920c53c756f1ec1a40e0264e5f65808eafaeaa7b0885f89852297bc2186ac9d09416cc536a27b6d5616f74dd2bbbfb463b9961752e0aa38d47b5213994959ab081c536b7d9a27636d0af7d4c8dad2e380cb2996a1d650a2e6123224294a6c86039e75a4a93bcc2798aec714e37b9b2602760e7ec7c6f3342e44018f2986da9b2d1ceb9ba9f7b923459d8b4701dfae12b3efd4174fa3705747fba6bce14a87720c15d04d2bd099f86ccaf9834b9588e88fdec8d04bba329d4fed580884f4b2bb","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_6"},{"Input":"001faaf97b965ffa633612b7c8f9f4be0b286b19662e5cbe6878019d8ba1382b16567ced7a7ee5c272bbc378a95c2436fb0c6133649c77e55a708b28419b5cac0c37556712bc94140738212a1372a4720ff269102f3f0dad4493b675a85463021e03f350aa8213bd6ce54987e7b32275bcead9a9096897b5c7dcd5964a17e07a2550f45b84e947f8e46267041f661de0ced333f91af090435c4bd6d9cecb4836096855fbc396b73c589e66ad989d7851c08bb55755f5771987d91925ffb40c2f","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_7"},{"Input":"128b65cb80257f3006fc20dbb6af6781da7e0f9213d2b909fd113ee0f2d2bb52251e288387db7be742fe67261f36a4f09eeb4763bbbaa1bb13af3dec65302a4125ed8b2035e437f057cb45003f1c25510d7e232c7587581bdc3035064a96d2e32293733bfad88afa5adabcf320f055e3fe0d1ae733dc21f5e08fc234029be16a18414155506a4c287ac374bc28635be3e6b8fd0097554db051a45138f0b6140410f8c1e8992d53017580b1b806cd23729f9a2aefc6e60bb82606551c1393750b","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_8"},{"Input":"16a9fe4620e58d70109d6995fe5f9eb8b3d533280cc604a333dcf0fa688b62e20b972bf2daef6c10a41db685c2417b6f4362032421c8466277d3271b6e8706a8034c462aaaa7a3b4ed1266d755867524258c64b9553c46b2bd4d5c26aaedc66524e9d39a8749083573a1b84662c08ae15f16b75b9fd40089ee412f5e58dfad350e28b1c6e881a288290c7e9e12d23f122e61e89c43619f902c48d300ffe1734b014f125c1960a64127a16c8a17da5f21721e47b17575a94802a78711f45fe988","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_1_9"},{"Input":"1a4db8abfea95acd4ac4bdf3d9082de13dcb9b2a73d6aa98a296a7d7d1009a8a1e8a143f9ed8661a223e211c4f70b1ac1d5057d71e31f182637b6f26de9a59190e817e9fb476d397b0f09aa07d290cc830ceac3ef815c5b8f45caf2cdafd90e209888f93aab917c7b6a9f8ee7174ff889961ff3509256873a774926c0c5b9a0f1005b845c9f53465d9371efb0eb934ecc8db144d466eaf06614e89c77305c35501951dfd5ce7f374b05b2b2a0737a5251ce4d9f53f0ee7fe79399aa09d6bfe9414e57a7979f8f2d78a1c7dc790476265240fff65e18344caa11b0698a574d4412bb862b7c0f8283e05e10a9b6e3bd19e5b69f6988b3f470692f26c379c33132126a4d85b3499d830033f0388c18b8e7b824b5b0b57db1fe366a435b0c1a53c6000ed1afda982e3f8d71da60ede43dd562ae63597ec91b1cba21e1c9fd5b8fbd81795c6b9f6debf45b77638122c7333a59aaa2e7511f526f496feb84c20f651552581dd3c6f3d05c78234b559d784f502fa5dc0900ae7475ba88716e5ac3d499d","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_0"},{"Input":"1fc8f5de35d75e7446ef5703dcd7e07ad682030dd525b7620e1f7f36908d535e151d3453db1029bf894b5bded388d6a3fcf97d573bcccf93d27456ec79d9337d23ec8c4d66276cb927175d7bc25e3bf5a2252c4f83de5eabd695181834c67273017bea94aade8279f9b646a2e7f570a88aea7eb8bd51aaf40dbfe070a7228a5d06652252d3e68fc6fd6d76cd726513f0f757783f415762ecf16fb288ea9b10252a6ba1abfff1bf53aef31d24fc7d7c18d452ff529a04bb97e2aeaab748cc19762032882547249177d5cc51a46852ebc90ac17f098a3deb8dd8a37fd007bc2baf28714b756b948ac2b606fe0c4c1c3572423892040e5518f9e6abe89e7b1875bc25cd06956892564bd5e9e8557ba6c719e2ecedb4a4996817a8e77593af1321050b2488820e023afa5734ceab7072083831db2f7063cc57cd9852deab6918ca9b00b22e3956983827a599218890be78a3c0ac7f30d3a35d464a9cd4d4ef552576221f5a9cbdba030df39ed692fe2274fe2a99fda883aa4e724d54d6a0f74e0a89","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_1"},{"Input":"0069c0c3d6aa9ca250e5bd3e2826e47936b6e479ad7c776caa5ac801dd5a1c2115226a94941ba68cd74c5b982235773c3a9cf6a71b1dc9d4d8307251f1d031c630316709df5c7f6af25fc5f698db87b1170fdf63bd2917bc21b5037452053dd30bec8492774364ac6ceca4b56b9b8d1aec0bcda12943dd1437e515fa7fe5bf8000c0e3fd9719382c09eded028cf0c9f866d0fec2fab515f6aa60249557270f2e25f0d2cf69c495554a426914354b553f3f6f269e0d5340b2593a5793138189ae214aa7d305903ecbdbc10d564e1ebc9455bf0e8aa3ba3321f8b9023b911cecab19239edfaa2efe905d8a5d6884da42815cc84b13d9c4fb3c304cd99d3d27b61e15063c61103bc76e80aadf05a3ae6a36f90013bce43fdb48bfc8e3e2e09f838d1dcd88fe88d48dcb4d6401442b46fd713c41d36dfbc50d8dad834a9615fc01581377baf2e5ec86b4bfe2123c9f1d5cac10fe0a79fff333ac86ebffe1aabb98252316b9995e22925907421897f44ffffa963b730c7edad138f41f54652ddd8c30","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_2"},{"Input":"240517a373fda7a2fef6ee9e9895505545c354433af3d3548b8537abb10d445c12e45a8b8c4d7a82ae27f0ffe3dd976b1242b040b96043ad31ce9f2ffa5bc707275ec5565ec4ccde5088b40c57c946be5d48b9ba34f956611ec87ed33d47500116f3ff1c54f920a4ba438c43501d2ef59e7c7eb2f8ebde852309bbfbc087af1b1742abd3e12ea49804bc4e8e59ecb9da6789392b1e12958ad653ad49f3d4d8450a1190ddff2fe9afa9dbea1e42222afe9715e1bced4e7ac4c20d89476ed6253c0bcfe3f03313340fd392b32bccfcab83f942f6b13d71e2a3159239c61c50c7bb199c36728784b46d5607ebd7cf5a055a3db4458ad6f0fb7e826d6a280daf625d1db3a467a1de6f3b848da16893902bb07fd0b63f6509dacae6693c7975fe09940b291b95276b136f58cf6f899cbb5a6f4009a4d069be6c0f8f0d6bfd7c38991f0e46dd20f14881ed44b216b44ba054b1f32c61d01f33326ec7f6c2ace3c8901414f211e03a121fcbb34f328205223d7f7ddff484efdd5d06e8886f2781f8e549","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_3"},{"Input":"15848a9e99c4a0719df209a705edfa52bdca729d0b73a9835880da9dc0cd2ace108b1a4ceabe6a8ba3dea041bb0dff513e7b99057d4b3c2aa378807de47dbc3627515ea8ee84feadb86577a1b7553b2016cc63807de89fcbc05bc3d53b0f23332872f837e4cde9fbf64bdd170d6488a3155bcd5b1fef4fa7ad10089bec8ea7b803713c878e32a49ff95dc2bbe7b1491c38258835dbca14ab343e88dc64004dae0f9ec7e3c20939b84e40bf66864e8129742feed7e1291d752c76bdf28e02d03b2c48bfe10367b611f37ab5847542df1d30baed8abc5380d6d80032d0e04af0d10e119d730f867b4e286a3c1c4cd04236999b9bb94d9001a4f144982d72df407d059e6ea753e84de7e8b41b2d0dca1cfb6b12afeb2564a5e24a2064f1b662a1a912e0bdf2470e896d7fda45c39a66c5c4a5297b4f19810ee37e33f7f50499326b1f70831beccc3eb5fb719d27f111e5c731cbeb4002519a4b3831ba896cffb608157b59ceb6f7a0518df929eac70c7bac9ef9c196ba21266ff47cee9bb0c60864","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_4"},{"Input":"08a66cc423317e9d9560c307c7918b87672f3d99effd28b1d2bd2877e09fbba41a58977974f56dc522d159bffd0099791d207d2da49ee217055f5d0806e2dd0417b523e87e1d03b9498facd5df95cd85affaa681c2a43e51497997aa916318391835cc25b6a0979581ff7042a390a7315d8f5e938ea40dfdcb24822889e494cc18dcd8bedefa1c477913634203aa21a5a926595f62f4010eb3959d51acc430fa23ff858e75bc56f4d5054035aee0fb7264ecc4861ba1c44db81868108dcdc4dd099b58d1c3d880dda20c24def1b2c54cbb20ed9da85265983a00c1cf1facfcf903e39662a649ddbc4fa6927ed85694167b49ee5787bd755a5e4ff6fb82c32a9f20b8ce350fdb30744dc3dd1829ce8e7365a9ca56bfa4f79831355157a73fe99a17a534a927ed0e6cdfe9ae9befe94f581d20a4f19aa54c93149c95d53714c5a70771d55a8c477c0ebdde254d19e591fc3ecf011848276731a12a96a3267c5c710c76eb36abc43ab4d4b5a7a82770304fc2e9487512493dc5fd59aa6eb30402d0","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_5"},{"Input":"08808ba03b1abc4b870cd2e50b3960e85ea4ffde76e97ea70e62feb5712ac68823f1f949786f8cf8a18323bbad75bc71afac4e2419181fee3a627a8980f5d36f243b9ecee8d6c2f2f1b91980e4f7136d16f70c94c5fdc21354adb977bc66d748207322b7980616a6e4f4ddc3f223c52a9a11b785298b69f4075349274adeebb21226d7ded357133a1e9a8472f9c0f23e248c1ca1974ae336f4316731f1f473bf00b29428be1694c86da00b5cfe677c1b3332c93105d18df718f9ff0053bcb7a620adf7f96265baa9a9b1512eb1d59834eb931491d360408061135a8b30ddbfdc284fb8dde65089a6359a11fc8d2725409e2bc1e52141f1dd38bd56d10015346d0aad6b6b34672e8ffda5085e97e2a7f82ff4e3e6660b83e151b778e2dfd1ef3f14b07ac31c0927a5cb27b0447051f1ea39baa7ef12572b9b5dc535ffa28341a220dc6c1d760064168c59b36eae9560df6433eb96acd58aa88499ac5f081eed30245b974d3078709e037860b2970943659596a88d529a36275b34b38c51ced169","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_6"},{"Input":"198f03850c2c5df1bd5601c0a5cdae3cc955026dba50a79dd00aeefe49c48c252ee3bce85e4c7bb10fee21428a8b0c1328d662e152f36a6c62caaac2fe097c0b0c91b38273eedbc873b2172cce9eaf7af1463cb3fb064a49cff2dc95f0b5bc1224a1a5e52496677b5dfa29a4e314d7b32bd22c0f437679e12d0c49c9d84e988014d4d06a717737c0e36767b06809bba6bcda2707bd652b3f922c3a652dfc90b325d0de555188106e9c4bd93171a8377b9d53eeb93b0b259a91c7ba570591f4010f2dbb4dfc16b4fe806d2ed28daf51530d6b88a81c2ffb98d3a6c1153db9239421b7f52300ab7b6eb9d9ef4bd7d58811909cf4c4ad7a9f8546f56099eb6ae1370224ecd4af7d5ec18e5b0c8eb46a8bc774fc4ac6c4233aafe9bf22420ddea4752bff288e58f4bc80b1bb91b450652c120db2ece783788b8ff3beb20b2e8d3c7a2d90a5dc703456ffb854fe3a746143e82bd8e4aae8321ab59a93e5da9d615ede07f9f33a0a234486c63562fd9b27ee6615655b6880bd511475059ab40395d23c","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_7"},{"Input":"2722ae33a1d80f67a5da37ef2b7489dd39b1c98287fc408eb416e37de71bba1c3054f7ce76b782aa80254ce991fd5f115810e8f8f57ed0a12f30278112157c11165fa63e0d077c2b406c1001da54664d756636d6018616841c5b0d942519fecb1090ad3ca54838d2b89c0d2e3db3c2aff811d58bc32881d2ec947f473a8308a615b9fb021f60b7604ef07863fc6449504708718eaf59bd00f3620a9da16ed8830a95e72b8b56d1850126d77ddbdbd376e3b19f07a75071f0b958bd40471fe6900738bd659eab6973c3416b9e7c9660d341e8eee184c0f9c5ec59696f220903401e37dd4714f68da2a6affcf65a8cd26c7ae3fa0c0e5a3394887ceaebe4f49de90b501640d9ca26d1b466a9ea005b942b047fb519865b3413ccd90533d9902a85187c1fe325590f77ef42af537664469fa950986ce82c31eeaf1f6b348a3de3c6202ae189a9bf004bd80b9d8bdaa9b395a5263735242766aca3679ec3e547171b2a06ce9550542e6246331cbf852383c14830931cd63ededb0f21621b71e7f981","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_8"},{"Input":"2bc49f4d8134cf72ce0883c589f4f6f0636db174b6176e063b3effdd57e3404309f61eba66408ad541dac082701734d6e6d4cf6f90bc0e65d6578f2d18563e221eb59aa8d8a9187b0857ab89a453fc53209855b300377bbca411998bdf9aa6730bd2384fa0ad96fcd1fc6c1a1a1fb80d4859770ca91b9559281736cfd6745d011cb39aee49da07d70b0f579101c412f1068ea82671859f09c4c1cb3ae74f8cc103fb73a573c8f147ae15610e4f97e291bcfe16556842e00e88ad70db0df2dc3a05430e574064f2d1de68795706bf99b1b6079a99bda3e5ec266567f2f9246e090f5976710762dfa75253c53ae1c2c88523ff08d0c2523d9409033aa2b7e4392000036daaeef66504945efa89111745e29d39ac317d798bbb1d14f84bdf5bfac91134d59ae245678087748ccfd3c65ecf2db2d05595cd6ed8452346713768c7411ab6efb518910157009fdc818e5d4e082da02f0618f4a3d6166f830b81a4e683023ad24b09b49bfd967c7adbe895811172f04a2b90b1379dac89a6fa1a91d8cb","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_2_9"},{"Input":"03d310db98253bb4a3aaff90eeb790d236cbc5698d5a9a6014965acff56e759a1edc5e9ae29193d6e5deed5c3ac4171cae2da155880cf6058848318de6859ea21ee564b4d91e10d3c3a34787dc163a79bf9d571eeb67ff072609cbe19ff25fc7270e094c2467dcf6ecf8c97a09ef643cfff359cbec1426c5eb01864b5cf3c27309f432f65daced7c895c3748fa0b0dfc430584e419442a25b98e74400789801210fa7bc208e286ebea1f5c342a96782b563a0bc4cdb4c42ba151b9cb76eea93d0abcdaf6ffdf0cbf20235077c7bb3908b74b9a8252083f4b01dcbe84cab90fc71a9681988a15b7eea9ae8cb0c2210b870eec2366e0531c414abb65c668c6eb3e21d0be81c5698882ee63cb729ed3f5b725d7a670b76941ddffff9ddca50cf9af21e61a0ac51a17c0128baa2cda8f212b13943959cf26a7578342c93dd2de7deb194e408b546197d9ee99d643e5385dcb8d5904854d8a836763ab8ce20f9b5027222aced81c808247572971b490eef1515a49f651f7df254de2b35310bb5b78c218b2345c40036ea331bfcfb8536739a5e5530027709adae6632a3613cd0838cd204121beebd54ec6bb063ba5a6d84eeceda2a733260066c90d332425e992ef6c2b0f794d64952d560a422a7ff549a58bfaa0cf791ab6dfad1c4941e19078040324bad1c848f2d8efcd716f7d814c46e2632e74a5b8d455a64c55917b220aab982ed4bbed5f80fac726f4a95789fee7905eef0a241596acbea4268ec3f2b87f3129563b69a30c11a856f68c72f129988e8636c86f57467cba299cdb4917469b49137a989e5d714b4b882d4a455600940ab63b14f23e7934ddd62cf5181099c63b2f57525eb3d19451024a4e71ee09c72c5b7e0dff925001acaee126bcd29db5f600d8ff46230e348d08dcbcdb1f85a5a43aa7b4f51841f1d4f98c18bbb57651982cabdf6326194120727367bdae0b081aa7da12c8f8c6af0ce27d2f8d0f059fe1240c9c5a6993d344744d77bbb855960b6704e91846cf362444bff1ccaf45a7c217873a5d7834d0c1d7d9bab5f9934d7ac218834aa916d459d8ceafc280d59efb","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_0"},{"Input":"2761d967b3f2481435189a94502260dff1044c8cb24ea3809d0eec28cfdbf6c72c87711eaab02bf1f9940d504be3727789efbbb1c48370f61e2e4daad31be6de08a73a943ab3a7ea19633a4ef9e9bc1de68a51d778e41589504b8fb0818cdf88064eb3b5d1a63404e247cd5118a695b3b85d63e89c8512309d591701596f172a210f847e73452b29da165f6c76462f2ee76ff301b534bb0d2f0f7374b041e15612a910ab4044ec261965b917059383b5d5f5c9eb201eb61a6909fb5a610849aa1f4535e9a8bf16a4a4435004b8ab3a84bb6495a0d748ccfc25388832356732910e2936a799b55efa690fd821a3cb4d352cbb3f22ed5fe865f984e289329ca6591e4e4510639258f836e30c422e3a18fb76bdc121fd28ed77306a05b8a3299fec09decd53dc1620f84154fd333da06556e87fae4463cf02459964412fa50d4b082e0120af9b40957fb7ff0dd412f59cc0acc01c49021389cd470dec453e92faa3221680f87a61c96fefc9ada16473b853c4c92a03e1e38211a9487a2812f830760f4841710cf252069ea39d70793aac9b2f769a3954310546fc15a109f6d057d30f01c88e34c9ec83f28674534aa8ad16f61b744b293b63ae3c2fcb178a08408a1780e9ff8f2973152194ebd44ef8b158470d3f67d08425c7a9d99a4f1ee9502704bc22f9c0177342d11e54a0940cd9b51caa04c762f060d5262b5f31c66d088729dcf02930b56cf1a3bcdd147cab2fcfe913c53bf5456dc19edd706ad2122be5129ff68c503fcbe10cef00f314919b033000f43ca563f92e95a8a9dc19a867e400d5a976132900579ff4d8e1f64d86a453d7576e16459b641d574d2d9af32c0707107329853a55152341e8142e6bd97b51118d4777e44d347a3add4f6e73a6d52c0175507a0d4432b6a72508a8fe5838a14c953bb0a8834366aa0ace3a1c12a005e64fcf94cadbc98cb78a5f768409a1cda219c504f3c0e99d1e8de93601046528ceafcc22a3649dd0270094b4b3fbe55fae668028e67a8dc3378fb726cec2fd0c3322db4dccfde2f638c9e7cde93246102e9539f5ea6bf23e57bb3f60e8690e","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_1"},{"Input":"28d6423856311fe86c30fcd983dfa63c95bc5adc1dee6fe0ad715dbe7bba3c091165ad57bbd71dba3d734f446b3a11cbfe5e02051f6898a677bdda5134738d5709661289bdac8badf175790f8e406755b33e54bcd8149e1e469de37447185f110efd4f6454886db697584e85127bf4826304d0d9559195b6d3f875cad607958903e94e1ca8dd25c626e31daf9cd26b3caa7ca2615690127aa11647cba037c92a20179a34c869f27fe9783e133f50fcc38bfb81200b9c635d0b9bbbbc789f4cb60511e5e1561aad84bba3d2495e4853046ae1972e687ccab832f34f19fe9b55db11d42ecbbbf14d945c29319a9a945f64610a2bb9059c0c89911556232bdc6c4b1e92ef35b5ecc024193888d764218828778507233cda5076633acd49986023ba1c0110745aacf972ffd66add373241c8285dc6c96928a6ca012b4e572f1897540deab5945fc017e575d40284abc7356a20bb85330533be288d0a14159da44efd1fc7bd3676093afa2c2d809cb5a14b913c5914c77b341f018f391cfecf0029a2090010e0c084f8c16f8496f1c6db02902cccc6cb8d58118e8dee1baaea679a370075a1886efcc99523c8abf69974f742c7d2de3e12598a963713b9bbc31a9f0a14b98584a1aaebc7649c481668a54d9da6fcb308f3dec33e0965775624f2f904298d6b7a0d04b3a217099a7daf390d5a7edfd72b1c8aab02e6f5cb440cd4a84214772064081adcf6e36148eec3bcbbbd12d363b4a76e7018159f559c2ff1c0d8051f9f9abbafb9032e3c95ebde21931a554fab74bfd7f3d61c939268c46ff9c82ffc5143ba27c7aacca19326cd8522f9d55e6b6d17d4b0586b81d86e76dfb9730782e23592d8d735517d63b6b51313e09681bfb6e66cee098ebb60ca3ebb18f80ddd80135c76e5e26ec2d004f572d267f940a5d5b82e35f4df366312e39387662343e67b7783310ea825278a262dea12bd5b1fa71735819e3e360f467d0af5f522234b4bd70b251d63a8dc9bc9e63117ca8342c3dbb3068df38229b5b34f2bd21097b0a55ece871e554a89aa97a7ecb95cd9e1f5ecea94274019d17b9943de13","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_2"},{"Input":"09fa51b9f1972a041220b86a762c252262d942474d9c2ddaa8d292c79d34b8132771b3f3a480320bc7c9963dda5f4e8120b8f06a0cbc6095d37e0dbbf0b6f9ce23d0c74ab9b983b35311ad334580ad3e9b8ac6eb0ccd69a5097884056c8310e01317cbe87801a1bad8f362bfa07f65f4e6f0df7f1d3681cab1995df75f3caa2516abf6c2348309a172dfb07485e59d4b149d20741c740c9379f5d235c8b7dd922fc0496ddcb63fea074ce4aca7f9a91884b8f3158970ba3f03fd58608b50b7d511857f4a462fb73fa92204c79e81824de2825b74103238b4f8e601a2cb37121303b531c48bcf5c8ddf8e608cd16eef92bec33929ef4d8fe57572214999746567129e8547b1d2f8103bfab8af9a8849ef950c020c2a24c235c889dc65d54c6f00036688a10447a1ca50ecb46b9c77042a3e0959de2919eb62e55e08f94b3b491b05f4e65becdda13865c79072d38ca4a35cd934ccda724348e68631deb874a62d2bec9369394e4b5d549558b030a5b8681d23a67cb9d95465f531a39ae61782b729fc71bd60da082f1dd43572c15900fe35d03e10201fe93668c6e31e0e4330212b0fe78b06800bc1a549cdd0ff91ea7ada763609799901b63a1d3ecb446ad1110847890bfd62a9ad72ad058345167d3716969f4f0c1861e532fcf5dbcbdeec04018770d45b235156f127dc39b55ce54daaccb9b2bffaa9692591647fb85112a622ec7b25af397ed0c3738c242d8c7d98753b0a64f826ad284412b93decd25a091a8d6e03829186f4f33185c75bae823e2840d04ca583753b9ba7b9a215de06ce04ca57858bb1cf75033675d652331e737f7d98400ea1b42102273e74f75ec4a41716a588640c92a28e2d4bf4ca5a6c8fb6fb2d910ce2c882fee639f5e16f11cb1967f6d1826b83b4197e628bf36eead712652ea75027a48148059fb422bf03550f60639bae9064af3ee671b9168eef729fa30153c89843827a9991da684d72ef07e000a8e29e909b06936cc43d82c5bd6f7a4108014532483f674ed28df007232003493fff270b3289b402ba1eab4bf90cbbbdddaec3e70fd0eb648c0fa61b2c","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_3"},{"Input":"18db259896bf7a55fbd739049dcd87bab41bca06dbe6ba477bd91293ecc7b72a080f9707ac098f3ac7a06fc4cddf9de9024723d7803df1e832f23facc344e09f1f0a58aa3d929cf73ef5fb29717b46818570f8acc287057a61f1bf19952d5d870a985a1377ac0068c32090c4f61af49e438888371fa281863746ad9c4505839a1635829f9dc1168b264dc1b35951410b3f509179a86259cd1bc219e0d9fb6571282e9a7a2784db855d8fc301a21574e67751c63574f552b5075cf0d54feb2ee7086ac4e5ca51c4e84405e5310187119e9283a8e1d4b9be261bea666f724501c302d9e8305711e2081373125393ea672966c2b7931d9de75640aacce9bdd8ff8109610ee10faabfae8ddd3bae29f8644762b842a90a4baca50bd37c4c8e346cdf2c0a29ba08d26cd5e2ea3ac028f2c13854b997da5de4020810d8d1df0b5ede16181628b1a3d5936ef9414119e8bc454d0209022d6c3b6722ed63bd3be9fd11ef16a94dc0c53b0283290c9189b46b2b2e727ac54299b70b73ccd31eadbbbce239183aa0627c185bbed1b35c46d0d2ab1e248f7a4ab6d1896afcb8cecd471911ef208db0fcb30c4d601aecc21ad3457e4a636a2bb289712a98153589c3674a774f08c0f49c7c290fab83aa67c3ed645856531b1e537e060fddb3b722849819cbfe04336ad8c78b7ecd068f1f543b4cf09a510bed3f39c8afd71b549b957d5b4fdd0f2251c9278bb30892b0ea4fbc771380481fdad33dfe0e9f49916e476823feed199cdc78bf86665cfec1b451e92bb8122597a0b28bdd5d380024756fe070aa101deeac40a4d371c0154aecdddb082f6891c7c3a5074e1b5c1b30e4b3ffcca6980bab17266f609f8c1616cf6c23c51e60b24d2ebcff2c7e486abd11f878ad231b2e69a5773f6986e289b67c70b92da16c0c8f2a8dcced737641061312f5fe17952151ca3275c32561490b233e7284a4690a777da485efacab5557307c6d8e588608aa1e46b4edfd86ff457f0ab244e624488e4563be1a0ee35df8b547c43e4e0411b1dce99279dab100f4137847c3bac64342dc95b9cdc2e5880ae61f898181d8","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_4"},{"Input":"1688243c91950e540e5acdc41b84ee9d2b1c0ecc84dc373d6fd5959baebb33df140c8a9c0ae42792290c177a97425bfbfaf7ef008b7656e906c2df69fbdce89a029c4ee67b639e4b6f7cf0536ba1f24bf61837351b5c74f12fb6cb0887aac3ea1d3c75ef1b03ad925b1b223901a8e7a4e16ef2bf6600e7c175529c18ba8008350aa0f1fd72acfd2bc3c50664eba62133ea85341f0b4ec0c3618f3738401a42ce1fc3592b9642716c47152c9e52881fac74773f705c15b7737e0831ced7a0f8371245c36152deacfd18a947b3f3c83a30652958dd9614b7beef8aa8b5cdb157462ac85cca98a10e6ec5efafdd593179f2f56c4febb1ae6f1d72a9661fd8ed51032b98467d16a6e8e6bfb427838659b8df567ca38ec17c979560bee66d1ab72f372d38efa3e51e7ad3ab06b5610e0631db0a385101b45d0fe47c25610213aa023208289e3f0845bc2197d57ac44b4a808b30aef09a344f80062bd75a1844715d3d0cf55d95f2fefda6a1bab5796626fbb6345796ef134109de55bd61654f54c71f16eb795694ab923473ee66eaa59bbf61de8f8dfa94c481cb4f224b3ba90ec87318c3ec099e1aeb3d63840ccba2159386cb3d71481ef18b5466901b71cdc6e75e1ce807182d1b89fcbaff954b80d8a58d49c953c05a64e2a326cb3ae4802a0f9f29719e2b60002727f32b49638ac3c1d4addc61cb260c4ac99307ba24a7743ad52f325d4f32b8477cbd99a218c2e4ecb3171cab016c51cd800663bec05624f1072775db17ff93e8b807067572c97cbc7321e9690b8fc4f193eb0f1a93ce96a5c20cf7cc3dbf579b54af41204b2451098724e9d8940bd4cabff1605f33592e5f002817dd14edab5e60dde89c66b3c93dc057c53b926b2077d63d2dbbf9316bd64c2bb1b35df3f9ce28954fbe15eb52a08aa70453112cc94ad923616aec0553dfce0d5e44001e7b139917b4cd2d32bca418f24f44bd7ffa16edc47ff8178efee06f28630c2816b74f232864deeea9073bdc2128d704d2375431c7bb196825b0ba890b5ecd90caa2107b346a40472b9972bdca3e388e38a2914e2c1f022a82d49b4f","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_5"},{"Input":"0eefcc4248b67e40298c48e0ed47dca1dbf6f6e377506899430b11bf03b17ede10c71a49ccfb43f8475de84b581eef9ab283c1238e172bf48150f29e1e56201204c9eaee6321d6ee36b8670498aa1c73665f3ecc7350c8ee09a573e692d26320171450a989ebe50e365b92d24c311fd830972e7b16a2523e634175c4e24c884a1a6bf429331081e6e930bd36e23bdf91bb8180a6e4129c11655cb9468093ceba0e9d0caa4d47983e49ee253051aaefd86cc6dd367384f89e2d166bd721c658122a55d1dc0b4bd2f33984f0099a6d44c85baa10aaca32d0ec89e494d24514a68c2d43c0e6576ec46f88dbdcc7c57d685a3eb9342ba7c71b62de9e6373bd9094ff0a716e218f8e4174821a7dc090fa93b7683e2a6e363afe3eb7287a7dcbf9ea090dada034b037e05a7c8b232b8c691b7f0c3b9a870d786e913d936f8256f2e8c0131bdc0ab71a147cb4d91bba85941c00ec91994d2e9e53b1929a14ee2e876dff021d8b2738aed0201234d3919498c918fd5340541ec616542d92d955df4c182902237ac6c6802585c60640eefde7c05fbdf206a5ec25dc3411a4e9b4e6b57be611bbc865815ccfb7c666b117834cbf2a7edd9c2baa691ee3d453c3652c49761b234be3f502cdf3d1e6258eb846afca7acb0fe13577e226ddd277daf32d1d0c5c25e39a0be0435820302ccb2763016b10d0dbde867c745fe86cfba8cc925a2eb72d4bb48beada74cddc1c791a980d9bf7601ce0aec444354a5c02185d392f66f50e4860e017fc0453fd1bb0453197ff5abfacd35b90e7d9b03ff0900cc857ef7f2f0ccd45b2e137fd53d99d027b79aa390ac021bf4d6aa95cc96bacd6a071386e21f73cf3d42f0ed82ca6f673bb89223e16386c7328385edb01eadd4ce28e5ab418861414b0b511cc6300bd0cc6c95538014be8a4a20d8cf56d74f4a63225302b1f065e5ce6c676af04344de377f580aad377dab935d532f2dce9daeb0f31d6900af84aeeab7ebb4390e6bbb4218558fba894959f2cc2fef8af5d1c16998a38c6076f86dbd858db5b0b15ca2cddb0092ef861188e0434f4232d7e3e884fa42bba","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_6"},{"Input":"05fa7cb22fb8809abb745dc167279147fa174e0444cfc99a38f23f2b93e49ad62f7f94d2d206264a9358b54fc96ac31921948cf3c13d121c923991f0b47c04291b2582586c93d23816aac8ce2f90eb913e554211251bc9a2d64dd2efb9a905b80f73f8ca76c166aa5735d9370cf944306abfcac5a5874cc95b00b569f7eba01a1d92dac05e6fe60b5131a0d2e9c459d4b3deaf1a462332b285f90a25e5b61c211467961e060894bc8111abdbb66365b9da4a6700f2d530ae69289d2cc32185d004951597c8a0547ea22859b97dd87a37a8b4125bfcb513eff29e0bcae7a7dab00cb314388716efc2bee7b4294811db5bacaa3bcf720932e253f002b53e968f930bfa9409e358a1370c298a8cb622a0079bd7bf1a0e32e8f8dde7a0f56877945d2f95f233ceb61db914a2fc789bd35b3df37f62329a886194450ccc9e708d900c1fec898ed485e2970646f939313b33a6d3416476fcb249a96f6f11d030093f890621cd7af05f335e3514d7f10972f2b56614e917d9c4cb85178cce40f09a2291211e5387ed32f8c6f90d4c90d60fb08844a0fe0786717113aaf8060208331d3a03558a26134672a33a540774a5a994c549f2ec4e048e99c45f6f44692fa09ecf2d625e843fb3c186d9502acb5c9c3e6d0402ed815d76cf081e3ed847bdf8b0db0caddcd63f8dbab0b1ffdd45ae118ad1dcd7c1306c75a1f448a0e610994e5f300c058a66f63de3e94c81e96dd0cba0182c1371f61006d4cf9c9e24cc439d0cac280db62277ae92b4403f31d0bef2674900f1c21a0fb715b5cad4689154bbf53c2430b990502a5231b79e63246d15293a37918adf641bc8f8b18462909c8d1eea14434c1a33eb5a3b425729a7885db91c54240d3e8049c3d10811709dc86e71ed08d9b41714cb20a4d28f608d83b541cf998bef0ea0257f477e00c180b4e8ae4a0698e1e77ae24715eddf432eb950c3e26972a08521c31c484a733ce217b944f6190db804087bf4786ccbde4b6e149f2471121b29b6cb21d1f7baa6be1ad6ef18295d7425b744106a6fefb550e079074b1933af2bcf989c833a5f133f8e1c490e","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_7"},{"Input":"273cc7b93b70bbfde8748d62210c033579947802560fd05dad9d65003482995b1b7379946dee0b15e90720dfff72cbb60b60b5aaa8490ed2b77e8f57a8906d1816836ad1a19ace6e0feaa4195ee6006280ce178b5987341221c6ae618794c10603ea811d60c99786835aff3871ef0163cdceec010fd806bd11adeae2a91f4cb6179a512e9627d2af3dfc8a36850e144c7255568b3154d41797e2ac4782234925047ecbe78073575c62a32129476a6456c61545eb98bbf925ae1d673a32d680e71f20ccd414fe03613ff7a3d330ab8bf8964cba66cdf3af8bb955cdc729014e692ef7c335beb80626f05301278f5e3b228bcc981736a258ea6bc4802392f081de265db5dda279bf034808ed23c8613341b31d3d29a2f65a367024af1376d1bb9907b7ed2f35386382b00fb0afa6c5643c170010e35824d8fc84d3604690fa18b404685df83549a5573c7228b29a7dde8679d8771a19e8af709ca46c60f8126e4b033a388adb6c574f85524ff523bc7c44b49c8731b763836e0a4ebf054f0008492b60683ad457d04d91f082e169606c6e5d6e172845fe586925db00a8e6a242c409a8c11d9bd07c2ebbdd653519e9a0f5d29576033ebab9a564e1b07d8909b014232fdeb565d57fecdf556f1b9753361e8d7ceaef0d4778b4669643a8f980ed9107e310cfb6db05062d60b0810fa4aa6ff9825ebc58ae839c844f82ad08d9a273161549f2d3778e678f8167640fde4f43d30f2f60d7ec8cc83673d0e5100235e405c743fcac26a09a44bfb9bbd6f767ccf6dd030879dae04027353dcbfc9a89af0f566f9e06f1a6035c08bd9873e41dc3bf009005f905fc0b9b74ea57a16c5a2411c984cf6d6d274f79bec9cea6021001d0729f412858eda5c909d8bdce6a24980d28d7ff8a6bc01cf9ba50e6613c5495f13a39ced02158862b29579c4cb0e947142fa8592c012a3038fe1178bcb515a016a06651e387087a9110ac43ea9548a520537d116ead0e2498e487613ebb81ef0f6f5210cb448e92f2cda4a4f57013ed1f922e1c90d8e8891a308adec863c0b48faf4b7581e0565ded5a8ac6bccdee08","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_8"},{"Input":"22f2e1830cea84486d7ff320365a5ead50d356379d7bc4f2b9d77dd298f36fd8087baa2aad4fd8bbca8cc0b525041e1b17aeb3ecc63086cdc6fd1ec2310bb8db243fe8ce837f106ef17e387f9d78df833811427d5338c83f0622f92a65101da31ab23d2eb26b70ff15decd58baf91a68ec85f149012d481da67f806b0571c9471928767c9a5576ba5fbd7cee08203e6de3d9dd36a756fc621700031081a80b7e1aee70334cfaeec2f7551368818353fbd5810266c7d1ba49de47cec9b81b6e82007aed597093879d894ea438d094f3373b51f31bd5993e026e76502bcb1334e32189a92e9df00c0b5c21811462933dd17a5328075b472a53ca61bd9e136701571e529e7c4912cb565a3819473e8cb2c45e0a7b17a63f11e509d80472921e86f92fabe095002240b012e60bc9159383bdbf515def6c41acf180adde6913625a7b11d22c04a21962ecdcb1b679168cc14899e2912f233ed37d116cbde2110af4861ca847018951f8d71a369874541390d23df3cf9e5031655d4e7af4affdda5ec50fb5b633ac619c06ff0312901dc9d949ddb443ded5f59662788c101859ed0cab1782bd118c15612ab18ecaeeb9226a0145c0c1d01428987b8a5523c6da78e015261c22b6d73323e863964a003fb93594743f70e9248ed6898776780a7f3ae7a41b07a0d873b1ece5c55c6c942a7c7249c3d9026fcc607a68fe6e73cd4a76a6821f86065d5e87ffecc2c47bbd85658eb21bbdacdb79f23b031a8c6df93e64574c06eb93cb065183692c4ae4dff2efd51615d926782da50054e4a280c5bafb913d02369aa17493b4fccafbe637b1b7c9e1225e7b6fb24720f778548e304e7617b407e83fd6e3da09599850d6399059fadd57c4fadb492f59ad3adb4783ccda65272f190a9ca862a6d9508d9b2513edecf47aaa4fdc7a64127dcccbe64b7f206d400148ee9fc305099c6a7334452f25473a58edc7161895ab52e3590ea600e2e885010b062ce0df9974072bf87f5a1c8072df23e612b254b688084b5958314efe190bb6fb66657b45e6f81fa7c5fd41004f815ffd08ec00cb46ced2b1f97b04e69b","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_4_9"},{"Input":"03d333c171b569f9721355f4b5f9569c18006d55ea805d0ab72f392e6e6be88e230688a302d20e6934bc1151bf8a0af65d4294568f5af0b041197aaec74aabea1aae25b6edb4994684b2877875575b74c14a19eb068d429accd0bbbcd4de1d110b2f112b63197fcaa10a2afb08cd221bd509c829efecdd4a3bade00bf947cc3911796bc946a8148ce73aa901e2e1f4dcb259b11ee880e088ddff65f5f6f05d441ae8c9a28a7ee1d483dc47235e16e19303455ee1b7c6c29fdff01d3eab2c4e77284e25e7b8203b7b40dbf1bfcdb4fbdedea474fd44ed67dab27a031959453e9b0010adb1d55c492437f0bab7e1b63a56467681f06a29aca6ab95d29d5fd23c3529e107847478c3dd0aeb69d6c4345dd0239ba105a1bddc699512e027bbb34b81111903892d003d32111610c7ccd4c529f75cc8bf33a894f40756510ec8b9bcfd0402b66e82c6b8fd6de9652d5c81821f69445b0dca7cd052e1811760803f778a1ae8318c37a3652bdcab122282e95dd3f7393b3214e8ce290c01c9345ce81d1c09304eb9899baa26aa963503f8a55ed2a5d0cc2d5d0fbdfae81c3a823790d2371874cf1b2e447a896844c5338098f2ad9dea545e40d5f5a4369125d95fcd5acf0c0ffafa0ba1c1053fdc155d63329f5d8540fe5c6a876793e04913a1e6a7c88815fe284d364a500612c376e7bd39a466e1b9c4c0a85b105d15a973db33a0f1d42ee64373074312ec2147daed5fbc660ff99664dcb993750af8f192ee51b849a51d9a24c4dbe4f69715d00e8ede2f32c2a54c5e8f8a57487cf80dad49915cdc18239b7847b2fe9c17f926ad11e5161802872b6607265d5bf10c737d9eb157506c05725034e5c2a941efb693478b4401e684afba8af20cfc14c53f66652c737ab71657a4156fc5dc9ddf2b07d05c72395c7bb98f97743c6a81dcc11d25dcf313890effb8dceb430ae9009afe11d1f00e0ec2ca627ce9c4919287a319590dfba56d1d76f3288b570588497d0e5cc88341ba9b40b8fee65f042836161d718ebba12203bab8927db4e4b4dcf9ca7f4250c61d0a055985996d04e0c76d49bc83bad37e0a1a1f642a16d95eaddfb9b7a403bdd032f07c9222813df4dda4aa3054716d7622a999ac90eaa7bbc4ec78bb5d47736aaf04f706ddcc4724776a5dc0bc39cd1a0c9c5fb89113f93dc81db66c1ca13534f16518fb0347056c08bac62a1bcd1b201516a4f52fca78d9d140d40687b093176eb90fb236c03cad3ebf57027afc11742095f3a98a957815f7b13e263a5f11bccea9f6e716e219915e9075d9c0c2a8e0260e553a1182aa35b5d8d710c9705010e1350c02b6a217ec61245bee22c8509810027b242574ec29b652f249774d7320612dde5ca36f20f42bb169352a568e4c14a972b4ef4a1ca49f0e4b095f77ec5929486d1a051ed3b766a40d442e8e7d3b04ebc527aedcdd807d94774c23dbf3bf2841a2a0e3272e10431a056b1fb1224d16565b2f5350a0c8bcdcc6a3a2d189cc488c6c88cf9a0bd213248f73095f4ac0116d2a932043b527cb2a7c42e329a00310c9418da803179a099418ddb9ed859b06035b9b8fa5ebdbcc460641e8af2bd20e68e62d50563672a52294cc0e94cb331287c3cc9c9b8f389de88ed033ca26234d38089a712dfac171b8c8d743c5a2560b1f5c5d64fb31d6830a6c982fc8daafcc6b2ac02ac20685e11cf211edadf2bc01f9b7d3b716110dbfcda9974d00a0e90721e9aae490f3e0ba84b55cefa94919197ef9a4b21ccef5186f0d9801a25cbb77227b2d8488fa8da35e8c70495fb6861997575cfbbc644daf21868564be6a9fbfd216b252271f08fce405355d84d49028f6c5397686e765c5157034c2ed2f92e2d11c7411613f5c60b5ee50540df6fc025a3e1aee7b30e3113afca04fa7e3949a54f65a25aa8241d5056f289c3378a72d4730731a6659294dfe163718d63cc6239d09033ba48004c52a9d55d66317b62493908d3215efe3d2cb77ff6447a971599b2df711a59395515c4cac93a0f2211fada2e1799efd65247699ffbc3b35cce7d210a61e868d3bd8abb37e20bd5afe2a628ffe54a17a274af70c3584b4f9a2e567c6ae5d5a00d14ac7ffc12d04e06a03d1fee23fa99c63fb8a760fe4794af4221f7bb7ceb194c7df2c63859c8b0329","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_0"},{"Input":"0bc588b9295424a643de2b40a69c9daff62305085e893ac5c5d404ad565cb89f064f181b7f3fa23a51b829fc7965ddba879c6fb6eb4935ae33756fd01a603ff006bf88db9882537afc39611a5da601b4461f23b8bcd724de1602d10ddf2400e1103d4162b724a3f59c1dde973ecd3086f599fc3fba3092a392b247ae0e555352086554bc12b5b21906ff1f5cbb8ea8065b8384364f1d75dc43fefd5be2ba6e2b1db55d47bb0e96bc45248f7d8e3576f91e6c7db1ba7bd60c36faa62286ae7b7120f8942c679c45219b38e8eacc365bca7dd43e7a5c72457b6c4ccffe1ed38fff28676ef29b9330535753b41464f583af98d87d9af5e453e26e5ae2b5b8900d6a2273ec96dd5d5ae35442d2a401aec95af380f6b94594495f7db684a7bd21cc7115756d01443923350e0f55d5a4572478e5bfd895af1671355dc71962d475d97e0fcbf9663bc4a5135ec00c0275fd629e2c671486523ac3cb274f3c021e434f230e9f37feb748aac515c58c6ada11cd7668939a75cfc4a641c82a88dd642fb39c1b901ae71fb85cc4a5990d19fbe23eb4ea7aeef7a07b5bd9a8628ee7eda77bbe150a9c622deca8c8505253cc14e2908bbbbf8e5cc2e812e8f7a93ef3f3b7c37f1d5fa37baeed342068aecd69557b859a833938de0192b80bb345648eb1af85481421f8a6cfe15954d7c45e82e8c192368f817e1de8a01803d6ded2d258b889c92424fe2cd68ba3328ac7b2042640ed0f9107499dad072a1170bdfc11e3999b7a177288e296a9e13a230d6d2ac704f62abd9af434cc7172468268a27b058cc6822b911b724343991820ddeb0507ba1efc64b6da9bbfb66bcc6dc1968334e59e991987ca0264f9c8da5964afb471dfcee45009ac14dd37520ec63f022ea4ecbb522c466e5b405cdca061c8e56af4864f93fc16271978deadc7bfb667b940186527218b1308f19b5f78e38826e8c0edfcb7bac067f8c412dea480afe0699e1bce28306386adad44c4dcead96aba3c6ac2b511c2050fc36c108842dc68adc692b46006c7437845b91104ce9492712dd05eddebb786e9e50965a87ad9388d375d014b162aa118ed010d6fac2133e46dacd279605ad141d548ce5f6df47f2af040c689127705a6dcefda95143ce3f33a8f1e2bb5d3a6023d7a8bb405337d07bad6e9982b7521e4e177303deba61b19a3c11675b6180e29a79f720c56c1ddc77771969918ecc306d7cf8f2d996ed438b22234436042472402e589dcebe4d4ebd56f54971f7cef6a8b3e1b08248d3f42d957cb5d73d7680167d985cd5a71d91b1e8bd5601262d2cc8102679d1e3765d15df5f020ddac2b2745b108b0d7291700dee47b7b13d6d567250f967755036b3aab4fc48fd80efed33154469ed1deeb843622138723655e3bc692b8b6c508dbd5a6b02cf7f7818224636792dc569f8b5098062fcb1343dc85466867ea7c3f0afc7e45520cbfd8fdf56a3a3679aed086a391b6af57216d573faf61d6405f3d65a897ab4a5a77d94507d8ec790300157dd57b46fe3916316960cecdef7d1af1aa631a1b74da59e4ec618405bcffc885059c3c74585b1b87f2762ee8618a229bd0da5cc35d3d3e920e1863c2babb0ca59bc19597b8200f579d17c5c51094be0e8c425f3cce12e814ca719411c869863d14e1750bba991e0f1d9766b2dc000b3c7451093e5f3293a3c9d36bcafd092d5a19224484ce9100d9659a9571a96dbedb8073a218101ed8f5d224d0b11ca2c898a2b05368adbf2f27181e8fc713173cc3655a599ba70f25ffaf2f29a803d2f58145b6e25327851b55391c39fb460487972b6c817e566c9bc35cbdfa6a89c4643ec632000828ba17530c62524376df313c12934b1745e14167666d4147764280ae0f6ab03c2d4f04f0f5d5ff2e39df860b936e87569da2287a7fcc00e9eca8c9860ece79ddced50c566c803192d5f6863d56d83d10e49dcd60d34555b23d7ef607bbb9a5531b390d9b2016ec136313cb56354fc69c2c97cbf5afd99bff85948e6e730cd37f6cf819fcb2230faca93dc6de50b15aa3dcde0f7d0864056c7ccc11c01b61058a483109171498c1064ca213a3305f1ff0a2861aaff3646bc6a8c8c71804874714881f2a8aefc2aa3e7c8fce2741f292cdac86484aa567e188ee8a908aa5acfaf0dbbc","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_1"},{"Input":"2685aea6edddbd98ca03c2df477608e71c613e56d9817eb504fd4646d5699f8c266d709c3621b8da9d775d325bd8b916e112f456067cc94c3cdaefd1363ae58d0f238e6e421f1e1a80659b3f3d53c82da29dcd92c8f3e7f5cd6d144264c962e60f0e5f7beee4ab3ca6c225dfcd70cb1dacea4fb1c11efcd92a9bfd000f20385d0c507168460ff0ae1f4a3f4d4d40c2bac5f44e18eb22f961d62817a542ff63111ec38e34e8c84f6b8aeb81ab4d04f44178977880ad50136de60a1d62f3b4fc9407245d2ec4baf533022981fbe51d195b64d3fbc15db7d356f6bd96e425672fa3183cba898f86a37b5f236e41e4938fb5badbfcb19a929fb0b0a945d557d9ba4f0bfae5037583fed3a2d1b726b9f5352a512d1c35ee7e8997aa57b0be6a07b3220aeb130f7f24d035942c0b51ae34ad675041dd89d49c0854aa29036687872f9f105a80888c3259e1ab38ac878b95449da892c2424c0b73a32a4bfd6c1fc2b035166da5e9e14dd821a2bda674e8fbc7edb1c8e1edf32a7fc1a57c5a0583f888460ae28b4c49f27952ca34d10e87fba821e197b891224167a5accfff0a2d6835ca0517e1a590ba9c9f6a14a0b105a34bb5d38df06fe6c87ad79b5902445dcec7d824ac886acc6b9e4405b69d9650e76e92eafd8cd4c670d0eaf4b87894b775221c105c4529534d44bfc6df876cd3f64b459730aaa58f02daabfd425016db382dd12c241b2ae39e4730028739a266d7428bb0f186b0177a5151d821aba508d907ac1ba083d662d28d081508cc46353bd659898905e68ba2d8291da61ab408ac83462f96a39797f8f6957f9994c9e83022ffcb23487eeb10fa010f62467449b1db9b29cf62c0d6b266473eb0bd57accde054bec7804cd87c63b4cea3d9ef688c2076300d74c7b5d90044fed0a3e144ca22f49fd0f519d7f9133f4afe84ed531b8e5c151fba2c92ef82b4974906eaed202eca91413bbef2c19408110d86ab097369a8128a72e0ee836a38fe369c34ab28832467ca7e7da305c7f1734db29dbf5ddd1d2eff09551ac5d3fe228c9cab77da07fbaecb7a4344847b7172858963a81c1cc92ba8f8505e4001622b17c3324a74f572f7905655a37c63dbf2b1e178378c9fb31468feaeb5aef9dd81159a28c201ec816b0bf2358d5eaaf2994f79d945e9f9f22f5b9427cf97e32fbbc4ce9f9bc8b203b5ce92a13388719701140ab94b927d261e807c4698e5ae5b179fd8bb17ee8ac91d6a071c09885c5fbf27529cec212fe8075e75c52a3598f787a261bb7281750b87fe125ea914a2ad8bd77ad60b5994101456c38d0b29c7c9d5251dee44c53ce5c1e06ec623041469154939fca1497a2b24aa5766645e993d87c143ac92f67bd241ee71f36fad6359b04ef25d1e106003161e7e243a350dddd4e5e71f3d260498acfe2da15ac92e024ec7f420dc323b111c0704235cea83ef84cbf533f0b559302ebaf637df3f4d8b68328fad9501355b00a96d3df4f329e4cfcb81daefa893d65caa287cdb330844d31fdc35aa824f8f01b9d722f2ca441ed789275d21ceca9f8b4ad5a2c64d1467519e364ef77bec63054ce19859936c36a5c396cedfae169291b3a2d8d005fed1e4b104f991914fc61b0215a5d38e3bad0ace8354013e8b6ebe73d96fdce88d550953235643111bde05ec8fd2737015151f523cb38a6baa918a4c98e6f955eb2805ede92b82292986061700c3e0189d210d3fb0b4a3bd09bfa0a00241b386394b4e10fe3d480f6c4922823fd2cf9d6134fa302cab2b1fab5957bf6fc7dc4268d5ec0fdab9bf854cf01b07d712153db5c2cef41f822eedb1ec8b86528fb59a12b9362f406c784c55c32b3d0294f737850b94d2ae395964456e19e826fb958730c06e01de0f7f4c3ba9243d95d6a537132236597b565b60453d6ea32c75afb2d875c305661b30ca22f615014ffd20951f8ad3096b7f66eadb520ff3dcab6c86f8fa58f8d486fb0e7c1c2386a1d6047b8807b70d436be59291dd8263a1f3ae9813355f2fbe58010f67d20f576105e2efb422ca422c015e9394e16e484b6ba6da85746f121888b43159d61b793d3497a73545b2e74d525a1a67a201a3a0b9926a2b94d33ed7aa5b0158ff20af4b861226ba9a2c474ab446c2c9eb22f77fe0d45b8b2a810689970885f88b","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_2"},{"Input":"1891e8689d81bec3dadf1f9604c15044cf827e14e75defde61944ff7bcd6030b1c9d52e52a1ec18146b4eb9dfee11579a281998ec99c3828854c69edffc5cc1a1c2be993abe1a808d8adcfbb9fb05aa82c12ac5aabe25f1e45638d8f522f06c005d8941ad434d5775f021bf825f48b90d106afdc75383fb209244d52f1320ea706ea0f67d737534e83b4c371e90088517aaa2f2a663d8e20ee66fa5d96d9335f28f837eee92c44da5329976752d99b1490668677a12f6957a24e87cf06f9bf14277937b372c4dee270475b2c3950a50dd506c82a326944fb1faf73392ec5a54c22ce783eccf8f06cce6ba0c21fb0b4dc405879b8c4e8e8971df765815f9878a41c8ef188c94fed5973836a452d4d365003c8e56af3fc6effda3362c29201741005f4f78eb380df7e435060e8ca35c6453d8e4bda391e23e47d8bad4d28921a5606d86dfc9574f67d7334c2e73ddae937a36c8c59a81c3f25a3ff7336c024cfe21b86dcf0c54a5ede73ad5c313d5cf5438a1e6745b3b61b18635d3d3d5f51df5d2bc6c558c5f3346e9a400595186a9c9ded299367cfb3a0674f23f1ad0350cd251f268d166c85bca4eb0b3cf3c53bce15abcdd22e22ce0e9758a23c6ca5dc7bf9183144119ebb7d667bf302b4039bbad10ed360d3e0ed47ea273c22083d7fc62f1f5ee2f7167b517eff34f496919da38c6c35093638ec958dc251e7ffa9c173a00809cf94fada7d2fa86013db39978eb153f48c11003b37b0b772700047f4f2531895fc8b4f8b0b884014f229aa5d3f71da7438ef65c446e0b427de019cb6f37b18b768d980b9e6f007a41802ca6903b9c02894bad35e0a40c0b857ca9d9d36fa301afd2c4a0e09c76b8c2cf6e39bfb2ed74f709f4f0108f13b111a04b2411e3515b772fcc87fd59b28bb73361c203c9fcaec94adb10c921a4af2f72e5c8be6ad1626d2029044cefbcee5973de8f419f525704d7558e86bdd34502c56da56cde6282c36358df918f4065f03d107144d581ec4d0d4ded89a81f0c276e5653ab7712b2a995c15310672ba6b4431362266dc719d5cfe3b23dd83a2a34b086c18e02b045ebfda6fbb64a22a1d7709ef5f2b065ee20265d4900d004eb1936ddc3fe60f130649fb7b2ec9103636131656a7a47d161e53af88ec99797c4e8e7051d1732607d5ae2eddd9ff4b12ee5823285651ecc4cf5e6241392f72234e5e6b240575900e21d3821d0ac2c6ed2f0e0b615bf1dc36e365bd69d182733f951be4ac6fcc44116425c28405a420df7e495650d5d0f74ea7dc27ee928d8c7d5907a13416384b15eaf7c8c478da036be27d1498ae0d5beb855aae2620577d9c541e36d2ba1ea62043c1911c37372e86bd8530a0ed3dc407c769f8f248a502e719428fb9706de6289e167378b6422d0155dbbd7bd3d1b677c64746ec51316ab8f37a836110ea3e2c62da428e3a53f8e90b0cd00523d05dcb5b1c1f00bc4c66f4e8ffe62842dc26273a383e45c3e23433bdaaee67b5f685a21cb5e85f331880fe736c4642f972ff17a4a947747c14f722f3136da4a6ef86769176b96a30ac6a3d11fe16860200fe29c194cb2630c988439903421dd883caf0e05e3f82e12fd09bc0415e0814c41d1ca9c349188b686207c5acf04a3ca7c62357ac5a36edffe672b5c7856f29fba11455c3a42f6b1615d934140f1125e8f3d0a813580c49e6f668e5b7078d6b3389145fa1296893fec25354e91427e890658f8e2c558b5f22499a5afc66f8106a8d1af7bd16c15088cbb53c0f95ee9222efdb4c3ade4c08ed74d0747077bc87b86a028e52618b80c87fd7819da4433ef2d6232011f94be93a335d44854e0051008f2bb43f5e84934e286032ffbe10716fac0266c7361df4464a26a832697780089c258e55ac985a00cdb2800aa4126b748825466e4bc0dc02f2b44da5217e6f628413d728dde6aab9d4d8ac72e8eebfa6d70cc8ba05532c707dc8ad0d151e7645dd1a35debd99c840c3c31f3b9c17b7d804c1463e41e9e8d5bc2434d3e863d4893a2fd7432b507d5d1a63d09c555d506799665c144b84d13301aa04d2c68a8069c628c6747241f57eb659356042cf5ecb6f917a6ea88bf2e01a70bfcb317c7a21cd20dec788c2a74ab921d7b14fc855204725acba5cec08a5ff8e3fbc44a95c1493","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_3"},{"Input":"20b961c884a0ad42964edc3b580f607681058a33aee25d60f7dae9f060217ec119d77c703d1a93059a1baf9c17319ca9f1c5fb4a04855d6aedc308d9070f9769103dd1a1691e5fd39ff70241d7569c17764a3824e49664f5145f956abdd559af262f0e5677944e1834c3b5459e0bfb126d41a8afd73bfa12ee3ef45f17e81ca62dc7a825213952eb841f8942a113a5cbda01359751726ef26ce05491815806cb2bbefb942c709bb4fd01181e99ae1716ee28d0453ef725cb8ea45f7a4f93c6b3203b2360ffca610432f4d1053e633004d7a822ebd940e9a546a7d0f2038728921f1aa6348e2cb062d5e193a49d60214f2f0752fd32b57319b877958ef0f7eb9c1b32607b1f0ce57571b1c609260f757911ed8bcc3896e6c95a13655d11b6a7f929b9eabda75ba7d16a31ae4b7af7d0eb1bb349169df32fa20f4cfc959e722e0f24d21c9b7e68ef0e4e941aaffc472a7fa0b9d03b7097df3c993d108fa69d0a8b189dc5d953fcae14f53a800fa624429d2bbb94ec56f371e65dce393dc602ea2a04b4e2312aacb2061b9d55e615845b085696a908d76944bc822ca909212ac6bd05bb2fd64a97c2dd2e76b9ed90febf4fc236d4c466ab7afa4050101828fa67a02b0d987e9d5d717c8be7757e34354fc9a57198e5d8e867a8ff08b3e3020c84cc015904ec31cea03557ca10f0b7f5ea8b5215c80c01f5cc47bcac78c0d2f1f312135154f38704a2b7db3dc7c86be733e8880e07aa0712c2050627bdf56acd40482f36f73badb30e320c12bb66096c8bd7b978410dd5449f250519c6a122ceda572357aea961fec54427a6a1e6cb2d509210e0a6c049d39eefcf09191b561f361a2d372ecd78676d8180b6120c432178bf969e889d2e386ceb20642a0ab00f1c28263dfd316e344e8f9c1380b0fc5b3ce5bf524cae2978f53e6dff5c6cdf0743ee0c68b4b256d924d9635a4cfe45948e1f5c137369b47439912b113818d26e766d0ccf83a1e2015a3ac6f355345d4ab03f710bda2bf76f42eb7ae70aff6f955184031af5d2333c1dfca388231e1d78a53749973f0a6a01f8ad0018704c7db134592cdc9744ad7b88e407d0eb04696b62fd57be16c249043f670d881e8fb7573f9d0cc54a632cf9de52ee862a07e0d9dc11a3f4df8c9fcde0bc80f9fda1b8a84efb0b67884d640c14cc63211267d15a405fe9d03f9713fc79cb787934a778928b1f244b2e84e926f2d5a7e6d9a154873abd1899a7b20df25ae018279ed525e939da2333d4121573982541bb5fdd5d6570676ca6a2979f92a21a563924eaf1b2cc3c16190560061e4eaf988b117bbef2a7380429021d7190eee78b725bc42613725d2a2e3d1167ad6d74508c5322df36e614e10eedb067f8cfcb9573e9281b0b827e282d3416ccc69d13090246f223e743d077d3d167af6558cd17b8110b422b70462dfe3d677fe5a72c5125c9e67534c06a4070f0bcbd8f6a5d93a7691d63a2811e1908a4f98042938fec22a2372ff55c50d679bdb4dcef9a1ecc1dba4fbb54f6ba153aff2b0ba9da968ff1b07f22e95f4404a924ce1d68c9d4cddb10aa9680cdc2064aacfd45913bcc620e4cf277913eaa093e4b3ce25f40d1ac255f863fcf59c2066e98d7ecc5219edfdec9bdb718416fc65e1b48f3a5e33f40a459600bdf13c8144d022ace69574477c864aaa2cf989a862940f80b2c85e5737926e3fd1e18411d06df3079e19f11b85b2634cb2788caa2fa53cfca5de8888091dbd8cb73b3651e0c60e28b318329e56ce5cc18581966834f960344fe9645682b800bc138e5670f8f23befa1ac5f9caba7fca7179167d2df6ea237dee29bccc80eacabd5a51dc06f245eb13c8ba185388b1de78b300308010a551df2b5311f3ae838318d20297179bbf83449adaf1360b0b10494e299a9cc71672ce5774394144435ed65a061b230c57e56d08af54493bae064a3d94aba34faeab22b8056c9d1fd0b499bdade429c428761820248450189abe14f51cf3274aae5e2d65644e9866e1e5342faff915cc65f72d8210c6aab304b14ce4036862bef5e03cc6269ec755cad0f1bf285f0a67d6a9e5be0d4fe6e50b707331076cd11d96ea9c1c98575d21ca59083964fc06691da6e6e12b833b3b126f159d4fe2619b89bd86423b6cb9bfcb34480fa78c","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_4"},{"Input":"1ee25d5450b2735be0093c130b7448d1e411e1e8b7913fcb232598dddfaaa687027cdf0955348f4e55caa9d82fd5bbb38b92f60579a83ac709966683f0d9793321506909285bb1b77ba279f0490a97f2161fe1ab39f7f049c1313a9c8811884e15a20e6fcaf1c0bb0715db97d4626fcc02f7ba2ca64b784b2d4f6f51ee71a03b24732d58be9c0dc31b21e1a719031094660c11a00221284d4163228d8c3cab2e1588d6aa85a6f8ae92b8f3cba309971208f66b4d0863ee99d1d5e8fc4c96cff02dcfc369cc91404a1b8309a63ce750324264c2a70c62ff062762ffd9cac5b91a03571ba65a25d22dc4b4313271c8dd74a99fecf08d6dc8e6b51333a428984b1d1129479779b4c500a4200354648d7fbfa67c9a0cb13a3d0e6137e31ba7ff47d207e78fa56ce0c8f6f4e5f31f678a1868f2c7054f796cadb4bd888681492ebc750bec8d2972a70ed03036210e367258f5cf446378f1a21029a48b152fda72fdb6141196031b0f6bff06f6500d7813f8e2dc009f3abf8c9f9160a9cf29fe29b7c11a3d61bc9163aa0403faa3151c0830b043408955dea0cd7e9af20095f4f5763d2acc09a5367d70eb2f0ae60297138f91ab9df8f73a32690ba35abfd521c0e7ce010d36307a14a7b50309a5a73da3fc8e5b6260531b90ade6a08c01cb6ab7c933102527adf2e3b149232e6870a91fe9a0824cad125ea9f88a531a4c39e6e3860b1c2f1e41fbe9e39f018bdd240daa5e7d050b1d72a31fcbd3c57af3fe7623ff3d194460469ef83ed14d5a5dcd75533364b4c3925bb576850e8abcba7e06441f4e2839f9e57171e29052d593183c38c820ec1f54569a5739f8f028321b725b8d6c001822e194f48d5f008f5ac96d24eb40d7bae35c1f7a87bce889392201b7753924aa964b9b82cc1ed724314f55fd3bfe84a79984448e0a309dbec6f202e707000167456b1aeff780eaf36fe6e74450efcb52c0bb8dd225ce291ea32afd792d4726de9cab205db543a5a385432ca762ea52e445402e3f8532377d89b1d99e17c2272e0742d0904dc8076735cac193377a3534a15229e89605c870331e8c4a325c1ae9f4f66b3f9f6744978a7e689fcfc60691e30e53aa60076b17d09c84624a4b19392f9dfda38b2a543220172bd50eb5ec710884855168a7072e2859252a58c82706373a30c0bf2aa918c2870d43c410f52d116fcc691df9b4c4d9f15a10494e10aa74c6d7e9351528814c724757c648365a3585981200e312fd1d5609b9a49702c6cfa5525ec1bb6df19cd838bdc322938b233c080c3e4885d608028ba06b6d2865e834807335d255e605fd759b0bb6834f946a31ec742859a3d72a6da48d9803095c0ab65997de12a21edb99c4892a6c316dfea1a30c4bb8cc601ecc32f1cd2073ac7bbf3e87be5b54b946001b7ac91092cef11b3b2b0e5163c3a605876c2d0628b3e51cb8edae03423b9bddd8e83315bc96135b725525f42965d283cdd3a0184b6465341456b5ebf3885665459aed84e3cbe071324f5016a9ea977561031719dde6c423f21beeaabb44124d104c07e52ac303b44119fab1262b31b90d47ce14fc4af949f7d3e70387fb7a06f7605665c600fdf6e42017a446621fb351e91b130a080b0636f94376096d780ae1123ddb2a7c474da4028e1585206dd9e2c20a075d52d462d5a10121f7dc323a7bc0c5183f79f337b863fbe0680b158ecf81402958c671823cfdd8f2a372fb01ab9a62d2e9926a7eaca029d96672a0cdaa60591e352d8b7b64557a1f8752efd985adfadc50cb8d84a7757521961bbf43aad9b9216148f860853968329a3712dbe936eb643ee767c8c57c1c39819832e7ee4aa920c013bce746641635ea715962af491bec1d478f1164b1daff3800998ebb24c011b9731675637ecfd7282ad4e7703dffccd386472f84af4bfd1613fa124894ae006f44be7e61d498ff3d57006afe82d3255fff68c4dbc0e3ae72b961061069d3140d573447252faa1bbf6628974a8f127cc2540c6fe651c1a4537b85843bce340f8d932a56ff47605daa21e2bea8bc07ebfe9152548fba7bde2664df992583a221a9678e3e3213636f1ea195108c161f3fa7c46d09b4b64918714c33ddf8087a2fd9da39ae9f5ab723fd232f646615af7682dc44bc2a7ef3e1665fd6db5246b6","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_5"},{"Input":"09d599a8c97251e5d1447076792891b8de719e3fc5b7b245e35c6a8af97dbe1b1cefb6a792c978414992b8c88ead994e8fc972bd8018a40e306eb0e5578b25ca21312203a90480fc7174fba1bb4b9802c930c38aff91399e78e2c76768daff422bbd652137299ba4ebda8016f7501bbfeb6de219561d3f924693efa9acfca2b81618159fd6039f1ee36963eedec8154312d592e6e1dba89d1747c4251bdb725a0c6d546f20a8b44f4517290a078310fd1af065e8ef20ed4ff94c0fd7b7c662be143e5a3414336749caf364eefdc5e30ee73d34d9462a44e90e085851eb93c9b6206426d020f657f36fec865bfa09bc619746c238c4cfa643529eea42aff19dc52abc81b078bdca796d77c4ac57e6a248fdf370d3cd12163c474aaa46eac2cec103b3cc21c58b94796153850268f274376dd6f1a36103e6f870a4eafa452923802c6ca8c36c4a0225e4d80bb8e62aaad963cc39bf9db92e1a0f45a353c82039dd1821a59d0fd59b5d0a0362128b95414fd2479542e1afab6e8fb23e06e9a547210cab4c461a3179e2f0a15c1a20e0569590bc30c8c7344a73db5fe76341efbd2c1d24f43820586b1449eaed8c7063d4e481a1a52d0c5a318f9b69e97c35a6393b016dcb50ee485d31c090cfffa92e709dd5bdf6b94dea9a7310f0c824ba78151003ae718fdd5682ae467b0f776cfdd02db3be8d2aa9d42c88638bffdf154920121c3580c8ff773cdab1bd6a9449d8f4d0dcfd5d3e1bd55acdaed1afb96e40c0dd233eee0523e0a36b7cbba083eb2919ab0a66836dabc699f6f5864d284090cba90d02024b706a23f6d6f84681ab223b9975aa15bfc6c37c1e1d43bcf8de71b10f2321d3e00d52c53f18415f2e87cd00940a6a3234e7400e170297db9b214a596d2a6ca0984a6e1aa1433eb239c30efb32093022dc1ec379567ebe899606324afd22052844ad5cb4241203b35d930334fdcb22754475653cf6138f51677c5759d0034a7400dc24da45b5d4c63576a83f299cc60b43b186de9d8d5120d36596299502031424a44c5970eeb1090ce35d7379a0654db261594a27b7ccec8bab8db83b26534bc2216a34a20a506366d22111acbf059df2198654cd69f1e4db9cf7d4801d135d29f2973a802ab859a35550a844ecde62bdb95e86bb6e974453b5bf2d031a4f3c2aa1d0be4af8f9013414719e7b75536b3e0dbd8250fa3feacd17416de420df18f7491d891ce8c01acf25ed54d37433830a1bb5f169716b07aeb67e4e6a05ce2b0d962f82ebcc36bca7c238f9e0d83f4b731b4447b2fb6f24636aee57260f1a72ebde3694aed548f7d8e20b3f9e119260b66d095e9992ca8645292eb45b01cb4b475f8cdb3126bd428b18745e504371be364d94d482648251a0ae1bb9ae2e976e6fd23476a9181e42a874a734f7efd1dc25037765e35a92885559ef4da81af8fe9ef0615a50760d000b68bff0f102771b9cf46bed9d5ce8565a558e41700bd46d271edbcac6a253a859cb7a172a3176fe6f9eebaf752417603efde4bda114f8788c8608a32c27fb3087189d92464788c4b62525f616c8725f6abf9d4dce07b8399a0e69860301eefd202480a12e054a920ea3dca3844f6309232c61fcfb17c43e311e336f593615004ed5a4b8be2ebde42af53d5fa32a7790ca80fc234a3034f9151c43f2eea7585049b4aad29392d9e9285b011b73cf2c6af955bb236b15857fb2789ec0149c253b23f8232627bd48f36ce4e8bea688d8b64d7469b2072912fb4719cb6894a14986fc875c84c220649f3c48e3a662f4c4f8b0c259529e2b6d3696c45cd1b11f02bd752022b0e7a2599bbca90cb8290789d71bd990d18418bba1e7fca94de8833d95851c88876c42fe817d3025a5076307c85b59add5f81771cbccfaaff14f7fb8807bf88902cdc39ca0a398f8bec67971cf8b771d941204515478d4c8dd014aa27e099cad61aa267ee25fb61d23e5d33ed0e2ad08bfd60c2af2b362d35851adaf161bf289d100b65ccf2050aab6c951e44a010140914e18ceed56ed6655d046f37dd75198590f95200ada816be88cff9fb1ed2aba308c1e556fa4987309f9d3c380432429cc72e8e146a24c339c989d2266c0f1503737075913b800fedc3b85ed5060567231334467aa6104824b79ca8f99ff263fff52","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_6"},{"Input":"19ca1f96e3289c5656d4c10352144f657c2a89428b7d4330f1e888e3b5b4c15f0de956aa5db71cb39c88cc5ff11e8df5787040891ffab3e2322331fe4e6201b02ffe5b0350192676ee46b31b41c8eaab8ff9122487b9a86b2147b709e37824d02d129f764acabf37e490ce7db53ce2b4209312ca1ad424ebe4eb2ffdaf952a1c1d2063094e546d7e3cbdd07683995f7cbeea09048a904620710923326bf480bd2ee7a2404a0ab6a5b20587081e2f0f630fcc68a139dc635f8207585b699423471ebb4494c2132e960ecee3fefe726c9e8eb207ec6fb922848c20f07f3b6d7ba82ed48a102edf74b6c2a0c3c00047d6678cbbb864407f6760c775ab1266a81c9f2af3cb009291b217d880b7ecf3b88892fde66c985b2b35301d57d9d318401d601e6a4284a43791de04f5c26f29e2e25cb24947adca7e56e1a1ba03cbcba210873004b001fee1e9c6bcd17fdc287f3fd7d4fb0e7f9bc7cd8913037bbb6cd274c21e18b879ae003f24a516097ab114e576c31fc502205e73c1683e0cbaf5fccfe4227f0999fa8cd65d01d281d748ead19540ad1357f3d274b9436d0613bb6482ca2e483b36141dd465a809d324e89a886b3f2a5ba534b0ed5cdead910976659e400f9f0c6e1f4818f8f3ece446e040cda8d27f2f4cfa38e5afb0ca691ab8d113912bd785bb3e736b6a7afacad81a158a57da7a97b1ee82552a94dc17ea082248871902e71297e8e6e985600d8f1deecdc5451f3479e26eea5b396c5352135dc756290ef2305fd43f9275f9b6178180c0ebf3491805239d48e69098c098bde9b6b020f6e519b7863257805e6ffd912294a88711da15864cb78e502c5b7b1c634549155ac0155509b12aaba95cdd1fceb1b5495d5939ea66d3eb606d69f55f22129717993d14d3e9ff2d2f28a318be897d946db05f16e0a705846da2456158d7b98516435dab869cae65a3c9ac4014e52bff7cf183dc4d82706c2ca79104e79aa37b04c3eac831729d837db141e3c7240a766af3fefd712513d9b7704e296ba3c66d2f5546d9a6e362e67593a4ff76ced1767499f61a0aaa35c9adc86e38c046fb0c1d550a18938b0b632ea33b06861bf18aa759f7d19948f4c24789908e40109c6d0ee52be9aa3f2c00131231041c97b788f3d548f8b28bad245a8d744a57bf5c9b137ca7b30ae3f2c8ae8fd3e84e2b8a4ccfe1904994adea9749f55ba7a9bdfef206d28044f2efdcce3ebfc443ae1d8052147eb6d42d0343c206e39292aea132250de83503b212199cf0bf67e3c2a54a54a30afe637ad5f6d74c7e0e0f4f881c1d1e05f6e8cec4135b5c008a1bb843dc3e857d52fcee2a520298bab9282ac416d30ee84e99ee78dfc286b28e60b703136a332de95908117b63c477f309b2ae97022ed6f1a54b994516164004cf5145fc37e8c4871a7055dd1668f797e6609b6d881f6794947b847bc4798f90f274abe605139ed0a8c08afdbe5fb842d7e0ad4e772cf7cb838b23413b68a82a4fd4cfd1f150cd6182df388bb9bfea8cb902ad77e108d7e448a55857369705cbe23efa58bcb60731c977443b7f3b7d78a144579b710ad1010ca4cb30c2d8e9f44f401461baf57093514172eec86e1f018971e28c8d2dd5b5b43873bc63509d967e2b30bd4bb162db4745faf47a64593bcb04c4dc342e7031b0e887aab9abfbe75f761421d85d00fa7a862eb129a79bc9a3dff1345b17b5e7516f4aabf9a49dcf75d6a53ad9420a22f793dd68d9c3aa7c942b6131fb01222d75b7a5d00f267c9bf23d1da0891520489adc3ba71e158d06e2b936a42915a91b7f99341ecbcd5f65b99e100a5d3f01031383ec05efa2ca4e8f8770283922c588ddd38c3efd160bdf296ae4aa7ba35c958fd9e2d77ab1774ec91a252906147e4d85e1493457ff7eaebb505f8522b556c4b6f487680fe918699737fc2dac2c517bf5f945c38479ceedab8ad69dfad8818d7f6986cdc40c40c7f254d837aa190518980d7b47c3078000f8fef69839a3946f26bcddce283c172a481ed4add416f39f0f0fe9c767d85d2c362ab71b74782c1cdb836a060da40adbdd3a401ee80727125b95da0ba13ce26d2dcf5e685924fca207e9600a9cdeb4a6e569638258300e435d19bca9105c292e6b1d3f4faa9c9640c014bbf0e537156e1140954609","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_7"},{"Input":"1fa11f66353f7a956254f3b98892d9c0f81a654f6609e0f0af13c2f8766c6f16194657ac1800e822825a05aa50d889e603dbbf4fc8e954f3b6f25fb23d5a5479142bf7baf53de4fc8668bbd4c019c0f6b7af0fec0c17ab0b107c83d25e4d18a52ef429052a9b35b41d51163583d57d79c420be96a1554051174b9ea1698878f11b36ee817c1b97813172a6418fb2937898fe7847dde90b6ff50b6b2a34cded942f593eeabb3b9d60300b894b05f78594a82af66d9117ea00224b4a21d7cf9ff51f70c6b295fa70454024594501c593b3aa26e4a93e66a0f38c3fa1d28c1612e91d631437bb2c0b4c9848a8fd19a1f8e3ac50ae338c9b516cc4049310ba4df21f287c33f63043e7e6ab5a1d13f7e759924743b9e46ded795c2c5ab93a909a3f7315530c731d9ba3398de10f401474f70944267f7ae20d0721edb0c0d48aacdfb501132d8f620cf839dfb326b07e46879ef281630486e202f6a5b3ee25d7bfa5d80e850b940cb4236be15cff7fa6f0afe97d4074d08cc84e9fc2c3af23892d61b63026dba27ff40c376fbe12ba44f231cb58178d22dcdf94e555a0fde0266d30002dab14694741bbac573bd15720b01915261df1442a03b424fbeea31b9f525c090ba172060641818b4c8221b8e01aab9788bb736e262e18f179221f6db532bae8058c38b8572443b8e87233d95e71b98acb2c946f149becc8ce8f259a89bffe962917050d74536bb197c472473578db35d84baa6c6ae9f9b436f0be637300423f198a1c23d945422603b6867cc421baac70d469d72d81380292e07297df63b5c01d61214817267145a6b0aea09a9bf2159d7360c4a7eb0a8c28a7e455c8ea3b540b5fc38fa57a56e8987689e52dc7ca0342c83789b8cb5717473014e1802469d01ca6d73befee617ad1012a1aeec56bc4d85e5f9fa8c98a49640c3543752250e921ef6447d718c318e7375b8903222b36ca85554932dcde661bd0e757a2037f4a1ab9425315926458a4e98d280cc10ed597c6c1af13de72471b52bc15d998d3232d2d849b0f73599c8ef253dda011b06a0f5c7fca436be16db5a6c389fb9cebbe0cf834015436d91dee19a986853c38160ad423bf52b4131487b5dafabece4d352e5dd076ceae35ef158c4b8016d3e4358c5e00a6d6fba7b3e319af57cfb7eeab1b64d4fd598ff6ebc85bf4e00445567736905d23864b42926019dcb0d924e90113ab53b025ba35c881dcf5a659f07632d4afae70d36c2cc547fb18898eca81401dba824b34f4ca6aef0edafa43b22378182199c62f74664f8bd35ab7836b318526669195ff4f5ce7fbad03d22789113e2328e4c4e49e3d81c78384315490295817075dbe3988e067faf0e1b4a9341a202e2616676282e029960b4ca852f528ed0e3f852bd6074625bfd6f46948973ac6ddf8fd1fa87a304eae65a6b2a53d50ea05db05521cfe31ec72869bcdfeb019276208720a0d33ee2ca8ab00ec09099e9c235971953f2ad06d4df01028cbe0f6449758345cb1d4ae4bedb642f84ca9e69e21eb1b1d639939504d29f7649423a34e9ddd3fc1e1648d3a6f717af7efd47f841696819248f6d189b54becec21119346431546391cba18e4badd3660cfba53a91c3b2218293d03778fafeff37c2ea71c3bb6823a1eeef64065f4b45cff7169a02a9934fda95861ec8d0768bc5cad58f79d854bd32503a3c72fe40417cee1d4d81a9d1e78f93cf5cafd2362809d788176ab88c1007a69f234a60a50cd0c00857600e144962a0dd987d284313a55210246ec51f3975707719aaa3f8cf6ef757c47226a5907f5019a2d5a82cea4b790e0deb00f70646c7124b8202b5f29f26dc20a12f4430158da8c567ff51da95b9e26ec39bbaac5e32f6a3cede1f933a8b76aa805201d3367d76248671d8412345ecaf89c599e5a88b93d347ad99a6e249af4a322a73a9d41b0d5350111018c3d9987926037a027101683dc814ec07f07daa46d103731cfa07557be53f12153ae35de17d65274fcc4bd4e15ac961d837a8e68ad24b542fa29ffca7fa5d883d1413e6c8183aff268ab0b4c516d88088a0102e2fb2999edcab90a5efc1a3f78ef830660161c361cf699eab00341565881f1c374f50b5012db4af00642b53ec15a66a315cfcbeac29674c3e619870d04810bea6268","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_8"},{"Input":"2f5a89469bfe012ba76459c35dc24c1aaddec05eee130879f7258d71c97f03072a93777508a68599449e21e16cf2b640f0ac5256231548f2c9e50ae4ab5e2ab7164dab50c5945811423d8717b2f08c524dca34fe055110059a5bb8efefef74e41c89dcffa0b3df9389dbab8f04a89cc52d76485eb690c5a80978f41c33be93f42a7f7a7181c0431613af56e9c2d461a71c0dca94aa3e19736d8cbc3467d841db2815f183c8fb13e36b83a9a6dd99238975ee7578b4dcd316c82818ce012092902aea97784a5249ed59850e30f1d7eb74e9526ad94f5c32af18124ae5913cf456064aae479b94db0dda94455282d2a5bcffd99d5e7749d631125dee0f33c3c0c1288aae58ea8eb4202f12883fc0fcdd68822e03f63a12d6242b0087a8a1495f7c1be646ac485c0d2b972185613095e4d65cc62bcf5b3913de994b430027ea5baf0e30fec7ffcd23b4d7a6adca3c8c994e17f94c76042af6b48441963bd5b478ab11aba040f130739fce83eb9c79c4a86eb251f79152f92afe5d81602744259567095129ca02f619571508cd4f14e669bc759afdf2a98f105ee1d19cc5c8666a7b2059b1d1d6524ebee64551aff3c1c058bc84ba359a85153c6840f9fb99406e4400750e00181c4c86d88d338f58ddd60e5a5b80f83d1926b199951fd27012377c28f1e937b0867a30e1617c85e1dc0a867aa5807b719aa1496cd41acd4a3cb2991018dfefe4eb662fa1a8c892d1971077cb3b81e43c75f412bf4ff67fa9e815cd179228ad0e86867ebd465e80e0523cae366cccf230dd02b58b4dc334f76d8efc1c1657225ab3c04d3e48ef50feb4b1133655c54465ace6d5f4d9222997430e302028fe47b83ec99feb177ddd4def70f8d7c3d774e6198476216ee7d9409b159426b7fcfe50427a47af55719f445ce0ac65f6b444825fa7fb4aa602fa343ae8040e62f09e7e4fd1db2662c0087ca9782f37626d91df409123399dd5c2823268f725da972ca1fae6732cfbf12bd9e5869b5dd7ade24e58d1914de52a6e6c24df6e25c64ab46e4bc7f94167fbe9daa225946046a1261b42fa6d1de0d471ec68aa9f22401b525d3f7e9847bd13103aa28e4bf2e1f47a545f3f7cdcf1621fd9c50cc10f0a2bb7c52925b718b23d79422d7990c7273427262817896b3aaaca889ded820c917c1610cdfcc5821b58b4aea58c86d5793d520d9d8da0a26503fed44591a409f0a9eb7fe6a724ac3f3f7e156c549fa4b51fd0a05231f3fc26b3754ef8aa031a9235db06ff5857739b5ac772d671f809e865cd6d9549bb2f4372f194ee2db50e8e538da6c93dc08c2e85e029c1bfaf6132f18723c06bda51310ef1b746078a2a81296acde9cd3c2de9c5085d319a33d367fb2d19db1b610a376087d1d4596b22909b27282665c97809407bce99fea04e3ebb87e95e0df79e41d67857447f71018c7682174152456cd66cdd61175e8d139985b502ef4a4730334311d794a9a219b49ef5a08c7d3e6b4142a36591873fe04e3f6c218982bb9a7892d8edfb33d90c10f844fde21c32be49991aff39b1c5d5a0875f0ca696b016821fde000d76711b26c07ccd8f5fb96f3a5a5be4d92116c5a786f1f0f762029fb04ad749802df01b91fe1767d07ad8d6fc7b12dacc12c1e0dd32301b60f5579b2e13d751ea08d620421abc8a1bf2246e62468498a1550687dffd7e15c5e7a74fa55b81d5bdeeb6236265d34c29d7d7ff5cbdf071e6489a784e75ed652aba5814530dc2fe2a065c299c3011037f4aec635d14bd3c9a6113b7411d745cdbe920133008642310a3231c7acee4ae528f9cbd2aa8e73f7fdc37067fa7eac6ba22d4bb9b40b96fde7d371d47cd1b8dbc4d5d4a8bf2b60721b9c1b21cb53e268751ec7212804ad98355dc12f7c8d64a99628ac80dac6acbe0b16220fa9ddba015ba16f06c8c57ccfd506418ebdf0ce1738762d3505949ffea9427406d55605b54d05e1c8f1f63cc760f7818f76c8f1552dd6e7572c2e2e84e7ecc83febedf5a789977325ab2fea33a61140baaa1f9d64fb647b4ed54db970b32eb9aec6aba90e6e8ad68b2293e39ef6768074635c4e095ae39e6374b99a6abc4e89155d6e1c5a0a135703c5be082fd44d715060535996f9642fecc139d06a140f8f78b100099740dc0325156b43727224a","Expected":"0000000000000000000000000000000000000000000000000000000000000000","Name":"bnpair_8_9"}] \ No newline at end of file