diff --git a/benchmarking-cli/Cargo.toml b/benchmarking-cli/Cargo.toml index ae14b8e..67baeed 100644 --- a/benchmarking-cli/Cargo.toml +++ b/benchmarking-cli/Cargo.toml @@ -4,7 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -clap = { version = "4.0", features = ["derive"] } -miden_vm = { version = "0.5.0", package = "miden-vm", features = ["concurrent"]} +clap = { version = "4.0.0", features = ["derive"] } +hex = { version = "0.4.0", default-features = false } +miden-stdlib = { version = "0.5.0", package = "miden-stdlib", default-features = false } +miden_vm = { version = "0.6.0", package = "miden-vm", features = ["concurrent"]} serde = { version = "1", features = ["derive"] } # You only need this if you want app persistence serde_json = "1.0.48" diff --git a/benchmarking-cli/README.md b/benchmarking-cli/README.md index d8a7ed3..6ecb5ab 100644 --- a/benchmarking-cli/README.md +++ b/benchmarking-cli/README.md @@ -18,7 +18,7 @@ and then OR you run ``` -cargo run -- -e fibonacci +cargo run --release -- -e fibonacci ``` You can pass two additional parameters to the CLI `security` and `output`. `security` can be `"high"` for 128-bit security and will default to 96-bit. `output` defines the number of stack outputs the program returns. It defaults to 1. diff --git a/benchmarking-cli/src/main.rs b/benchmarking-cli/src/main.rs index 9b760c3..8eb80a2 100644 --- a/benchmarking-cli/src/main.rs +++ b/benchmarking-cli/src/main.rs @@ -1,43 +1,10 @@ +mod utils_input; +mod utils_program; use clap::Parser; -use miden_vm::{ - AdviceInputs, Assembler, Kernel, MemAdviceProvider, ProgramInfo, ProofOptions, StackInputs, -}; +use miden_vm::ProofOptions; use std::fs; use std::time::Instant; -#[derive(serde::Deserialize, serde::Serialize)] -pub struct InputFile { - pub operand_stack: Vec, - pub advice_stack: Option>, -} - -// Parse operand_stack vector of strings to a vector of u64 -fn parse_advice_provider(advice_input_file: &InputFile) -> Result { - let tape = advice_input_file - .advice_stack - .as_ref() - .map(Vec::as_slice) - .unwrap_or(&[]) - .iter() - .map(|v| v.parse::().map_err(|e| e.to_string())) - .collect::, _>>()?; - let advice_inputs = AdviceInputs::default() - .with_stack_values(tape) - .map_err(|e| e.to_string())?; - Ok(MemAdviceProvider::from(advice_inputs)) -} - -// Parse advice_stack vector of strings to a vector of u64 -fn parse_stack_inputs(stack_input_file: &InputFile) -> Result { - let stack_inputs = stack_input_file - .operand_stack - .iter() - .map(|v| v.parse::().map_err(|e| e.to_string())) - .collect::, _>>()?; - - StackInputs::try_from_values(stack_inputs).map_err(|e| e.to_string()) -} - #[derive(Parser)] #[clap( author = "Polygon Miden", @@ -89,78 +56,58 @@ fn main() -> Result<(), Box> { // let's read the program let program_string = fs::read_to_string(format!("../examples/{}.masm", &args.example))?; - // let's read the input files - let input_string = fs::read_to_string(format!("../examples/{}.inputs", &args.example)) - .map_err(|err| format!("Failed to open input file `{}` - {}", &args.example, err))?; - let inputs_des: InputFile = serde_json::from_str(&input_string) - .map_err(|err| format!("Failed to deserialize input data - {}", err)) - .unwrap(); - - let advice_provider = parse_advice_provider(&inputs_des).unwrap(); - let stack_input = parse_stack_inputs(&inputs_des).unwrap(); + let input_string = fs::read_to_string(format!("../examples/{}.inputs", &args.example))?; + let mut inputs = utils_input::Inputs::new(); + inputs + .deserialize_inputs(input_string.as_str()) + .map_err(|err| format!("Failed to deserialize inputs - {:?}", err))?; // Compilation time let now = Instant::now(); - let assembler = Assembler::default(); - let program = assembler - .compile(&program_string) - .expect("Could not compile source"); + let mut program = utils_program::MidenProgram::new(program_string.as_str()); + program + .compile_program() + .map_err(|err| format!("Failed to compile program - {:?}", err))?; println! {"Compilation Time (cold): {} ms", now.elapsed().as_millis()} - let program_hash = program.hash(); - let kernel = Kernel::default(); - let program_info = ProgramInfo::new(program_hash, kernel); - - let now = Instant::now(); - let _program2 = assembler - .compile(&program_string) - .expect("Could not compile source"); - - println! {"Compilation Time (hot): {} ms", now.elapsed().as_millis()} - - let stack_input_cloned = stack_input.clone(); - let advice_provider_cloned = advice_provider.clone(); + let program_to_run = program.program.clone().unwrap(); // Execution time let now = Instant::now(); - let trace = miden_vm::execute(&program, stack_input_cloned, advice_provider_cloned) - .map_err(|err| format!("Failed to generate exection trace = {:?}", err)) - .unwrap(); + let trace = miden_vm::execute( + &program_to_run, + inputs.stack_inputs.clone(), + inputs.advice_provider.clone(), + ) + .map_err(|err| format!("Failed to generate exection trace = {:?}", err)) + .unwrap(); println! {"Execution Time: {} steps in {} ms", trace.get_trace_len(), now.elapsed().as_millis()} // Proving time let proof_options = if args.security == "high" { - ProofOptions::with_128_bit_security() + ProofOptions::with_128_bit_security(false) } else { - ProofOptions::with_96_bit_security() + ProofOptions::with_96_bit_security(false) }; - // let's clone the stack_input and advice_provider - // because they are moved into the closure - let stack_input_cloned = stack_input.clone(); - let advice_provider_cloned = advice_provider.clone(); - let now = Instant::now(); let (output, proof) = miden_vm::prove( - &program, - stack_input_cloned, - advice_provider_cloned, + &program.program.unwrap(), + inputs.stack_inputs.clone(), + inputs.advice_provider, proof_options, ) .expect("Proving failed"); println! {"Proving Time: {} ms", now.elapsed().as_millis()} - // let's clone the stack_input and output - // because they are moved into the closure - let stack_input_cloned = stack_input.clone(); - let output_cloned = output.clone(); - // Verification time + let program_info = program.program_info.unwrap(); + let now = Instant::now(); - miden_vm::verify(program_info, stack_input_cloned, output_cloned, proof) + miden_vm::verify(program_info, inputs.stack_inputs, output.clone(), proof) .map_err(|err| format!("Program failed verification! - {}", err))?; println! {"Verification Time: {} ms", now.elapsed().as_millis()} diff --git a/benchmarking-cli/src/utils_input.rs b/benchmarking-cli/src/utils_input.rs new file mode 100644 index 0000000..4a5eb5b --- /dev/null +++ b/benchmarking-cli/src/utils_input.rs @@ -0,0 +1,264 @@ +use miden_vm::{ + crypto::{MerkleStore, MerkleTree, SimpleSmt}, + math::Felt, + utils::collections::BTreeMap, + AdviceInputs, MemAdviceProvider, StackInputs, StackOutputs, Word, +}; + +/// The Outputs struct is used to serialize the output of the program. +/// Via Rust WASM we cannot return arbitrary structs, so we need to serialize it to JSON. +/// Here we need the Outputs because they can be inputs for the verifier. +#[derive(serde::Deserialize, serde::Serialize)] +pub struct Outputs { + pub stack_output: Vec, + pub trace_len: Option, + pub overflow_addrs: Option>, + pub proof: Option>, +} + +// MERKLE DATA +// ================================================================================================ + +/// Struct used to deserialize merkle data from input file. Merkle data can be represented as a +/// merkle tree or a sparse merkle tree. +#[derive(serde::Deserialize)] +pub enum MerkleData { + /// String representation of a merkle tree. The merkle tree is represented as a vector of + /// 32 byte hex strings where each string represents a leaf in the tree. + #[serde(rename = "merkle_tree")] + MerkleTree(Vec), + /// String representation of a sparse merkle tree. The sparse merkle tree is represented as a + /// vector of tuples where each tuple consists of a u64 node index and a 32 byte hex string + /// representing the value of the node. + #[serde(rename = "sparse_merkle_tree")] + SparseMerkleTree(Vec<(u64, String)>), +} + +// INPUT FILE +// ================================================================================================ + +// TODO consider using final types instead of string representations. +/// Input file struct that is used to deserialize input data from file. It consists of four +/// components: +/// - operand_stack +/// - advice_stack +/// - advice_map +/// - merkle_store +#[derive(serde::Deserialize)] +pub struct InputFile { + /// String representation of the initial operand stack, composed of chained field elements. + pub operand_stack: Option>, + /// Optional string representation of the initial advice stack, composed of chained field + /// elements. + pub advice_stack: Option>, + /// Optional map of 32 byte hex strings to vectors of u64s representing the initial advice map. + pub advice_map: Option>>, + /// Optional vector of merkle data which will be loaded into the initial merkle store. Merkle + /// data is represented as 32 byte hex strings and node indexes are represented as u64s. + pub merkle_store: Option>, +} + +/// Helper methods to interact with the input file +impl InputFile { + /// Parse advice provider data from the input file. + pub fn parse_advice_provider(&self) -> Result { + let mut advice_inputs = AdviceInputs::default(); + + let stack = self + .parse_advice_stack() + .map_err(|e| format!("failed to parse advice provider: {e}"))?; + advice_inputs = advice_inputs + .with_stack_values(stack) + .map_err(|e| e.to_string())?; + + if let Some(map) = self + .parse_advice_map() + .map_err(|e| format!("failed to parse advice provider: {e}"))? + { + advice_inputs = advice_inputs.with_map(map); + } + + if let Some(merkle_store) = self + .parse_merkle_store() + .map_err(|e| format!("failed to parse advice provider: {e}"))? + { + advice_inputs = advice_inputs.with_merkle_store(merkle_store); + } + + Ok(MemAdviceProvider::from(advice_inputs)) + } + + /// Parse advice stack data from the input file. + fn parse_advice_stack(&self) -> Result, String> { + self.advice_stack + .as_ref() + .map(Vec::as_slice) + .unwrap_or(&[]) + .iter() + .map(|v| { + v.parse::() + .map_err(|e| format!("failed to parse advice stack value `{v}` - {e}")) + }) + .collect::, _>>() + } + + /// Parse advice map data from the input file. + fn parse_advice_map(&self) -> Result>>, String> { + let advice_map = match &self.advice_map { + Some(advice_map) => advice_map, + None => return Ok(None), + }; + + let map = advice_map + .iter() + .map(|(k, v)| { + // decode hex key + let mut key = [0u8; 32]; + hex::decode_to_slice(k, &mut key) + .map_err(|e| format!("failed to decode advice map key `{k}` - {e}"))?; + + // convert values to Felt + let values = v + .iter() + .map(|v| { + Felt::try_from(*v).map_err(|e| { + format!("failed to convert advice map value `{v}` to Felt - {e}") + }) + }) + .collect::, _>>()?; + Ok((key, values)) + }) + .collect::>, String>>()?; + + Ok(Some(map)) + } + + /// Parse merkle store data from the input file. + fn parse_merkle_store(&self) -> Result, String> { + let merkle_data = match &self.merkle_store { + Some(merkle_data) => merkle_data, + None => return Ok(None), + }; + + let mut merkle_store = MerkleStore::default(); + for data in merkle_data { + match data { + MerkleData::MerkleTree(data) => { + let leaves = parse_merkle_tree(data)?; + let merkle_tree = MerkleTree::new(leaves) + .map_err(|e| format!("failed to add merkle tree to merkle store - {e}"))?; + merkle_store.extend(merkle_tree.inner_nodes()); + } + MerkleData::SparseMerkleTree(data) => { + let entries = parse_sparse_merkle_tree(data)?; + // TODO: Support variable depth + let smt = + SimpleSmt::with_leaves(SimpleSmt::MAX_DEPTH, entries).map_err(|e| { + format!("failed to add sparse merkle tree to merkle store - {e}") + })?; + merkle_store.extend(smt.inner_nodes()); + } + } + } + + Ok(Some(merkle_store)) + } + + /// Parse and return the stack inputs for the program. + pub fn parse_stack_inputs(&self) -> Result { + let operand_stack = match self.operand_stack.as_ref() { + Some(operand_stack) => operand_stack, + None => return Ok(StackInputs::default()), + }; + + let stack_inputs = operand_stack + .iter() + .map(|v| v.parse::().map_err(|e| e.to_string())) + .collect::, _>>()?; + + StackInputs::try_from_values(stack_inputs).map_err(|e| e.to_string()) + } +} + +/// Miden Inputs plus Outputs that are used as inputs for the verifier. +pub struct Inputs { + pub stack_inputs: StackInputs, + pub advice_provider: MemAdviceProvider, + pub stack_outputs: StackOutputs, +} + +/// We need to implement the default trait for the Inputs struct. +impl Inputs { + pub fn new() -> Self { + Self { + stack_inputs: StackInputs::new(vec![]), + advice_provider: MemAdviceProvider::default(), + stack_outputs: StackOutputs::new(vec![], vec![]), + } + } + + pub fn deserialize_inputs(&mut self, inputs: &str) -> Result<(), String> { + if !inputs.trim().is_empty() { + let inputs_des: InputFile = serde_json::from_str(inputs).map_err(|e| e.to_string())?; + + self.stack_inputs = inputs_des.parse_stack_inputs().unwrap(); + self.advice_provider = inputs_des.parse_advice_provider().unwrap(); + } + Ok(()) + } +} + +/// Parse and return merkle tree leaves. +fn parse_merkle_tree(tree: &[String]) -> Result, String> { + tree.iter() + .map(|v| { + let leaf = parse_word(v)?; + Ok(leaf) + }) + .collect() +} + +/// Parse and return sparse merkle tree entries. +fn parse_sparse_merkle_tree(tree: &[(u64, String)]) -> Result, String> { + tree.iter() + .map(|(index, v)| { + let leaf = parse_word(v)?; + Ok((*index, leaf)) + }) + .collect() +} + +/// Parse a `Word` from a hex string. +pub fn parse_word(word_hex: &str) -> Result { + let mut word_data = [0u8; 32]; + hex::decode_to_slice(word_hex, &mut word_data) + .map_err(|e| format!("failed to decode `Word` from hex {word_hex} - {e}"))?; + let mut word = Word::default(); + for (i, value) in word_data.chunks(8).enumerate() { + word[i] = Felt::try_from(value).map_err(|e| { + format!("failed to convert `Word` data {word_hex} (element {i}) to Felt - {e}") + })?; + } + Ok(word) +} + +#[test] +fn test_parse_output() { + let output_str: &str = r#" + { + "stack_output": [3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "overflow_addrs": [0, 1], + "trace_len": 1024 + }"#; + + let mut inputs: Inputs = Inputs::new(); + inputs.deserialize_outputs(output_str).unwrap(); + + let output: StackOutputs = inputs.stack_outputs; + + assert_eq!( + output.stack(), + vec![3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ); + assert_eq!(output.overflow_addrs(), vec![0, 1]); +} diff --git a/benchmarking-cli/src/utils_program.rs b/benchmarking-cli/src/utils_program.rs new file mode 100644 index 0000000..733bc53 --- /dev/null +++ b/benchmarking-cli/src/utils_program.rs @@ -0,0 +1,43 @@ +use miden_stdlib::StdLibrary; +use miden_vm::{Assembler, Kernel, Program, ProgramInfo}; + +pub struct MidenProgram { + pub assembler: Assembler, + pub masm_code: String, + pub program: Option, + pub program_info: Option, +} + +impl MidenProgram { + pub fn new>(code_as_str: S) -> Self { + Self { + assembler: Assembler::default(), + masm_code: code_as_str.as_ref().to_string(), + program: None, + program_info: None, + } + } + + pub fn compile_program(&mut self) -> Result<(), String> { + self.assembler = Assembler::default() + .with_library(&StdLibrary::default()) + .map_err(|err| format!("Failed to load stdlib - {}", err))? + .with_debug_mode(false); + + self.program = Some( + self.assembler + .compile(&self.masm_code) + .map_err(|err| format!("Failed to compile program - {}", err))?, + ); + + self.program_info = Some(ProgramInfo::new( + self.program + .clone() + .expect("Could not compile program") + .hash(), + Kernel::default(), + )); + + Ok(()) + } +} diff --git a/examples/merkle_inclusion.inputs b/examples/merkle_inclusion.inputs new file mode 100644 index 0000000..317116d --- /dev/null +++ b/examples/merkle_inclusion.inputs @@ -0,0 +1,1007 @@ +{ + "operand_stack": ["13289896116254713003", "7746189786889365852", "6635969628956095457", "14093615009148371008", "0", "64"], + "merkle_store": [ + {"sparse_merkle_tree": [ + [0, "0000000000000000000000000000000000000000000000000000000000000000"], + [1, "0000000000000000000000000000000000000000000000000100000000000000"], + [2, "0000000000000000000000000000000000000000000000000200000000000000"], + [3, "0000000000000000000000000000000000000000000000000300000000000000"], + [4, "0000000000000000000000000000000000000000000000000400000000000000"], + [5, "0000000000000000000000000000000000000000000000000500000000000000"], + [6, "0000000000000000000000000000000000000000000000000600000000000000"], + [7, "0000000000000000000000000000000000000000000000000700000000000000"], + [8, "0000000000000000000000000000000000000000000000000800000000000000"], + [9, "0000000000000000000000000000000000000000000000000900000000000000"], + [10, "0000000000000000000000000000000000000000000000000a00000000000000"], + [11, "0000000000000000000000000000000000000000000000000b00000000000000"], + [12, "0000000000000000000000000000000000000000000000000c00000000000000"], + [13, "0000000000000000000000000000000000000000000000000d00000000000000"], + [14, "0000000000000000000000000000000000000000000000000e00000000000000"], + [15, "0000000000000000000000000000000000000000000000000f00000000000000"], + [16, "0000000000000000000000000000000000000000000000001000000000000000"], + [17, "0000000000000000000000000000000000000000000000001100000000000000"], + [18, "0000000000000000000000000000000000000000000000001200000000000000"], + [19, "0000000000000000000000000000000000000000000000001300000000000000"], + [20, "0000000000000000000000000000000000000000000000001400000000000000"], + [21, "0000000000000000000000000000000000000000000000001500000000000000"], + [22, "0000000000000000000000000000000000000000000000001600000000000000"], + [23, "0000000000000000000000000000000000000000000000001700000000000000"], + [24, "0000000000000000000000000000000000000000000000001800000000000000"], + [25, "0000000000000000000000000000000000000000000000001900000000000000"], + [26, "0000000000000000000000000000000000000000000000001a00000000000000"], + [27, "0000000000000000000000000000000000000000000000001b00000000000000"], + [28, "0000000000000000000000000000000000000000000000001c00000000000000"], + [29, "0000000000000000000000000000000000000000000000001d00000000000000"], + [30, "0000000000000000000000000000000000000000000000001e00000000000000"], + [31, "0000000000000000000000000000000000000000000000001f00000000000000"], + [32, "0000000000000000000000000000000000000000000000002000000000000000"], + [33, "0000000000000000000000000000000000000000000000002100000000000000"], + [34, "0000000000000000000000000000000000000000000000002200000000000000"], + [35, "0000000000000000000000000000000000000000000000002300000000000000"], + [36, "0000000000000000000000000000000000000000000000002400000000000000"], + [37, "0000000000000000000000000000000000000000000000002500000000000000"], + [38, "0000000000000000000000000000000000000000000000002600000000000000"], + [39, "0000000000000000000000000000000000000000000000002700000000000000"], + [40, "0000000000000000000000000000000000000000000000002800000000000000"], + [41, "0000000000000000000000000000000000000000000000002900000000000000"], + [42, "0000000000000000000000000000000000000000000000002a00000000000000"], + [43, "0000000000000000000000000000000000000000000000002b00000000000000"], + [44, "0000000000000000000000000000000000000000000000002c00000000000000"], + [45, "0000000000000000000000000000000000000000000000002d00000000000000"], + [46, "0000000000000000000000000000000000000000000000002e00000000000000"], + [47, "0000000000000000000000000000000000000000000000002f00000000000000"], + [48, "0000000000000000000000000000000000000000000000003000000000000000"], + [49, "0000000000000000000000000000000000000000000000003100000000000000"], + [50, "0000000000000000000000000000000000000000000000003200000000000000"], + [51, "0000000000000000000000000000000000000000000000003300000000000000"], + [52, "0000000000000000000000000000000000000000000000003400000000000000"], + [53, "0000000000000000000000000000000000000000000000003500000000000000"], + [54, "0000000000000000000000000000000000000000000000003600000000000000"], + [55, "0000000000000000000000000000000000000000000000003700000000000000"], + [56, "0000000000000000000000000000000000000000000000003800000000000000"], + [57, "0000000000000000000000000000000000000000000000003900000000000000"], + [58, "0000000000000000000000000000000000000000000000003a00000000000000"], + [59, "0000000000000000000000000000000000000000000000003b00000000000000"], + [60, "0000000000000000000000000000000000000000000000003c00000000000000"], + [61, "0000000000000000000000000000000000000000000000003d00000000000000"], + [62, "0000000000000000000000000000000000000000000000003e00000000000000"], + [63, "0000000000000000000000000000000000000000000000003f00000000000000"], + [64, "0000000000000000000000000000000000000000000000004000000000000000"], + [65, "0000000000000000000000000000000000000000000000004100000000000000"], + [66, "0000000000000000000000000000000000000000000000004200000000000000"], + [67, "0000000000000000000000000000000000000000000000004300000000000000"], + [68, "0000000000000000000000000000000000000000000000004400000000000000"], + [69, "0000000000000000000000000000000000000000000000004500000000000000"], + [70, "0000000000000000000000000000000000000000000000004600000000000000"], + [71, "0000000000000000000000000000000000000000000000004700000000000000"], + [72, "0000000000000000000000000000000000000000000000004800000000000000"], + [73, "0000000000000000000000000000000000000000000000004900000000000000"], + [74, "0000000000000000000000000000000000000000000000004a00000000000000"], + [75, "0000000000000000000000000000000000000000000000004b00000000000000"], + [76, "0000000000000000000000000000000000000000000000004c00000000000000"], + [77, "0000000000000000000000000000000000000000000000004d00000000000000"], + [78, "0000000000000000000000000000000000000000000000004e00000000000000"], + [79, "0000000000000000000000000000000000000000000000004f00000000000000"], + [80, "0000000000000000000000000000000000000000000000005000000000000000"], + [81, "0000000000000000000000000000000000000000000000005100000000000000"], + [82, "0000000000000000000000000000000000000000000000005200000000000000"], + [83, "0000000000000000000000000000000000000000000000005300000000000000"], + [84, "0000000000000000000000000000000000000000000000005400000000000000"], + [85, "0000000000000000000000000000000000000000000000005500000000000000"], + [86, "0000000000000000000000000000000000000000000000005600000000000000"], + [87, "0000000000000000000000000000000000000000000000005700000000000000"], + [88, "0000000000000000000000000000000000000000000000005800000000000000"], + [89, "0000000000000000000000000000000000000000000000005900000000000000"], + [90, "0000000000000000000000000000000000000000000000005a00000000000000"], + [91, "0000000000000000000000000000000000000000000000005b00000000000000"], + [92, "0000000000000000000000000000000000000000000000005c00000000000000"], + [93, "0000000000000000000000000000000000000000000000005d00000000000000"], + [94, "0000000000000000000000000000000000000000000000005e00000000000000"], + [95, "0000000000000000000000000000000000000000000000005f00000000000000"], + [96, "0000000000000000000000000000000000000000000000006000000000000000"], + [97, "0000000000000000000000000000000000000000000000006100000000000000"], + [98, "0000000000000000000000000000000000000000000000006200000000000000"], + [99, "0000000000000000000000000000000000000000000000006300000000000000"], + [100, "0000000000000000000000000000000000000000000000006400000000000000"], + [101, "0000000000000000000000000000000000000000000000006500000000000000"], + [102, "0000000000000000000000000000000000000000000000006600000000000000"], + [103, "0000000000000000000000000000000000000000000000006700000000000000"], + [104, "0000000000000000000000000000000000000000000000006800000000000000"], + [105, "0000000000000000000000000000000000000000000000006900000000000000"], + [106, "0000000000000000000000000000000000000000000000006a00000000000000"], + [107, "0000000000000000000000000000000000000000000000006b00000000000000"], + [108, "0000000000000000000000000000000000000000000000006c00000000000000"], + [109, "0000000000000000000000000000000000000000000000006d00000000000000"], + [110, "0000000000000000000000000000000000000000000000006e00000000000000"], + [111, "0000000000000000000000000000000000000000000000006f00000000000000"], + [112, "0000000000000000000000000000000000000000000000007000000000000000"], + [113, "0000000000000000000000000000000000000000000000007100000000000000"], + [114, "0000000000000000000000000000000000000000000000007200000000000000"], + [115, "0000000000000000000000000000000000000000000000007300000000000000"], + [116, "0000000000000000000000000000000000000000000000007400000000000000"], + [117, "0000000000000000000000000000000000000000000000007500000000000000"], + [118, "0000000000000000000000000000000000000000000000007600000000000000"], + [119, "0000000000000000000000000000000000000000000000007700000000000000"], + [120, "0000000000000000000000000000000000000000000000007800000000000000"], + [121, "0000000000000000000000000000000000000000000000007900000000000000"], + [122, "0000000000000000000000000000000000000000000000007a00000000000000"], + [123, "0000000000000000000000000000000000000000000000007b00000000000000"], + [124, "0000000000000000000000000000000000000000000000007c00000000000000"], + [125, "0000000000000000000000000000000000000000000000007d00000000000000"], + [126, "0000000000000000000000000000000000000000000000007e00000000000000"], + [127, "0000000000000000000000000000000000000000000000007f00000000000000"], + [128, "0000000000000000000000000000000000000000000000008000000000000000"], + [129, "0000000000000000000000000000000000000000000000008100000000000000"], + [130, "0000000000000000000000000000000000000000000000008200000000000000"], + [131, "0000000000000000000000000000000000000000000000008300000000000000"], + [132, "0000000000000000000000000000000000000000000000008400000000000000"], + [133, "0000000000000000000000000000000000000000000000008500000000000000"], + [134, "0000000000000000000000000000000000000000000000008600000000000000"], + [135, "0000000000000000000000000000000000000000000000008700000000000000"], + [136, "0000000000000000000000000000000000000000000000008800000000000000"], + [137, "0000000000000000000000000000000000000000000000008900000000000000"], + [138, "0000000000000000000000000000000000000000000000008a00000000000000"], + [139, "0000000000000000000000000000000000000000000000008b00000000000000"], + [140, "0000000000000000000000000000000000000000000000008c00000000000000"], + [141, "0000000000000000000000000000000000000000000000008d00000000000000"], + [142, "0000000000000000000000000000000000000000000000008e00000000000000"], + [143, "0000000000000000000000000000000000000000000000008f00000000000000"], + [144, "0000000000000000000000000000000000000000000000009000000000000000"], + [145, "0000000000000000000000000000000000000000000000009100000000000000"], + [146, "0000000000000000000000000000000000000000000000009200000000000000"], + [147, "0000000000000000000000000000000000000000000000009300000000000000"], + [148, "0000000000000000000000000000000000000000000000009400000000000000"], + [149, "0000000000000000000000000000000000000000000000009500000000000000"], + [150, "0000000000000000000000000000000000000000000000009600000000000000"], + [151, "0000000000000000000000000000000000000000000000009700000000000000"], + [152, "0000000000000000000000000000000000000000000000009800000000000000"], + [153, "0000000000000000000000000000000000000000000000009900000000000000"], + [154, "0000000000000000000000000000000000000000000000009a00000000000000"], + [155, "0000000000000000000000000000000000000000000000009b00000000000000"], + [156, "0000000000000000000000000000000000000000000000009c00000000000000"], + [157, "0000000000000000000000000000000000000000000000009d00000000000000"], + [158, "0000000000000000000000000000000000000000000000009e00000000000000"], + [159, "0000000000000000000000000000000000000000000000009f00000000000000"], + [160, "000000000000000000000000000000000000000000000000a000000000000000"], + [161, "000000000000000000000000000000000000000000000000a100000000000000"], + [162, "000000000000000000000000000000000000000000000000a200000000000000"], + [163, "000000000000000000000000000000000000000000000000a300000000000000"], + [164, "000000000000000000000000000000000000000000000000a400000000000000"], + [165, "000000000000000000000000000000000000000000000000a500000000000000"], + [166, "000000000000000000000000000000000000000000000000a600000000000000"], + [167, "000000000000000000000000000000000000000000000000a700000000000000"], + [168, "000000000000000000000000000000000000000000000000a800000000000000"], + [169, "000000000000000000000000000000000000000000000000a900000000000000"], + [170, "000000000000000000000000000000000000000000000000aa00000000000000"], + [171, "000000000000000000000000000000000000000000000000ab00000000000000"], + [172, "000000000000000000000000000000000000000000000000ac00000000000000"], + [173, "000000000000000000000000000000000000000000000000ad00000000000000"], + [174, "000000000000000000000000000000000000000000000000ae00000000000000"], + [175, "000000000000000000000000000000000000000000000000af00000000000000"], + [176, "000000000000000000000000000000000000000000000000b000000000000000"], + [177, "000000000000000000000000000000000000000000000000b100000000000000"], + [178, "000000000000000000000000000000000000000000000000b200000000000000"], + [179, "000000000000000000000000000000000000000000000000b300000000000000"], + [180, "000000000000000000000000000000000000000000000000b400000000000000"], + [181, "000000000000000000000000000000000000000000000000b500000000000000"], + [182, "000000000000000000000000000000000000000000000000b600000000000000"], + [183, "000000000000000000000000000000000000000000000000b700000000000000"], + [184, "000000000000000000000000000000000000000000000000b800000000000000"], + [185, "000000000000000000000000000000000000000000000000b900000000000000"], + [186, "000000000000000000000000000000000000000000000000ba00000000000000"], + [187, "000000000000000000000000000000000000000000000000bb00000000000000"], + [188, "000000000000000000000000000000000000000000000000bc00000000000000"], + [189, "000000000000000000000000000000000000000000000000bd00000000000000"], + [190, "000000000000000000000000000000000000000000000000be00000000000000"], + [191, "000000000000000000000000000000000000000000000000bf00000000000000"], + [192, "000000000000000000000000000000000000000000000000c000000000000000"], + [193, "000000000000000000000000000000000000000000000000c100000000000000"], + [194, "000000000000000000000000000000000000000000000000c200000000000000"], + [195, "000000000000000000000000000000000000000000000000c300000000000000"], + [196, "000000000000000000000000000000000000000000000000c400000000000000"], + [197, "000000000000000000000000000000000000000000000000c500000000000000"], + [198, "000000000000000000000000000000000000000000000000c600000000000000"], + [199, "000000000000000000000000000000000000000000000000c700000000000000"], + [200, "000000000000000000000000000000000000000000000000c800000000000000"], + [201, "000000000000000000000000000000000000000000000000c900000000000000"], + [202, "000000000000000000000000000000000000000000000000ca00000000000000"], + [203, "000000000000000000000000000000000000000000000000cb00000000000000"], + [204, "000000000000000000000000000000000000000000000000cc00000000000000"], + [205, "000000000000000000000000000000000000000000000000cd00000000000000"], + [206, "000000000000000000000000000000000000000000000000ce00000000000000"], + [207, "000000000000000000000000000000000000000000000000cf00000000000000"], + [208, "000000000000000000000000000000000000000000000000d000000000000000"], + [209, "000000000000000000000000000000000000000000000000d100000000000000"], + [210, "000000000000000000000000000000000000000000000000d200000000000000"], + [211, "000000000000000000000000000000000000000000000000d300000000000000"], + [212, "000000000000000000000000000000000000000000000000d400000000000000"], + [213, "000000000000000000000000000000000000000000000000d500000000000000"], + [214, "000000000000000000000000000000000000000000000000d600000000000000"], + [215, "000000000000000000000000000000000000000000000000d700000000000000"], + [216, "000000000000000000000000000000000000000000000000d800000000000000"], + [217, "000000000000000000000000000000000000000000000000d900000000000000"], + [218, "000000000000000000000000000000000000000000000000da00000000000000"], + [219, "000000000000000000000000000000000000000000000000db00000000000000"], + [220, "000000000000000000000000000000000000000000000000dc00000000000000"], + [221, "000000000000000000000000000000000000000000000000dd00000000000000"], + [222, "000000000000000000000000000000000000000000000000de00000000000000"], + [223, "000000000000000000000000000000000000000000000000df00000000000000"], + [224, "000000000000000000000000000000000000000000000000e000000000000000"], + [225, "000000000000000000000000000000000000000000000000e100000000000000"], + [226, "000000000000000000000000000000000000000000000000e200000000000000"], + [227, "000000000000000000000000000000000000000000000000e300000000000000"], + [228, "000000000000000000000000000000000000000000000000e400000000000000"], + [229, "000000000000000000000000000000000000000000000000e500000000000000"], + [230, "000000000000000000000000000000000000000000000000e600000000000000"], + [231, "000000000000000000000000000000000000000000000000e700000000000000"], + [232, "000000000000000000000000000000000000000000000000e800000000000000"], + [233, "000000000000000000000000000000000000000000000000e900000000000000"], + [234, "000000000000000000000000000000000000000000000000ea00000000000000"], + [235, "000000000000000000000000000000000000000000000000eb00000000000000"], + [236, "000000000000000000000000000000000000000000000000ec00000000000000"], + [237, "000000000000000000000000000000000000000000000000ed00000000000000"], + [238, "000000000000000000000000000000000000000000000000ee00000000000000"], + [239, "000000000000000000000000000000000000000000000000ef00000000000000"], + [240, "000000000000000000000000000000000000000000000000f000000000000000"], + [241, "000000000000000000000000000000000000000000000000f100000000000000"], + [242, "000000000000000000000000000000000000000000000000f200000000000000"], + [243, "000000000000000000000000000000000000000000000000f300000000000000"], + [244, "000000000000000000000000000000000000000000000000f400000000000000"], + [245, "000000000000000000000000000000000000000000000000f500000000000000"], + [246, "000000000000000000000000000000000000000000000000f600000000000000"], + [247, "000000000000000000000000000000000000000000000000f700000000000000"], + [248, "000000000000000000000000000000000000000000000000f800000000000000"], + [249, "000000000000000000000000000000000000000000000000f900000000000000"], + [250, "000000000000000000000000000000000000000000000000fa00000000000000"], + [251, "000000000000000000000000000000000000000000000000fb00000000000000"], + [252, "000000000000000000000000000000000000000000000000fc00000000000000"], + [253, "000000000000000000000000000000000000000000000000fd00000000000000"], + [254, "000000000000000000000000000000000000000000000000fe00000000000000"], + [255, "000000000000000000000000000000000000000000000000ff00000000000000"], + [256, "0000000000000000000000000000000000000000000000000001000000000000"], + [257, "0000000000000000000000000000000000000000000000000101000000000000"], + [258, "0000000000000000000000000000000000000000000000000201000000000000"], + [259, "0000000000000000000000000000000000000000000000000301000000000000"], + [260, "0000000000000000000000000000000000000000000000000401000000000000"], + [261, "0000000000000000000000000000000000000000000000000501000000000000"], + [262, "0000000000000000000000000000000000000000000000000601000000000000"], + [263, "0000000000000000000000000000000000000000000000000701000000000000"], + [264, "0000000000000000000000000000000000000000000000000801000000000000"], + [265, "0000000000000000000000000000000000000000000000000901000000000000"], + [266, "0000000000000000000000000000000000000000000000000a01000000000000"], + [267, "0000000000000000000000000000000000000000000000000b01000000000000"], + [268, "0000000000000000000000000000000000000000000000000c01000000000000"], + [269, "0000000000000000000000000000000000000000000000000d01000000000000"], + [270, "0000000000000000000000000000000000000000000000000e01000000000000"], + [271, "0000000000000000000000000000000000000000000000000f01000000000000"], + [272, "0000000000000000000000000000000000000000000000001001000000000000"], + [273, "0000000000000000000000000000000000000000000000001101000000000000"], + [274, "0000000000000000000000000000000000000000000000001201000000000000"], + [275, "0000000000000000000000000000000000000000000000001301000000000000"], + [276, "0000000000000000000000000000000000000000000000001401000000000000"], + [277, "0000000000000000000000000000000000000000000000001501000000000000"], + [278, "0000000000000000000000000000000000000000000000001601000000000000"], + [279, "0000000000000000000000000000000000000000000000001701000000000000"], + [280, "0000000000000000000000000000000000000000000000001801000000000000"], + [281, "0000000000000000000000000000000000000000000000001901000000000000"], + [282, "0000000000000000000000000000000000000000000000001a01000000000000"], + [283, "0000000000000000000000000000000000000000000000001b01000000000000"], + [284, "0000000000000000000000000000000000000000000000001c01000000000000"], + [285, "0000000000000000000000000000000000000000000000001d01000000000000"], + [286, "0000000000000000000000000000000000000000000000001e01000000000000"], + [287, "0000000000000000000000000000000000000000000000001f01000000000000"], + [288, "0000000000000000000000000000000000000000000000002001000000000000"], + [289, "0000000000000000000000000000000000000000000000002101000000000000"], + [290, "0000000000000000000000000000000000000000000000002201000000000000"], + [291, "0000000000000000000000000000000000000000000000002301000000000000"], + [292, "0000000000000000000000000000000000000000000000002401000000000000"], + [293, "0000000000000000000000000000000000000000000000002501000000000000"], + [294, "0000000000000000000000000000000000000000000000002601000000000000"], + [295, "0000000000000000000000000000000000000000000000002701000000000000"], + [296, "0000000000000000000000000000000000000000000000002801000000000000"], + [297, "0000000000000000000000000000000000000000000000002901000000000000"], + [298, "0000000000000000000000000000000000000000000000002a01000000000000"], + [299, "0000000000000000000000000000000000000000000000002b01000000000000"], + [300, "0000000000000000000000000000000000000000000000002c01000000000000"], + [301, "0000000000000000000000000000000000000000000000002d01000000000000"], + [302, "0000000000000000000000000000000000000000000000002e01000000000000"], + [303, "0000000000000000000000000000000000000000000000002f01000000000000"], + [304, "0000000000000000000000000000000000000000000000003001000000000000"], + [305, "0000000000000000000000000000000000000000000000003101000000000000"], + [306, "0000000000000000000000000000000000000000000000003201000000000000"], + [307, "0000000000000000000000000000000000000000000000003301000000000000"], + [308, "0000000000000000000000000000000000000000000000003401000000000000"], + [309, "0000000000000000000000000000000000000000000000003501000000000000"], + [310, "0000000000000000000000000000000000000000000000003601000000000000"], + [311, "0000000000000000000000000000000000000000000000003701000000000000"], + [312, "0000000000000000000000000000000000000000000000003801000000000000"], + [313, "0000000000000000000000000000000000000000000000003901000000000000"], + [314, "0000000000000000000000000000000000000000000000003a01000000000000"], + [315, "0000000000000000000000000000000000000000000000003b01000000000000"], + [316, "0000000000000000000000000000000000000000000000003c01000000000000"], + [317, "0000000000000000000000000000000000000000000000003d01000000000000"], + [318, "0000000000000000000000000000000000000000000000003e01000000000000"], + [319, "0000000000000000000000000000000000000000000000003f01000000000000"], + [320, "0000000000000000000000000000000000000000000000004001000000000000"], + [321, "0000000000000000000000000000000000000000000000004101000000000000"], + [322, "0000000000000000000000000000000000000000000000004201000000000000"], + [323, "0000000000000000000000000000000000000000000000004301000000000000"], + [324, "0000000000000000000000000000000000000000000000004401000000000000"], + [325, "0000000000000000000000000000000000000000000000004501000000000000"], + [326, "0000000000000000000000000000000000000000000000004601000000000000"], + [327, "0000000000000000000000000000000000000000000000004701000000000000"], + [328, "0000000000000000000000000000000000000000000000004801000000000000"], + [329, "0000000000000000000000000000000000000000000000004901000000000000"], + [330, "0000000000000000000000000000000000000000000000004a01000000000000"], + [331, "0000000000000000000000000000000000000000000000004b01000000000000"], + [332, "0000000000000000000000000000000000000000000000004c01000000000000"], + [333, "0000000000000000000000000000000000000000000000004d01000000000000"], + [334, "0000000000000000000000000000000000000000000000004e01000000000000"], + [335, "0000000000000000000000000000000000000000000000004f01000000000000"], + [336, "0000000000000000000000000000000000000000000000005001000000000000"], + [337, "0000000000000000000000000000000000000000000000005101000000000000"], + [338, "0000000000000000000000000000000000000000000000005201000000000000"], + [339, "0000000000000000000000000000000000000000000000005301000000000000"], + [340, "0000000000000000000000000000000000000000000000005401000000000000"], + [341, "0000000000000000000000000000000000000000000000005501000000000000"], + [342, "0000000000000000000000000000000000000000000000005601000000000000"], + [343, "0000000000000000000000000000000000000000000000005701000000000000"], + [344, "0000000000000000000000000000000000000000000000005801000000000000"], + [345, "0000000000000000000000000000000000000000000000005901000000000000"], + [346, "0000000000000000000000000000000000000000000000005a01000000000000"], + [347, "0000000000000000000000000000000000000000000000005b01000000000000"], + [348, "0000000000000000000000000000000000000000000000005c01000000000000"], + [349, "0000000000000000000000000000000000000000000000005d01000000000000"], + [350, "0000000000000000000000000000000000000000000000005e01000000000000"], + [351, "0000000000000000000000000000000000000000000000005f01000000000000"], + [352, "0000000000000000000000000000000000000000000000006001000000000000"], + [353, "0000000000000000000000000000000000000000000000006101000000000000"], + [354, "0000000000000000000000000000000000000000000000006201000000000000"], + [355, "0000000000000000000000000000000000000000000000006301000000000000"], + [356, "0000000000000000000000000000000000000000000000006401000000000000"], + [357, "0000000000000000000000000000000000000000000000006501000000000000"], + [358, "0000000000000000000000000000000000000000000000006601000000000000"], + [359, "0000000000000000000000000000000000000000000000006701000000000000"], + [360, "0000000000000000000000000000000000000000000000006801000000000000"], + [361, "0000000000000000000000000000000000000000000000006901000000000000"], + [362, "0000000000000000000000000000000000000000000000006a01000000000000"], + [363, "0000000000000000000000000000000000000000000000006b01000000000000"], + [364, "0000000000000000000000000000000000000000000000006c01000000000000"], + [365, "0000000000000000000000000000000000000000000000006d01000000000000"], + [366, "0000000000000000000000000000000000000000000000006e01000000000000"], + [367, "0000000000000000000000000000000000000000000000006f01000000000000"], + [368, "0000000000000000000000000000000000000000000000007001000000000000"], + [369, "0000000000000000000000000000000000000000000000007101000000000000"], + [370, "0000000000000000000000000000000000000000000000007201000000000000"], + [371, "0000000000000000000000000000000000000000000000007301000000000000"], + [372, "0000000000000000000000000000000000000000000000007401000000000000"], + [373, "0000000000000000000000000000000000000000000000007501000000000000"], + [374, "0000000000000000000000000000000000000000000000007601000000000000"], + [375, "0000000000000000000000000000000000000000000000007701000000000000"], + [376, "0000000000000000000000000000000000000000000000007801000000000000"], + [377, "0000000000000000000000000000000000000000000000007901000000000000"], + [378, "0000000000000000000000000000000000000000000000007a01000000000000"], + [379, "0000000000000000000000000000000000000000000000007b01000000000000"], + [380, "0000000000000000000000000000000000000000000000007c01000000000000"], + [381, "0000000000000000000000000000000000000000000000007d01000000000000"], + [382, "0000000000000000000000000000000000000000000000007e01000000000000"], + [383, "0000000000000000000000000000000000000000000000007f01000000000000"], + [384, "0000000000000000000000000000000000000000000000008001000000000000"], + [385, "0000000000000000000000000000000000000000000000008101000000000000"], + [386, "0000000000000000000000000000000000000000000000008201000000000000"], + [387, "0000000000000000000000000000000000000000000000008301000000000000"], + [388, "0000000000000000000000000000000000000000000000008401000000000000"], + [389, "0000000000000000000000000000000000000000000000008501000000000000"], + [390, "0000000000000000000000000000000000000000000000008601000000000000"], + [391, "0000000000000000000000000000000000000000000000008701000000000000"], + [392, "0000000000000000000000000000000000000000000000008801000000000000"], + [393, "0000000000000000000000000000000000000000000000008901000000000000"], + [394, "0000000000000000000000000000000000000000000000008a01000000000000"], + [395, "0000000000000000000000000000000000000000000000008b01000000000000"], + [396, "0000000000000000000000000000000000000000000000008c01000000000000"], + [397, "0000000000000000000000000000000000000000000000008d01000000000000"], + [398, "0000000000000000000000000000000000000000000000008e01000000000000"], + [399, "0000000000000000000000000000000000000000000000008f01000000000000"], + [400, "0000000000000000000000000000000000000000000000009001000000000000"], + [401, "0000000000000000000000000000000000000000000000009101000000000000"], + [402, "0000000000000000000000000000000000000000000000009201000000000000"], + [403, "0000000000000000000000000000000000000000000000009301000000000000"], + [404, "0000000000000000000000000000000000000000000000009401000000000000"], + [405, "0000000000000000000000000000000000000000000000009501000000000000"], + [406, "0000000000000000000000000000000000000000000000009601000000000000"], + [407, "0000000000000000000000000000000000000000000000009701000000000000"], + [408, "0000000000000000000000000000000000000000000000009801000000000000"], + [409, "0000000000000000000000000000000000000000000000009901000000000000"], + [410, "0000000000000000000000000000000000000000000000009a01000000000000"], + [411, "0000000000000000000000000000000000000000000000009b01000000000000"], + [412, "0000000000000000000000000000000000000000000000009c01000000000000"], + [413, "0000000000000000000000000000000000000000000000009d01000000000000"], + [414, "0000000000000000000000000000000000000000000000009e01000000000000"], + [415, "0000000000000000000000000000000000000000000000009f01000000000000"], + [416, "000000000000000000000000000000000000000000000000a001000000000000"], + [417, "000000000000000000000000000000000000000000000000a101000000000000"], + [418, "000000000000000000000000000000000000000000000000a201000000000000"], + [419, "000000000000000000000000000000000000000000000000a301000000000000"], + [420, "000000000000000000000000000000000000000000000000a401000000000000"], + [421, "000000000000000000000000000000000000000000000000a501000000000000"], + [422, "000000000000000000000000000000000000000000000000a601000000000000"], + [423, "000000000000000000000000000000000000000000000000a701000000000000"], + [424, "000000000000000000000000000000000000000000000000a801000000000000"], + [425, "000000000000000000000000000000000000000000000000a901000000000000"], + [426, "000000000000000000000000000000000000000000000000aa01000000000000"], + [427, "000000000000000000000000000000000000000000000000ab01000000000000"], + [428, "000000000000000000000000000000000000000000000000ac01000000000000"], + [429, "000000000000000000000000000000000000000000000000ad01000000000000"], + [430, "000000000000000000000000000000000000000000000000ae01000000000000"], + [431, "000000000000000000000000000000000000000000000000af01000000000000"], + [432, "000000000000000000000000000000000000000000000000b001000000000000"], + [433, "000000000000000000000000000000000000000000000000b101000000000000"], + [434, "000000000000000000000000000000000000000000000000b201000000000000"], + [435, "000000000000000000000000000000000000000000000000b301000000000000"], + [436, "000000000000000000000000000000000000000000000000b401000000000000"], + [437, "000000000000000000000000000000000000000000000000b501000000000000"], + [438, "000000000000000000000000000000000000000000000000b601000000000000"], + [439, "000000000000000000000000000000000000000000000000b701000000000000"], + [440, "000000000000000000000000000000000000000000000000b801000000000000"], + [441, "000000000000000000000000000000000000000000000000b901000000000000"], + [442, "000000000000000000000000000000000000000000000000ba01000000000000"], + [443, "000000000000000000000000000000000000000000000000bb01000000000000"], + [444, "000000000000000000000000000000000000000000000000bc01000000000000"], + [445, "000000000000000000000000000000000000000000000000bd01000000000000"], + [446, "000000000000000000000000000000000000000000000000be01000000000000"], + [447, "000000000000000000000000000000000000000000000000bf01000000000000"], + [448, "000000000000000000000000000000000000000000000000c001000000000000"], + [449, "000000000000000000000000000000000000000000000000c101000000000000"], + [450, "000000000000000000000000000000000000000000000000c201000000000000"], + [451, "000000000000000000000000000000000000000000000000c301000000000000"], + [452, "000000000000000000000000000000000000000000000000c401000000000000"], + [453, "000000000000000000000000000000000000000000000000c501000000000000"], + [454, "000000000000000000000000000000000000000000000000c601000000000000"], + [455, "000000000000000000000000000000000000000000000000c701000000000000"], + [456, "000000000000000000000000000000000000000000000000c801000000000000"], + [457, "000000000000000000000000000000000000000000000000c901000000000000"], + [458, "000000000000000000000000000000000000000000000000ca01000000000000"], + [459, "000000000000000000000000000000000000000000000000cb01000000000000"], + [460, "000000000000000000000000000000000000000000000000cc01000000000000"], + [461, "000000000000000000000000000000000000000000000000cd01000000000000"], + [462, "000000000000000000000000000000000000000000000000ce01000000000000"], + [463, "000000000000000000000000000000000000000000000000cf01000000000000"], + [464, "000000000000000000000000000000000000000000000000d001000000000000"], + [465, "000000000000000000000000000000000000000000000000d101000000000000"], + [466, "000000000000000000000000000000000000000000000000d201000000000000"], + [467, "000000000000000000000000000000000000000000000000d301000000000000"], + [468, "000000000000000000000000000000000000000000000000d401000000000000"], + [469, "000000000000000000000000000000000000000000000000d501000000000000"], + [470, "000000000000000000000000000000000000000000000000d601000000000000"], + [471, "000000000000000000000000000000000000000000000000d701000000000000"], + [472, "000000000000000000000000000000000000000000000000d801000000000000"], + [473, "000000000000000000000000000000000000000000000000d901000000000000"], + [474, "000000000000000000000000000000000000000000000000da01000000000000"], + [475, "000000000000000000000000000000000000000000000000db01000000000000"], + [476, "000000000000000000000000000000000000000000000000dc01000000000000"], + [477, "000000000000000000000000000000000000000000000000dd01000000000000"], + [478, "000000000000000000000000000000000000000000000000de01000000000000"], + [479, "000000000000000000000000000000000000000000000000df01000000000000"], + [480, "000000000000000000000000000000000000000000000000e001000000000000"], + [481, "000000000000000000000000000000000000000000000000e101000000000000"], + [482, "000000000000000000000000000000000000000000000000e201000000000000"], + [483, "000000000000000000000000000000000000000000000000e301000000000000"], + [484, "000000000000000000000000000000000000000000000000e401000000000000"], + [485, "000000000000000000000000000000000000000000000000e501000000000000"], + [486, "000000000000000000000000000000000000000000000000e601000000000000"], + [487, "000000000000000000000000000000000000000000000000e701000000000000"], + [488, "000000000000000000000000000000000000000000000000e801000000000000"], + [489, "000000000000000000000000000000000000000000000000e901000000000000"], + [490, "000000000000000000000000000000000000000000000000ea01000000000000"], + [491, "000000000000000000000000000000000000000000000000eb01000000000000"], + [492, "000000000000000000000000000000000000000000000000ec01000000000000"], + [493, "000000000000000000000000000000000000000000000000ed01000000000000"], + [494, "000000000000000000000000000000000000000000000000ee01000000000000"], + [495, "000000000000000000000000000000000000000000000000ef01000000000000"], + [496, "000000000000000000000000000000000000000000000000f001000000000000"], + [497, "000000000000000000000000000000000000000000000000f101000000000000"], + [498, "000000000000000000000000000000000000000000000000f201000000000000"], + [499, "000000000000000000000000000000000000000000000000f301000000000000"], + [500, "000000000000000000000000000000000000000000000000f401000000000000"], + [501, "000000000000000000000000000000000000000000000000f501000000000000"], + [502, "000000000000000000000000000000000000000000000000f601000000000000"], + [503, "000000000000000000000000000000000000000000000000f701000000000000"], + [504, "000000000000000000000000000000000000000000000000f801000000000000"], + [505, "000000000000000000000000000000000000000000000000f901000000000000"], + [506, "000000000000000000000000000000000000000000000000fa01000000000000"], + [507, "000000000000000000000000000000000000000000000000fb01000000000000"], + [508, "000000000000000000000000000000000000000000000000fc01000000000000"], + [509, "000000000000000000000000000000000000000000000000fd01000000000000"], + [510, "000000000000000000000000000000000000000000000000fe01000000000000"], + [511, "000000000000000000000000000000000000000000000000ff01000000000000"], + [512, "0000000000000000000000000000000000000000000000000002000000000000"], + [513, "0000000000000000000000000000000000000000000000000102000000000000"], + [514, "0000000000000000000000000000000000000000000000000202000000000000"], + [515, "0000000000000000000000000000000000000000000000000302000000000000"], + [516, "0000000000000000000000000000000000000000000000000402000000000000"], + [517, "0000000000000000000000000000000000000000000000000502000000000000"], + [518, "0000000000000000000000000000000000000000000000000602000000000000"], + [519, "0000000000000000000000000000000000000000000000000702000000000000"], + [520, "0000000000000000000000000000000000000000000000000802000000000000"], + [521, "0000000000000000000000000000000000000000000000000902000000000000"], + [522, "0000000000000000000000000000000000000000000000000a02000000000000"], + [523, "0000000000000000000000000000000000000000000000000b02000000000000"], + [524, "0000000000000000000000000000000000000000000000000c02000000000000"], + [525, "0000000000000000000000000000000000000000000000000d02000000000000"], + [526, "0000000000000000000000000000000000000000000000000e02000000000000"], + [527, "0000000000000000000000000000000000000000000000000f02000000000000"], + [528, "0000000000000000000000000000000000000000000000001002000000000000"], + [529, "0000000000000000000000000000000000000000000000001102000000000000"], + [530, "0000000000000000000000000000000000000000000000001202000000000000"], + [531, "0000000000000000000000000000000000000000000000001302000000000000"], + [532, "0000000000000000000000000000000000000000000000001402000000000000"], + [533, "0000000000000000000000000000000000000000000000001502000000000000"], + [534, "0000000000000000000000000000000000000000000000001602000000000000"], + [535, "0000000000000000000000000000000000000000000000001702000000000000"], + [536, "0000000000000000000000000000000000000000000000001802000000000000"], + [537, "0000000000000000000000000000000000000000000000001902000000000000"], + [538, "0000000000000000000000000000000000000000000000001a02000000000000"], + [539, "0000000000000000000000000000000000000000000000001b02000000000000"], + [540, "0000000000000000000000000000000000000000000000001c02000000000000"], + [541, "0000000000000000000000000000000000000000000000001d02000000000000"], + [542, "0000000000000000000000000000000000000000000000001e02000000000000"], + [543, "0000000000000000000000000000000000000000000000001f02000000000000"], + [544, "0000000000000000000000000000000000000000000000002002000000000000"], + [545, "0000000000000000000000000000000000000000000000002102000000000000"], + [546, "0000000000000000000000000000000000000000000000002202000000000000"], + [547, "0000000000000000000000000000000000000000000000002302000000000000"], + [548, "0000000000000000000000000000000000000000000000002402000000000000"], + [549, "0000000000000000000000000000000000000000000000002502000000000000"], + [550, "0000000000000000000000000000000000000000000000002602000000000000"], + [551, "0000000000000000000000000000000000000000000000002702000000000000"], + [552, "0000000000000000000000000000000000000000000000002802000000000000"], + [553, "0000000000000000000000000000000000000000000000002902000000000000"], + [554, "0000000000000000000000000000000000000000000000002a02000000000000"], + [555, "0000000000000000000000000000000000000000000000002b02000000000000"], + [556, "0000000000000000000000000000000000000000000000002c02000000000000"], + [557, "0000000000000000000000000000000000000000000000002d02000000000000"], + [558, "0000000000000000000000000000000000000000000000002e02000000000000"], + [559, "0000000000000000000000000000000000000000000000002f02000000000000"], + [560, "0000000000000000000000000000000000000000000000003002000000000000"], + [561, "0000000000000000000000000000000000000000000000003102000000000000"], + [562, "0000000000000000000000000000000000000000000000003202000000000000"], + [563, "0000000000000000000000000000000000000000000000003302000000000000"], + [564, "0000000000000000000000000000000000000000000000003402000000000000"], + [565, "0000000000000000000000000000000000000000000000003502000000000000"], + [566, "0000000000000000000000000000000000000000000000003602000000000000"], + [567, "0000000000000000000000000000000000000000000000003702000000000000"], + [568, "0000000000000000000000000000000000000000000000003802000000000000"], + [569, "0000000000000000000000000000000000000000000000003902000000000000"], + [570, "0000000000000000000000000000000000000000000000003a02000000000000"], + [571, "0000000000000000000000000000000000000000000000003b02000000000000"], + [572, "0000000000000000000000000000000000000000000000003c02000000000000"], + [573, "0000000000000000000000000000000000000000000000003d02000000000000"], + [574, "0000000000000000000000000000000000000000000000003e02000000000000"], + [575, "0000000000000000000000000000000000000000000000003f02000000000000"], + [576, "0000000000000000000000000000000000000000000000004002000000000000"], + [577, "0000000000000000000000000000000000000000000000004102000000000000"], + [578, "0000000000000000000000000000000000000000000000004202000000000000"], + [579, "0000000000000000000000000000000000000000000000004302000000000000"], + [580, "0000000000000000000000000000000000000000000000004402000000000000"], + [581, "0000000000000000000000000000000000000000000000004502000000000000"], + [582, "0000000000000000000000000000000000000000000000004602000000000000"], + [583, "0000000000000000000000000000000000000000000000004702000000000000"], + [584, "0000000000000000000000000000000000000000000000004802000000000000"], + [585, "0000000000000000000000000000000000000000000000004902000000000000"], + [586, "0000000000000000000000000000000000000000000000004a02000000000000"], + [587, "0000000000000000000000000000000000000000000000004b02000000000000"], + [588, "0000000000000000000000000000000000000000000000004c02000000000000"], + [589, "0000000000000000000000000000000000000000000000004d02000000000000"], + [590, "0000000000000000000000000000000000000000000000004e02000000000000"], + [591, "0000000000000000000000000000000000000000000000004f02000000000000"], + [592, "0000000000000000000000000000000000000000000000005002000000000000"], + [593, "0000000000000000000000000000000000000000000000005102000000000000"], + [594, "0000000000000000000000000000000000000000000000005202000000000000"], + [595, "0000000000000000000000000000000000000000000000005302000000000000"], + [596, "0000000000000000000000000000000000000000000000005402000000000000"], + [597, "0000000000000000000000000000000000000000000000005502000000000000"], + [598, "0000000000000000000000000000000000000000000000005602000000000000"], + [599, "0000000000000000000000000000000000000000000000005702000000000000"], + [600, "0000000000000000000000000000000000000000000000005802000000000000"], + [601, "0000000000000000000000000000000000000000000000005902000000000000"], + [602, "0000000000000000000000000000000000000000000000005a02000000000000"], + [603, "0000000000000000000000000000000000000000000000005b02000000000000"], + [604, "0000000000000000000000000000000000000000000000005c02000000000000"], + [605, "0000000000000000000000000000000000000000000000005d02000000000000"], + [606, "0000000000000000000000000000000000000000000000005e02000000000000"], + [607, "0000000000000000000000000000000000000000000000005f02000000000000"], + [608, "0000000000000000000000000000000000000000000000006002000000000000"], + [609, "0000000000000000000000000000000000000000000000006102000000000000"], + [610, "0000000000000000000000000000000000000000000000006202000000000000"], + [611, "0000000000000000000000000000000000000000000000006302000000000000"], + [612, "0000000000000000000000000000000000000000000000006402000000000000"], + [613, "0000000000000000000000000000000000000000000000006502000000000000"], + [614, "0000000000000000000000000000000000000000000000006602000000000000"], + [615, "0000000000000000000000000000000000000000000000006702000000000000"], + [616, "0000000000000000000000000000000000000000000000006802000000000000"], + [617, "0000000000000000000000000000000000000000000000006902000000000000"], + [618, "0000000000000000000000000000000000000000000000006a02000000000000"], + [619, "0000000000000000000000000000000000000000000000006b02000000000000"], + [620, "0000000000000000000000000000000000000000000000006c02000000000000"], + [621, "0000000000000000000000000000000000000000000000006d02000000000000"], + [622, "0000000000000000000000000000000000000000000000006e02000000000000"], + [623, "0000000000000000000000000000000000000000000000006f02000000000000"], + [624, "0000000000000000000000000000000000000000000000007002000000000000"], + [625, "0000000000000000000000000000000000000000000000007102000000000000"], + [626, "0000000000000000000000000000000000000000000000007202000000000000"], + [627, "0000000000000000000000000000000000000000000000007302000000000000"], + [628, "0000000000000000000000000000000000000000000000007402000000000000"], + [629, "0000000000000000000000000000000000000000000000007502000000000000"], + [630, "0000000000000000000000000000000000000000000000007602000000000000"], + [631, "0000000000000000000000000000000000000000000000007702000000000000"], + [632, "0000000000000000000000000000000000000000000000007802000000000000"], + [633, "0000000000000000000000000000000000000000000000007902000000000000"], + [634, "0000000000000000000000000000000000000000000000007a02000000000000"], + [635, "0000000000000000000000000000000000000000000000007b02000000000000"], + [636, "0000000000000000000000000000000000000000000000007c02000000000000"], + [637, "0000000000000000000000000000000000000000000000007d02000000000000"], + [638, "0000000000000000000000000000000000000000000000007e02000000000000"], + [639, "0000000000000000000000000000000000000000000000007f02000000000000"], + [640, "0000000000000000000000000000000000000000000000008002000000000000"], + [641, "0000000000000000000000000000000000000000000000008102000000000000"], + [642, "0000000000000000000000000000000000000000000000008202000000000000"], + [643, "0000000000000000000000000000000000000000000000008302000000000000"], + [644, "0000000000000000000000000000000000000000000000008402000000000000"], + [645, "0000000000000000000000000000000000000000000000008502000000000000"], + [646, "0000000000000000000000000000000000000000000000008602000000000000"], + [647, "0000000000000000000000000000000000000000000000008702000000000000"], + [648, "0000000000000000000000000000000000000000000000008802000000000000"], + [649, "0000000000000000000000000000000000000000000000008902000000000000"], + [650, "0000000000000000000000000000000000000000000000008a02000000000000"], + [651, "0000000000000000000000000000000000000000000000008b02000000000000"], + [652, "0000000000000000000000000000000000000000000000008c02000000000000"], + [653, "0000000000000000000000000000000000000000000000008d02000000000000"], + [654, "0000000000000000000000000000000000000000000000008e02000000000000"], + [655, "0000000000000000000000000000000000000000000000008f02000000000000"], + [656, "0000000000000000000000000000000000000000000000009002000000000000"], + [657, "0000000000000000000000000000000000000000000000009102000000000000"], + [658, "0000000000000000000000000000000000000000000000009202000000000000"], + [659, "0000000000000000000000000000000000000000000000009302000000000000"], + [660, "0000000000000000000000000000000000000000000000009402000000000000"], + [661, "0000000000000000000000000000000000000000000000009502000000000000"], + [662, "0000000000000000000000000000000000000000000000009602000000000000"], + [663, "0000000000000000000000000000000000000000000000009702000000000000"], + [664, "0000000000000000000000000000000000000000000000009802000000000000"], + [665, "0000000000000000000000000000000000000000000000009902000000000000"], + [666, "0000000000000000000000000000000000000000000000009a02000000000000"], + [667, "0000000000000000000000000000000000000000000000009b02000000000000"], + [668, "0000000000000000000000000000000000000000000000009c02000000000000"], + [669, "0000000000000000000000000000000000000000000000009d02000000000000"], + [670, "0000000000000000000000000000000000000000000000009e02000000000000"], + [671, "0000000000000000000000000000000000000000000000009f02000000000000"], + [672, "000000000000000000000000000000000000000000000000a002000000000000"], + [673, "000000000000000000000000000000000000000000000000a102000000000000"], + [674, "000000000000000000000000000000000000000000000000a202000000000000"], + [675, "000000000000000000000000000000000000000000000000a302000000000000"], + [676, "000000000000000000000000000000000000000000000000a402000000000000"], + [677, "000000000000000000000000000000000000000000000000a502000000000000"], + [678, "000000000000000000000000000000000000000000000000a602000000000000"], + [679, "000000000000000000000000000000000000000000000000a702000000000000"], + [680, "000000000000000000000000000000000000000000000000a802000000000000"], + [681, "000000000000000000000000000000000000000000000000a902000000000000"], + [682, "000000000000000000000000000000000000000000000000aa02000000000000"], + [683, "000000000000000000000000000000000000000000000000ab02000000000000"], + [684, "000000000000000000000000000000000000000000000000ac02000000000000"], + [685, "000000000000000000000000000000000000000000000000ad02000000000000"], + [686, "000000000000000000000000000000000000000000000000ae02000000000000"], + [687, "000000000000000000000000000000000000000000000000af02000000000000"], + [688, "000000000000000000000000000000000000000000000000b002000000000000"], + [689, "000000000000000000000000000000000000000000000000b102000000000000"], + [690, "000000000000000000000000000000000000000000000000b202000000000000"], + [691, "000000000000000000000000000000000000000000000000b302000000000000"], + [692, "000000000000000000000000000000000000000000000000b402000000000000"], + [693, "000000000000000000000000000000000000000000000000b502000000000000"], + [694, "000000000000000000000000000000000000000000000000b602000000000000"], + [695, "000000000000000000000000000000000000000000000000b702000000000000"], + [696, "000000000000000000000000000000000000000000000000b802000000000000"], + [697, "000000000000000000000000000000000000000000000000b902000000000000"], + [698, "000000000000000000000000000000000000000000000000ba02000000000000"], + [699, "000000000000000000000000000000000000000000000000bb02000000000000"], + [700, "000000000000000000000000000000000000000000000000bc02000000000000"], + [701, "000000000000000000000000000000000000000000000000bd02000000000000"], + [702, "000000000000000000000000000000000000000000000000be02000000000000"], + [703, "000000000000000000000000000000000000000000000000bf02000000000000"], + [704, "000000000000000000000000000000000000000000000000c002000000000000"], + [705, "000000000000000000000000000000000000000000000000c102000000000000"], + [706, "000000000000000000000000000000000000000000000000c202000000000000"], + [707, "000000000000000000000000000000000000000000000000c302000000000000"], + [708, "000000000000000000000000000000000000000000000000c402000000000000"], + [709, "000000000000000000000000000000000000000000000000c502000000000000"], + [710, "000000000000000000000000000000000000000000000000c602000000000000"], + [711, "000000000000000000000000000000000000000000000000c702000000000000"], + [712, "000000000000000000000000000000000000000000000000c802000000000000"], + [713, "000000000000000000000000000000000000000000000000c902000000000000"], + [714, "000000000000000000000000000000000000000000000000ca02000000000000"], + [715, "000000000000000000000000000000000000000000000000cb02000000000000"], + [716, "000000000000000000000000000000000000000000000000cc02000000000000"], + [717, "000000000000000000000000000000000000000000000000cd02000000000000"], + [718, "000000000000000000000000000000000000000000000000ce02000000000000"], + [719, "000000000000000000000000000000000000000000000000cf02000000000000"], + [720, "000000000000000000000000000000000000000000000000d002000000000000"], + [721, "000000000000000000000000000000000000000000000000d102000000000000"], + [722, "000000000000000000000000000000000000000000000000d202000000000000"], + [723, "000000000000000000000000000000000000000000000000d302000000000000"], + [724, "000000000000000000000000000000000000000000000000d402000000000000"], + [725, "000000000000000000000000000000000000000000000000d502000000000000"], + [726, "000000000000000000000000000000000000000000000000d602000000000000"], + [727, "000000000000000000000000000000000000000000000000d702000000000000"], + [728, "000000000000000000000000000000000000000000000000d802000000000000"], + [729, "000000000000000000000000000000000000000000000000d902000000000000"], + [730, "000000000000000000000000000000000000000000000000da02000000000000"], + [731, "000000000000000000000000000000000000000000000000db02000000000000"], + [732, "000000000000000000000000000000000000000000000000dc02000000000000"], + [733, "000000000000000000000000000000000000000000000000dd02000000000000"], + [734, "000000000000000000000000000000000000000000000000de02000000000000"], + [735, "000000000000000000000000000000000000000000000000df02000000000000"], + [736, "000000000000000000000000000000000000000000000000e002000000000000"], + [737, "000000000000000000000000000000000000000000000000e102000000000000"], + [738, "000000000000000000000000000000000000000000000000e202000000000000"], + [739, "000000000000000000000000000000000000000000000000e302000000000000"], + [740, "000000000000000000000000000000000000000000000000e402000000000000"], + [741, "000000000000000000000000000000000000000000000000e502000000000000"], + [742, "000000000000000000000000000000000000000000000000e602000000000000"], + [743, "000000000000000000000000000000000000000000000000e702000000000000"], + [744, "000000000000000000000000000000000000000000000000e802000000000000"], + [745, "000000000000000000000000000000000000000000000000e902000000000000"], + [746, "000000000000000000000000000000000000000000000000ea02000000000000"], + [747, "000000000000000000000000000000000000000000000000eb02000000000000"], + [748, "000000000000000000000000000000000000000000000000ec02000000000000"], + [749, "000000000000000000000000000000000000000000000000ed02000000000000"], + [750, "000000000000000000000000000000000000000000000000ee02000000000000"], + [751, "000000000000000000000000000000000000000000000000ef02000000000000"], + [752, "000000000000000000000000000000000000000000000000f002000000000000"], + [753, "000000000000000000000000000000000000000000000000f102000000000000"], + [754, "000000000000000000000000000000000000000000000000f202000000000000"], + [755, "000000000000000000000000000000000000000000000000f302000000000000"], + [756, "000000000000000000000000000000000000000000000000f402000000000000"], + [757, "000000000000000000000000000000000000000000000000f502000000000000"], + [758, "000000000000000000000000000000000000000000000000f602000000000000"], + [759, "000000000000000000000000000000000000000000000000f702000000000000"], + [760, "000000000000000000000000000000000000000000000000f802000000000000"], + [761, "000000000000000000000000000000000000000000000000f902000000000000"], + [762, "000000000000000000000000000000000000000000000000fa02000000000000"], + [763, "000000000000000000000000000000000000000000000000fb02000000000000"], + [764, "000000000000000000000000000000000000000000000000fc02000000000000"], + [765, "000000000000000000000000000000000000000000000000fd02000000000000"], + [766, "000000000000000000000000000000000000000000000000fe02000000000000"], + [767, "000000000000000000000000000000000000000000000000ff02000000000000"], + [768, "0000000000000000000000000000000000000000000000000003000000000000"], + [769, "0000000000000000000000000000000000000000000000000103000000000000"], + [770, "0000000000000000000000000000000000000000000000000203000000000000"], + [771, "0000000000000000000000000000000000000000000000000303000000000000"], + [772, "0000000000000000000000000000000000000000000000000403000000000000"], + [773, "0000000000000000000000000000000000000000000000000503000000000000"], + [774, "0000000000000000000000000000000000000000000000000603000000000000"], + [775, "0000000000000000000000000000000000000000000000000703000000000000"], + [776, "0000000000000000000000000000000000000000000000000803000000000000"], + [777, "0000000000000000000000000000000000000000000000000903000000000000"], + [778, "0000000000000000000000000000000000000000000000000a03000000000000"], + [779, "0000000000000000000000000000000000000000000000000b03000000000000"], + [780, "0000000000000000000000000000000000000000000000000c03000000000000"], + [781, "0000000000000000000000000000000000000000000000000d03000000000000"], + [782, "0000000000000000000000000000000000000000000000000e03000000000000"], + [783, "0000000000000000000000000000000000000000000000000f03000000000000"], + [784, "0000000000000000000000000000000000000000000000001003000000000000"], + [785, "0000000000000000000000000000000000000000000000001103000000000000"], + [786, "0000000000000000000000000000000000000000000000001203000000000000"], + [787, "0000000000000000000000000000000000000000000000001303000000000000"], + [788, "0000000000000000000000000000000000000000000000001403000000000000"], + [789, "0000000000000000000000000000000000000000000000001503000000000000"], + [790, "0000000000000000000000000000000000000000000000001603000000000000"], + [791, "0000000000000000000000000000000000000000000000001703000000000000"], + [792, "0000000000000000000000000000000000000000000000001803000000000000"], + [793, "0000000000000000000000000000000000000000000000001903000000000000"], + [794, "0000000000000000000000000000000000000000000000001a03000000000000"], + [795, "0000000000000000000000000000000000000000000000001b03000000000000"], + [796, "0000000000000000000000000000000000000000000000001c03000000000000"], + [797, "0000000000000000000000000000000000000000000000001d03000000000000"], + [798, "0000000000000000000000000000000000000000000000001e03000000000000"], + [799, "0000000000000000000000000000000000000000000000001f03000000000000"], + [800, "0000000000000000000000000000000000000000000000002003000000000000"], + [801, "0000000000000000000000000000000000000000000000002103000000000000"], + [802, "0000000000000000000000000000000000000000000000002203000000000000"], + [803, "0000000000000000000000000000000000000000000000002303000000000000"], + [804, "0000000000000000000000000000000000000000000000002403000000000000"], + [805, "0000000000000000000000000000000000000000000000002503000000000000"], + [806, "0000000000000000000000000000000000000000000000002603000000000000"], + [807, "0000000000000000000000000000000000000000000000002703000000000000"], + [808, "0000000000000000000000000000000000000000000000002803000000000000"], + [809, "0000000000000000000000000000000000000000000000002903000000000000"], + [810, "0000000000000000000000000000000000000000000000002a03000000000000"], + [811, "0000000000000000000000000000000000000000000000002b03000000000000"], + [812, "0000000000000000000000000000000000000000000000002c03000000000000"], + [813, "0000000000000000000000000000000000000000000000002d03000000000000"], + [814, "0000000000000000000000000000000000000000000000002e03000000000000"], + [815, "0000000000000000000000000000000000000000000000002f03000000000000"], + [816, "0000000000000000000000000000000000000000000000003003000000000000"], + [817, "0000000000000000000000000000000000000000000000003103000000000000"], + [818, "0000000000000000000000000000000000000000000000003203000000000000"], + [819, "0000000000000000000000000000000000000000000000003303000000000000"], + [820, "0000000000000000000000000000000000000000000000003403000000000000"], + [821, "0000000000000000000000000000000000000000000000003503000000000000"], + [822, "0000000000000000000000000000000000000000000000003603000000000000"], + [823, "0000000000000000000000000000000000000000000000003703000000000000"], + [824, "0000000000000000000000000000000000000000000000003803000000000000"], + [825, "0000000000000000000000000000000000000000000000003903000000000000"], + [826, "0000000000000000000000000000000000000000000000003a03000000000000"], + [827, "0000000000000000000000000000000000000000000000003b03000000000000"], + [828, "0000000000000000000000000000000000000000000000003c03000000000000"], + [829, "0000000000000000000000000000000000000000000000003d03000000000000"], + [830, "0000000000000000000000000000000000000000000000003e03000000000000"], + [831, "0000000000000000000000000000000000000000000000003f03000000000000"], + [832, "0000000000000000000000000000000000000000000000004003000000000000"], + [833, "0000000000000000000000000000000000000000000000004103000000000000"], + [834, "0000000000000000000000000000000000000000000000004203000000000000"], + [835, "0000000000000000000000000000000000000000000000004303000000000000"], + [836, "0000000000000000000000000000000000000000000000004403000000000000"], + [837, "0000000000000000000000000000000000000000000000004503000000000000"], + [838, "0000000000000000000000000000000000000000000000004603000000000000"], + [839, "0000000000000000000000000000000000000000000000004703000000000000"], + [840, "0000000000000000000000000000000000000000000000004803000000000000"], + [841, "0000000000000000000000000000000000000000000000004903000000000000"], + [842, "0000000000000000000000000000000000000000000000004a03000000000000"], + [843, "0000000000000000000000000000000000000000000000004b03000000000000"], + [844, "0000000000000000000000000000000000000000000000004c03000000000000"], + [845, "0000000000000000000000000000000000000000000000004d03000000000000"], + [846, "0000000000000000000000000000000000000000000000004e03000000000000"], + [847, "0000000000000000000000000000000000000000000000004f03000000000000"], + [848, "0000000000000000000000000000000000000000000000005003000000000000"], + [849, "0000000000000000000000000000000000000000000000005103000000000000"], + [850, "0000000000000000000000000000000000000000000000005203000000000000"], + [851, "0000000000000000000000000000000000000000000000005303000000000000"], + [852, "0000000000000000000000000000000000000000000000005403000000000000"], + [853, "0000000000000000000000000000000000000000000000005503000000000000"], + [854, "0000000000000000000000000000000000000000000000005603000000000000"], + [855, "0000000000000000000000000000000000000000000000005703000000000000"], + [856, "0000000000000000000000000000000000000000000000005803000000000000"], + [857, "0000000000000000000000000000000000000000000000005903000000000000"], + [858, "0000000000000000000000000000000000000000000000005a03000000000000"], + [859, "0000000000000000000000000000000000000000000000005b03000000000000"], + [860, "0000000000000000000000000000000000000000000000005c03000000000000"], + [861, "0000000000000000000000000000000000000000000000005d03000000000000"], + [862, "0000000000000000000000000000000000000000000000005e03000000000000"], + [863, "0000000000000000000000000000000000000000000000005f03000000000000"], + [864, "0000000000000000000000000000000000000000000000006003000000000000"], + [865, "0000000000000000000000000000000000000000000000006103000000000000"], + [866, "0000000000000000000000000000000000000000000000006203000000000000"], + [867, "0000000000000000000000000000000000000000000000006303000000000000"], + [868, "0000000000000000000000000000000000000000000000006403000000000000"], + [869, "0000000000000000000000000000000000000000000000006503000000000000"], + [870, "0000000000000000000000000000000000000000000000006603000000000000"], + [871, "0000000000000000000000000000000000000000000000006703000000000000"], + [872, "0000000000000000000000000000000000000000000000006803000000000000"], + [873, "0000000000000000000000000000000000000000000000006903000000000000"], + [874, "0000000000000000000000000000000000000000000000006a03000000000000"], + [875, "0000000000000000000000000000000000000000000000006b03000000000000"], + [876, "0000000000000000000000000000000000000000000000006c03000000000000"], + [877, "0000000000000000000000000000000000000000000000006d03000000000000"], + [878, "0000000000000000000000000000000000000000000000006e03000000000000"], + [879, "0000000000000000000000000000000000000000000000006f03000000000000"], + [880, "0000000000000000000000000000000000000000000000007003000000000000"], + [881, "0000000000000000000000000000000000000000000000007103000000000000"], + [882, "0000000000000000000000000000000000000000000000007203000000000000"], + [883, "0000000000000000000000000000000000000000000000007303000000000000"], + [884, "0000000000000000000000000000000000000000000000007403000000000000"], + [885, "0000000000000000000000000000000000000000000000007503000000000000"], + [886, "0000000000000000000000000000000000000000000000007603000000000000"], + [887, "0000000000000000000000000000000000000000000000007703000000000000"], + [888, "0000000000000000000000000000000000000000000000007803000000000000"], + [889, "0000000000000000000000000000000000000000000000007903000000000000"], + [890, "0000000000000000000000000000000000000000000000007a03000000000000"], + [891, "0000000000000000000000000000000000000000000000007b03000000000000"], + [892, "0000000000000000000000000000000000000000000000007c03000000000000"], + [893, "0000000000000000000000000000000000000000000000007d03000000000000"], + [894, "0000000000000000000000000000000000000000000000007e03000000000000"], + [895, "0000000000000000000000000000000000000000000000007f03000000000000"], + [896, "0000000000000000000000000000000000000000000000008003000000000000"], + [897, "0000000000000000000000000000000000000000000000008103000000000000"], + [898, "0000000000000000000000000000000000000000000000008203000000000000"], + [899, "0000000000000000000000000000000000000000000000008303000000000000"], + [900, "0000000000000000000000000000000000000000000000008403000000000000"], + [901, "0000000000000000000000000000000000000000000000008503000000000000"], + [902, "0000000000000000000000000000000000000000000000008603000000000000"], + [903, "0000000000000000000000000000000000000000000000008703000000000000"], + [904, "0000000000000000000000000000000000000000000000008803000000000000"], + [905, "0000000000000000000000000000000000000000000000008903000000000000"], + [906, "0000000000000000000000000000000000000000000000008a03000000000000"], + [907, "0000000000000000000000000000000000000000000000008b03000000000000"], + [908, "0000000000000000000000000000000000000000000000008c03000000000000"], + [909, "0000000000000000000000000000000000000000000000008d03000000000000"], + [910, "0000000000000000000000000000000000000000000000008e03000000000000"], + [911, "0000000000000000000000000000000000000000000000008f03000000000000"], + [912, "0000000000000000000000000000000000000000000000009003000000000000"], + [913, "0000000000000000000000000000000000000000000000009103000000000000"], + [914, "0000000000000000000000000000000000000000000000009203000000000000"], + [915, "0000000000000000000000000000000000000000000000009303000000000000"], + [916, "0000000000000000000000000000000000000000000000009403000000000000"], + [917, "0000000000000000000000000000000000000000000000009503000000000000"], + [918, "0000000000000000000000000000000000000000000000009603000000000000"], + [919, "0000000000000000000000000000000000000000000000009703000000000000"], + [920, "0000000000000000000000000000000000000000000000009803000000000000"], + [921, "0000000000000000000000000000000000000000000000009903000000000000"], + [922, "0000000000000000000000000000000000000000000000009a03000000000000"], + [923, "0000000000000000000000000000000000000000000000009b03000000000000"], + [924, "0000000000000000000000000000000000000000000000009c03000000000000"], + [925, "0000000000000000000000000000000000000000000000009d03000000000000"], + [926, "0000000000000000000000000000000000000000000000009e03000000000000"], + [927, "0000000000000000000000000000000000000000000000009f03000000000000"], + [928, "000000000000000000000000000000000000000000000000a003000000000000"], + [929, "000000000000000000000000000000000000000000000000a103000000000000"], + [930, "000000000000000000000000000000000000000000000000a203000000000000"], + [931, "000000000000000000000000000000000000000000000000a303000000000000"], + [932, "000000000000000000000000000000000000000000000000a403000000000000"], + [933, "000000000000000000000000000000000000000000000000a503000000000000"], + [934, "000000000000000000000000000000000000000000000000a603000000000000"], + [935, "000000000000000000000000000000000000000000000000a703000000000000"], + [936, "000000000000000000000000000000000000000000000000a803000000000000"], + [937, "000000000000000000000000000000000000000000000000a903000000000000"], + [938, "000000000000000000000000000000000000000000000000aa03000000000000"], + [939, "000000000000000000000000000000000000000000000000ab03000000000000"], + [940, "000000000000000000000000000000000000000000000000ac03000000000000"], + [941, "000000000000000000000000000000000000000000000000ad03000000000000"], + [942, "000000000000000000000000000000000000000000000000ae03000000000000"], + [943, "000000000000000000000000000000000000000000000000af03000000000000"], + [944, "000000000000000000000000000000000000000000000000b003000000000000"], + [945, "000000000000000000000000000000000000000000000000b103000000000000"], + [946, "000000000000000000000000000000000000000000000000b203000000000000"], + [947, "000000000000000000000000000000000000000000000000b303000000000000"], + [948, "000000000000000000000000000000000000000000000000b403000000000000"], + [949, "000000000000000000000000000000000000000000000000b503000000000000"], + [950, "000000000000000000000000000000000000000000000000b603000000000000"], + [951, "000000000000000000000000000000000000000000000000b703000000000000"], + [952, "000000000000000000000000000000000000000000000000b803000000000000"], + [953, "000000000000000000000000000000000000000000000000b903000000000000"], + [954, "000000000000000000000000000000000000000000000000ba03000000000000"], + [955, "000000000000000000000000000000000000000000000000bb03000000000000"], + [956, "000000000000000000000000000000000000000000000000bc03000000000000"], + [957, "000000000000000000000000000000000000000000000000bd03000000000000"], + [958, "000000000000000000000000000000000000000000000000be03000000000000"], + [959, "000000000000000000000000000000000000000000000000bf03000000000000"], + [960, "000000000000000000000000000000000000000000000000c003000000000000"], + [961, "000000000000000000000000000000000000000000000000c103000000000000"], + [962, "000000000000000000000000000000000000000000000000c203000000000000"], + [963, "000000000000000000000000000000000000000000000000c303000000000000"], + [964, "000000000000000000000000000000000000000000000000c403000000000000"], + [965, "000000000000000000000000000000000000000000000000c503000000000000"], + [966, "000000000000000000000000000000000000000000000000c603000000000000"], + [967, "000000000000000000000000000000000000000000000000c703000000000000"], + [968, "000000000000000000000000000000000000000000000000c803000000000000"], + [969, "000000000000000000000000000000000000000000000000c903000000000000"], + [970, "000000000000000000000000000000000000000000000000ca03000000000000"], + [971, "000000000000000000000000000000000000000000000000cb03000000000000"], + [972, "000000000000000000000000000000000000000000000000cc03000000000000"], + [973, "000000000000000000000000000000000000000000000000cd03000000000000"], + [974, "000000000000000000000000000000000000000000000000ce03000000000000"], + [975, "000000000000000000000000000000000000000000000000cf03000000000000"], + [976, "000000000000000000000000000000000000000000000000d003000000000000"], + [977, "000000000000000000000000000000000000000000000000d103000000000000"], + [978, "000000000000000000000000000000000000000000000000d203000000000000"], + [979, "000000000000000000000000000000000000000000000000d303000000000000"], + [980, "000000000000000000000000000000000000000000000000d403000000000000"], + [981, "000000000000000000000000000000000000000000000000d503000000000000"], + [982, "000000000000000000000000000000000000000000000000d603000000000000"], + [983, "000000000000000000000000000000000000000000000000d703000000000000"], + [984, "000000000000000000000000000000000000000000000000d803000000000000"], + [985, "000000000000000000000000000000000000000000000000d903000000000000"], + [986, "000000000000000000000000000000000000000000000000da03000000000000"], + [987, "000000000000000000000000000000000000000000000000db03000000000000"], + [988, "000000000000000000000000000000000000000000000000dc03000000000000"], + [989, "000000000000000000000000000000000000000000000000dd03000000000000"], + [990, "000000000000000000000000000000000000000000000000de03000000000000"], + [991, "000000000000000000000000000000000000000000000000df03000000000000"], + [992, "000000000000000000000000000000000000000000000000e003000000000000"], + [993, "000000000000000000000000000000000000000000000000e103000000000000"], + [994, "000000000000000000000000000000000000000000000000e203000000000000"], + [995, "000000000000000000000000000000000000000000000000e303000000000000"], + [996, "000000000000000000000000000000000000000000000000e403000000000000"], + [997, "000000000000000000000000000000000000000000000000e503000000000000"], + [998, "000000000000000000000000000000000000000000000000e603000000000000"], + [999, "000000000000000000000000000000000000000000000000e703000000000000"] + ]} + ] +} \ No newline at end of file diff --git a/examples/merkle_inclusion.masm b/examples/merkle_inclusion.masm new file mode 100644 index 0000000..4c3fac5 --- /dev/null +++ b/examples/merkle_inclusion.masm @@ -0,0 +1,15 @@ +# In this example we verify 1000 merkle paths in a sparse Merkle tree. +# Every leaf on position i looks like [i, 0, 0, 0]. +begin + padw + repeat.1000 + # => [i, 0, 0, 0, d, i, R,...] + + # verify merkle path for node i + mtree_verify + # => [i, 0, 0, 0, d, i, R ...] + + add.1 swap.5 add.1 + # => [i+1, 0, 0, 0, d, i+1, R ...] + end +end \ No newline at end of file