From 1d9f29ccc47fa804909e7f7048d39db815f3f130 Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Tue, 8 Aug 2023 19:42:57 +0900 Subject: [PATCH 1/8] introduce commitment context instead of validation context Signed-off-by: Jun Kimura --- Cargo.lock | 86 +++- Cargo.toml | 1 - enclave/Cargo.lock | 21 - go/light-clients/lcp/types/commitment.go | 30 +- modules/commitments/Cargo.toml | 2 +- modules/commitments/src/commitment.rs | 22 +- modules/commitments/src/context.rs | 415 +++++++++++++++++++ modules/commitments/src/errors.rs | 26 ++ modules/commitments/src/lib.rs | 2 + modules/lcp-client/Cargo.toml | 1 - modules/lcp-client/src/client_def.rs | 17 +- modules/lcp-client/src/message.rs | 7 +- modules/mock-lc/Cargo.toml | 1 - modules/mock-lc/src/client.rs | 10 +- modules/tendermint-lc/Cargo.toml | 1 - modules/tendermint-lc/src/client.rs | 27 +- modules/types/src/lib.rs | 2 +- modules/types/src/time.rs | 14 + modules/validation-context/Cargo.toml | 12 - modules/validation-context/src/context.rs | 12 - modules/validation-context/src/lib.rs | 28 -- modules/validation-context/src/params.rs | 51 --- modules/validation-context/src/predicate.rs | 21 - modules/validation-context/src/tendermint.rs | 138 ------ 24 files changed, 575 insertions(+), 372 deletions(-) create mode 100644 modules/commitments/src/context.rs delete mode 100644 modules/validation-context/Cargo.toml delete mode 100644 modules/validation-context/src/context.rs delete mode 100644 modules/validation-context/src/lib.rs delete mode 100644 modules/validation-context/src/params.rs delete mode 100644 modules/validation-context/src/predicate.rs delete mode 100644 modules/validation-context/src/tendermint.rs diff --git a/Cargo.lock b/Cargo.lock index daeaa32c..0128f446 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -377,6 +377,21 @@ dependencies = [ "syn 2.0.28", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitcoin" version = "0.29.2" @@ -757,12 +772,12 @@ dependencies = [ "flex-error", "hex", "lcp-types", + "proptest", "prost", "prost-types", "rand 0.8.5", "serde", "sha2 0.10.6", - "validation-context", ] [[package]] @@ -2623,7 +2638,6 @@ dependencies = [ "serde", "sgx_types", "store", - "validation-context", ] [[package]] @@ -2973,7 +2987,6 @@ dependencies = [ "light-client", "light-client-registry", "serde", - "validation-context", ] [[package]] @@ -3601,6 +3614,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "proptest" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +dependencies = [ + "bit-set", + "bitflags 1.3.2", + "byteorder", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.11.6" @@ -3759,6 +3792,15 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "raw-cpuid" version = "10.3.0" @@ -3925,16 +3967,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "rlp" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "999508abb0ae792aabed2460c45b89106d97fe4adac593bdaef433c2605847b5" -dependencies = [ - "bytes", - "rustc-hex", -] - [[package]] name = "rocksdb" version = "0.21.0" @@ -4124,6 +4156,18 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.10" @@ -5048,7 +5092,6 @@ dependencies = [ "light-client-registry", "log 0.4.17", "serde", - "validation-context", ] [[package]] @@ -5701,6 +5744,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicase" version = "2.6.0" @@ -5788,15 +5837,6 @@ dependencies = [ "getrandom 0.2.7", ] -[[package]] -name = "validation-context" -version = "0.1.0" -dependencies = [ - "lcp-types", - "rlp", - "serde", -] - [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 2577f5e0..1823737f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,7 +16,6 @@ members = [ "modules/keymanager", "modules/store", "modules/lcp-client", - "modules/validation-context", "modules/light-client", "modules/light-client-registry", "modules/tendermint-lc", diff --git a/enclave/Cargo.lock b/enclave/Cargo.lock index e66f24d2..9446bb1f 100644 --- a/enclave/Cargo.lock +++ b/enclave/Cargo.lock @@ -225,7 +225,6 @@ dependencies = [ "prost", "serde", "sha2 0.10.6", - "validation-context", ] [[package]] @@ -1206,16 +1205,6 @@ dependencies = [ "digest 0.10.5", ] -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - [[package]] name = "rustc-hex" version = "2.1.0" @@ -1690,7 +1679,6 @@ dependencies = [ "light-client-registry", "log 0.4.17", "serde", - "validation-context", ] [[package]] @@ -1838,15 +1826,6 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" -[[package]] -name = "validation-context" -version = "0.1.0" -dependencies = [ - "lcp-types", - "rlp", - "serde", -] - [[package]] name = "version_check" version = "0.9.4" diff --git a/go/light-clients/lcp/types/commitment.go b/go/light-clients/lcp/types/commitment.go index 88989647..632652d6 100644 --- a/go/light-clients/lcp/types/commitment.go +++ b/go/light-clients/lcp/types/commitment.go @@ -42,7 +42,7 @@ var ( {Name: "revision_height", Type: "uint64"}, }}, {Name: "timestamp", Type: "uint128"}, - {Name: "validation_params", Type: "bytes"}, + {Name: "context", Type: "bytes"}, }) stateCommitmentABI, _ = abi.NewType("tuple", "struct StateCommitment", []abi.ArgumentMarshaling{ @@ -64,13 +64,13 @@ func (id StateID) EqualBytes(bz []byte) bool { } type UpdateClientCommitment struct { - PrevStateID *StateID - NewStateID StateID - NewState []byte - PrevHeight *clienttypes.Height - NewHeight clienttypes.Height - Timestamp *big.Int - ValidationParams []byte + PrevStateID *StateID + NewStateID StateID + NewState []byte + PrevHeight *clienttypes.Height + NewHeight clienttypes.Height + Timestamp *big.Int + Context []byte } type StateCommitment struct { @@ -186,15 +186,15 @@ func EthABIDecodeUpdateClientCommitment(bz []byte) (*UpdateClientCommitment, err RevisionNumber uint64 `json:"revision_number"` RevisionHeight uint64 `json:"revision_height"` } `json:"new_height"` - Timestamp *big.Int `json:"timestamp"` - ValidationParams []byte `json:"validation_params"` + Timestamp *big.Int `json:"timestamp"` + Context []byte `json:"context"` }) c := &UpdateClientCommitment{ - NewStateID: p.NewStateId, - NewState: p.NewState, - NewHeight: clienttypes.Height{RevisionNumber: p.NewHeight.RevisionNumber, RevisionHeight: p.NewHeight.RevisionHeight}, - Timestamp: p.Timestamp, - ValidationParams: p.ValidationParams, + NewStateID: p.NewStateId, + NewState: p.NewState, + NewHeight: clienttypes.Height{RevisionNumber: p.NewHeight.RevisionNumber, RevisionHeight: p.NewHeight.RevisionHeight}, + Timestamp: p.Timestamp, + Context: p.Context, } if p.PrevStateId != [32]byte{} { prev := StateID(p.PrevStateId) diff --git a/modules/commitments/Cargo.toml b/modules/commitments/Cargo.toml index 62dfd573..d9bffe8a 100644 --- a/modules/commitments/Cargo.toml +++ b/modules/commitments/Cargo.toml @@ -12,13 +12,13 @@ flex-error = { version = "0.4.4", default-features = false } ethabi = { version = "18.0.0", default-features = false } lcp-types = { path = "../types", default-features = false } -validation-context = { path = "../validation-context", default-features = false } crypto = { path = "../crypto", default-features = false } [dev-dependencies] prost-types = { version = "0.11", default-features = false } rand = { version = "0.8" } lcp-types = { path = "../types", default-features = false, features = ["std"] } +proptest = "1.2.0" [features] default = [] diff --git a/modules/commitments/src/commitment.rs b/modules/commitments/src/commitment.rs index 3bbe417e..b808f96f 100644 --- a/modules/commitments/src/commitment.rs +++ b/modules/commitments/src/commitment.rs @@ -1,10 +1,10 @@ +use crate::context::CommitmentContext; use crate::prelude::*; use crate::{Error, StateID}; use core::fmt::Display; use lcp_types::{Any, Height, Time}; use prost::Message; use serde::{Deserialize, Serialize}; -use validation_context::ValidationParams; pub const COMMITMENT_SCHEMA_VERSION: u16 = 1; pub const COMMITMENT_TYPE_UPDATE_CLIENT: u16 = 1; @@ -187,7 +187,7 @@ pub struct UpdateClientCommitment { pub prev_height: Option, pub new_height: Height, pub timestamp: Time, - pub validation_params: ValidationParams, + pub context: CommitmentContext, } impl From for Commitment { @@ -205,7 +205,7 @@ impl Default for UpdateClientCommitment { new_state: Default::default(), prev_height: Default::default(), new_height: Default::default(), - validation_params: Default::default(), + context: Default::default(), } } } @@ -214,8 +214,8 @@ impl Display for UpdateClientCommitment { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!( f, - "prev_state_id={} new_state_id={} new_state_include={} prev_height={:?} new_height={:?} timestamp={} validation_params={{{}}}", - self.prev_state_id.map_or("".to_string(), |s| s.to_string()), self.new_state_id, self.new_state.is_some(), self.prev_height.map_or("".to_string(), |h| h.to_string()), self.new_height.to_string(), self.timestamp, self.validation_params + "prev_state_id={} new_state_id={} new_state_include={} prev_height={:?} new_height={:?} timestamp={} context={{{}}}", + self.prev_state_id.map_or("".to_string(), |s| s.to_string()), self.new_state_id, self.new_state.is_some(), self.prev_height.map_or("".to_string(), |h| h.to_string()), self.new_height.to_string(), self.timestamp, self.context ) } } @@ -228,7 +228,7 @@ pub(crate) struct EthABIUpdateClientCommitment { prev_height: EthABIHeight, // (u64, u64) new_height: EthABIHeight, // (u64, u64) timestamp: ethabi::Uint, // u128 - validation_params: ethabi::Bytes, // bytes + context: ethabi::Bytes, // bytes } // the height is encoded as a tuple of 2 elements: (u64, u64) @@ -304,7 +304,7 @@ impl EthABIUpdateClientCommitment { Token::Tuple(self.prev_height.into()), Token::Tuple(self.new_height.into()), Token::Uint(self.timestamp), - Token::Bytes(self.validation_params), + Token::Bytes(self.context), ])]) } @@ -338,7 +338,7 @@ impl EthABIUpdateClientCommitment { prev_height: values.next().unwrap().into_tuple().unwrap().try_into()?, new_height: values.next().unwrap().into_tuple().unwrap().try_into()?, timestamp: values.next().unwrap().into_uint().unwrap(), - validation_params: values.next().unwrap().into_bytes().unwrap(), + context: values.next().unwrap().into_bytes().unwrap(), }) } } @@ -357,7 +357,7 @@ impl From for EthABIUpdateClientCommitment { prev_height: value.prev_height.into(), new_height: value.new_height.into(), timestamp: Uint::from(value.timestamp.as_unix_timestamp_nanos()), - validation_params: value.validation_params.to_vec(), + context: value.context.ethabi_encode(), } } } @@ -376,7 +376,7 @@ impl TryFrom for UpdateClientCommitment { prev_height: value.prev_height.into(), new_height: value.new_height.into(), timestamp: Time::from_unix_timestamp_nanos(value.timestamp.as_u128())?, - validation_params: ValidationParams::from_bytes(value.validation_params.as_slice()), + context: CommitmentContext::ethabi_decode(value.context.as_slice())?, }) } } @@ -600,7 +600,7 @@ mod tests { prev_height: rand_or_none(gen_rand_height), new_height: gen_rand_height(), timestamp: Time::now(), - validation_params: Default::default(), + context: Default::default(), } } diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs new file mode 100644 index 00000000..1c456a53 --- /dev/null +++ b/modules/commitments/src/context.rs @@ -0,0 +1,415 @@ +use crate::prelude::*; +use crate::{Error, EthABIEncoder}; +use core::{fmt::Display, time::Duration}; +use lcp_types::Time; +use serde::{Deserialize, Serialize}; + +pub const COMMITMENT_CONTEXT_TYPE_NONE: u16 = 0; +pub const COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD: u16 = 1; +pub const COMMITMENT_CONTEXT_HEADER_SIZE: usize = 32; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub enum CommitmentContext { + None, + WithinTrustingPeriod(WithinTrustingPeriodContext), +} + +impl CommitmentContext { + pub fn validate(&self, current_timestamp: Time) -> Result<(), Error> { + match self { + CommitmentContext::None => Ok(()), + CommitmentContext::WithinTrustingPeriod(ctx) => ctx.validate(current_timestamp), + } + } + + // MSB first + // 0-1: type + // 2-31: reserved + pub fn header(&self) -> [u8; COMMITMENT_CONTEXT_HEADER_SIZE] { + let mut header = [0u8; COMMITMENT_CONTEXT_HEADER_SIZE]; + + match self { + CommitmentContext::None => { + header[0..=1].copy_from_slice(&COMMITMENT_CONTEXT_TYPE_NONE.to_be_bytes()); + } + CommitmentContext::WithinTrustingPeriod(_) => { + header[0..=1] + .copy_from_slice(&COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD.to_be_bytes()); + } + } + header + } + + fn parse_context_type_from_header(header_bytes: &[u8]) -> Result { + if header_bytes.len() != COMMITMENT_CONTEXT_HEADER_SIZE { + return Err(Error::invalid_commitment_context_header(format!( + "invalid commitment context header length: expected={} actual={}", + COMMITMENT_CONTEXT_HEADER_SIZE, + header_bytes.len() + ))); + } + + let mut header = [0u8; COMMITMENT_CONTEXT_HEADER_SIZE]; + header.copy_from_slice(header_bytes); + + Ok(u16::from_be_bytes([header[0], header[1]])) + } +} + +impl EthABIEncoder for CommitmentContext { + fn ethabi_encode(self) -> Vec { + let header = self.header().as_ref().try_into().unwrap(); + match self { + CommitmentContext::None => EthABICommitmentContext { + header, + context_bytes: vec![], + } + .encode(), + CommitmentContext::WithinTrustingPeriod(ctx) => EthABICommitmentContext { + header, + context_bytes: ctx.ethabi_encode(), + } + .encode(), + } + } + fn ethabi_decode(bz: &[u8]) -> Result { + let EthABICommitmentContext { + header, + context_bytes, + } = EthABICommitmentContext::decode(bz)?; + + match CommitmentContext::parse_context_type_from_header(&header)? { + COMMITMENT_CONTEXT_TYPE_NONE => { + assert!(context_bytes.is_empty()); + Ok(CommitmentContext::None) + } + COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD => { + let ctx = WithinTrustingPeriodContext::ethabi_decode(&context_bytes)?; + Ok(CommitmentContext::WithinTrustingPeriod(ctx)) + } + type_ => Err(Error::invalid_commitment_context_header(format!( + "unknown commitment context type: {}", + type_ + ))), + } + } +} + +pub(crate) struct EthABICommitmentContext { + header: ethabi::FixedBytes, // bytes32 + context_bytes: ethabi::Bytes, // bytes +} + +impl EthABICommitmentContext { + fn encode(&self) -> Vec { + use ethabi::Token; + ethabi::encode(&[Token::Tuple(vec![ + Token::FixedBytes(self.header.clone()), + Token::Bytes(self.context_bytes.clone()), + ])]) + } + fn decode(bytes: &[u8]) -> Result { + use ethabi::ParamType; + let tuple = ethabi::decode( + &[ParamType::Tuple(vec![ + ParamType::FixedBytes(32), + ParamType::Bytes, + ])], + bytes, + )? + .into_iter() + .next() + .unwrap() + .into_tuple() + .unwrap(); + + // if the decoding is successful, the length of the tuple should be 2 + assert!(tuple.len() == 2); + let mut values = tuple.into_iter(); + Ok(Self { + header: values.next().unwrap().into_fixed_bytes().unwrap(), + context_bytes: values.next().unwrap().into_bytes().unwrap(), + }) + } +} + +impl Default for CommitmentContext { + fn default() -> Self { + CommitmentContext::None + } +} + +impl Display for CommitmentContext { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + CommitmentContext::None => write!(f, "None"), + CommitmentContext::WithinTrustingPeriod(ctx) => write!(f, "TrustingPeriod {{{}}}", ctx), + } + } +} + +/// NOTE: time precision is in seconds (i.e. nanoseconds are truncated) +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct WithinTrustingPeriodContext { + /// How long a validator set is trusted for (must be shorter than the chain's + /// unbonding period) + trusting_period: Duration, + + /// Correction parameter dealing with only approximately synchronized clocks. + /// The local clock should always be ahead of timestamps from the blockchain; this + /// is the maximum amount that the local clock may drift behind a timestamp from the + /// blockchain. + clock_drift: Duration, + + untrusted_header_timestamp: Time, + trusted_state_timestamp: Time, +} + +impl WithinTrustingPeriodContext { + pub fn new( + trusting_period: Duration, + clock_drift: Duration, + untrusted_header_timestamp: Time, + trusted_state_timestamp: Time, + ) -> Result { + // truncate nanoseconds from each parameter + let trusting_period = Duration::from_secs(trusting_period.as_secs()); + let clock_drift = Duration::from_secs(clock_drift.as_secs()); + let untrusted_header_timestamp = + Time::from_unix_timestamp_secs(untrusted_header_timestamp.as_unix_timestamp_secs())?; + let trusted_state_timestamp = + Time::from_unix_timestamp_secs(trusted_state_timestamp.as_unix_timestamp_secs())?; + Ok(Self { + trusting_period, + clock_drift, + untrusted_header_timestamp, + trusted_state_timestamp, + }) + } + + pub fn validate(&self, current_timestamp: Time) -> Result<(), Error> { + // truncate nanoseconds from current timestamp + let current_timestamp = + Time::from_unix_timestamp_secs(current_timestamp.as_unix_timestamp_secs())?; + + // ensure that trusted consensus state's timestamp hasn't passed the trusting period + Self::ensure_within_trust_period( + current_timestamp, + self.trusted_state_timestamp, + self.trusting_period, + )?; + + // ensure the header isn't from a future time + Self::ensure_header_from_past( + self.untrusted_header_timestamp, + self.clock_drift, + current_timestamp, + )?; + + Ok(()) + } + + fn ensure_within_trust_period( + now: Time, + trusted_state_time: Time, + trusting_period: Duration, + ) -> Result<(), Error> { + let trusting_period_end = (trusted_state_time + trusting_period)?; + if trusting_period_end > now { + Ok(()) + } else { + Err(Error::out_of_trusting_period( + now.as_unix_timestamp_secs(), + trusting_period_end.as_unix_timestamp_secs(), + )) + } + } + + fn ensure_header_from_past( + untrusted_header_time: Time, + clock_drift: Duration, + now: Time, + ) -> Result<(), Error> { + let current = (now + clock_drift)?; + if current > untrusted_header_time { + Ok(()) + } else { + Err(Error::header_from_future( + now.as_unix_timestamp_secs(), + untrusted_header_time.as_unix_timestamp_secs(), + )) + } + } +} + +impl Display for WithinTrustingPeriodContext { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!( + f, + "trusting_period={} clock_drift={} untrusted_header_timestamp={} trusted_state_timestamp={}", + self.trusting_period.as_secs(), self.clock_drift.as_secs(), self.untrusted_header_timestamp, self.trusted_state_timestamp + ) + } +} + +impl EthABIEncoder for WithinTrustingPeriodContext { + fn ethabi_encode(self) -> Vec { + let mut params = [0u8; 32]; + params[0..=7].copy_from_slice(&self.trusting_period.as_secs().to_be_bytes()); + params[8..=15].copy_from_slice(&self.clock_drift.as_secs().to_be_bytes()); + params[16..=23].copy_from_slice( + &self + .untrusted_header_timestamp + .as_unix_timestamp_secs() + .to_be_bytes(), + ); + params[24..=31].copy_from_slice( + &self + .trusted_state_timestamp + .as_unix_timestamp_secs() + .to_be_bytes(), + ); + EthABIWithinTrustingPeriodContext { + params: params.to_vec(), + } + .encode() + } + fn ethabi_decode(bz: &[u8]) -> Result { + let c = EthABIWithinTrustingPeriodContext::decode(bz)?; + let params = c.params; + let trusting_period = + Duration::from_secs(u64::from_be_bytes(params[0..=7].try_into().unwrap())); + let clock_drift = + Duration::from_secs(u64::from_be_bytes(params[8..=15].try_into().unwrap())); + let untrusted_header_timestamp = Time::from_unix_timestamp_secs(u64::from_be_bytes( + params[16..=23].try_into().unwrap(), + ))?; + let trusted_state_timestamp = Time::from_unix_timestamp_secs(u64::from_be_bytes( + params[24..=31].try_into().unwrap(), + ))?; + Ok(Self { + trusting_period, + clock_drift, + untrusted_header_timestamp, + trusted_state_timestamp, + }) + } +} + +impl From for CommitmentContext { + fn from(ctx: WithinTrustingPeriodContext) -> Self { + CommitmentContext::WithinTrustingPeriod(ctx) + } +} + +pub(crate) struct EthABIWithinTrustingPeriodContext { + // bytes32 in solidity + // MSB first + // 0-7: trusting_period + // 8-15: clock_drift + // 16-23: untrusted_header_timestamp + // 24-31: trusted_state_timestamp + pub params: ethabi::FixedBytes, +} + +impl EthABIWithinTrustingPeriodContext { + fn encode(self) -> Vec { + use ethabi::Token; + ethabi::encode(&[Token::FixedBytes(self.params)]) + } + fn decode(bytes: &[u8]) -> Result { + use ethabi::ParamType; + let tuple = ethabi::decode(&[ParamType::FixedBytes(32)], bytes)?; + assert!(tuple.len() == 1); + let params = tuple + .into_iter() + .next() + .unwrap() + .into_fixed_bytes() + .unwrap(); + Ok(Self { params }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use lcp_types::MAX_UNIX_TIMESTAMP_SECS; + use proptest::prelude::*; + + proptest! { + #[test] + fn pt_trusting_period_context( + trusting_period in any::(), + clock_drift in any::(), + untrusted_header_timestamp in 0u64..=MAX_UNIX_TIMESTAMP_SECS, + trusted_state_timestamp in 0u64..=MAX_UNIX_TIMESTAMP_SECS + ) { + let ctx: CommitmentContext = WithinTrustingPeriodContext::new( + Duration::from_secs(trusting_period), + Duration::from_secs(clock_drift), + Time::from_unix_timestamp_secs(untrusted_header_timestamp).unwrap(), + Time::from_unix_timestamp_secs(trusted_state_timestamp).unwrap(), + ).unwrap().into(); + let bz = ctx.clone().ethabi_encode(); + let ctx2 = CommitmentContext::ethabi_decode(&bz).unwrap(); + assert_eq!(ctx, ctx2); + } + } + + #[test] + fn test_none_context_serialization() { + let ctx = CommitmentContext::None; + let bz = ctx.clone().ethabi_encode(); + let ctx2 = CommitmentContext::ethabi_decode(&bz).unwrap(); + assert_eq!(ctx, ctx2); + } + + #[test] + fn test_trusting_period_context_serialization() { + let ctx = CommitmentContext::WithinTrustingPeriod( + WithinTrustingPeriodContext::new( + Duration::new(60 * 60 * 24, 0), + Duration::new(60 * 60, 0), + Time::now(), + Time::now(), + ) + .unwrap(), + ); + let bz = ctx.clone().ethabi_encode(); + let ctx2 = CommitmentContext::ethabi_decode(&bz).unwrap(); + assert_eq!(ctx, ctx2); + } + + #[test] + fn test_context_header() { + let ctx = CommitmentContext::None; + let header = ctx.header(); + assert_eq!( + COMMITMENT_CONTEXT_TYPE_NONE, + CommitmentContext::parse_context_type_from_header(&header).unwrap() + ); + + let ctx = CommitmentContext::WithinTrustingPeriod( + WithinTrustingPeriodContext::new( + Duration::new(60 * 60 * 24, 0), + Duration::new(60 * 60, 0), + Time::now(), + Time::now(), + ) + .unwrap(), + ); + let header = ctx.header(); + assert_eq!( + COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD, + CommitmentContext::parse_context_type_from_header(&header).unwrap() + ); + } + + #[test] + fn test_eth_abi_encoding() { + use ethabi::Token; + let v = ethabi::encode(&[Token::FixedBytes([0u8; 32].to_vec())]); + assert_eq!(v.len(), 32); + } +} diff --git a/modules/commitments/src/errors.rs b/modules/commitments/src/errors.rs index ec798fbe..a6174b44 100644 --- a/modules/commitments/src/errors.rs +++ b/modules/commitments/src/errors.rs @@ -60,6 +60,32 @@ define_error! { format_args!("invalid commitment header: descr={}", e.descr) }, + InvalidCommitmentContextHeader + { + descr: String + } + |e| { + format_args!("invalid commitment context header: descr={}", e.descr) + }, + + OutOfTrustingPeriod + { + current_timestamp: u64, + trusting_period_end: u64 + } + |e| { + format_args!("out of trusting period: current_timestamp={} trusting_period_end={}", e.current_timestamp, e.trusting_period_end) + }, + + HeaderFromFuture + { + current_timestamp: u64, + header_timestamp: u64 + } + |e| { + format_args!("header is coming from future: current_timestamp={} header_timestamp={}", e.current_timestamp, e.header_timestamp) + }, + LcpType {} [lcp_types::TypeError] diff --git a/modules/commitments/src/lib.rs b/modules/commitments/src/lib.rs index 47ddb88b..79789255 100644 --- a/modules/commitments/src/lib.rs +++ b/modules/commitments/src/lib.rs @@ -22,12 +22,14 @@ mod prelude { pub use commitment::{ Commitment, CommitmentPrefix, EthABIEncoder, StateCommitment, UpdateClientCommitment, }; +pub use context::{CommitmentContext, WithinTrustingPeriodContext}; pub use errors::Error; pub use proof::CommitmentProof; pub use prover::prove_commitment; pub use state::{gen_state_id_from_any, gen_state_id_from_bytes, StateID, STATE_ID_SIZE}; mod commitment; +mod context; mod errors; mod proof; mod prover; diff --git a/modules/lcp-client/Cargo.toml b/modules/lcp-client/Cargo.toml index ffa5ab7d..28945ef2 100644 --- a/modules/lcp-client/Cargo.toml +++ b/modules/lcp-client/Cargo.toml @@ -12,7 +12,6 @@ flex-error = { version = "0.4.4", default-features = false } lcp-types = { path = "../types", default-features = false } commitments = { path = "../commitments", default-features = false } -validation-context = { path = "../validation-context", default-features = false } attestation-report = { path = "../attestation-report", default-features = false } light-client = { path = "../light-client", default-features = false } lcp-proto = { path = "../../proto", default-features = false } diff --git a/modules/lcp-client/src/client_def.rs b/modules/lcp-client/src/client_def.rs index 84408644..55de2f18 100644 --- a/modules/lcp-client/src/client_def.rs +++ b/modules/lcp-client/src/client_def.rs @@ -9,7 +9,6 @@ use commitments::{CommitmentPrefix, CommitmentProof, EthABIEncoder, StateCommitm use crypto::{verify_signature_address, Address, Keccak256}; use lcp_types::{ClientId, Height, Time}; use light_client::{ClientKeeper, ClientReader, HostClientKeeper, HostClientReader}; -use validation_context::{validation_predicate, ValidationContext}; pub const LCP_CLIENT_TYPE: &str = "0000-lcp"; @@ -95,8 +94,7 @@ impl LCPClient { assert!(message.signer() == signer); // check if proxy's validation context matches our's context - let vctx = ValidationContext::new(ctx.host_timestamp()); - assert!(validation_predicate(&vctx, message.validation_params()).unwrap()); + message.context().validate(ctx.host_timestamp())?; // create a new state let new_client_state = client_state.with_header(&message); @@ -119,9 +117,8 @@ impl LCPClient { ) -> Result<(), Error> { // TODO return an error instead of assertion - let vctx = ValidationContext::new(ctx.host_timestamp()); let eavr = message.0; - let (key, attestation_time) = verify_report(&vctx, &client_state, &eavr)?; + let (key, attestation_time) = verify_report(ctx.host_timestamp(), &client_state, &eavr)?; self.add_enclave_key( ctx, @@ -172,8 +169,6 @@ impl LCPClient { assert!(commitment_proof.signer == signer); // check if the specified signer is not expired and exists in the client state - let vctx = ValidationContext::new(ctx.host_timestamp()); - assert!(self.is_active_enclave_key(ctx, &client_id, signer)); Ok(()) @@ -224,22 +219,22 @@ impl LCPClient { // - verifies the Attestation Verification Report // - calculate a key expiration with client_state and report's timestamp fn verify_report( - vctx: &ValidationContext, + current_timestamp: Time, client_state: &ClientState, eavr: &EndorsedAttestationVerificationReport, ) -> Result<(Address, Time), Error> { // verify AVR with Intel SGX Attestation Report Signing CA // NOTE: This verification is skipped in tests because the CA is not available in the test environment #[cfg(not(test))] - attestation_report::verify_report(eavr, vctx.current_timestamp)?; + attestation_report::verify_report(eavr, current_timestamp)?; let quote = eavr.get_avr()?.parse_quote()?; // check if attestation report's timestamp is not expired let key_expiration = (quote.attestation_time + client_state.key_expiration)?; - if vctx.current_timestamp > key_expiration { + if current_timestamp > key_expiration { return Err(Error::expired_avr( - vctx.current_timestamp, + current_timestamp, quote.attestation_time, client_state.key_expiration, )); diff --git a/modules/lcp-client/src/message.rs b/modules/lcp-client/src/message.rs index 25b63f6d..e62630ff 100644 --- a/modules/lcp-client/src/message.rs +++ b/modules/lcp-client/src/message.rs @@ -1,7 +1,7 @@ use crate::errors::Error; use crate::prelude::*; use attestation_report::EndorsedAttestationVerificationReport; -use commitments::{Commitment, StateID, UpdateClientCommitment}; +use commitments::{Commitment, CommitmentContext, StateID, UpdateClientCommitment}; use crypto::Address; use ibc_proto::protobuf::Protobuf; use lcp_proto::ibc::lightclients::lcp::v1::{ @@ -11,7 +11,6 @@ use lcp_proto::ibc::lightclients::lcp::v1::{ use lcp_types::{Any, Height, Time}; use prost_types::Any as ProtoAny; use serde::{Deserialize, Serialize}; -use validation_context::ValidationParams; pub const LCP_REGISTER_ENCLAVE_KEY_MESSAGE_TYPE_URL: &str = "/ibc.lightclients.lcp.v1.RegisterEnclaveKeyMessage"; @@ -166,8 +165,8 @@ pub trait CommitmentReader { self.commitment().timestamp } - fn validation_params(&self) -> &ValidationParams { - &self.commitment().validation_params + fn context(&self) -> &CommitmentContext { + &self.commitment().context } } diff --git a/modules/mock-lc/Cargo.toml b/modules/mock-lc/Cargo.toml index 7701dc79..eb01d972 100644 --- a/modules/mock-lc/Cargo.toml +++ b/modules/mock-lc/Cargo.toml @@ -13,4 +13,3 @@ lcp-types = { path = "../types", default-features = false } light-client = { path = "../light-client", default-features = false, features = ["ibc"] } light-client-registry = { path = "../light-client-registry", default-features = false } commitments = { path = "../commitments", default-features = false } -validation-context = { path = "../validation-context", default-features = false } diff --git a/modules/mock-lc/src/client.rs b/modules/mock-lc/src/client.rs index b0a39134..04e1f018 100644 --- a/modules/mock-lc/src/client.rs +++ b/modules/mock-lc/src/client.rs @@ -2,7 +2,7 @@ use crate::errors::Error; use crate::header::Header; use crate::prelude::*; use crate::state::{gen_state_id, ClientState, ConsensusState}; -use commitments::{gen_state_id_from_any, UpdateClientCommitment}; +use commitments::{gen_state_id_from_any, CommitmentContext, UpdateClientCommitment}; use ibc::core::ics02_client::client_state::{ downcast_client_state, ClientState as Ics02ClientState, UpdatedState, }; @@ -12,13 +12,11 @@ use ibc::core::ics02_client::header::Header as Ics02Header; use ibc::mock::client_state::{client_type, MockClientState, MOCK_CLIENT_STATE_TYPE_URL}; use ibc::mock::consensus_state::MockConsensusState; use lcp_types::{Any, ClientId, Height, Time}; -use light_client::ibc::IBCContext; use light_client::{ - CreateClientResult, Error as LightClientError, HostClientReader, LightClient, + ibc::IBCContext, CreateClientResult, Error as LightClientError, HostClientReader, LightClient, StateVerificationResult, UpdateClientResult, }; use light_client_registry::LightClientRegistry; -use validation_context::ValidationParams; #[derive(Default)] pub struct MockLightClient; @@ -59,7 +57,7 @@ impl LightClient for MockLightClient { prev_height: None, new_height: height, timestamp, - validation_params: ValidationParams::Empty, + context: CommitmentContext::None, } .into(), prove: false, @@ -142,7 +140,7 @@ impl LightClient for MockLightClient { prev_height: Some(latest_height.into()), new_height: height, timestamp: header_timestamp, - validation_params: ValidationParams::Empty, + context: CommitmentContext::None, } .into(), prove: true, diff --git a/modules/tendermint-lc/Cargo.toml b/modules/tendermint-lc/Cargo.toml index 620bbb13..ee87de77 100644 --- a/modules/tendermint-lc/Cargo.toml +++ b/modules/tendermint-lc/Cargo.toml @@ -14,5 +14,4 @@ lcp-types = { path = "../types", default-features = false } light-client = { path = "../light-client", default-features = false, features = ["ibc"] } light-client-registry = { path = "../light-client-registry", default-features = false } commitments = { path = "../commitments", default-features = false } -validation-context = { path = "../validation-context", default-features = false } crypto = { path = "../crypto", default-features = false } diff --git a/modules/tendermint-lc/src/client.rs b/modules/tendermint-lc/src/client.rs index a4f9625b..fb00f02a 100644 --- a/modules/tendermint-lc/src/client.rs +++ b/modules/tendermint-lc/src/client.rs @@ -2,7 +2,10 @@ use crate::errors::Error; use crate::header::Header; use crate::prelude::*; use crate::state::{canonicalize_state, gen_state_id, ClientState, ConsensusState}; -use commitments::{CommitmentPrefix, StateCommitment, UpdateClientCommitment}; +use commitments::{ + CommitmentContext, CommitmentPrefix, StateCommitment, UpdateClientCommitment, + WithinTrustingPeriodContext, +}; use core::str::FromStr; use crypto::Keccak256; use ibc::clients::ics07_tendermint::client_state::{ @@ -33,8 +36,6 @@ use light_client::{ }; use light_client_registry::LightClientRegistry; use log::*; -use validation_context::tendermint::{TendermintValidationOptions, TendermintValidationParams}; -use validation_context::ValidationParams; #[derive(Default)] pub struct TendermintLightClient; @@ -79,7 +80,7 @@ impl LightClient for TendermintLightClient { prev_height: None, new_height: height, timestamp, - validation_params: ValidationParams::Empty, + context: CommitmentContext::None, } .into(), prove: false, @@ -177,7 +178,7 @@ impl LightClient for TendermintLightClient { .clone(), ); - let trusted_consensus_state_timestamp: Time = trusted_consensus_state.timestamp().into(); + let trusted_state_timestamp: Time = trusted_consensus_state.timestamp().into(); let lc_opts = client_state.as_light_client_options().unwrap(); let prev_state_id = @@ -197,14 +198,14 @@ impl LightClient for TendermintLightClient { prev_height: Some(header.trusted_height.into()), new_height: height, timestamp: header_timestamp, - validation_params: ValidationParams::Tendermint(TendermintValidationParams { - options: TendermintValidationOptions { - trusting_period: lc_opts.trusting_period, - clock_drift: lc_opts.clock_drift, - }, - untrusted_header_timestamp: header_timestamp, - trusted_consensus_state_timestamp, - }), + context: WithinTrustingPeriodContext::new( + lc_opts.trusting_period, + lc_opts.clock_drift, + header_timestamp, + trusted_state_timestamp, + ) + .map_err(Error::commitment)? + .into(), } .into(), prove: true, diff --git a/modules/types/src/lib.rs b/modules/types/src/lib.rs index 9e4bdec0..4a3100e4 100644 --- a/modules/types/src/lib.rs +++ b/modules/types/src/lib.rs @@ -6,7 +6,7 @@ pub use errors::{TimeError, TypeError}; pub use height::Height; pub use host::ClientId; pub use sgx::Mrenclave; -pub use time::Time; +pub use time::{Time, MAX_UNIX_TIMESTAMP_SECS}; mod any; mod errors; diff --git a/modules/types/src/time.rs b/modules/types/src/time.rs index bb9261a1..f3ed27f7 100644 --- a/modules/types/src/time.rs +++ b/modules/types/src/time.rs @@ -8,6 +8,9 @@ use ibc::timestamp::Timestamp; use serde::{Deserialize, Serialize}; use tendermint::Time as TmTime; +// 9999-12-31T23:59:59Z +pub const MAX_UNIX_TIMESTAMP_SECS: u64 = 253402300799; + #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)] #[serde(transparent)] pub struct Time(TmTime); @@ -106,3 +109,14 @@ impl Sub for Time { Ok(Self((*self - rhs).map_err(TimeError::tendermint)?)) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_max_time() { + assert!(Time::from_unix_timestamp_secs(MAX_UNIX_TIMESTAMP_SECS).is_ok()); + assert!(Time::from_unix_timestamp_secs(MAX_UNIX_TIMESTAMP_SECS + 1).is_err()); + } +} diff --git a/modules/validation-context/Cargo.toml b/modules/validation-context/Cargo.toml deleted file mode 100644 index 9b4f03e0..00000000 --- a/modules/validation-context/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "validation-context" -version = "0.1.0" -edition = "2021" - -[dependencies] -serde = { version = "1.0", default-features = false, features = ["alloc"] } -rlp = { version = "0.5.1", default-features = false } -lcp-types = { path = "../types", default-features = false } - -[dev-dependencies] -lcp-types = { path = "../types", default-features = false, features = ["std"] } diff --git a/modules/validation-context/src/context.rs b/modules/validation-context/src/context.rs deleted file mode 100644 index 1842d8bd..00000000 --- a/modules/validation-context/src/context.rs +++ /dev/null @@ -1,12 +0,0 @@ -use lcp_types::Time; - -#[derive(Debug, Clone, PartialEq)] -pub struct ValidationContext { - pub current_timestamp: Time, -} - -impl ValidationContext { - pub fn new(current_timestamp: Time) -> Self { - ValidationContext { current_timestamp } - } -} diff --git a/modules/validation-context/src/lib.rs b/modules/validation-context/src/lib.rs deleted file mode 100644 index ec67168d..00000000 --- a/modules/validation-context/src/lib.rs +++ /dev/null @@ -1,28 +0,0 @@ -#![no_std] -extern crate alloc; -mod prelude { - pub use core::prelude::v1::*; - - // Re-export according to alloc::prelude::v1 because it is not yet stabilized - // https://doc.rust-lang.org/src/alloc/prelude/v1.rs.html - pub use alloc::borrow::ToOwned; - pub use alloc::boxed::Box; - pub use alloc::string::{String, ToString}; - pub use alloc::vec::Vec; - - pub use alloc::format; - pub use alloc::vec; - - // Those are exported by default in the std prelude in Rust 2021 - pub use core::convert::{TryFrom, TryInto}; - pub use core::iter::FromIterator; -} - -pub use context::ValidationContext; -pub use params::ValidationParams; -pub use predicate::{validation_predicate, ValidationPredicate}; - -mod context; -mod params; -mod predicate; -pub mod tendermint; diff --git a/modules/validation-context/src/params.rs b/modules/validation-context/src/params.rs deleted file mode 100644 index 066d1ef6..00000000 --- a/modules/validation-context/src/params.rs +++ /dev/null @@ -1,51 +0,0 @@ -use crate::prelude::*; -use crate::tendermint::TendermintValidationParams; -use core::fmt::Display; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub enum ValidationParams { - Empty, - Tendermint(TendermintValidationParams), -} - -impl Default for ValidationParams { - fn default() -> Self { - Self::Empty - } -} - -impl Display for ValidationParams { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - match self { - Self::Empty => write!(f, "Empty"), - Self::Tendermint(params) => write!(f, "{}", params), - } - } -} - -impl ValidationParams { - pub fn to_vec(&self) -> Vec { - use ValidationParams::*; - - match self { - Empty => vec![0], - Tendermint(params) => { - let mut bz = Vec::new(); - bz.push(1); - bz.extend(params.to_vec()); - bz - } - } - } - - pub fn from_bytes(bz: &[u8]) -> Self { - use ValidationParams::*; - assert!(!bz.is_empty()); - match bz[0] { - 0 => Empty, - 1 => Tendermint(TendermintValidationParams::from_bytes(&bz[1..])), - id => panic!("unknown type: {}", id), - } - } -} diff --git a/modules/validation-context/src/predicate.rs b/modules/validation-context/src/predicate.rs deleted file mode 100644 index 4705631f..00000000 --- a/modules/validation-context/src/predicate.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::{ - params::ValidationParams, tendermint::TendermintValidationPredicate, ValidationContext, -}; - -pub trait ValidationPredicate { - // TODO Result's right should be Error type - #[allow(clippy::result_unit_err)] - fn predicate(vctx: &ValidationContext, params: &ValidationParams) -> Result; -} - -#[allow(clippy::result_unit_err)] -pub fn validation_predicate( - vctx: &ValidationContext, - params: &ValidationParams, -) -> Result { - use ValidationParams::*; - match params { - Empty => Ok(true), - Tendermint(_) => TendermintValidationPredicate::predicate(vctx, params), - } -} diff --git a/modules/validation-context/src/tendermint.rs b/modules/validation-context/src/tendermint.rs deleted file mode 100644 index 0329d329..00000000 --- a/modules/validation-context/src/tendermint.rs +++ /dev/null @@ -1,138 +0,0 @@ -use crate::prelude::*; -use crate::{params::ValidationParams, ValidationContext, ValidationPredicate}; -use core::fmt::Display; -use core::time::Duration; -use lcp_types::Time; -use rlp::{Rlp, RlpStream}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct TendermintValidationParams { - pub options: TendermintValidationOptions, - pub untrusted_header_timestamp: Time, - pub trusted_consensus_state_timestamp: Time, -} - -impl Display for TendermintValidationParams { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!( - f, - "options={:?} untrusted_header_timestamp={} trusted_consensus_state_timestamp={}", - self.options, self.untrusted_header_timestamp, self.trusted_consensus_state_timestamp - ) - } -} - -#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct TendermintValidationOptions { - /// How long a validator set is trusted for (must be shorter than the chain's - /// unbonding period) - pub trusting_period: Duration, - - /// Correction parameter dealing with only approximately synchronized clocks. - /// The local clock should always be ahead of timestamps from the blockchain; this - /// is the maximum amount that the local clock may drift behind a timestamp from the - /// blockchain. - pub clock_drift: Duration, -} - -impl TendermintValidationParams { - pub fn to_vec(&self) -> Vec { - let mut s = RlpStream::new_list(3); - s.begin_list(2) - .append(&self.options.trusting_period.as_nanos()) - .append(&self.options.clock_drift.as_nanos()); - s.append(&self.untrusted_header_timestamp.as_unix_timestamp_nanos()); - s.append( - &self - .trusted_consensus_state_timestamp - .as_unix_timestamp_nanos(), - ); - s.out().to_vec() - } - - pub fn from_bytes(bz: &[u8]) -> Self { - let root = Rlp::new(bz); - let options = root.at(0).unwrap(); - - Self { - options: TendermintValidationOptions { - trusting_period: Duration::from_nanos(options.val_at(0).unwrap()), - clock_drift: Duration::from_nanos(options.val_at(1).unwrap()), - }, - untrusted_header_timestamp: Time::from_unix_timestamp_nanos(root.val_at(1).unwrap()) - .unwrap(), - trusted_consensus_state_timestamp: Time::from_unix_timestamp_nanos( - root.val_at(2).unwrap(), - ) - .unwrap(), - } - } -} - -pub struct TendermintValidationPredicate; - -impl TendermintValidationPredicate { - fn is_within_trust_period( - trusted_state_time: Time, - trusting_period: Duration, - now: Time, - ) -> bool { - (trusted_state_time + trusting_period).unwrap() > now - } - - fn is_header_from_past(untrusted_header_time: Time, clock_drift: Duration, now: Time) -> bool { - (now + clock_drift).unwrap() > untrusted_header_time - } -} - -impl ValidationPredicate for TendermintValidationPredicate { - fn predicate(vctx: &ValidationContext, params: &ValidationParams) -> Result { - let params = match params { - ValidationParams::Tendermint(params) => params, - _ => unreachable!(), - }; - - // TODO return an error instead of assertion - - // ensure that trusted consensus state's timestamp hasn't passed the trusting period - assert!(Self::is_within_trust_period( - params.trusted_consensus_state_timestamp, - params.options.trusting_period, - vctx.current_timestamp, - )); - - // ensure the header isn't from a future time - assert!(Self::is_header_from_past( - params.untrusted_header_timestamp, - params.options.clock_drift, - vctx.current_timestamp, - )); - - Ok(true) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn serialization_validation_params() { - let current_timestamp = Time::now(); - let untrusted_header_timestamp = current_timestamp; - let trusted_consensus_state_timestamp = current_timestamp; - - let params = TendermintValidationParams { - options: TendermintValidationOptions { - trusting_period: Duration::new(60 * 60 * 24, 0), - clock_drift: Duration::new(60 * 60, 0), - }, - untrusted_header_timestamp, - trusted_consensus_state_timestamp, - }; - let bz = params.to_vec(); - let new_params = TendermintValidationParams::from_bytes(&bz); - assert!(params == new_params); - } -} From dce37122d44ca66de0527ba5bad57a1c22c09928 Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Wed, 16 Aug 2023 19:04:42 +0900 Subject: [PATCH 2/8] go: implement commitment context validation Signed-off-by: Jun Kimura --- go/light-clients/lcp/types/commitment.go | 121 ++++++++++++++++++++++- go/light-clients/lcp/types/update.go | 4 + 2 files changed, 123 insertions(+), 2 deletions(-) diff --git a/go/light-clients/lcp/types/commitment.go b/go/light-clients/lcp/types/commitment.go index 632652d6..f7bb616c 100644 --- a/go/light-clients/lcp/types/commitment.go +++ b/go/light-clients/lcp/types/commitment.go @@ -5,6 +5,7 @@ import ( "encoding/binary" "fmt" "math/big" + "time" clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types" "github.com/ethereum/go-ethereum/accounts/abi" @@ -17,6 +18,11 @@ const ( LCPCommitmentTypeState = 2 ) +const ( + LCPCommitmentContextTypeNone = 0 + LCPCommitmentContextTypeWithinTrustingPeriod = 1 +) + var ( commitmentProofABI, _ = abi.NewType("tuple", "struct CommitmentProof", []abi.ArgumentMarshaling{ {Name: "commitment_bytes", Type: "bytes"}, @@ -45,6 +51,13 @@ var ( {Name: "context", Type: "bytes"}, }) + headeredCommitmentContextABI, _ = abi.NewType("tuple", "struct HeaderedCommitmentContext", []abi.ArgumentMarshaling{ + {Name: "header", Type: "bytes32"}, + {Name: "context_bytes", Type: "bytes"}, + }) + + withinTrustingPeriodContextABI, _ = abi.NewType("bytes32", "", nil) + stateCommitmentABI, _ = abi.NewType("tuple", "struct StateCommitment", []abi.ArgumentMarshaling{ {Name: "prefix", Type: "bytes"}, {Name: "path", Type: "bytes"}, @@ -70,7 +83,63 @@ type UpdateClientCommitment struct { PrevHeight *clienttypes.Height NewHeight clienttypes.Height Timestamp *big.Int - Context []byte + Context CommitmentContext +} + +// CommitmentContext is the interface for the context of a commitment. +type CommitmentContext interface { + Validate(time.Time) error +} + +// NoneCommitmentContext is the commitment context for a commitment that does not require any validation. +type NoneCommitmentContext struct{} + +var _ CommitmentContext = NoneCommitmentContext{} + +func (NoneCommitmentContext) Validate(time.Time) error { + return nil +} + +// WithinTrustingPeriodCommitmentContext is the commitment context for a commitment that requires the current time to be within the trusting period. +type WithinTrustingPeriodCommitmentContext struct { + TrustingPeriod time.Duration + ClockDrift time.Duration + UntrustedHeaderTimestamp time.Time + TrustedStateTimestamp time.Time +} + +func DecodeWithinTrustingPeriodCommitmentContext(bz [32]byte) *WithinTrustingPeriodCommitmentContext { + // MSB first + // 0-7: trusting_period + // 8-15: clock_drift + // 16-23: untrusted_header_timestamp + // 24-31: trusted_state_timestamp + trustingPeriod := time.Duration(binary.BigEndian.Uint64(bz[:8])) * time.Second + clockDrift := time.Duration(binary.BigEndian.Uint64(bz[8:16])) * time.Second + untrustedHeaderTimestamp := time.Unix(int64(binary.BigEndian.Uint64(bz[16:24])), 0) + trustedStateTimestamp := time.Unix(int64(binary.BigEndian.Uint64(bz[24:32])), 0) + return &WithinTrustingPeriodCommitmentContext{ + TrustingPeriod: trustingPeriod, + ClockDrift: clockDrift, + UntrustedHeaderTimestamp: untrustedHeaderTimestamp, + TrustedStateTimestamp: trustedStateTimestamp, + } +} + +var _ CommitmentContext = WithinTrustingPeriodCommitmentContext{} + +func (c WithinTrustingPeriodCommitmentContext) Validate(now time.Time) error { + // ensure current timestamp is within trusting period + trustingPeriodEnd := c.TrustedStateTimestamp.Add(c.TrustingPeriod) + if now.After(trustingPeriodEnd) { + return fmt.Errorf("current time is after trusting period end: trusting_period_end=%v current=%v", trustingPeriodEnd, now) + } + // ensure header's timestamp indicates past + current := now.Add(c.ClockDrift) + if c.UntrustedHeaderTimestamp.After(current) { + return fmt.Errorf("untrusted header timestamp is after current time: untrusted_header_timestamp=%v current=%v", c.UntrustedHeaderTimestamp, current) + } + return nil } type StateCommitment struct { @@ -189,12 +258,16 @@ func EthABIDecodeUpdateClientCommitment(bz []byte) (*UpdateClientCommitment, err Timestamp *big.Int `json:"timestamp"` Context []byte `json:"context"` }) + cctx, err := EthABIDecodeCommitmentContext(p.Context) + if err != nil { + return nil, err + } c := &UpdateClientCommitment{ NewStateID: p.NewStateId, NewState: p.NewState, NewHeight: clienttypes.Height{RevisionNumber: p.NewHeight.RevisionNumber, RevisionHeight: p.NewHeight.RevisionHeight}, Timestamp: p.Timestamp, - Context: p.Context, + Context: cctx, } if p.PrevStateId != [32]byte{} { prev := StateID(p.PrevStateId) @@ -206,6 +279,50 @@ func EthABIDecodeUpdateClientCommitment(bz []byte) (*UpdateClientCommitment, err return c, nil } +func EthABIDecodeCommitmentContext(bz []byte) (CommitmentContext, error) { + unpacker := abi.Arguments{ + {Type: headeredCommitmentContextABI}, + } + v, err := unpacker.Unpack(bz) + if err != nil { + return nil, err + } + p := v[0].(struct { + Header [32]byte `json:"header"` + ContextBytes []byte `json:"context_bytes"` + }) + // Header format: + // MSB first + // 0-1: type + // 2-31: reserved + contextType := binary.BigEndian.Uint16(p.Header[:2]) + switch contextType { + case LCPCommitmentContextTypeNone: + if len(p.ContextBytes) != 0 { + return nil, fmt.Errorf("unexpected context bytes for none commitment context: %X", p.ContextBytes) + } + return &NoneCommitmentContext{}, nil + case LCPCommitmentContextTypeWithinTrustingPeriod: + return EthABIDecodeWithinTrustingPeriodCommitmentContext(p.ContextBytes) + default: + return nil, fmt.Errorf("unexpected commitment context type: %v", contextType) + } +} + +func EthABIDecodeWithinTrustingPeriodCommitmentContext(bz []byte) (*WithinTrustingPeriodCommitmentContext, error) { + if len(bz) != 32 { + return nil, fmt.Errorf("unexpected length of within trusting period commitment context: %d", len(bz)) + } + unpacker := abi.Arguments{ + {Type: withinTrustingPeriodContextABI}, + } + v, err := unpacker.Unpack(bz) + if err != nil { + return nil, err + } + return DecodeWithinTrustingPeriodCommitmentContext(v[0].([32]byte)), nil +} + func EthABIDecodeStateCommitment(bz []byte) (*StateCommitment, error) { unpacker := abi.Arguments{ {Type: stateCommitmentABI}, diff --git a/go/light-clients/lcp/types/update.go b/go/light-clients/lcp/types/update.go index 92441643..c20a29f7 100644 --- a/go/light-clients/lcp/types/update.go +++ b/go/light-clients/lcp/types/update.go @@ -57,6 +57,10 @@ func (cs ClientState) verifyUpdateClient(ctx sdk.Context, cdc codec.BinaryCodec, return sdkerrors.Wrapf(clienttypes.ErrInvalidHeader, err.Error()) } + if err := commitment.Context.Validate(ctx.BlockTime()); err != nil { + return sdkerrors.Wrapf(clienttypes.ErrInvalidHeader, "invalid context: %v", err) + } + return nil } From 96bbb0ce3d360128a1e3dad567f939a8f898eb5f Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Thu, 17 Aug 2023 10:39:41 +0900 Subject: [PATCH 3/8] commitments: add some comments Signed-off-by: Jun Kimura --- modules/commitments/src/context.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs index 1c456a53..09891e11 100644 --- a/modules/commitments/src/context.rs +++ b/modules/commitments/src/context.rs @@ -161,7 +161,12 @@ pub struct WithinTrustingPeriodContext { /// blockchain. clock_drift: Duration, + /// The timestamp of the untrusted header + /// NOTE: The header is used to update the state of the light client. untrusted_header_timestamp: Time, + + /// The timestamp of the trusted state + /// NOTE: The state is a previously verified state of the light client. trusted_state_timestamp: Time, } From bb7f4d2c55e6e523cff38a4d71200b73e87ebc61 Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Thu, 17 Aug 2023 21:47:34 +0900 Subject: [PATCH 4/8] commitments: use u128 nanos as time precision Signed-off-by: Jun Kimura --- Cargo.lock | 1 + go/light-clients/lcp/types/commitment.go | 96 ++++++++++---- modules/commitments/src/commitment.rs | 14 --- modules/commitments/src/context.rs | 147 ++++++++++------------ modules/commitments/src/errors.rs | 27 +++- modules/lcp-client/src/consensus_state.rs | 4 +- modules/tendermint-lc/src/client.rs | 1 - modules/types/Cargo.toml | 3 + modules/types/src/errors.rs | 11 +- modules/types/src/lib.rs | 2 +- modules/types/src/time.rs | 55 +++++--- 11 files changed, 221 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0128f446..7721ec2c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2659,6 +2659,7 @@ dependencies = [ "hex", "ibc", "ibc-proto 0.26.0", + "proptest", "prost-types", "serde", "serde_json", diff --git a/go/light-clients/lcp/types/commitment.go b/go/light-clients/lcp/types/commitment.go index f7bb616c..c711ca6b 100644 --- a/go/light-clients/lcp/types/commitment.go +++ b/go/light-clients/lcp/types/commitment.go @@ -56,7 +56,10 @@ var ( {Name: "context_bytes", Type: "bytes"}, }) - withinTrustingPeriodContextABI, _ = abi.NewType("bytes32", "", nil) + withinTrustingPeriodContextABI, _ = abi.NewType("tuple", "struct WithinTrustingPeriodCommitmentContext", []abi.ArgumentMarshaling{ + {Name: "params", Type: "bytes32"}, + {Name: "timestamps", Type: "bytes32"}, + }) stateCommitmentABI, _ = abi.NewType("tuple", "struct StateCommitment", []abi.ArgumentMarshaling{ {Name: "prefix", Type: "bytes"}, @@ -102,42 +105,87 @@ func (NoneCommitmentContext) Validate(time.Time) error { // WithinTrustingPeriodCommitmentContext is the commitment context for a commitment that requires the current time to be within the trusting period. type WithinTrustingPeriodCommitmentContext struct { - TrustingPeriod time.Duration - ClockDrift time.Duration + TrustingPeriod big.Int + ClockDrift big.Int UntrustedHeaderTimestamp time.Time TrustedStateTimestamp time.Time } -func DecodeWithinTrustingPeriodCommitmentContext(bz [32]byte) *WithinTrustingPeriodCommitmentContext { +func DecodeWithinTrustingPeriodCommitmentContext(params, timestamps [32]byte) *WithinTrustingPeriodCommitmentContext { // MSB first - // 0-7: trusting_period - // 8-15: clock_drift - // 16-23: untrusted_header_timestamp - // 24-31: trusted_state_timestamp - trustingPeriod := time.Duration(binary.BigEndian.Uint64(bz[:8])) * time.Second - clockDrift := time.Duration(binary.BigEndian.Uint64(bz[8:16])) * time.Second - untrustedHeaderTimestamp := time.Unix(int64(binary.BigEndian.Uint64(bz[16:24])), 0) - trustedStateTimestamp := time.Unix(int64(binary.BigEndian.Uint64(bz[24:32])), 0) + // 0-15: trusting_period + // 16-31: clock_drift + trustingPeriod := uint128BytesToBigInt(params[:16]) + clockDrift := uint128BytesToBigInt(params[16:32]) + + // 0-15: untrusted_header_timestamp + // 16-31: trusted_state_timestamp return &WithinTrustingPeriodCommitmentContext{ TrustingPeriod: trustingPeriod, ClockDrift: clockDrift, - UntrustedHeaderTimestamp: untrustedHeaderTimestamp, - TrustedStateTimestamp: trustedStateTimestamp, + UntrustedHeaderTimestamp: timestampNanosBytesToTime(timestamps[:16]), + TrustedStateTimestamp: timestampNanosBytesToTime(timestamps[16:32]), + } +} + +func uint128BytesToBigInt(bz []byte) big.Int { + if len(bz) != 16 { + panic("invalid length") + } + var durationNanos big.Int + durationNanos.SetBytes(bz) + return durationNanos +} + +func timestampNanosBytesToTime(bz []byte) time.Time { + if len(bz) != 16 { + panic("invalid length") } + var ( + timestampNanos big.Int + secs big.Int + nanos big.Int + ) + + timestampNanos.SetBytes(bz) + secs.Div(×tampNanos, big.NewInt(1e9)) + nanos.Mod(×tampNanos, big.NewInt(1e9)) + return time.Unix(secs.Int64(), nanos.Int64()) } var _ CommitmentContext = WithinTrustingPeriodCommitmentContext{} +func timeToBigInt(t time.Time) big.Int { + var ( + secs big.Int + nanos big.Int + ) + secs.SetInt64(t.Unix()) + secs.Mul(&secs, big.NewInt(1e9)) + nanos.SetInt64(int64(t.Nanosecond())) + secs.Add(&secs, &nanos) + return secs +} + func (c WithinTrustingPeriodCommitmentContext) Validate(now time.Time) error { + currentTimestamp := timeToBigInt(now) + trustedStateTimestamp := timeToBigInt(c.TrustedStateTimestamp) + untrustedHeaderTimestamp := timeToBigInt(c.UntrustedHeaderTimestamp) + + var ( + trustingPeriodEnd big.Int + driftedCurrentTimestamp big.Int + ) + trustingPeriodEnd.Add(&trustedStateTimestamp, &c.TrustingPeriod) + driftedCurrentTimestamp.Add(¤tTimestamp, &c.ClockDrift) + // ensure current timestamp is within trusting period - trustingPeriodEnd := c.TrustedStateTimestamp.Add(c.TrustingPeriod) - if now.After(trustingPeriodEnd) { - return fmt.Errorf("current time is after trusting period end: trusting_period_end=%v current=%v", trustingPeriodEnd, now) + if currentTimestamp.Cmp(&trustingPeriodEnd) > 0 { + return fmt.Errorf("current time is after trusting period end: trusting_period_end=%v current=%v trusted_state_timestamp=%v trusting_period=%v", trustingPeriodEnd, now, c.TrustedStateTimestamp, c.TrustingPeriod) } // ensure header's timestamp indicates past - current := now.Add(c.ClockDrift) - if c.UntrustedHeaderTimestamp.After(current) { - return fmt.Errorf("untrusted header timestamp is after current time: untrusted_header_timestamp=%v current=%v", c.UntrustedHeaderTimestamp, current) + if untrustedHeaderTimestamp.Cmp(&driftedCurrentTimestamp) > 0 { + return fmt.Errorf("untrusted header timestamp is after current time: untrusted_header_timestamp=%v current=%v clock_drift=%v", c.UntrustedHeaderTimestamp, driftedCurrentTimestamp, c.ClockDrift) } return nil } @@ -310,7 +358,7 @@ func EthABIDecodeCommitmentContext(bz []byte) (CommitmentContext, error) { } func EthABIDecodeWithinTrustingPeriodCommitmentContext(bz []byte) (*WithinTrustingPeriodCommitmentContext, error) { - if len(bz) != 32 { + if len(bz) != 64 { return nil, fmt.Errorf("unexpected length of within trusting period commitment context: %d", len(bz)) } unpacker := abi.Arguments{ @@ -320,7 +368,11 @@ func EthABIDecodeWithinTrustingPeriodCommitmentContext(bz []byte) (*WithinTrusti if err != nil { return nil, err } - return DecodeWithinTrustingPeriodCommitmentContext(v[0].([32]byte)), nil + p := v[0].(struct { + Params [32]byte `json:"params"` + Timestamps [32]byte `json:"timestamps"` + }) + return DecodeWithinTrustingPeriodCommitmentContext(p.Params, p.Timestamps), nil } func EthABIDecodeStateCommitment(bz []byte) (*StateCommitment, error) { diff --git a/modules/commitments/src/commitment.rs b/modules/commitments/src/commitment.rs index b808f96f..bf83c1e6 100644 --- a/modules/commitments/src/commitment.rs +++ b/modules/commitments/src/commitment.rs @@ -196,20 +196,6 @@ impl From for Commitment { } } -impl Default for UpdateClientCommitment { - fn default() -> Self { - UpdateClientCommitment { - timestamp: Time::unix_epoch(), - prev_state_id: Default::default(), - new_state_id: Default::default(), - new_state: Default::default(), - prev_height: Default::default(), - new_height: Default::default(), - context: Default::default(), - } - } -} - impl Display for UpdateClientCommitment { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!( diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs index 09891e11..0925abd2 100644 --- a/modules/commitments/src/context.rs +++ b/modules/commitments/src/context.rs @@ -1,7 +1,7 @@ use crate::prelude::*; use crate::{Error, EthABIEncoder}; use core::{fmt::Display, time::Duration}; -use lcp_types::Time; +use lcp_types::{nanos_to_duration, Time}; use serde::{Deserialize, Serialize}; pub const COMMITMENT_CONTEXT_TYPE_NONE: u16 = 0; @@ -176,27 +176,16 @@ impl WithinTrustingPeriodContext { clock_drift: Duration, untrusted_header_timestamp: Time, trusted_state_timestamp: Time, - ) -> Result { - // truncate nanoseconds from each parameter - let trusting_period = Duration::from_secs(trusting_period.as_secs()); - let clock_drift = Duration::from_secs(clock_drift.as_secs()); - let untrusted_header_timestamp = - Time::from_unix_timestamp_secs(untrusted_header_timestamp.as_unix_timestamp_secs())?; - let trusted_state_timestamp = - Time::from_unix_timestamp_secs(trusted_state_timestamp.as_unix_timestamp_secs())?; - Ok(Self { + ) -> Self { + Self { trusting_period, clock_drift, untrusted_header_timestamp, trusted_state_timestamp, - }) + } } pub fn validate(&self, current_timestamp: Time) -> Result<(), Error> { - // truncate nanoseconds from current timestamp - let current_timestamp = - Time::from_unix_timestamp_secs(current_timestamp.as_unix_timestamp_secs())?; - // ensure that trusted consensus state's timestamp hasn't passed the trusting period Self::ensure_within_trust_period( current_timestamp, @@ -223,10 +212,7 @@ impl WithinTrustingPeriodContext { if trusting_period_end > now { Ok(()) } else { - Err(Error::out_of_trusting_period( - now.as_unix_timestamp_secs(), - trusting_period_end.as_unix_timestamp_secs(), - )) + Err(Error::out_of_trusting_period(now, trusting_period_end)) } } @@ -239,10 +225,7 @@ impl WithinTrustingPeriodContext { if current > untrusted_header_time { Ok(()) } else { - Err(Error::header_from_future( - now.as_unix_timestamp_secs(), - untrusted_header_time.as_unix_timestamp_secs(), - )) + Err(Error::header_from_future(now, untrusted_header_time)) } } } @@ -260,37 +243,38 @@ impl Display for WithinTrustingPeriodContext { impl EthABIEncoder for WithinTrustingPeriodContext { fn ethabi_encode(self) -> Vec { let mut params = [0u8; 32]; - params[0..=7].copy_from_slice(&self.trusting_period.as_secs().to_be_bytes()); - params[8..=15].copy_from_slice(&self.clock_drift.as_secs().to_be_bytes()); - params[16..=23].copy_from_slice( + params[0..=15].copy_from_slice(&self.trusting_period.as_nanos().to_be_bytes()); + params[16..=31].copy_from_slice(&self.clock_drift.as_nanos().to_be_bytes()); + let mut timestamps = [0u8; 32]; + timestamps[0..=15].copy_from_slice( &self .untrusted_header_timestamp - .as_unix_timestamp_secs() + .as_unix_timestamp_nanos() .to_be_bytes(), ); - params[24..=31].copy_from_slice( + timestamps[16..=31].copy_from_slice( &self .trusted_state_timestamp - .as_unix_timestamp_secs() + .as_unix_timestamp_nanos() .to_be_bytes(), ); EthABIWithinTrustingPeriodContext { params: params.to_vec(), + timestamps: timestamps.to_vec(), } .encode() } fn ethabi_decode(bz: &[u8]) -> Result { let c = EthABIWithinTrustingPeriodContext::decode(bz)?; - let params = c.params; let trusting_period = - Duration::from_secs(u64::from_be_bytes(params[0..=7].try_into().unwrap())); + nanos_to_duration(u128::from_be_bytes(c.params[0..=15].try_into().unwrap()))?; let clock_drift = - Duration::from_secs(u64::from_be_bytes(params[8..=15].try_into().unwrap())); - let untrusted_header_timestamp = Time::from_unix_timestamp_secs(u64::from_be_bytes( - params[16..=23].try_into().unwrap(), + nanos_to_duration(u128::from_be_bytes(c.params[16..=31].try_into().unwrap()))?; + let untrusted_header_timestamp = Time::from_unix_timestamp_nanos(u128::from_be_bytes( + c.timestamps[0..=15].try_into().unwrap(), ))?; - let trusted_state_timestamp = Time::from_unix_timestamp_secs(u64::from_be_bytes( - params[24..=31].try_into().unwrap(), + let trusted_state_timestamp = Time::from_unix_timestamp_nanos(u128::from_be_bytes( + c.timestamps[16..=31].try_into().unwrap(), ))?; Ok(Self { trusting_period, @@ -310,52 +294,65 @@ impl From for CommitmentContext { pub(crate) struct EthABIWithinTrustingPeriodContext { // bytes32 in solidity // MSB first - // 0-7: trusting_period - // 8-15: clock_drift - // 16-23: untrusted_header_timestamp - // 24-31: trusted_state_timestamp + // 0-15: trusting_period + // 16-31: clock_drift pub params: ethabi::FixedBytes, + // 0-15: untrusted_header_timestamp + // 16-31: trusted_state_timestamp + pub timestamps: ethabi::FixedBytes, } impl EthABIWithinTrustingPeriodContext { fn encode(self) -> Vec { use ethabi::Token; - ethabi::encode(&[Token::FixedBytes(self.params)]) + ethabi::encode(&[Token::Tuple(vec![ + Token::FixedBytes(self.params), + Token::FixedBytes(self.timestamps), + ])]) } fn decode(bytes: &[u8]) -> Result { use ethabi::ParamType; - let tuple = ethabi::decode(&[ParamType::FixedBytes(32)], bytes)?; - assert!(tuple.len() == 1); - let params = tuple - .into_iter() - .next() - .unwrap() - .into_fixed_bytes() - .unwrap(); - Ok(Self { params }) + let tuple = ethabi::decode( + &[ParamType::Tuple(vec![ + ParamType::FixedBytes(32), + ParamType::FixedBytes(32), + ])], + bytes, + )? + .into_iter() + .next() + .unwrap() + .into_tuple() + .unwrap(); + assert!(tuple.len() == 2); + let mut values = tuple.into_iter(); + Ok(Self { + params: values.next().unwrap().into_fixed_bytes().unwrap(), + timestamps: values.next().unwrap().into_fixed_bytes().unwrap(), + }) } } #[cfg(test)] mod tests { use super::*; - use lcp_types::MAX_UNIX_TIMESTAMP_SECS; + use lcp_types::MAX_UNIX_TIMESTAMP_NANOS; use proptest::prelude::*; proptest! { #[test] fn pt_trusting_period_context( - trusting_period in any::(), - clock_drift in any::(), - untrusted_header_timestamp in 0u64..=MAX_UNIX_TIMESTAMP_SECS, - trusted_state_timestamp in 0u64..=MAX_UNIX_TIMESTAMP_SECS + trusting_period in ..=MAX_UNIX_TIMESTAMP_NANOS, + clock_drift in ..=MAX_UNIX_TIMESTAMP_NANOS, + untrusted_header_timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, + trusted_state_timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS ) { let ctx: CommitmentContext = WithinTrustingPeriodContext::new( - Duration::from_secs(trusting_period), - Duration::from_secs(clock_drift), - Time::from_unix_timestamp_secs(untrusted_header_timestamp).unwrap(), - Time::from_unix_timestamp_secs(trusted_state_timestamp).unwrap(), - ).unwrap().into(); + nanos_to_duration(trusting_period).unwrap(), + nanos_to_duration(clock_drift).unwrap(), + Time::from_unix_timestamp_nanos(untrusted_header_timestamp).unwrap(), + Time::from_unix_timestamp_nanos(trusted_state_timestamp).unwrap(), + ).into(); let bz = ctx.clone().ethabi_encode(); let ctx2 = CommitmentContext::ethabi_decode(&bz).unwrap(); assert_eq!(ctx, ctx2); @@ -372,15 +369,12 @@ mod tests { #[test] fn test_trusting_period_context_serialization() { - let ctx = CommitmentContext::WithinTrustingPeriod( - WithinTrustingPeriodContext::new( - Duration::new(60 * 60 * 24, 0), - Duration::new(60 * 60, 0), - Time::now(), - Time::now(), - ) - .unwrap(), - ); + let ctx = CommitmentContext::WithinTrustingPeriod(WithinTrustingPeriodContext::new( + Duration::new(60 * 60 * 24, 0), + Duration::new(60 * 60, 0), + Time::now(), + Time::now(), + )); let bz = ctx.clone().ethabi_encode(); let ctx2 = CommitmentContext::ethabi_decode(&bz).unwrap(); assert_eq!(ctx, ctx2); @@ -395,15 +389,12 @@ mod tests { CommitmentContext::parse_context_type_from_header(&header).unwrap() ); - let ctx = CommitmentContext::WithinTrustingPeriod( - WithinTrustingPeriodContext::new( - Duration::new(60 * 60 * 24, 0), - Duration::new(60 * 60, 0), - Time::now(), - Time::now(), - ) - .unwrap(), - ); + let ctx = CommitmentContext::WithinTrustingPeriod(WithinTrustingPeriodContext::new( + Duration::new(60 * 60 * 24, 0), + Duration::new(60 * 60, 0), + Time::now(), + Time::now(), + )); let header = ctx.header(); assert_eq!( COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD, diff --git a/modules/commitments/src/errors.rs b/modules/commitments/src/errors.rs index a6174b44..ba126bd4 100644 --- a/modules/commitments/src/errors.rs +++ b/modules/commitments/src/errors.rs @@ -1,6 +1,7 @@ use crate::prelude::*; use crate::STATE_ID_SIZE; use flex_error::*; +use lcp_types::Time; define_error! { #[derive(Debug, Clone, PartialEq, Eq)] @@ -70,8 +71,8 @@ define_error! { OutOfTrustingPeriod { - current_timestamp: u64, - trusting_period_end: u64 + current_timestamp: Time, + trusting_period_end: Time } |e| { format_args!("out of trusting period: current_timestamp={} trusting_period_end={}", e.current_timestamp, e.trusting_period_end) @@ -79,13 +80,21 @@ define_error! { HeaderFromFuture { - current_timestamp: u64, - header_timestamp: u64 + current_timestamp: Time, + header_timestamp: Time } |e| { format_args!("header is coming from future: current_timestamp={} header_timestamp={}", e.current_timestamp, e.header_timestamp) }, + NotTruncatedTimestamp + { + timestamp_nanos: u128 + } + |e| { + format_args!("not truncated timestamp: timestamp_nanos={}", e.timestamp_nanos) + }, + LcpType {} [lcp_types::TypeError] @@ -98,6 +107,10 @@ define_error! { Crypto [crypto::Error] |_| {"crypto error"}, + + TryFromIntError + [TraceError] + |_| {"TryFromIntError"} } } @@ -130,3 +143,9 @@ impl From for Error { Error::crypto(value) } } + +impl From for Error { + fn from(value: core::num::TryFromIntError) -> Self { + Error::try_from_int_error(value) + } +} diff --git a/modules/lcp-client/src/consensus_state.rs b/modules/lcp-client/src/consensus_state.rs index 91cccf1e..1833a79a 100644 --- a/modules/lcp-client/src/consensus_state.rs +++ b/modules/lcp-client/src/consensus_state.rs @@ -37,7 +37,9 @@ impl TryFrom for ConsensusState { fn try_from(raw: RawConsensusState) -> Result { Ok(ConsensusState { state_id: raw.state_id.as_slice().try_into().unwrap(), - timestamp: Time::from_unix_timestamp_secs(raw.timestamp).unwrap(), + timestamp: Time::from_unix_timestamp_nanos( + (raw.timestamp as u128).checked_mul(1_000_000_000).unwrap(), + )?, }) } } diff --git a/modules/tendermint-lc/src/client.rs b/modules/tendermint-lc/src/client.rs index fb00f02a..7cc5b814 100644 --- a/modules/tendermint-lc/src/client.rs +++ b/modules/tendermint-lc/src/client.rs @@ -204,7 +204,6 @@ impl LightClient for TendermintLightClient { header_timestamp, trusted_state_timestamp, ) - .map_err(Error::commitment)? .into(), } .into(), diff --git a/modules/types/Cargo.toml b/modules/types/Cargo.toml index 3b6f8023..2c4e03f3 100644 --- a/modules/types/Cargo.toml +++ b/modules/types/Cargo.toml @@ -15,6 +15,9 @@ serde_json = { version = "1.0", default-features = false, features = ["alloc"] } flex-error = { version = "0.4.4", default-features = false } hex = { version = "0.4", default-features = false, features = ["alloc"] } +[dev-dependencies] +proptest = "1.2.0" + [features] default = ["std"] std = [] diff --git a/modules/types/src/errors.rs b/modules/types/src/errors.rs index 7f548428..f70d1470 100644 --- a/modules/types/src/errors.rs +++ b/modules/types/src/errors.rs @@ -39,7 +39,10 @@ define_error! { [tendermint::Error] |_| { "tendermint error" - } + }, + TryFromIntError + [TraceError] + |_| {"TryFromIntError"} } } @@ -48,3 +51,9 @@ impl From for TypeError { Self::hex_parse_error(value) } } + +impl From for TimeError { + fn from(value: core::num::TryFromIntError) -> Self { + Self::try_from_int_error(value) + } +} diff --git a/modules/types/src/lib.rs b/modules/types/src/lib.rs index 4a3100e4..d513b347 100644 --- a/modules/types/src/lib.rs +++ b/modules/types/src/lib.rs @@ -6,7 +6,7 @@ pub use errors::{TimeError, TypeError}; pub use height::Height; pub use host::ClientId; pub use sgx::Mrenclave; -pub use time::{Time, MAX_UNIX_TIMESTAMP_SECS}; +pub use time::{nanos_to_duration, Time, MAX_UNIX_TIMESTAMP_NANOS}; mod any; mod errors; diff --git a/modules/types/src/time.rs b/modules/types/src/time.rs index f3ed27f7..fafa8b48 100644 --- a/modules/types/src/time.rs +++ b/modules/types/src/time.rs @@ -8,8 +8,9 @@ use ibc::timestamp::Timestamp; use serde::{Deserialize, Serialize}; use tendermint::Time as TmTime; -// 9999-12-31T23:59:59Z -pub const MAX_UNIX_TIMESTAMP_SECS: u64 = 253402300799; +// NOTE: This value is limited by "tendermint/time" crate +// i.e. 9999-12-31T23:59:59.999999999Z +pub const MAX_UNIX_TIMESTAMP_NANOS: u128 = 253_402_300_799_999_999_999; #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)] #[serde(transparent)] @@ -35,34 +36,33 @@ impl Time { } pub fn from_unix_timestamp_nanos(timestamp: u128) -> Result { - let ut = TmTime::from_unix_timestamp( - (timestamp / 1_000_000_000) as i64, - (timestamp % 1_000_000_000) as u32, - ) - .map_err(TimeError::tendermint)?; + let d = nanos_to_duration(timestamp)?; + let ut = TmTime::from_unix_timestamp(d.as_secs().try_into()?, d.subsec_nanos()) + .map_err(TimeError::tendermint)?; Ok(Time(ut)) } - pub fn from_unix_timestamp_secs(timestamp: u64) -> Result { - let ut = TmTime::from_unix_timestamp(timestamp as i64, 0).map_err(TimeError::tendermint)?; - Ok(Time(ut)) - } - - pub fn as_unix_timestamp_nanos(&self) -> u128 { + pub fn as_unix_timestamp_secs(&self) -> u64 { self.0 .duration_since(TmTime::unix_epoch()) .unwrap() - .as_nanos() + .as_secs() } - pub fn as_unix_timestamp_secs(&self) -> u64 { + pub fn as_unix_timestamp_nanos(&self) -> u128 { self.0 .duration_since(TmTime::unix_epoch()) .unwrap() - .as_secs() + .as_nanos() } } +pub fn nanos_to_duration(nanos: u128) -> Result { + let secs = (nanos / 1_000_000_000).try_into()?; + let nanos = (nanos % 1_000_000_000) as u32; + Ok(Duration::new(secs, nanos)) +} + impl Deref for Time { type Target = TmTime; fn deref(&self) -> &Self::Target { @@ -113,10 +113,29 @@ impl Sub for Time { #[cfg(test)] mod tests { use super::*; + use proptest::prelude::*; + + proptest! { + #[test] + fn test_time_from_unix_timestamp_nanos(timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS) { + let time = Time::from_unix_timestamp_nanos(timestamp); + assert!(time.is_ok()); + assert_eq!(time.unwrap().as_unix_timestamp_nanos(), timestamp); + } + + #[test] + fn test_time_from_unix_timestamp_nanos_overflow(timestamp in MAX_UNIX_TIMESTAMP_NANOS + 1..) { + assert!(Time::from_unix_timestamp_nanos(timestamp).is_err()); + assert!(nanos_to_duration(timestamp).is_err()); + } + } #[test] fn test_max_time() { - assert!(Time::from_unix_timestamp_secs(MAX_UNIX_TIMESTAMP_SECS).is_ok()); - assert!(Time::from_unix_timestamp_secs(MAX_UNIX_TIMESTAMP_SECS + 1).is_err()); + assert!(Time::from_unix_timestamp_nanos(MAX_UNIX_TIMESTAMP_NANOS).is_ok()); + assert!(Time::from_unix_timestamp_nanos(MAX_UNIX_TIMESTAMP_NANOS + 1).is_err()); + let max_time = Time::from_unix_timestamp_nanos(MAX_UNIX_TIMESTAMP_NANOS).unwrap(); + assert_eq!(max_time.as_unix_timestamp_nanos(), MAX_UNIX_TIMESTAMP_NANOS); + assert!((max_time + Duration::new(0, 1)).is_err()); } } From 4e9adcdb0bac60e2dc6fa406881cb2df34cc58b1 Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Sat, 19 Aug 2023 20:56:10 +0900 Subject: [PATCH 5/8] commitments: use From trait instead and improve commitment tests --- Cargo.lock | 1 - modules/commitments/Cargo.toml | 1 - modules/commitments/src/commitment.rs | 155 +++++++++------------- modules/commitments/src/context.rs | 7 - modules/commitments/src/state.rs | 20 ++- modules/lcp-client/src/consensus_state.rs | 2 +- 6 files changed, 72 insertions(+), 114 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7721ec2c..5ea04d43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -775,7 +775,6 @@ dependencies = [ "proptest", "prost", "prost-types", - "rand 0.8.5", "serde", "sha2 0.10.6", ] diff --git a/modules/commitments/Cargo.toml b/modules/commitments/Cargo.toml index d9bffe8a..dc3270c0 100644 --- a/modules/commitments/Cargo.toml +++ b/modules/commitments/Cargo.toml @@ -16,7 +16,6 @@ crypto = { path = "../crypto", default-features = false } [dev-dependencies] prost-types = { version = "0.11", default-features = false } -rand = { version = "0.8" } lcp-types = { path = "../types", default-features = false, features = ["std"] } proptest = "1.2.0" diff --git a/modules/commitments/src/commitment.rs b/modules/commitments/src/commitment.rs index bf83c1e6..7aeb0161 100644 --- a/modules/commitments/src/commitment.rs +++ b/modules/commitments/src/commitment.rs @@ -352,7 +352,7 @@ impl TryFrom for UpdateClientCommitment { type Error = Error; fn try_from(value: EthABIUpdateClientCommitment) -> Result { Ok(Self { - prev_state_id: bytes_to_bytes32(value.prev_state_id)?.map(StateID::from_bytes_array), + prev_state_id: bytes_to_bytes32(value.prev_state_id)?.map(StateID::from), new_state_id: value.new_state_id.as_slice().try_into()?, new_state: if value.new_state.is_empty() { None @@ -525,111 +525,82 @@ mod tests { use super::*; use crate::CommitmentProof; use crypto::Address; - use lcp_types::ClientId; + use lcp_types::MAX_UNIX_TIMESTAMP_NANOS; + use proptest::prelude::*; use prost_types::Any as ProtoAny; - use rand::{distributions::Uniform, thread_rng, Rng}; - const TENDERMINT_CLIENT_TYPE: &str = "07-tendermint"; - - #[test] - fn test_update_client_commitment_converter() { - for _ in 0..2_i32.pow(10) { - let c1 = gen_rand_update_client_commitment(); + fn height_from_tuple(tuple: (u64, u64)) -> Height { + Height::new(tuple.0, tuple.1) + } + + proptest! { + #[test] + fn pt_update_client_commitment( + prev_state_id in any::>().prop_map(|v| v.map(StateID::from)), + new_state_id in any::<[u8; 32]>().prop_map(StateID::from), + new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || t.as_ref().unwrap().0.len() > 0), + prev_height in any::>().prop_map(|v| v.map(height_from_tuple)), + new_height in any::<(u64, u64)>().prop_map(height_from_tuple), + timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, + proof_signer in any::<[u8; 20]>(), + proof_signature in any::<[u8; 65]>() + ) { + let c1 = UpdateClientCommitment { + prev_state_id, + new_state_id, + new_state: new_state.map(|(type_url, value)| { + ProtoAny { + type_url, + value, + }.try_into() + .unwrap() + }), + prev_height, + new_height, + timestamp: Time::from_unix_timestamp_nanos(timestamp).unwrap(), + context: Default::default(), + }; let v = c1.clone().ethabi_encode(); let c2 = UpdateClientCommitment::ethabi_decode(&v).unwrap(); assert_eq!(c1, c2); + + let p1 = CommitmentProof { + commitment_bytes: Commitment::from(c1).to_commitment_bytes(), + signer: Address(proof_signer), + signature: proof_signature.to_vec(), + }; + let p2 = CommitmentProof::ethabi_decode(&p1.clone().ethabi_encode()).unwrap(); + assert_eq!(p1, p2); } - } - #[test] - fn test_state_commitment_converter() { - for _ in 0..2_i32.pow(10) { - let c1 = gen_rand_state_commitment(); + #[test] + fn pt_state_commitment( + prefix in any::(), + path in any::(), + value in any::>(), + height in any::<(u64, u64)>().prop_map(height_from_tuple), + state_id in any::<[u8; 32]>().prop_map(StateID::from), + proof_signer in any::<[u8; 20]>(), + proof_signature in any::<[u8; 65]>() + ) { + let c1 = StateCommitment { + prefix, + path, + value, + height, + state_id, + }; let v = c1.clone().ethabi_encode(); let c2 = StateCommitment::ethabi_decode(&v).unwrap(); assert_eq!(c1, c2); - } - } - #[test] - fn test_commitment_proof_converter() { - for _ in 0..2_i32.pow(10) { - let c: Commitment = if thread_rng().gen::() { - gen_rand_update_client_commitment().into() - } else { - gen_rand_state_commitment().into() - }; let p1 = CommitmentProof { - commitment_bytes: c.clone().to_commitment_bytes(), - signer: Address::try_from(gen_rand_vec(20).as_slice()).unwrap(), - signature: gen_rand_vec(65), + commitment_bytes: Commitment::from(c1).to_commitment_bytes(), + signer: Address(proof_signer), + signature: proof_signature.to_vec(), }; - let v = p1.clone().ethabi_encode(); - let p2 = CommitmentProof::ethabi_decode(&v).unwrap(); + let p2 = CommitmentProof::ethabi_decode(&p1.clone().ethabi_encode()).unwrap(); assert_eq!(p1, p2); - assert_eq!(c, p2.commitment().unwrap()); - } - } - - fn gen_rand_update_client_commitment() -> UpdateClientCommitment { - UpdateClientCommitment { - prev_state_id: rand_or_none(gen_rand_state_id), - new_state_id: gen_rand_state_id(), - new_state: rand_or_none(|| -> Any { - ProtoAny { - type_url: "/".to_owned(), - value: gen_rand_vec(thread_rng().gen::() % 2_i32.pow(16) as usize), - } - .try_into() - .unwrap() - }), - prev_height: rand_or_none(gen_rand_height), - new_height: gen_rand_height(), - timestamp: Time::now(), - context: Default::default(), - } - } - - fn gen_rand_state_commitment() -> StateCommitment { - StateCommitment { - prefix: gen_rand_ascii_str().as_bytes().to_vec(), - path: format!( - "clients/{}/clientType", - ClientId::new(TENDERMINT_CLIENT_TYPE, thread_rng().gen()).unwrap() - ), - value: rand_or_none(|| gen_rand_vec(32).as_slice().try_into().unwrap()), - height: gen_rand_height(), - state_id: gen_rand_state_id(), - } - } - - fn gen_rand_vec(size: usize) -> Vec { - let mut rng = thread_rng(); - let range = Uniform::new_inclusive(0, u8::MAX); - let vals: Vec = (0..size).map(|_| rng.sample(range)).collect(); - vals - } - - fn gen_rand_state_id() -> StateID { - gen_rand_vec(32).as_slice().try_into().unwrap() - } - - fn gen_rand_height() -> Height { - Height::new(thread_rng().gen(), thread_rng().gen()) - } - - fn gen_rand_ascii_str() -> String { - let mut rng = thread_rng(); - let range = Uniform::new_inclusive(0x20u8, 0x7Eu8); - let vals = (0..rng.gen::()).map(|_| rng.sample(range)).collect(); - String::from_utf8(vals).unwrap() - } - - fn rand_or_none T>(func: F) -> Option { - if thread_rng().gen_bool(0.5) { - Some(func()) - } else { - None } } } diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs index 0925abd2..d72b2e6e 100644 --- a/modules/commitments/src/context.rs +++ b/modules/commitments/src/context.rs @@ -401,11 +401,4 @@ mod tests { CommitmentContext::parse_context_type_from_header(&header).unwrap() ); } - - #[test] - fn test_eth_abi_encoding() { - use ethabi::Token; - let v = ethabi::encode(&[Token::FixedBytes([0u8; 32].to_vec())]); - assert_eq!(v.len(), 32); - } } diff --git a/modules/commitments/src/state.rs b/modules/commitments/src/state.rs index 4eebf387..08e0b3b9 100644 --- a/modules/commitments/src/state.rs +++ b/modules/commitments/src/state.rs @@ -13,17 +13,9 @@ pub const STATE_ID_SIZE: usize = 32; pub struct StateID([u8; STATE_ID_SIZE]); impl StateID { - pub fn from_bytes_array(bytes: [u8; STATE_ID_SIZE]) -> Self { - StateID(bytes) - } - pub fn to_vec(&self) -> Vec { self.0.to_vec() } - - pub fn is_zero(&self) -> bool { - self == &StateID::default() - } } impl Display for StateID { @@ -32,6 +24,12 @@ impl Display for StateID { } } +impl From<[u8; STATE_ID_SIZE]> for StateID { + fn from(value: [u8; STATE_ID_SIZE]) -> Self { + Self(value) + } +} + impl TryFrom<&[u8]> for StateID { type Error = Error; @@ -41,12 +39,10 @@ impl TryFrom<&[u8]> for StateID { } let mut bz: [u8; STATE_ID_SIZE] = Default::default(); bz.copy_from_slice(value); - Ok(Self::from_bytes_array(bz)) + Ok(Self(bz)) } } -// TODO define owned error types - pub fn gen_state_id_from_any( any_client_state: &Any, any_consensus_state: &Any, @@ -64,5 +60,5 @@ pub fn gen_state_id_from_bytes(bz: &[u8]) -> Result { let mut result: [u8; STATE_ID_SIZE] = Default::default(); let h = sha2::Sha256::digest(bz).to_vec(); result.copy_from_slice(&h); - Ok(StateID::from_bytes_array(result)) + Ok(StateID(result)) } diff --git a/modules/lcp-client/src/consensus_state.rs b/modules/lcp-client/src/consensus_state.rs index 1833a79a..ef609394 100644 --- a/modules/lcp-client/src/consensus_state.rs +++ b/modules/lcp-client/src/consensus_state.rs @@ -18,7 +18,7 @@ pub struct ConsensusState { impl ConsensusState { pub fn is_empty(&self) -> bool { - self.state_id.is_zero() + self.state_id == Default::default() && self.timestamp.as_unix_timestamp_nanos() == 0 } } From 7f65d897289fbcba624b25d7781c76cb765e6fb2 Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Sat, 19 Aug 2023 21:11:33 +0900 Subject: [PATCH 6/8] commitments: avoid to use confusion name and improve test for trusting period context Signed-off-by: Jun Kimura --- Cargo.lock | 1 + go/light-clients/lcp/types/commitment.go | 34 +-- go/light-clients/lcp/types/commitment_test.go | 257 ++++++++++++++---- modules/commitments/Cargo.toml | 1 + modules/commitments/src/commitment.rs | 72 ++++- modules/commitments/src/context.rs | 207 +++++++++++--- modules/commitments/src/lib.rs | 2 +- modules/mock-lc/src/client.rs | 4 +- modules/tendermint-lc/src/client.rs | 8 +- 9 files changed, 462 insertions(+), 124 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5ea04d43..a3bf422b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -777,6 +777,7 @@ dependencies = [ "prost-types", "serde", "sha2 0.10.6", + "time", ] [[package]] diff --git a/go/light-clients/lcp/types/commitment.go b/go/light-clients/lcp/types/commitment.go index c711ca6b..ed5addbf 100644 --- a/go/light-clients/lcp/types/commitment.go +++ b/go/light-clients/lcp/types/commitment.go @@ -19,8 +19,8 @@ const ( ) const ( - LCPCommitmentContextTypeNone = 0 - LCPCommitmentContextTypeWithinTrustingPeriod = 1 + LCPCommitmentContextTypeEmpty = 0 + LCPCommitmentContextTypeTrustingPeriod = 1 ) var ( @@ -56,7 +56,7 @@ var ( {Name: "context_bytes", Type: "bytes"}, }) - withinTrustingPeriodContextABI, _ = abi.NewType("tuple", "struct WithinTrustingPeriodCommitmentContext", []abi.ArgumentMarshaling{ + trustingPeriodContextABI, _ = abi.NewType("tuple", "struct TrustingPeriodCommitmentContext", []abi.ArgumentMarshaling{ {Name: "params", Type: "bytes32"}, {Name: "timestamps", Type: "bytes32"}, }) @@ -103,15 +103,15 @@ func (NoneCommitmentContext) Validate(time.Time) error { return nil } -// WithinTrustingPeriodCommitmentContext is the commitment context for a commitment that requires the current time to be within the trusting period. -type WithinTrustingPeriodCommitmentContext struct { +// TrustingPeriodCommitmentContext is the commitment context for a commitment that requires the current time to be within the trusting period. +type TrustingPeriodCommitmentContext struct { TrustingPeriod big.Int ClockDrift big.Int UntrustedHeaderTimestamp time.Time TrustedStateTimestamp time.Time } -func DecodeWithinTrustingPeriodCommitmentContext(params, timestamps [32]byte) *WithinTrustingPeriodCommitmentContext { +func DecodeTrustingPeriodCommitmentContext(params, timestamps [32]byte) *TrustingPeriodCommitmentContext { // MSB first // 0-15: trusting_period // 16-31: clock_drift @@ -120,7 +120,7 @@ func DecodeWithinTrustingPeriodCommitmentContext(params, timestamps [32]byte) *W // 0-15: untrusted_header_timestamp // 16-31: trusted_state_timestamp - return &WithinTrustingPeriodCommitmentContext{ + return &TrustingPeriodCommitmentContext{ TrustingPeriod: trustingPeriod, ClockDrift: clockDrift, UntrustedHeaderTimestamp: timestampNanosBytesToTime(timestamps[:16]), @@ -153,7 +153,7 @@ func timestampNanosBytesToTime(bz []byte) time.Time { return time.Unix(secs.Int64(), nanos.Int64()) } -var _ CommitmentContext = WithinTrustingPeriodCommitmentContext{} +var _ CommitmentContext = TrustingPeriodCommitmentContext{} func timeToBigInt(t time.Time) big.Int { var ( @@ -167,7 +167,7 @@ func timeToBigInt(t time.Time) big.Int { return secs } -func (c WithinTrustingPeriodCommitmentContext) Validate(now time.Time) error { +func (c TrustingPeriodCommitmentContext) Validate(now time.Time) error { currentTimestamp := timeToBigInt(now) trustedStateTimestamp := timeToBigInt(c.TrustedStateTimestamp) untrustedHeaderTimestamp := timeToBigInt(c.UntrustedHeaderTimestamp) @@ -345,24 +345,24 @@ func EthABIDecodeCommitmentContext(bz []byte) (CommitmentContext, error) { // 2-31: reserved contextType := binary.BigEndian.Uint16(p.Header[:2]) switch contextType { - case LCPCommitmentContextTypeNone: + case LCPCommitmentContextTypeEmpty: if len(p.ContextBytes) != 0 { - return nil, fmt.Errorf("unexpected context bytes for none commitment context: %X", p.ContextBytes) + return nil, fmt.Errorf("unexpected context bytes for empty commitment context: %X", p.ContextBytes) } return &NoneCommitmentContext{}, nil - case LCPCommitmentContextTypeWithinTrustingPeriod: - return EthABIDecodeWithinTrustingPeriodCommitmentContext(p.ContextBytes) + case LCPCommitmentContextTypeTrustingPeriod: + return EthABIDecodeTrustingPeriodCommitmentContext(p.ContextBytes) default: return nil, fmt.Errorf("unexpected commitment context type: %v", contextType) } } -func EthABIDecodeWithinTrustingPeriodCommitmentContext(bz []byte) (*WithinTrustingPeriodCommitmentContext, error) { +func EthABIDecodeTrustingPeriodCommitmentContext(bz []byte) (*TrustingPeriodCommitmentContext, error) { if len(bz) != 64 { - return nil, fmt.Errorf("unexpected length of within trusting period commitment context: %d", len(bz)) + return nil, fmt.Errorf("unexpected length of trusting period commitment context: %d", len(bz)) } unpacker := abi.Arguments{ - {Type: withinTrustingPeriodContextABI}, + {Type: trustingPeriodContextABI}, } v, err := unpacker.Unpack(bz) if err != nil { @@ -372,7 +372,7 @@ func EthABIDecodeWithinTrustingPeriodCommitmentContext(bz []byte) (*WithinTrusti Params [32]byte `json:"params"` Timestamps [32]byte `json:"timestamps"` }) - return DecodeWithinTrustingPeriodCommitmentContext(p.Params, p.Timestamps), nil + return DecodeTrustingPeriodCommitmentContext(p.Params, p.Timestamps), nil } func EthABIDecodeStateCommitment(bz []byte) (*StateCommitment, error) { diff --git a/go/light-clients/lcp/types/commitment_test.go b/go/light-clients/lcp/types/commitment_test.go index 3ddc50b4..11693975 100644 --- a/go/light-clients/lcp/types/commitment_test.go +++ b/go/light-clients/lcp/types/commitment_test.go @@ -7,32 +7,7 @@ import ( ) func TestStateCommitmentABI(t *testing.T) { - var cases = []struct { - input string - }{ - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e0e56e24eeacfd4a933dad44b2ed1f5f7a91dbe9000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001003c9ee6552447aaccb8ca1e106cef4847f6cc11a17ace9b986012f34ca4effb9a0000000000000000000000000000000000000000000000004660ddc755812cf1000000000000000000000000000000000000000000000000e6fa7dda4eb607bd8bbc8d7df90540b1700ef78e356327dd5fcde5c6caf08dee99601627ec4767b0000000000000000000000000000000000000000000000000000000000000000375732b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31323139393431353630303536383530343236312f636c69656e745479706500000000000000000000000000000000000000000000000000000000000000000000000000000000000041b816814f4d805c19066e7116206fe174bc83e7eb455f285b5e1da8fcda1e2613b1dd1f9d74778dc6434096502313d9d037338c486856e0f10fe5e8241eafe933a200000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000079c1fd333487352a464972d185cded0f80e324ef000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000388efa223dbfdf1400000000000000000000000000000000000000000000000044e7fe3640641bcad5e8480a2c8cb0c9d153d705e98ad526fe8f961fe6bf3bc849c96a3eaf5e6d65000000000000000000000000000000000000000000000000000000000000000371554b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033636c69656e74732f30372d74656e6465726d696e742d3938363034323833353335353637373130382f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000419af41c61767efa6a5a038d1df6121aa04b1b7901f7c068ce41e43eb9e79c09bc65142c92a0a3842b85c233a4d68c7acf300a49e3ba182f3679569b27e3835bd65600000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d14e0a608a9143ff39be288ee14e7526ad50bc37000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001004f0ae4e2f428d4454dae58032ff9081232ee6a918464c3f3d5f08b5e9be75c80000000000000000000000000000000000000000000000000574444f8873661cd0000000000000000000000000000000000000000000000000cc979be9b5eb6bde39053d221ebf3c792369d6031daf4ec8d23a2ef36bc9ee00c0fd45fad4b894e00000000000000000000000000000000000000000000000000000000000000032a367100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31363832313530313933313737383036303938382f636c69656e7454797065000000000000000000000000000000000000000000000000000000000000000000000000000000000000410e76e59dc88e23a247e74094f1dc7a462ab899bb62ec5c2ec0432522b42101082897aaa889a3f7d95c83faefab5f29c60736087680e585375c8022948ffec0028d00000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fd6e1d33c750cdc92476a46d1924ae8c9bdcd894000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001004969df7c5f76f1cf6f1826a9432c5cf340ac3cd346746f0610b8cf1c8dbf0aec000000000000000000000000000000000000000000000000c14830c75d3a121d0000000000000000000000000000000000000000000000003987153ab2df8bded0ea9139b95c74c488f8d21e355d17198fc35f20594de8a524fd7a5a8374f4a6000000000000000000000000000000000000000000000000000000000000000321526a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d323335333139353231303039353635363631372f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e9dfaedffa94310dc89762abb2174a97f8aac766426736df1266f84308aab57c179cf1e87087a12995009e27eeb292977829fdf4e800c821f2264fe6cd500ccdc000000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000463a0295ae26239f1469b10153d6c40f5816a67b000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000eeafc311f7f06c12c524b053ddc1709ec631f120d89e6064fa9232ed4eb7798000000000000000000000000000000000000000000000000ea336948b1fb57f400000000000000000000000000000000000000000000000037c5b21cab475287aefcfd05361996dfbbc7ce757dde782f605dcc94ec42f454ba28de97596f4db7000000000000000000000000000000000000000000000000000000000000000377724600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31323139373931333637343932373930373030332f636c69656e7454797065000000000000000000000000000000000000000000000000000000000000000000000000000000000000410fd5c8a6891724463cffdb820a444901a3563afb81e79f4a49233b5f9465031a28c2507cf5d3bff92ae4fac19bfcfc52836e83a87119ad286dbf47df288d111a1300000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ace88a0669657afa01885ba51e4e27e00a79169a000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009bde15723b5ee8e1000000000000000000000000000000000000000000000000a2c625bd561a7df5483029dd9aa96766070314c6bfc157a86ea8f5ef4b2828e642d72adba3673cfc0000000000000000000000000000000000000000000000000000000000000003304b6500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d373235323436313336373938313137373931312f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041aa9ec0c6db6f7a258a35124b540c845d9bbad16399d87902b0d496fc75df8733532752a96f6bbb195df189da510bf661d8fc074fc7e7ad3a415db3d80541ec8f1000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000094f00d78c68fbdcbdd4d2f6842375e4f873c247b000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000798b47078bca4bcc00000000000000000000000000000000000000000000000045f313b40213c6030cae16aa7e04377bc40e479651719f9d8a4a8b068763d94f743941d8b5b7a6020000000000000000000000000000000000000000000000000000000000000003386b6800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d373233373632383033383631343737323635382f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041182a28f8d880e7e388233e9692bc0d4d6e61a6e08c6e143fad1b837bed7e29b75303fdeb31c52c284be8f2ca6a12daec098fcf15d256811145dc34766d96e1c9f800000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003f1bf8b047fad5222312ed4df89f276a9b145209000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001001b1880d32af3f70f6239c1d660472e42c254a40c4298d68f5b8eda4c50a247b9000000000000000000000000000000000000000000000000a42d2f413072345c000000000000000000000000000000000000000000000000a18b79bc897e75381822bd3e6958a717034ab006e951ba299cf2fa72bde3cbda17da2a066abb9b7e000000000000000000000000000000000000000000000000000000000000000344516300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d343639383132353038313136393530353638382f636c69656e7454797065000000000000000000000000000000000000000000000000000000000000000000000000000000000000004102056646df925f2246b2643f4a8f19f590f8703407aca9445414c9978211ecfaf91991a81286fde884251e17bfdce15655ceff7510b8186599c0394ec23eac5a6500000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ef70835dd4e7a20563551484a3f58a7eed2688f8000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001003514f6094942fd50dd8a94c612b11e196f064ffaee37262a8f645ffa27570536000000000000000000000000000000000000000000000000914ef1ac146e155a00000000000000000000000000000000000000000000000005aec2fe9a5348eb315ed86cb91c03ed2c948645727fa941a31cad612932e24aabc8326b110992b700000000000000000000000000000000000000000000000000000000000000032e5e5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d343330333130343531353936343036373939322f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f1ac4b0621dc7df0a491b0f906d0038d7bb988cba54811a5a85387e703393d3dca26d24be5bb3fcf00d8c68096367e4f831bdeeb05f0a3fc88178bfff98ac16a4600000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a055f1710d23715ebf10c917f1f5a44ef3bb5f14000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095021d3683b33cb400000000000000000000000000000000000000000000000050bb1550f157660e0c4e7cfe811e5bafcea26783a364649786a76981614f80bd545e559e4092cff70000000000000000000000000000000000000000000000000000000000000003256f4500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31363131343735393938373333343333393531322f636c69656e745479706500000000000000000000000000000000000000000000000000000000000000000000000000000000000041b9932df75803830309835803fdbe115663b17aefa4b9bb35d7968f093d8087b4a644b11697b08b8b5ba87fb767ad2ac283edffcaeac239b946db84588672d1688600000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ea2413b49c4a0bc09daedcb3a508997de654ea46000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001009161e012ea1cf79b87ed7c9487d2518b0626997f8ed3244f61e5b635afb27da000000000000000000000000000000000000000000000000072bfe9ee156bfd4e0000000000000000000000000000000000000000000000003876b519dece21a286c896643f0c349c70b51a86c845b83254c90aa4eda8ad917257d2a31f2f581e0000000000000000000000000000000000000000000000000000000000000003727e6700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31343638343530373539323534363230303039302f636c69656e745479706500000000000000000000000000000000000000000000000000000000000000000000000000000000000041ee1cc86c890fbf6cb142b0e521aa9977709e04a01a1101eb301bacb9861fcf6b435af1589e71b3db94ceb8e7ec6e939aa3ec69227494419bc2680a5a2113d154dd00000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b11f8b4df2a0663c2f62667fd519971498f74b85000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f40a9fd6926ada0000000000000000000000000000000000000000000000000d1f49c4cbabb759a2dfd2a5dc9ab1e777fce5661b1a882659aa22970710bd5dfc2525599b60789300000000000000000000000000000000000000000000000000000000000000035d362800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31303238373031353830323234343736323937302f636c69656e7454797065000000000000000000000000000000000000000000000000000000000000000000000000000000000000417b7bd4f0cdcb260c97d94cee127921c8216a9c2f776a7ac47680ad511745a9c7e115b2cbb677cb436e456298ce1861da5ae4d7a9b16c53dedc5cbd1f093334eaf400000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005ca21100592b582b6d3b7c302fa788c6ee88ba85000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010024f391f0bb5f3341ec2a5fe12ee47abc27edadb8e4b359ecf9542dc4a3a1223900000000000000000000000000000000000000000000000075a1ddded1de54f5000000000000000000000000000000000000000000000000d62ccbbcb3515f39b1d8a167afa72293a029298b91055e3b8ab648971e3ac23fe2522f74f460426b000000000000000000000000000000000000000000000000000000000000000362795400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d393335303131383435373734313636393137352f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f072ff73e076baf42934bf8430614ecc7df507ef7a8aed7e9c77740a262e25a1e4864136bc1ee7660086e2df8f3ebcd2db09422d3dc88d9c9478a4227fc62a365600000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000c94606cb71c0ed14c2a67d72f6da9a4dd851b91000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d479e37d35b941be0000000000000000000000000000000000000000000000008ea3f809a62ab3f8908096a275043052f9aa26a1fe867eaeb63faabac12cb03e787a5148238bb7ea000000000000000000000000000000000000000000000000000000000000000326376300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d313739313733363137373337373633363835392f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e4adb7b473fb4a658ae44281183db22195113a45a5d1d23d4d430332acb358f63ae62500c1126e1539b66b68c985fb27838dd14c8296973cb6a8558f28059398a600000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000068ef6189913bb51c61b5658a49254a570f8cb7e6000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001002b74ce38ec93c98bf92ef2a95ae2733a73ab3fe1a78e439066aed15853cf9b9e000000000000000000000000000000000000000000000000ee03b6386d87be2900000000000000000000000000000000000000000000000026187e4cc674765fc0b2085110877cc1c4ec428fac37b5a5ab128261f1fb61bbe4764ba82440f86c000000000000000000000000000000000000000000000000000000000000000335596800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d383331343137313430363236373936313739332f636c69656e7454797065000000000000000000000000000000000000000000000000000000000000000000000000000000000000004156839a30331537c6afd2d466bede065a6b0dc4d013e9b2c53a9b8bcdd53d0950c7a71bde29221169a0e7e2023cca9d969aea738d99d77d52cd542fe6c66bf415b400000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e43e926bfafbeb7c354c6b789e54e41f3d84e05c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fdd11e959e48393a0000000000000000000000000000000000000000000000001ff295ca26c012bb4b31e5e0e0d5fbbfe588fbc81ce3acab7dd004419f113f0c93554df93318b7da000000000000000000000000000000000000000000000000000000000000000324382d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d373831383138303938393130343038323938312f636c69656e745479706500000000000000000000000000000000000000000000000000000000000000000000000000000000000000414bd57dbfda2e11cfcdc462731c72d3220d4ab0c0386f066f3bcafe03fa18171c78297f881dc77f261d993a7bcd657cbd08699ebb898a659a867439be49fbead25700000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001e57ac20c9fe57866fe236bad6a7a4e2b45d61dd000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fcf7a499332c5ea800000000000000000000000000000000000000000000000042c943535f5098d6a2629ada19af6992746efdbdc8c8c605b7f3addaa0522b8910918d7a769e55fe000000000000000000000000000000000000000000000000000000000000000321755100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d353833333631333037353434353339303838322f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b83cfa08b1a6ca096f2d43298c4851787f6a38e97f3e485e19520d206d44934415699135a83f5dc9c073f6b73a8bed5d35cf863f8e3e3e25f471efbe77cae306b200000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000084465dff0399013db0c5d7561a97465f919a9936000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003156c420a1afe095000000000000000000000000000000000000000000000000e6805d9de940fa0c05624299077aaf1cd0c7769090f74a64cb0f7e076562ba1edf08809841df56d8000000000000000000000000000000000000000000000000000000000000000339396600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034636c69656e74732f30372d74656e6465726d696e742d343532363730333833393833323931383636332f636c69656e7454797065000000000000000000000000000000000000000000000000000000000000000000000000000000000000004123f23375fbf35c5e90ba27b3e47885589185813cb266f8fa9cc2c59c13f18d702c22598f78ce64e27df4675caf8a2870686fc77eb5fe46f26ff64df537c4fb8cb000000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c243f1c57900875ff0801174cdc9750fdfa14e78000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a7feb96a17d92f9b0000000000000000000000000000000000000000000000003f074f51a3196776b49ecd0f9db8c06cbc93fa52a885892ae657be68242f7798553a1e41003cd1a000000000000000000000000000000000000000000000000000000000000000033f4a5c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31303431353232343935303736313839383839392f636c69656e745479706500000000000000000000000000000000000000000000000000000000000000000000000000000000000041d8864892c974808050dd133a6fd9c934d2dcb5d3035ea1515ba2b5521037a18472d90f4cb929d09fd5bd58061aef3cf48254893ec24d7fa6b13f480287df1b63f600000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d40eac82adb0613f5faec5a9af6400ed6f4271ed000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070eb187e248dc27a000000000000000000000000000000000000000000000000af1b49d8977c9d6b0f90cb6b80e5d0e89d68599299582eb13d2a5f70101207d7a63dbbdcbcb13e4f000000000000000000000000000000000000000000000000000000000000000332504d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035636c69656e74732f30372d74656e6465726d696e742d31373039303631353834353637303533303839352f636c69656e74547970650000000000000000000000000000000000000000000000000000000000000000000000000000000000004102e1b4bd6c8f71dbf0047cfd0beb65f6c1306cd57f16a10be1540fd2c4c0321b578d3299ca15a3d8aac7d7efda23ad1421e69cbf1419e5a838cf825b8579cc205c00000000000000000000000000000000000000000000000000000000000000"}, - } - - for _, tc := range cases { + for _, tc := range testStateCommitmentABICases { bz, err := hex.DecodeString(tc.input) if err != nil { t.Fatal(err) @@ -60,31 +35,7 @@ func TestStateCommitmentABI(t *testing.T) { } func TestUpdateClientCommitmentABI(t *testing.T) { - var cases = []struct { - input string - }{ - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001d36bd01065db33291876e2865c16f3f8df30ad00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020561d6c240f28f2afa349d0bd22ea2b311bebb356ee56aee21d57615787ed2f119eeb47d0553bddcaa4953cf76b150b7961d180cbe9a91c434a2074d97f36e25000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000008277a9af43d5ab2f00000000000000000000000000000000000000000000000078bb7f59ca14003f0000000000000000000000000000000000000000000000006da337b3e9269a2c00000000000000000000000000000000000000000000000010eef412c2745d410000000000000000000000000000000000000000000000001777825ca424c08a00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000530a012f124e4c794f7bae2eb376fe7c3cb774c4eb1832d37b929a83a25b6cc69987649ccf1f1b4c61647492e5c2b9e40a7d75c9ce14cfe884a0c80f0311ce414108d9a62aa4a604e570fbac5b6a0d98e0c2aafb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004112b38181a05284099e8c2c21ac476f8f296a5c5616379be21ed03dc390b88e78d4e02af4b56f06f072d2b3b1ace06567188db814e83ddb68d370ca0c7884b5200d00000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d2f19b45ed1ab4e56eaa7d7d301df78bb6770b5400000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020a319591feeae256ba07d58a183f566f75bf837b29ec6aff66ea73d2add5280ffc8c2457398b49a28a28342cb191e74cad074706718d4777d900f81d4ef317b8a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000d5b5cf7b622b2679000000000000000000000000000000000000000000000000f22f880e441071c6000000000000000000000000000000000000000000000000a941e56e98a953130000000000000000000000000000000000000000000000001fc9c6e0a70440150000000000000000000000000000000000000000000000001777825ca4257795000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410fe4995deea8ed57d69d120f94beff1ac8ad520471c7781c06279ab80926f6d448187fec7a5d0d17a9c39d12634d73530fe4895372ad2a8df988f361fef4b9d81300000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000070439f91b71fc9887f90be23cb7731d157265e0f00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002084f72c558f8cb9938a54014877116f48a6731ed29273a3138254b572e0334d1153b557d27459676fdab8b5a2c3ed31d8a0a1cbe957d8e404939b23d8e83578460000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d81e383e587349d000000000000000000000000000000000000000000000000838f7af521732f750000000000000000000000000000000000000000000000001777825ca425bc1c000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414159d672d77a61a696c47b8af6c2078f913ff3fe427aa7eb665b605d468a1c76ba69e6c842435f1cb13a7cff7013bb806d5c53ef8ee5129b730a86dbd12afae10200000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a8aeaecd25d85a8849860db25d8f4a4ebcc4774f00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020d1ee8979f331b085adac8c057e156a4b95265c1503f78538b3ab36adb216d16ccf12c081c286e15a6db38e314683938407e200198cf26e68676886012e5354520000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c7c39aa490e228e00000000000000000000000000000000000000000000000071e608ead8388e780000000000000000000000000000000000000000000000001777825ca42a0ce400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ed83bb6e03cb05f4aa15652752e6429efc057f9a56fa8d9233b4f1b48aeb67546328dbb155263d5a0d0c9cd26b301ab5c614ec189a960124cada833f930062b05200000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000752c1559bdabadde285a17289ed454b19ab4d2b800000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002073d744620f78f4a5d189181e1681e9389b564e96911990e1f071aaa56d0b7568275d6c509078f1e7655d1a74100dae2b289c37650efcc7b41cfe81ea2467206a000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000043fad6890bddfd41000000000000000000000000000000000000000000000000b6b142e50e52860f000000000000000000000000000000000000000000000000c4a73c9d6782290c000000000000000000000000000000000000000000000000d51dc3dbf46f05c40000000000000000000000000000000000000000000000001777825ca42a81a3000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000417d30a6cc5261cb10cf32e8db9d02f03fbc780d1b983f3c74c274a8f34f3ed00f72b1d3971ab968cff90af42d9c3ab3eca8f15357201fed4412971d99b434a96a9100000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000cace0cfb8fb082ec3b83a8ac2459afad79383b9900000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000c0ab4c73cd29892f811fbcd65ec556f3538d29c1d0f382528d01aaca9dfed7c900000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045ca8ec35397b4e10000000000000000000000000000000000000000000000001ada7549506f6ac90000000000000000000000000000000000000000000000001777825ca42ababe000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418bce2e7675d9700adf0d5a1ee0c7a3aa0c321fd8b8877933b429ac65168c66ab739ef582e6a39c54abe87fc0a8d36f9cd504b44eab521dc8ed5e69aa87bc1657af00000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001d13065db440dfa33a48fd359f0af0f1a2c4fd5700000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020543e5331972693fddad67fff9fa3be8558835d5b6b0333cd2c90e58e354c6b7f0eaa3492216bda65f222ee6c036974bbc0b7519cf9daced536c48c533b781c2f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000ba263238d924c71500000000000000000000000000000000000000000000000025750287373d7582000000000000000000000000000000000000000000000000c498d8e40ad91f18000000000000000000000000000000000000000000000000cdf23427520a6bd00000000000000000000000000000000000000000000000001777825ca42b1e6d00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041258ddb5eb80830e64e9cd3fe32f79b44ce7d9cea9d564c458784bc91933d02d5bf9d06bc24df356baa4fc8dc20abd493dd69a9f70054073912317f2b53d57b174200000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000007121fbbc671963399f95f0a2c2ff29f0f3a0784200000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020974ff089a56e73198f8e63ebe41a507c1e90bd3aebceeac83f64981ef8eb5955863d6ce62ef65cd57ca1c8b45735cded7fe1da12d13bc31c3c0970da23aacfe70000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007ca6c4a1146a2717000000000000000000000000000000000000000000000000de9f8c47d41cefc30000000000000000000000000000000000000000000000001777825ca42b5e3100000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041211b65f5acf059c15c53ed8c81451b509078bd262a888020a31429c3464652dd6f19fb9a85c7f9ee48edddace077728888ea03ebc42844e8abe5468403e31d3b7900000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000062ab9a227163630b76ec51d1c3d977fa0de8fe7400000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020bf41839f60e612a7a42d22452bb0df39e90396e65518d5b1490685ba1548decb0a7379f61766bd9bf2c46e333951af414c7d64523d9101fa33baad2f8f36c60100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000003e90f5c4e7c02b420000000000000000000000000000000000000000000000005b48bd7e4f7f8ed0000000000000000000000000000000000000000000000000f186ee420642df4b00000000000000000000000000000000000000000000000054481d61de549b410000000000000000000000000000000000000000000000001777825ca42ba31900000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d243085d709fb10beb13a0e6352a35aa15fb02b1c3cd026a7888780dfc2176202fff01bf06f9b1aa8a167cc235f41b20d8bfd0088329b51f23292fc5e4c147c3e100000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bc666848ab21db81504dae20fdbb6f7359a459b700000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000000202cb57cc45ba8d74a2e6865bc54993036611aecf5561da697012f18b087fa5ae2e1a535f10251e69df28777637404ebfbaccef79bc98aa06f730fd6497706c6ff00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000079b12f8259cd30a5000000000000000000000000000000000000000000000000aeccbc7ee1304bf10000000000000000000000000000000000000000000000001777825ca42bef51000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000002fc0a012f12f605bdb6cac636c2d5bb3f5189941b74dce8563a85e8dee186ffda71c2746be61b951c1b2fbccbd8675e16f8eb017cf49b22ea58547a3ac5c4ecbc8104811c747e7a16438d93164350bd98faea91d974129363422641a8c27d0b234952120c71c619fb1a56188434a2d3c54c8f452245934c9547f0d4382af2a0519ea6bddd24e9e2841995e725b9bf3f23ad1be526584a45857ced342ba0e9b1dfd0b9f7b353a98cdc37895ce8592d2631456b8dc14f573e0efca19cad2a716e3e81e9c9acdc453beae3266dbfee54e755e836ea636d064b433948a866b71f7bc763e9867086d34630a728ec3cdd38e2f00f04196822ea9a7443f024d92af95e8cfda3c61543efc1ba142f054d2160b4e5be7290e30577e60993ff13955f60dc929315dad246c8a10169b3ebd1a8980c35bee892aa578328c01cde7c33f5efc63574044e05ae6cd910be7dfa7dbc282a20ae0b7f97384b8c04b769d902117dd2195de0ac26fda2ce32389ddba1d1bfdd9694716682a9ef70382f5370f59c416422e19c118a99d67ddb62ddbe2a8650731e7415c95026330d4225ae78c47e78560c169518cab21a4aa9eba60ad04c824b1a45f0d38534ce16d088b414d6775a365d640f363dcb2b173b7adfd26745e493254e0471eeb475d993de46f97076cacdfbec49bb116cc2af4e6a80e7af3b637d714c8be0fa0866166768745fbbb1a81b47976ae258833280524d32900505ee2559fcbd0baf861419ab93fce2c6034e8082b33523d2d71845cbe20fe12b28ab0993d598ae1d7c281daf41c71c5900917c61ed6a3d5fe061cfc6debc65e8320cbf3fae92fc63da45a0451f1b831baa4a95fbadc3333436b4bb74bfedb673fc5a706da4aff8fb5e21174dbff29f34f6cb9da75d03bda44405334945e5d0d5e95087f35eb80d47a13c68ffe6593edc768d6f074e2ff0efd77e2e4b28dad46375badd3ae760e8270ac9a02cd2fa2a575e29b7cdd12bc240938a84620902cf9b54a6bcfcb00c15ad5c7235dcbd434538c04da884eab8717e0c9bdb150dc53dcf4482a4f6491b10d1dea620cbdc95854918000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410ebf569bc79080fee46283be4787fb6f778b254c09a35cb7a42a04c3feed81af6292712d8c2b6d00e1da801cfc044716e30d75338e97b724e3ec7d0fa04172166400000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d22b63dbe152ba43cc568b47327473da8748eae500000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000203e83bbec897a650f364d527b6e429c3d2838973bdee890cbf4beac9d59e45fd93d0283bf2c5a1134df14337f8e43db7627a14f0873cbf927a4c38074f532afa6000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000081456e6d1c9121ae000000000000000000000000000000000000000000000000faa411b27e4e07140000000000000000000000000000000000000000000000004bf94c8de60adabd0000000000000000000000000000000000000000000000000e900e24ea4e35960000000000000000000000000000000000000000000000001777825ca433d7aa000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001080a012f128202d6a80f4a8c9f2420c6360c0f92f2d69a16f2ec8ee998ae5771e6b4e76fe13b116db48d153a6d0d00dc3ae7bf20e19d04467f0fb78510c5f4456b56143a44eeb532202a56090c8ff5d33126beeb9c0a622ab7c8e37834fdf3dcc36ab06c764ff183d60d498f72cd0b0d3ae6584598385e63cdcb63406939c756fe4965b8a0d9689aeb15e188e96294d36b9e31e308b8fb4e8dfcf46f63648df233c265cfdef17c436bde1f892ce0dd38f20c1ae3ac31dd8bf7ecca9fdb89db2bc2666a211a77287eb71613147148a9ded65e929d4ff90736ccdd9696604453704ce8f312dba2fb4795aa6466d2c267d1c93f78b68b5095342126d355611b8ebb3e99a7d42f30e62990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041bb5f983f9283a25f11cc315f194c81ae7a83c1b640a0febbb2ffd6144d6d07cc7b402654cf7d13605bbdbcffccb82391a5116d9073d221e1604d39946554dd893300000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000046f6a335d8c4efd2aa7dc882db20714d5283102100000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020a891423043e34de5f6d6639717d2b39a3bcf2532bb54ef70893f3d0e56f8e75d53110124ad66c86e1067c2c40ec2d7a0cba25046f17a9e5386a852fa823120f5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f48f4b9efbde36290000000000000000000000000000000000000000000000001c206e29711d132e0000000000000000000000000000000000000000000000001777825ca4343adb00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d1ee050db99cf375eab97e1aef4ea31c3418aaa5fabbad88e7022c15abb73758529fbf278adf9b62ca52fc0ff709e2c25502d175a408ae2097175d2abf844c1dfe00000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f678467efcef8a6ae85e2b8ebcb2fe6878cb31fd00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000c0f3cf12f24df6afaac226f0920b84d6317aba3818caaf77d9512cd4a89b4b850000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000dd5df2c3c7757dab000000000000000000000000000000000000000000000000a839bf5c89981bcf000000000000000000000000000000000000000000000000d7d4d076ddc76aa3000000000000000000000000000000000000000000000000955ace543f41dd8d0000000000000000000000000000000000000000000000001777825ca434712200000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b0ceab3db603cf2ba5661552d4cf302bfc023a6394c0978f10faa9748f9fab4ca59c720a334f68bf5f434225ff4f1160109f106d908b29fb4fee1e072f4d61310700000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001f88279c9b6672b07376b1f9454042503e778c7c00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000007872ac637a38a2772063e8c045bcf45431039daedfe1287c4a6c62e17e29c0ef000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f70945d3d46b7c480000000000000000000000000000000000000000000000007d54bc2af26bd2770000000000000000000000000000000000000000000000001777825ca434dcf800000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041bcf1f64edec221e1ed29c84498391e5985bb453cfb45190d2897684d3ca51840d8466fcada235b598d2e57f1b5fdb2d052fc208364c8e9a26b93cfe1540283a0df00000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b0034ddb1b7ec0c34cdd36b5e2a9efaabe8b12c200000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008546aa6b1b971450a31f4a901bba20e7383856a9f0936619e00b64ec00695f7b0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000ee237672a40e7ef40000000000000000000000000000000000000000000000004fc77a8e75354b610000000000000000000000000000000000000000000000002b5daa06156488dd0000000000000000000000000000000000000000000000008003e7b8b98bcbac0000000000000000000000000000000000000000000000001777825ca435479b00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c7282f14ddce604c84483530f89e40b2b3cf712529ad7b29547f2bf36c0b22df25f201872b8802fdf6164f9c5421e44192f45e1b22c728608da96f72b222c248c500000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bc961d72740e0d813bc5bc97640a6edf5c7f27e30000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000020eb78041d327d98e3bd43d2347cdf3724f2330fc7b134dafbf11660d88035497370c7fa4557041ac051a65d8c5b66ea05935b01813fdf1a03540246f68c71a2b1000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dc97190a754001700000000000000000000000000000000000000000000000002b09beed315647500000000000000000000000000000000000000000000000001777825ca4358f86000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000003d70a012f12d10797258d5c6aa2ecfc474de7ce46acb0b2c5eabae5f73e419e457881be9f723d8ea2051020f1eca15c320943f61c7f30a09ee6b08b4f21b9649983f6f1143b2f7b1d4d2056b60d7d378528cefd029edd9a2bbb4152377057d03efbb4e117affbd78afee87dcf8828f8671f1e0a42dbf00b5bea267675e57e5faed1d8f5ee6a4581662b9570319a5c21146bddb1be190e80c6f7429bc28c1bf4bc47f94f2d39033efb3aae39f1a812b30848b5025f01a7d9efdb0693644ea68d144d549c3bd569250beb0f60054be56eb44aa191414b2d86083789188614b7a18a519f0925d503009efc2c048808ce5b876bffa15215502a203dc09867a5eed0a73c6258752a33ba52a1b907c39b749ac4c3c29877b4e3d9e2cfc07e34e1131e664d99f5e0dcba74b2948626943880cc6909d02bec222793c2f1c08e6eda7d48d0a4da6ef4132f966a8426b6fc7dcaa594343881a97db10068c90964307bf61bd17d5e638e6d0e47a9b8af7c8c59fcbcde90bcd2ea84a5fd1bf136ce6abb704e7502df72b3cd84538f73d79baafa226248a8feba31247b5a9a7e184a7e0ea859d36f5236415ddac219005887c118cb60ffcbc851cbf54e70e179ef5e7b007f673d07636efaf83096fe0e2ea2e4dd0ae96bcd6005c7ff9ce5317c37eb73905808ac66ae46df5d6094744792fb5da4aeb40b8ea2e6d851fca257647cb6f5f75bd2b93f860a72daf9cfbf1d1c08158ee8f4469fcea3b19632fcb1f735800c30757b80ceca9bb1bec6d79f334d75786263fd02a74fa919e94e23d62211250394c6bf55787b8f26257abb2eae13cd3d2c67ca127ec11a67eb1c9cefc40bff3953668879671d6ef97a587d474ca9c7e21cd9dbcb8cb270ae74b8fec1398a928752c28a6d368e4a11d4f5450d1b21d04fc62e97f5505e5e8ef8182abce49c8f75eb14a50857b348ac503ed72157a1082c15497dcb65f2b09fd621f9e2a0e009de0fce37783378e5c7d4ce5b82f06e7e05564890d6754dcfacc67dd87baa662c5b619060887b5ce8ba62b2ba7dc46208eed892253ab7db2532fe6de1c058711ec88269cc519b7d68e813b9c565ff7b88e5a1390aca24e388bcedec7b2239a432b9cbda3646f0a885c264329892dc84a685f6ced2173adaf35682dffc7d1588391d1a09dcb2d96875e98dbf0b7a4c4ef0e25e0a72483ca2040a494cee7d31c533a7a5abbc7800c53864f888875bba76aa93d2b2993baf7aaae3438c63f6dd6d48984d2c0ee3622f47c9f50edf822258cea835bb1b639b82932e56183443d68ee0dc532b7e0688e09cee934fa91d6a6f3c428b34aa163832500bbff1009e2a808f17b377bf29a8214e6777925ba7f1c8b23207290cb20587b927016e88c9000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041db43b364feae16af52aee8f32f5ec51e44a8151ef7942467fe783218f1f47086030739b5c4dc97861fd05f69620fd0f58af6e5a3a7387fb55680db9d7e21721c5500000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bef3859ff7cc7d4cf9dd6e427fe69ddc3692371700000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000203759a8af4434ea8cd2f16433efef80c3755e016068e77a06a32729cb98c65436cce5eef1d1037a958417060466a6b27cf81754069d4f477d66b444e7abf0947c000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000017bb82863869c73b00000000000000000000000000000000000000000000000072c7521a5fdd299b00000000000000000000000000000000000000000000000083fe07e68f3e7624000000000000000000000000000000000000000000000000b2f67323c37178120000000000000000000000000000000000000000000000001777825ca4363e430000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004136e30cb3aacd1e38099b243bc9566bd057b3954cef6e4665f6bd35988bb98e14e282140a6c32561258ccacb0d20206bd6b86bd03fbc46d8cc51ad840cfe3290aab00000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c9061d3085f255e4788ddbd62e92cc61db86da7400000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000d98c2d5b5e0fd2aa1e91a25e635c592cdc404ee597112065faea5877638c5ca5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000860750ceb1e5983500000000000000000000000000000000000000000000000068d7e1ce4ca39a6a0000000000000000000000000000000000000000000000001777825ca436b73a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412891a28a2fea73f3bf1f39b86e61376a648a5d8296c9337e53f02a9aaff38811eb7a24750e8c0a5d51833937bf2456ee161b7796bfe96dd60dba9653bfc210f41100000000000000000000000000000000000000000000000000000000000000"}, - {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001efa4ea70411d534fe58940f52b07d3f0a052eb900000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000025ead5ae82e322e35cc85b87195d8a273fe0337b1e9aa2bb4bf3730133bfd17c000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000076a977de5ae7c8f5000000000000000000000000000000000000000000000000510caefb9cdf615d00000000000000000000000000000000000000000000000048de273f17faa025000000000000000000000000000000000000000000000000e8ce0cbfbec58ae20000000000000000000000000000000000000000000000001777825ca43a7c9e000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000001fb0a012f12f5031f2fe2e8a930cd5d329ff9488ec973d6bb3e0391c9d2fb0c841bcd3483f909f9e28c2b47727382f006890a58318dc10f005c10b1816e7ab86d3f4856e0e44ff71012284017aca0c768aadb3d29085fe1cec3aeac49489f8b2f7d1dcbcfa2d443edb954b934e80233f96bd8c1985102bad34dd636908188d20201f633fb79c5306ab69b4583f3b5d7b7936bcbb8afaca7f073eee85ed3cc53266049fafa2c1bd0e432b2be9b0f46216af83166c4a41250a742aae5d48b76c8969aa09f45619ac63cf6ae56ce4d53d558fc2e41e4dd2df834adbf159f6805fe52408e7a277b6cc2265904673d4d2a1dd3f24e64fe8dae3895c91f32c017cd9d75e1ecb9ab0d0ef4f68b783843ec33b3cc109cb3fd767336fa6a94eb53d7126ff12e1428dc2c8e2d88bc81884c5a37bd17b39de14c53beb44383471e84a1e544fca444857096cfba960f4ebd0b74214bc207b25de8121fb7b84e9af40b0ca8ee976a04b44e3590a1ea7d323ca145362c4dc5140cac480b8f31c775b60388d27b2b0770e742e9e91bb616d3729abe38afa5f0aeaa994654f61a56e1a003926bd5b2956ad87362d75646fc51799533a47ca9b89ce5a9c228bb09f6bf735a9b6501957bbd3efc5cced0cc2a46a07f2158e447cb0d5342ebf22cf7e1f996e3ebbf6b7f27497c2229c71e24da315d34caf804f388b644440a88b56c586d7e50000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004184f0822d3cc5a487a73db8c45f090d357ce02d54a0b27e08d841422dbba2190162a8e20fdd9efdd749b324a895a1b05937dc80eb74ec2b1b4635084f74cf47d98500000000000000000000000000000000000000000000000000000000000000"}, - {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f898850df40488f880b2b6b080307af6593ae1b200000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000020010756dc888e811d6852b3976a24367d9459e4c0761b479d480ce4642952ebf0c8a9c1a176b490186ea8f1bc310045eff02d590282c924c84bcf9ff9551c63110000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000045cbae31627f8a20000000000000000000000000000000000000000000000006db7db778994bef2000000000000000000000000000000000000000000000000cdc9082ba1d0c54a00000000000000000000000000000000000000000000000043b5b015eeb25e360000000000000000000000000000000000000000000000001777825ca43ba54600000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041caa97d8b064cd93d01146741c27346ca50242ef6807c2ded593028058cc61e88dea952d5ef225c388e3266c43af6db1381735b0b5ac98eb62e5b6f3a85f0eb01df00000000000000000000000000000000000000000000000000000000000000"}, - } - for _, tc := range cases { + for _, tc := range testUpdateClientCommitmentABICases { bz, err := hex.DecodeString(tc.input) if err != nil { t.Fatal(err) @@ -110,3 +61,207 @@ func TestUpdateClientCommitmentABI(t *testing.T) { } } } + +var testStateCommitmentABICases = []struct { + input string +}{ + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000098141323e682a32006647670821b402689ba2883000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100767829d81b94411f04758da8f6482c9f0d9e5aa2a3baa6cf29f5349a9f37280e000000000000000000000000000000000000000000000000c5aa1a9f19be56db0000000000000000000000000000000000000000000000000b9c0f99891961f87b8a0af79ad9d2782b4e6d9459dac2e8af793afb120a2b050241ef3641ef0de30000000000000000000000000000000000000000000000000000000000000007474ca7481051180000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000265ce0af977638415c7bf09f89a530c2b155c3b547f09d949b3df090bebdc8ba2e224bf090bfab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004124664e090eccffedaf06a66c2c91e4e563f20fbaeab7a18eb7489e60745330b0e4cae093b6e95832f811b2536aca966586f55092d403d802694a29c5a31920786100000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000013ff8b3be3e8ebd387f7a47dd1401c231c9a134b00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140f18f9941584e656201b4db624de62952544818dded43f171ad7f1ed294e3dc8e0000000000000000000000000000000000000000000000009e7fa89d8e21963800000000000000000000000000000000000000000000000020fd6de4978ea04c4aafb7daf818ecd0568e54c1874b791afd7dfdb4eb7e2b377f5257c38e40d3fb0000000000000000000000000000000000000000000000000000000000000052e5960f63986c665b20a89c2007c0367acafee8099637f44eaced9f2ff27cb76e17c8b4b721a7cfea738263677ce803ded910f14d70aaa19f64a4f1c5452cc6e9468a7e0b2aa91c89a873aeea5d53393584620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c532621f09295823d4e532ed1a8493ae385942e6d5bf09d938334783e00000000000000000000000000000000000000000000000000000000000000000000004134d262bb795229f53dedd971ceeb1e84264117690e6422a01c9de406dbd401cf848a6f9e673c49f1111fe071e0be406eadf9a6dbc234b629ff7679f3bffa67a83c00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bd611ac9e1e0d7e1d2d2fdf1e91423d059c5ac3c00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140ab4dffe46529e062263aae01b9225feb99ce67d454ab68d20b6fbc90e64e54c30000000000000000000000000000000000000000000000006aedbdb65f09ae7d000000000000000000000000000000000000000000000000f87b376cb6a34ab7eacd8e39cf44109728be698805055fc0fdef11d7d8393536ed06bec0fc8315f400000000000000000000000000000000000000000000000000000000000000511052b5ec66ca9a4440b3b4a6097f2526db0701f83227134c463959a0037662ba96952f95dc166e24334976b348d2d9efbaecc1570128c0a6311897dd9693b0fb389f69a0b3bbf713d40ea14e5b805a2ed9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001854f090a3b4e0aabdf096adb678f09d988627f096a99b3a6000000000000000000000000000000000000000000000000000000000000000000000000000000041ceb88ee37f966711dc947226e292dcac8bf2e498d9c1024255c10fc43acfa4c492462f64c5c5e8b2705a9ed2d6f740c37ac2826a27443dc85bed833ab2509851b900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000762eb5a155266f3c8f99402063d5d2aad2652067000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000861582829790e2e000000000000000000000000000000000000000000000000e013dd059ecf8d3631bc7056c919316af2a27981a97169a2e40a0cd4299af72e369cbd49e9937e4f000000000000000000000000000000000000000000000000000000000000003f081d2ab4c0858b64232606fd11ca9e1f844744b5ff5a8a755a71f9200bb624830ef53bf4731d0604b3a99629356ad14b9e065f99d570021e8129e0d2901b490000000000000000000000000000000000000000000000000000000000000000034dd1a800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041bda13ac8a11c8fafbeeeef9aa58d1f7c41ec8d9e8e9baaef9b86c19ca7a480c0a640d6099fa938ac477e996fa80228223b0af420229f9d8ef9a0347ce59f5b321300000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000091d26e345e5dfd980ee3fb79847ebfc1fbf8ec3a00000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dd07c05719e87d250000000000000000000000000000000000000000000000000e6ca8543d753bb6b52a4c65c7cab5ff568a4fd1a97e0df524ee104f6b62f46bf1df9661d4c369470000000000000000000000000000000000000000000000000000000000000043e8d9fc4cdda9b273cef89340f1a7f93849fc780c58d17ef3bdaea62a571b309e86e1ce2596a97509a6534c0b0e428dce10b974f2817fe2b2a6cac40cbcb44a7469927700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029efb78f43c3822f5cd1a83c27e0a3a6efbfbde0a8bff0918ba74af09080b77b5376efbfbd5ce0a2bc2500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e00f11b8f218ce25f265a69e0923340f26ec7373317b8573c13abc5526033dec3631913fe78e8727830acbc81113bcaeb86de3b46fd92a149b8ddc0ae43ad6e1b100000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001b216d271df1995884389068df4da1f436cd8d41000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140bff1b5eefea04351551cb6d857c9d9ae70d5e7c4a8985117c880046eb9c7f055000000000000000000000000000000000000000000000000ccbd70a9136902d3000000000000000000000000000000000000000000000000f0490550ec6197bc313bb5d8252bc8a37205866c4589e9acd8e526d666beb8e2675948967aadf14200000000000000000000000000000000000000000000000000000000000000578ce332ddbc92c4cb89ec877def41bb6d6d1d6fcc80505c5d45e02fb13afad367fe86fc080d8a2c614576887e037f2c0507e29a8cb05a1eb2c4a68301719e0691bd06ccd7e8a7f44c535c431fa328588d81228401327a8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f529a4f847ba115140d270dfd5133e8c0b6190fa2eaa1269f5dfc50f743e180f05eb2c1173cc35fb7e355f673ba20a9c8b4a915fdf6eb1941b98b0a93c6aed473700000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d571172a6fb87a0910495142e256b53cd61d68bf000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006bd8d76ec8d7c7f8000000000000000000000000000000000000000000000000b08416f05fd099bd94e4c0ea88bffb9955449e198dbb2a63a5c3aa308d60006faf2a57ba3c45ac770000000000000000000000000000000000000000000000000000000000000005792ff9e7f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041979eea8c2cf724eaba6fdca486a82e58a4243dd35ac9fbe0d4b8fd3b1c436eb6ae1dd30e1dae1a6fc0d8b52a50c0dea1b9123a581be52fb0cbc30a76851702291000000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000084faf67de7af11c949c3f0401e6c372c044bb1000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120a0f7ea9944fbafa81d662b020c3fdd5b0957bf401da7dde4ef9bad90cb555827000000000000000000000000000000000000000000000000b9c136f95077b843000000000000000000000000000000000000000000000000f6b14f1b3b9ce2125dc09a563a5b3c94ad43066b03c74b7ae51d0602ef69d73e601819ea8a238a7a000000000000000000000000000000000000000000000000000000000000003ab98ade468fc45ff8c1372876ba67f9f5211c2ee79821f57a41a1541fbd31338069012284ebe47affcd1696c6ab45d5272df0f288714c2a9ae0f6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416436307feb9e06e29bdb307ec13126a5247354cab0f5ddf039d003acfe80488fb2c5df5be1f6efa8eab3205b809c691d32a37874379ac432503af3902599ec484800000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005d6e6b1f837d6e8fd09fcf1194cd26c3c33e1a94000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009f7bd522368b8f7c000000000000000000000000000000000000000000000000eedafe577806da5738ee30e441cfd40438229df34db3568a4a23924edf22d900b665161dfe3c6f80000000000000000000000000000000000000000000000000000000000000002f577cf57c2229593ccabfc006a3709d2ca6a058aa938020259573726798e79525b4788b9127be328eb4f9d2780c474e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000053dc3bd604300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410edf81b7f9a8e64cedd51069520988f9cae1108f00692ba90034d53665cc3cd036fca40d7bf140b0f04596c605c5c7e905461dac1f00fdd3639e1abcfe503446ab00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000892d7b505c0eb7e44995bbcffcf4a29c68001fcf000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140009f1e2fce639a1c02803554a4fed519452745551d88f20a81fc8717dfd2d74d0000000000000000000000000000000000000000000000006021cbc263f63891000000000000000000000000000000000000000000000000f9aec38e6063a53570dc48b60fb2ff1d72d6cc08f0dc20d0000db14ba284e7038a7c1c450e92cda800000000000000000000000000000000000000000000000000000000000000604bd076c4ab825aa0b7525e9becb9fb5b38268173b10a2ce58f0d3f0b132454673348819291ef72c7f167cc08a866e8c004315634d6f8b953ab54321c8993402a6b7c02fd927f1c7faf86c6cfa1c7ae1fbd7e81c8fb0c854f7999a2536e4e897400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041dd4e0e32ef6c29b3f6baab50eb795ba9eeafd4dbbd61610611d8efa19799f7de89b8d39b1b5655e2dd13882c326468d4b618d33c30c0491a98e45beb2d533ed44a00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bf5dbbaf225f2695328e02a388f3d4557c2df21b00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120d74f014a546e6d7f7b73c8b9c3c21999b0233cb6978bd5470aecfb54444c186f000000000000000000000000000000000000000000000000960ed3675758b01a000000000000000000000000000000000000000000000000e9ac4c5d2b09f162b053129de90f78d3c3f3974cdd5b67dfe926b06fa8e179654a2e3cad0d87e947000000000000000000000000000000000000000000000000000000000000002480ab0c715b362312683c98a30e64ce3c04e78035c5b21db1db4c2b92a0c1e073ae68eaa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e4c3f68f09fa2b0e280b33ae19b992fe1b2a724ce8cf09abfb2e0b39df091a2a526c3ae2a25226f2731f09f83995c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041aad53883efd676a44fb7dd6f34d9666f33c8b35d3acb3087352c760393c68d9bfc54d13245e89c03b7116018add7567db7982abee0c606591419f35c281896797800000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006a1f96ea0103fcb31625b383de38bdb8473960d000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140c9c8963594eade0c0a101b313d54f52c1a21fa284e8a4477a1522c2b3079555c0000000000000000000000000000000000000000000000004608575a8de3cfb70000000000000000000000000000000000000000000000000b95033517831b15b9860a6feca8083d44c70f6883b940de918040383e75e13901c6286e9627a4fc000000000000000000000000000000000000000000000000000000000000004177e4674794480ea3de41918cef4d9467073c4ead35eff854983482c8e478a7edbc88d1c605a609f7924a7173ecc48c9397f99d325b3cc17a73e11b3912ab50658a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c2ef09f95b4e0ae9a2ef09e858e3c6a7cf09182be512ec8baf091b19a65f0918a88243124c2a57b57786cf09096944df091a6a44722f09d958ce18b99000000000000000000000000000000000000000000000000000000000000000000000041e3d8daf60e71bdcc7990155c82c5c018239f3eaab9460eb9a31a9c39467c31474f9a38d08022d88b35b217fa5d820d14612e794883604d2178195755b2ddac3eb400000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000036a42bc8b32ee77337be92b14bb2993745c136be000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d41478beb6f85c39000000000000000000000000000000000000000000000000caf4a4eb8c4faafb8465fecf3d5e1ef687d466335ea1a31f62c350eeab5c4d57c1accca20ecb8b88000000000000000000000000000000000000000000000000000000000000002aa204e4b5c7065d459100aab015247b1e86204b8bc2b0e30080a516f49fcd389c812f04dca904c799a006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004767ec2a5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041af9f93b4ce07c6a02d94993d689ae09fe3fd958ada17352bad7e06a5f0ced9223aba9a4bc1f106ffadebe60b142a9b44cc8296fd17894d881890826ed3a0ba104000000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e5b264c31fff65cfee0c59ba63497a71e77f05f000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c26a9d12a5f45241000000000000000000000000000000000000000000000000d064291c2bced779e5430cb7a27c9a4fbec259a8cc0eb283936cbfc8d7f816fe684bd709860f74e500000000000000000000000000000000000000000000000000000000000000335f1a4d8d215dfad3f6bc7b7bea8c3e7750bdafda7731ec7e36176a2b6bd55dd7db8807e0eb3e2c0da4178564d8495e0903276600000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a2fc8ba7cf090a8852227e0af9059cbb03dd1a8c8ba3ff0918d90f09e84b6e1899c3d3cc2a5d1a82fc8ba00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004185094064d0e9c97f026c0161877342e7297f3b4a41abf9242592f59ce560b6c3ecb3aab46c7f8748d29a18e6606c1ca5921293383bc7d0a886584116bd62e1366900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000254b4de35cec4cec92aceeab1bb8f78e0ec62af200000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000716dfa2749f90f7c000000000000000000000000000000000000000000000000269519a0b5a0c347b970a7d585c036fef2ec66c3508356a54824df801d602288d178c8065bccd6fc0000000000000000000000000000000000000000000000000000000000000057f43ee2fb5674ef2193b0b900a555c939478091f6551244d1cab94f9455cf4c1fdf4f5f8bb13347e798248b48fea4b8ece8ef6bc5635a4e975fd429757cc8f94d9264fd29890144b571dc51a489905f13f0138c54e69891000000000000000000000000000000000000000000000000000000000000000000000000000000000273240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041092e460de9e69e44d1059f108c82f954f40efc8b65b4c1f60a5c9b3841089fe47df32f12590844f6b1a3fca71063265b5e67b60531c0b6d8a12d14d2cf03a6846b00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000390f262af6337dd0416de2ed94367800b99e218b000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001004c4357443384664a93313d1c25759da3b61af124ce129dabad6a9cd9e6fa162400000000000000000000000000000000000000000000000027ecc8d7e2204805000000000000000000000000000000000000000000000000af9b1e2930851f1b77c29a0aeded11fbb48ec9167ea00e875209df9d62ac0b5dc55612c5d07f26cc0000000000000000000000000000000000000000000000000000000000000015b36a432ed16a1fb9c46142397a923b60954246253f0000000000000000000000000000000000000000000000000000000000000000000000000000000000003c7d7b22642e3a5ce4ae84f09fa1bee0a59f25f096be9df09f819724c2a5e19c91f09eb8a4e0b1a3f091a7a420f090b9b755272fe1bd953947c2a5c2ae000000000000000000000000000000000000000000000000000000000000000000000041aef80172b3b75d323fdfb76bd35adb3575c7c91deadcd61cd83380f24e01d0dd5f1156237e3f9d937fd67735a8fc3d3a9e3b7d448fed49fbe350f10fc1d5c07c6200000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006ddf684fdb878d5c4ed9dc403224f06fcba15db100000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f6d5fbbc8a8fa9d1000000000000000000000000000000000000000000000000f894a8c2a13a972c18c4610f102ce564233d36165e76c4e0b4e1e6ba2051374f1b6556d04a542c1a000000000000000000000000000000000000000000000000000000000000002a98252a2a44346a78000ccdbf9a5fb710eb6b832e0d26f0e41aea17034a900d6a1fd94692205047feceb1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000048f09eb8b9f090adaf535f26ea9f9153f0908eb6f090a78241f09083abf091bfadea9cbcf09eb99737c3bf2fc8ba31e1bdb8c2a5c2b560c2b47be0af97e0a8b9e0aab8f091bf9a612e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b8ee352a53975712f843db7e0d253e532875946e631aec0f79eca85347640c43f16c72ff2e1c403f8b03be596ce85c68a07335ee3f5290486845d61bdf1286703f00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000075bc39948fdae828eb03cfad9552858f189c035200000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140ad6bb3d7b3186edbbf1adb7f5153b7a2e6204a959519d38e6a8de4ba36062590000000000000000000000000000000000000000000000000e03cccb16e73a20e00000000000000000000000000000000000000000000000054319986dc10156ce28ebeebcff8d126abf54eae5185c2ed7934aac266e9c4ffc0dd3592e7951d5900000000000000000000000000000000000000000000000000000000000000576d386c3a2139d12175330914cbac453060f10ea9137b6695c66d56c44b86f0d6ddcf3b8c5956445583585bed283b18b6d4177672773594c5af3b7b5977334b8d7aa39989617f0b488df4c2bf9cbbaab360a8071ff8c937000000000000000000000000000000000000000000000000000000000000000000000000000000001d30e0b5882e2af09ea591c2a5d88ef09eb98de0b2aa43247a2a3fc3b97b00000000000000000000000000000000000000000000000000000000000000000000414b885ece0b385b23de505c76969c8ff11d12516497b20b3e0dfce9c1d4155826119535e477bf6279beac0b63664e2fcfc39b01082a94ccb7019ed8d40e6749495500000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000095717e126547d023c496349cb05b05d29243e18300000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c87814b9eb9562fd0000000000000000000000000000000000000000000000007e3ee07ceb35ca3aab2b22ffb2e95b29518717b4196116f5bb2b00cf67a4a2849023b1237f39add10000000000000000000000000000000000000000000000000000000000000032c7252bf53145064d879fcc25457e9ae6139dd20c925db3b0c3d4bf30f4dd58a775caac624f1e030b1a69c4781bd204d245cf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023c3b32ae0a6b2607b6643f09daa9ce0bdbc742d5a5427f09eba8b3aefbfbd2c255b363200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041179e2854013569d97a927543536a1be269859e8e58968c94e6db7916c3da8130bb70706d006b0c78446ac7b2664a63425be81401b2d5f30e9766c2ce8931b6907600000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000010b47a1e5d1a09187eed869c8b47894eed73a6dd000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000858e69f02cc79d150000000000000000000000000000000000000000000000005dddef57cf8754be872463dbc9b5d4fbe8148b6ee9cd515f6956b4a97cb90e4637ab4750eca887cb00000000000000000000000000000000000000000000000000000000000000121b54419ed5867d61f396d24ed0d8e0f56ddc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001732e0b586f096a9a3223c2576e1819827c39b3021e0acae0000000000000000000000000000000000000000000000000000000000000000000000000000000041fd2f81fd500702474ec8503e62359f4082614d77f98f68042a30eaf773fbe26a6c49ef1b60582b4fd0ef759045dbda22bd6683e92184eb4d5f608f98ad45bd01fc00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006cde0683611bac6ef205f51e265daa3e0c45af6100000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140f3570ac17ab7ab9fa3a652569da6dd3e3e2f4575566de2880c056eaceedb805d000000000000000000000000000000000000000000000000fd76046cc735c737000000000000000000000000000000000000000000000000db2f41a2ae7a9f8764bd44eb4c9d0eb5259fdbd05e14ff82d90929701f4763cc8c935123ff7724930000000000000000000000000000000000000000000000000000000000000048c46ba5fbade27e60d009b94c5318fb03bc02a4f23d95ac4935b3037651402f1a8a1260d450a25b8bc1cd488d40111a925b1a8530f9c9751443e2356412494c984628bb25ba03b6da000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a3d276e772e22f09092a22ac2a353513c22f09185a6f0909da1673fdba43639efbfa6583dc39a4f273f3d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041408cd240009c81786f297cde02d530b3fe41ab673cbb6c75ca5bada060af4edd1184a9de92a95551f173c803b690fd1987d76cb74d418cea70a8eef4ec88eeaa4a00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000919775d59b4477d30a2f4759f6ddd4e8674a041f00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120dd28db7eee643017a7a257683b7069a23ca9d6c83abf11afde11afeb604c60ec000000000000000000000000000000000000000000000000d204b370ecc763b400000000000000000000000000000000000000000000000065a292aafa07737e4b8eecb7b1f605c460c27f67035cd5997ca9a9782d6e731550c59e08193736a0000000000000000000000000000000000000000000000000000000000000003d79aa9b9f1a767917b1d0aca1a06cd87066d76e8fea6577976fd694711f19c5d4e6ef29b94a6757057712c036c77cd118cecf9c2d1c539fcc3833bac5ec000000000000000000000000000000000000000000000000000000000000000000003bc8baf09e9fb8f09daa9e5b2ff090818966f09e858f3f5c67e2b6b9dfa96e673960f090bca0f09eb8a4c2a526f091b289f3a084beefbf947b2ac2a5000000000000000000000000000000000000000000000000000000000000000000000000415005491da5872f44d6788f765d6d81c044cfdb3aae91ff7604392433334d5931b055411399e1f18aebb55aaf2a8b8afd7aeef035bb42bbce8ffded855cd070ddd300000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002915d77ece7ffb74406631a5d257aee1c1b1e16d000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012056e83dc1ecde3390197f4744c8388cae44d80051d45181762f69e108dd696eb000000000000000000000000000000000000000000000000069cfc49b1b641d97000000000000000000000000000000000000000000000000ad89f935d364112a4f52fda6dc993d1a214a0285ac37b60fd88265af6f71c9d551995c5bf9b9982200000000000000000000000000000000000000000000000000000000000000403c1be7997dcbeee52b84e893a4c445f3277eebafbefbd017e36a0e24ec05864d64671c50d44f008d41b4da001e54bcfc5e0176f787fde2f9fa532e8a1cda2a4700000000000000000000000000000000000000000000000000000000000000103c262526c2a5f0909681f09eb99d2a4b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004109501134712da20febce970596a7d86ab8b27e8c5c9bd2a083c1f64820e1d0eb2c4b6c262db80eccee6103ee2f4f68281b3ef104797fba2ce83239f8c60e916d7e00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002aea5ad8fdeef7e8f21500ac77517d373d79e77800000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014027440f4dacdcdfcfb0ae78da99df9c1c4b00c62b1b931c8068dfdf6d8cadecce000000000000000000000000000000000000000000000000503f5d9b4d10d46a000000000000000000000000000000000000000000000000946ef8a5f28feedc46f56aa35c8737f9c9fe5a32d3a58c953c3ce2e0cb462e2f2950611c6a4bfbbb0000000000000000000000000000000000000000000000000000000000000045551aef369b98e90a0e18fd4a6abb6886593bd27a4ecefa2936bf9aee08d6be1b4d63f85ea15cb9222ffcce6e5ca4d5d93b9f8f9fc9c217031e7d293d9cbd803c050d8979310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f091b4aff09f95b4c2bc72e0ae9ec2a53a5224e0b78ae0adabefbf95f09f8991c2ab3d7bf09f83ae5762f09099a4c2a56b5ceaafb7d1a8c8ba40f090809063642f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000415db600a7e6d3709739339e834425fa151d47f555b4315bb4a1b2cb468b86293023bea4dc64a30af5c0a6f7afb29326e15522a64f4f08c739cbd081d412fc1261a800000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000233be507f298590c8263219f34f625ba66fa278d000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ec95e7895f65208000000000000000000000000000000000000000000000000c0b0a70f3eb5fbd68cbe594f2d0654561b3800ba799975d37681513991c2b942944390aaeb5ce0bc000000000000000000000000000000000000000000000000000000000000000a4b9cbaae953ffc73336e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183f2a4cf0928b95e0a2a9eaa69226d6af4befb78fe0ad9c77000000000000000000000000000000000000000000000000000000000000000000000000000000412d1cf5932757e501cd57f2ac76623c1135c608960219f722235e0eca17fd62409a20359b37af332b78abc958fc2c5cdd8f1a4c5715eeb862ea5c2f52faf18fcc8200000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009a8f0e62b950186903049af32230b9e30c47a2f7000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001008f7c1ca297892d1648b7e1130a45ffb8a26fdc8ee8d85db78a0b4362f234f6c4000000000000000000000000000000000000000000000000de8c42fafe733c5a0000000000000000000000000000000000000000000000006550df63ecdf6745da0e796391173ea799ffadebb235e351349183ffb58e1b3a016e8dc0d93286d6000000000000000000000000000000000000000000000000000000000000000d577118579b2e7891d10156381d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000247b2ac8bae0b8b2e2bc9fe0b7b3f090a094efb29a557360e0a8bc3df098b4857e2fefbfbd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041cffba92abb3af36a6f4a8a6e394c3b6e47f23530817c5bec8d91e9f02070296cc949acb98b3b34e8cce901bb68c6d7a8cdbd4557ccb2f7bfbcf0f0d1afa9e1f31d00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000083164819a13bb3ecba851c4a8d1e92e588bc80b3000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120a92e495f1a0dcd53071509cb2a4f5a58463245ced7b96bc0380a09df388551060000000000000000000000000000000000000000000000009fe71687e0bf3f85000000000000000000000000000000000000000000000000ae62488d5434dfee2d109d6a5313b2c5e24d9fc183cd4507b785830b2f06a055901b924cf62ec6f60000000000000000000000000000000000000000000000000000000000000033d626a8fd6c635fd693f614cb2b3b2f29c28b66aff89aef73eea8db765b68a0c626876b895a0e68836ba8c00e7e63c9e0eded4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000001668f09f95b4f0918d8bc395f09eb9993ff09eb9ba6f26000000000000000000000000000000000000000000000000000000000000000000000000000000000041bfd286dab0fac103b9cf159ebe7f70052cd6101ea4e4bac1c021812c000c34abfcf593f3b6ec88648c59d9026a2d3769b0b896dd9765e9df00c9f21faff6c0823400000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000084e604763e37d7227a02f12faab7d0491e63872600000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cd5721a3399694b00000000000000000000000000000000000000000000000001dd764e883ee27d40ef84d2ac406a47909dd6b24b0ccc92c67493228db5d85062018395c20b90f210000000000000000000000000000000000000000000000000000000000000044597cd18baedde77919bc358f625ec289a5fc09f6b9a9474faeb819742720a8b602039f29dba246b1491dd09c846e608d65f335eb12e227972861b7a0a46c194f65333ef90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406c2fe1a4a4e0b7942226e0b796292e34e0a6b9e385ae2a22f09ea4ad2ef09eba89c8baf091a49160f09eb8807bf09181b530f091b6946ec2a5275c21e0b085280000000000000000000000000000000000000000000000000000000000000041142ead33193aaa0dbc77eb695b4b41fc597bd16aeee1609138c4beb07151c3e959619fc940be7c10983a179f19eb3c597ed4fa2d87d5c78e49cd7f9e772da7172200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d9fe7365f874065980fa6341c5bf3b46987127c000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dff04587e395072f000000000000000000000000000000000000000000000000338f5663d0b5b930e7b1b0c3bb8578632e39bb35b02e27d6d60214c4bd3b8946f9950c594299143500000000000000000000000000000000000000000000000000000000000000325b8634959763a4ea42a8d0f15f3e03c5b0eada84a6ddebeaa6fca3e8f57098e1eed77a5b9cc9a3fe015f52e6da7c1229adcf000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000326021f09f95b445d1a8f09883b23c2225f09f95b4473d27e18a8c2f25c8ba3d48e0b3a2c2aae0a68f62f090bab1d1a83b473a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413b5393dead36cd57c09eae3000bfb34dcf1486f3fdce031bf5c4ca3f727352db6f36f4cd6777d42631f6d58df7999ef6bf58e8f56aba7730f7834f03db62a58d4900000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003da216c068667fc50d86d3c38898ec537b43fbec000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100084cc76a82eda75d7091bd8642545bc627e54a04910af8b35fe90d6010706221000000000000000000000000000000000000000000000000c8446ce51ae0e83f000000000000000000000000000000000000000000000000ed3361c7db8ac2e9303163e04d8204828f69f3f39d7565d2e9f7cad5802745336608b78b6665afc60000000000000000000000000000000000000000000000000000000000000003c526310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003df09192b6604e222a46f09e9fb0e0af88e28596efbfbdd68d2ff3a08595f09095b02af09096bc2b71c3bbefacbeefbfbd7b6d2fe1a9b4f09eb8a7e18dba000000000000000000000000000000000000000000000000000000000000000000004158b9f977359952786e819a145b5c5f2fb8489e73066c1faa93edf0be8ff4e451c85cc2f6d238f30a9f55c6631ee79c5ec304cf601b2709a4b382099e2c1c549ca900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000877dfe2abf56ab96d51e6e309658631f0b52540c00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000495c8f0347d4fb4000000000000000000000000000000000000000000000000af10ae8fb0aeb33348c842f14a584a9b9178cdce399dcf015fd39d01e5ce9cf0499748a41ef43e5a0000000000000000000000000000000000000000000000000000000000000038bb764e9e3e071d8b0d3d7f720fb0cc701605b7da8775d4286ae2a43c2ce57981fd758076c95821186f66ccf292e7edc08706ca1e37e0171100000000000000000000000000000000000000000000000000000000000000000000000000000023e0ae9f6c253c25c8baf091919fc3b425f0909ea465e1a2b63aeaa0b1f0918b87e1a08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000415641aae615d775e3e55cea95294df8263096a9aed87ea34e2aa4ef2bd98d90dcfabe06c5a13dd3f52ec5d050537bd29f9415878f6f7880915ed755ad05a87d2c0900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bec6877b24fc8e5080349c809b23beb0836a373b000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d86a43de04b603a000000000000000000000000000000000000000000000000576a4de18b5a5188df695c2feb3f40e2c0a5e1fea80fc4bdcc40c46a2dfe2f44b5d5f4181f8ee7f300000000000000000000000000000000000000000000000000000000000000200f8700c2fbed0a924ba0a2039ef31089b311f47225096fc2cfb97be51200583d00000000000000000000000000000000000000000000000000000000000000263c273b5562eaa1ace19d9322e0acb8c2a52470efbfbd4de0b0904b4ef091a4bee0b785c2a57600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d09e23157a721ffd27aecb1ecd83caff01b6f5728aaaeb9a15274f5aac7f7b01b0448eff0afa91769207ca84991e89d5ce47972bc9ef97c0a200d04dad759134f500000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000064f0cb2b8b4e3515fc111539248205ba904f920f000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001002a61c17f581fee41b98cdabd4f92af82916df9825e4b6f04720a7472fce12367000000000000000000000000000000000000000000000000b1dd769a45d31e23000000000000000000000000000000000000000000000000cb16e3d990bfdc4f5ff3f369db41326d095ec433feaf7de903ccc2951facb501a8e8187193d7a998000000000000000000000000000000000000000000000000000000000000000f1fa8cf96887f1f9c528230b23754cf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a2e3ad1a8e2bb94d1a8d1a827f09f95b476f09ea4a23c7de1bf96e0ae922ee18ab23fe0ab90f090839179000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041301baec01eb3b736c2309922bbf93d59e067e862c7733403f94d702b8f9550e91ef8b9c706c2eea0c6df83b209c8bdfc6bc1ce89aa8f4206b46bc807a9acf909d500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ce613c27942ba73917cb12c46063a1a55deb9076000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120038aa36ec31ca3880a7eac2f49a12461ea5cf675ac25ac5e090969dd2868898f000000000000000000000000000000000000000000000000ae4afd55438bd5bb000000000000000000000000000000000000000000000000956f74c2d28f8ea0d60c64febf90eb023a8c05d8d023eaac000f59cf194cccc15073f5a3173455b0000000000000000000000000000000000000000000000000000000000000003406563d647185a1fb4388aa8c49de7ccc26793851f639d04472c40b42f6b4dacbb6c0fac2b730ef2954303c7ca6def00ed30e3d2800000000000000000000000000000000000000000000000000000000000000000000000000000000000000152ee282b4722e26f0ab9e8a6bf09e8bbf27f09ebbb000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f081a8f5954eb013217548dae7eae2a725c33fd5da1a7a272554a3f8db18da67eb4904e6db7e6209a13e26473dddae910ca681be27c8632e7f562e4eb21f1986de00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005b30aa6e3c93469a9efd9ce049b672e7af908aae000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009776e345b0126f96000000000000000000000000000000000000000000000000f3659a5de51e26606ae90ca88561912a868deb3c7fefd2068a566443327b073a8d9a9d3d49a791ff0000000000000000000000000000000000000000000000000000000000000030e131e15973bc270166e61ea945fd823141860218495884fc3c6c9bedb64a350710dad6458adc51b7ca72d44c74d410c20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d21cde5fe87e996f32419de16d1563e0bd46c544f0b52cf9c0d8786c378115a571a21d915d44445ea4f207c7d19a1c63718a53ef67b025d31cfb81e15c3270faf500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000dfa65347500aeb00e44da51eeed4fa65102de13400000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120b8a6cb3427e0831531e74ccbcf268540a13fb6cfc14fc0ae9ccc0ccfb958124e0000000000000000000000000000000000000000000000003d9d51d596ee122100000000000000000000000000000000000000000000000018c17ecf512404b723bb87bf66f0bab8043e310e1351f73cb0494b4d1ea50c24d6ce1b9225339371000000000000000000000000000000000000000000000000000000000000002411cb224ef71585e0d498be5ea84f6afd2609bfda09e136c34064f09b60e35cf677509fa40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000262258e286894bf090808e2ef09f82b2c3adf09eb98ef0918a8bc8ba37c8bac2b625f0918d907300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041428fe16395e4c93f35e8c07251034a0b4694a361ded7b54c33da56fd23310ef6ad05e7a787479c5f0d8d63187a73419aef98619e3a6dddf63e307fbe7eb5e9e06200000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004bb9c0168ff43d16baf87f7c7dc0efa3b19d6728000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001207135df257a36a226b8037664bb48b7b01e93639f9434ac7409c876daf4de9d91000000000000000000000000000000000000000000000000228f6536512bad500000000000000000000000000000000000000000000000000523b1ae7b7ebd0eeabbf959eb8e16b23c60a65971f9a56ef0c0b4806befa74f2a5e0a26c2641ef3000000000000000000000000000000000000000000000000000000000000003c32d00d2a470c56e29a65f231ec6f6e8980a616c6c5824f6af212aae1972157b7b52fa5fa3a5e2005764ea637a171502c8f42cfdb796bf32daf018f7d00000000000000000000000000000000000000000000000000000000000000000000001ae1aeba20682e5cf090969b5c49c2a53542f09fa1b349ec82994c0000000000000000000000000000000000000000000000000000000000000000000000000041a4a6f35fa3e72417620ea04ea39f31b4442f709ac02d71d3f6f45190f91b34fc6bb975c0f0cc9e9cb1b1dcaedcb653a298c2c3f866e21bd09d126b8deac82a768500000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006061b49e91eaa370bf192ffcc4f71549b1da6d1400000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120444243819bc37fc8080c593f1d71b715b49bd22401a3f5953ef95ba4e51c27d80000000000000000000000000000000000000000000000003ea3937a06f7337a000000000000000000000000000000000000000000000000ecec66ae63757a522af6ec37af8fa05f94215d063365cd1d89ec7790967d03236f2182d0c1b1fd4f00000000000000000000000000000000000000000000000000000000000000396e451d7f334ca558ebca4c1599e534b081ac9d0c178a584674882f3879b3ff11bbf3c264ea5de90db7b2d225c32fd3ee53671d7a8238dc10e3000000000000000000000000000000000000000000000000000000000000000000000000000025f0908ab8e0a98d44e0b383f09d8ba94d7b2fe0b0b2f09f82b2f09f95b4e0ba84542f225c2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410b9f183e729356f5727e07ca2ecb5b324140f68ba87e6bbb0418571a27632034cffdbbe6855de34b565e3ad546942a884545893588bcb3e130f0233cf19f6ed66300000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000026712b28b2ccc1fa73f514daedac221de5e02f1f00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043348889d432429a000000000000000000000000000000000000000000000000792ab7f0fbd85a921c508ea6a856306e96664df0f252c41bf6d8c7acc4e439c97d867cbe87802d580000000000000000000000000000000000000000000000000000000000000049bed49e4a706162fdcf241ef34b8cc9670a898566932f65c1d754000c1294e02d6eb474c515b722e11732d6d4120312a916db9f04a1a647e20ca6cd42613377d0983a89d193f694ce3600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c8baefbfbde18b8400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418ef8e7f3607f8f8449d21438fa31fb19ae9b9d63c097ac7a433ef4da92d5ccda0430454e0f6e81416a98f12088c6067441607212f0cdbb9e2408b4d1ab8441e4f000000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b316325c997e55a8b7b19d6a0a4d3866b8713f2700000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fb94f08eee7186e2000000000000000000000000000000000000000000000000896b9c1fe9b93c73ce218a3b5470e53787697ff33db9dc2adacc043962bdf8d76a76b7d7d85ed175000000000000000000000000000000000000000000000000000000000000004765dfd76691abbe20fb2eb1fa5ed506fa0ae4916d97882af023fef92bf071a6bb86b14965f2600acb99b2b6d5191a5f5bd092b857ecfc51ff7f23a049fb8076bfe14165d4f140e40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287522efbfbd3a26f090bab1d1a827e0b79022e1bd9d6bf09f9bb4e2b3be6cf090a886c2a57eefbfbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416fff9bd70ecbefd32b5135b71de9ba25c54ac7062bc48e3e9a84e7216ec8cfe1f7934abe49b1fb3f9895fe56a82748f457cd88abede50f8a3586e4e9ca5a5d0f6400000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000626095594085d2ba9fe593b1b92c1e76dc651762000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007e88d0ca30507acb0000000000000000000000000000000000000000000000001d568292da7c4672974952201123c8da7806fac1b49be6c3e376309c5b319c4a6686dca588fe3ec0000000000000000000000000000000000000000000000000000000000000001313e0fb63a926fb4e645569977ef7f040299742000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ea929c2e2e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e07e21c8eacc471088bd8529a3e99df4efb52d818c97c334f3d7d56ab44e187dccf22dc23fb210790b19a7b9cb13ad51ecc2ff87d518bb3c8e9ac9740dffe96fd500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ad19f0524e4f235c4a06cc39f424fdfadfac3dbe00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016eed9c120f69a4200000000000000000000000000000000000000000000000061faa764fde12116dbfb2b52a71b7aacd24b0c3fba480c6d5b1272ae176b2b8cbc98d26c1b34ce1e000000000000000000000000000000000000000000000000000000000000003c88d28897d8a08fd39d9b94916af272dc5eec4c376ac5a8ba54e5b9a44ab52acd297c86fe263935ed3c7d238c0370f881ed11153b4787213467fd8fc40000000000000000000000000000000000000000000000000000000000000000000000302a3af09f95b47be0acbd66f09faba34357e3858dd1a8c2a5325a6b25c399c2a5e1898d75f09f95b460eaa7a2f090808600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004184a09107db1d9a0ab74fbec0afd4f77b2e9523bd1f488d44eae56295cf2b7d5d24c11ddda9c584d22dac274cec34b79bdf302ecd0e4c930722cab09071d9dc0fbd00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fb13d7ca2c6f29fb699ec2fc951ea1a044650340000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010079562f1ae790dfc4726ba67950002182f4fbadcda723e89e5988509b3732f2a00000000000000000000000000000000000000000000000007304e6cd361d0641000000000000000000000000000000000000000000000000330c9e21d979f25af60df0892b8016bf965252f62334269ea0865dbc12887f24847442d305bd82e90000000000000000000000000000000000000000000000000000000000000020c4c93fd8758b6349db21f421cb7b6f02bf93f2609dbae2b547672a37182936b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041518079137e5fda6922e223e1e0d463e12a41398e56b4bdd1ab6b19746a5315336699ab404a06ec72ef57b99ecb8f2f575adeed1f2f83577561be18f239af39afea00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000efbcccdbbca3d00cd083d53b2319a169e2148ec600000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a373a4964ae93f0000000000000000000000000000000000000000000000000d330180fd8286df3fd7101dfbe61b0f6cb57ccb3f9723e15c02d0540d9972ed54ea52daca10025700000000000000000000000000000000000000000000000000000000000000061c8b45ebe1c94a1a54f902bc755657dc2b9780b86d445f893882e8ce61a51c32c7ce6f27db8db2b40e4147b461dec6f09d8c6934db1bba63a08cb29dc133b2876030d85e2a5cb05d6acb45fa85dfa07fee08b33c6b24766c3ccedf41c5f391fcd01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023f090ab876b7be1bf892f51c2a5242f572f33223f7ee18ebf595f49f0918380e19db3390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004148e1105b9d6e9bdd27f3dd6b2e0edbf52a5814521a44ac3ad74717a7c90349fb6189db6ac2601580cd91ae0a0e6000cce412acd1283fec949f5323a277425cc2b600000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d9485a2935cc90e9d1543d0ee69022691ae396d800000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001403a09ee81ad6e6f8aa9bcc271fd709d5e62ffc8242d26260f83caa449de7428dd0000000000000000000000000000000000000000000000005e2cb2f4b3d934fc0000000000000000000000000000000000000000000000005aeef1915a49dafc035e09665d5e2bda485700a1983d89764532547ca8dfcc1b29353adb09e5ccbb0000000000000000000000000000000000000000000000000000000000000043e8be1d309d60f827be5bb37ca555180ba052a475e3518d560741de67595160c8baa3d97674b77ceef555b08a2ee4ed2f837e2a0e164454a0e509434e7afac63ba3fcc50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fefad80f09eba862e536e6c262a245d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000417fa1c11a338b271617fa0c15429cb82ff7bb954009fd25af28425917f88791f2199af3c1099ce1b15e2e4d5f5ffd1a44bd48d1f390c65f20059cce3046fd699c3700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008dd6ca692d5bc548fbc99f12e039dcd167da5ccf000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000184e129f239d0a0700000000000000000000000000000000000000000000000029d47744210ee0a65f84e9d43a4bdd5d073f16a2d365f7a177319ac85ae1e371592fc36592963c84000000000000000000000000000000000000000000000000000000000000000b1694158d5cca85b6297fab0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027e0a69060c3a64d434ff09f89a5efbfbd22c2a82e22f090bab1c2a0735c253a3fc8ba443de0b481000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e2f42d502d683116ea57c04cb3a1d4815877adcf53c409f9bd52d28a677f3495e8e6af7f8bcedec8c3942dd8ab906ffa92f8eac748e81cb54860770f9319ab5c7400000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000778b6e33ec14b88982f00883f3e9040289c8b4a8000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004477e71bb3dab8fe0000000000000000000000000000000000000000000000009956356431dcf0323369d8c8b23d0214111afc800dd9bcffc363faaaf9cfc5102b7ac46f15aeb00900000000000000000000000000000000000000000000000000000000000000334b2bd059a89c33d9c688a0586920a5fe7522a6b23ef8eb1bc9856e2eeeb98b4ab2db858b258734b6f619f79cee58641cdd793f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a2ae0b19d5cc3bce0b586e19d903c43e1bf9825f09eba8f3f7b3900000000000000000000000000000000000000000000000000000000000000000000000000416ad6a44105efe078441f1eb1da42217ea03fdceaa6f265e1aef295a5d6bbd132a03c1a3d770e5919d725972d7c3fbb3880a625a0fc416b15433c61a5637ca295ba00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e2f8f90936a70389e221845d64b438c33ed5322c000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d5c06a5a9930e59200000000000000000000000000000000000000000000000078b04a8c86c1a17687a609be930ec03dc4d2eda45e7841e108707c2927258dc89a9578a8c39dc99e000000000000000000000000000000000000000000000000000000000000000b2e48e50b59ef491ed762d9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003246f09e8a98643924e1bd944ce18d8c26606026f090a3b5602e2af09f95b4c8baf09e8bbf6f59f09eb987e0ac8322e0a8813a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041713abe85cf652416abc05276a2ec23227fe5d28dd12390daae406410f5d5301fd40d40bf0244e1b9435d1f8900e1d6f0c103d02c749714b8569e7dbfd3647439f900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ab5977e24a953d20cf4afb5d2f3c4e5e69ef5c99000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120014d96c80f8705cdd8231c8fbf4bef980fcbb5fb17564feeeeb8b5fe035078ab000000000000000000000000000000000000000000000000dfe760a7e27f726c000000000000000000000000000000000000000000000000a7abde6e134dd1f75b11b344a4b980af0c96e9de83d721d43be4ff12f87411894026aaeff048062c000000000000000000000000000000000000000000000000000000000000002613c7f7b6e2960384adfcfc3bbc010b9a888f6f902f7d08160a6ae23730449b98a17fbc4887b20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ee3859cc396e1ad973cf090969dc2a52e2f25225fd1a8f09dbc9378c8ba3b0000000000000000000000000000000000000000000000000000000000000000004162cd2899334966bbc150b29fc66f37ad28c5795c2830596c09a61916e1a03ece89d8dfe5d7d1761b199a73845bf5ab34d73f3340f327e40fb1bd8f390cb53323d300000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fd14c5c5d928b5322ca1dab00dc3c96b2d796fe200000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400d6f37d5c019edfb3daa8500306a64a61281163d1f112e7f7b696b13ffe17f9a00000000000000000000000000000000000000000000000038a2b6231f031ff60000000000000000000000000000000000000000000000004ae504aa511e297bf6a691c35c918f206a6cc063fbfb76211c28fed5effe62480dbbdf8c6276ca980000000000000000000000000000000000000000000000000000000000000056336df137076f7240c97588d1690ad13da8aa849cd35c76f3c0c27c8caaf356960e441f68416e7d82a4ea5b7e45365985b639d2f02bb1411bf4d3efefccbb7677f430776d393ea98beab928b9f65e7a73770e86eac0910000000000000000000000000000000000000000000000000000000000000000000000000000000000303a2bf09cbcb541f096ad9b2524e1bfb2f096ba95c8ba33c2a5265c253dd1a8c2a5e0b38de0b18b626ae0babdf090a3aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ea39afc797f35d6a3eb5a78fb3f331cbe2dbe45c7fcca2f7ae0d0860bdde5abbac1d0dcd47ac44e3d962140527aace7683d4cb43f78922872542a475c79e42e7f100000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003e11d7f0ae908df3fe44ba525414dfdaecbc865d000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001007618f66c4cc1f63852a5469676f5a86f2c2c6aea38665e232559c620f7a6414e00000000000000000000000000000000000000000000000073f9209bb2e3f28900000000000000000000000000000000000000000000000073a7fc9ff66b2111a354ff5f3dfb7034d06027a8e89512645d05a0de2b2edc87640cc7b88a7d4688000000000000000000000000000000000000000000000000000000000000001f9e7c8ce18ba2c9f831750c55c62b72a3fa42f1f9ffdd616b629417cbbce05a00000000000000000000000000000000000000000000000000000000000000002fe0b3aa2a2ef091919ff09d93812726225be2b4a7c2a030f09eb99f48efb9b1df8ef09eb999c396e0ab88265eefafad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e74ef1b94a912ddc4f60410d94ab7a6668a3fe9c9cafd33797db43ad5f888294c86d65dccde7d2df1e20f245a017ce0bf0e8308ae53e2964b22b78fbb8d85929d300000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006b5aad2b15d247ff327bf563be6b00ad59c9dbff00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e8af88de7cf5d40000000000000000000000000000000000000000000000006cda6f618e75df6e89a127a332bca2a88bef9606430dfe8926caff276a1c9cd93e759530f574180a00000000000000000000000000000000000000000000000000000000000000470067ef8a3e0ffd0ed705609774039ffe9035d3e4765322b77c726f8ddd5ab2e64cf3b82fbe131fe480f0a7e2451c24face89b0d13600104a9d9003cb8a0ee88a4e4dceb81c944e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000019c8bae0b3acf0919b83e2afb6f09f95b4eaada2efac80e0b3a200000000000000000000000000000000000000000000000000000000000000000000000000004154080e37c78f113ad2c6e28d4d2be8340f1ecd97c99ff2728ac32865f4513b046332953a56ffa9ebf4e442e1814208489b33f2c47cfe927e8c147d862fe02d933a00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c3ca6db18cff0dff43515184633a04c25cf47b0d000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120a97d96397e6092eb8810b88f0145de8e1df0d587580e5f7e669676a29706d7530000000000000000000000000000000000000000000000004ceb24e42e7bf0760000000000000000000000000000000000000000000000006e07a99ca39213499fb91ebdfb4f220d1ca07d6d77056c0699d42daa22a943f32d3545d443e19a7d0000000000000000000000000000000000000000000000000000000000000021891cacbda7af5a858626dade2805c1585c23d6e5cd323635f8978cff77857c35dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c3ff09d94aef091bfac3a607b35222ad1a83dc8baf09182b2d1a84067000000000000000000000000000000000000000000000000000000000000000000000041be96236ef128085ca5028f17b28acdbd5e7a585c536a0eaa0e5609633b8facf0060d0f5b1177b316b8d5cba071fc67d07c411627fff16466a7c9a7a58e0ff01c2e00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000031c0043c194b4e70a8b68968fab581b088689f1800000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140f5e7a9f495fc540ed34e6f4c0ce743cfefd8a06a1f9796e8f59fe3eab45b94b2000000000000000000000000000000000000000000000000c48fb2a58e9d6104000000000000000000000000000000000000000000000000df9a38b3f86361e0e5d30cd794f3e37396ed7e6c214d54393584b2ca5af65c1a0f36fc1e80ee5ed00000000000000000000000000000000000000000000000000000000000000055ad753cd0bd6373bc0d5fe93081f6d80f5b01a8e898808a737d6e0624338c92785d452e8ba34fa4043489b6c118894b66eaea15e75a9137879215ea9c6dbf1c5ded9bb5f9eea1d490235800e1c23dbd7f78331c06f500000000000000000000000000000000000000000000000000000000000000000000000000000000000016f091869c592ff090ac93f09eb1b3c2a5e1a7bce0b3ac0000000000000000000000000000000000000000000000000000000000000000000000000000000000413f921ee7ae1083b5810893a85694d7930f807aaf29f2d03af096f10cd53aa93775a38c926d388c406e220827ebf54bb99a3b14ceecbdf222ad64086394668f3df400000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006df5ceaed8c2def107b79f9569fefca55541b8e100000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001204d7832d96317cbf64b041293e7fd7e68d2c1d01e23631b42f6eba1bf0ad983e60000000000000000000000000000000000000000000000006fb912278e5b8b4a00000000000000000000000000000000000000000000000002585df1fc23395542333c33f4aaa3918f9b449fa10cda4cf84a4b90090e7ae71193c196f02d1289000000000000000000000000000000000000000000000000000000000000002d110d2d4f61911ba32cb7ac93d72707b1949091914de6d8c004f537c7926bf498566337930e0bf28df77675631d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000486031f090beb02e22e1a48327e0a2a93f2f2cf0908da54027efacbef09f95b43cefbfbdf090869b27f09e80952f3cc8ba20c2a5f091aabbe0aab2e1bd9bf091b086f0908594efbfbd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041fdf201da6f804f9da67d5e8fdb8c6ae8cac19c2280994286aab8b2ff9ba07b38fd7fb325c87f93977dfce8f19cb41cfc67ea1e2678c0c66dfd870dae84b648b7a300000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000076c1287d3ecd1e3e935c82a9532fe1a6e152696000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e76715b15fc072f7000000000000000000000000000000000000000000000000b3be0cb7066de68f69d3068d348a79c80d1eb87607ce0fbd14ab99314f69c2482d193fd72dba0d51000000000000000000000000000000000000000000000000000000000000005da8a29f74321bcf337ed3bbd3fbeafe249ffcec12c250d0f1150a209993997ae6a8eb49d1e53950473d52706e2b9bc543e05c9697969e623aa2fda603916dc3576df29555828a3508e8c200efe52b1e4e480ca2ed3f8a9a1fb8aaa1f1130000000000000000000000000000000000000000000000000000000000000000000026f09d9483f096aa87e0aea4f0909e83262af09f95b4e0aa912ff09182885df091a482f090aeaa00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041043be6e1441103bc1897eb1fe336e19a1e5a2f9479f068e15490dfb033489a6794a8473b0f425070b11461640ec97a88183c89957c1cf5f7113860b18ce1d8f1ee00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f241000fe76a15a64541ef7f6c3413c1859c666b00000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000014075c95d50b5d8483a99177ca68fd8aee1fb5266cf072724ca9ec29216113422ba00000000000000000000000000000000000000000000000032d0cce0ddbcd35b000000000000000000000000000000000000000000000000a4221cf0c6f8b3ff695bffaed03fb7909d28892ab3a1302bec8a150ca5ec37568d0a883763205b9d000000000000000000000000000000000000000000000000000000000000004e2e00a272ba0087d5e8de53ee31f9280fafca1b3d279f26df8758ebdf321c17b996ddd03fae635fd0933dae47853854ecef4acb0d81f66dd6b5cf0b99aa0f0a7a75b5c966b3d504de61afccec533b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000276d2aefa7abf09fafb1d1a8f090948a252722c2a5f09abfb97ae0a8815cf09f95b4ed9f9eefbfbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004103639b6a85e5bcf2c579fa8c6ae8975a6f9f04eee23eacbcc529647eab37ee5628cc1f00af5eeefe925cd8db19b8c4badf3af7324b1eeb9eb30275a66aad42490100000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ca456bfee1c71e76dedeca9aeddbd7a60bc6f813000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c10400ce310279f5000000000000000000000000000000000000000000000000f16939203bf5812e2bf1b484a4f02f99025d5866b5d9bc7cae60c76743a85eec992a6caf7a127332000000000000000000000000000000000000000000000000000000000000003023812022a29be3fd5b844cd10faa5d030b4163d0708e5cf316199bff8b3366eac52ee9f936b7bcdfbf77141b6fa392d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000183f5cf096adb52f26462e362be18a8de1a9bf5cc3bce0aab90000000000000000000000000000000000000000000000000000000000000000000000000000004132edd5a73e804ed2bc0cd55b95686ae14262bee5b631bc099eaf23070a33da0a3c3e537c96e040502317a5d2b05d5db792f374141cea6f435c8ff5a76ac032e0bf00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000087d8ea3d285156eb2909b183c7829c7fe6ed5a78000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000332eb90cf22326670000000000000000000000000000000000000000000000002dc0ec36cc8786dc6a407dc7aac0f5e8de6f05aa9bbaecdc8be2ecbe1e337e40ecd90259c7a59a94000000000000000000000000000000000000000000000000000000000000003c4bd39def52e88479f71157be1b676632e4d2bb5f8f17af41827cae3d0680b8a0f09949fa7dd1ce43c2e8fce0d0ea7553abf1277cef4ca08f0b82fac10000000000000000000000000000000000000000000000000000000000000000000000065e5cf091b6a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041835928143dcff94e345c363a651fbeb173c72e34158f37054c5104d625ac56350ec5990432001660b4d5bea97cab6f4750f7cf9693475eec6dee93d98b97d1fe4d00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000582c2eadbecab896e52e1a1909b586567fca5aa800000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e836b6923f25b60000000000000000000000000000000000000000000000001f873be91bdb3d7f2f04de9b22cd88b403ced91ecb774894cb321da50ea77d0d49dae3fa9ecb7a9a0000000000000000000000000000000000000000000000000000000000000030e14ae829114ff5c214731a5aff4bb0a4df4e7685eec1f69920e36c70dbbb468dd716c7a93feb83e4f78f1822e4680a7800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d3fe0ae8ac3b2c2bb754b7bf096abb43de0a8ad6de0b796c8baf0909e852ec3b93fefbfa92e3de0b79d2fefbfbd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004114c001f979c1f3ac96fb5c2a5860614ead890824379f05a8f69990aae808a801365d9a751523c89d37306431ce515bd213cba74fd64198b369a4a72a69c2c25e8100000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b0e09ed51e11331856aa54d97eaaa626d517d90a000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100237d50510edb3225bfb9e2362942acc6d99ad47a3410c5c0eb126c4bc5d7780b000000000000000000000000000000000000000000000000f184767d7fd5b4d60000000000000000000000000000000000000000000000004f26ea457ade2d46b587d2b47950c31f4bc6933fef2212ad10e6ebc413ff786eacce44b492f1b210000000000000000000000000000000000000000000000000000000000000001eaf6758357bfd9b19b689abef5419033472719a5a14073b9dcefa1430693e0000000000000000000000000000000000000000000000000000000000000000003cefbf8b22e0ba89f0919ca15ce0b681d1a85cf09f95b46560e0b2b2f09fabb027f09bb1b650f096bd8741efbfa5354af09ea0932f2e226be0b3b17c3a000000000000000000000000000000000000000000000000000000000000000000000041b4cf271782932efc67fd9a8fd796e1486ac45766a63091afea7f44050b7a5f994a03969fa91962b67ee3109db2fe02f8e8b07710ae88a1e056f78a78ae62451fd500000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008dfe2bed0d3140d962d81778734e7cbe5ea55c3b000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000100020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041a337687c7e62c500000000000000000000000000000000000000000000000078a6d13dd272111ce5ddfc6504f4aee33f15cfb0fdb16d2d94e04fa1f91cd0436e52edaf7a1f18ed000000000000000000000000000000000000000000000000000000000000003369d914a88238974d7fe4b16fd65de0c93b470e934d10425eda56976d755761f2f7f8951738f6e3ac0de1a0b64830ad83832aff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b3af0908d8325f09dbc975600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418c8286c330b80e4a46126e64ca19d7ff466ea60f2022639df0bbef59ba5e7e11e87134656222feedd70baa34cc405f478791fb601c25d20cbd7bc1e4804477736100000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ff551c8cd5081b32f24a8a928b48721108ec437400000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120810d23c64a4858ea78673a9eb55a6b22565035c7f9dd058e7d52fd7f5117f659000000000000000000000000000000000000000000000000a487f78ee2a65e8e000000000000000000000000000000000000000000000000117c384a9d86c9805eff5e31fdd9f79456b304875fe07dd3cc0d3ff651ab6e3385305354fae21adc000000000000000000000000000000000000000000000000000000000000003f891371112360b0456ca02d8288b4920d7d546e2d90f00ae5031d418b6b671ac5b29a074aa14ebcf49cfcad81480b11c1c34d5fa1fb314fd48e838b923b9c060000000000000000000000000000000000000000000000000000000000000000313f54e2b792685a3f5c6868f096ad9d2e643d60e28f8c6044f0a5a1bce1ab8055eaa6acf09292903ae2b6b66ef096a6823a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041063f8c35c7b6f1345a0558710ed7547315d132809654ccea82d40f4ac66fef13aaf64796a32718ac93d7e9b48f0222eafe34524bf336742a868f142b912fdc896300000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000088129237c18a8e30fbc3f8df52b2d594d49f075300000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000200001000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140e0ee0be6f7a55ecaf8d84e388c829aac87f1e6b68a1d5d782bc554106bce65340000000000000000000000000000000000000000000000002255df55c4a5ccd40000000000000000000000000000000000000000000000001213cf9a2b167f98404aedaab4e732b4ffd1e181bb4198748e44007f645adaceaa1f63cee03f8d150000000000000000000000000000000000000000000000000000000000000057162cc90602fa527d34dff2cd7146bafb8f2cf7f19eef86fcce53a07353de6009c9dc2e8741d00a0d309742577c5f4f4f294130667b14b4106880bea679c18cb0fb074cb3b1f9fcce6549ab80de2d22a910e63bfcb14d06000000000000000000000000000000000000000000000000000000000000000000000000000000001d62dc90e0a98d704be0b3a32a3fc98b267370e0b0b7e384aac2a53e4b2e0000000000000000000000000000000000000000000000000000000000000000000041fe031196e4ff7b8a010f5afdfdb4cfc64fae43c5b2e27f0e5188ecfc0acb57055f2f65eb7918fcf1fe16ef2b388f6a6bdba36d5522c1de6327cd295c4c362bcbc600000000000000000000000000000000000000000000000000000000000000"}, +} + +var testUpdateClientCommitmentABICases = []struct { + input string +}{ + // Empty context + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000296cb779a1b914ce589a78d3d005107fb978651a000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020bf55a4ffc3aba6b5ce776251db53954f9430c1d8007eb4c012229351802626d47a3ef8d1962da3a8067a89e4044b44992c97832a20db7df460bb70f8dd9eeb7a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000db04faa9e2559ed8000000000000000000000000000000000000000000000000f88a77eb0eec32c700000000000000000000000000000000000000000000000057b45ccf7a234a76000000000000000000000000000000000000000000000000595ba72d31498f320000000000000000000000000000000000000000000000084dab30bb98bb63d600000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005b0a1d26e189b44d772ae0a7b3f09f95b4f09d83823fe2b6b12c3dc8ba417b21123a91afb643a1cb4841c54ec2f6afc017cf8c5974578f5057db46bab0046266c9ed01c39c071e9b95bd49b1cfd1180f0d2174832adea9a0d915f37d0000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041b65911319834305113d4af3aad57b557a6e3d5abd2627825f4be66409c15bccd850333c4b09304f212920e3ab4057c576da5d78980a6d50f82423ed896d23e9bd800000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000054df43d0f68a7861a5d16404c2381a079877c18f000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020bcbc918fe4d3ad5c1b574cde46feeba297fa426cf014ee8ee81b93d92411bf7ec0b9ea338bbb7846d89162d7c801a912b237f858e379cd3578932609247df3b6000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c161c7f136ab457f00000000000000000000000000000000000000000000000065b632e1c0a5c01b00000000000000000000000000000000000000000000000449785b1d69ee2e5a00000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005b0a49efacbee0aebf26f09e9fa8f09f82a2e0aba2f090ad9e6ccdbff09e858774efbfbd555ff090ac933d5cf0918c8c3fd1a8f09f95b4e1afa3f09f95b44de0b3876d3ce0ada3546f7bc39f120e96e74ba13953b5e6704a225883610000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d86932b0a7164ff47aa20c16786cbaed8e8be546422abd8a486784d9d8bd89f55091f56ee7268e5c67939f42535afeb02672e3270b01115d859a1bf91927b0783500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f20ff98e6b7e63dd112d7c7e005a19525882d1ab00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000eab57197328afe63b7f5e8555beeef661a06b7b92cf6d83eeab26a4a3fd081540000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000feb48c9c466288b7000000000000000000000000000000000000000000000000453a4cd89d5fd744000000000000000000000000000000000000000000000000b54afeb199b6177b000000000000000000000000000000000000000000000000a24a1f71e39cc73d0000000000000000000000000000000000000000000000050a4cd9f77e423f0c000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000419645af7ddd72020a7810ba363c94906bc4572fe3a2f738ff754125864aa7c5e879b91874bdc6502d26dd12d9b78eef147a7bfebf7e3e0e6ae7644782faa373f0e400000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b0fbffcd3157daa0a78698db925abe4b272fe2f30000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000028088bc117fa899fb084de26c75faf703cfd4a92b02757ff75a709b647c11e0100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006521b20f3ce3419000000000000000000000000000000000000000000000000882c1c6ee6fc2c8f000000000000000000000000000000000000000000000002f6975e2ea2b110b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000680a226977f09cbcaa273f7b4f727b3de1a8ae4b2fe0b3953a2f66f091a48d2ed1a85bd1a812421af34e73c148a57794a7bd2e5699f03efe586ed0eb6ec153ecfb842a4a504d13d08742baf87ba3390c64a4059a7b1cede95e9ed9313556df6a15bb3bef370fd5daf700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004178376906550612142e5a1286bb59c8e6247a181bc8413b4fad554620dae74c973c8b4545468990b37d714c57b70f730c02cff56be4825bacc2b7bed4cfb59c4cd600000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001a1123ef5647516826cd9e4bd3ef95a2adc50d8b000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000007e4ef0e2f808b5b734d2266371c196828e76a36fd7819538644fbd1cb02752b80000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000a7b970007c054842000000000000000000000000000000000000000000000000e2a3432750e4a3b90000000000000000000000000000000000000000000000000fef22f3f2ab5c73000000000000000000000000000000000000000000000000f4dbff13bfc340f900000000000000000000000000000000000000000000000d5d8c9cb659cdee6c000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418ede1e9096587e81fa557710352be3cbcccc5d1b0772c901387d70c9a8894030c6f8dbc9a77e942ecd9e742856962cce32fae117344844a3539978b61721f6625000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000029ff3b9666ff784ac47e2b0bedfe6ec7e0fd73fb00000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000002038aaff0335ab88502f077988fa65d68f6367198b09b3a8edf599c41b943fade4847e3e7ee7786ccbbe04f5ae4805e72bdc0cb45b4a0645eefee35e529cf5072c00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000f2e8bfa8dd0b93a00000000000000000000000000000000000000000000000092b40cf549c1fece000000000000000000000000000000000000000000000000cbc51529b4271adf000000000000000000000000000000000000000000000000f8f52d87b55e725700000000000000000000000000000000000000000000000c8006f73b6775240600000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000820a1cc2b2e2b5af2bf0918b9ef091908e35e1bfb66a47f091b488c8bac2b11262ab8c2cc8cb5192982811c5bb23f7466620b8920cad29b7467a602d43ef622c84ff04bce2ca16517ad55c8cc579e9451c2122f07856d835e245a4a921589e0a06f35c026da75b2cf5baba444d638d18b9f31bd0382560e376e5dee801dbb28e2ecbb4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e356048186ebf07119d7962791e5468656ed1432ae645cd1c0ea965b57e7aa6378f31c100bc9bf06efeb6b5901be5e11ece19f6454777bde5a22f04dff8e3828e700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008e5b8e47507c10778c460a1ee32754ee5cc5376d00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000039a9acc9d36913c380cda74ba4d9be2240b001438153de3df4776ee884f88e30000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000592347bd43fccbf00000000000000000000000000000000000000000000000000a7c49883aa926dd0000000000000000000000000000000000000000000000006e487f077511f78100000000000000000000000000000000000000000000000045d4186d5654a751000000000000000000000000000000000000000000000005f75c483ed1930321000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410562db35060aad3a074bce7233c960916a9c49e39cc07f6069e8aad6d6a6742b71035cb51256de727e2c67e0bb671769ef3c2ecaeb29571c9e5a845bfe4ca08d6700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000d4d5213105e7b978e329e1f86c64f9e6856e28a0000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020a3e404d0f0959b95109fdc5c299a52235fd382d01e448f9eff1409f7e6bb39e8840d39a41f8e118d57b27f5c1be0e2e88ca67bb6662af0dd8aec3a0bf1d694ad0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002cc357f400d7e4bb000000000000000000000000000000000000000000000000fb8f18074800e35800000000000000000000000000000000000000000000000173da133df54bf15600000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000660a07673fd1a84f3a3c125b433c49fa02750e69ede0796bd8d13fa0dfe21edf4bddcaeb2ac90c81319309abb482233e935f910839a00ad36195211d3af925ac6d5554a9a1ff6aed1bdc744ad06c89751f50e1c294f470e2a674eef501d4d58f31e58f7d3253c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041fe71565c19af6d38afdf5ea04d9c2125e6cafcd8857b29b078df13e2228ef229bcc4985398e5302677145083931440d058ce7484fa4d60aa950d6bd9b8e281e36000000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a5e9ebbaaa2996484fdfbd4cdc249b9ae8cb59eb0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000036b0aa8b0fb58dcf06b01cc107de4fb5a6753078bab2af1941466f4a14f947d00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002c6ace1b85f86abf0000000000000000000000000000000000000000000000004f423aa8725918c9000000000000000000000000000000000000000000000004d9c59c7ea54aac9000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041185aff0c0309ab87b5b2e41800cd7ead10d8077cce5c81e51fe4d08e600b93aed57a064687229fc62d0e6ff836d0be65cde4a6b2981ccd7358f91a3aa0063bff4e00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000064af54ffd49a84f56d3ad28d56f4f93547bf4414000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020f5df2d3987d26dc69d8b4d2279d27768e6cfef62053beac11f7e7a2f881045b0b853bac3d204b7114c37abc460452df29412d112b774af90114d37db3addca0f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000f52521a50fc9fd0600000000000000000000000000000000000000000000000000ac768ba2030587000000000000000000000000000000000000000000000000380c5a78f5fb0e1b000000000000000000000000000000000000000000000000d95867bc68fb726c00000000000000000000000000000000000000000000000da25571a2c240106500000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000590a3ed1a8e0b6b5e0a88ae0b2bf3ef09f95b47037f090a78ef09f95b424e2b689c3b22260472aefbfbdf09080bde19ca8f096a988c2a540eaa6bac2a5f09eb8a71217b6b2af8ef8e7145e24807c6862550a494fe662163e676f000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000419f7503b200861980b2a57a01b6e07504aa47d42422459f29ece068a7678454f6e457d99ed6992aa33fca38f907a4958fd04b54860b48a7c03e51d0daf6762845b200000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002097f3288e85426a6f8054864fa893542ed9678f000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004af680c71cffd2663e1647da00e46aa25cfefcf21a57675e407ec2ad9581732a00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000001f7529c4f53a977c000000000000000000000000000000000000000000000000cbce90ae87f9886a000000000000000000000000000000000000000000000000b03c706667899158000000000000000000000000000000000000000000000000091c8db78fcc8ffc000000000000000000000000000000000000000000000007dd0a24467d28ba330000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003b0a32f0ac91912af0908693f09f95b464c2b42eea9f90f09abfb1e2b6ad2ff09f95b47265e0a89af09e8aa4e1a08f34f090a8953512056245a37a660000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041fae2ee1ae28a70a4991f939de257c6aec65ddcbcaa50ffd6d82039fdc2eaf5ab713b6d3106e237c12309cd791aa2d39d60546a073c1eebe887c6009dfe0e0ccd0300000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000146bbb28b1293645a2fa222f8c14f642a50287710000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000016364ae5c6228150a1289c2b0b3dfd2e5e119747afa2a2309d37fa3cff7ae1390000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000e30f53f0880a9afd000000000000000000000000000000000000000000000000d26051bbcbb8aebf000000000000000000000000000000000000000000000000cb7db1b629cfb2e30000000000000000000000000000000000000000000000005bc6de85a8dc95ac00000000000000000000000000000000000000000000000c27cbce0620a4170800000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e558cf7138ebb829c59bd988ff7ccf981b81ccfeeabb1008f875d95a32efbda8704b984d3f6da7e58991251ed9f9aa2c3906a0a969c9dc4c980b2c884e0d81384500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c7bcd478e789a50b8c4db3e7dcb16fce39e3acab000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000005d3725c6d3ccea952cb621aca22533edc8095cfd533b91e4d700eff8a7defc8b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e338e8e5a0328426000000000000000000000000000000000000000000000000b6ac9c71f209353a0000000000000000000000000000000000000000000000022f0ffe77249a9543000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000370a13273ff090a0bc3a275be0b58b5076e0ae86792c12208eb474e942ebcba41bd7f4b1d08df4a8bc118709cb5124f5fa6af8a3db32f5c6000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041dc4bcd13ca66abe9e3727be3c144f73996ba34809102c4a822a07c81b69e218c9e5faf3386cea349632a43ab986db9b794e861541f8468bfd980f3bd47513956cd00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003b6a7c0c47b81e0870c3bf5f7057bb98ff40478a000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002008b1f32a3a0700684b00e84ba9a7d101384009df4742326066f49f9c2dac596e9259a03094650809f355b6e06f8b53a655aee9ad8ea78f006d672e3a8bc58fa300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065046a11e3868ac4000000000000000000000000000000000000000000000000e0e5e2fb770710cf0000000000000000000000000000000000000000000000018aa3b515ee13193800000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e919f9bf9ec713f5908468a50aac2000c0a2958e6dd5f71ca8d13d67328b93dd34de751a3f79ee4b6106775c2fc68332811e86cf8c2f82ac0d67ca2dbb1b07a86c00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000024b052d8cc942ec80973fa8f7f38bfd51f036e4400000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000206d5aa2f877802b99df1840152cf059eea097c9c70eeea1dacd9e53c712e7921117fa757636e6dd39c7c2639bcbbf691398a82986ff67aa05d80722c5b11b47b5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7b36d0ecf488b2b000000000000000000000000000000000000000000000000262a21ca3fc4df3200000000000000000000000000000000000000000000000c3a37bb9434ab395f00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000640a2f5bf09186b9f09fa9b27a50f09d99b9c3afc3b8f09f95b4eaac9635f09f95b47bf09bb282f09fafb43f2e74f0918cb712312a42e3e40de9fd215bd2fe6a47c52c454c628ad1840b61a5b5dc4054afcfe732ee3914ed57a14e64c6f2e8b296fefbbd87000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000411b2fbe9ac57cc6043a2147f2d3af3c948eb7817fa4d98345594ed5c6116230751d193de6d0d11bf407762e14ed5471a78369a8fca781e21d6b5a5fe65d3c43054400000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000084ff89a366337f21abaab8bcc8b0dea32db9d5ed000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000e89dc1284d2f1296d53523799e197060cc016ea5848796cfe4af42d4bdddd2cf0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000c474d0397608d3060000000000000000000000000000000000000000000000006e4e79b28968e0ec00000000000000000000000000000000000000000000000062004e18510be5e0000000000000000000000000000000000000000000000000a0baee483cfb03cd000000000000000000000000000000000000000000000009adcb54684b02151300000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000004a0a1b247d74c8ba61e0acb2603be380b8e0b2b96927c2a225e0a8815e7b122bbc2650944c03039ecc9f8d2a43d1047761cd6533c46aec0bea2b9cf2dc2112b3d17c2a4758940172a4f9a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000416379ce8468741fe085b056c3a51ba5eabc401817513c33c6e4c63eef86284d0a845373bcb5841e75f2b9cf70b96016e02632f3b111038fd7c5cabe2de78bfa4a7900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000120a72be0e5cc4905edb20dc9734890a19f7bc5a000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004837992ea3c2fe023674adccb8c24e2e1f2c720f8b85954ee20ca8fdf113f263000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000328969d4f358a053000000000000000000000000000000000000000000000000272f03ab32077ba10000000000000000000000000000000000000000000000002a33b32e1d181da400000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ad03d781ebfd7d8695f78fbc21d38c216c9bbdc78db0b1fb796d3b0f33f95eccefa6763afda04b3dc1ff2f2fcbcc3c8f614ee716e758e77f7eb6d0a94986c22f3700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003bc42a96aa95f321c817794fbb31cb3134a82490000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020039a895ab5e090e4450dde48a51c6c9707a1127cdc93837defdd3cecd4fb1e9d57ba586a5efe9e277c47cd8988f5d9f098d2ba23b9cffe64aa95b57f0265527d0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000cba2be3eabf36f5000000000000000000000000000000000000000000000000012a2be54d530e83a0000000000000000000000000000000000000000000000009cd2b02bbff9fdc5000000000000000000000000000000000000000000000000635be090454cb945000000000000000000000000000000000000000000000003e6152bc90eeaa94c00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000410a29c8ba223ff09f95b464f09ebaa1dd81d1a843f090a0a7f091b198e0ad80f0919991e0a98c7839e2b7821214c72957065ceead4c95d8a42808292986cfd8dad00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004109c9867013cdb72b04fcc0e5a15983e5940d06cd1dd2529f9e45f951826bf26f2de626c4e176e3b82b8997db6ecd6876f9f7e7be673db9d8ac417719f8ba01ecbd00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002e8597aab558ebb003858110eb738c2a45ddf8e90000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000072e5afc04e11488b5aa6ad3ba1728ccc6ab39cff7f862d29c5f5924d66328a53000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a31fe989c31f8298000000000000000000000000000000000000000000000000ab6cc1c43901b29800000000000000000000000000000000000000000000000d7f9488cb6e7ac7f400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000780a35efbfbd60e0b1845157335cd1a8e0b198f09daa9ff0ab9f957b51efbf9ae294a126f0908ea3262ccea04fc8baefaca0454defbf8b72123fedd3e2bc37f5f9ffd223126bb03cbe7d25ddbfe3260f9f6e69afef23ab36d0972338f49ca4c2d25bff8960d2750895fcdb481c0a659eedd9f7d258721e1f4a0000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c84772758923e56c06d19e44d55df07f4be75455ac0ed2b839b43b47b6f32a339b6d7ebd20d75a11a2722e27855176ab4143ae997c5065db2aa986eee70c1cef1600000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bda34b207e3343362e8a07b536af30dc2a4bda0300000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a9090a33015d8952e2b2e388aac76d9e36e21c9d50c8a064aa4d1841d2963ef60000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000193d91a2d85210af000000000000000000000000000000000000000000000000852120839f88e8df000000000000000000000000000000000000000000000000bf16a6ca2461e08e000000000000000000000000000000000000000000000000715e54b46e4d79a700000000000000000000000000000000000000000000000d8b60d2056c74ab2a00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000740a3070f09f9fab56eaa8a527c2a6e0a086c8ba26f09eb880eaa982f09f95b42e2fe1bd9b2df091b683f0909e8377e0aa8f771240070dcdd5d6387625b9f1be7553075a7e7088ca7395f6d2ad794651d3669bf6ffc4986eb436a0947f8a6ab4fbb6bf5a530a88b9aed129bde735794fd9f403f3560000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418650999497d2b16f0980f59c94c5477114723dd9dbe44cfdff80164d30cde5c0d169b4303ffbe47f782d2dad4318f8d20f353c6dd0cb88213350c42aae9d131f0800000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000cbac924dced22a56c18bf7d1a2f798830eacc259000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000002092d43738b9460f58a2769253e67789bdc27617e153a60eaabc34dc2f64aebbc834022429e34fe01b2400bcd02feca3421b3e21a739f4e7e65c9e36a58fdf9bb50000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007467f53cb4dab8990000000000000000000000000000000000000000000000006deb33a82fa3e7de000000000000000000000000000000000000000000000008032f210ac1b13a7e00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000450a0cf091b2922a2fefbfbde1bfb412358e2771a48d5a8656d28a709a10d55691eccd3f43f0aa2b6166c1424096e0329e19f01c0021ba0a8c8ddbb7313be10338bbc02c66fe000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c1af2eee1bf2f67ad543c5df56d029ed0b0345c22949feb1c38bfb83f41486413861cb34dc04fb35e90b9848a407a061cb94a2ec40edbb7616d86b56adf10f1f9f00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f38e9dc78bc1e2fee395af7852b1444f65dbe3a100000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000558918f2b88607662e911208f5bcc7e1cc55396d87decbfaa4d42c066678c9c8000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000088dd1842dd4bffe6000000000000000000000000000000000000000000000000eb12c4a2b86d5d5a0000000000000000000000000000000000000000000000008b5e732296ef7ffa000000000000000000000000000000000000000000000000687022343f03e000000000000000000000000000000000000000000000000003067a4d21ec6746c20000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004179e5bb8db5c4f3c27d4e2e26dcb3a110c5552211bf4f76110b4db26a8ec8fa4666c5d78d73d56e6ab282a1845928e63e4a064f8e2bef7010f31a76b12e2c731d9300000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009757095b95c9fb6a342f3b08637561107f5f47a9000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000e9528518f33d40edf420015e76f97351c7ac91e1eec57c4d007126347393e79e00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004edc16a4dbd92bf000000000000000000000000000000000000000000000000fcf4864e01040a3b00000000000000000000000000000000000000000000000a53693859cc9a02bb000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000390a24e19cb6e0a6ac5fe18e9665243dc2a5e18995efbfbdefbfbd682ff091a89bf09e80832f3f12119bc3ebd511771d8408d503a47342e6c67300000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041754e83b3f929dca4f6eb80891803ff63d2efead57eed54f9e2a3b6943b8a1330951057975d779ac8dbfb441ef9d11453291b1482d5203213e11094671f41100b5d00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009a6ecf4ed3b728638e0805ded92a5908aa4f232d00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000206cb516d0415e3eb15efd182b7a9a3538a582f5619975a75653e348469d5e7edece4ac15783cd6e07314df7ffe629c63183d5e13ce9a090c029adc50b7277f3700000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c9a72dc042d54fb00000000000000000000000000000000000000000000000029cd3d918cdcc16700000000000000000000000000000000000000000000000c16ce4d5a2887c82a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004131617ec7eb3a2dbb8a7bb72ec7ea84502946569477fc022e4874e2ecef8d7622b5d6bb741d138a043a118843fee0773cd2ae588b8bef32ced0877a19bde10b421e00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000818741c06e6920e328a011ad4dc7542ad542991000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000201666fb93fccf28c2bff3a17a28cc983bb7232cdc3dbbc4eb5e5270fe01cc8b0dca33c0f2eb4ad0d21b58ccda3582aea44c49f28eb831714d7ad5029ce2df540e0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000f2266f1df4cdcdfb000000000000000000000000000000000000000000000000f7997cadbd8e18ec0000000000000000000000000000000000000000000000002ba535beb66b288c0000000000000000000000000000000000000000000000006929c3c3f33e4a1500000000000000000000000000000000000000000000000019c4a5306c8494150000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000001c0a0bf0908c8a5c44e0a68c2667120db19cb04096949cdd40c24b371200000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041701df1d28444f044ae84ea4c5fa2a3d000fb873ed543893ecd94ccaf09f8943542d33c8d4dc49cc4671912c22dfc65423781efdf85a1e16461b8458ae5cfc1a47b00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000020f608ad88fc347911b773a10642b4c150b8e920000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002023735db0830138c400625d67e602335561303d420b644e7f86d428743692f9bd8731348a71547925cec7ce7351436f9ad4221d516691d893eb79ca19d4a0b95d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af5c4a6ef82537fb000000000000000000000000000000000000000000000000add28732185e1ed00000000000000000000000000000000000000000000000085acf20b6122e0c8a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418ddb927af6c3e798fd7fcfe7757b5b0b8a100d339b7d347d747f904dff1f5dbae54ff0cbd330f26dfcb345ec56fa84946cef2851984eb19ec4784004ff6bf45a1700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004aaff384df02850a6dfd52539b98095c0c47d73b000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000087b60f5b851a483224ef9a2840dd4ffac5e7c4d7f1f819077b360d55edd81595000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000525617c5284e7cb7000000000000000000000000000000000000000000000000b683ff26c896a11a00000000000000000000000000000000000000000000000d68e5aaa09cebb51700000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000480a1de0ac8f2ef09eb9972f277bc2a5efb69657efbfbd27f0918cac60e1bf811227c19348ecc0c043463b6f6dc6a1ddcf95c44fb0df7bf068717459999fb154c9fd8afc6b8df06125000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d7e32141437a8cc6037f42b1a80f9da1f41f61ca59ace7e7f28644aa0a0b9a330726e49e948aca67ab41f43e1aa2463636c569c05bdb9bdca9dfa5b4ca7983393400000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004572f3d3bd3ee246a4ebfe4aa7a76240780a6974000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002007cdb19ef568164c1d30a666fc215d228f9a7fb1a2c7dcdd4de5f54d8fd327cb1ce5bf3ace205ec1f3716ae48cfc95e202546fc93530fc013fbcf8b1af5f65a70000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000af3a92be0c35919e000000000000000000000000000000000000000000000000ab6a69038008943f000000000000000000000000000000000000000000000000858c6f1bb00e9432000000000000000000000000000000000000000000000000fe5bc2b21dd530600000000000000000000000000000000000000000000000029778ee6d75bf202900000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000007d0a34c3aeefbfbd64eaa8997b46f0adb6b5c8badf8a2e26e2839df09f95b443c8ba3af09081882a24efbfbdf096ac9a25c8ba78e1bd9d1245fa070590f1a3ee258c4543bbee5e12e22c20a7ba3660b8fc57f9dec27bb601ba3ee2c88cb7af26827c9ed90904fb2d6e097e529afa4c7ac083571e43f006d7a23052ffdddf0000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414a1872c853c0c3df24c2b6033aaca784a6f675b2a3e1b8de170c8e9ec512535f60699fd5ec5f86bbd6b81f399d383fafcf2ed40db9c90ec20f37d1e381296f679200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b671c18a34d66440e5f6b67d7a422af6548e707700000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000020f478ad570b25ed55f13f9bee7e3a98e641896f71d7df9a1d9c16b2be3cf0558a5ff6092b7abdc9872effb98673aca264ca72982a6fb1839b32f2b5a566e8a91d0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000ef8ebe6fc4c5be990000000000000000000000000000000000000000000000000a8a4e130cd3bd6e00000000000000000000000000000000000000000000000065ebe9ad471bfaff0000000000000000000000000000000000000000000000001dfe562a9df6e7a0000000000000000000000000000000000000000000000003fe13de570d1a687b00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000008b0a42f096ad99f09f95b42c5cd1a8e0a8a1e0bb80c2a5f09fab96f091b485eaaca3e0b59ef090baadc3a7ea9f9178f096a9a9c2a5e1b2abf0919ca6e0a69c24efbfbd4c3c1245c3a8d18d675e9d944968ee19fc6c88e259afe1abad2c9424c13e2392f391dd8c51f8a43c6cd0c524657401de31648ec4151b70f559ba00bb3ebe33064f5fff29c96d249550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d85257b98c1c204bd980ed0577f74ce8f7b89c1959413c30fb2b45ef5341d3d01cfdedd285fc33e8e5da66e8d284e28b438fe72421f454d9a4bb49e980afa6ffce00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d5a09fc40bcf0e0f239a0c03830cf331a614d486000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000002025bf36c7898e0b37aee134c543ce3bbf2ba2f9a35cd1ad7d50e0ac25f765ef2e66a91897026cf01f26f7005cc0098fcdd17047392a9c96af4d96e6957a25eeb40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000b67d2094b971315f000000000000000000000000000000000000000000000000e43d3a4fb0d6f3ae0000000000000000000000000000000000000000000000008443304823e646090000000000000000000000000000000000000000000000007f3677d0e805677700000000000000000000000000000000000000000000000477b0d5630fda69f300000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000430a34f09d92bb696057f09490947b4451f09f88ac2a5ee1bfba4bf09eb8bbf09291b026c3a1f09eb99960d1a8c2a5f091979b5ac3913f120bc70a32422c5de81a64d6a30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041bc01c3de852971b55211a301a56d13baf3b73d761954f2d7164d5a52371aa5140282afdc6463529e97d9e164a025ece88d871d072cc6e29f3c925954b99c1694ae00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000070ea50a7dd29fd1c95abc4059f405ec317c8a99000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200fce9e2d865925a4ae804abb7cb90fd276a0c23fcaa85d4c70c0fdeae6e6d259a031e40190a18e640af1117053eda7052ceba96f2d6f4e41f4eb42a641ec794a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000d00fbeb7ccc013ed000000000000000000000000000000000000000000000000b786a6118945f2b70000000000000000000000000000000000000000000000004c75a7c1ddd99fe600000000000000000000000000000000000000000000000044d7b556f570ed1f0000000000000000000000000000000000000000000000083d3344f5f9603d620000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004186676f5c77c2d8572114e1dbf87d314d2c994d7fa842cc5d92eb0a0ddddf06f7ee87d2f0762a66a6bfa10c98982ffead02bf9b69bc38f1c1cb7932a2ed3dc474d500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b83f524624df463c0c997fd7f721bebb0f1568ae0000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020defb4c2f41d50ea228b029dad99c1574c3ca25e34d8a0eaf0ab33d3fd70199120900a14cc78eb5cff9c71527b19b83dee4b8701e9128d6f3b7e9d81cad64f32c000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083378ec1e718eeb000000000000000000000000000000000000000000000000c7dddb2cf9fc8e4200000000000000000000000000000000000000000000000bfbcfea832e6725cd00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000710a202e3fe2809af09d8ba43b2960f09f95b4f091a6a35726d1a8c2a5f091b1833c20124de7c51bef9d3b762c7e4bd519263982d79a2acd62fd70b67d21c1ab16f9b3b18dd4411c79aad135abcc7e94102ebb3b4033d2c8fcdc37e739484436dfaef72d2faaa7748f849d65d510dd6e97e80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000417c1e31bee8c1d1ff045aded8170ab5584187028f33b8822f01f5934113a9ba8c260fe4448b536a2e7f3903a60a93ef1e975e57611f7cd9bec0c3f15fd8dd4e6aa900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b4cc4f9caa82e4837624b8fbbbe43274efc9c30a000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020dcbe509451d977e6dc4929580bfea4b79acad768990e5546bd9cb620d0f023ce66f30edb7041da59bc75f3616d972581019ef2f2eb2551f2198ac35d980f94af000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd756f62230cff6600000000000000000000000000000000000000000000000088a33f3ff08791cd000000000000000000000000000000000000000000000001d367ea7725cee09900000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005a0a037b472a1253fc050ff21bcd213155dfe2090e981cc97f7a1c9371673b6220a5e1a23d24bb979763fff8b5b6fda55aa59a62595130fc92aa5e16481226ecc8d349bbd442c85b7a17e3062f8535f81ec9cc85bcbf53faa6a3d30000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418848cfb9b72d8496e5ec41e9960430d74e898be27d63673e8d250534c0520cc2d95b33cdc80f4907e31c92671133a183bcea41909efaad8420b52d72f8e64ee27600000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000011a00870cd5108472efe306293423a36ba4326db000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020d6e16636bb9e10b9f704559e652c5142b1b20b483a51c50e336ad6817bbf9ce0c5d2d6a394fe659f8b19d34ad209fe585ba60f0aa0e77068c38ce1a0275abe0d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000024c9ae6612bc10620000000000000000000000000000000000000000000000006650b9087c228af200000000000000000000000000000000000000000000000025f13d4b3d8777970000000000000000000000000000000000000000000000000ed9d46778255c97000000000000000000000000000000000000000000000008cdfcf2818cced79b00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000450a073a3f5cf09f95b4123afe0a6777073dd39dd8704806f765f717606bafe1985db136e144b84d5198e7c8b91c1615a4dbe0f8ab1cb48b76ffbb3084c07849e0f65956d1ce00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004110940741de6f1585ea225137a68202ae1e7fae39979594115bcbd480253f9c91c1c8e7e4429cd60abff85b5c9a44b15b068b779aa6960b1ccc4d5d4eb9d391fdc200000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000077de5ddba8e1d119185456504cb7c3f889f46c1d000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000059920224c311d41b947575d1bb4a5fb404c903adedeb39393ae76e0fce856b6e0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007580106b3d82b9e8000000000000000000000000000000000000000000000000828153f74580cb3c00000000000000000000000000000000000000000000000782e0be1b87529f6900000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005a0a32efbfbc2a26e0ac90e19c8a262460efbfbd26f09d8cab64f09eb8b9efbfbd25efbe81efb78f37f0918cb8f09f95b47be2b9841224907478f29d419d08c45cbc988a96f1bae9813446b72988800b495880433598fa8f1b99810000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000418610d0b72481e1d00fae5285f976115ac6dba813a63ba0874085569b9ff879952baa79d5d0873e45d9716327a582ab9e047b7e3d0cf5be2f7478249c52baf07ab200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000a4254ed4faaaf8f53efac2906591019ae48753e600000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200ec19df7573e28ca985994465657897db6ded8b86b300d0f64f0094029caeb3f8775d68f3990f8a8944edad4d1090b80ade4be74098e4547f606fbad6bb6a90a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c8123eadbf29312000000000000000000000000000000000000000000000000efd042f5f04caadf00000000000000000000000000000000000000000000000c4dfcae024b0eca0500000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ec9206072638abcb1ad2449f79e83ba3a356d2a20ad91484f36ea06336e57398792f7a3da02c570a554c875905debfecfa3de6fc3fbd28a3a1a6c5d2c0c08d480300000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000dda896911831d5b033ef3680b46e7997f42e8428000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000204f7978b4f44c1b60346eb217a5e5e03ae4ab54d5f8a3a7ecca1d23b3d8d603c14a05bb14eb32bc7d1e29a0a1b03712e6bdfed7f05b6d61a95ca8fa909c29bd630000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000dc7f33d47b766557000000000000000000000000000000000000000000000000622b4e1c3c6acbfd000000000000000000000000000000000000000000000000e9e8c18e61104b0c000000000000000000000000000000000000000000000000a2f94c83fb50395d000000000000000000000000000000000000000000000002f73cdbaef5e5a50d0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003c0a1ee0b7824877252460f09f9fabf0918c90c8bac387f09f8cb63a3aed9fa33d121a2ac54364ec3c8041f96e49154bf65a664a4f771b7a7a4c768d5c00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041a112a3d23ae362129199c1c932b471a62a2fa09c2255efdb1d03171152c6484f124056491171cc0a8eaa3643e0662dbdcc3509318b828eefee1e16ed953999878400000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c6f936b59086ab5232dde1ff78563c3f285167d0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002025a74ae0088fb458e65e00561f887f1f78fad4e3a2ad4c82c2a5c39f46f04e0ae09279378e638c685a2626d8a00ac071e52b7e0b539c74cd4b396607e7ca909000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000007362f79414ac867f000000000000000000000000000000000000000000000000402a69eae936ced30000000000000000000000000000000000000000000000004c256f5e6f56f30f00000000000000000000000000000000000000000000000016d7adb9e7dbb3dd000000000000000000000000000000000000000000000009bd930698752de0c300000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041ebbec26e0ea88ff5b3a9125211bcdb68006bbea2e24a50d55cbb32984f973b9ebceaab02e8db394cf0536fc6d53254dab880b50cda6bd496f75c2e21dec070956300000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003a2c03fd56c0488c6143b87c66b90795960efdd4000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000202e9d84d05deab477e4c03f9c4262cc487cd64ff4f59969594fc5efd9350226967bfb6da31f83bac5d37255b560506b1c57d6dc01f1459389e977bea6644d1f1d00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000001ecb1a73c70e4c3c000000000000000000000000000000000000000000000000f61890903461b7ca000000000000000000000000000000000000000000000000d62ad03f75970324000000000000000000000000000000000000000000000000a4dc3af90cfbde4700000000000000000000000000000000000000000000000404df06b0e5bcad500000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003d0a1e242f2e354234f09e84b13ac386423e4de0ba87c2a1f09094a6f090ae9c24121b026beb7ae4a58a3467e042747e4cf039e48fb68ca485329f8234ed0000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412cb377b85ab916c5cbebcecf3696c4d9e4d7927d1995c89fcad70d160688e0f09a2f4fa2bd8baf2dcdc705279c7da0458d2760250f3d9486999c22c0e2faf0948900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000086c71161db04bc8cecd0b9b3605c2a8951a4b69000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002041764c10ebec744be8f5c0c5cccb623881bac55c22d71947dd9e718fe872d8208f79f977d2a21ad19ba946b6265a6c28ab2867495a0d308c93e375dacb7499e500000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033e2ac8a30a37dde0000000000000000000000000000000000000000000000006ae60b4736a6a44d000000000000000000000000000000000000000000000005c2b6eb3e095f693c00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000750a2625efad81d1a860e18fb8f09e9fb54fe0b58ef09eb9912522f09d929f223e3ff09daa9d3cd1a8124b14be0e0cf5dcfe988c44fefaa0cd2d63e1e8bd59e0ba0e787282f1cac21cd6a4ce0cc850237e3c0aba8b415639ed9958f6e2d7b7fb10535fea65257a4debcaf3e0269fcb6e0f8d2909bbd5000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004194511e59c9a7ca61995c399ff64883f350b2dd4610d952a276e4f6baa1e034cdf20f1e63ba87ef8500ed07c00c08fbae977be97af023dbf7f138750f712b378a2f00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006a5057639250cd79dda2ee23e2a7aede2f0dc696000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002006a5ecd75c6c4d0d96ffec3ed0565ef281f6fb68d9e62b159350531fd4e7a34c451d9e54fc98894a17cc962c6a65e0a96fb33527b049e8236c314ec577e91588000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e6ce1fffbb4f9fed000000000000000000000000000000000000000000000000e980f5451af78407000000000000000000000000000000000000000000000003d9facfc68da723f900000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000630a18223de0ac814dd1a8f0919cb7242f3aeaae893df091b6a16c124714861ac8fc3840c67db783d685627ec208f7c8945131dfa1156d118cf845d862905d3d4b05505a66d7804768b4f49aaaa16210016d5813fdfaeaaf08ef7cb1e78c39b2680b83ea0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041126050e25b6c4dadf21d341b507f4818adc319e99669e7615f61f89df09f07f46740c4298e10dcb9fe99930d79c0b97344fe3fe16c2147b25841124391e160d3a900000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000094762b01bdf31964d11fad3a2e38942b4c767369000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000780680f6ea100e55272baa939630b400bc310e78b1b69b9f0d25956b143ba1fe0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009ef41d666798be2e000000000000000000000000000000000000000000000000916cb57d07aae866000000000000000000000000000000000000000000000006285a63890c65b6130000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000002d0a20eaa28d27f09092b324f09f8185ed9fa3e0ba82e2b7943ce291883a5ef09eb9b71209c0e91f49bf9af40faf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004146b4dab58256ddce346e865bc95f7fde4e851f3e0b5abd041b68eee6e58e1e47197e5a6e16515aebc45db3c8a1837a7b392fac6860dac587515310fb8d9eb2f06c00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000617b47bcea093cff161a6536e7aa99d95d9df4a6000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020d217d090a552c9c24ab353b763bfb9ac220d1ec81f8de63e63e5c0267f6a2043d08c45b83293c3a9d6e57fe76723bf11732534b8c005d7bf79b09faa1746238d00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000009a0b3a38e339e2cc000000000000000000000000000000000000000000000000681f70b0a5ebc440000000000000000000000000000000000000000000000000232ec44c88212f2b000000000000000000000000000000000000000000000000ea8a163cc22e053000000000000000000000000000000000000000000000000497c969430b585ca8000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000370a1d73f090ac816bc8ba253ae0a79de0b29ef0908f83d1a8f09f95b4e0a79c12162542a3f15081c0572533cc81dc181184d46a66f7526d000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e6a4b4921db15f58d07e05abb5b635f26e3f2f743547675896d1199aec053fa5478d5e8cee93f48656f796a8670884bb0028490abcdd1d617b7a12a986802a68f800000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009c1c6d943f93709c0b208223b43c25c289d6ce49000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002022f24a5b0239422b25020de8395917c6eab75b0dc4484ed4429fe5c8f8aeca015a5fd83d1b37d5d3f14f5dfbfacb080277057b9565b0b37571c56901e4357adb00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095313aeeb1769e7100000000000000000000000000000000000000000000000023604bd79600094b00000000000000000000000000000000000000000000000bc013e5f5d8b0e34c0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004126ab128a0709f9cd3bc86a88221d63eb4fedc951c689a2e5c419a57ecd5cc490d23122def85c51a33860a7a34113ae749dc47f877e1e1741ff3a36e59f8738d18000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000043f654addbca8e3e8e49ef203ca24981dafa72dd000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002003106ef75daec7a2a8afeb4ad41fb0755da80c647ec4fa3fffd1859b02844718c551e9cbece4260b8fa289bc693d311a9e4eefd161ecbf3dba211b4a68a54980000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000631d3ecfb619822700000000000000000000000000000000000000000000000064159046b28b63fb00000000000000000000000000000000000000000000000d5fa9a7dd301284d2000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000417c2864601e167663746b9df6540e035764e016f5f9158ff7f11039be5c3af2a7db4622953a532f0781e102db503596049058da8297ff613bda03092cf6c67cfc0d00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fd28a268494bf4d3053fed55e7cb3ef30f136b55000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000e8403a599ef6315fe921ea3caf0965297b9a9a000726d6a83edcea7013597807000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000909d9a786f7c0937000000000000000000000000000000000000000000000000f2e47f47c3026188000000000000000000000000000000000000000000000002360ed714ae59c46a000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000360a243c244d74f09092bbf0918289f090a8863de2b68c5c447d2569f09fa0a7efbfbd225ac2b8120eb3ec03eee20af9df348d5a9079d000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041be09da84ac542a472922384a111f4bdff76a189967b7b450249eaeb0e8bd2aa9a8c2240ece5be492775ba05c50a2be22a97f350340d7d4e76a29fecbcfb57ffa8500000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006bfeae39e5606085a15125969fb40847757abbc1000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000007e9976678a417f0da7d49db9acfe40db3804a1e2ed39cec81f8445e47c0828790000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000df2240e607f7b932000000000000000000000000000000000000000000000000f3889c451dd96ff100000000000000000000000000000000000000000000000006e4d713a0a70d0e0000000000000000000000000000000000000000000000006ce9331d17b7d53e000000000000000000000000000000000000000000000005bd0faa68cb1124ce0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003c0a06f09f95b4413a1232d308e5d06729ebf6f37a1885e64748745c020dc8176327d7eca1ec3957582764d31139e138d113d91c2d0b38462bf611b63e00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f03036216532285e6a12b90d9bc86e4726e420b4cf553245679e5f821a4ebc2ccf5dc44f73d39aaf771495a84e924ea3845de6c308fcb79b589c2c162139e8adab00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f798c73686159dfe8e675b9754a66eae3de5d3cd00000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000558779ecfad04fef26a021a5f09e4215cee2655b92b89a06d498ed04512bbf6e000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d9c3aff88ebdd6120000000000000000000000000000000000000000000000005146646338fb15dc000000000000000000000000000000000000000000000001153509694ac79f9100000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000007a0a26f090b2a6efbfbd5c382a60f096a78e3e2654f09faaab2660e0abbd407bc2a53a5f4c646c7b75125080be63f7f0287fad19e8f636bd14be8d9e0059ee9f3e01d4bfc6ad02f0739f9d26c5abf9aec9134887b6986982b177491fb791c6c72224c07b78318220c1cab900f9914cb056b4f7191dfb171ce9482200000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004186a2f7f95a0edfa34a5cdbcbfacea51c9c25ee8d489a2ad252903c8ecd6ecba2c5493c764f2c25cd92864392e77926d41c24cdd4e73f5428b9a33ec2c54b5ff61900000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005a9421827cecb706c777b7e7bad4e3b756f7d352000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000020e9f71c1a90a24936187cccca2176c6fc00a8b01541c1eb5062b3991cbce613c3f458828290cb5af6208027f55fce1929a8ab0ff30e41ad56b5ebeb3c65df54e4000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c9e481eab6ee8ce1000000000000000000000000000000000000000000000000b3219cc86cc253ba000000000000000000000000000000000000000000000003c6d71d024e468cdb00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000460a3e2225f091a782c8ba7b4425de8df09f89807bc2af2722f09fa6ac26e18e85e0a987e18ebe2222e0a6884fe2ba9154e0a8aff09182bf2ef0918a8a273d22641204d5bcb46d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000411713843cb69e77b1010d35fca49385d7fb2bea103a975d87ebc6619eb5a758ae4ec8b1e96e7ae7f65ce44809bc0fabd7ce395dc3b240ffafcded7361a37769b65a00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000095965b9dabfb78ecbad5f239f4183e41e1ddb497000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000005beeade8cda1f5eaa4cae342097ee2f6fbe243b27ab8ea4b02e8825c12896763000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000041c293026cd6b20800000000000000000000000000000000000000000000000093b81cfc1a4dc98400000000000000000000000000000000000000000000000076d46d3c98de9c1f0000000000000000000000000000000000000000000000003beb4e7b0ca6a0ba0000000000000000000000000000000000000000000000022c7c1af8ecfe3c6700000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041a029ade21d9f52775e388e28f1411431a6bc5f8c43dc47f1529bc35642d57c0fb20eab6e009fa886cb6471d555c35ac595fc4399b9f2919986c21a7607a7d583fd00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000088dbc30a213e4f16b475177e79cca12ab71d268f00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000201097fa06b19025218278aea3889315acda6ca49d73ff790facd6483fcb904de3d570e51d09f0bcc337564c397b588d020b3fa632191c06e4a976580a236c777f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bdc6907fbf012e80000000000000000000000000000000000000000000000005433d4c1d01dc932000000000000000000000000000000000000000000000005bafb6af4d4b6019c000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000413733defe6190501a8617eb1b7c959a22b4a6d9ef31c19534385b60fe96209e3b9f4a53b972420afba4157ce14a99bba836f6ff3bad2004e0438ecfb47d9b831a1b00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000057e085db77217e17655a938813050e94133c1fdc00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000361973fde09fffaa8e1b435d393860c534f747e947b8691bba0fea528391805200000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000004d3082284985e43b00000000000000000000000000000000000000000000000098f174dc72a5ff570000000000000000000000000000000000000000000000001a0c827f848d17870000000000000000000000000000000000000000000000002c764bd9f59d5caf00000000000000000000000000000000000000000000000c6497ed2ce7a0d6f8000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414152bed79f709dd0a5d13bf39c7034f0c090407c32c2feb790e21d8bdab53ed7e7e056a4f451d5709399ced819179215b8d59700b10fd92c4aa03806e49124f56200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e7d5f66a07213d654d81354fac32f6cb7d2bb6c1000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000ec8c9f1fa9eeb782d2c853af8800ba5ae29f56fbcad7c0fff88b05e5e1f4bfe40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000e3e5d04b8d4569bc000000000000000000000000000000000000000000000000d5f3d554f96bc457000000000000000000000000000000000000000000000000bbb28279afa5a98b0000000000000000000000000000000000000000000000007225a08998edbf80000000000000000000000000000000000000000000000005be24e336ea8de3b600000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000004e0a085c4e2ae0aea44327124228d283e29e9b27d3ea5744e4905135565360d947f3c6c35a0f3c861d3bef255d8fea347924e191c84f96dd10d51af612519a02f97b2c23403c95e24761f3de659d680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000419714c373f4d4dc8494e1dd745a36ea2cf64956beb6890ea293e6cb6f09226d6a84b616f2f1256d4e749e784f82579353887f9ffa6234d9637052f3eb07d6df3f0300000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ceb8810595935f78135682bac283b996a2be98240000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000088cb85769080be9b2e32dfb4fbfa13d2e1e216b69b94168c3ce5d81907d940b30000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002770de060383681800000000000000000000000000000000000000000000000014fd64fb642a943d00000000000000000000000000000000000000000000000d5af20c1cff6b15d000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e59778f1766734416978fbc717355991630a0ee1e2563aad52a27724c77eb28dafc524a130ed407f895775bca40d4d61ab12831bc9e0e1b50750042edbe8500ac600000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000043ef313f8641aad3bf1dd29d3e09a2f288184e400000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000c00f62788f1d8b4db6054197236728a7fda8d9761e4c3d9a7976a95b91d196390000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e42d12f42ef9db5000000000000000000000000000000000000000000000000c605b3f45115c1a600000000000000000000000000000000000000000000000451df80f4d826cb3b00000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000008d0a35e1bbae5c512fe0acadf0ac96b5e19c9f79efbfbd247424e0bb8674e0ae82f09093985c67f09d93b66d7d22e0b1882a7860f091a48912548212f8fa19e9d0a26bbd8cf064a4dda2552186e2d821512f006ddc9ed07f4740b847ce832d426905fdbf9ffae8b2e49103daafb9a50b171f090839f3736bbeb7a5b415d87053edbb514748644093ec1165c98ce700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d6498689ecf7e831174fc259e582f8b20b6c642ea25481b6e2e5a9d22330acc526504512fb82ddaa3f9dd9a3254025f0d9fa434d602777b0fb63eaf6631dd7d14b00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000066bf13ea6c9a44c2958f5b149bf9c0260ae7fdcc000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000453f31ea03bae0a6bcebf0dcdebf90d3adeff6ec90f0cbdbe9a6fa16f1043d0f00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000008119b55cf6c122760000000000000000000000000000000000000000000000004aec526b336eef4b00000000000000000000000000000000000000000000000007cfcc93c518fefc000000000000000000000000000000000000000000000000e3efdb97c85b61df000000000000000000000000000000000000000000000004b4885aef795d8a7d00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000580a2e3d66eaa39826f0918d883ce19c93f096a9bcf09eb8ad2464c2a5c2a5753143f09095b937227b7bf09d92a55b5d60122632b494dd9668e4098a5bcc3ebf692e99e7ab3456f3e7a9a1205ca4db6b7ff74a69862582a2ef00000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000414802da60b0c5f38edfafdc82e65e8fbc0f3c6b11442bd2b053389ba4e5bb3cf9bca336788a37890c9e78531313b748d82a9d9a76742780fe72568943667b732cde00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000550aa4ce719048743e1958edfe5d9310ebdeb1f900000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000002059f5b0f89daea2f77fb39ee91ea0ea2c71e510c1c43d7903ed3802718fbb5006f014cf6de01c1d94ff6e341db26373817ddfb97b5e1e0e210a2cef9497a549500000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000efb8774955949421000000000000000000000000000000000000000000000000ddc621e3d122c40600000000000000000000000000000000000000000000000091a0a950d0a861c20000000000000000000000000000000000000000000000003010eaefd7e86bd100000000000000000000000000000000000000000000000cfbd059e527326d8400000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000a00a4775e0b58f4de0b7b23feaa8873f48f0919a8f78d1a845c2a5f09f94bcf096aa8827e1aa83f09cbcbef09eb98b3b7bf0909eb2e0a787e1a88af091b69722ea9f904ce0b7965a2e251255c4f162cb8dca96016b84c66fed1523f02384a70255f0e64cccb5aed93d6fad4eb835fa424c3a76fb8ab28105356a867dd110a4084dd42a12e923e2edd5944db68f7af6940badaeef616c8f798301392c1093514bc300000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004113bf9a423c7029f84ead72a1646402db77db2997399f0888e34aeecaef306e6a3800f61f126617a8088fdeeb704f54aed103549762c48036c47f4980e805a1b63200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e1fce388ea0966eff22120a1c93ca8b30cf0453d00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000538b4030fef34c241d88feab67331c3e3c37cc8e63354b65d50500bf2c06a61a000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000725a139f1bb69dc700000000000000000000000000000000000000000000000011ac98806fe3137200000000000000000000000000000000000000000000000145cb1a40f56896ac00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041d1a43ac23a97c4d7a247da080724f2ce25ba67fec0b0afe43bc58536d84ecec99e1a724ed0bd4c02afe836035d003af86d95ff6ada68dc7e2fc465bdb9a2fcdaca00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b0365f75755db4b1ec4e99f102602245bf3e113e0000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000020145e8be5f14caf92390ecff54355f5d1ebbc72e1532218bccfbaf541e8e5bb3c54edcd8887c28dd2892991c2ee3922225448f020e7078329aa24cd44616a8f300000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bdfdc88d4949ebf000000000000000000000000000000000000000000000000c8f313392fd9e4cb00000000000000000000000000000000000000000000000b8f4f2bd3c7ca3c6400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000710a1d34622622f09f95b474f0918baad1a8392fe280a86fc8ba4a3ff09188af1250b2a02c4b9d0888cd4baa0ce6d478dc1df84c9077521dd78cef51e9d1402b1714ead9d777e93015900da4a0b4b39329db5f6096e445f05b605a995cb80073f6744e18f68a1af27e84d18a2cb433626118000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041782a02b4f5078d3b6a37243a59ffd88844b9a087d7e14c607b4074d13c31bab80e6f2e44c68283f961db086e533ada91cfc2ccf795da0b12cceba0a01aad76fd5700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000007f12b4fa45a07b886b122c4a21ca06594b80589100000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000020070d2043b359e3d1699efb6ec264aa23b3c31f140a947dc41b6701435daa5e11dd9c482ed01e1e891cc563a214577de3c4b5dec37ab48513b539a242da5769d10000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000c12390dc11f4d4f80000000000000000000000000000000000000000000000007c67aee037a3a85f000000000000000000000000000000000000000000000000d46aaffeb717c17e00000000000000000000000000000000000000000000000005b76962fbc041270000000000000000000000000000000000000000000000007990fcb3ab082dc900000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000890a362ae0b587e388916025e0af812442efbfbd435a77f09f95b4e0acbd305ce18d88273420efbfbd5169c2a6efbfbd4f7cd5863af0ab9eac124fa6a1470bca304fa5d48d0dc851feda0d03c3b93ddb1f760677c39f5df49aafb518898508adc2f42d67a5b73eb522e3eac08c700faaa5807ab085600aef946b1cf2c4b2654ee6994e4023c7c7e8a85c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041059d3ea6d3615abf46695b456d229388d0c28d2f717483667471220618f4bf6a88857e8b091982889250ed30794c23cb0ae249791296bf49bbaaa4d08a398d478700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001188e168d9b0e3cae5b606a6555c94381f4e38ab000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020a94cfad69b6349ebd5f2e9b7d84b66f93838e5cb43897a9e3ff8e99dd7fa9f73b8c1fc3ed761092bc55132c786228bdc163f59b881099f1a7ffb2f96ddb8e66b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000001b053a651dcb1ae000000000000000000000000000000000000000000000000ad92ebc69e45a09c00000000000000000000000000000000000000000000000063412d8f912f1c80000000000000000000000000000000000000000000000000628c2e628b7d40be0000000000000000000000000000000000000000000000093bf0cf5a57a22eeb0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003f0a393a2a30d1a863f09b85a727f09199a33cf09f82a6f09095b2f0919ca13d3cf090b4b122c2abf09183955fe18fbbf090a2ace1a098e0a8aec2a51202701500000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041e47217cdfa6665e92931688d701da6221061e1a46d30b5a1c6dc5fe77fd56bea8d65ccde0ef902c5d6f1a17374f1284c065a4e80f0ba6b5b5ebec0d94f9e1021a200000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003bfacb7b049bcd3d53f495f736232c9fa896f3db0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020a733c75ba321807fb4e03560672a0c0553c47bdd1d482e68135354fa6c774e15fc7253dd33c0353fff23057b538fb3bc1920b68c46a31ad3df7ef65e299b9e6000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000005145ee0ee3e473100000000000000000000000000000000000000000000000009847ddbc75ddacea000000000000000000000000000000000000000000000000b3e7b4682af465900000000000000000000000000000000000000000000000003c7f6e22b2fce7a70000000000000000000000000000000000000000000000061e092c7b1f400b8a00000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041c6ba7987fcc68c827cb339c1373143e2e0c53fa977438bcaa4f82e5fc426a00b1c14e6cb02b10e0bca928dabe93b34d3c17d576945a3e0922483fcfd3262c9d59500000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000008ff472b5ead546f49b66bd6054503544fa9242c00000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000204d0a17874a31b61c6671c3c35f7a117fe1a3301ba301b627a8460cabedadf7abbd95baf18d0a0d9e89360640571ff44dcf36f42dad80afc6a75c9b13b5571d52000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000896e47eb6d653fee00000000000000000000000000000000000000000000000043beb8700e964df30000000000000000000000000000000000000000000000091134fd84a7c7eab10000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004109f728567ca38cb0829598001d337039cf304bdbc5d82198b98b5bed1d557d40dab4453f95f933b88ebea6bbebdc1eeef2ad05b4b7be95268c3f0ec924c08b06f900000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000016e0a98804cb24e2eb54c3b9544e779031a1635d0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020705ed901df4e5def3b265e349156b3212befb0142d3c4eb0897edf61f099ed85556189ce3a012c1ef665cf5ce259a18297fa38c51bb508a42851a4a349a4654f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c9793cf1ecd4d640000000000000000000000000000000000000000000000009c4fc0145b8f94790000000000000000000000000000000000000000000000082a244469b4f3091e000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410356327fc9d5bca4cc01fb7909fab43e54b3644c858d212bc2a8be39908688bd0d3d11b3ccd880958d0c4bdacf44a0024090d3e65d597d65af5bf7f60fcf5fe4d100000000000000000000000000000000000000000000000000000000000000"}, + // Within trusting period context + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000083ac84db2dab33f032e2992b7a5d9a1589ddf152000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a65f3133cf88e4ee2e543a9e66fcecf6782d7305614d6925e647d60ffb4c7da100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000008b046776e6935075000000000000000000000000000000000000000000000000b4c66aeabdefe5a3000000000000000000000000000000000000000000000000bf58e2472e75a657000000000000000000000000000000000000000000000000091c2a1ad2559f10000000000000000000000000000000000000000000000009f2fe597da43b4ca80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000007a032211ea3cb203800000000000000000c2771393dd930c70000000000000007b584f5100afc52d200000000000000018bd9cc6f0c947407000000000000000000000000000000000000000000000000000000000000004114a889843f1c39275c8f77980c5df6605a2bedef779c85853e3d463da4667645eaed09efc734246dc7472ff0e7e6da548eb1359d1804b09c96cbdbb3983105b31800000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000571c8a49729bd690ffedc39f64c49873a6b97fff000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020eb6cfbc67c768a767b301fc7c56bd1e00d2c27938caa637679ad0eb71843ccf6f4cd8c1535037eec325fab2398a69f1640e6abed539a84fc8321ae63b21dd94c0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000f42473079839763900000000000000000000000000000000000000000000000075a04bc7d7828eff0000000000000000000000000000000000000000000000007d3ad4260617bc0c000000000000000000000000000000000000000000000000151e2aced4bac8b5000000000000000000000000000000000000000000000003942f6c6f2263656a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000076eee25fb522044d0000000000000002bc5ad2d953a3630c00000000000000045822c0eccbb1b8c7000000000000000c3322e43b9520f0fd00000000000000000000000000000000000000000000000000000000000000416a59e67d87a1c6d21000f0fe3ea849f49fae8a6661269223c96a1f9b27b0fc18ad072f391e7625d6f9c03d88f60e11d086bd84fe447bb32ba932e18ce9ef804cc500000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008d95d1438269c5b2c0c74a092e74962b324d5739000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000038520a8281cf54e0b98bf1798d4ebf5458bd7d803b43116656cc168f9354c17800000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000002ce5030b7bc896dc000000000000000000000000000000000000000000000000a589b51d88a0c7410000000000000000000000000000000000000000000000001682c393551e8462000000000000000000000000000000000000000000000000e589fb2b6e11cd110000000000000000000000000000000000000000000000041ce84c7dff667a090000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000041a983c0c9f36e8db00000000000000043f8a79d211fb599d00000000000000004a7586529050e5b2000000000000000ac52b22bde316733b00000000000000000000000000000000000000000000000000000000000000415ee5744ebd7927334b608a9f2be568794b38c0b42eb4cde9cd67b73531dcaa5bd54d912ac7a0aa248382ba2a36b0dfffa4aa157d307dd2c61fc0556c395a5c46b000000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bea86ded53d9cc51225a97010fc9498983506b0a00000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000202bea087b73ab2d0dd873f5c46385baf45b79f537fa699042388de33be93cf0b927b88faffb215b965a49d8c4b1c0d5880581994cd29fa0f55601429e0b8775b70000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a7dcf2f9015f787000000000000000000000000000000000000000000000000fcb7de25429c060d000000000000000000000000000000000000000000000008ec516e8e2f74603d000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000a30a42e0ae8825c8bae18fba5c7bf0918a8f5ac3a9f09eb2adc39bf091b695403cf0918a81f0918a8df096aa802438c3bde0aeb3433a53275d555cf09fa796227bf098b481125da480ff13bd298bf265af8c6d69ec2c346004dafc6a54022441b09791c36af2f3f96d9f64126078185fa3fffb765c922d733f6cd43f8d0878e9716bbaa2da6a8ac3392b1d951eabb67f4108c8a2e3f645403c2af5a07b9fb93ebcd52571000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000038fd084da1b0f791c000000000000000b9e9d96a677f389b80000000000000001eefe2de89b2873d7000000000000000bbf8e82d81195c84600000000000000000000000000000000000000000000000000000000000000417b3f0902f3a74e62b126c79b3f6bf5bd26c82e9abbf8a7dcc6d4b2c2c82d7a11e2439f8e94f3a6a356c4c97db8244fe7316fc9e4aeaf44240c49bc5defdbcc713200000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000071e6eecb5a4de7e4aa6a36173e6fe58952a7a103000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000bf80cda3ccdfa5307816eaa49bb48babe39988a1f55eb4b8cf390a0e76edb0220000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000988d6212b482209000000000000000000000000000000000000000000000000aa45b84f5564973b0000000000000000000000000000000000000000000000012d13f07fe80ff8680000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000ce4e33d9daa80b3b4000000000000000785f09f04db2a1766000000000000000a7a59efe0eea48408000000000000000c3704939d16de46fa0000000000000000000000000000000000000000000000000000000000000041e8bd2f111bd90e58d76d727989f069389c9abca14789dd7010400975a011628c90ee3c8c9f79116f388123af947324a9bfa8875264175b9a19b2de08ad976497c500000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ab61c2e53e22ebe9d1e14427c4906a7172d9c02e000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004a7e58103c1862f2274b652bea9c720d0ddac6ccdc52902ac25188eedda266f800000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b39657ef29e2350000000000000000000000000000000000000000000000002325212b21d7c05a00000000000000000000000000000000000000000000000b9a624247123e396a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000006c3a486ca99ffd31400000000000000056c3b0264d4403fc600000000000000095395fe6f6e4d031b000000000000000b1a9e33237a020977000000000000000000000000000000000000000000000000000000000000004101387655ee67d66ebe20374803940a2787af374389ac9e6714c738e55ff5fba729a991ba98d7c49f9a1e951a418eaa723f34aadf193707c0ef2978c946d95ebdbd00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e9fcd862cf7c59bfbd5e725708139f254a517aa800000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000205edb691a74d66207326e6984e93656f87ceccfb0fe68d7c61cdf4975a4862145a2a8151d6de383bf09f2fd5d2677dfb85752cca54da9f2dee2b68bb8709e0c54000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b916fad741e3b8ff0000000000000000000000000000000000000000000000000ddd83a909eecf2200000000000000000000000000000000000000000000000852d6f9fc9f1679b100000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000880a363f25efbfbd26f09f8c9ef09e858eeaac82f091a88e22f091b182e382b9f096bd90c8bae0bf96795c3a792453f09d9ca2e0b796e18998124e6fcb76cba7f50945c27fab309f447bd657977a387c8796acb9e8cfd71753b1b40f1f6cb37c022d7795b1f7139dfbbfe60df4c67b0939317ba7ee74d508d4ed41910e16699e4e7993ea620c74e58b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000dbc4f1d9ce6d71b3500000000000000069f4be407f54d11a40000000000000002b3bd8b643bc7ac9b000000000000000c1ec807b85c46efc00000000000000000000000000000000000000000000000000000000000000041de56e6e383f0c392fd0c49fb00b39cb8a872acccc3bef36a5be46b007dea982703c77043e1cf7c5987c0278f4093c14ad0781c9fbf1585e89dceb3b7e49782c8de00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ee1fd21dc248727fc33b969b00e6e49e9cd0962900000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000208e55beb1c6c648accf1a887c9af0cbf02c033a7af9df6fa406813ff5050932c9eb46c532127f6b5fc1119f1e4d2d566266bda827f40d647cb16a998f131777200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000fa5e5d5fa6d3b442000000000000000000000000000000000000000000000000554e8f0a516da3a6000000000000000000000000000000000000000000000000ec6616dd93e87f11000000000000000000000000000000000000000000000000e8365f2e92dab0d5000000000000000000000000000000000000000000000004a1e08364c180e00300000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005d0a1222e0a8ae2ad1a8f0939082c2a5efbfbd5c3a1247a8d26637a190423f83db28f0231cf812ee8c6c4e0aeffbb736e1244e50f355d97e3be92dc005b4c33993b5e51f72b5124ff68ea379eba1a3972dc851743b2af492edb743ceae2100000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000cb483683bdb72b21b000000000000000af3f6b50dbcc25cd00000000000000003517cdaeb072606b70000000000000009fb2dbc43290fa5e5000000000000000000000000000000000000000000000000000000000000004113e3d91e2582654e7b42839c64067b2b3398bc449cb404c4ab004e9b9b34c7cb53a94cc9c97ef6fe8d86d429856da94dffa1a7ec581325dfef6f678e4e6ab6114900000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005b9d881a7781f9a0ccfd5c7e1bdecbc4fa0cdd3100000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000f0cc2e8b3c03b01d80780439e6b6562bf5825d08404380f6b499c3a328c3d25800000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000009aa6ac28dc03304a000000000000000000000000000000000000000000000000d162f43a0ee5ec2a0000000000000000000000000000000000000000000000005ebf470f91b40d490000000000000000000000000000000000000000000000002e4438faa455be7100000000000000000000000000000000000000000000000a52bc9b404f983b0b00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000510a3b27efb9aa3cf090a1af26eb9891e38487f0909485e0b48e5d5c49c2a75c3ff0918aa4e18991e0b1a2c8bad1a8e1b29e3a432af091a4a7f09eb9923f12127e7d77a4e53f75531a7d9ecf6ae7b657ddb600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000540ac9c9e4bc1a7a1000000000000000106bce6c35a66163c000000000000000cd18bec38c438268b0000000000000006de9a2fb5883dcbdb00000000000000000000000000000000000000000000000000000000000000412737f0e57ff4fd972f306e7646d67b10ca7a038db48d203f35a24485273d26c43766c2cf29e339ec973966621325775ee5ed21521822c9166539ffc7ff329ce70200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c3509e29f4a96b97e49d822603459a1a93ddbb57000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000f7eb637a865da49cece0be6c5a98cd0d1c78206872a629fa3b5e3f444b6553a30000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000b63f40ae5dfa0790000000000000000000000000000000000000000000000000c3f9e68f85f0e276000000000000000000000000000000000000000000000000a754fdc21a37df01000000000000000000000000000000000000000000000000d28e3faa3a32fc2700000000000000000000000000000000000000000000000947dc80afd4c199da0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000006eda04eafd2be59a60000000000000007868e27e126cacc3b0000000000000005807d2e6bdbc520360000000000000002663bacfa4970a7da0000000000000000000000000000000000000000000000000000000000000041ef8295be7e55562b3730949d35e96ae57854071cac7949b7ff1f141c3faa5ba085f5ac3b041903f6fef8ea2fcc53d869a7a5d9481b7d5faeb6edeb8dd7450aad7700000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000fa98455d20b16ff0689f957a2acca1f699ccf9fe000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200431cc7bc5a37a9c320c909fdceb19c327feafa7aa29cb244a78ee6bf0269fc4cd297a415641810cefca59f601f8141929e71a00d375b5eee4832cd3a34672c500000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000005bc6c9dca8e69cb30000000000000000000000000000000000000000000000001ce6d3514e9af02500000000000000000000000000000000000000000000000045460b6dedf0c4750000000000000000000000000000000000000000000000004bb7909d3bc60910000000000000000000000000000000000000000000000009920c266d38a0d5fd0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000c861267830ccce0390000000000000008ae2128c0837e8ab00000000000000005f667e0ff10e49267000000000000000bc8db7677763f10c80000000000000000000000000000000000000000000000000000000000000041f8b5c1e3f077c92998900e6fbcb2e947502f2c0bf9b1c9b9451452e43901db5904d6679bf450f523d7875a5b4a4d153c8f5e1be4bb07feaa3c93ce8bf90495439a00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002f6d470928dff2210c90152ef801fdbdadd15cbc000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000f783d42f14d3b27e9ed3b812f343957e5a39980ded4d2bfae292942c607804250000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007735830867c689ca000000000000000000000000000000000000000000000000ea75ea6721dd14e50000000000000000000000000000000000000000000000030f4ddf0aac5ab0df000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000120a067228375c715c1208c25e2f5d688da4aa000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000d3c931b29fbc9061f00000000000000007252694574685f8d0000000000000004b4dbca3be9a7515c0000000000000000b058c70679d5b2b80000000000000000000000000000000000000000000000000000000000000041dc46e9e5ba02d48beaef7e6d2053b7da40d57c438621fcdca9574a8a2932d9e746f665c9e7c33ea6fda0b3010f261c17a55df2602d8bed7b929b5675f71b150a1f00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002a789effb8dc1bf79dff4218f5c32606eff1f3ec000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000b635cb9a98a084a993f96294999dc52a0003e13bb5bea017814640cd6db4bc40000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005ead370dc506e02000000000000000000000000000000000000000000000000079282b945caec6d40000000000000000000000000000000000000000000000091da24cc11560a5440000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000008b8f5c2c0f516a2ca00000000000000003175d6e4804ae0690000000000000009e240745bd946abb200000000000000084b7095485d8997880000000000000000000000000000000000000000000000000000000000000041fa5d3743849694ccac66fa2d619bf562f01501e1f12753f74aeddf69705d621024da2ff90e83ebcc46d4f3a9c8aae63968232f1cba51d505a90f58215dbd22eb7b00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000591a9dc32bbfc0d10929806d79b95498d6d43e13000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000205888bf65a8710c76e244348001b440de2712a7c05ceac3a7e9805aa84a59d82817fc846ae452489e0a5d756efbe3c8302fd60312160a5bff3e2e7cc0aa415b3e00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000004edf7b7dd305c6ca00000000000000000000000000000000000000000000000078e9f304330fdf5200000000000000000000000000000000000000000000000021c6e2ef777ed341000000000000000000000000000000000000000000000000e35ac2a66acf2ace00000000000000000000000000000000000000000000000daeba137433d513410000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000001b2a11783a7fcd3ba0000000000000004d94c78461dd2185a00000000000000025f3838a636646a900000000000000005bb1669d1d6e507730000000000000000000000000000000000000000000000000000000000000041a9384db41ea0fe620d728b72b1ef7cb9338a3c8a52b7a55c3d11423608a5d0db854dff88501d1d1c79f668f6185e1e07131170a708fccc152ca7a9f714429f74ee00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000087f59cbb3801d0b0735970cb6c360ddc942c947f00000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000020bb8bf4ce099aed3c717623580b77131858351f76c5ba3ec727db003be1c213efe4a4a4741f5eb29e21eb8c2ca968369b9a0197a40ebf4fda4d730a6f16bbb4ed00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000c7e8e3a923df5d2000000000000000000000000000000000000000000000000fa99f2403699ed9a0000000000000000000000000000000000000000000000002fb4f6291346eb8200000000000000000000000000000000000000000000000002db5f7f374748590000000000000000000000000000000000000000000000069661352063e4e35a00000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005c0a1af0909e83e29186f0909d923f2ac2a5f09096992430e0aab23a43123e04a79cdc472b13fd215b27123da1de5fdd0a207e37a558870f066668f4fa231bdac12a7faa01351e00b6b2698ac9d3e8a997edfd27cc16ab1d97a45bdc790000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000004b7d29072a9f7c529000000000000000472e7f645e08febb10000000000000006f039a9cb9a29a52600000000000000054681ab8679fe62b30000000000000000000000000000000000000000000000000000000000000041e554abcb9221f710fdefddfc8a5acd15ec3f58d589e8cca82ef43d5c4969565b06ef793e7452da9f3b39418c55faff9f8ff15c200dc7b370311f461639b639b8e800000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009749ca8734d922c7009715fdc53413cb79fdb60400000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000d002e343baf289e65396d6f50329daf519327d35d61487c6c00b3e252734f54a000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ed22a1ea66e9d8de0000000000000000000000000000000000000000000000004dfd110e37231f8100000000000000000000000000000000000000000000000295a5479f6d90804c000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000340a0dc3bae1bd9b25efb9aa6b7322601223ded7471507fc2827765bfc83734666189bf534a5249527477c1405a362a05eb86c18f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000d397d07800e9ecb270000000000000004708514bd0196af23000000000000000b5208b6c73366d27d00000000000000027bb28eeffc34b65000000000000000000000000000000000000000000000000000000000000000415cc49d532735b729daaba0fb736725573e12667374d6870a24024fa0303a17f034b7aec775fb67c0f5c95934172a5b0fd7fbaa7dfd83e781605550ae6361dc917700000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000098bc89ccae04f859aa5f34bba1f87e280fd09d5100000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000a72f75efab56e9e0a738cff2c541994261959acf1600e6aefb8653a6ccde946e00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000008ba0d4d63e8dcce6000000000000000000000000000000000000000000000000bc49e83492d742a7000000000000000000000000000000000000000000000000f073a883bf9a88da000000000000000000000000000000000000000000000000eb8a94a5114cfbc500000000000000000000000000000000000000000000000091e12651b9d4500d00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000740a226bf09eb8bb346c555cf09d95902673e0b6aa27764b70efa9b63a646be2ba86285a7b124ee0c9bca0ddd85016b321a82d7a8fc413e642bfadbb0f91296f626e11adf7850c0b6a6a2c6d17c4bc0410015736e9ec89697b50b9f33c3f30b2b61152984378f1a0119e8b51720fb0c54ee2edda0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000013e0d4195ed3a6ad0000000000000009adbff146e68bb18f00000000000000039ac9ae72bbba5ba40000000000000009f47ed2c058391f180000000000000000000000000000000000000000000000000000000000000041cd61425c8b6cfbbb1ba32acf054318bb4a8453d46caf452a0a47827e6b80ae6d91c482dcbe2f86f259f377706e25c41c2a9fdd46b6db3675717f15f32a8f624bfb00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000886cf87febed7a233d79af15f3daa916c3d690be000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000203768aece8028795dfb0368ea618e6118ee203b5739830559dcbaf6a6febdd72382d77e6f1f6e8c91557d49cd190357ec178e2cbc46f0591735ee4ab9048c22ef00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000073ab9e87d00833400000000000000000000000000000000000000000000000003b5c45b57835d6a0000000000000000000000000000000000000000000000007b99866f76f1e2a0a0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000083bd84d2fbe77cbda00000000000000097af3df66d6fcc58b0000000000000006398895dd14e987af00000000000000026b5ed3c969a62e72000000000000000000000000000000000000000000000000000000000000004132c2db343e1178df659ed99e7cf4ac8bd83640f488afe1c73acf83c7f257ab2a7a972c803136bae3f6be4a7840b6dcdb68d42250f635978a87fada2ffeb161496d00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ea085131bd3d3adf00dc040981e43310d7a0c3e7000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020b49a883173f41c139ffe7f76ca3c3e98a844166f9554ee9664b6d47848efbb1530cacedb6961416a7d4762f60f8b238176e3ef42d80ce4dcc50070119045cc4e000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000010291204352395f7000000000000000000000000000000000000000000000000368729732a994ce7000000000000000000000000000000000000000000000000ae1c4e8623428e5e000000000000000000000000000000000000000000000000d7ffbf09218b2d5500000000000000000000000000000000000000000000000810a6207142c805540000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000037e4df56282eb1a3300000000000000053c5091916f4025c3000000000000000883c39ebf7db0731100000000000000090887d7c715d111c500000000000000000000000000000000000000000000000000000000000000415fa7590835f3aaf5dc26ae88cb92c716c696ee1818f448cee19de9b9e5b491ff6b809691cd3434fe7c9b599a98d913e6358fb2d59d7ea99b633d25716bb82016ca00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f37455f1c3109f6e809b8679730d850ad7b24e4e000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000094817fab75dc94e0dad6d95a12964f63028be4373fcde40d882d513efaf068040000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045ecbd7ff2ff7c000000000000000000000000000000000000000000000000e28c58df044eb16000000000000000000000000000000000000000000000000d5b6bed0eddc5be940000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000004e9c2e11c4315a0df000000000000000d392fd51a8110340f000000000000000db4f99ee6509767050000000000000003eaf1d723a22e203400000000000000000000000000000000000000000000000000000000000000415e3cf6a136d9c2e5a72bcc5f698aacde66e015e160f663cc00f080eafe537e3ce4f05c913a6ee7c1c22db4f11c8d985c750d0be679a845e933108bcd7852bf6d6500000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000092e942179e1a011b84ac38b3aa0b45da46ad5e8f000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000bb9a1b1140b2689b1e64b961e5ac1dfb0c1b71ec31bf6f2aea2e54c5407088280000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000577c2502077912cc000000000000000000000000000000000000000000000000b187f4218ad3cec3000000000000000000000000000000000000000000000000de5031a10714057500000000000000000000000000000000000000000000000032b46af5477d1ec40000000000000000000000000000000000000000000000064ca35b508b60c58d0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000007254a57e06ce2a8ac0000000000000002415de89df8b918f10000000000000002e84f7b3d6836b63300000000000000069cd9ae244de06a2600000000000000000000000000000000000000000000000000000000000000412eb314f66a4f1d6312f2082f38cb8c1487f06739df0bc9432d7114bb3d26c5bc473bae921c94af4114726ed8a515a8801f8c8c469dc24c00d9efd97ad7636ad42100000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002e9aa748d4e6d72a56287f37bcf86062dcbe672b000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000204f7fe9b7835607ea677a81c22fae4cc3175c51c37b5a008138834f2b2de4f64c56973152f0ba2b5472feb8bf27de2a8361d1a13b86c0561fc61c58e02b97d19500000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000009031876ecc3a58cd00000000000000000000000000000000000000000000000006c8da105ec402610000000000000000000000000000000000000000000000005b533cc0026fb76e0000000000000000000000000000000000000000000000000e5f91c327da007e0000000000000000000000000000000000000000000000041ed45a4e79fcf1660000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000bcc552bef613b05e8000000000000000be1029003eba10e4500000000000000073a9e5e10c16c20850000000000000009e72ade8a7115b34b0000000000000000000000000000000000000000000000000000000000000041e1b61378586119246839fb85fd18324637121baf548cf3b0c9a771a0e0d932bdfd33bd726f994b4a446600d3dc87c10268864b914a7fddd7d5ce1ed7c8c3ec000300000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000ab3980c9c4298f01f6d90bb709e68057c753a937000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020e57fe28e1d2fc1ea0a261d3d26e3aaab9cda99b7537826784477198c9b3d61bf1ed9d92d8eec7ed4ba0c10521326682531951ac71d13452b13fea8daff6e7c140000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004160ff3aa167d2fc000000000000000000000000000000000000000000000000fdbede7ec240ecac000000000000000000000000000000000000000000000000bdd3155fd87e32040000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000030eb824a1d7befcb70000000000000004e5ed7f5b8b536f37000000000000000046f1ad594e8cf53e000000000000000d7d7cf88b32c77e2c00000000000000000000000000000000000000000000000000000000000000415134acb2c77bd883a8a0bac72321857d14358b45616f3c481bd19248ff89aa17d640b4633869adbaf7b4e724bff7929cffbd7a7271d7a30eec9b8f5c510933859e00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004b780d1b9f7882e670410075de3e459ef47fea86000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020da170da661634ab633593db3f3db628b4210adb9360b55ec1c991fb8c2f57a69d7347909f2839fbc77163d3f29494c64bab3400a2226a103c914f1b144629a460000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000ff210aea56249baf000000000000000000000000000000000000000000000000fb89479b29ea835000000000000000000000000000000000000000000000000062e3a9bbad6850bf0000000000000000000000000000000000000000000000004fb1019048dc2ddd0000000000000000000000000000000000000000000000032e70e2417e5f53af0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000053c79867fa5616f73000000000000000a42387ed9767ea599000000000000000a7d9f0b1d92e21aca00000000000000040eed29f6ae76151800000000000000000000000000000000000000000000000000000000000000415bcca030c35a7501da429815bd28434265e6420395f763a96e28333cab0cd28065d1457c178fd58b2606cef7f21e38759a01c6c58d15913d6703deda00c001de9700000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c02c8ffc0ca948a8e1ecd5d7c762b27d4400e3ec00000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000206bcd7beca165c5c89b28648e23e9f1e23b783cf1029359793e258c5573e3a33486dcd9491a49c6219e0d657c0128ddd701b41da182bb31b7bb42f68d94992b44000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000028bfa72c2b591ead000000000000000000000000000000000000000000000000c31bf8243e415161000000000000000000000000000000000000000000000000254ac2a14348cc060000000000000000000000000000000000000000000000005d6e5b1683222ce9000000000000000000000000000000000000000000000000679df606db896d4200000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000007a0a1c2af0909e80c390e0ac9e603d4bf09faca25c29f09080a0c39beaac96125a537ae01d24ee56e3310e64e8f3fce6a01db18028ab26f73a82b19ebeb60efad1cca7472449357eb01fc6e97ca645f37dbe7babac7ea69c63d82c0378ba8a26ff8c6a2af5fd5f1391da08673dc46a91b98ca2991f696dc2aaf17000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000096ae272d0871e86d8000000000000000d66121c2099a9115f00000000000000072676a48607059f8e00000000000000049eb47268e23537a00000000000000000000000000000000000000000000000000000000000000041ce5d4164e5327e6364e55817bbd53c77faf8a7c01215d3c3aaeef1f3cf1bf1af33762280fe780092591d20bbc67ea9852dd2e521c7d2cde1b960b8f063285d70ef00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000001252be656c2ea0401a04c617c08a5781f8c6aae700000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000002085df340b35faa4054496cf6349c41237ca5020ef099b693bdddb96a5cd855e10aa4949322cbe733a50aa97bd7db53baea95f9ddb1501aa5378cfee79366fc5260000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008eb4c19e9d14c3f6000000000000000000000000000000000000000000000000d88662291d2f96f600000000000000000000000000000000000000000000000d01bacdc4ff1395d400000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000008b0a387af09e9fa5c8ba2629f0909d8ae0be89e0a7b4e282927be0b196efa6a4f09199843f50e0aab33e263d3f2e5a5c6ce0aba0e0ac90f09d92a5124f4b9ea4fb41919a23474ac278c2aed5e3b70bdd4bac4211033f348300e0e186554315f1d67c58ab63df196e7ea15864da0163fce1603f13a65e829cd4a048d2be36e351edf06f52c7250779012c4fb600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000048d819c9418c0411f0000000000000009b523ef3d15f9533800000000000000065b1d317b8e47c29000000000000000079104a13f1ab72f9e0000000000000000000000000000000000000000000000000000000000000041693d7cde04523caa7f78d9c585d7ab2c45f8f6706b3c406791d545a1214d04371cc9c2fd2bd86a1f8eaa8584722ff646aae15a24bb24ee194c853b616b496e1d2100000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000008cfab3fd33ea6dba0ee5a852e2ce39f2f54ef2000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020cb86d39a3671af4da71f571cf11ec68ab3b78c04b2bf8937fa1551f7828b757a996f0ab09fa1e2d11dc743aa6b1663ce9d2476a519a66b0b4dcd6594dd37529c000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df120535fd39193e000000000000000000000000000000000000000000000000eb3841d855ac29d500000000000000000000000000000000000000000000000a44a9f6945f1dadf60000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000005ca20b13c20291561000000000000000242533a265c946e20000000000000000d69898d833b23377a0000000000000007cfce6e337de36c4d000000000000000000000000000000000000000000000000000000000000004108a9f62139494a3907d0ecf6e7d79cf64b15fdfe34d8812099ba50f69e3e1f4022c543408eb871db114256f25893981b6d39b181821995a33d10de991324e4b80f00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f5c5abb46f40a4d40e8667bac802c9587c22369100000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000003641d900c8bd65b765652103198db2dd5798d406ef6d09914e9da6db4c098e400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009257b68950f7d0a6000000000000000000000000000000000000000000000000d09aa1877c4c63c000000000000000000000000000000000000000000000000443aef8a3360fe9d300000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000710a1b26f091a79a2f7b3b3ff0afa7a054c8ba5e227b22f0909d83e0b19d1252c3d138521102283d9411827203cc287880f9cca47a59958d7b554640f406fc2ca0ece96e684819c47c96500a62fa8373433fa4b7a8df3cae133933027460c90e96921e259f3abd97649403f2e9a39db43e5500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000a86d8b565d85700dc00000000000000049bfaf8e46b9f30250000000000000002eb4e699ccdf6bb1b000000000000000596875236e92c0da80000000000000000000000000000000000000000000000000000000000000041eaa4a64b818ab24c134367d6aa26bd1aaf1fe4b493061b79478aa18af063397f9cdeb0e2845ba270988caa961b279ad7c7656f6e89372f1f562a2070b5ec7770d900000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000087246a33e35ee769bea096eab4ea1a0861baa0fe000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000206b1c258c865af48888bf37bf123020e86a203a9d414e75756c3384f2aa2fd0bea8fdff38c48ce531dc8e2e372dd20acd5fb2476764d5f8d5316b8444d8459f1b0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ff5c2af2d567f430000000000000000000000000000000000000000000000009e1dc9771ee05c41000000000000000000000000000000000000000000000006fb86452efff8ccb30000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000d96701c0ca59213dc00000000000000088b8ef23ee14a4fb00000000000000008d32393e43cdabe4900000000000000053b25c31bba84ac85000000000000000000000000000000000000000000000000000000000000004172ca9914360a24002ca24259b92888b70dc74aa059b4b46cbeda77fe4cfafc1f6dac39a378aa95eb0f4e88bc2c4b3a2c870084fb91dd3c01ac94187bf841e1f19600000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000f8d0920574791fad967f4d2359d5efa47c984dcf00000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000209fd9dd567f4dcb78a3ca669255db2bf0439d95e657745218ae13a3f89e902064eef734e45147bd14a605237a9ae204610a69f911fcf7c5c3063b57188d072f23000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b48af72d372f7ffa000000000000000000000000000000000000000000000000b2e020c08cab0fd300000000000000000000000000000000000000000000000ab0dbe2ab384cf06c00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000780a2d242a3de1bfb3374627c8ba6125e0b18c70c2a6c39851f09d94933fe18fb86b4e2f23e0b38de18abec3ad7b3c2d12472e390ab20375218264eb5d8bca6f36ed75b8a7084f66c6966f810ef84d69a8e23ba9f8e14ccb3ce1bf4d29f44399f142af462a5fc3f7500b47e094ded91aa4ae95601988dad3f9000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000002573928f5661254fc0000000000000009e0ee6f4b93f2e8f4000000000000000396b19f0384c3952a0000000000000006734961aa5c094e5b0000000000000000000000000000000000000000000000000000000000000041fdf04a6dd98e3ada3402976e627bbfb292f3d00bc6b411d4eff88914c68d0927f683d3c887c5863e0fab65ed91d34b043f3456086d97c899bcf7b79570cc7ec5db00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000d84e5f7d449c1d30bb6b8e787281313d289f21c700000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000d783eb516f6c0a5e6e58ed2ee894fda67bf6cc394d79a7ccaf329479e1c00989000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a8397538f3eb0e060000000000000000000000000000000000000000000000007395094e9e48656e000000000000000000000000000000000000000000000002924ee2375e923f44000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000400a076cf0ab9d812d271235fe770198fbb00b201adbca1ef104b12f322802a9e3828deebff9e2400954bbe0f96b934ce560fb2e8a6b062e5b3c7e9487dca3078100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000005f1228925d3b2f5ef000000000000000a2e17083183c1013600000000000000063dfe4794e4488317000000000000000940778b5c09622815000000000000000000000000000000000000000000000000000000000000004151569628c9578bb4cd6d272b51e4be8d1d16c6757e3638842dd4db0219352472daf28b27b1b6f1837d8a65816c7d62db3de769ea5dc050d05be472fd45860b426c00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bd68f609ca6a6e2414ff1e3b368a6938b9b936f4000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000005b340beed021671f8fb9c3307e833e9577d830bf9c402bdd1462cfcd917505760000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000a0ae06470631742a000000000000000000000000000000000000000000000000752fae0d67ff3855000000000000000000000000000000000000000000000000a4a1a5b3b8a4c7a60000000000000000000000000000000000000000000000006d9805a874616ad0000000000000000000000000000000000000000000000001c6ec37c55d2c613e0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000008a51cf3103bc43bf20000000000000008f1a439e241adc71f000000000000000af22635bb06acf54b000000000000000794aa7130ee2c7d2b00000000000000000000000000000000000000000000000000000000000000411333a2277114fe43ae2447246c9985260f75694a6e4f623e3567af7ce9839be926a2d1b26db0bd18e43288900671ccbc268a498e8aab4542dff315a396ae3fb69100000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003602af0f773484af663b4feeea61df7757152415000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200f731f658d369f7e98310079002a54f1ee60fa02f13ee302c80051171fd08e11c2b05a9a81b939bc00427b55da2d51c19e2da93e9d72b350931f287c75365a48000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000091f9ffa940feac3d000000000000000000000000000000000000000000000000ba9bdf4ec9f0aaaf0000000000000000000000000000000000000000000000008b0ce1227c0e2ec10000000000000000000000000000000000000000000000002de6a7f71c773b6700000000000000000000000000000000000000000000000476bfc9f069562a270000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000085eef40b1aa269272000000000000000603ed6ef0be0a3b170000000000000008590518306e9129d900000000000000021e7a03829f3d189100000000000000000000000000000000000000000000000000000000000000411ff92f8ae88b69e39fbacf1c699486a0a93f6402aa12e347a71568219f352dd6df1e8619a203e8591d1921a63390e29665f9e2f80e2c0ba4641b092f4d7df0348100000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004cf80c38ab746a5ec2304cc93ffd76bed8e26e4200000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000003a49bdd52ad08e49a6b8c995a46a9588e4e356d56532529728ee99c83d1c553a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000ba1581162376a078000000000000000000000000000000000000000000000000d23345c0d9ebf939000000000000000000000000000000000000000000000000bb2a16e4d3e75635000000000000000000000000000000000000000000000000d3177ae1242793b300000000000000000000000000000000000000000000000d9b2d7d20773b293500000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000600a2474265ef091b488e0b7ac58c2a57dc3b0f0919d847a25f091a4bef09093a33355f09291b01238b4afb7b7d1620e6eae3723c90f6b332c0885c8fdac97798921a30c8c1711e79cc79a460da121e992f08ec60d8a8c04dc0df74a23e8c1f7d200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000005aae034b698a6950b000000000000000d8c0528df4f56cc7f0000000000000000628da2b929d63852000000000000000412f818d1c1d279bd0000000000000000000000000000000000000000000000000000000000000041f06f84b42942e1b0690e560e80be8638163494b564773bb60ffd2ffb8d5f64152b212c0caa04eaee548e00099c8a76b083752fc760329688757a5f60e5f899985600000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000022bfb63a7246f812fc47e4d53ae1f3e7518009ff00000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000d740e12fc61c1c6a127f1ec26b0cf4dcbaa3f203904e94ef1a666669db0d33850000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000ce38d4360edc30200000000000000000000000000000000000000000000000007b931e914e3a97ac000000000000000000000000000000000000000000000000edce76f2f0c2f03900000000000000000000000000000000000000000000000059cdcab5518bd63d0000000000000000000000000000000000000000000000031da1ca8cc18ac94b00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000940a34e1bfa6c3b376c2a5222e3af09fabb6f09289af3c3d56f09bb29fe0af97452e3d3027f09f95b43d232f606a27f090b38427602f7e125c06af6f0b9311238579d0ff5232fa6baaa4e336dd1970127d275cb24a722d12a1f2439795a24a3991514b3cc6e9ddd50f7a71792cfdb40cc86b03c79598ed5826dc16e6e344f9f1861d2fd92ef5d32a6fad97462c2e9c6c1349ca740a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000981606443a452454800000000000000091e0caf31acb665e00000000000000003a5cd0c1d799aa09b000000000000000d885a0daf9d144602000000000000000000000000000000000000000000000000000000000000004147d78efc7e6399d1e6a3311823d006f0d8ebdc94ee1cd81219b0d1dad2bcb4b8618c5facb7395e033394753b96223a9032596dec511061a01b853a6f69788a15b200000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004297a44d69579d4473a8a7b4bae032a2167e268f000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020af8f55d558b6a6cb6804027990bea47cfe34fcb3432a010d4920f9c612ef936b4313d5b3716841feef6f258d4360b3a02d855ccfcfe80eb88b4a2b79dba0ad41000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e7ace8883999a0f30000000000000000000000000000000000000000000000000434038e1f1074880000000000000000000000000000000000000000000000033d7af4e29970d4140000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000009b16bc2ae66ff8ec000000000000000c3fec822b1a9e4a3e00000000000000038ab67a9ff01324dc0000000000000000ed72a6c2f6e961eb0000000000000000000000000000000000000000000000000000000000000041b88e846f354d11fe46624c6360276655893306d1bfc07380194fc23f663d1d95dcdd3566fa92dc0ddebd61f11223fb0be0607fdf0d6a151e6779a82da55122831f00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000009e321563312d1109bb649044c5c2c44942a990e0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000009661c4be502f567f1e5c16ecdc3da8883fbe8021f2c154e9c1bcdd329ab0ded6000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000606ab4988b371b92000000000000000000000000000000000000000000000000ac9dc32aa16ea7ef00000000000000000000000000000000000000000000000c883035c06dcce0a50000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000ce8aef46cf7f0c54000000000000000247e81002260671930000000000000009d0bc2b6a7fb8a3c400000000000000082a48a7ce37b8dca00000000000000000000000000000000000000000000000000000000000000041785000ee103cbaac56562979c1c2a10f4a95aa2a525c5a7d2fee0ddcd3c275b81495dd153789df99f4ce1d50d868e909cafea3472c14779e11a700ad3b3751ba5400000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005ad00e3177ddaf0d8fe18a92ce161ff2c8b3944d000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000c583d8f9b45b4f22203a8b727d3e9978b3d2ba6afa99fc1589d562d15e3e0f980000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000607349ffb1fa99550000000000000000000000000000000000000000000000008c7c9062e63469d30000000000000000000000000000000000000000000000002b2faa075e95d7fc000000000000000000000000000000000000000000000000a1eccbe64b89ddc4000000000000000000000000000000000000000000000000d6417bcedcd989840000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000d767cff69e826ed220000000000000004e41c9ab08bce831b000000000000000c142fd8b7afa7c9aa00000000000000020418b2d3dcb544de00000000000000000000000000000000000000000000000000000000000000415d43b2ad2f8d57b10b88e4e922e5de67e44f2d96dd6a1658d2f71af0f34d326a044bdfc88b056869e4a92f12473574293dafed8a0b2322d8485ffcb13d273ea17200000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000026e85706488991288ea9dd0f13a2556a9497a77c000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010324fdbe762b298948000a764841644b0b08cd30d2f073c5e39baac020ae8880000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f8d127ff58c3e270000000000000000000000000000000000000000000000005920b14f76e104430000000000000000000000000000000000000000000000054f557886a560aaa00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000009163260385bc421110000000000000008b1918cb991f4549700000000000000018c2eda6175c444e100000000000000007dd69b0a76fc094e000000000000000000000000000000000000000000000000000000000000004192bb7b8a32ba6ac1a329fe68027534417327e6e5920fccab5c082c3c3d54edee292b1cffcf617a6001b0025df4c4c1c056c07107fc7d865241a0c87e9cd3a5a5e600000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000c4948088d0589707b8ca71b708fc47524061754000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000003599e15d6eb2af867167b9b45803ad7e21da1a4f72c26f8e5fa63a47e2ebd08c000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000074b512098ef98c87000000000000000000000000000000000000000000000000ff7f85f8a80175650000000000000000000000000000000000000000000000009207fe78d4aa7afb0000000000000000000000000000000000000000000000004f76e17883b31b7d000000000000000000000000000000000000000000000009a84493624c2a3bbe0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000c1ea7af595f4997400000000000000094e6077c5096de6b80000000000000009277c4ae44f7e076d000000000000000cfd5ad3c7d6e3689800000000000000000000000000000000000000000000000000000000000000412337cc3247f8471481e4f723a822213d36031ac36390704cead1f81ebc65ca8a9e983d0ed31914019cee8fc6645cb78dc0c1e594cd44b998bd3f01e88f6aaa824d00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000047b534818a7231fbdb054e1ab2c17d1bc570150a00000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020d56a55610a9ebcb5a6b049dfcc26839adfacc46cb1c458bc9e1cfccf1cae0da0827106b8426db332028c86cf79b8ff1c8d0c0c8a661a22c2eef8e655b6d282ec000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3eb86182b01783f00000000000000000000000000000000000000000000000090de695e3a13774c0000000000000000000000000000000000000000000000035ab6e2b43f030ee700000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000007f0a2841efb99b3f3a27ea9f917b60f091a48c6028613ad1a879f09ea59fefbfbd7151e0a8bc36e1ad9e4c1253634d988233e5fdbe5f2d7c2a6cc8d29c8f0c76fef66baab26561f5deff8f0de2962551782ffb76141a07a0f48b83c169ebc2ebcff95bfc21d1a610576233da07aab64be3e3ff1cc3398e102e278cfc0a9917100000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000c8b658dd338af4580000000000000000ae5b8b7f0c782edd80000000000000007456a4036a61c335c000000000000000684a8d23bd0cbce2e00000000000000000000000000000000000000000000000000000000000000412caf162212806f7c82023d25215d29dae508ac5e4e06ad7caa9325c85c82f8c31665c479cc885fb3caffec5b27b9f1d000e09159bdcfb832794a3aa9b7367ce1a200000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e955c46f978e61db9f60e334ec59b4945e44d4cb00000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000783a26d4f75f62bf8d3d8251e9d07d782d8ec15e136bb02a4d041be545837f2000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046c422a72bef38a9000000000000000000000000000000000000000000000000e197ad4a1669957a0000000000000000000000000000000000000000000000047143d9189bdcf9b50000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000003e0a1f7b26f09faaa0da9922f09f95b42c2e222ad1a8efbfbde1a4b0f0918cb92a5f121b9e4262d002e24b3bbeb99306b1e5ba2286ac91ef67eaf27d31825a000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000005a4353c3a3ce9bb57000000000000000285f5646cf98e6f370000000000000000b5c98d5edf9daaeb0000000000000005367b43b1f968ecab0000000000000000000000000000000000000000000000000000000000000041f626909e1559298d8479b9870fceda92a32435f08f8b69748d625138c0f6ad18fcc3db62d2fc50a1c763deb965528da576d2f1c3a94d8e0f9dd245d7b356307f7700000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b68261461927ad2e0411740a3bdf06a9d584ba8f000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000203e16bd315b57a809b2b5f2ab40a1091fb208572cee7f53e92280d677665355ddde01d7bf15a34942cb26d92071b59cba57ec59ea1c46bd31d43d38b0e1bc6e9d0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000a81b75e439660b6e000000000000000000000000000000000000000000000000c6fc28d5b0da725e0000000000000000000000000000000000000000000000006cfeaca39e9446720000000000000000000000000000000000000000000000008a0aef989798cfe40000000000000000000000000000000000000000000000040a575d9c18896a830000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000009dc9ec0a2c9467120000000000000000c3f6748970d912d170000000000000001613ad3ae88c7fa040000000000000003acf24cdedb58ee01000000000000000000000000000000000000000000000000000000000000004164c2a66895e9fa4e30df30da24ab18a142c0225e634d10a9affc772bd61fb1874482c60550ed0681e2bfd7d4274c67fafac4aede17e4aba6805b14f22dbeb5e67c00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000042b482ec21d05717f7966c3e4cdc27955dc27574000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020aba448856d1f5470194c419f763e44746dae30fb6bbfc42bad21abaa3769642f4773c2c6f494292231bd45e032abcdb2933a3720422c189284b4fe515fa5f256000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000014ee9a6afe7ab838000000000000000000000000000000000000000000000000e85adf21c166d961000000000000000000000000000000000000000000000000c75f25a0fb17238b000000000000000000000000000000000000000000000000898a375cf83aa0d400000000000000000000000000000000000000000000000738f69b3f013ed6040000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000e6aad2afa35f90d60000000000000008a16692e33e6b1ab60000000000000007b2fa384898f8d436000000000000000ce12d4819084f233b0000000000000000000000000000000000000000000000000000000000000041ed9a64db302238d48b5dbb712cb6f57b8cb9451b6a42ca2e6159460cedb8e17fddbfe768c0a45082052ad869f57dc31527f71ea34abdccb54996490880cf306bdd00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000942cebd16ac9d966a8a62cfeb9f969fd2d01887c000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200f53fc67d41b6c1e9b88f18d5a451b4f79cedb67ba13488282d3d9b6ba881365e1bdaf6af338732568e4e196cdfd037c3d8fdc87da83f6e305a9d08d9e45470d000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000036f476d786033e4b000000000000000000000000000000000000000000000000d2ed31fe2a00f2d400000000000000000000000000000000000000000000000033bfa25ad6b5372e000000000000000000000000000000000000000000000000ca9930134139ec9900000000000000000000000000000000000000000000000d9c4770adff95b2a30000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000003d601d162f7c977eb000000000000000ce65c6aaa257699f00000000000000009c3e2a69c0562481e0000000000000002f47c18058fcc6c5200000000000000000000000000000000000000000000000000000000000000412cb8299faddf2f06edf1deb9751a2dc77c43d49ed6b0bf85c6329fc6c61e5638ed75a104c49afa70da305c032dea91b3fa9ecd8bbf7db723f4efab5f40a5aa3f2e00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000bb69a9d19d53abbbfe8d00874a680fcd0415f66500000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000020adcb867b30f2a110c326e1b00e544f5361449c60b0e48fe1c2d4ea63f95ebbe2af4010b149b35aaf12e1cf0ffbbf561e6b8427a065d04bb37274474a3b2b6b790000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000925cca24e4e967500000000000000000000000000000000000000000000000013c763b81810a2c400000000000000000000000000000000000000000000000b1ec1ea709674ffb500000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000910a31efbfbd272ed682f09eb99f2ec3ad32c8ba25f090ae9923e0abb94c2a2f22253df090bc9fc8bae0b0b93426f091a4932253125ce1bec839697c4642414169b0347c54192905dded397bde55f26f3792cef5d42b5e9bbaa99057faf3970d41458f91169d9f5697e8a2d92804f132a1835db6d5b33539aa39d8a901733d3e130f31a19f0f6efa04aee7498616710a142b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000bbd0ac1d9bcb4b8eb00000000000000028d3d54242a4142ed0000000000000007b9e5a50f5df098ca00000000000000026846249dfd28490a000000000000000000000000000000000000000000000000000000000000004136cf2085daf629bf6d15a2b6b32f741b8f482f187498825398e8a0f85a6e1aec7db90628d2dc182f7a9ee928420b28d81a8116a5b129e3fb3d13e2b8d6b2a5c6b800000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000e1d12d5516f353758f1820005242acb6e4e3783300000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000002013c74eee60797ae0ad8fdb03434f041bdad07388572372c20e15acf4b0ae5223f5c5351e287de0d153c9aaa4ac04705aa32949d281b9ef20b5f2e2b23aa48d050000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f98471b062e70ba00000000000000000000000000000000000000000000000065bbec4325a7c103000000000000000000000000000000000000000000000005ce1c42fcd985a4c500000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005f0a3c752fe2baac3fe1a0832df09185a2e0a98c3cf09f80b164c2bbf09eb9a4f091a4895c2ce1bf9e762fe38082e29180efbfbdf090a78f71d1a82aea92bd121f2d30d27929a6bbf66af25af5e260bde2b2848e4a1a51e35d56f7b24e26acc20000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000b5c0c0998c75af6d00000000000000004cf87599656d2228300000000000000079dc9e422411bca810000000000000004c057b4e2e683dff70000000000000000000000000000000000000000000000000000000000000041686cf8e3fc9966a744bdfece2a9fc221024ad80c27a37d8cf4054056ba93c4c5bb6f0e291d69f5bec3c458169eab0f5a3258b6b92c26999c45f5f18126966e795800000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000002dc3e9bd1a41d40c61cc1db1b6f869edf735114f000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020bc2a846bd685add26c8d9b269cfa36f0c824a24eaa727204a29d5f159931b2c0fb2dbfc07eac6ec56eb3407ebfffaefb987d837b6803d4bd7c41bf9991d3da2d0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000661b72afbb47eca1000000000000000000000000000000000000000000000000d62d791aaef4f2ae0000000000000000000000000000000000000000000000006be4f963a56bfc5d000000000000000000000000000000000000000000000000e0b9879621b35cfc000000000000000000000000000000000000000000000009347f7afafa15b3df0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000273dcec5a64466901000000000000000080adf08ca8992a6200000000000000008e518d7670fa11ef0000000000000004518681fae960f85700000000000000000000000000000000000000000000000000000000000000416f60c226553f8372d52c9bcbac20230539c6c5a3433b890b2fd15db141b6b445568276c5f547f3183bbb54cc9c01ba5a9d3842aa224a37ca1c612a7d98f89270d700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000007b2d8a026a9aaf6c6a16b545d7ba19d9f8924bfd00000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008704c11c453662017505b73e5302f974fca7da67cd065532854ec288ea84979c00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000001868f71170e937e4000000000000000000000000000000000000000000000000a95c71748ddfcf1c0000000000000000000000000000000000000000000000008904f0b11288d7e9000000000000000000000000000000000000000000000000b0fdc8c3d2c970ae0000000000000000000000000000000000000000000000019cd6c5abad5d82d400000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000006e0a20e0ba843ff09f95b4f0919c843c5ce1a6b65ae0a6b7256b3525c2a5f09096aa4c124af96744758f33c50afe0cad1585afd5a64407ab5ee951f9d9a77b81dc2394456c05148260a3f8e11415c7534625db8f56caf2b2866c524a6a141e6c683e6f5a8cfaedd4a0c9b20d81576f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000239af8523b0258e8700000000000000071e811e0c7f9977dd000000000000000c32e56b248a06b29a000000000000000c8fa8ae1503c1792c0000000000000000000000000000000000000000000000000000000000000041e798ec2bd3d9f4732122551bab3de5f78484092f3ec7455f0044cc32534c89834e7a606b8398df7ba1d80b08770644cd4315ed3240b4dcd8d1fcb62a0b9c985a9300000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008c6180402210246af2f6411611d502a51a93f6ad000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020b6d82805d7dfdd87ecd0f48998eba4ccf2fb61f30efeba1ad2d6943115e7adb82a5b51f44e257557d2148fb72fca0b8fe4585bb161e0863c503dc5b681bd7722000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000016ca775becdcda4d00000000000000000000000000000000000000000000000024eb905042793979000000000000000000000000000000000000000000000000da7dfbbd4dd705bc000000000000000000000000000000000000000000000000302a8c189601c84500000000000000000000000000000000000000000000000c86584b42bccf0dd80000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000051d5fbab8dae9e7de000000000000000419a25ee9849693b00000000000000000be1ce406f0f86f620000000000000008d550baf9dcc767f500000000000000000000000000000000000000000000000000000000000000413b08c0a6e96648e551228f82ee23b944a811de665868c0311dd481dff1729375a4a437b7d0a66e2a39eed0c3d51301c5ca0b06b83688d18a38d43c4204dbc0644000000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000009f63ed6bc7acfeafe4bcdf2db2a74345445d563000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000038cbf47af22ee59ab15fcc25fb51db9c6919dc170c6d80ba50e4736fa0843d2100000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000001021d8a919cdd47d00000000000000000000000000000000000000000000000081684acfc9afee100000000000000000000000000000000000000000000000007a3d89c21c2c6944000000000000000000000000000000000000000000000000853ce9c190668fd5000000000000000000000000000000000000000000000008cd82f49c48aef0400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000046c6a203da14b3b32000000000000000712205fb201e75ab90000000000000004b9beaa974e5843c8000000000000000bbc1093ba44c066130000000000000000000000000000000000000000000000000000000000000041531efbbdae7f77ff8b3149d79f8f729c5be9a2124e5e5f42d20454053b9198d5723ea060ff49e143e572d287d7266c0e991435850c6b58dc0b3ddb6a565f166f3900000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b17964bed4d430a282e39dd15e0de969a7360fb1000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000084584fac1d81806fd103f43a59765d390592fc616752f34290c3767012b683c0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000780569823e89fc89000000000000000000000000000000000000000000000000f690393d6d6e1af4000000000000000000000000000000000000000000000000ca23e04f8b5bf08e000000000000000000000000000000000000000000000000dbc478bf7499e92b00000000000000000000000000000000000000000000000bc319736b65eadfe60000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000510f8ef8a65ce935100000000000000007b852d81a62ca3ac000000000000000b52be88df91694020000000000000000a50f5a2fde07cabc700000000000000000000000000000000000000000000000000000000000000410e8a44d9cb16af6e2d616d7699e8cac2ac0fa3abf618ac1cf5622b7456ee9f3fb437404d1afc8b242e55aa1e078a22ab1143e6454895208cca1a21ae29d89eaa6e00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003fdd2daed28ffc781cd7e47024638761837c4464000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000e78f788495e638bdd4e09c252a3852444abb76b324eabb6af31f0c744522b95c00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000cf9cb7b6c2dce700000000000000000000000000000000000000000000000009951043898ded02d000000000000000000000000000000000000000000000000e179ff39b490ab560000000000000000000000000000000000000000000000001e1da91bf3af18590000000000000000000000000000000000000000000000024e42f2ccb4cdc6370000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000d42bb02aa6c3509f7000000000000000aebc8fcad8383de7800000000000000055b293888a272f2d6000000000000000b7e539c36bc37b7ea0000000000000000000000000000000000000000000000000000000000000041d984404568bf7ad137a4cebb5866b3f5ba92fa64eab3097cef59d1768353f67e917867c2c989939e2c66b77a3cc6bac1a37e04ec9fbbe64d9afcfea64b95ac777d00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000028b9eb770faf43005a1a641c3cc097ab7501f33500000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000008bff7b36b7dfe1df816ef4efadba81b3a1a6c100a1de1a6ad38604841b0646070000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000cc48e60223713873000000000000000000000000000000000000000000000000d8dc8fdeae753bbe000000000000000000000000000000000000000000000000f7ace1f06ef10f15000000000000000000000000000000000000000000000000d01c99bc5590dd46000000000000000000000000000000000000000000000009f86a1f57f092c3e400000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005c0a03efbfbd1255316241e0924aa7d036fef0d4ee20a90bf0e6f68bdaa582235d1e6e1dca0985504197539f61d3a67c59fd84783955bfca462278f10e448d52015fd95e4e40b37440c97ce8eadc1257f819515a9967e826da057fd9d00000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000936f9670b4c0ec216000000000000000ad8eea8358edfe28b0000000000000002ee6081cdba7e3657000000000000000858e2b7a3124b5af3000000000000000000000000000000000000000000000000000000000000004124d449eeb2a5090eb70d618ee71e7b7d33ceb7ec545c510461d1b750fbc20732c685b02fb21a94501d25266b1a7f4cb0f45ac4faa84b49b5261ef786bd459cd1f100000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b5577a8dceb3de0f36fee880f60e7747cf2e445000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000020e44f3ab39121c45a293800b150cfa9be2639ede669dc58e91257a744c3481758d3e801727cefa4eef2234e8dc640c1e0a0d1b50009ec7dcd83c6e8a288f700ae000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c485b15a27aad10b00000000000000000000000000000000000000000000000034fb1cf1747822b900000000000000000000000000000000000000000000000c1c297652a80bc2ad00000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005f0a052af09f95b412561a25ea253156490ea242505e794b302e1f8b905c949d3f885e2f212fadd39c91bd617f38af65d7782572cb9660d75e5c30a2f4e34f4b2b1e0e4c74c362361d7de02365b025e27cbb98f8f1067bd6739ea14e9cf474a00000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000075f5e52b3b37f46c40000000000000006fa119f49e925b75e000000000000000d17af1707141a49ca00000000000000030f8ec90b9f1788fd000000000000000000000000000000000000000000000000000000000000004166592800e80812b77b7e0f5e6ea5f08b34eab9365ee9df238e28a7e54d072de3b47ea4081147624a77191b3bfb203c484b006711237be78be475c13a58f4f62c8a00000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003be514b0bc6e86393280710869861455c39043f2000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020f0aa31e3da0ddf96b35f0694e796f7743fed0073750a992e8e1e5fe2698d7e74af9c7aa96bda03b45a3cb3d523bf87709c3f4df14ddcc35cd160e19f3d28fc5a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000b01978385fd65c7b000000000000000000000000000000000000000000000000fda9b38a46115c4500000000000000000000000000000000000000000000000064a86b098a11d58000000000000000000000000000000000000000000000000040a288ddd06e0c8d000000000000000000000000000000000000000000000009ba2255f823d3f3f10000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000d0b7b4ea190ee8c99000000000000000b466868dee7c7b16a000000000000000732e4e0c226fb52f3000000000000000b68fefe99ed4a5eec0000000000000000000000000000000000000000000000000000000000000041892b4d3cb188594c933ddd27782bcee9a7e717a917fd406c02053229d195fcc1d57dc99f87ae51bd077c9b2a3ccb0254c6f8250c4577e25db192b1cdd91578d9fd00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000b48ee55b33c2037555989f1cf5fe357d857128eb00000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000006a51e88106df31e2d8deaf67b19e39f999c74b3062966b599872a037647d10ae00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045067d6509a67ca9000000000000000000000000000000000000000000000000457c10c416cc599200000000000000000000000000000000000000000000000ba7f10e090e4331a400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000720a16e3819e25f0918cb5efbf9a40f0918d97efbfbd747c7b1258b01f2ba9aeb27590c8465bdcaae78f932fd2646a3b0d09ad85588fe03528e44b773121721f0a4060b4954080675a6da929f0853af9265f0b06d97e806085d49dc4af29653ae1ee44617f7bfaeb55ed762c0260e48829e554000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000096cc39459b36c75b00000000000000008d1330cdd30e94dfb00000000000000099bb345e9d476404c0000000000000007ea20d1326723bd84000000000000000000000000000000000000000000000000000000000000004188915851a4693ddb185c8c380bab68e23fb97a023f3a80335f56d66d513a635c5234b12af2c637498ee8160d8bf1ce1c335a5b8cf7c5232bf697bcd25975781e6700000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005096f3e4079c996e89e29e044afddcab4030f725000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000020000100010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000001440879b97649b2ad822219399674b53805fc1730b14d5218edac8957b79a3d500000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000004e646151920e9c35000000000000000000000000000000000000000000000000b8426e9be365e7050000000000000000000000000000000000000000000000004c67ade6157c22ee0000000000000000000000000000000000000000000000008ae543c03d3840040000000000000000000000000000000000000000000000044cce1aaa758bb8ba0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000cef44a2042f5e9f950000000000000005b6d018e6ba135f000000000000000007b3037d4590e6d9350000000000000007d7d41fc4cb82ad6d0000000000000000000000000000000000000000000000000000000000000041b353b679fc25bff2347dcca0031f29f7bc5f1f2d56a2ca640963696292dc9e586f9fed9e4178934b1208868b70a2348bb8693cd1eb91b0ff46520e94d5e94e863c00000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000045f1a9c90f471a8782303d9efc6b81d34871d3e1000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000020a74e0b5d30e1fc52c97d44c46d15756a8af1417f3a1512159a65d486f244f84d4e00dda52f7ab5beefea99d81832210942a0994e73e32a9459714dae92a3377800000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000007b7729e60b727821000000000000000000000000000000000000000000000000be8e593d48604b96000000000000000000000000000000000000000000000000b1dd3951d147fc19000000000000000000000000000000000000000000000000edea91517ed3b2f2000000000000000000000000000000000000000000000002926b91097c6fa2be0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000004c587b6448adfb7b2000000000000000d9bc4db60e9dd98110000000000000002326b0ceaa65ddb7b0000000000000000111e7036d3e2c0ee00000000000000000000000000000000000000000000000000000000000000413b811b11df4a2c420f0574a23e4cde6597183fd7d368293d44028df371f994720952a2ac3e301115ffdaac436daebf86ae54f3d06ab75e96238113275b1fa25a0400000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000011491af06ead2ec1a3aa8dbd5e5ece24425ba71c00000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000e182be5726cd933457b20bd52fdf3b0b56581689d5c1a98b6829f1d7df878101000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ce078453a51ec16f000000000000000000000000000000000000000000000000932c4a81efa31999000000000000000000000000000000000000000000000008ad2f8d655adbf8cf00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000860a30c3b4545cf091a3abf09e84886d72f09d92a269e0b198213f24c8bae1aab8605df090ae9c3ae0aea8e2b295efbfbdc8ba1252d1e2779bf7638e1903cba543ca4e39025ebe696e1d0da85924ba178d83c7c5969b9446c548fbcb017b76fce8e1af9362d021dc8f7f3a67c026b7444dbbf284ae87e7c1081fa61d79bdae632dcb2244c81ea5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000008c69d032352d92df800000000000000075e09bdc7242ae924000000000000000973165671bb4acfed0000000000000004b76963c542064eb30000000000000000000000000000000000000000000000000000000000000041ba7ef81a89f6129e35a84afcd0ec199d9e354af6202fb9632e9dbe75ac65f37cd048bb1a738afbcd737f5dd6de0678bb13be4fdcf49227bd8f5c800828da1e84f400000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000004812cde0cef87e40b74cda9d21766dbac97464b1000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000002000010001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000e31da9c71e483fa01ac3b0d94ae12717e6d5f16a98702b48229388f6d270bc2f00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000002748a2a494344f050000000000000000000000000000000000000000000000007adf8cf155a632cf000000000000000000000000000000000000000000000000f30c774f72c04fe1000000000000000000000000000000000000000000000000fe5e89eb778817c800000000000000000000000000000000000000000000000d66826dad80a288130000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000004b421283770854f8e0000000000000001aa83e6bb443febb7000000000000000099601df5453f11540000000000000005cfc20cf4da707a1a00000000000000000000000000000000000000000000000000000000000000419e17ec00e2e07b32f5232acd1893789cd2dd7dfd366349d9aa9d6dc7a38ed8507baaad70c6f01953a3a0efbb5d6d55d3186fc20f8a60ea70236c3ee42c9651068500000000000000000000000000000000000000000000000000000000000000"}, + {"000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000008cf74b1517b5c3c958ec5660e0474c0f24a8649d00000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000f8c5076dc8c21d1a57e834d7a2bdc5f2ce0ff6454cbae9879be7d926204724cd000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a6e5c70e9d2ba0500000000000000000000000000000000000000000000000002a575b8823156eb9000000000000000000000000000000000000000000000003600932df92bbd10600000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000005c0a023d611256835bc8d634ee63e6e1634118eb37b8499f83eb460fc43c6cc86371c9f8e30d0f3b4be6f62511cb6d7ba1dba1b87ab65b31e8b714a0ac849d967863cdc244b63557c677604f0f918104fae9f6edf2771bf7d36ec1f9340000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000057ef98937ff6c9a0e000000000000000a7c2015235eda6935000000000000000936424c724461ed50000000000000000c08c55eec07eb2e2900000000000000000000000000000000000000000000000000000000000000417b827c91f2e1d7ffe5345d1b53c520cecb8b40e4428d3060b48b582be5f990a60ca12c88cca97b11ec3d86d10cad525f69005b2f835fad95bc1688236ca7ea3c3900000000000000000000000000000000000000000000000000000000000000"}, + {"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000019873da068990c50d4a455c3d4198750f7da05e600000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000709187fb8396b0b46bf7bf3740db084707cbf4a5132c0a80e7ea411042d1fa51000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000088fe066ab03f5cfc000000000000000000000000000000000000000000000000496e57a6fd0e1e80000000000000000000000000000000000000000000000000c57c7bfffd2dc65c000000000000000000000000000000000000000000000000780b178fc3008f58000000000000000000000000000000000000000000000008aee1e37582a1139f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000540a29e2ba9957efbfbde0b6a9f0918d903f3860d1a85c6ac2a25d27f090a6803aefbfbd29716026f0908f9312272754278d803b3f0248af5277a3a2a9504baed5e64e9c6a31281578b4aeb5f08939e77a5f26db7700000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000391b4b79dd047fcc8000000000000000c19218ffa09eaf756000000000000000cf38bed9d7e7de74e000000000000000b44f342306ffae5150000000000000000000000000000000000000000000000000000000000000041f9dbba3c17235943d81c59f5e62dc34716faa8a436ab256d5bbd02262e225d315b3ab453a1a3f012df4f2a85b0ae8e369daccfd72a2a1c965e6cecddc4b7baa2ed00000000000000000000000000000000000000000000000000000000000000"}, + {"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000060000000000000000000000000acf3ace412405118308a4e373838e7bdd9e0022c00000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000200001000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000201c99e71e8a75122f3dda07f20421b300ecab241f59a60ea88aafcd3e4d66bfc6b0af16d771325404a31bd53375cb6f4d1163c4f0303abe28a325bf18e7735bf2000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de80f1ce8ff80a3f000000000000000000000000000000000000000000000000ff1c29e310a5537e000000000000000000000000000000000000000000000009f5986242312f402f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000600a3268d1a8e18a9ef09e9fad616c3c2f6ff09f95b4efbfbdf09f95b4c386efbf82482af09d94ab233370e0a8bcf0919ab1ea9fbc122a90221d4f9e5473e6731d727740bee0c51f7bc2cc32d46fcd5e202e15c596acdf04c47c1a0e540318538600000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000772be40481421ea0c0000000000000009ffaa714d559e0b880000000000000001928f1e49e124255800000000000000098c8fc691f74980a5000000000000000000000000000000000000000000000000000000000000004142103869c3da34404d5f8319d0e86bb3253813c1632e48a84e1cadf3d06b9c4f2827ff2fa1aa8586144a536bed8ab89c657b587b5ce132f909da151fbd5b6573dc00000000000000000000000000000000000000000000000000000000000000"}, +} diff --git a/modules/commitments/Cargo.toml b/modules/commitments/Cargo.toml index dc3270c0..2173c3de 100644 --- a/modules/commitments/Cargo.toml +++ b/modules/commitments/Cargo.toml @@ -17,6 +17,7 @@ crypto = { path = "../crypto", default-features = false } [dev-dependencies] prost-types = { version = "0.11", default-features = false } lcp-types = { path = "../types", default-features = false, features = ["std"] } +time = { version = "0.3", default-features = false, features = ["macros", "parsing"] } proptest = "1.2.0" [features] diff --git a/modules/commitments/src/commitment.rs b/modules/commitments/src/commitment.rs index 7aeb0161..43053600 100644 --- a/modules/commitments/src/commitment.rs +++ b/modules/commitments/src/commitment.rs @@ -523,9 +523,9 @@ impl EthABIEncoder for StateCommitment { #[cfg(test)] mod tests { use super::*; - use crate::CommitmentProof; + use crate::{CommitmentProof, TrustingPeriodContext}; use crypto::Address; - use lcp_types::MAX_UNIX_TIMESTAMP_NANOS; + use lcp_types::{nanos_to_duration, MAX_UNIX_TIMESTAMP_NANOS}; use proptest::prelude::*; use prost_types::Any as ProtoAny; @@ -533,9 +533,29 @@ mod tests { Height::new(tuple.0, tuple.1) } + fn test_update_client_commitment( + c1: UpdateClientCommitment, + proof_signer: Address, + proof_signature: Vec, + ) { + let v = c1.clone().ethabi_encode(); + let c2 = UpdateClientCommitment::ethabi_decode(&v).unwrap(); + assert_eq!(c1, c2); + + let p1 = CommitmentProof { + commitment_bytes: Commitment::from(c1).to_commitment_bytes(), + signer: proof_signer, + signature: proof_signature.to_vec(), + }; + // TODO uncomment this line when we want to generate the test data + // println!("{{\"{}\"}},", hex::encode(p1.clone().ethabi_encode())); + let p2 = CommitmentProof::ethabi_decode(&p1.clone().ethabi_encode()).unwrap(); + assert_eq!(p1, p2); + } + proptest! { #[test] - fn pt_update_client_commitment( + fn pt_update_client_commitment_with_empty_context( prev_state_id in any::>().prop_map(|v| v.map(StateID::from)), new_state_id in any::<[u8; 32]>().prop_map(StateID::from), new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || t.as_ref().unwrap().0.len() > 0), @@ -560,17 +580,45 @@ mod tests { timestamp: Time::from_unix_timestamp_nanos(timestamp).unwrap(), context: Default::default(), }; - let v = c1.clone().ethabi_encode(); - let c2 = UpdateClientCommitment::ethabi_decode(&v).unwrap(); - assert_eq!(c1, c2); + test_update_client_commitment(c1, Address(proof_signer), proof_signature.to_vec()); + } - let p1 = CommitmentProof { - commitment_bytes: Commitment::from(c1).to_commitment_bytes(), - signer: Address(proof_signer), - signature: proof_signature.to_vec(), + #[test] + fn pt_update_client_commitment_with_trusting_period_context( + prev_state_id in any::>().prop_map(|v| v.map(StateID::from)), + new_state_id in any::<[u8; 32]>().prop_map(StateID::from), + new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || t.as_ref().unwrap().0.len() > 0), + prev_height in any::>().prop_map(|v| v.map(height_from_tuple)), + new_height in any::<(u64, u64)>().prop_map(height_from_tuple), + timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, + proof_signer in any::<[u8; 20]>(), + proof_signature in any::<[u8; 65]>(), + trusting_period in ..=MAX_UNIX_TIMESTAMP_NANOS, + clock_drift in ..=MAX_UNIX_TIMESTAMP_NANOS, + untrusted_header_timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, + trusted_state_timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS + ) { + let c1 = UpdateClientCommitment { + prev_state_id, + new_state_id, + new_state: new_state.map(|(type_url, value)| { + ProtoAny { + type_url, + value, + }.try_into() + .unwrap() + }), + prev_height, + new_height, + timestamp: Time::from_unix_timestamp_nanos(timestamp).unwrap(), + context: TrustingPeriodContext::new( + nanos_to_duration(trusting_period).unwrap(), + nanos_to_duration(clock_drift).unwrap(), + Time::from_unix_timestamp_nanos(untrusted_header_timestamp).unwrap(), + Time::from_unix_timestamp_nanos(trusted_state_timestamp).unwrap(), + ).into(), }; - let p2 = CommitmentProof::ethabi_decode(&p1.clone().ethabi_encode()).unwrap(); - assert_eq!(p1, p2); + test_update_client_commitment(c1, Address(proof_signer), proof_signature.to_vec()); } #[test] diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs index d72b2e6e..8a370892 100644 --- a/modules/commitments/src/context.rs +++ b/modules/commitments/src/context.rs @@ -4,21 +4,21 @@ use core::{fmt::Display, time::Duration}; use lcp_types::{nanos_to_duration, Time}; use serde::{Deserialize, Serialize}; -pub const COMMITMENT_CONTEXT_TYPE_NONE: u16 = 0; +pub const COMMITMENT_CONTEXT_TYPE_EMPTY: u16 = 0; pub const COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD: u16 = 1; pub const COMMITMENT_CONTEXT_HEADER_SIZE: usize = 32; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum CommitmentContext { - None, - WithinTrustingPeriod(WithinTrustingPeriodContext), + Empty, + TrustingPeriod(TrustingPeriodContext), } impl CommitmentContext { pub fn validate(&self, current_timestamp: Time) -> Result<(), Error> { match self { - CommitmentContext::None => Ok(()), - CommitmentContext::WithinTrustingPeriod(ctx) => ctx.validate(current_timestamp), + CommitmentContext::Empty => Ok(()), + CommitmentContext::TrustingPeriod(ctx) => ctx.validate(current_timestamp), } } @@ -29,10 +29,10 @@ impl CommitmentContext { let mut header = [0u8; COMMITMENT_CONTEXT_HEADER_SIZE]; match self { - CommitmentContext::None => { - header[0..=1].copy_from_slice(&COMMITMENT_CONTEXT_TYPE_NONE.to_be_bytes()); + CommitmentContext::Empty => { + header[0..=1].copy_from_slice(&COMMITMENT_CONTEXT_TYPE_EMPTY.to_be_bytes()); } - CommitmentContext::WithinTrustingPeriod(_) => { + CommitmentContext::TrustingPeriod(_) => { header[0..=1] .copy_from_slice(&COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD.to_be_bytes()); } @@ -60,12 +60,12 @@ impl EthABIEncoder for CommitmentContext { fn ethabi_encode(self) -> Vec { let header = self.header().as_ref().try_into().unwrap(); match self { - CommitmentContext::None => EthABICommitmentContext { + CommitmentContext::Empty => EthABICommitmentContext { header, context_bytes: vec![], } .encode(), - CommitmentContext::WithinTrustingPeriod(ctx) => EthABICommitmentContext { + CommitmentContext::TrustingPeriod(ctx) => EthABICommitmentContext { header, context_bytes: ctx.ethabi_encode(), } @@ -79,13 +79,13 @@ impl EthABIEncoder for CommitmentContext { } = EthABICommitmentContext::decode(bz)?; match CommitmentContext::parse_context_type_from_header(&header)? { - COMMITMENT_CONTEXT_TYPE_NONE => { + COMMITMENT_CONTEXT_TYPE_EMPTY => { assert!(context_bytes.is_empty()); - Ok(CommitmentContext::None) + Ok(CommitmentContext::Empty) } COMMITMENT_CONTEXT_TYPE_WITHIN_TRUSTING_PERIOD => { - let ctx = WithinTrustingPeriodContext::ethabi_decode(&context_bytes)?; - Ok(CommitmentContext::WithinTrustingPeriod(ctx)) + let ctx = TrustingPeriodContext::ethabi_decode(&context_bytes)?; + Ok(CommitmentContext::TrustingPeriod(ctx)) } type_ => Err(Error::invalid_commitment_context_header(format!( "unknown commitment context type: {}", @@ -135,22 +135,22 @@ impl EthABICommitmentContext { impl Default for CommitmentContext { fn default() -> Self { - CommitmentContext::None + CommitmentContext::Empty } } impl Display for CommitmentContext { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { match self { - CommitmentContext::None => write!(f, "None"), - CommitmentContext::WithinTrustingPeriod(ctx) => write!(f, "TrustingPeriod {{{}}}", ctx), + CommitmentContext::Empty => write!(f, "Empty"), + CommitmentContext::TrustingPeriod(ctx) => write!(f, "TrustingPeriod {{{}}}", ctx), } } } /// NOTE: time precision is in seconds (i.e. nanoseconds are truncated) #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct WithinTrustingPeriodContext { +pub struct TrustingPeriodContext { /// How long a validator set is trusted for (must be shorter than the chain's /// unbonding period) trusting_period: Duration, @@ -170,7 +170,7 @@ pub struct WithinTrustingPeriodContext { trusted_state_timestamp: Time, } -impl WithinTrustingPeriodContext { +impl TrustingPeriodContext { pub fn new( trusting_period: Duration, clock_drift: Duration, @@ -195,9 +195,9 @@ impl WithinTrustingPeriodContext { // ensure the header isn't from a future time Self::ensure_header_from_past( + current_timestamp, self.untrusted_header_timestamp, self.clock_drift, - current_timestamp, )?; Ok(()) @@ -217,9 +217,9 @@ impl WithinTrustingPeriodContext { } fn ensure_header_from_past( + now: Time, untrusted_header_time: Time, clock_drift: Duration, - now: Time, ) -> Result<(), Error> { let current = (now + clock_drift)?; if current > untrusted_header_time { @@ -230,7 +230,7 @@ impl WithinTrustingPeriodContext { } } -impl Display for WithinTrustingPeriodContext { +impl Display for TrustingPeriodContext { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!( f, @@ -240,7 +240,7 @@ impl Display for WithinTrustingPeriodContext { } } -impl EthABIEncoder for WithinTrustingPeriodContext { +impl EthABIEncoder for TrustingPeriodContext { fn ethabi_encode(self) -> Vec { let mut params = [0u8; 32]; params[0..=15].copy_from_slice(&self.trusting_period.as_nanos().to_be_bytes()); @@ -258,14 +258,14 @@ impl EthABIEncoder for WithinTrustingPeriodContext { .as_unix_timestamp_nanos() .to_be_bytes(), ); - EthABIWithinTrustingPeriodContext { + EthABITrustingPeriodContext { params: params.to_vec(), timestamps: timestamps.to_vec(), } .encode() } fn ethabi_decode(bz: &[u8]) -> Result { - let c = EthABIWithinTrustingPeriodContext::decode(bz)?; + let c = EthABITrustingPeriodContext::decode(bz)?; let trusting_period = nanos_to_duration(u128::from_be_bytes(c.params[0..=15].try_into().unwrap()))?; let clock_drift = @@ -285,13 +285,13 @@ impl EthABIEncoder for WithinTrustingPeriodContext { } } -impl From for CommitmentContext { - fn from(ctx: WithinTrustingPeriodContext) -> Self { - CommitmentContext::WithinTrustingPeriod(ctx) +impl From for CommitmentContext { + fn from(ctx: TrustingPeriodContext) -> Self { + CommitmentContext::TrustingPeriod(ctx) } } -pub(crate) struct EthABIWithinTrustingPeriodContext { +pub(crate) struct EthABITrustingPeriodContext { // bytes32 in solidity // MSB first // 0-15: trusting_period @@ -302,7 +302,7 @@ pub(crate) struct EthABIWithinTrustingPeriodContext { pub timestamps: ethabi::FixedBytes, } -impl EthABIWithinTrustingPeriodContext { +impl EthABITrustingPeriodContext { fn encode(self) -> Vec { use ethabi::Token; ethabi::encode(&[Token::Tuple(vec![ @@ -336,8 +336,10 @@ impl EthABIWithinTrustingPeriodContext { #[cfg(test)] mod tests { use super::*; + use crate::errors::ErrorDetail; use lcp_types::MAX_UNIX_TIMESTAMP_NANOS; use proptest::prelude::*; + use time::{macros::datetime, OffsetDateTime}; proptest! { #[test] @@ -347,7 +349,7 @@ mod tests { untrusted_header_timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, trusted_state_timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS ) { - let ctx: CommitmentContext = WithinTrustingPeriodContext::new( + let ctx: CommitmentContext = TrustingPeriodContext::new( nanos_to_duration(trusting_period).unwrap(), nanos_to_duration(clock_drift).unwrap(), Time::from_unix_timestamp_nanos(untrusted_header_timestamp).unwrap(), @@ -360,8 +362,8 @@ mod tests { } #[test] - fn test_none_context_serialization() { - let ctx = CommitmentContext::None; + fn test_empty_context_serialization() { + let ctx = CommitmentContext::Empty; let bz = ctx.clone().ethabi_encode(); let ctx2 = CommitmentContext::ethabi_decode(&bz).unwrap(); assert_eq!(ctx, ctx2); @@ -369,7 +371,7 @@ mod tests { #[test] fn test_trusting_period_context_serialization() { - let ctx = CommitmentContext::WithinTrustingPeriod(WithinTrustingPeriodContext::new( + let ctx = CommitmentContext::TrustingPeriod(TrustingPeriodContext::new( Duration::new(60 * 60 * 24, 0), Duration::new(60 * 60, 0), Time::now(), @@ -382,14 +384,14 @@ mod tests { #[test] fn test_context_header() { - let ctx = CommitmentContext::None; + let ctx = CommitmentContext::Empty; let header = ctx.header(); assert_eq!( - COMMITMENT_CONTEXT_TYPE_NONE, + COMMITMENT_CONTEXT_TYPE_EMPTY, CommitmentContext::parse_context_type_from_header(&header).unwrap() ); - let ctx = CommitmentContext::WithinTrustingPeriod(WithinTrustingPeriodContext::new( + let ctx = CommitmentContext::TrustingPeriod(TrustingPeriodContext::new( Duration::new(60 * 60 * 24, 0), Duration::new(60 * 60, 0), Time::now(), @@ -401,4 +403,135 @@ mod tests { CommitmentContext::parse_context_type_from_header(&header).unwrap() ); } + + fn build_trusting_period_context( + trusting_period_nanos: u128, + clock_drift_nanos: u128, + untrusted_header_timestamp: OffsetDateTime, + trusted_state_timestamp: OffsetDateTime, + ) -> TrustingPeriodContext { + TrustingPeriodContext::new( + nanos_to_duration(trusting_period_nanos).unwrap(), + nanos_to_duration(clock_drift_nanos).unwrap(), + Time::from_unix_timestamp_nanos( + untrusted_header_timestamp.unix_timestamp_nanos() as u128 + ) + .unwrap(), + Time::from_unix_timestamp_nanos(trusted_state_timestamp.unix_timestamp_nanos() as u128) + .unwrap(), + ) + } + + fn validate_and_assert_no_error(ctx: TrustingPeriodContext, current_timestamp: OffsetDateTime) { + let res = ctx.validate( + Time::from_unix_timestamp_nanos(current_timestamp.unix_timestamp_nanos() as u128) + .unwrap(), + ); + assert!(res.is_ok(), "{:?}", res); + } + + fn validate_and_assert_trusting_period_error( + ctx: TrustingPeriodContext, + current_timestamp: OffsetDateTime, + ) { + let res = ctx.validate( + Time::from_unix_timestamp_nanos(current_timestamp.unix_timestamp_nanos() as u128) + .unwrap(), + ); + assert!(res.is_err()); + if let ErrorDetail::OutOfTrustingPeriod(_) = res.as_ref().err().unwrap().detail() { + } else { + assert!(false); + } + } + + fn validate_and_assert_clock_drift_error( + ctx: TrustingPeriodContext, + current_timestamp: OffsetDateTime, + ) { + let res = ctx.validate( + Time::from_unix_timestamp_nanos(current_timestamp.unix_timestamp_nanos() as u128) + .unwrap(), + ); + assert!(res.is_err()); + if let ErrorDetail::HeaderFromFuture(_) = res.as_ref().err().unwrap().detail() { + } else { + assert!(false); + } + } + + #[test] + fn test_trusting_period_context() { + { + let current_timestamp = datetime!(2023-08-20 0:00 UTC); + let untrusted_header_timestamp = datetime!(2023-08-20 0:00 UTC); + let trusted_state_timestamp = datetime!(2023-08-20 0:00 UTC); + let ctx = build_trusting_period_context( + 1, + 1, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_no_error(ctx, current_timestamp); + } + + // trusting_period + { + let current_timestamp = datetime!(2023-08-20 0:00 UTC); + let untrusted_header_timestamp = current_timestamp - Duration::new(0, 1); + let trusted_state_timestamp = untrusted_header_timestamp - Duration::new(0, 1); + + let ctx = build_trusting_period_context( + 1, + 0, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_trusting_period_error(ctx, current_timestamp); + + let ctx = build_trusting_period_context( + 2, + 0, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_trusting_period_error(ctx, current_timestamp); + + let ctx = build_trusting_period_context( + 3, + 0, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_no_error(ctx, current_timestamp); + } + + // clock drift + { + let current_timestamp = datetime!(2023-08-20 0:00 UTC); + let untrusted_header_timestamp = current_timestamp + Duration::new(0, 1); + let trusted_state_timestamp = current_timestamp; + let ctx = build_trusting_period_context( + 1, + 0, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_clock_drift_error(ctx, current_timestamp); + let ctx = build_trusting_period_context( + 1, + 1, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_clock_drift_error(ctx, current_timestamp); + let ctx = build_trusting_period_context( + 1, + 2, + untrusted_header_timestamp, + trusted_state_timestamp, + ); + validate_and_assert_no_error(ctx, current_timestamp); + } + } } diff --git a/modules/commitments/src/lib.rs b/modules/commitments/src/lib.rs index 79789255..81340b62 100644 --- a/modules/commitments/src/lib.rs +++ b/modules/commitments/src/lib.rs @@ -22,7 +22,7 @@ mod prelude { pub use commitment::{ Commitment, CommitmentPrefix, EthABIEncoder, StateCommitment, UpdateClientCommitment, }; -pub use context::{CommitmentContext, WithinTrustingPeriodContext}; +pub use context::{CommitmentContext, TrustingPeriodContext}; pub use errors::Error; pub use proof::CommitmentProof; pub use prover::prove_commitment; diff --git a/modules/mock-lc/src/client.rs b/modules/mock-lc/src/client.rs index 04e1f018..92b1bf84 100644 --- a/modules/mock-lc/src/client.rs +++ b/modules/mock-lc/src/client.rs @@ -57,7 +57,7 @@ impl LightClient for MockLightClient { prev_height: None, new_height: height, timestamp, - context: CommitmentContext::None, + context: CommitmentContext::Empty, } .into(), prove: false, @@ -140,7 +140,7 @@ impl LightClient for MockLightClient { prev_height: Some(latest_height.into()), new_height: height, timestamp: header_timestamp, - context: CommitmentContext::None, + context: CommitmentContext::Empty, } .into(), prove: true, diff --git a/modules/tendermint-lc/src/client.rs b/modules/tendermint-lc/src/client.rs index 7cc5b814..f6d6cbce 100644 --- a/modules/tendermint-lc/src/client.rs +++ b/modules/tendermint-lc/src/client.rs @@ -3,8 +3,8 @@ use crate::header::Header; use crate::prelude::*; use crate::state::{canonicalize_state, gen_state_id, ClientState, ConsensusState}; use commitments::{ - CommitmentContext, CommitmentPrefix, StateCommitment, UpdateClientCommitment, - WithinTrustingPeriodContext, + CommitmentContext, CommitmentPrefix, StateCommitment, TrustingPeriodContext, + UpdateClientCommitment, }; use core::str::FromStr; use crypto::Keccak256; @@ -80,7 +80,7 @@ impl LightClient for TendermintLightClient { prev_height: None, new_height: height, timestamp, - context: CommitmentContext::None, + context: CommitmentContext::Empty, } .into(), prove: false, @@ -198,7 +198,7 @@ impl LightClient for TendermintLightClient { prev_height: Some(header.trusted_height.into()), new_height: height, timestamp: header_timestamp, - context: WithinTrustingPeriodContext::new( + context: TrustingPeriodContext::new( lc_opts.trusting_period, lc_opts.clock_drift, header_timestamp, From 83a442ea6eee669cbbcf3912bfd839528b73816b Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Mon, 21 Aug 2023 11:43:45 +0900 Subject: [PATCH 7/8] commitments: fix lint errors Signed-off-by: Jun Kimura --- modules/commitments/src/commitment.rs | 4 ++-- modules/commitments/src/context.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/commitments/src/commitment.rs b/modules/commitments/src/commitment.rs index 43053600..759cb423 100644 --- a/modules/commitments/src/commitment.rs +++ b/modules/commitments/src/commitment.rs @@ -558,7 +558,7 @@ mod tests { fn pt_update_client_commitment_with_empty_context( prev_state_id in any::>().prop_map(|v| v.map(StateID::from)), new_state_id in any::<[u8; 32]>().prop_map(StateID::from), - new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || t.as_ref().unwrap().0.len() > 0), + new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || !t.as_ref().unwrap().0.is_empty()), prev_height in any::>().prop_map(|v| v.map(height_from_tuple)), new_height in any::<(u64, u64)>().prop_map(height_from_tuple), timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, @@ -587,7 +587,7 @@ mod tests { fn pt_update_client_commitment_with_trusting_period_context( prev_state_id in any::>().prop_map(|v| v.map(StateID::from)), new_state_id in any::<[u8; 32]>().prop_map(StateID::from), - new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || t.as_ref().unwrap().0.len() > 0), + new_state in any::)>>().prop_filter("type_url length must be greater than 0", |t| t.is_none() || !t.as_ref().unwrap().0.is_empty()), prev_height in any::>().prop_map(|v| v.map(height_from_tuple)), new_height in any::<(u64, u64)>().prop_map(height_from_tuple), timestamp in ..=MAX_UNIX_TIMESTAMP_NANOS, diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs index 8a370892..9c67fb7e 100644 --- a/modules/commitments/src/context.rs +++ b/modules/commitments/src/context.rs @@ -441,7 +441,7 @@ mod tests { assert!(res.is_err()); if let ErrorDetail::OutOfTrustingPeriod(_) = res.as_ref().err().unwrap().detail() { } else { - assert!(false); + panic!("{:?}", res); } } @@ -456,7 +456,7 @@ mod tests { assert!(res.is_err()); if let ErrorDetail::HeaderFromFuture(_) = res.as_ref().err().unwrap().detail() { } else { - assert!(false); + panic!("{:?}", res); } } From 5bd8ce9d30a67d8a21eac1bee40fa11636532f2a Mon Sep 17 00:00:00 2001 From: Jun Kimura Date: Mon, 21 Aug 2023 14:25:47 +0900 Subject: [PATCH 8/8] commitments: fix trusting period context format Signed-off-by: Jun Kimura --- go/light-clients/lcp/types/commitment.go | 24 ++++++++++---------- modules/commitments/src/context.rs | 28 +++++++++++++----------- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/go/light-clients/lcp/types/commitment.go b/go/light-clients/lcp/types/commitment.go index ed5addbf..3eed967e 100644 --- a/go/light-clients/lcp/types/commitment.go +++ b/go/light-clients/lcp/types/commitment.go @@ -57,8 +57,8 @@ var ( }) trustingPeriodContextABI, _ = abi.NewType("tuple", "struct TrustingPeriodCommitmentContext", []abi.ArgumentMarshaling{ - {Name: "params", Type: "bytes32"}, {Name: "timestamps", Type: "bytes32"}, + {Name: "params", Type: "bytes32"}, }) stateCommitmentABI, _ = abi.NewType("tuple", "struct StateCommitment", []abi.ArgumentMarshaling{ @@ -105,26 +105,28 @@ func (NoneCommitmentContext) Validate(time.Time) error { // TrustingPeriodCommitmentContext is the commitment context for a commitment that requires the current time to be within the trusting period. type TrustingPeriodCommitmentContext struct { - TrustingPeriod big.Int - ClockDrift big.Int UntrustedHeaderTimestamp time.Time TrustedStateTimestamp time.Time + TrustingPeriod big.Int + ClockDrift big.Int } -func DecodeTrustingPeriodCommitmentContext(params, timestamps [32]byte) *TrustingPeriodCommitmentContext { - // MSB first +func DecodeTrustingPeriodCommitmentContext(timestamps, params [32]byte) *TrustingPeriodCommitmentContext { + // 0-15: untrusted_header_timestamp + // 16-31: trusted_state_timestamp + untrustedHeaderTimestamp := timestampNanosBytesToTime(timestamps[:16]) + trustedStateTimestamp := timestampNanosBytesToTime(timestamps[16:32]) + // 0-15: trusting_period // 16-31: clock_drift trustingPeriod := uint128BytesToBigInt(params[:16]) clockDrift := uint128BytesToBigInt(params[16:32]) - // 0-15: untrusted_header_timestamp - // 16-31: trusted_state_timestamp return &TrustingPeriodCommitmentContext{ + UntrustedHeaderTimestamp: untrustedHeaderTimestamp, + TrustedStateTimestamp: trustedStateTimestamp, TrustingPeriod: trustingPeriod, ClockDrift: clockDrift, - UntrustedHeaderTimestamp: timestampNanosBytesToTime(timestamps[:16]), - TrustedStateTimestamp: timestampNanosBytesToTime(timestamps[16:32]), } } @@ -369,10 +371,10 @@ func EthABIDecodeTrustingPeriodCommitmentContext(bz []byte) (*TrustingPeriodComm return nil, err } p := v[0].(struct { - Params [32]byte `json:"params"` Timestamps [32]byte `json:"timestamps"` + Params [32]byte `json:"params"` }) - return DecodeTrustingPeriodCommitmentContext(p.Params, p.Timestamps), nil + return DecodeTrustingPeriodCommitmentContext(p.Timestamps, p.Params), nil } func EthABIDecodeStateCommitment(bz []byte) (*StateCommitment, error) { diff --git a/modules/commitments/src/context.rs b/modules/commitments/src/context.rs index 9c67fb7e..cb685956 100644 --- a/modules/commitments/src/context.rs +++ b/modules/commitments/src/context.rs @@ -242,9 +242,6 @@ impl Display for TrustingPeriodContext { impl EthABIEncoder for TrustingPeriodContext { fn ethabi_encode(self) -> Vec { - let mut params = [0u8; 32]; - params[0..=15].copy_from_slice(&self.trusting_period.as_nanos().to_be_bytes()); - params[16..=31].copy_from_slice(&self.clock_drift.as_nanos().to_be_bytes()); let mut timestamps = [0u8; 32]; timestamps[0..=15].copy_from_slice( &self @@ -258,9 +255,12 @@ impl EthABIEncoder for TrustingPeriodContext { .as_unix_timestamp_nanos() .to_be_bytes(), ); + let mut params = [0u8; 32]; + params[0..=15].copy_from_slice(&self.trusting_period.as_nanos().to_be_bytes()); + params[16..=31].copy_from_slice(&self.clock_drift.as_nanos().to_be_bytes()); EthABITrustingPeriodContext { - params: params.to_vec(), timestamps: timestamps.to_vec(), + params: params.to_vec(), } .encode() } @@ -292,22 +292,24 @@ impl From for CommitmentContext { } pub(crate) struct EthABITrustingPeriodContext { - // bytes32 in solidity - // MSB first - // 0-15: trusting_period - // 16-31: clock_drift - pub params: ethabi::FixedBytes, - // 0-15: untrusted_header_timestamp - // 16-31: trusted_state_timestamp + /// bytes32 in solidity + /// MSB first + /// 0-15: untrusted_header_timestamp + /// 16-31: trusted_state_timestamp pub timestamps: ethabi::FixedBytes, + /// bytes32 in solidity + /// MSB first + /// 0-15: trusting_period + /// 16-31: clock_drift + pub params: ethabi::FixedBytes, } impl EthABITrustingPeriodContext { fn encode(self) -> Vec { use ethabi::Token; ethabi::encode(&[Token::Tuple(vec![ - Token::FixedBytes(self.params), Token::FixedBytes(self.timestamps), + Token::FixedBytes(self.params), ])]) } fn decode(bytes: &[u8]) -> Result { @@ -327,8 +329,8 @@ impl EthABITrustingPeriodContext { assert!(tuple.len() == 2); let mut values = tuple.into_iter(); Ok(Self { - params: values.next().unwrap().into_fixed_bytes().unwrap(), timestamps: values.next().unwrap().into_fixed_bytes().unwrap(), + params: values.next().unwrap().into_fixed_bytes().unwrap(), }) } }