From 2f3132fa3a1723be376fe075b1383413629902f3 Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Wed, 28 Sep 2022 20:21:49 +0530 Subject: [PATCH 01/34] Allowing for variable note plaintext and ciphertext sizes via moving to Domain implementation. --- components/zcash_note_encryption/src/batch.rs | 12 +- components/zcash_note_encryption/src/lib.rs | 269 +++++++++++++----- 2 files changed, 208 insertions(+), 73 deletions(-) diff --git a/components/zcash_note_encryption/src/batch.rs b/components/zcash_note_encryption/src/batch.rs index ad704167c2..4d01558ea6 100644 --- a/components/zcash_note_encryption/src/batch.rs +++ b/components/zcash_note_encryption/src/batch.rs @@ -3,8 +3,10 @@ use alloc::vec::Vec; // module is alloc only use crate::{ - try_compact_note_decryption_inner, try_note_decryption_inner, BatchDomain, EphemeralKeyBytes, - ShieldedOutput, COMPACT_NOTE_SIZE, ENC_CIPHERTEXT_SIZE, + try_compact_note_decryption_inner, try_note_decryption_inner, + BatchDomain, EphemeralKeyBytes, + ShieldedOutput, + // COMPACT_NOTE_SIZE, ENC_CIPHERTEXT_SIZE, }; /// Trial decryption of a batch of notes with a set of recipients. @@ -16,7 +18,7 @@ use crate::{ /// provided, along with the index in the `ivks` slice associated with /// the IVK that successfully decrypted the output. #[allow(clippy::type_complexity)] -pub fn try_note_decryption>( +pub fn try_note_decryption>( ivks: &[D::IncomingViewingKey], outputs: &[(D, Output)], ) -> Vec> { @@ -32,14 +34,14 @@ pub fn try_note_decryption>( +pub fn try_compact_note_decryption>( ivks: &[D::IncomingViewingKey], outputs: &[(D, Output)], ) -> Vec> { batch_note_decryption(ivks, outputs, try_compact_note_decryption_inner) } -fn batch_note_decryption, F, FR, const CS: usize>( +fn batch_note_decryption, F, FR>( ivks: &[D::IncomingViewingKey], outputs: &[(D, Output)], decrypt_inner: F, diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index b16146bb10..9bee3ccf90 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -95,8 +95,6 @@ impl ConstantTimeEq for EphemeralKeyBytes { } } -/// Newtype representing the byte encoding of a note plaintext. -pub struct NotePlaintextBytes(pub [u8; NOTE_PLAINTEXT_SIZE]); /// Newtype representing the byte encoding of a outgoing plaintext. pub struct OutPlaintextBytes(pub [u8; OUT_PLAINTEXT_SIZE]); @@ -106,6 +104,58 @@ enum NoteValidity { Invalid, } +// /// Enum for the note plaintext. +// /// The variants represent whether the note is a full note or a compact note. +// #[derive(Copy, Clone, PartialEq, Eq)] +// enum NotePlaintext { +// Full(D::NotePlaintextBytes), +// Compact(D::CompactNotePlaintextBytes), +// } + +/// Enum for the note ciphertext. +/// The variants represent whether the encrypted note is a full note or a compact note. +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum NoteCiphertext { + Full(D::EncNoteCiphertextBytes), + Compact(D::CompactEncNoteCiphertextBytes), +} + +// /// Function to extract the full note plaintext from the `NotePlaintext` enum. +// /// Returns `None` if the enum variant is `Compact`. +// pub fn extract_full_note_plaintext(np: NotePlaintext) -> Option { +// match np { +// NotePlaintext::Full(x) => Some(x), +// NotePlaintext::Compact(_) => None, +// } +// } + +// /// Function to extract the compact note plaintext from the `NotePlaintext` enum. +// /// Returns `None` if the enum variant is `Full`. +// pub fn extract_compact_note_plaintext(np: NotePlaintext) -> Option { +// match np { +// NotePlaintext::Full(_) => None, +// NotePlaintext::Compact(x) => Some(x), +// } +// } + +/// Function to extract the full encrypted note ciphertext from the `NoteCiphertext` enum. +/// Returns `None` if the enum variant is `Compact`. +pub fn extract_full_note_ciphertext(nc: NoteCiphertext) -> Option { + match nc { + NoteCiphertext::Full(x) => Some(x), + NoteCiphertext::Compact(_) => None, + } +} + +/// Function to extract the compact encrypted note ciphertext from the `NoteCiphertext` enum. +/// Returns `None` if the enum variant is `Full`. +pub fn extract_compact_note_ciphertext(nc: NoteCiphertext) -> Option { + match nc { + NoteCiphertext::Full(_) => None, + NoteCiphertext::Compact(x) => Some(x), + } +} + /// Trait that encapsulates protocol-specific note encryption types and logic. /// /// This trait enables most of the note encryption logic to be shared between Sapling and @@ -117,6 +167,10 @@ pub trait Domain { type SharedSecret; type SymmetricKey: AsRef<[u8]>; type Note; + type NotePlaintextBytes; + type EncNoteCiphertextBytes; + type CompactNotePlaintextBytes; + type CompactEncNoteCiphertextBytes; type Recipient; type DiversifiedTransmissionKey; type IncomingViewingKey; @@ -186,7 +240,7 @@ pub trait Domain { note: &Self::Note, recipient: &Self::Recipient, memo: &Self::Memo, - ) -> NotePlaintextBytes; + ) -> Self::NotePlaintextBytes; /// Derives the [`OutgoingCipherKey`] for an encrypted note, given the note-specific /// public data and an `OutgoingViewingKey`. @@ -228,13 +282,12 @@ pub trait Domain { /// /// [ZIP 212]: https://zips.z.cash/zip-0212 /// - /// # Panics - /// - /// Panics if `plaintext` is shorter than [`COMPACT_NOTE_SIZE`]. + /// This function only takes in plaintext bytes with the memo removed, as in compact notes. + /// If working with full notes, first convert to compact note using `convert_to_compact_plaintext`. fn parse_note_plaintext_without_memo_ivk( &self, ivk: &Self::IncomingViewingKey, - plaintext: &[u8], + plaintext: &Self::CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)>; /// Parses the given note plaintext from the sender's perspective. @@ -251,12 +304,15 @@ pub trait Domain { /// such as rules like [ZIP 212] that become active at a specific block height. /// /// [ZIP 212]: https://zips.z.cash/zip-0212 + /// + /// This function only takes in plaintext bytes with the memo removed, as in compact notes. + /// If working with full notes, first convert to compact note using `convert_to_compact_plaintext`. fn parse_note_plaintext_without_memo_ovk( &self, pk_d: &Self::DiversifiedTransmissionKey, esk: &Self::EphemeralSecretKey, ephemeral_key: &EphemeralKeyBytes, - plaintext: &NotePlaintextBytes, + plaintext: &Self::CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)>; /// Extracts the memo field from the given note plaintext. @@ -265,7 +321,7 @@ pub trait Domain { /// /// `&self` is passed here in anticipation of future changes to memo handling, where /// the memos may no longer be part of the note plaintext. - fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo; + fn extract_memo(&self, plaintext: &Self::NotePlaintextBytes) -> Self::Memo; /// Parses the `DiversifiedTransmissionKey` field of the outgoing plaintext. /// @@ -278,6 +334,35 @@ pub trait Domain { /// Returns `None` if `out_plaintext` does not contain a valid byte encoding of an /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; + + /// Returns a vector with the bytes of the note plaintext. + fn vec_note_plaintext(plaintext: &Self::NotePlaintextBytes) -> Vec; + + /// Returns a vector with the bytes of the encrypted note ciphertext. + fn vec_enc_note_ciphertext(enc_note_ciphertext: &Self::EncNoteCiphertextBytes) -> Vec; + + /// Performs the inner encryption logic given the key and the note plaintext, and returns + /// the encrypted note ciphertext. + fn encrypt_with_key( + key: Self::SymmetricKey, + input: Self::NotePlaintextBytes, + ) -> Self::EncNoteCiphertextBytes; + + /// Performs the inner decryption logic given the key and the encrypted note ciphertext, + /// and returns the note plaintext. + fn decrypt_with_key( + key: &Self::SymmetricKey, + enc_ciphertext: Self::EncNoteCiphertextBytes, + ) -> Self::NotePlaintextBytes; + + /// Performs the inner decryption logic for compct notes given the key and the + /// compact encrypted note ciphertext, and returns the compact note plaintext. + fn decrypt_compact_with_key( + key: &Self::SymmetricKey, + enc_ciphertext: Self::CompactEncNoteCiphertextBytes, + ) -> Self::CompactNotePlaintextBytes; + + fn convert_to_compact_plaintext(full_note: &Self::NotePlaintextBytes) -> Self::CompactNotePlaintextBytes; } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -324,11 +409,7 @@ pub trait BatchDomain: Domain { } /// Trait that provides access to the components of an encrypted transaction output. -/// -/// Implementations of this trait are required to define the length of their ciphertext -/// field. In order to use the trial decryption APIs in this crate, the length must be -/// either [`ENC_CIPHERTEXT_SIZE`] or [`COMPACT_NOTE_SIZE`]. -pub trait ShieldedOutput { +pub trait ShieldedOutput { /// Exposes the `ephemeral_key` field of the output. fn ephemeral_key(&self) -> EphemeralKeyBytes; @@ -336,7 +417,7 @@ pub trait ShieldedOutput { fn cmstar_bytes(&self) -> D::ExtractedCommitmentBytes; /// Exposes the note ciphertext of the output. - fn enc_ciphertext(&self) -> &[u8; CIPHERTEXT_SIZE]; + fn enc_ciphertext(&self) -> NoteCiphertext; } /// A struct containing context required for encrypting Sapling and Orchard notes. @@ -454,24 +535,25 @@ impl NoteEncryption { } /// Generates `encCiphertext` for this note. - pub fn encrypt_note_plaintext(&self) -> [u8; ENC_CIPHERTEXT_SIZE] { + pub fn encrypt_note_plaintext(&self) -> D::EncNoteCiphertextBytes { let pk_d = D::get_pk_d(&self.note); let shared_secret = D::ka_agree_enc(&self.esk, &pk_d); let key = D::kdf(shared_secret, &D::epk_bytes(&self.epk)); let input = D::note_plaintext_bytes(&self.note, &self.to, &self.memo); - let mut output = [0u8; ENC_CIPHERTEXT_SIZE]; - output[..NOTE_PLAINTEXT_SIZE].copy_from_slice(&input.0); - let tag = ChaCha20Poly1305::new(key.as_ref().into()) - .encrypt_in_place_detached( - [0u8; 12][..].into(), - &[], - &mut output[..NOTE_PLAINTEXT_SIZE], - ) - .unwrap(); - output[NOTE_PLAINTEXT_SIZE..].copy_from_slice(&tag); - - output + D::encrypt_with_key(key, input) + // let mut output = [0u8; ENC_CIPHERTEXT_SIZE]; + // output[..NOTE_PLAINTEXT_SIZE].copy_from_slice(&input.0); + // let tag = ChaCha20Poly1305::new(key.as_ref().into()) + // .encrypt_in_place_detached( + // [0u8; 12][..].into(), + // &[], + // &mut output[..NOTE_PLAINTEXT_SIZE], + // ) + // .unwrap(); + // output[NOTE_PLAINTEXT_SIZE..].copy_from_slice(&tag); + // + // output } /// Generates `outCiphertext` for this note. @@ -516,7 +598,12 @@ impl NoteEncryption { /// /// Implements section 4.19.2 of the /// [Zcash Protocol Specification](https://zips.z.cash/protocol/nu5.pdf#decryptivk). -pub fn try_note_decryption>( +/// +/// This function is only meant to be used with full notes, not compact notes. +/// If the note is a compact note, then this function returns `None`. +/// +/// For compact notes, use 'try_compact_note_decryption` and `try_compact_note_decryption_inner`. +pub fn try_note_decryption>( domain: &D, ivk: &D::IncomingViewingKey, output: &Output, @@ -530,45 +617,59 @@ pub fn try_note_decryption>( +/// This function is only meant to be used with full notes, not compact notes. +/// If the note is a compact note, then this function returns `None`. +/// +/// For compact notes, use 'try_compact_note_decryption` and `try_compact_note_decryption_inner`. +fn try_note_decryption_inner>( domain: &D, ivk: &D::IncomingViewingKey, ephemeral_key: &EphemeralKeyBytes, output: &Output, key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext = output.enc_ciphertext(); - let mut plaintext = - NotePlaintextBytes(enc_ciphertext[..NOTE_PLAINTEXT_SIZE].try_into().unwrap()); + let enc_ciphertext: D::EncNoteCiphertextBytes; + if let Some(x) = extract_full_note_ciphertext(output.enc_ciphertext()) { + enc_ciphertext = x; + } else { + return None; + } - ChaCha20Poly1305::new(key.as_ref().into()) - .decrypt_in_place_detached( - [0u8; 12][..].into(), - &[], - &mut plaintext.0, - enc_ciphertext[NOTE_PLAINTEXT_SIZE..].into(), - ) - .ok()?; + let plaintext = D::decrypt_with_key(key, enc_ciphertext); + let compact_plaintext = D::convert_to_compact_plaintext(&plaintext); + // let mut plaintext = + // NotePlaintextBytes(enc_ciphertext[..NOTE_PLAINTEXT_SIZE].try_into().unwrap()); + // + // ChaCha20Poly1305::new(key.as_ref().into()) + // .decrypt_in_place_detached( + // [0u8; 12][..].into(), + // &[], + // &mut plaintext.0, + // enc_ciphertext[NOTE_PLAINTEXT_SIZE..].into(), + // ) + // .ok()?; let (note, to) = parse_note_plaintext_without_memo_ivk( domain, ivk, ephemeral_key, &output.cmstar_bytes(), - &plaintext.0, + &compact_plaintext, )?; let memo = domain.extract_memo(&plaintext); Some((note, to, memo)) } +/// This function only takes in plaintext bytes with the memo removed, as in compact notes. +/// If working with full notes, first convert to compact note using `convert_to_compact_plaintext`. fn parse_note_plaintext_without_memo_ivk( domain: &D, ivk: &D::IncomingViewingKey, ephemeral_key: &EphemeralKeyBytes, cmstar_bytes: &D::ExtractedCommitmentBytes, - plaintext: &[u8], + plaintext: &D::CompactNotePlaintextBytes, ) -> Option<(D::Note, D::Recipient)> { let (note, to) = domain.parse_note_plaintext_without_memo_ivk(ivk, plaintext)?; @@ -613,7 +714,12 @@ fn check_note_validity( /// Implements the procedure specified in [`ZIP 307`]. /// /// [`ZIP 307`]: https://zips.z.cash/zip-0307 -pub fn try_compact_note_decryption>( +/// +/// This function is only meant to be used with compact notes, not full notes. +/// If the note is a full note, then this function returns `None`. +/// +/// For full notes, use 'try_note_decryption` and `try_note_decryption_inner`. +pub fn try_compact_note_decryption>( domain: &D, ivk: &D::IncomingViewingKey, output: &Output, @@ -627,19 +733,32 @@ pub fn try_compact_note_decryption>( +/// This function is only meant to be used with compact notes, not full notes. +/// If the note is a full note, then this function returns `None`. +/// +/// For full notes, use 'try_note_decryption` and `try_note_decryption_inner`. +fn try_compact_note_decryption_inner>( domain: &D, ivk: &D::IncomingViewingKey, ephemeral_key: &EphemeralKeyBytes, output: &Output, key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient)> { - // Start from block 1 to skip over Poly1305 keying output - let mut plaintext = [0; COMPACT_NOTE_SIZE]; - plaintext.copy_from_slice(output.enc_ciphertext()); - let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); - keystream.seek(64); - keystream.apply_keystream(&mut plaintext); + + let enc_ciphertext: D::CompactEncNoteCiphertextBytes; + if let Some(x) = extract_compact_note_ciphertext(output.enc_ciphertext()) { + enc_ciphertext = x; + } else { + return None; + } + + let plaintext = D::decrypt_compact_with_key(key, enc_ciphertext); + // // Start from block 1 to skip over Poly1305 keying output + // let mut plaintext = [0; COMPACT_NOTE_SIZE]; + // plaintext.copy_from_slice(output.enc_ciphertext()); + // let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); + // keystream.seek(64); + // keystream.apply_keystream(&mut plaintext); parse_note_plaintext_without_memo_ivk( domain, @@ -659,7 +778,10 @@ fn try_compact_note_decryption_inner>( +/// +/// This function is only meant to be used with full notes, not compact notes. +/// If the note is a compact note, then this function returns `None`. +pub fn try_output_recovery_with_ovk>( domain: &D, ovk: &D::OutgoingViewingKey, output: &Output, @@ -679,13 +801,22 @@ pub fn try_output_recovery_with_ovk>( +/// +/// This function is only meant to be used with full notes, not compact notes. +/// If the note is a compact note, then this function returns `None`. +pub fn try_output_recovery_with_ock>( domain: &D, ock: &OutgoingCipherKey, output: &Output, out_ciphertext: &[u8; OUT_CIPHERTEXT_SIZE], ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext = output.enc_ciphertext(); + + let enc_ciphertext: D::EncNoteCiphertextBytes; + if let Some(x) = extract_full_note_ciphertext(output.enc_ciphertext()) { + enc_ciphertext = x; + } else { + return None; + } let mut op = OutPlaintextBytes([0; OUT_PLAINTEXT_SIZE]); op.0.copy_from_slice(&out_ciphertext[..OUT_PLAINTEXT_SIZE]); @@ -709,22 +840,24 @@ pub fn try_output_recovery_with_ock Date: Fri, 30 Sep 2022 17:48:01 +0530 Subject: [PATCH 02/34] cleaning up and removing commented code, ready for review --- components/zcash_note_encryption/src/batch.rs | 1 - components/zcash_note_encryption/src/lib.rs | 68 ------------------- 2 files changed, 69 deletions(-) diff --git a/components/zcash_note_encryption/src/batch.rs b/components/zcash_note_encryption/src/batch.rs index 4d01558ea6..f73b1694eb 100644 --- a/components/zcash_note_encryption/src/batch.rs +++ b/components/zcash_note_encryption/src/batch.rs @@ -6,7 +6,6 @@ use crate::{ try_compact_note_decryption_inner, try_note_decryption_inner, BatchDomain, EphemeralKeyBytes, ShieldedOutput, - // COMPACT_NOTE_SIZE, ENC_CIPHERTEXT_SIZE, }; /// Trial decryption of a batch of notes with a set of recipients. diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 9bee3ccf90..e147d64adb 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -104,14 +104,6 @@ enum NoteValidity { Invalid, } -// /// Enum for the note plaintext. -// /// The variants represent whether the note is a full note or a compact note. -// #[derive(Copy, Clone, PartialEq, Eq)] -// enum NotePlaintext { -// Full(D::NotePlaintextBytes), -// Compact(D::CompactNotePlaintextBytes), -// } - /// Enum for the note ciphertext. /// The variants represent whether the encrypted note is a full note or a compact note. #[derive(Copy, Clone, PartialEq, Eq)] @@ -120,24 +112,6 @@ pub enum NoteCiphertext { Compact(D::CompactEncNoteCiphertextBytes), } -// /// Function to extract the full note plaintext from the `NotePlaintext` enum. -// /// Returns `None` if the enum variant is `Compact`. -// pub fn extract_full_note_plaintext(np: NotePlaintext) -> Option { -// match np { -// NotePlaintext::Full(x) => Some(x), -// NotePlaintext::Compact(_) => None, -// } -// } - -// /// Function to extract the compact note plaintext from the `NotePlaintext` enum. -// /// Returns `None` if the enum variant is `Full`. -// pub fn extract_compact_note_plaintext(np: NotePlaintext) -> Option { -// match np { -// NotePlaintext::Full(_) => None, -// NotePlaintext::Compact(x) => Some(x), -// } -// } - /// Function to extract the full encrypted note ciphertext from the `NoteCiphertext` enum. /// Returns `None` if the enum variant is `Compact`. pub fn extract_full_note_ciphertext(nc: NoteCiphertext) -> Option { @@ -542,18 +516,6 @@ impl NoteEncryption { let input = D::note_plaintext_bytes(&self.note, &self.to, &self.memo); D::encrypt_with_key(key, input) - // let mut output = [0u8; ENC_CIPHERTEXT_SIZE]; - // output[..NOTE_PLAINTEXT_SIZE].copy_from_slice(&input.0); - // let tag = ChaCha20Poly1305::new(key.as_ref().into()) - // .encrypt_in_place_detached( - // [0u8; 12][..].into(), - // &[], - // &mut output[..NOTE_PLAINTEXT_SIZE], - // ) - // .unwrap(); - // output[NOTE_PLAINTEXT_SIZE..].copy_from_slice(&tag); - // - // output } /// Generates `outCiphertext` for this note. @@ -638,17 +600,6 @@ fn try_note_decryption_inner>( let plaintext = D::decrypt_with_key(key, enc_ciphertext); let compact_plaintext = D::convert_to_compact_plaintext(&plaintext); - // let mut plaintext = - // NotePlaintextBytes(enc_ciphertext[..NOTE_PLAINTEXT_SIZE].try_into().unwrap()); - // - // ChaCha20Poly1305::new(key.as_ref().into()) - // .decrypt_in_place_detached( - // [0u8; 12][..].into(), - // &[], - // &mut plaintext.0, - // enc_ciphertext[NOTE_PLAINTEXT_SIZE..].into(), - // ) - // .ok()?; let (note, to) = parse_note_plaintext_without_memo_ivk( domain, @@ -753,12 +704,6 @@ fn try_compact_note_decryption_inner>( } let plaintext = D::decrypt_compact_with_key(key, enc_ciphertext); - // // Start from block 1 to skip over Poly1305 keying output - // let mut plaintext = [0; COMPACT_NOTE_SIZE]; - // plaintext.copy_from_slice(output.enc_ciphertext()); - // let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); - // keystream.seek(64); - // keystream.apply_keystream(&mut plaintext); parse_note_plaintext_without_memo_ivk( domain, @@ -842,19 +787,6 @@ pub fn try_output_recovery_with_ock>( let plaintext = D::decrypt_with_key(&key, enc_ciphertext); let compact_plaintext = D::convert_to_compact_plaintext(&plaintext); - // let mut plaintext = NotePlaintextBytes([0; NOTE_PLAINTEXT_SIZE]); - // plaintext - // .0 - // .copy_from_slice(&enc_ciphertext[..NOTE_PLAINTEXT_SIZE]); - // - // ChaCha20Poly1305::new(key.as_ref().into()) - // .decrypt_in_place_detached( - // [0u8; 12][..].into(), - // &[], - // &mut plaintext.0, - // enc_ciphertext[NOTE_PLAINTEXT_SIZE..].into(), - // ) - // .ok()?; let (note, to) = domain.parse_note_plaintext_without_memo_ovk(&pk_d, &esk, &ephemeral_key, &compact_plaintext)?; From 9ff53eca36451ea9795c1b90457347f0b71257aa Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Wed, 5 Oct 2022 18:19:23 +0530 Subject: [PATCH 03/34] partial improvements based on comments --- components/zcash_note_encryption/src/lib.rs | 51 ++++++--------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index e147d64adb..fc49ab6afc 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -45,8 +45,10 @@ pub const COMPACT_NOTE_SIZE: usize = 1 + // version 11 + // diversifier 8 + // value 32; // rseed (or rcm prior to ZIP 212) -/// The size of [`NotePlaintextBytes`]. -pub const NOTE_PLAINTEXT_SIZE: usize = COMPACT_NOTE_SIZE + 512; +/// The size of the memo. +const MEMO_SIZE: usize = 512; +/// The size of the original encoding of NotePlaintextBytes. +pub const NOTE_PLAINTEXT_SIZE: usize = COMPACT_NOTE_SIZE + MEMO_SIZE; /// The size of [`OutPlaintextBytes`]. pub const OUT_PLAINTEXT_SIZE: usize = 32 + // pk_d 32; // esk @@ -112,24 +114,6 @@ pub enum NoteCiphertext { Compact(D::CompactEncNoteCiphertextBytes), } -/// Function to extract the full encrypted note ciphertext from the `NoteCiphertext` enum. -/// Returns `None` if the enum variant is `Compact`. -pub fn extract_full_note_ciphertext(nc: NoteCiphertext) -> Option { - match nc { - NoteCiphertext::Full(x) => Some(x), - NoteCiphertext::Compact(_) => None, - } -} - -/// Function to extract the compact encrypted note ciphertext from the `NoteCiphertext` enum. -/// Returns `None` if the enum variant is `Full`. -pub fn extract_compact_note_ciphertext(nc: NoteCiphertext) -> Option { - match nc { - NoteCiphertext::Full(_) => None, - NoteCiphertext::Compact(x) => Some(x), - } -} - /// Trait that encapsulates protocol-specific note encryption types and logic. /// /// This trait enables most of the note encryption logic to be shared between Sapling and @@ -309,12 +293,6 @@ pub trait Domain { /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; - /// Returns a vector with the bytes of the note plaintext. - fn vec_note_plaintext(plaintext: &Self::NotePlaintextBytes) -> Vec; - - /// Returns a vector with the bytes of the encrypted note ciphertext. - fn vec_enc_note_ciphertext(enc_note_ciphertext: &Self::EncNoteCiphertextBytes) -> Vec; - /// Performs the inner encryption logic given the key and the note plaintext, and returns /// the encrypted note ciphertext. fn encrypt_with_key( @@ -592,10 +570,9 @@ fn try_note_decryption_inner>( ) -> Option<(D::Note, D::Recipient, D::Memo)> { let enc_ciphertext: D::EncNoteCiphertextBytes; - if let Some(x) = extract_full_note_ciphertext(output.enc_ciphertext()) { - enc_ciphertext = x; - } else { - return None; + match output.enc_ciphertext() { + NoteCiphertext::Full(x) => enc_ciphertext = x, + NoteCiphertext::Compact(_) => return None, } let plaintext = D::decrypt_with_key(key, enc_ciphertext); @@ -697,10 +674,9 @@ fn try_compact_note_decryption_inner>( ) -> Option<(D::Note, D::Recipient)> { let enc_ciphertext: D::CompactEncNoteCiphertextBytes; - if let Some(x) = extract_compact_note_ciphertext(output.enc_ciphertext()) { - enc_ciphertext = x; - } else { - return None; + match output.enc_ciphertext() { + NoteCiphertext::::Compact(x) => enc_ciphertext = x, + NoteCiphertext::::Full(_) => return None, } let plaintext = D::decrypt_compact_with_key(key, enc_ciphertext); @@ -757,10 +733,9 @@ pub fn try_output_recovery_with_ock>( ) -> Option<(D::Note, D::Recipient, D::Memo)> { let enc_ciphertext: D::EncNoteCiphertextBytes; - if let Some(x) = extract_full_note_ciphertext(output.enc_ciphertext()) { - enc_ciphertext = x; - } else { - return None; + match output.enc_ciphertext() { + NoteCiphertext::::Full(x) => enc_ciphertext = x, + NoteCiphertext::::Compact(_) => return None, } let mut op = OutPlaintextBytes([0; OUT_PLAINTEXT_SIZE]); From ea580e02d50212e7adf08232e34343726cc5df83 Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Thu, 6 Oct 2022 15:09:31 +0530 Subject: [PATCH 04/34] added to encrypt_note_plaintext --- components/zcash_note_encryption/src/lib.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index fc49ab6afc..58fe22cca5 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -125,7 +125,7 @@ pub trait Domain { type SharedSecret; type SymmetricKey: AsRef<[u8]>; type Note; - type NotePlaintextBytes; + type NotePlaintextBytes: AsMut<[u8]>; type EncNoteCiphertextBytes; type CompactNotePlaintextBytes; type CompactEncNoteCiphertextBytes; @@ -315,6 +315,8 @@ pub trait Domain { ) -> Self::CompactNotePlaintextBytes; fn convert_to_compact_plaintext(full_note: &Self::NotePlaintextBytes) -> Self::CompactNotePlaintextBytes; + + fn ciphertext_from_enc_plaintext_and_tag(enc_plaintext: Self::NotePlaintextBytes, tag: &[u8]) -> Self::EncNoteCiphertextBytes; } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -493,7 +495,16 @@ impl NoteEncryption { let key = D::kdf(shared_secret, &D::epk_bytes(&self.epk)); let input = D::note_plaintext_bytes(&self.note, &self.to, &self.memo); - D::encrypt_with_key(key, input) + let mut input_copy = input; + + let tag = ChaCha20Poly1305::new(key.as_ref().into()) + .encrypt_in_place_detached( + [0u8; 12][..].into(), + &[], + input_copy.as_mut(), + ) + .unwrap(); + D::ciphertext_from_enc_plaintext_and_tag(input_copy, &tag) } /// Generates `outCiphertext` for this note. From e0ab31e91ebefc7059b7cdd2ed74265922d23992 Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Thu, 6 Oct 2022 15:36:02 +0530 Subject: [PATCH 05/34] added to try_note_decryption_inner --- components/zcash_note_encryption/src/lib.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 58fe22cca5..ae0a474865 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -317,6 +317,8 @@ pub trait Domain { fn convert_to_compact_plaintext(full_note: &Self::NotePlaintextBytes) -> Self::CompactNotePlaintextBytes; fn ciphertext_from_enc_plaintext_and_tag(enc_plaintext: Self::NotePlaintextBytes, tag: &[u8]) -> Self::EncNoteCiphertextBytes; + + fn separate_tag_from_ciphertext(enc_ciphertext: Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -586,7 +588,19 @@ fn try_note_decryption_inner>( NoteCiphertext::Compact(_) => return None, } - let plaintext = D::decrypt_with_key(key, enc_ciphertext); + let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(enc_ciphertext); + let mut plaintext = enc_plaintext; + + ChaCha20Poly1305::new(key.as_ref().into()) + .decrypt_in_place_detached( + [0u8; 12][..].into(), + &[], + plaintext.as_mut(), + &tag.into(), + ) + .ok()?; + + // let plaintext = D::decrypt_with_key(key, enc_ciphertext); let compact_plaintext = D::convert_to_compact_plaintext(&plaintext); let (note, to) = parse_note_plaintext_without_memo_ivk( From 72ae97c7f9fcfe943ac560dd6ed057c01852c1f5 Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Thu, 6 Oct 2022 15:48:30 +0530 Subject: [PATCH 06/34] removed convert_to_compact_plaintext function in favour of From trait --- components/zcash_note_encryption/src/lib.rs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index ae0a474865..a75bb787cb 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -127,7 +127,7 @@ pub trait Domain { type Note; type NotePlaintextBytes: AsMut<[u8]>; type EncNoteCiphertextBytes; - type CompactNotePlaintextBytes; + type CompactNotePlaintextBytes: From; type CompactEncNoteCiphertextBytes; type Recipient; type DiversifiedTransmissionKey; @@ -241,7 +241,6 @@ pub trait Domain { /// [ZIP 212]: https://zips.z.cash/zip-0212 /// /// This function only takes in plaintext bytes with the memo removed, as in compact notes. - /// If working with full notes, first convert to compact note using `convert_to_compact_plaintext`. fn parse_note_plaintext_without_memo_ivk( &self, ivk: &Self::IncomingViewingKey, @@ -264,7 +263,6 @@ pub trait Domain { /// [ZIP 212]: https://zips.z.cash/zip-0212 /// /// This function only takes in plaintext bytes with the memo removed, as in compact notes. - /// If working with full notes, first convert to compact note using `convert_to_compact_plaintext`. fn parse_note_plaintext_without_memo_ovk( &self, pk_d: &Self::DiversifiedTransmissionKey, @@ -314,8 +312,6 @@ pub trait Domain { enc_ciphertext: Self::CompactEncNoteCiphertextBytes, ) -> Self::CompactNotePlaintextBytes; - fn convert_to_compact_plaintext(full_note: &Self::NotePlaintextBytes) -> Self::CompactNotePlaintextBytes; - fn ciphertext_from_enc_plaintext_and_tag(enc_plaintext: Self::NotePlaintextBytes, tag: &[u8]) -> Self::EncNoteCiphertextBytes; fn separate_tag_from_ciphertext(enc_ciphertext: Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); @@ -601,22 +597,21 @@ fn try_note_decryption_inner>( .ok()?; // let plaintext = D::decrypt_with_key(key, enc_ciphertext); - let compact_plaintext = D::convert_to_compact_plaintext(&plaintext); + + let memo = domain.extract_memo(&plaintext); let (note, to) = parse_note_plaintext_without_memo_ivk( domain, ivk, ephemeral_key, &output.cmstar_bytes(), - &compact_plaintext, + &plaintext.into(), )?; - let memo = domain.extract_memo(&plaintext); Some((note, to, memo)) } /// This function only takes in plaintext bytes with the memo removed, as in compact notes. -/// If working with full notes, first convert to compact note using `convert_to_compact_plaintext`. fn parse_note_plaintext_without_memo_ivk( domain: &D, ivk: &D::IncomingViewingKey, @@ -786,12 +781,12 @@ pub fn try_output_recovery_with_ock>( let key = D::kdf(shared_secret, &ephemeral_key); let plaintext = D::decrypt_with_key(&key, enc_ciphertext); - let compact_plaintext = D::convert_to_compact_plaintext(&plaintext); - let (note, to) = - domain.parse_note_plaintext_without_memo_ovk(&pk_d, &esk, &ephemeral_key, &compact_plaintext)?; let memo = domain.extract_memo(&plaintext); + let (note, to) = + domain.parse_note_plaintext_without_memo_ovk(&pk_d, &esk, &ephemeral_key, &plaintext.into())?; + // ZIP 212: Check that the esk provided to this function is consistent with the esk we // can derive from the note. if let Some(derived_esk) = D::derive_esk(¬e) { From 062d40a2f0f823b363b37125de49580a8ee0eaee Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Fri, 7 Oct 2022 22:11:01 +0530 Subject: [PATCH 07/34] completed AsMut related changes for the librustzcash --- components/zcash_note_encryption/src/lib.rs | 59 +++++++++++---------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index a75bb787cb..f3585278f2 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -33,6 +33,14 @@ use chacha20poly1305::{ ChaCha20Poly1305, }; +use chacha20::ChaCha20; + +use cipher::{ + KeyIvInit, + StreamCipher, + StreamCipherSeek, +}; + use rand_core::RngCore; use subtle::{Choice, ConstantTimeEq}; @@ -127,7 +135,7 @@ pub trait Domain { type Note; type NotePlaintextBytes: AsMut<[u8]>; type EncNoteCiphertextBytes; - type CompactNotePlaintextBytes: From; + type CompactNotePlaintextBytes: From + AsMut<[u8]>; type CompactEncNoteCiphertextBytes; type Recipient; type DiversifiedTransmissionKey; @@ -291,30 +299,11 @@ pub trait Domain { /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; - /// Performs the inner encryption logic given the key and the note plaintext, and returns - /// the encrypted note ciphertext. - fn encrypt_with_key( - key: Self::SymmetricKey, - input: Self::NotePlaintextBytes, - ) -> Self::EncNoteCiphertextBytes; - - /// Performs the inner decryption logic given the key and the encrypted note ciphertext, - /// and returns the note plaintext. - fn decrypt_with_key( - key: &Self::SymmetricKey, - enc_ciphertext: Self::EncNoteCiphertextBytes, - ) -> Self::NotePlaintextBytes; - - /// Performs the inner decryption logic for compct notes given the key and the - /// compact encrypted note ciphertext, and returns the compact note plaintext. - fn decrypt_compact_with_key( - key: &Self::SymmetricKey, - enc_ciphertext: Self::CompactEncNoteCiphertextBytes, - ) -> Self::CompactNotePlaintextBytes; - fn ciphertext_from_enc_plaintext_and_tag(enc_plaintext: Self::NotePlaintextBytes, tag: &[u8]) -> Self::EncNoteCiphertextBytes; fn separate_tag_from_ciphertext(enc_ciphertext: Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); + + fn convert_to_compact_plaintext_type(enc_ciphertext: Self::CompactEncNoteCiphertextBytes) -> Self::CompactNotePlaintextBytes; } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -491,18 +480,16 @@ impl NoteEncryption { let pk_d = D::get_pk_d(&self.note); let shared_secret = D::ka_agree_enc(&self.esk, &pk_d); let key = D::kdf(shared_secret, &D::epk_bytes(&self.epk)); - let input = D::note_plaintext_bytes(&self.note, &self.to, &self.memo); - - let mut input_copy = input; + let mut input = D::note_plaintext_bytes(&self.note, &self.to, &self.memo); let tag = ChaCha20Poly1305::new(key.as_ref().into()) .encrypt_in_place_detached( [0u8; 12][..].into(), &[], - input_copy.as_mut(), + input.as_mut(), ) .unwrap(); - D::ciphertext_from_enc_plaintext_and_tag(input_copy, &tag) + D::ciphertext_from_enc_plaintext_and_tag(input, &tag) } /// Generates `outCiphertext` for this note. @@ -699,7 +686,11 @@ fn try_compact_note_decryption_inner>( NoteCiphertext::::Full(_) => return None, } - let plaintext = D::decrypt_compact_with_key(key, enc_ciphertext); + // Start from block 1 to skip over Poly1305 keying output + let mut plaintext = D::convert_to_compact_plaintext_type(enc_ciphertext); + let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); + keystream.seek(64); + keystream.apply_keystream(plaintext.as_mut()); parse_note_plaintext_without_memo_ivk( domain, @@ -780,7 +771,17 @@ pub fn try_output_recovery_with_ock>( // be okay. let key = D::kdf(shared_secret, &ephemeral_key); - let plaintext = D::decrypt_with_key(&key, enc_ciphertext); + let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(enc_ciphertext); + let mut plaintext = enc_plaintext; + + ChaCha20Poly1305::new(key.as_ref().into()) + .decrypt_in_place_detached( + [0u8; 12][..].into(), + &[], + plaintext.as_mut(), + &tag.into(), + ) + .ok()?; let memo = domain.extract_memo(&plaintext); From 4bb7f946d23dd48b16bbda358d09eebba7520614 Mon Sep 17 00:00:00 2001 From: vivek-arte Date: Thu, 20 Oct 2022 11:58:00 +0530 Subject: [PATCH 08/34] using From trait for combining NotePlaintextBytes and tag into EncNoteCiphertextBytes --- components/zcash_note_encryption/src/lib.rs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index f3585278f2..d737447127 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -33,14 +33,6 @@ use chacha20poly1305::{ ChaCha20Poly1305, }; -use chacha20::ChaCha20; - -use cipher::{ - KeyIvInit, - StreamCipher, - StreamCipherSeek, -}; - use rand_core::RngCore; use subtle::{Choice, ConstantTimeEq}; @@ -134,7 +126,7 @@ pub trait Domain { type SymmetricKey: AsRef<[u8]>; type Note; type NotePlaintextBytes: AsMut<[u8]>; - type EncNoteCiphertextBytes; + type EncNoteCiphertextBytes: From<(Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE])>; type CompactNotePlaintextBytes: From + AsMut<[u8]>; type CompactEncNoteCiphertextBytes; type Recipient; @@ -299,8 +291,6 @@ pub trait Domain { /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; - fn ciphertext_from_enc_plaintext_and_tag(enc_plaintext: Self::NotePlaintextBytes, tag: &[u8]) -> Self::EncNoteCiphertextBytes; - fn separate_tag_from_ciphertext(enc_ciphertext: Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); fn convert_to_compact_plaintext_type(enc_ciphertext: Self::CompactEncNoteCiphertextBytes) -> Self::CompactNotePlaintextBytes; @@ -489,7 +479,7 @@ impl NoteEncryption { input.as_mut(), ) .unwrap(); - D::ciphertext_from_enc_plaintext_and_tag(input, &tag) + D::EncNoteCiphertextBytes::from((input, tag.into())) } /// Generates `outCiphertext` for this note. From 1344aa701bcdd0586406858521f4aa1d5b73105b Mon Sep 17 00:00:00 2001 From: Vivek Arte Date: Mon, 31 Oct 2022 16:48:54 +0530 Subject: [PATCH 09/34] removing NoteCiphertext enum, adding enc_ciphertext_compact fn to ShieldedOutput trait --- components/zcash_note_encryption/src/lib.rs | 32 +++++++-------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index d737447127..03b5ea9988 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -106,14 +106,6 @@ enum NoteValidity { Invalid, } -/// Enum for the note ciphertext. -/// The variants represent whether the encrypted note is a full note or a compact note. -#[derive(Copy, Clone, PartialEq, Eq)] -pub enum NoteCiphertext { - Full(D::EncNoteCiphertextBytes), - Compact(D::CompactEncNoteCiphertextBytes), -} - /// Trait that encapsulates protocol-specific note encryption types and logic. /// /// This trait enables most of the note encryption logic to be shared between Sapling and @@ -347,8 +339,12 @@ pub trait ShieldedOutput { /// Exposes the `cmu_bytes` or `cmx_bytes` field of the output. fn cmstar_bytes(&self) -> D::ExtractedCommitmentBytes; - /// Exposes the note ciphertext of the output. - fn enc_ciphertext(&self) -> NoteCiphertext; + /// Exposes the note ciphertext of the output. Returns `None` if the output is compact. + fn enc_ciphertext(&self) -> Option; + + /// Exposes the note ciphertext of the output in the compact note context. + /// This always returns a value, since a full note ciphertext can be truncated to a compact ciphertext. + fn enc_ciphertext_compact(&self) -> D::CompactEncNoteCiphertextBytes; } /// A struct containing context required for encrypting Sapling and Orchard notes. @@ -557,8 +553,8 @@ fn try_note_decryption_inner>( let enc_ciphertext: D::EncNoteCiphertextBytes; match output.enc_ciphertext() { - NoteCiphertext::Full(x) => enc_ciphertext = x, - NoteCiphertext::Compact(_) => return None, + Some(x) => enc_ciphertext = x, + None => return None, } let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(enc_ciphertext); @@ -573,8 +569,6 @@ fn try_note_decryption_inner>( ) .ok()?; - // let plaintext = D::decrypt_with_key(key, enc_ciphertext); - let memo = domain.extract_memo(&plaintext); let (note, to) = parse_note_plaintext_without_memo_ivk( @@ -670,11 +664,7 @@ fn try_compact_note_decryption_inner>( key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient)> { - let enc_ciphertext: D::CompactEncNoteCiphertextBytes; - match output.enc_ciphertext() { - NoteCiphertext::::Compact(x) => enc_ciphertext = x, - NoteCiphertext::::Full(_) => return None, - } + let enc_ciphertext = output.enc_ciphertext_compact(); // Start from block 1 to skip over Poly1305 keying output let mut plaintext = D::convert_to_compact_plaintext_type(enc_ciphertext); @@ -735,8 +725,8 @@ pub fn try_output_recovery_with_ock>( let enc_ciphertext: D::EncNoteCiphertextBytes; match output.enc_ciphertext() { - NoteCiphertext::::Full(x) => enc_ciphertext = x, - NoteCiphertext::::Compact(_) => return None, + Some(x) => enc_ciphertext = x, + None => return None, } let mut op = OutPlaintextBytes([0; OUT_PLAINTEXT_SIZE]); From d35c32c85c98dbe0872965882d8fed5eddd5f53b Mon Sep 17 00:00:00 2001 From: Vivek Arte Date: Mon, 31 Oct 2022 18:23:46 +0530 Subject: [PATCH 10/34] changing function signatures to borrow input arguments --- components/zcash_note_encryption/src/lib.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 03b5ea9988..aa4b1a77b8 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -283,9 +283,9 @@ pub trait Domain { /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; - fn separate_tag_from_ciphertext(enc_ciphertext: Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); + fn separate_tag_from_ciphertext(enc_ciphertext: &Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); - fn convert_to_compact_plaintext_type(enc_ciphertext: Self::CompactEncNoteCiphertextBytes) -> Self::CompactNotePlaintextBytes; + fn convert_to_compact_plaintext_type(enc_ciphertext: &Self::CompactEncNoteCiphertextBytes) -> Self::CompactNotePlaintextBytes; } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -340,11 +340,11 @@ pub trait ShieldedOutput { fn cmstar_bytes(&self) -> D::ExtractedCommitmentBytes; /// Exposes the note ciphertext of the output. Returns `None` if the output is compact. - fn enc_ciphertext(&self) -> Option; + fn enc_ciphertext(&self) -> Option<&D::EncNoteCiphertextBytes>; /// Exposes the note ciphertext of the output in the compact note context. /// This always returns a value, since a full note ciphertext can be truncated to a compact ciphertext. - fn enc_ciphertext_compact(&self) -> D::CompactEncNoteCiphertextBytes; + fn enc_ciphertext_compact(&self) -> &D::CompactEncNoteCiphertextBytes; } /// A struct containing context required for encrypting Sapling and Orchard notes. @@ -551,7 +551,7 @@ fn try_note_decryption_inner>( key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext: D::EncNoteCiphertextBytes; + let enc_ciphertext: &D::EncNoteCiphertextBytes; match output.enc_ciphertext() { Some(x) => enc_ciphertext = x, None => return None, @@ -723,7 +723,7 @@ pub fn try_output_recovery_with_ock>( out_ciphertext: &[u8; OUT_CIPHERTEXT_SIZE], ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext: D::EncNoteCiphertextBytes; + let enc_ciphertext: &D::EncNoteCiphertextBytes; match output.enc_ciphertext() { Some(x) => enc_ciphertext = x, None => return None, From bf284fcd62cdf8a7c207418cd7c6b56538d8de71 Mon Sep 17 00:00:00 2001 From: Vivek Arte Date: Wed, 2 Nov 2022 16:02:52 +0530 Subject: [PATCH 11/34] changing ShieldedOutput function return types --- components/zcash_note_encryption/src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index aa4b1a77b8..64a58233e6 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -340,11 +340,11 @@ pub trait ShieldedOutput { fn cmstar_bytes(&self) -> D::ExtractedCommitmentBytes; /// Exposes the note ciphertext of the output. Returns `None` if the output is compact. - fn enc_ciphertext(&self) -> Option<&D::EncNoteCiphertextBytes>; + fn enc_ciphertext(&self) -> Option; /// Exposes the note ciphertext of the output in the compact note context. /// This always returns a value, since a full note ciphertext can be truncated to a compact ciphertext. - fn enc_ciphertext_compact(&self) -> &D::CompactEncNoteCiphertextBytes; + fn enc_ciphertext_compact(&self) -> D::CompactEncNoteCiphertextBytes; } /// A struct containing context required for encrypting Sapling and Orchard notes. @@ -551,13 +551,13 @@ fn try_note_decryption_inner>( key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext: &D::EncNoteCiphertextBytes; + let enc_ciphertext: D::EncNoteCiphertextBytes; match output.enc_ciphertext() { Some(x) => enc_ciphertext = x, None => return None, } - let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(enc_ciphertext); + let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(&enc_ciphertext); let mut plaintext = enc_plaintext; ChaCha20Poly1305::new(key.as_ref().into()) @@ -667,7 +667,7 @@ fn try_compact_note_decryption_inner>( let enc_ciphertext = output.enc_ciphertext_compact(); // Start from block 1 to skip over Poly1305 keying output - let mut plaintext = D::convert_to_compact_plaintext_type(enc_ciphertext); + let mut plaintext = D::convert_to_compact_plaintext_type(&enc_ciphertext); let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); keystream.seek(64); keystream.apply_keystream(plaintext.as_mut()); @@ -723,7 +723,7 @@ pub fn try_output_recovery_with_ock>( out_ciphertext: &[u8; OUT_CIPHERTEXT_SIZE], ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext: &D::EncNoteCiphertextBytes; + let enc_ciphertext: D::EncNoteCiphertextBytes; match output.enc_ciphertext() { Some(x) => enc_ciphertext = x, None => return None, @@ -751,7 +751,7 @@ pub fn try_output_recovery_with_ock>( // be okay. let key = D::kdf(shared_secret, &ephemeral_key); - let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(enc_ciphertext); + let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(&enc_ciphertext); let mut plaintext = enc_plaintext; ChaCha20Poly1305::new(key.as_ref().into()) From bc136f2b84bda94eecfbed29d9a0fea2a44f00f8 Mon Sep 17 00:00:00 2001 From: Vivek Arte Date: Thu, 24 Nov 2022 11:23:29 +0530 Subject: [PATCH 12/34] adding improvements based on review - From trait for CompactNotePlaintextBytes, wrapping the AEADBytes in a struct --- components/zcash_note_encryption/src/lib.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 64a58233e6..4d0ce05eaa 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -106,6 +106,9 @@ enum NoteValidity { Invalid, } +/// Newtype representing the bytes of the AEAD Tag. +pub struct AEADBytes(pub [u8; AEAD_TAG_SIZE]); + /// Trait that encapsulates protocol-specific note encryption types and logic. /// /// This trait enables most of the note encryption logic to be shared between Sapling and @@ -118,8 +121,8 @@ pub trait Domain { type SymmetricKey: AsRef<[u8]>; type Note; type NotePlaintextBytes: AsMut<[u8]>; - type EncNoteCiphertextBytes: From<(Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE])>; - type CompactNotePlaintextBytes: From + AsMut<[u8]>; + type EncNoteCiphertextBytes: From<(Self::NotePlaintextBytes, AEADBytes)>; + type CompactNotePlaintextBytes: From + From + AsMut<[u8]>; type CompactEncNoteCiphertextBytes; type Recipient; type DiversifiedTransmissionKey; @@ -283,9 +286,7 @@ pub trait Domain { /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; - fn separate_tag_from_ciphertext(enc_ciphertext: &Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, [u8; AEAD_TAG_SIZE]); - - fn convert_to_compact_plaintext_type(enc_ciphertext: &Self::CompactEncNoteCiphertextBytes) -> Self::CompactNotePlaintextBytes; + fn separate_tag_from_ciphertext(enc_ciphertext: &Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, AEADBytes); } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -475,7 +476,7 @@ impl NoteEncryption { input.as_mut(), ) .unwrap(); - D::EncNoteCiphertextBytes::from((input, tag.into())) + D::EncNoteCiphertextBytes::from((input, AEADBytes(tag.into()))) } /// Generates `outCiphertext` for this note. @@ -565,7 +566,7 @@ fn try_note_decryption_inner>( [0u8; 12][..].into(), &[], plaintext.as_mut(), - &tag.into(), + &tag.0.into(), ) .ok()?; @@ -667,7 +668,7 @@ fn try_compact_note_decryption_inner>( let enc_ciphertext = output.enc_ciphertext_compact(); // Start from block 1 to skip over Poly1305 keying output - let mut plaintext = D::convert_to_compact_plaintext_type(&enc_ciphertext); + let mut plaintext: D::CompactNotePlaintextBytes = enc_ciphertext.into(); let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); keystream.seek(64); keystream.apply_keystream(plaintext.as_mut()); @@ -759,7 +760,7 @@ pub fn try_output_recovery_with_ock>( [0u8; 12][..].into(), &[], plaintext.as_mut(), - &tag.into(), + &tag.0.into(), ) .ok()?; From 2ec2801bff3ad5933806c8a576bf150af0749ee7 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 19 Dec 2022 13:19:08 +0200 Subject: [PATCH 13/34] updated constant names --- components/zcash_note_encryption/src/batch.rs | 4 +-- components/zcash_note_encryption/src/lib.rs | 32 ++++++++----------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/components/zcash_note_encryption/src/batch.rs b/components/zcash_note_encryption/src/batch.rs index f73b1694eb..2565b2be99 100644 --- a/components/zcash_note_encryption/src/batch.rs +++ b/components/zcash_note_encryption/src/batch.rs @@ -45,8 +45,8 @@ fn batch_note_decryption, F, FR>( outputs: &[(D, Output)], decrypt_inner: F, ) -> Vec> -where - F: Fn(&D, &D::IncomingViewingKey, &EphemeralKeyBytes, &Output, &D::SymmetricKey) -> Option, + where + F: Fn(&D, &D::IncomingViewingKey, &EphemeralKeyBytes, &Output, &D::SymmetricKey) -> Option, { if ivks.is_empty() { return (0..outputs.len()).map(|_| None).collect(); diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 4d0ce05eaa..98404426d9 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -40,21 +40,25 @@ use subtle::{Choice, ConstantTimeEq}; #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub mod batch; -/// The size of a compact note. -pub const COMPACT_NOTE_SIZE: usize = 1 + // version + +/// The size of a v2 compact note. +pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version 11 + // diversifier 8 + // value 32; // rseed (or rcm prior to ZIP 212) /// The size of the memo. -const MEMO_SIZE: usize = 512; -/// The size of the original encoding of NotePlaintextBytes. -pub const NOTE_PLAINTEXT_SIZE: usize = COMPACT_NOTE_SIZE + MEMO_SIZE; +pub const MEMO_SIZE: usize = 512; +/// The size of [`NotePlaintextBytes`] for V2. +pub const NOTE_PLAINTEXT_SIZE_V2: usize = COMPACT_NOTE_SIZE_V2 + MEMO_SIZE; + +/// The size of the autentication tag used for note encryption. +pub const AEAD_TAG_SIZE: usize = 16; +/// The size of an encrypted note plaintext. +pub const ENC_CIPHERTEXT_SIZE_V2: usize = NOTE_PLAINTEXT_SIZE_V2 + AEAD_TAG_SIZE; + /// The size of [`OutPlaintextBytes`]. pub const OUT_PLAINTEXT_SIZE: usize = 32 + // pk_d 32; // esk -const AEAD_TAG_SIZE: usize = 16; -/// The size of an encrypted note plaintext. -pub const ENC_CIPHERTEXT_SIZE: usize = NOTE_PLAINTEXT_SIZE + AEAD_TAG_SIZE; /// The size of an encrypted outgoing plaintext. pub const OUT_CIPHERTEXT_SIZE: usize = OUT_PLAINTEXT_SIZE + AEAD_TAG_SIZE; @@ -552,11 +556,7 @@ fn try_note_decryption_inner>( key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext: D::EncNoteCiphertextBytes; - match output.enc_ciphertext() { - Some(x) => enc_ciphertext = x, - None => return None, - } + let enc_ciphertext: D::EncNoteCiphertextBytes = output.enc_ciphertext()?; let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(&enc_ciphertext); let mut plaintext = enc_plaintext; @@ -724,11 +724,7 @@ pub fn try_output_recovery_with_ock>( out_ciphertext: &[u8; OUT_CIPHERTEXT_SIZE], ) -> Option<(D::Note, D::Recipient, D::Memo)> { - let enc_ciphertext: D::EncNoteCiphertextBytes; - match output.enc_ciphertext() { - Some(x) => enc_ciphertext = x, - None => return None, - } + let enc_ciphertext: D::EncNoteCiphertextBytes = output.enc_ciphertext()?; let mut op = OutPlaintextBytes([0; OUT_PLAINTEXT_SIZE]); op.0.copy_from_slice(&out_ciphertext[..OUT_PLAINTEXT_SIZE]); From 29ed0888e86d27268658935f4104dbb9f12a227a Mon Sep 17 00:00:00 2001 From: alexeykoren Date: Tue, 13 Dec 2022 21:06:04 +0100 Subject: [PATCH 14/34] Use 0.8.1 --- Cargo.toml | 2 ++ rust-toolchain | 2 +- zcash_primitives/src/transaction/components/orchard.rs | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 45a673e2b8..ff54e710d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,3 +23,5 @@ zcash_encoding = { path = "components/zcash_encoding" } zcash_note_encryption = { path = "components/zcash_note_encryption" } schemer = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } schemer-rusqlite = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } +orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "e5324d83629cf7e2bf476ba0471143ecd2d2e991" } +group = { git = "https://github.com/zkcrypto/group.git", rev = "f61e3e420ed1220c8f1f80988f8c6c5e202d8715" } diff --git a/rust-toolchain b/rust-toolchain index 43c989b553..91951fd8ad 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.56.1 +1.61.0 diff --git a/zcash_primitives/src/transaction/components/orchard.rs b/zcash_primitives/src/transaction/components/orchard.rs index 7797cbc4d5..b59698b4dc 100644 --- a/zcash_primitives/src/transaction/components/orchard.rs +++ b/zcash_primitives/src/transaction/components/orchard.rs @@ -64,6 +64,7 @@ pub fn read_v5_bundle( actions, flags, value_balance, + vec![], anchor, authorization, ))) From 0993830b74e85687919c84a082ec4f4911bb24cd Mon Sep 17 00:00:00 2001 From: alexeykoren Date: Tue, 13 Dec 2022 21:29:56 +0100 Subject: [PATCH 15/34] Use Rust 1.61.0 in CI --- .github/workflows/ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 91ba4f2bd1..5d48a43bfd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true - name: Fetch path to Zcash parameters @@ -55,7 +55,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true - name: Add target run: rustup target add ${{ matrix.target }} @@ -78,7 +78,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true # Build benchmarks to prevent bitrot - name: Build benchmarks @@ -88,20 +88,20 @@ jobs: args: --all --benches clippy: - name: Clippy (1.56.1) + name: Clippy (1.61.0) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 components: clippy override: true - name: Run clippy uses: actions-rs/clippy-check@v1 with: - name: Clippy (1.56.1) + name: Clippy (1.61.0) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings @@ -174,7 +174,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true - name: cargo fetch uses: actions-rs/cargo@v1 @@ -197,7 +197,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true # cargo fmt does not build the code, and running it in a fresh clone of From 89bd654048670e0e50a373d2c82d2d62efced0d7 Mon Sep 17 00:00:00 2001 From: alexeykoren Date: Sun, 18 Dec 2022 13:55:31 +0100 Subject: [PATCH 16/34] New orchard version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index ff54e710d9..848619a907 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,5 +23,5 @@ zcash_encoding = { path = "components/zcash_encoding" } zcash_note_encryption = { path = "components/zcash_note_encryption" } schemer = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } schemer-rusqlite = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } -orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "e5324d83629cf7e2bf476ba0471143ecd2d2e991" } group = { git = "https://github.com/zkcrypto/group.git", rev = "f61e3e420ed1220c8f1f80988f8c6c5e202d8715" } +orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "5a50fb8d11361d3f7d1f3b2f6c0a468f88c0db49" } From d00636435f5d97b7b29ca51948e252fef887673c Mon Sep 17 00:00:00 2001 From: alexeykoren Date: Sun, 18 Dec 2022 13:57:11 +0100 Subject: [PATCH 17/34] Add TODO for burn reading/writing --- zcash_primitives/src/transaction/components/orchard.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcash_primitives/src/transaction/components/orchard.rs b/zcash_primitives/src/transaction/components/orchard.rs index b59698b4dc..bb8d1b6d75 100644 --- a/zcash_primitives/src/transaction/components/orchard.rs +++ b/zcash_primitives/src/transaction/components/orchard.rs @@ -64,7 +64,7 @@ pub fn read_v5_bundle( actions, flags, value_balance, - vec![], + vec![], // TODO implement "burn" reading and writing anchor, authorization, ))) From 519529a7b2b433a3d83896097b9d2158bfcaa514 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 26 Dec 2022 09:55:58 +0200 Subject: [PATCH 18/34] update --- components/zcash_note_encryption/Cargo.toml | 2 +- components/zcash_note_encryption/src/lib.rs | 108 ++++++++------------ rust-toolchain | 2 +- 3 files changed, 46 insertions(+), 66 deletions(-) diff --git a/components/zcash_note_encryption/Cargo.toml b/components/zcash_note_encryption/Cargo.toml index 413522fcb8..189499e06d 100644 --- a/components/zcash_note_encryption/Cargo.toml +++ b/components/zcash_note_encryption/Cargo.toml @@ -11,7 +11,7 @@ repository = "https://github.com/zcash/librustzcash" readme = "README.md" license = "MIT OR Apache-2.0" edition = "2021" -rust-version = "1.56.1" +rust-version = "1.61.0" categories = ["cryptography::cryptocurrencies"] [package.metadata.docs.rs] diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 98404426d9..776e57be02 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -22,7 +22,7 @@ #[cfg(feature = "alloc")] extern crate alloc; #[cfg(feature = "alloc")] -use alloc::vec::Vec; +use alloc::{borrow::ToOwned, vec::Vec}; use chacha20::{ cipher::{NewCipher, StreamCipher, StreamCipherSeek}, @@ -40,21 +40,10 @@ use subtle::{Choice, ConstantTimeEq}; #[cfg_attr(docsrs, doc(cfg(feature = "alloc")))] pub mod batch; - -/// The size of a v2 compact note. -pub const COMPACT_NOTE_SIZE_V2: usize = 1 + // version - 11 + // diversifier - 8 + // value - 32; // rseed (or rcm prior to ZIP 212) /// The size of the memo. pub const MEMO_SIZE: usize = 512; -/// The size of [`NotePlaintextBytes`] for V2. -pub const NOTE_PLAINTEXT_SIZE_V2: usize = COMPACT_NOTE_SIZE_V2 + MEMO_SIZE; - /// The size of the autentication tag used for note encryption. pub const AEAD_TAG_SIZE: usize = 16; -/// The size of an encrypted note plaintext. -pub const ENC_CIPHERTEXT_SIZE_V2: usize = NOTE_PLAINTEXT_SIZE_V2 + AEAD_TAG_SIZE; /// The size of [`OutPlaintextBytes`]. pub const OUT_PLAINTEXT_SIZE: usize = 32 + // pk_d @@ -110,9 +99,6 @@ enum NoteValidity { Invalid, } -/// Newtype representing the bytes of the AEAD Tag. -pub struct AEADBytes(pub [u8; AEAD_TAG_SIZE]); - /// Trait that encapsulates protocol-specific note encryption types and logic. /// /// This trait enables most of the note encryption logic to be shared between Sapling and @@ -124,10 +110,6 @@ pub trait Domain { type SharedSecret; type SymmetricKey: AsRef<[u8]>; type Note; - type NotePlaintextBytes: AsMut<[u8]>; - type EncNoteCiphertextBytes: From<(Self::NotePlaintextBytes, AEADBytes)>; - type CompactNotePlaintextBytes: From + From + AsMut<[u8]>; - type CompactEncNoteCiphertextBytes; type Recipient; type DiversifiedTransmissionKey; type IncomingViewingKey; @@ -137,6 +119,11 @@ pub trait Domain { type ExtractedCommitmentBytes: Eq + for<'a> From<&'a Self::ExtractedCommitment>; type Memo; + type NotePlaintextBytes: AsMut<[u8]> + for<'a> From<&'a [u8]>; + type NoteCiphertextBytes: AsRef<[u8]> + for<'a> From<&'a [u8]>; + type CompactNotePlaintextBytes: AsMut<[u8]> + for<'a> From<&'a [u8]>; + type CompactNoteCiphertextBytes: AsRef<[u8]>; + /// Derives the `EphemeralSecretKey` corresponding to this note. /// /// Returns `None` if the note was created prior to [ZIP 212], and doesn't have a @@ -270,13 +257,16 @@ pub trait Domain { plaintext: &Self::CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)>; - /// Extracts the memo field from the given note plaintext. + /// Splits the memo field from the given note plaintext. /// /// # Compatibility /// /// `&self` is passed here in anticipation of future changes to memo handling, where /// the memos may no longer be part of the note plaintext. - fn extract_memo(&self, plaintext: &Self::NotePlaintextBytes) -> Self::Memo; + fn extract_memo( + &self, + plaintext: &Self::NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo); /// Parses the `DiversifiedTransmissionKey` field of the outgoing plaintext. /// @@ -289,8 +279,6 @@ pub trait Domain { /// Returns `None` if `out_plaintext` does not contain a valid byte encoding of an /// `EphemeralSecretKey`. fn extract_esk(out_plaintext: &OutPlaintextBytes) -> Option; - - fn separate_tag_from_ciphertext(enc_ciphertext: &Self::EncNoteCiphertextBytes) -> (Self::NotePlaintextBytes, AEADBytes); } /// Trait that encapsulates protocol-specific batch trial decryption logic. @@ -345,11 +333,11 @@ pub trait ShieldedOutput { fn cmstar_bytes(&self) -> D::ExtractedCommitmentBytes; /// Exposes the note ciphertext of the output. Returns `None` if the output is compact. - fn enc_ciphertext(&self) -> Option; + fn enc_ciphertext(&self) -> Option; /// Exposes the note ciphertext of the output in the compact note context. /// This always returns a value, since a full note ciphertext can be truncated to a compact ciphertext. - fn enc_ciphertext_compact(&self) -> D::CompactEncNoteCiphertextBytes; + fn enc_ciphertext_compact(&self) -> D::CompactNoteCiphertextBytes; } /// A struct containing context required for encrypting Sapling and Orchard notes. @@ -467,20 +455,18 @@ impl NoteEncryption { } /// Generates `encCiphertext` for this note. - pub fn encrypt_note_plaintext(&self) -> D::EncNoteCiphertextBytes { + pub fn encrypt_note_plaintext(&self) -> D::NoteCiphertextBytes { let pk_d = D::get_pk_d(&self.note); let shared_secret = D::ka_agree_enc(&self.esk, &pk_d); let key = D::kdf(shared_secret, &D::epk_bytes(&self.epk)); let mut input = D::note_plaintext_bytes(&self.note, &self.to, &self.memo); + let output = input.as_mut(); + let tag = ChaCha20Poly1305::new(key.as_ref().into()) - .encrypt_in_place_detached( - [0u8; 12][..].into(), - &[], - input.as_mut(), - ) + .encrypt_in_place_detached([0u8; 12][..].into(), &[], output.as_mut()) .unwrap(); - D::EncNoteCiphertextBytes::from((input, AEADBytes(tag.into()))) + D::NoteCiphertextBytes::from(&[output.as_ref(), tag.as_ref()].concat()) } /// Generates `outCiphertext` for this note. @@ -529,7 +515,7 @@ impl NoteEncryption { /// This function is only meant to be used with full notes, not compact notes. /// If the note is a compact note, then this function returns `None`. /// -/// For compact notes, use 'try_compact_note_decryption` and `try_compact_note_decryption_inner`. +/// For compact notes, use `try_compact_note_decryption`. pub fn try_note_decryption>( domain: &D, ivk: &D::IncomingViewingKey, @@ -547,7 +533,7 @@ pub fn try_note_decryption>( /// This function is only meant to be used with full notes, not compact notes. /// If the note is a compact note, then this function returns `None`. /// -/// For compact notes, use 'try_compact_note_decryption` and `try_compact_note_decryption_inner`. +/// For compact notes, use `try_compact_note_decryption_inner`. fn try_note_decryption_inner>( domain: &D, ivk: &D::IncomingViewingKey, @@ -555,29 +541,21 @@ fn try_note_decryption_inner>( output: &Output, key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient, D::Memo)> { + let mut enc_ciphertext = output.enc_ciphertext()?.as_ref().to_owned(); - let enc_ciphertext: D::EncNoteCiphertextBytes = output.enc_ciphertext()?; - - let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(&enc_ciphertext); - let mut plaintext = enc_plaintext; + let (to_plaintext, tag) = extract_tag(&mut enc_ciphertext); ChaCha20Poly1305::new(key.as_ref().into()) - .decrypt_in_place_detached( - [0u8; 12][..].into(), - &[], - plaintext.as_mut(), - &tag.0.into(), - ) + .decrypt_in_place_detached([0u8; 12][..].into(), &[], to_plaintext, &tag.into()) .ok()?; - let memo = domain.extract_memo(&plaintext); - + let (compact, memo) = domain.extract_memo(&to_plaintext.as_ref().into()); let (note, to) = parse_note_plaintext_without_memo_ivk( domain, ivk, ephemeral_key, &output.cmstar_bytes(), - &plaintext.into(), + &compact, )?; Some((note, to, memo)) @@ -664,11 +642,10 @@ fn try_compact_note_decryption_inner>( output: &Output, key: &D::SymmetricKey, ) -> Option<(D::Note, D::Recipient)> { - - let enc_ciphertext = output.enc_ciphertext_compact(); - // Start from block 1 to skip over Poly1305 keying output - let mut plaintext: D::CompactNotePlaintextBytes = enc_ciphertext.into(); + let mut plaintext: D::CompactNotePlaintextBytes = + output.enc_ciphertext_compact().as_ref().into(); + let mut keystream = ChaCha20::new(key.as_ref().into(), [0u8; 12][..].into()); keystream.seek(64); keystream.apply_keystream(plaintext.as_mut()); @@ -723,9 +700,6 @@ pub fn try_output_recovery_with_ock>( output: &Output, out_ciphertext: &[u8; OUT_CIPHERTEXT_SIZE], ) -> Option<(D::Note, D::Recipient, D::Memo)> { - - let enc_ciphertext: D::EncNoteCiphertextBytes = output.enc_ciphertext()?; - let mut op = OutPlaintextBytes([0; OUT_PLAINTEXT_SIZE]); op.0.copy_from_slice(&out_ciphertext[..OUT_PLAINTEXT_SIZE]); @@ -748,22 +722,18 @@ pub fn try_output_recovery_with_ock>( // be okay. let key = D::kdf(shared_secret, &ephemeral_key); - let (enc_plaintext, tag) = D::separate_tag_from_ciphertext(&enc_ciphertext); - let mut plaintext = enc_plaintext; + let mut enc_ciphertext = output.enc_ciphertext()?.as_ref().to_owned(); + + let (to_plaintext, tag) = extract_tag(&mut enc_ciphertext); ChaCha20Poly1305::new(key.as_ref().into()) - .decrypt_in_place_detached( - [0u8; 12][..].into(), - &[], - plaintext.as_mut(), - &tag.0.into(), - ) + .decrypt_in_place_detached([0u8; 12][..].into(), &[], to_plaintext, &tag.into()) .ok()?; - let memo = domain.extract_memo(&plaintext); + let (compact, memo) = domain.extract_memo(&to_plaintext.as_ref().into()); let (note, to) = - domain.parse_note_plaintext_without_memo_ovk(&pk_d, &esk, &ephemeral_key, &plaintext.into())?; + domain.parse_note_plaintext_without_memo_ovk(&pk_d, &esk, &ephemeral_key, &compact)?; // ZIP 212: Check that the esk provided to this function is consistent with the esk we // can derive from the note. @@ -781,3 +751,13 @@ pub fn try_output_recovery_with_ock>( None } } + +// Splits the AEAD tag from the actual ciphertext . +fn extract_tag(enc_ciphertext: &mut Vec) -> (&mut [u8], [u8; AEAD_TAG_SIZE]) { + let tag_loc = enc_ciphertext.len() - AEAD_TAG_SIZE; + + let (plaintext, tail) = enc_ciphertext.split_at_mut(tag_loc); + + let tag: [u8; AEAD_TAG_SIZE] = tail.try_into().unwrap(); + (plaintext, tag) +} diff --git a/rust-toolchain b/rust-toolchain index 43c989b553..91951fd8ad 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -1.56.1 +1.61.0 From c27969da051796b622397a381693e4e21c570411 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 26 Dec 2022 09:59:52 +0200 Subject: [PATCH 19/34] fmt --- components/zcash_note_encryption/src/batch.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/components/zcash_note_encryption/src/batch.rs b/components/zcash_note_encryption/src/batch.rs index 2565b2be99..e06f35ebb6 100644 --- a/components/zcash_note_encryption/src/batch.rs +++ b/components/zcash_note_encryption/src/batch.rs @@ -3,8 +3,7 @@ use alloc::vec::Vec; // module is alloc only use crate::{ - try_compact_note_decryption_inner, try_note_decryption_inner, - BatchDomain, EphemeralKeyBytes, + try_compact_note_decryption_inner, try_note_decryption_inner, BatchDomain, EphemeralKeyBytes, ShieldedOutput, }; @@ -45,8 +44,8 @@ fn batch_note_decryption, F, FR>( outputs: &[(D, Output)], decrypt_inner: F, ) -> Vec> - where - F: Fn(&D, &D::IncomingViewingKey, &EphemeralKeyBytes, &Output, &D::SymmetricKey) -> Option, +where + F: Fn(&D, &D::IncomingViewingKey, &EphemeralKeyBytes, &Output, &D::SymmetricKey) -> Option, { if ivks.is_empty() { return (0..outputs.len()).map(|_| None).collect(); From 3a185c6766647306c8e02b0062036509ff0243e3 Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 26 Dec 2022 10:05:23 +0200 Subject: [PATCH 20/34] updated rust version --- .github/workflows/ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eb1500c1da..4894b4e154 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true - name: Fetch path to Zcash parameters @@ -55,7 +55,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true - name: Add target run: rustup target add ${{ matrix.target }} @@ -78,7 +78,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true # Build benchmarks to prevent bitrot - name: Build benchmarks @@ -88,20 +88,20 @@ jobs: args: --all --benches clippy: - name: Clippy (1.56.1) + name: Clippy (1.61.0) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 components: clippy override: true - name: Run clippy uses: actions-rs/clippy-check@v1 with: - name: Clippy (1.56.1) + name: Clippy (1.61.0) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings @@ -174,7 +174,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true - name: cargo fetch uses: actions-rs/cargo@v1 @@ -197,7 +197,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.56.1 + toolchain: 1.61.0 override: true # cargo fmt does not build the code, and running it in a fresh clone of From f56db5890d140a003fad03aa245f8a0fd5a82043 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 28 Dec 2022 10:31:39 +0200 Subject: [PATCH 21/34] removed as_ref() --- components/zcash_note_encryption/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 776e57be02..3602a26d2d 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -466,7 +466,7 @@ impl NoteEncryption { let tag = ChaCha20Poly1305::new(key.as_ref().into()) .encrypt_in_place_detached([0u8; 12][..].into(), &[], output.as_mut()) .unwrap(); - D::NoteCiphertextBytes::from(&[output.as_ref(), tag.as_ref()].concat()) + D::NoteCiphertextBytes::from(&[output, tag.as_ref()].concat()) } /// Generates `outCiphertext` for this note. From 77844f4633e7d3c0e5b6d59cd418c9c5dc5f4b70 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 10 Jan 2023 14:01:04 +0200 Subject: [PATCH 22/34] minor update --- components/zcash_note_encryption/src/lib.rs | 14 ++++----- zcash_primitives/Cargo.toml | 9 ++++-- .../src/transaction/components/orchard.rs | 29 +++++++++++++++++++ 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 3602a26d2d..ca1805f1f2 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -466,7 +466,7 @@ impl NoteEncryption { let tag = ChaCha20Poly1305::new(key.as_ref().into()) .encrypt_in_place_detached([0u8; 12][..].into(), &[], output.as_mut()) .unwrap(); - D::NoteCiphertextBytes::from(&[output, tag.as_ref()].concat()) + D::NoteCiphertextBytes::from(&[output.as_ref(), tag.as_ref()].concat()) } /// Generates `outCiphertext` for this note. @@ -543,13 +543,13 @@ fn try_note_decryption_inner>( ) -> Option<(D::Note, D::Recipient, D::Memo)> { let mut enc_ciphertext = output.enc_ciphertext()?.as_ref().to_owned(); - let (to_plaintext, tag) = extract_tag(&mut enc_ciphertext); + let (plaintext, tag) = extract_tag(&mut enc_ciphertext); ChaCha20Poly1305::new(key.as_ref().into()) - .decrypt_in_place_detached([0u8; 12][..].into(), &[], to_plaintext, &tag.into()) + .decrypt_in_place_detached([0u8; 12][..].into(), &[], plaintext, &tag.into()) .ok()?; - let (compact, memo) = domain.extract_memo(&to_plaintext.as_ref().into()); + let (compact, memo) = domain.extract_memo(&D::NotePlaintextBytes::from(plaintext)); let (note, to) = parse_note_plaintext_without_memo_ivk( domain, ivk, @@ -724,13 +724,13 @@ pub fn try_output_recovery_with_ock>( let mut enc_ciphertext = output.enc_ciphertext()?.as_ref().to_owned(); - let (to_plaintext, tag) = extract_tag(&mut enc_ciphertext); + let (plaintext, tag) = extract_tag(&mut enc_ciphertext); ChaCha20Poly1305::new(key.as_ref().into()) - .decrypt_in_place_detached([0u8; 12][..].into(), &[], to_plaintext, &tag.into()) + .decrypt_in_place_detached([0u8; 12][..].into(), &[], plaintext, &tag.into()) .ok()?; - let (compact, memo) = domain.extract_memo(&to_plaintext.as_ref().into()); + let (compact, memo) = domain.extract_memo(&plaintext.as_ref().into()); let (note, to) = domain.parse_note_plaintext_without_memo_ovk(&pk_d, &esk, &ephemeral_key, &compact)?; diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index c57dd4670d..f6f77230e0 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -50,9 +50,12 @@ zcash_address = { version = "0.1", path = "../components/zcash_address" } zcash_encoding = { version = "0.1", path = "../components/zcash_encoding" } [dependencies.zcash_note_encryption] -version = "0.1" -path = "../components/zcash_note_encryption" -features = ["pre-zip-212"] +zcash_note_encryption = { version = "0.1", path = "../components/zcash_note_encryption", branch = "encryption_generalization" } +#path = "../components/zcash_note_encryption" + + +[patch.crates-io] +uuid = { path = "../path/to/uuid" } [dev-dependencies] criterion = "0.3" diff --git a/zcash_primitives/src/transaction/components/orchard.rs b/zcash_primitives/src/transaction/components/orchard.rs index 7797cbc4d5..2862206c70 100644 --- a/zcash_primitives/src/transaction/components/orchard.rs +++ b/zcash_primitives/src/transaction/components/orchard.rs @@ -262,11 +262,15 @@ pub mod testing { testing::{self as t_orch}, Authorized, Bundle, }; + use orchard::note::TransmittedNoteCiphertext; + use rand_core::OsRng; use crate::transaction::{ components::amount::{testing::arb_amount, Amount}, TxVersion, }; + use crate::transaction::components::orchard::{read_note_ciphertext, write_note_ciphertext}; + use crate::transaction::util::sha256d::{HashReader, HashWriter}; prop_compose! { pub fn arb_bundle(n_actions: usize)( @@ -288,4 +292,29 @@ pub mod testing { Strategy::boxed(Just(None)) } } + + #[test] + fn serialize() { + let mut writer = HashWriter::default(); + + let mut rng = OsRng; + + let mut nc = TransmittedNoteCiphertext{ + epk_bytes: [0u8; 32], + enc_ciphertext: [0u8; 580], + out_ciphertext: [0u8; 80], + }; + + rng.fill_bytes(nc.epk_bytes.as_mut()); + rng.fill_bytes(nc.enc_ciphertext.as_mut()); + rng.fill_bytes(nc.out_ciphertext.as_mut()); + + write_note_ciphertext(&mut writer, &nc)?; + + let mut reader = HashReader::new(writer.into()); + + let nc_out = read_note_ciphertext(&mut reader).unwrap(); + + assert_eq!(nc_out, nc); + } } From c8beb1fa2a77aeb08cdcea7b24dab28db052a9af Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Jan 2023 18:35:12 +0200 Subject: [PATCH 23/34] updated version --- components/zcash_note_encryption/Cargo.toml | 2 +- components/zcash_note_encryption/src/lib.rs | 2 +- zcash_client_backend/Cargo.toml | 2 +- zcash_primitives/Cargo.toml | 18 ++- .../src/sapling/note_encryption.rs | 112 +++++++++++++++--- .../src/transaction/components/orchard.rs | 70 ++++++++++- .../src/transaction/components/sapling.rs | 25 ++-- .../transaction/components/sapling/builder.rs | 2 +- 8 files changed, 191 insertions(+), 42 deletions(-) diff --git a/components/zcash_note_encryption/Cargo.toml b/components/zcash_note_encryption/Cargo.toml index 189499e06d..2fc3b69704 100644 --- a/components/zcash_note_encryption/Cargo.toml +++ b/components/zcash_note_encryption/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "zcash_note_encryption" description = "Note encryption for Zcash transactions" -version = "0.1.0" +version = "0.2.0" authors = [ "Jack Grigg ", "Kris Nuttycombe " diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index ca1805f1f2..d8c27552a0 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -42,7 +42,7 @@ pub mod batch; /// The size of the memo. pub const MEMO_SIZE: usize = 512; -/// The size of the autentication tag used for note encryption. +/// The size of the authentication tag used for note encryption. pub const AEAD_TAG_SIZE: usize = 16; /// The size of [`OutPlaintextBytes`]. diff --git a/zcash_client_backend/Cargo.toml b/zcash_client_backend/Cargo.toml index 4f2f002fdc..0377c92204 100644 --- a/zcash_client_backend/Cargo.toml +++ b/zcash_client_backend/Cargo.toml @@ -42,7 +42,7 @@ time = "0.2" tracing = "0.1" zcash_address = { version = "0.1", path = "../components/zcash_address" } zcash_encoding = { version = "0.1", path = "../components/zcash_encoding" } -zcash_note_encryption = { version = "0.1", path = "../components/zcash_note_encryption" } +zcash_note_encryption = { version = "0.2", path = "../components/zcash_note_encryption" } zcash_primitives = { version = "0.7", path = "../zcash_primitives" } [build-dependencies] diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index f6f77230e0..5a48e6e05e 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -38,7 +38,7 @@ jubjub = "0.9" lazy_static = "1" memuse = "0.2" nonempty = "0.7" -orchard = "0.2" +orchard = { version = "0.3", path = "../../orchard" } proptest = { version = "1.0.0", optional = true } rand = "0.8" rand_core = "0.6" @@ -48,20 +48,18 @@ sha2 = "0.9" subtle = "2.2.3" zcash_address = { version = "0.1", path = "../components/zcash_address" } zcash_encoding = { version = "0.1", path = "../components/zcash_encoding" } - -[dependencies.zcash_note_encryption] -zcash_note_encryption = { version = "0.1", path = "../components/zcash_note_encryption", branch = "encryption_generalization" } -#path = "../components/zcash_note_encryption" - - -[patch.crates-io] -uuid = { path = "../path/to/uuid" } +zcash_note_encryption = { version = "0.2", path = "../components/zcash_note_encryption", features = ["pre-zip-212"] } [dev-dependencies] criterion = "0.3" proptest = "1.0.0" rand_xorshift = "0.3" -orchard = { version = "0.2", features = ["test-dependencies"] } +orchard = { version = "0.3", features = ["test-dependencies"], path = "../../orchard" } + +[patch.crates-io] +#zcash_note_encryption = { version = "0.1", path = "../components/zcash_note_encryption" } +#orchard = { version = "0.3", path = "../../orchard"} +#orchard = { version = "0.3", path = "../../orchard" } [target.'cfg(unix)'.dev-dependencies] pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 diff --git a/zcash_primitives/src/sapling/note_encryption.rs b/zcash_primitives/src/sapling/note_encryption.rs index 27eac52622..d7d57c0f7b 100644 --- a/zcash_primitives/src/sapling/note_encryption.rs +++ b/zcash_primitives/src/sapling/note_encryption.rs @@ -9,10 +9,88 @@ use rand_core::RngCore; use zcash_note_encryption::{ try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ock, try_output_recovery_with_ovk, BatchDomain, Domain, EphemeralKeyBytes, NoteEncryption, - NotePlaintextBytes, OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, COMPACT_NOTE_SIZE, - ENC_CIPHERTEXT_SIZE, NOTE_PLAINTEXT_SIZE, OUT_PLAINTEXT_SIZE, + OutgoingCipherKey, ShieldedOutput, OutPlaintextBytes, + OUT_PLAINTEXT_SIZE, MEMO_SIZE, AEAD_TAG_SIZE }; + +/// The size of a compact note. +pub const COMPACT_NOTE_SIZE: usize = 1 + // version + 11 + // diversifier + 8 + // value + 32; // rseed (or rcm prior to ZIP 212) +/// The size of [`NotePlaintextBytes`] for V2. +pub const NOTE_PLAINTEXT_SIZE: usize = COMPACT_NOTE_SIZE + MEMO_SIZE; +/// The size of an encrypted note plaintext. +pub const ENC_CIPHERTEXT_SIZE: usize = NOTE_PLAINTEXT_SIZE + AEAD_TAG_SIZE; + +/// a type to represent the raw bytes of a note plaintext. +#[derive(Clone, Debug)] +pub struct NotePlaintextBytes(pub [u8; NOTE_PLAINTEXT_SIZE]); + +/// a type to represent the raw bytes of an encrypted note plaintext. +#[derive(Clone, Debug)] +pub struct NoteCiphertextBytes(pub [u8; ENC_CIPHERTEXT_SIZE]); + +/// a type to represent the raw bytes of a compact note. +#[derive(Clone, Debug)] +pub struct CompactNotePlaintextBytes(pub [u8; COMPACT_NOTE_SIZE]); + +/// a type to represent the raw bytes of an encrypted compact note. +#[derive(Clone, Debug)] +pub struct CompactNoteCiphertextBytes(pub [u8; COMPACT_NOTE_SIZE]); + +impl AsMut<[u8]> for NotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for NotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for NoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + +impl From<&[u8]> for NoteCiphertextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + NoteCiphertextBytes(s.try_into().unwrap()) + } +} + +impl AsMut<[u8]> for CompactNotePlaintextBytes { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } +} + +impl From<&[u8]> for CompactNotePlaintextBytes { + fn from(s: &[u8]) -> Self + where + Self: Sized, + { + CompactNotePlaintextBytes(s.try_into().unwrap()) + } +} + +impl AsRef<[u8]> for CompactNoteCiphertextBytes { + fn as_ref(&self) -> &[u8] { + self.0.as_ref() + } +} + use crate::{ consensus::{self, BlockHeight, NetworkUpgrade::Canopy, ZIP212_GRACE_PERIOD}, keys::OutgoingViewingKey, @@ -168,6 +246,11 @@ impl Domain for SaplingDomain

{ type ExtractedCommitmentBytes = [u8; 32]; type Memo = MemoBytes; + type NotePlaintextBytes = NotePlaintextBytes; + type NoteCiphertextBytes = NoteCiphertextBytes; + type CompactNotePlaintextBytes = CompactNotePlaintextBytes; + type CompactNoteCiphertextBytes = CompactNoteCiphertextBytes; + fn derive_esk(note: &Self::Note) -> Option { note.derive_esk() } @@ -278,9 +361,9 @@ impl Domain for SaplingDomain

{ fn parse_note_plaintext_without_memo_ivk( &self, ivk: &Self::IncomingViewingKey, - plaintext: &[u8], + plaintext: &CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)> { - sapling_parse_note_plaintext_without_memo(self, plaintext, |diversifier| { + sapling_parse_note_plaintext_without_memo(self, &plaintext.0, |diversifier| { Some(&PreparedBaseSubgroup::new(diversifier.g_d()?) * &ivk.0) }) } @@ -290,7 +373,7 @@ impl Domain for SaplingDomain

{ pk_d: &Self::DiversifiedTransmissionKey, esk: &Self::EphemeralSecretKey, ephemeral_key: &EphemeralKeyBytes, - plaintext: &NotePlaintextBytes, + plaintext: &CompactNotePlaintextBytes, ) -> Option<(Self::Note, Self::Recipient)> { sapling_parse_note_plaintext_without_memo(self, &plaintext.0, |diversifier| { if (diversifier.g_d()? * esk).to_bytes() == ephemeral_key.0 { @@ -318,11 +401,12 @@ impl Domain for SaplingDomain

{ .try_into() .expect("slice is the correct length"), ) - .into() + .into() } - fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> Self::Memo { - MemoBytes::from_bytes(&plaintext.0[COMPACT_NOTE_SIZE..NOTE_PLAINTEXT_SIZE]).unwrap() + fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + let (compact, memo) = plaintext.0.split_at(COMPACT_NOTE_SIZE); + (compact.try_into().unwrap(), MemoBytes::from_bytes(memo).unwrap()) } } @@ -420,7 +504,7 @@ pub fn plaintext_version_is_valid( pub fn try_sapling_note_decryption< P: consensus::Parameters, - Output: ShieldedOutput, ENC_CIPHERTEXT_SIZE>, + Output: ShieldedOutput>, >( params: &P, height: BlockHeight, @@ -436,7 +520,7 @@ pub fn try_sapling_note_decryption< pub fn try_sapling_compact_note_decryption< P: consensus::Parameters, - Output: ShieldedOutput, COMPACT_NOTE_SIZE>, + Output: ShieldedOutput>, >( params: &P, height: BlockHeight, @@ -508,8 +592,8 @@ mod tests { use rand_core::{CryptoRng, RngCore}; use zcash_note_encryption::{ - batch, EphemeralKeyBytes, NoteEncryption, OutgoingCipherKey, ENC_CIPHERTEXT_SIZE, - NOTE_PLAINTEXT_SIZE, OUT_CIPHERTEXT_SIZE, OUT_PLAINTEXT_SIZE, + batch, EphemeralKeyBytes, NoteEncryption, OutgoingCipherKey, + OUT_PLAINTEXT_SIZE, OUT_CIPHERTEXT_SIZE }; use super::{ @@ -526,7 +610,7 @@ mod tests { }, keys::OutgoingViewingKey, memo::MemoBytes, - sapling::{note_encryption::PreparedIncomingViewingKey, util::generate_random_rseed}, + sapling::{note_encryption::{PreparedIncomingViewingKey, ENC_CIPHERTEXT_SIZE, NOTE_PLAINTEXT_SIZE}, util::generate_random_rseed}, sapling::{Diversifier, PaymentAddress, Rseed, SaplingIvk, ValueCommitment}, transaction::components::{ amount::Amount, @@ -612,7 +696,7 @@ mod tests { cv, cmu, ephemeral_key: epk.to_bytes().into(), - enc_ciphertext: ne.encrypt_note_plaintext(), + enc_ciphertext: ne.encrypt_note_plaintext().0, out_ciphertext: ne.encrypt_outgoing_plaintext(&cv, &cmu, &mut rng), zkproof: [0u8; GROTH_PROOF_SIZE], }; diff --git a/zcash_primitives/src/transaction/components/orchard.rs b/zcash_primitives/src/transaction/components/orchard.rs index 2862206c70..fcb5b9b9b2 100644 --- a/zcash_primitives/src/transaction/components/orchard.rs +++ b/zcash_primitives/src/transaction/components/orchard.rs @@ -64,6 +64,7 @@ pub fn read_v5_bundle( actions, flags, value_balance, + vec![], anchor, authorization, ))) @@ -254,6 +255,48 @@ pub fn write_action_without_auth( Ok(()) } + + +#[derive(Clone, Debug)] +pub enum EncCiphertext { + NoteV2([u8; orchard::note_encryption::ENC_CIPHERTEXT_SIZE_V2]), + NoteV3([u8; orchard::note_encryption_v3::ENC_CIPHERTEXT_SIZE_V3]), +} + +#[derive(Clone)] +pub struct TransmittedNoteCiphertextNew { + /// The serialization of the ephemeral public key + pub epk_bytes: [u8; 32], + /// The encrypted note ciphertext + pub enc_ciphertext: EncCiphertext, + /// An encrypted value that allows the holder of the outgoing cipher + /// key for the note to recover the note plaintext. + pub out_ciphertext: [u8; 80], +} + +pub fn write_note_ciphertext2( + mut writer: W, + nc: &TransmittedNoteCiphertextNew, +) -> io::Result<()> { + writer.write_all(&nc.epk_bytes)?; + writer.write_all(&nc.enc_ciphertext)?; + writer.write_all(&nc.out_ciphertext) +} + +pub fn read_note_ciphertext2(mut reader: R) -> io::Result { + let mut tnc = TransmittedNoteCiphertextNew { + epk_bytes: [0u8; 32], + enc_ciphertext: [0u8; 580], + out_ciphertext: [0u8; 80], + }; + + reader.read_exact(&mut tnc.epk_bytes)?; + reader.read_exact(&mut tnc.enc_ciphertext)?; + reader.read_exact(&mut tnc.out_ciphertext)?; + + Ok(tnc) +} + #[cfg(any(test, feature = "test-dependencies"))] pub mod testing { use proptest::prelude::*; @@ -263,6 +306,8 @@ pub mod testing { Authorized, Bundle, }; use orchard::note::TransmittedNoteCiphertext; + use orchard::note_encryption::{ENC_CIPHERTEXT_SIZE_V2, NoteCiphertextBytes}; + use orchard::note_encryption_v3::ENC_CIPHERTEXT_SIZE_V3; use rand_core::OsRng; use crate::transaction::{ @@ -270,7 +315,6 @@ pub mod testing { TxVersion, }; use crate::transaction::components::orchard::{read_note_ciphertext, write_note_ciphertext}; - use crate::transaction::util::sha256d::{HashReader, HashWriter}; prop_compose! { pub fn arb_bundle(n_actions: usize)( @@ -293,9 +337,14 @@ pub mod testing { } } + + #[test] - fn serialize() { - let mut writer = HashWriter::default(); + fn backward_compatible_roundtest() { + const TEST_DATA_SIZE: usize = + 32 + //epk_bytes + 580 + // enc_ciphertext + 80; // out_ciphertext let mut rng = OsRng; @@ -309,12 +358,21 @@ pub mod testing { rng.fill_bytes(nc.enc_ciphertext.as_mut()); rng.fill_bytes(nc.out_ciphertext.as_mut()); - write_note_ciphertext(&mut writer, &nc)?; + let mut writer = Vec::with_capacity(TEST_DATA_SIZE); + + write_note_ciphertext(&mut writer, &nc).unwrap(); - let mut reader = HashReader::new(writer.into()); + + + let mut reader = writer.as_slice(); let nc_out = read_note_ciphertext(&mut reader).unwrap(); - assert_eq!(nc_out, nc); + assert_eq!(nc_out.epk_bytes, nc.epk_bytes); + assert_eq!(nc_out.enc_ciphertext, nc.enc_ciphertext); + assert_eq!(nc_out.out_ciphertext, nc.out_ciphertext); + + //print!(nc) + } } diff --git a/zcash_primitives/src/transaction/components/sapling.rs b/zcash_primitives/src/transaction/components/sapling.rs index 1639bc930b..31b735fe0c 100644 --- a/zcash_primitives/src/transaction/components/sapling.rs +++ b/zcash_primitives/src/transaction/components/sapling.rs @@ -5,13 +5,13 @@ use group::GroupEncoding; use std::io::{self, Read, Write}; use zcash_note_encryption::{ - EphemeralKeyBytes, ShieldedOutput, COMPACT_NOTE_SIZE, ENC_CIPHERTEXT_SIZE, + EphemeralKeyBytes, ShieldedOutput, }; use crate::{ consensus, sapling::{ - note_encryption::SaplingDomain, + note_encryption::{SaplingDomain,COMPACT_NOTE_SIZE, CompactNoteCiphertextBytes, NoteCiphertextBytes}, redjubjub::{self, PublicKey, Signature}, Nullifier, }, @@ -261,7 +261,7 @@ pub struct OutputDescription { pub zkproof: Proof, } -impl ShieldedOutput, ENC_CIPHERTEXT_SIZE> +impl ShieldedOutput> for OutputDescription { fn ephemeral_key(&self) -> EphemeralKeyBytes { @@ -272,8 +272,12 @@ impl ShieldedOutput, ENC_CIPHERTEX self.cmu.to_repr() } - fn enc_ciphertext(&self) -> &[u8; ENC_CIPHERTEXT_SIZE] { - &self.enc_ciphertext + fn enc_ciphertext(&self) -> Option { + Some(NoteCiphertextBytes(self.enc_ciphertext)) + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + CompactNoteCiphertextBytes(self.enc_ciphertext[0..COMPACT_NOTE_SIZE].try_into().unwrap()) } } @@ -405,7 +409,7 @@ impl From> for CompactOutputDescription { } } -impl ShieldedOutput, COMPACT_NOTE_SIZE> +impl ShieldedOutput> for CompactOutputDescription { fn ephemeral_key(&self) -> EphemeralKeyBytes { @@ -416,8 +420,13 @@ impl ShieldedOutput, COMPACT_NOTE_SIZ self.cmu.to_repr() } - fn enc_ciphertext(&self) -> &[u8; COMPACT_NOTE_SIZE] { - &self.enc_ciphertext + fn enc_ciphertext(&self) -> Option { + //Some(NoteCiphertextBytes(self.enc_ciphertext)) + None + } + + fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { + CompactNoteCiphertextBytes(self.enc_ciphertext) } } diff --git a/zcash_primitives/src/transaction/components/sapling/builder.rs b/zcash_primitives/src/transaction/components/sapling/builder.rs index 57feb4cac8..ec56ece27e 100644 --- a/zcash_primitives/src/transaction/components/sapling/builder.rs +++ b/zcash_primitives/src/transaction/components/sapling/builder.rs @@ -143,7 +143,7 @@ impl SaplingOutput { cv, cmu, ephemeral_key: epk.to_bytes().into(), - enc_ciphertext, + enc_ciphertext: enc_ciphertext.0, out_ciphertext, zkproof, } From f0c686d1b294dcd9ed423a1988d7e11fbf15a5a6 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 12 Jan 2023 18:37:49 +0200 Subject: [PATCH 24/34] commented out test code --- .../src/transaction/components/orchard.rs | 79 +++++++++---------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/zcash_primitives/src/transaction/components/orchard.rs b/zcash_primitives/src/transaction/components/orchard.rs index fcb5b9b9b2..caf6c88c81 100644 --- a/zcash_primitives/src/transaction/components/orchard.rs +++ b/zcash_primitives/src/transaction/components/orchard.rs @@ -257,45 +257,45 @@ pub fn write_action_without_auth( -#[derive(Clone, Debug)] -pub enum EncCiphertext { - NoteV2([u8; orchard::note_encryption::ENC_CIPHERTEXT_SIZE_V2]), - NoteV3([u8; orchard::note_encryption_v3::ENC_CIPHERTEXT_SIZE_V3]), -} - -#[derive(Clone)] -pub struct TransmittedNoteCiphertextNew { - /// The serialization of the ephemeral public key - pub epk_bytes: [u8; 32], - /// The encrypted note ciphertext - pub enc_ciphertext: EncCiphertext, - /// An encrypted value that allows the holder of the outgoing cipher - /// key for the note to recover the note plaintext. - pub out_ciphertext: [u8; 80], -} - -pub fn write_note_ciphertext2( - mut writer: W, - nc: &TransmittedNoteCiphertextNew, -) -> io::Result<()> { - writer.write_all(&nc.epk_bytes)?; - writer.write_all(&nc.enc_ciphertext)?; - writer.write_all(&nc.out_ciphertext) -} - -pub fn read_note_ciphertext2(mut reader: R) -> io::Result { - let mut tnc = TransmittedNoteCiphertextNew { - epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], - out_ciphertext: [0u8; 80], - }; - - reader.read_exact(&mut tnc.epk_bytes)?; - reader.read_exact(&mut tnc.enc_ciphertext)?; - reader.read_exact(&mut tnc.out_ciphertext)?; - - Ok(tnc) -} +// #[derive(Clone, Debug)] +// pub enum EncCiphertext { +// NoteV2([u8; orchard::note_encryption::ENC_CIPHERTEXT_SIZE_V2]), +// NoteV3([u8; orchard::note_encryption_v3::ENC_CIPHERTEXT_SIZE_V3]), +// } +// +// #[derive(Clone)] +// pub struct TransmittedNoteCiphertextNew { +// /// The serialization of the ephemeral public key +// pub epk_bytes: [u8; 32], +// /// The encrypted note ciphertext +// pub enc_ciphertext: EncCiphertext, +// /// An encrypted value that allows the holder of the outgoing cipher +// /// key for the note to recover the note plaintext. +// pub out_ciphertext: [u8; 80], +// } +// +// pub fn write_note_ciphertext2( +// mut writer: W, +// nc: &TransmittedNoteCiphertextNew, +// ) -> io::Result<()> { +// writer.write_all(&nc.epk_bytes)?; +// writer.write_all(&nc.enc_ciphertext)?; +// writer.write_all(&nc.out_ciphertext) +// } +// +// pub fn read_note_ciphertext2(mut reader: R) -> io::Result { +// let mut tnc = TransmittedNoteCiphertextNew { +// epk_bytes: [0u8; 32], +// enc_ciphertext: [0u8; 580], +// out_ciphertext: [0u8; 80], +// }; +// +// reader.read_exact(&mut tnc.epk_bytes)?; +// reader.read_exact(&mut tnc.enc_ciphertext)?; +// reader.read_exact(&mut tnc.out_ciphertext)?; +// +// Ok(tnc) +// } #[cfg(any(test, feature = "test-dependencies"))] pub mod testing { @@ -363,7 +363,6 @@ pub mod testing { write_note_ciphertext(&mut writer, &nc).unwrap(); - let mut reader = writer.as_slice(); let nc_out = read_note_ciphertext(&mut reader).unwrap(); From d318627d44bdcb4a2de08dafa0bf75ecd3c63aa7 Mon Sep 17 00:00:00 2001 From: Paul Date: Sun, 22 Jan 2023 15:55:55 +0200 Subject: [PATCH 25/34] minor fix --- components/zcash_note_encryption/src/lib.rs | 4 ++-- zcash_primitives/Cargo.toml | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index d8c27552a0..a95a8d3231 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -389,8 +389,8 @@ pub trait ShieldedOutput { /// let cmu = note.cmu(); /// /// let mut enc = sapling_note_encryption::<_, TestNetwork>(ovk, note, to, MemoBytes::empty(), &mut rng); -/// let encCiphertext = enc.encrypt_note_plaintext(); -/// let outCiphertext = enc.encrypt_outgoing_plaintext(&cv.commitment().into(), &cmu, &mut rng); +/// let enc_ciphertext = enc.encrypt_note_plaintext(); +/// let out_ciphertext = enc.encrypt_outgoing_plaintext(&cv.commitment().into(), &cmu, &mut rng); /// ``` pub struct NoteEncryption { epk: D::EphemeralPublicKey, diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index 5a48e6e05e..7acf040a59 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -56,11 +56,6 @@ proptest = "1.0.0" rand_xorshift = "0.3" orchard = { version = "0.3", features = ["test-dependencies"], path = "../../orchard" } -[patch.crates-io] -#zcash_note_encryption = { version = "0.1", path = "../components/zcash_note_encryption" } -#orchard = { version = "0.3", path = "../../orchard"} -#orchard = { version = "0.3", path = "../../orchard" } - [target.'cfg(unix)'.dev-dependencies] pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 From 57db56bed041977e42bda6301ec80579076de09c Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 23 Jan 2023 13:16:45 +0200 Subject: [PATCH 26/34] updated test and cleanup --- components/zcash_note_encryption/src/lib.rs | 2 +- zcash_primitives/Cargo.toml | 4 +- .../src/sapling/note_encryption.rs | 40 +- .../src/transaction/components/orchard.rs | 87 +- .../src/transaction/components/sapling.rs | 22 +- .../src/transaction/tests/data.rs | 2613 +++++++++-------- 6 files changed, 1368 insertions(+), 1400 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index a95a8d3231..7a1eac6fc6 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -466,7 +466,7 @@ impl NoteEncryption { let tag = ChaCha20Poly1305::new(key.as_ref().into()) .encrypt_in_place_detached([0u8; 12][..].into(), &[], output.as_mut()) .unwrap(); - D::NoteCiphertextBytes::from(&[output.as_ref(), tag.as_ref()].concat()) + D::NoteCiphertextBytes::from(&[output, tag.as_ref()].concat()) } /// Generates `outCiphertext` for this note. diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index 7acf040a59..f2111d0750 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -38,7 +38,7 @@ jubjub = "0.9" lazy_static = "1" memuse = "0.2" nonempty = "0.7" -orchard = { version = "0.3", path = "../../orchard" } +orchard = { version = "0.3", git = "https://github.com/QED-it/orchard.git", rev = "55ce92f015057e06850118b5cea5e0ff350ff96d" } proptest = { version = "1.0.0", optional = true } rand = "0.8" rand_core = "0.6" @@ -54,7 +54,7 @@ zcash_note_encryption = { version = "0.2", path = "../components/zcash_note_encr criterion = "0.3" proptest = "1.0.0" rand_xorshift = "0.3" -orchard = { version = "0.3", features = ["test-dependencies"], path = "../../orchard" } +orchard = { version = "0.3", features = ["test-dependencies"], git = "https://github.com/QED-it/orchard.git", rev = "55ce92f015057e06850118b5cea5e0ff350ff96d" } [target.'cfg(unix)'.dev-dependencies] pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 diff --git a/zcash_primitives/src/sapling/note_encryption.rs b/zcash_primitives/src/sapling/note_encryption.rs index d7d57c0f7b..6cf9518b5e 100644 --- a/zcash_primitives/src/sapling/note_encryption.rs +++ b/zcash_primitives/src/sapling/note_encryption.rs @@ -9,11 +9,10 @@ use rand_core::RngCore; use zcash_note_encryption::{ try_compact_note_decryption, try_note_decryption, try_output_recovery_with_ock, try_output_recovery_with_ovk, BatchDomain, Domain, EphemeralKeyBytes, NoteEncryption, - OutgoingCipherKey, ShieldedOutput, OutPlaintextBytes, - OUT_PLAINTEXT_SIZE, MEMO_SIZE, AEAD_TAG_SIZE + OutPlaintextBytes, OutgoingCipherKey, ShieldedOutput, AEAD_TAG_SIZE, MEMO_SIZE, + OUT_PLAINTEXT_SIZE, }; - /// The size of a compact note. pub const COMPACT_NOTE_SIZE: usize = 1 + // version 11 + // diversifier @@ -48,8 +47,8 @@ impl AsMut<[u8]> for NotePlaintextBytes { impl From<&[u8]> for NotePlaintextBytes { fn from(s: &[u8]) -> Self - where - Self: Sized, + where + Self: Sized, { NotePlaintextBytes(s.try_into().unwrap()) } @@ -63,8 +62,8 @@ impl AsRef<[u8]> for NoteCiphertextBytes { impl From<&[u8]> for NoteCiphertextBytes { fn from(s: &[u8]) -> Self - where - Self: Sized, + where + Self: Sized, { NoteCiphertextBytes(s.try_into().unwrap()) } @@ -78,8 +77,8 @@ impl AsMut<[u8]> for CompactNotePlaintextBytes { impl From<&[u8]> for CompactNotePlaintextBytes { fn from(s: &[u8]) -> Self - where - Self: Sized, + where + Self: Sized, { CompactNotePlaintextBytes(s.try_into().unwrap()) } @@ -401,12 +400,18 @@ impl Domain for SaplingDomain

{ .try_into() .expect("slice is the correct length"), ) - .into() + .into() } - fn extract_memo(&self, plaintext: &NotePlaintextBytes) -> (Self::CompactNotePlaintextBytes, Self::Memo) { + fn extract_memo( + &self, + plaintext: &NotePlaintextBytes, + ) -> (Self::CompactNotePlaintextBytes, Self::Memo) { let (compact, memo) = plaintext.0.split_at(COMPACT_NOTE_SIZE); - (compact.try_into().unwrap(), MemoBytes::from_bytes(memo).unwrap()) + ( + compact.try_into().unwrap(), + MemoBytes::from_bytes(memo).unwrap(), + ) } } @@ -592,8 +597,8 @@ mod tests { use rand_core::{CryptoRng, RngCore}; use zcash_note_encryption::{ - batch, EphemeralKeyBytes, NoteEncryption, OutgoingCipherKey, - OUT_PLAINTEXT_SIZE, OUT_CIPHERTEXT_SIZE + batch, EphemeralKeyBytes, NoteEncryption, OutgoingCipherKey, OUT_CIPHERTEXT_SIZE, + OUT_PLAINTEXT_SIZE, }; use super::{ @@ -610,7 +615,12 @@ mod tests { }, keys::OutgoingViewingKey, memo::MemoBytes, - sapling::{note_encryption::{PreparedIncomingViewingKey, ENC_CIPHERTEXT_SIZE, NOTE_PLAINTEXT_SIZE}, util::generate_random_rseed}, + sapling::{ + note_encryption::{ + PreparedIncomingViewingKey, ENC_CIPHERTEXT_SIZE, NOTE_PLAINTEXT_SIZE, + }, + util::generate_random_rseed, + }, sapling::{Diversifier, PaymentAddress, Rseed, SaplingIvk, ValueCommitment}, transaction::components::{ amount::Amount, diff --git a/zcash_primitives/src/transaction/components/orchard.rs b/zcash_primitives/src/transaction/components/orchard.rs index caf6c88c81..b031e68349 100644 --- a/zcash_primitives/src/transaction/components/orchard.rs +++ b/zcash_primitives/src/transaction/components/orchard.rs @@ -126,7 +126,7 @@ pub fn read_cmx(mut reader: R) -> io::Result { pub fn read_note_ciphertext(mut reader: R) -> io::Result { let mut tnc = TransmittedNoteCiphertext { epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], + enc_ciphertext: [0u8; 612], out_ciphertext: [0u8; 80], }; @@ -255,48 +255,6 @@ pub fn write_action_without_auth( Ok(()) } - - -// #[derive(Clone, Debug)] -// pub enum EncCiphertext { -// NoteV2([u8; orchard::note_encryption::ENC_CIPHERTEXT_SIZE_V2]), -// NoteV3([u8; orchard::note_encryption_v3::ENC_CIPHERTEXT_SIZE_V3]), -// } -// -// #[derive(Clone)] -// pub struct TransmittedNoteCiphertextNew { -// /// The serialization of the ephemeral public key -// pub epk_bytes: [u8; 32], -// /// The encrypted note ciphertext -// pub enc_ciphertext: EncCiphertext, -// /// An encrypted value that allows the holder of the outgoing cipher -// /// key for the note to recover the note plaintext. -// pub out_ciphertext: [u8; 80], -// } -// -// pub fn write_note_ciphertext2( -// mut writer: W, -// nc: &TransmittedNoteCiphertextNew, -// ) -> io::Result<()> { -// writer.write_all(&nc.epk_bytes)?; -// writer.write_all(&nc.enc_ciphertext)?; -// writer.write_all(&nc.out_ciphertext) -// } -// -// pub fn read_note_ciphertext2(mut reader: R) -> io::Result { -// let mut tnc = TransmittedNoteCiphertextNew { -// epk_bytes: [0u8; 32], -// enc_ciphertext: [0u8; 580], -// out_ciphertext: [0u8; 80], -// }; -// -// reader.read_exact(&mut tnc.epk_bytes)?; -// reader.read_exact(&mut tnc.enc_ciphertext)?; -// reader.read_exact(&mut tnc.out_ciphertext)?; -// -// Ok(tnc) -// } - #[cfg(any(test, feature = "test-dependencies"))] pub mod testing { use proptest::prelude::*; @@ -305,16 +263,11 @@ pub mod testing { testing::{self as t_orch}, Authorized, Bundle, }; - use orchard::note::TransmittedNoteCiphertext; - use orchard::note_encryption::{ENC_CIPHERTEXT_SIZE_V2, NoteCiphertextBytes}; - use orchard::note_encryption_v3::ENC_CIPHERTEXT_SIZE_V3; - use rand_core::OsRng; use crate::transaction::{ components::amount::{testing::arb_amount, Amount}, TxVersion, }; - use crate::transaction::components::orchard::{read_note_ciphertext, write_note_ciphertext}; prop_compose! { pub fn arb_bundle(n_actions: usize)( @@ -336,42 +289,4 @@ pub mod testing { Strategy::boxed(Just(None)) } } - - - - #[test] - fn backward_compatible_roundtest() { - const TEST_DATA_SIZE: usize = - 32 + //epk_bytes - 580 + // enc_ciphertext - 80; // out_ciphertext - - let mut rng = OsRng; - - let mut nc = TransmittedNoteCiphertext{ - epk_bytes: [0u8; 32], - enc_ciphertext: [0u8; 580], - out_ciphertext: [0u8; 80], - }; - - rng.fill_bytes(nc.epk_bytes.as_mut()); - rng.fill_bytes(nc.enc_ciphertext.as_mut()); - rng.fill_bytes(nc.out_ciphertext.as_mut()); - - let mut writer = Vec::with_capacity(TEST_DATA_SIZE); - - write_note_ciphertext(&mut writer, &nc).unwrap(); - - - let mut reader = writer.as_slice(); - - let nc_out = read_note_ciphertext(&mut reader).unwrap(); - - assert_eq!(nc_out.epk_bytes, nc.epk_bytes); - assert_eq!(nc_out.enc_ciphertext, nc.enc_ciphertext); - assert_eq!(nc_out.out_ciphertext, nc.out_ciphertext); - - //print!(nc) - - } } diff --git a/zcash_primitives/src/transaction/components/sapling.rs b/zcash_primitives/src/transaction/components/sapling.rs index 31b735fe0c..21f7f98059 100644 --- a/zcash_primitives/src/transaction/components/sapling.rs +++ b/zcash_primitives/src/transaction/components/sapling.rs @@ -4,14 +4,14 @@ use ff::PrimeField; use group::GroupEncoding; use std::io::{self, Read, Write}; -use zcash_note_encryption::{ - EphemeralKeyBytes, ShieldedOutput, -}; +use zcash_note_encryption::{EphemeralKeyBytes, ShieldedOutput}; use crate::{ consensus, sapling::{ - note_encryption::{SaplingDomain,COMPACT_NOTE_SIZE, CompactNoteCiphertextBytes, NoteCiphertextBytes}, + note_encryption::{ + CompactNoteCiphertextBytes, NoteCiphertextBytes, SaplingDomain, COMPACT_NOTE_SIZE, + }, redjubjub::{self, PublicKey, Signature}, Nullifier, }, @@ -261,9 +261,7 @@ pub struct OutputDescription { pub zkproof: Proof, } -impl ShieldedOutput> - for OutputDescription -{ +impl ShieldedOutput> for OutputDescription { fn ephemeral_key(&self) -> EphemeralKeyBytes { self.ephemeral_key.clone() } @@ -277,7 +275,11 @@ impl ShieldedOutput> } fn enc_ciphertext_compact(&self) -> CompactNoteCiphertextBytes { - CompactNoteCiphertextBytes(self.enc_ciphertext[0..COMPACT_NOTE_SIZE].try_into().unwrap()) + CompactNoteCiphertextBytes( + self.enc_ciphertext[0..COMPACT_NOTE_SIZE] + .try_into() + .unwrap(), + ) } } @@ -409,9 +411,7 @@ impl From> for CompactOutputDescription { } } -impl ShieldedOutput> - for CompactOutputDescription -{ +impl ShieldedOutput> for CompactOutputDescription { fn ephemeral_key(&self) -> EphemeralKeyBytes { self.ephemeral_key.clone() } diff --git a/zcash_primitives/src/transaction/tests/data.rs b/zcash_primitives/src/transaction/tests/data.rs index 5b73779fea..0d95e28451 100644 --- a/zcash_primitives/src/transaction/tests/data.rs +++ b/zcash_primitives/src/transaction/tests/data.rs @@ -5701,8 +5701,8 @@ pub mod zip_0244 { pub sighash_none_anyone: Option<[u8; 32]>, pub sighash_single_anyone: Option<[u8; 32]>, } + // From https://github.com/zcash-hackworks/zcash-test-vectors/ (zip_0244) - // From https://github.com/zcash-hackworks/zcash-test-vectors/blob/master/zip_0244.py pub fn make_test_vectors() -> Vec { vec![ TestVector { @@ -5883,22 +5883,22 @@ pub mod zip_0244 { 0x52, 0xde, 0xa3, 0xca, 0x7c, 0xff, 0x8e, 0xf3, 0x5c, 0xd8, 0xe6, 0xd7, 0xc1, 0x11, 0xa6, 0x8e, 0xf4, 0x4b, 0xcd, 0x0c, 0x15, 0x13, 0xad, 0x47, 0xca, 0x61, 0xc6, 0x59, 0xcc, 0x5d, 0x32, 0x5b, 0x44, 0x0f, 0x6b, 0x9f, 0x59, 0xaf, 0xf6, - 0x68, 0x79, 0xbb, 0x66, 0x88, 0xfd, 0xb4, 0x62, 0xaf, 0x43, 0x58, 0x2b, 0x98, - 0x3f, 0x92, 0xb5, 0x69, 0x8b, 0x87, 0xdb, 0x46, 0xe4, 0xb0, 0x2d, 0xd8, 0xe8, - 0x1e, 0xca, 0x55, 0x5a, 0x44, 0xf2, 0xf1, 0xae, 0xf1, 0x1d, 0x88, 0xa0, 0xbc, - 0xee, 0x76, 0xaf, 0x9a, 0xd3, 0xf9, 0xc4, 0x6a, 0x67, 0x06, 0x2e, 0x1a, 0x9c, - 0xa7, 0xea, 0x5c, 0x01, 0x43, 0x84, 0xaf, 0x07, 0x21, 0x9c, 0x7c, 0x0e, 0xe7, - 0xfc, 0x7b, 0xfc, 0x79, 0x33, 0xd1, 0x74, 0x65, 0x0f, 0x46, 0xb4, 0xcc, 0x00, - 0x01, 0x90, 0xc1, 0x9b, 0x44, 0xc5, 0x7a, 0xe8, 0x91, 0xaa, 0x86, 0x64, 0x6c, - 0x10, 0xa1, 0x77, 0xa8, 0x62, 0x6b, 0xe0, 0x64, 0x40, 0x99, 0x31, 0xc3, 0x7d, - 0x9e, 0x8b, 0xdc, 0x43, 0x3b, 0x7d, 0x79, 0xe0, 0x8a, 0x12, 0xf7, 0x38, 0xa8, - 0xf0, 0xdb, 0xdd, 0xfe, 0xf2, 0xf2, 0x65, 0x7e, 0xf3, 0xe4, 0x7d, 0x1b, 0x0f, - 0xd1, 0x1e, 0x6a, 0x13, 0x65, 0x4d, 0xb2, 0x85, 0x4f, 0xcb, 0xff, 0x49, 0xaa, - 0x0d, 0xad, 0xaf, 0xec, 0x32, 0x0b, 0x6e, 0xd2, 0xd4, 0xb2, 0x79, 0xae, 0xe9, - 0x06, 0x0c, 0x1b, 0x22, 0x1e, 0x2e, 0xb2, 0xf1, 0x3b, 0x06, 0x91, 0xc4, 0xd8, - 0x42, 0x40, 0x6d, 0x0e, 0xc4, 0x28, 0x2c, 0x95, 0x26, 0x17, 0x4a, 0x09, 0x87, - 0x8f, 0xe8, 0xfd, 0xde, 0x33, 0xa2, 0x96, 0x04, 0xe5, 0xe5, 0xe7, 0xb2, 0xa0, - 0x25, 0xd6, 0x65, 0x0b, 0x97, 0xdb, 0xb5, 0x2b, 0xef, 0xb5, 0x9b, 0x1d, 0x30, + 0x68, 0x79, 0xbb, 0x66, 0x88, 0xfd, 0x28, 0x59, 0x36, 0x2b, 0x18, 0x2f, 0x20, + 0x7b, 0x31, 0x75, 0x96, 0x1f, 0x64, 0x11, 0xa4, 0x93, 0xbf, 0xfd, 0x04, 0x8e, + 0x7d, 0x0d, 0x87, 0xd8, 0x2f, 0xe6, 0xf9, 0x90, 0xa2, 0xb0, 0xa2, 0x5f, 0x3f, + 0x3c, 0x4f, 0x8b, 0x77, 0xe2, 0x1a, 0xae, 0xbf, 0xc1, 0x17, 0x17, 0x1d, 0x58, + 0xe9, 0xb4, 0xe5, 0x02, 0x36, 0x0d, 0x3d, 0x7b, 0xa5, 0x45, 0x01, 0x19, 0x54, + 0x4e, 0x09, 0xfc, 0x03, 0xa7, 0x22, 0x64, 0x4e, 0x4d, 0x2d, 0x2e, 0x50, 0x10, + 0xb6, 0xfd, 0x09, 0xa2, 0x0e, 0x7e, 0x6f, 0x60, 0x05, 0xab, 0xff, 0x89, 0x94, + 0xbf, 0xa6, 0x05, 0xcf, 0xbc, 0x7e, 0xd7, 0x46, 0xa7, 0xd3, 0x37, 0xc8, 0x10, + 0xea, 0xba, 0x2b, 0x90, 0xf3, 0x53, 0xf2, 0x56, 0x0c, 0x63, 0xa7, 0x96, 0xe8, + 0xaa, 0x4c, 0xb7, 0xc1, 0x82, 0x37, 0xc5, 0x3c, 0x8d, 0xd2, 0x5a, 0x1a, 0x1c, + 0xd8, 0x41, 0x57, 0x12, 0x31, 0x1f, 0xb7, 0x99, 0xc7, 0x9c, 0x64, 0x1d, 0x9d, + 0xa4, 0x3b, 0x33, 0xe7, 0xad, 0x01, 0x2e, 0x28, 0x25, 0x53, 0x98, 0x78, 0x92, + 0x62, 0x27, 0x5f, 0x11, 0x75, 0xbe, 0x84, 0x62, 0xc0, 0x14, 0x25, 0xd4, 0x60, + 0xc6, 0xd3, 0x91, 0x55, 0xd2, 0xff, 0x8e, 0xcb, 0x41, 0x48, 0xfd, 0xc2, 0x32, + 0x9e, 0x53, 0xd0, 0xee, 0x7f, 0x87, 0xb1, 0xf2, 0xce, 0x29, 0x68, 0x5c, 0x48, + 0x7d, 0x17, 0xa7, 0x0b, 0x97, 0xdb, 0xb5, 0x2b, 0xef, 0xb5, 0x9b, 0x1d, 0x30, 0xa5, 0x74, 0x33, 0xb0, 0xa3, 0x51, 0x47, 0x44, 0x44, 0x09, 0x9d, 0xaa, 0x37, 0x10, 0x46, 0x61, 0x32, 0x60, 0xcf, 0x33, 0x54, 0xcf, 0xcd, 0xad, 0xa6, 0x63, 0xec, 0xe8, 0x24, 0xff, 0xd7, 0xe4, 0x43, 0x93, 0x88, 0x6a, 0x86, 0x16, 0x5d, @@ -5946,183 +5946,102 @@ pub mod zip_0244 { 0xc0, 0x59, 0xd0, 0xdf, 0x8a, 0xbf, 0x62, 0x10, 0x78, 0xf0, 0x2d, 0x6c, 0x4b, 0xc8, 0x6d, 0x40, 0x84, 0x5a, 0xc1, 0xd5, 0x97, 0x10, 0xc4, 0x5f, 0x07, 0xd5, 0x85, 0xeb, 0x48, 0xb3, 0x2f, 0xc0, 0x16, 0x7b, 0xa2, 0x56, 0xe7, 0x3c, 0xa3, - 0xb9, 0x31, 0x1c, 0x62, 0xd1, 0x09, 0x49, 0x03, 0x57, 0x05, 0x19, 0xd4, 0x44, - 0x2f, 0x02, 0x00, 0xe6, 0xad, 0x11, 0xf2, 0x45, 0x2d, 0xc9, 0xae, 0x85, 0xae, - 0xc0, 0x1f, 0xc5, 0x6f, 0x8c, 0xbf, 0xda, 0x75, 0xa7, 0x72, 0x7b, 0x75, 0xeb, - 0xbd, 0x6b, 0xbf, 0xfb, 0x43, 0xb6, 0x3a, 0x3b, 0x1b, 0x87, 0x1e, 0x40, 0xfe, - 0xb0, 0xdb, 0x00, 0x29, 0x74, 0xa3, 0xc3, 0xb1, 0xa7, 0x88, 0x56, 0x72, 0x31, - 0xbf, 0x63, 0x99, 0xff, 0x89, 0x23, 0x69, 0x81, 0x14, 0x9d, 0x42, 0x38, 0x02, - 0xd2, 0x34, 0x1a, 0x3b, 0xed, 0xb9, 0xdd, 0xcb, 0xac, 0x1f, 0xe7, 0xb6, 0x43, - 0x5e, 0x14, 0x79, 0xc7, 0x2e, 0x70, 0x89, 0xd0, 0x29, 0xe7, 0xfb, 0xba, 0xf3, - 0xcf, 0x37, 0xe9, 0xb9, 0xa6, 0xb7, 0x76, 0x79, 0x1e, 0x4c, 0x5e, 0x6f, 0xda, + 0xb9, 0x31, 0x1c, 0x62, 0xd1, 0x09, 0x49, 0x79, 0x57, 0xd8, 0xdb, 0xe1, 0x0a, + 0xa3, 0xe8, 0x66, 0xb4, 0x0c, 0x0b, 0xaa, 0x2b, 0xc4, 0x92, 0xc1, 0x9a, 0xd1, + 0xe6, 0x37, 0x2d, 0x96, 0x22, 0xbf, 0x16, 0x3f, 0xbf, 0xfe, 0xae, 0xee, 0x79, + 0x6a, 0x3c, 0xd9, 0xb6, 0xfb, 0xbf, 0xa4, 0xd7, 0x92, 0xf3, 0x4d, 0x7f, 0xd6, + 0xe7, 0x63, 0xcd, 0x58, 0x59, 0xdd, 0x26, 0x83, 0x3d, 0x21, 0xd9, 0xbc, 0x54, + 0x52, 0xbd, 0x19, 0x51, 0x5d, 0xff, 0x01, 0x6d, 0x0d, 0x4c, 0x07, 0xfb, 0x38, + 0x03, 0x00, 0x19, 0x3b, 0xed, 0xb9, 0xf0, 0x9a, 0x7f, 0x86, 0xcb, 0xbd, 0xf6, + 0x54, 0x18, 0xe0, 0x80, 0x0c, 0x70, 0x89, 0xd0, 0x29, 0xe7, 0xfb, 0xba, 0xf3, + 0xcf, 0x37, 0xe9, 0xb9, 0xa6, 0xb7, 0x76, 0x39, 0x3e, 0x4c, 0x5e, 0x6f, 0xda, 0x57, 0xe8, 0xd5, 0xf1, 0x4c, 0x8c, 0x35, 0xa2, 0xd2, 0x70, 0x84, 0x6b, 0x9d, 0xbe, 0x00, 0x5c, 0xda, 0x16, 0xaf, 0x44, 0x08, 0xf3, 0xab, 0x06, 0xa9, 0x16, 0xee, 0xeb, 0x9c, 0x95, 0x94, 0xb7, 0x04, 0x24, 0xa4, 0xc1, 0xd1, 0x71, 0x29, 0x5b, 0x67, 0x63, 0xb2, 0x2f, 0x47, 0xf8, 0x0b, 0x53, 0xcc, 0xbb, 0x90, 0x4b, - 0xd6, 0x8f, 0xd6, 0x5f, 0xbd, 0x3f, 0xbd, 0xea, 0x10, 0x35, 0xe9, 0x8c, 0x21, - 0xa7, 0xdb, 0xa5, 0xfe, 0x10, 0x89, 0xf7, 0xd1, 0xc0, 0x32, 0xf2, 0x4d, 0x36, - 0x83, 0x5a, 0xa8, 0x81, 0x52, 0x66, 0xe8, 0x97, 0xff, 0x82, 0x94, 0x03, 0xcf, - 0xac, 0x3a, 0x71, 0x59, 0x54, 0xb9, 0xb6, 0x89, 0x58, 0xa0, 0x11, 0x1a, 0x2c, - 0x92, 0x65, 0x63, 0x3b, 0xa2, 0x83, 0x1a, 0x2e, 0x86, 0xb9, 0x41, 0xe5, 0x69, - 0xd5, 0x8d, 0x99, 0xc1, 0x38, 0x35, 0x97, 0xfa, 0xd8, 0x11, 0x93, 0xc4, 0xc1, - 0x31, 0x51, 0xf4, 0x0a, 0xed, 0xb4, 0x87, 0xb5, 0xc0, 0x4a, 0xe3, 0xb1, 0xdd, - 0xfb, 0xaf, 0xa2, 0x6e, 0x72, 0x00, 0x99, 0xf2, 0x6d, 0x5a, 0x75, 0x35, 0xae, - 0xe5, 0x73, 0x06, 0xfd, 0x2c, 0x4f, 0x30, 0x67, 0x3c, 0xd9, 0xb6, 0x98, 0xfe, - 0xcf, 0x32, 0xfa, 0xf8, 0x8f, 0x62, 0xe2, 0x1c, 0x90, 0x66, 0x58, 0x59, 0xdd, - 0x26, 0x83, 0x3d, 0x21, 0xd9, 0xbc, 0x54, 0x52, 0xbd, 0x19, 0x51, 0x5d, 0x3f, - 0xa5, 0xc1, 0xe6, 0x8b, 0xc2, 0x09, 0xb9, 0xdc, 0x2a, 0x10, 0xae, 0x6b, 0x63, - 0x07, 0x26, 0xa6, 0x7b, 0x33, 0x60, 0x3c, 0x69, 0x1f, 0xaf, 0xc2, 0x81, 0xdd, - 0x94, 0xdc, 0x98, 0x88, 0xa6, 0x8c, 0x4f, 0x45, 0x15, 0x5a, 0xa7, 0x89, 0x7c, - 0x04, 0x5a, 0xaf, 0xd9, 0x33, 0x5b, 0xe2, 0xe0, 0xdd, 0xcf, 0x5f, 0x58, 0x6d, - 0x7f, 0x6b, 0x4f, 0xe1, 0x2d, 0xad, 0x9a, 0x17, 0xf5, 0xdb, 0x70, 0x31, + 0xd6, 0x8f, 0xd6, 0x5f, 0xbd, 0x3f, 0x74, 0x4e, 0x66, 0x78, 0x71, 0xba, 0xae, + 0x70, 0xde, 0x4b, 0xc9, 0x4b, 0x15, 0x0d, 0xa4, 0x16, 0xec, 0x5e, 0x70, 0x7f, + 0x3e, 0x48, 0x68, 0xa8, 0x53, 0x5e, 0xb7, 0x5b, 0xb8, 0x3e, 0x80, 0xb1, 0x6e, + 0x6a, 0x90, 0xe2, 0xd5, 0x07, 0xcd, 0xfe, 0x6f, 0xbd, 0xaa, 0x86, 0x16, 0x3e, + 0x9c, 0xf5, 0xde, 0x31, 0x00, 0xfb, 0xca, 0x7e, 0x8d, 0xa0, 0x47, 0xb0, 0x90, + 0xdb, 0x9f, 0x37, 0x95, 0x2f, 0xd3, 0x46, 0xb7, 0xf1, 0x68, 0xeb, 0xc5, 0xfc, + 0x8f, 0xe2, 0x53, 0xdd, 0x29, 0x27, 0x85, 0xd8, 0x9f, 0x82, 0xa6, 0xc6, 0x59, + 0xbb, 0x40, 0x3d, 0xc7, 0x32, 0xe5, 0x0b, 0xe6, 0x68, 0x4c, 0xba, 0xbd, 0x6b, + 0xbf, 0xfb, 0x43, 0xb6, 0x3a, 0x3b, 0x1b, 0x67, 0x1e, 0x40, 0xfe, 0xb0, 0xdb, + 0x00, 0x29, 0x74, 0xa3, 0xc3, 0xb1, 0xa7, 0x88, 0x56, 0x72, 0x31, 0xbf, 0x63, + 0x99, 0xff, 0x89, 0x23, 0x55, 0xe0, 0xbb, 0xde, 0xbe, 0xeb, 0xae, 0x2e, 0xdb, + 0x02, 0x5d, 0xe2, 0xf8, 0x68, 0x65, 0x8b, 0x38, 0x0c, 0x6f, 0xcf, 0xa2, 0x4c, + 0x07, 0x08, 0x25, 0xfc, 0x45, 0xed, 0xfc, 0xbd, 0x65, 0x91, 0x60, 0xb7, 0x08, + 0xe8, 0x08, 0x9f, 0x84, 0xd6, 0x37, 0xa8, 0xb0, 0x0b, 0x5e, 0x50, 0x19, 0xe8, + 0x1c, 0x15, 0x01, 0x03, 0x47, 0x53, 0x14, 0x6e, 0x22, 0xd0, 0x5f, 0x58, 0x6d, + 0x7f, 0x6b, 0x0f, ], txid: [ - 0x55, 0x2c, 0x96, 0xbd, 0x33, 0x83, 0x4b, 0xa1, 0xa8, 0xa3, 0xec, 0xd8, 0x0a, - 0x2c, 0x9c, 0xb4, 0x11, 0x87, 0x55, 0x3a, 0x3d, 0xcf, 0xe7, 0x92, 0x83, 0x16, - 0xbb, 0x70, 0x70, 0x4b, 0x85, 0xd0, + 0xbb, 0x52, 0xff, 0x82, 0xd9, 0xa4, 0xf0, 0x95, 0x8e, 0x2f, 0xb5, 0xfd, 0xb3, + 0x2c, 0xf0, 0xde, 0xf5, 0x36, 0x69, 0x98, 0x56, 0x51, 0x6a, 0x58, 0x56, 0x55, + 0x10, 0x29, 0x4f, 0xa2, 0x54, 0x28, ], auth_digest: [ - 0x12, 0x76, 0x7e, 0x5f, 0x67, 0x85, 0x67, 0x36, 0x0f, 0xb3, 0xa1, 0xcb, 0x9c, - 0xf8, 0x58, 0x61, 0x3f, 0xfe, 0x22, 0x63, 0xb6, 0x53, 0xc6, 0xa3, 0x70, 0xee, - 0x1f, 0x68, 0x20, 0xab, 0xdc, 0x57, + 0x69, 0xa1, 0xb7, 0xcb, 0x2e, 0xeb, 0x8e, 0x8d, 0x15, 0x68, 0x3f, 0x4c, 0x5c, + 0x38, 0x73, 0xc9, 0x4e, 0x33, 0x83, 0xf6, 0x0c, 0x2c, 0x5e, 0x1c, 0x23, 0xf3, + 0xd4, 0xed, 0xd7, 0x25, 0x30, 0xd1, ], - amounts: vec![1800841178198868], - script_pubkeys: vec![vec![0x65, 0x00, 0x51]], + amounts: vec![1203563221197918], + script_pubkeys: vec![vec![0x63, 0x63, 0x52, 0x6a, 0x63, 0x53, 0x00, 0x51, 0x53]], transparent_input: Some(0), sighash_shielded: [ - 0x88, 0xda, 0x64, 0xb9, 0x5b, 0x56, 0xd8, 0x29, 0x6a, 0xb1, 0xf7, 0x21, 0xeb, - 0x5b, 0xe6, 0x6d, 0x0f, 0xd4, 0x78, 0xf2, 0xb9, 0x6b, 0x93, 0xd5, 0xdc, 0xee, - 0x8f, 0x7a, 0x10, 0x00, 0xb0, 0xff, + 0xd5, 0xbd, 0x65, 0x01, 0xa1, 0x8e, 0x4f, 0x2d, 0x91, 0x50, 0x8b, 0x7a, 0x6d, + 0x00, 0x03, 0xad, 0xcc, 0xc3, 0x82, 0xcd, 0x75, 0xf6, 0x6f, 0x41, 0x96, 0x16, + 0x47, 0xa5, 0x12, 0x85, 0xcc, 0x89, ], sighash_all: Some([ - 0x2d, 0x4e, 0xbf, 0x4d, 0x42, 0x42, 0x38, 0xad, 0x0b, 0xc2, 0x46, 0x99, 0x70, - 0x34, 0x7e, 0xaf, 0x76, 0x7f, 0xf9, 0x06, 0x95, 0x8e, 0x35, 0x10, 0x7f, 0xd2, - 0x2c, 0x1d, 0xc5, 0x36, 0xe4, 0x59, + 0xd2, 0xfc, 0xb8, 0x0b, 0xaf, 0xc9, 0x28, 0xfc, 0x54, 0x84, 0x0c, 0x48, 0x3f, + 0x7e, 0xb4, 0xa5, 0x43, 0x87, 0x71, 0xa6, 0x5c, 0x2a, 0xcd, 0x60, 0x76, 0x60, + 0xc0, 0x5d, 0x39, 0x95, 0xd9, 0x4e, ]), sighash_none: Some([ - 0x68, 0x3e, 0xca, 0xa5, 0x64, 0x00, 0x2c, 0xa5, 0xa8, 0x0b, 0xea, 0x04, 0x37, - 0x0c, 0x78, 0x85, 0x5b, 0x8d, 0x9c, 0x9c, 0x38, 0x23, 0x09, 0xc7, 0x0b, 0x29, - 0xbd, 0xd9, 0x8d, 0x75, 0xb0, 0x66, + 0x81, 0xbd, 0xa8, 0x0e, 0x4d, 0x6c, 0xfd, 0x52, 0x6c, 0x3c, 0xbf, 0x81, 0xd5, + 0x45, 0xcc, 0x33, 0xe1, 0xe0, 0xf0, 0x01, 0xc8, 0xb1, 0xf2, 0x20, 0x08, 0xc4, + 0xc5, 0x19, 0x65, 0xc8, 0x4d, 0x99, ]), sighash_single: None, sighash_all_anyone: Some([ - 0x9c, 0x9e, 0x75, 0xee, 0x15, 0xf4, 0xed, 0xa1, 0x5d, 0x77, 0x79, 0x39, 0x52, - 0x9f, 0xa3, 0xa4, 0xf6, 0x4b, 0x93, 0x5c, 0x7d, 0x21, 0x83, 0x5f, 0x79, 0x39, - 0x3e, 0x7a, 0xa2, 0x3e, 0x28, 0x79, + 0x32, 0x7a, 0x21, 0x00, 0x57, 0x25, 0x6e, 0x48, 0x3b, 0xc2, 0x63, 0x9b, 0x3a, + 0x16, 0x25, 0x59, 0x40, 0xf6, 0x66, 0x2e, 0x96, 0xf4, 0xd3, 0xd9, 0x48, 0x45, + 0x1b, 0xa9, 0x94, 0x92, 0x10, 0x74, ]), sighash_none_anyone: Some([ - 0xa7, 0xdf, 0xf0, 0x0a, 0x96, 0xfd, 0x2b, 0x41, 0xc5, 0x80, 0x8d, 0x35, 0xe4, - 0xa6, 0xa2, 0xaa, 0x7b, 0x40, 0xee, 0xeb, 0xb6, 0xdc, 0xf3, 0xb9, 0xf2, 0x81, - 0xeb, 0x6c, 0x17, 0xe4, 0x3a, 0xf4, + 0xb6, 0xa7, 0x8c, 0x4c, 0x2d, 0x46, 0x0c, 0x3e, 0xab, 0xfc, 0xa1, 0x1b, 0xd6, + 0x40, 0x65, 0xa4, 0x2a, 0x8c, 0xe4, 0xa0, 0xda, 0xc6, 0x54, 0xa7, 0x21, 0x20, + 0xdd, 0x65, 0x01, 0xea, 0x91, 0x19, ]), sighash_single_anyone: None, }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x1f, - 0xc9, 0x98, 0xc3, 0x1f, 0x4d, 0xd2, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x06, 0x04, 0x1f, 0x4d, 0xd2, 0x08, 0x00, 0xff, - 0xff, 0xff, 0xff, 0x01, 0x50, 0x58, 0xe5, 0x75, 0x4c, 0x21, 0x04, 0x00, 0x07, - 0x53, 0xac, 0x51, 0x53, 0x00, 0x51, 0x52, 0x00, 0x01, 0xe5, 0x84, 0x9f, 0x96, - 0xba, 0xe6, 0xf2, 0x05, 0x6f, 0x33, 0xab, 0x1e, 0x69, 0x89, 0xd7, 0xd2, 0x64, - 0xad, 0xc9, 0x78, 0x55, 0xa9, 0x90, 0x10, 0x3b, 0x4d, 0x1e, 0x63, 0x50, 0xd5, - 0xc3, 0x1a, 0x39, 0xc3, 0xca, 0xf6, 0x94, 0x59, 0xe4, 0x62, 0xf1, 0x41, 0xbe, - 0x8b, 0x39, 0x03, 0x7f, 0xfa, 0x25, 0x5c, 0xe2, 0x7e, 0x4a, 0xd7, 0xb5, 0x66, - 0xa2, 0x96, 0x20, 0xa9, 0xf0, 0x11, 0xab, 0x08, 0xfb, 0x2a, 0xd3, 0x05, 0x06, - 0x52, 0xb3, 0xf6, 0x5b, 0x8e, 0x34, 0x52, 0x6a, 0x2a, 0x15, 0xfc, 0x2d, 0xdc, - 0x5b, 0x51, 0x13, 0xe4, 0x88, 0x2c, 0x7c, 0xca, 0x0d, 0xd5, 0x57, 0x7b, 0xe0, - 0x67, 0xba, 0x7a, 0x17, 0x5d, 0xae, 0x4b, 0xbe, 0x3e, 0xf4, 0x86, 0x3d, 0x53, - 0x70, 0x89, 0x15, 0x09, 0x0f, 0x47, 0xa0, 0x68, 0xe2, 0x27, 0x43, 0x3f, 0x9e, - 0x49, 0xd3, 0xaa, 0x09, 0xe3, 0x56, 0xd8, 0xd6, 0x6d, 0x0c, 0x01, 0x21, 0xe9, - 0x1a, 0x3c, 0x4a, 0xa3, 0xf2, 0x7f, 0xa1, 0xb6, 0x33, 0x96, 0xe2, 0xb4, 0x1d, - 0xb9, 0x08, 0xfd, 0xab, 0x8b, 0x18, 0xcc, 0x73, 0x04, 0xe9, 0x4e, 0x97, 0x05, - 0x68, 0xf9, 0x42, 0x1c, 0x0d, 0xbb, 0xba, 0xf8, 0x45, 0x98, 0xd9, 0x72, 0xb0, - 0x53, 0x4f, 0x48, 0xa5, 0xe5, 0x26, 0x70, 0x43, 0x6a, 0xaa, 0x77, 0x6e, 0xd2, - 0x48, 0x2a, 0xd7, 0x03, 0x43, 0x02, 0x01, 0xe5, 0x34, 0x43, 0xc3, 0x6d, 0xcf, - 0xd3, 0x4a, 0x0c, 0xb6, 0x63, 0x78, 0x76, 0x10, 0x5e, 0x79, 0xbf, 0x3b, 0xd5, - 0x8e, 0xc1, 0x48, 0xcb, 0x64, 0x97, 0x0e, 0x32, 0x23, 0xa9, 0x1f, 0x71, 0xdf, - 0xcf, 0xd5, 0xa0, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, - 0x82, 0x88, 0x20, 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, - 0x6e, 0x56, 0xc6, 0x15, 0x27, 0x2f, 0x85, 0x44, 0x64, 0xc0, 0xca, 0x4b, 0x1e, - 0x85, 0xae, 0xdd, 0x03, 0x82, 0x92, 0xc4, 0xe1, 0xa5, 0x77, 0x44, 0xeb, 0xba, - 0x01, 0x0b, 0x9e, 0xbf, 0xbb, 0x01, 0x1b, 0xd6, 0xf0, 0xb7, 0x88, 0x05, 0x02, - 0x5d, 0x27, 0xf3, 0xc1, 0x77, 0x46, 0xba, 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, - 0x1f, 0x0f, 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, - 0xcf, 0x01, 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, 0xfe, 0xd8, 0x7f, 0x6c, - 0xf4, 0x29, 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, 0x66, 0x11, 0xcf, - 0x5b, 0xc2, 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, 0x0e, 0x39, - 0xc3, 0xdf, 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, 0x81, - 0xb3, 0x2f, 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, - 0x20, 0xc3, 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, - 0x30, 0xdd, 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, - 0x20, 0x3d, 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, - 0x60, 0x4e, 0x47, 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, - 0x04, 0x5e, 0x25, 0x5a, 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, - 0x4c, 0xae, 0x30, 0x7b, 0xb3, 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, - 0x4c, 0x0a, 0xb8, 0xcc, 0x3d, 0x67, 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, - 0xd1, 0x8a, 0x07, 0xa8, 0xd1, 0x06, 0x8d, 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, - 0x0f, 0x6d, 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, 0x00, 0xa5, 0x17, 0x8f, 0x17, - 0x5c, 0xac, 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, 0x73, 0x8e, 0x24, 0x02, - 0xa2, 0xd2, 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, 0x00, 0xb9, 0xf6, - 0x24, 0x16, 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, 0xe0, 0xbe, - 0x3f, 0x30, 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, 0x69, - 0xc6, 0xc7, 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, - 0xf5, 0x08, 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, - 0xcc, 0x76, 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, - 0xcf, 0x77, 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, - 0x2f, 0xc1, 0x0c, 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, - 0xb7, 0xc4, 0x0c, 0x7c, 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, - 0x25, 0xc0, 0x4b, 0xc4, 0x61, 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, - 0xba, 0xdd, 0xf4, 0xf4, 0xd1, 0x40, 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, - 0x7d, 0xf1, 0x24, 0xf0, 0xfc, 0xf2, 0x06, 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, - 0xcd, 0xbf, 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, 0x13, 0x0a, 0xb8, 0x49, 0xc2, - 0xf2, 0x2b, 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, 0xf1, 0x97, 0x6a, 0xe1, - 0x01, 0x0b, 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, 0x97, 0x49, 0xcc, - 0x4d, 0x61, 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, 0x39, 0x95, - 0x1b, 0x33, 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, 0x86, - 0x2a, 0xd1, 0x2f, 0xd7, 0x6b, 0xa4, 0x80, 0x7e, 0x65, 0x41, 0x7b, 0x6c, 0xd1, - 0x2f, 0xa8, 0xec, 0x91, 0x6f, 0x01, 0x3e, 0xbb, 0x87, 0x06, 0xa9, 0xa5, 0x56, - 0xc7, 0x62, 0xf8, 0x85, 0x00, 0x00, 0x6e, 0xff, 0xed, 0xa0, 0x6c, 0x4b, 0xe2, - 0x4b, 0x04, 0x84, 0x63, 0x92, 0xe9, 0xd1, 0xe6, 0x93, 0x0e, 0xae, 0x01, 0xfa, - 0x21, 0xfb, 0xd7, 0x00, 0x58, 0x3f, 0xb5, 0x98, 0xb9, 0x2c, 0x8f, 0x4e, 0xb8, - 0xa6, 0x1a, 0xa6, 0x23, 0x5d, 0xb6, 0x0f, 0x28, 0x41, 0xcf, 0x3a, 0x1c, 0x6a, - 0xb5, 0x4c, 0x67, 0x06, 0x68, 0x44, 0x71, 0x1d, 0x09, 0x1e, 0xb9, 0x31, 0xa1, - 0xbd, 0x62, 0x81, 0xae, 0xdf, 0x2a, 0x0e, 0x8f, 0xab, 0x18, 0x81, 0x72, 0x02, - 0xa9, 0xbe, 0x06, 0x40, 0x2e, 0xd9, 0xcc, 0x72, 0x0c, 0x16, 0xbf, 0xe8, 0x81, - 0xe4, 0xdf, 0x42, 0x55, 0xe8, 0x7a, 0xfb, 0x7f, 0xc6, 0x2f, 0x38, 0x11, 0x6b, - 0xbe, 0x03, 0xcd, 0x8a, 0x3c, 0xb1, 0x1a, 0x27, 0xd5, 0x68, 0x41, 0x47, 0x82, - 0xf4, 0x7b, 0x1a, 0x44, 0xc9, 0x7c, 0x68, 0x04, 0x67, 0x69, 0x4b, 0xc9, 0x70, - 0x9d, 0x32, 0x91, 0x6c, 0x97, 0xe8, 0x00, 0x6c, 0xbb, 0x07, 0xba, 0x0e, 0x41, - 0x80, 0xa3, 0x73, 0x80, 0x38, 0xc3, 0x74, 0xc4, 0xcc, 0xe8, 0xf3, 0x29, 0x59, - 0xaf, 0xb2, 0x5f, 0x30, 0x3f, 0x58, 0x15, 0xc4, 0x53, 0x31, 0x24, 0xac, 0xf9, - 0xd1, 0x89, 0x40, 0xe7, 0x75, 0x22, 0xac, 0x5d, 0xc4, 0xb9, 0x57, 0x0a, 0xae, - 0x8f, 0x47, 0xb7, 0xf5, 0x7f, 0xd8, 0x76, 0x7b, 0xea, 0x1a, 0x24, 0xae, 0x7b, - 0xed, 0x65, 0xb4, 0x09, 0xe1, 0xdd, 0x26, 0xb8, 0xdd, 0xdd, 0x68, 0x85, 0x8d, - 0x6f, 0x51, 0x61, 0xf0, 0x73, 0xd9, 0x06, 0x36, 0x86, 0x0a, 0x9a, 0xae, 0xe1, - 0x86, 0x29, 0xb0, 0x63, 0x30, 0xa8, 0xee, 0x30, 0x59, 0x1d, 0xeb, 0xfc, 0xef, - 0x56, 0xa0, 0x26, 0xbb, 0x28, 0xc3, 0xb0, 0x6e, 0xc2, 0xcf, 0xaf, 0x5b, 0x79, - 0xab, 0x72, 0x69, 0x4d, 0x1d, 0x01, 0x2a, 0x75, 0x94, 0xdd, 0x80, 0xae, 0x7d, - 0xfa, 0x0c, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x54, + 0x66, 0xb6, 0x1f, 0xc9, 0x33, 0xf6, 0x01, 0x00, 0x02, 0x1a, 0x3d, 0x36, 0xc0, + 0x0f, 0xea, 0x00, 0x00, 0x04, 0x65, 0x53, 0x6a, 0x53, 0x66, 0x66, 0x0d, 0x16, + 0xa7, 0xd1, 0x06, 0x00, 0x06, 0x6a, 0xac, 0x00, 0x53, 0x52, 0xac, 0x00, 0x00, + 0x00, ], txid: [ - 0xa3, 0xcb, 0xad, 0xd7, 0xa5, 0x8d, 0x80, 0xa4, 0xc2, 0xf6, 0x18, 0x09, 0xc2, - 0x4a, 0x2f, 0x08, 0x6c, 0x58, 0xce, 0xec, 0xaf, 0x7a, 0xf9, 0x41, 0x4c, 0x38, - 0xbd, 0xbd, 0xc4, 0xe4, 0x6e, 0x98, + 0x48, 0x5e, 0xed, 0x11, 0x3a, 0xc8, 0x9a, 0x13, 0x1f, 0xcc, 0x81, 0xb2, 0x4a, + 0xc0, 0x2b, 0xad, 0xe4, 0xbe, 0x7d, 0x69, 0x0a, 0x93, 0x39, 0xe3, 0xa9, 0x81, + 0x38, 0xc7, 0x1d, 0xdb, 0xfb, 0x73, ], auth_digest: [ - 0xad, 0x64, 0x58, 0x0e, 0xd3, 0xa2, 0x8a, 0x3b, 0xa4, 0x1e, 0x2d, 0x32, 0x0b, - 0x5f, 0xf2, 0xa0, 0x7f, 0xa1, 0x9d, 0xb0, 0x74, 0xaf, 0xc4, 0x55, 0xe9, 0x2e, - 0x0f, 0x32, 0x6b, 0xe0, 0x8a, 0x6a, + 0x0a, 0x5a, 0x5c, 0x39, 0xc7, 0x2f, 0x6c, 0xda, 0xb1, 0x7c, 0x5a, 0x43, 0xf2, + 0xe5, 0xb0, 0xee, 0x82, 0xd9, 0xe0, 0xfb, 0xc0, 0x29, 0x4f, 0x30, 0x86, 0x8e, + 0x55, 0xa1, 0xdf, 0xc0, 0x33, 0x0f, ], amounts: vec![], script_pubkeys: vec![], transparent_input: None, sighash_shielded: [ - 0xa3, 0xcb, 0xad, 0xd7, 0xa5, 0x8d, 0x80, 0xa4, 0xc2, 0xf6, 0x18, 0x09, 0xc2, - 0x4a, 0x2f, 0x08, 0x6c, 0x58, 0xce, 0xec, 0xaf, 0x7a, 0xf9, 0x41, 0x4c, 0x38, - 0xbd, 0xbd, 0xc4, 0xe4, 0x6e, 0x98, + 0x48, 0x5e, 0xed, 0x11, 0x3a, 0xc8, 0x9a, 0x13, 0x1f, 0xcc, 0x81, 0xb2, 0x4a, + 0xc0, 0x2b, 0xad, 0xe4, 0xbe, 0x7d, 0x69, 0x0a, 0x93, 0x39, 0xe3, 0xa9, 0x81, + 0x38, 0xc7, 0x1d, 0xdb, 0xfb, 0x73, ], sighash_all: None, sighash_none: None, @@ -6133,30 +6052,153 @@ pub mod zip_0244 { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0xc2, - 0xeb, 0x51, 0x8f, 0x68, 0x98, 0x4d, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x06, 0x04, 0x68, 0x98, 0x4d, 0x02, 0x00, 0xff, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x28, + 0xd5, 0xc8, 0xaf, 0xb0, 0x66, 0x87, 0x08, 0x00, 0x01, 0x8c, 0x3f, 0x57, 0x9a, + 0x71, 0x05, 0x03, 0x00, 0x08, 0x00, 0x65, 0x6a, 0x65, 0x00, 0x63, 0x51, 0x53, + 0x01, 0x93, 0xab, 0x48, 0xeb, 0x3f, 0xcf, 0xb8, 0x77, 0x81, 0x6d, 0xcc, 0x86, + 0x1a, 0x40, 0x01, 0x3b, 0x71, 0xb8, 0x3f, 0x36, 0x50, 0xe6, 0xd8, 0xad, 0x58, + 0xa2, 0x3b, 0x42, 0x0e, 0x01, 0xbe, 0x01, 0x68, 0x06, 0x14, 0xe8, 0x35, 0x62, + 0xf8, 0x2d, 0xfd, 0x40, 0x5b, 0x54, 0xa4, 0x5e, 0xb3, 0x2c, 0x16, 0x54, 0x48, + 0xd4, 0xd5, 0xd6, 0x1c, 0xa2, 0x85, 0x95, 0x85, 0x36, 0x9f, 0x53, 0xf1, 0xa1, + 0x25, 0x97, 0xb4, 0xb6, 0x5b, 0x9e, 0xc1, 0xc7, 0xa8, 0xbb, 0xfd, 0x05, 0x2c, + 0xbf, 0x7e, 0x1c, 0x17, 0x85, 0x31, 0x49, 0x34, 0xb2, 0x62, 0xd5, 0x85, 0x37, + 0x54, 0xf1, 0xf1, 0x77, 0x71, 0xcf, 0x00, 0x37, 0x40, 0x58, 0x1f, 0xee, 0x3a, + 0x02, 0x00, 0x04, 0x97, 0x94, 0x89, 0x17, 0x2b, 0x3e, 0xf8, 0x19, 0x4a, 0x79, + 0x8d, 0xf5, 0x72, 0x4d, 0x6b, 0x05, 0xf1, 0xae, 0x00, 0x00, 0x13, 0xa0, 0x8d, + 0x61, 0x2b, 0xca, 0x8a, 0x8c, 0x31, 0x44, 0x3c, 0xb7, 0x50, 0x30, 0x72, 0x65, + 0x57, 0x53, 0xfa, 0x3f, 0x54, 0xec, 0xc5, 0x87, 0xe9, 0xf8, 0x3b, 0x58, 0x19, + 0x16, 0x09, 0x2d, 0xf2, 0x6e, 0x63, 0xe1, 0x89, 0x94, 0xcb, 0x0d, 0xb9, 0x1a, + 0x0b, 0xbd, 0xc7, 0xb6, 0x11, 0x9b, 0x32, 0x22, 0x2a, 0xdf, 0x5e, 0x61, 0xd8, + 0xd8, 0xae, 0x89, 0xda, 0xe4, 0x95, 0x4b, 0x54, 0x81, 0x3b, 0xb3, 0x3f, 0x08, + 0xd5, 0x62, 0xba, 0x51, 0x3f, 0xee, 0x1b, 0x09, 0xc0, 0xfc, 0xd5, 0x16, 0x05, + 0x54, 0x19, 0x47, 0x4d, 0xd7, 0xfd, 0xa0, 0x38, 0xa8, 0x9c, 0x84, 0xea, 0x7b, + 0x94, 0x68, 0x28, 0x7f, 0x0e, 0xb0, 0xc1, 0x0c, 0x4b, 0x13, 0x25, 0x20, 0x19, + 0x4d, 0x3d, 0x8d, 0x53, 0x51, 0xfc, 0x10, 0xd0, 0x9c, 0x15, 0xc8, 0xcc, 0x10, + 0x1a, 0xa1, 0x66, 0x3b, 0xbf, 0x17, 0xb8, 0x41, 0x11, 0xf3, 0x8b, 0xb4, 0x39, + 0xf0, 0x73, 0x53, 0xbd, 0xea, 0x35, 0x96, 0xd1, 0x5e, 0x71, 0x3e, 0x1e, 0x2e, + 0x7d, 0x3f, 0x1c, 0x38, 0x31, 0x35, 0xb4, 0x7f, 0xa7, 0xf8, 0x1f, 0x46, 0xdf, + 0x7a, 0x90, 0x2a, 0x40, 0x46, 0x99, 0xec, 0x91, 0x2f, 0x56, 0x56, 0xc3, 0x5b, + 0x85, 0x76, 0x3e, 0x4d, 0xe5, 0x83, 0xae, 0xca, 0xa1, 0xdf, 0xd5, 0xd2, 0x67, + 0x7d, 0x9c, 0x8f, 0xfe, 0xe8, 0x77, 0xf6, 0x3f, 0x40, 0xa5, 0xca, 0x0d, 0x67, + 0xf6, 0xe5, 0x54, 0x12, 0x47, 0x2a, 0x03, 0x68, 0xf7, 0xd6, 0xce, 0x33, 0xf5, + 0x52, 0xaa, 0xbf, 0x7c, 0xe1, 0xac, 0x55, 0x24, 0x29, 0x98, 0xc5, 0xc1, 0x22, + 0x75, 0xf1, 0xe7, 0xb4, 0xbb, 0x4a, 0xcc, 0x68, 0x77, 0x6f, 0x17, 0x4d, 0x28, + 0x56, 0x09, 0x81, 0xca, 0xe4, 0xca, 0x7d, 0x5b, 0x9f, 0x6e, 0x4c, 0x07, 0x86, + 0xac, 0x55, 0x82, 0x29, 0xe8, 0xf3, 0x58, 0x20, 0x19, 0x55, 0xdc, 0x6b, 0xd1, + 0x8d, 0xe8, 0x9f, 0x03, 0x61, 0xf6, 0x69, 0x6f, 0x23, 0xdb, 0xeb, 0xe4, 0x64, + 0x3c, 0xd3, 0xbe, 0xa9, 0xa0, 0xd2, 0xd7, 0xe2, 0x61, 0xe9, 0xa3, 0x57, 0x2a, + 0x80, 0xa7, 0x19, 0x90, 0x31, 0x3b, 0x69, 0x66, 0x29, 0x99, 0xf0, 0xac, 0x3e, + 0xe2, 0x88, 0x85, 0xd4, 0x12, 0x14, 0x47, 0x3b, 0x87, 0x94, 0x6a, 0x56, 0xc9, + 0x0b, 0x94, 0xff, 0x34, 0x91, 0xf3, 0xd5, 0xc7, 0x5b, 0xf4, 0x96, 0x5b, 0x17, + 0x11, 0xac, 0x09, 0x01, 0x28, 0x7e, 0x48, 0x46, 0x56, 0x56, 0xb2, 0xa7, 0x28, + 0xaf, 0xb9, 0x7d, 0x48, 0xaf, 0x39, 0xbb, 0x0d, 0xd3, 0x36, 0x1b, 0x49, 0x98, + 0x33, 0x26, 0x50, 0x45, 0xb5, 0x58, 0xbf, 0x22, 0x33, 0x0c, 0x04, 0x68, 0xf9, + 0x42, 0x2f, 0xdc, 0x8d, 0x21, 0xdd, 0x4c, 0x4b, 0xd0, 0x76, 0x17, 0x0d, 0x2d, + 0x48, 0xa5, 0xe5, 0x26, 0x70, 0x43, 0x6a, 0xaa, 0x77, 0x6e, 0xd2, 0x48, 0x2a, + 0xd7, 0x03, 0x03, 0xce, 0xbc, 0xbd, 0x05, 0x79, 0xd4, 0x04, 0x97, 0xfb, 0x07, + 0x03, 0x78, 0x57, 0x6d, 0xca, 0xba, 0x00, 0x8c, 0x17, 0x99, 0x68, 0xa7, 0xc4, + 0x86, 0x3f, 0xe0, 0x2c, 0x24, 0xa2, 0x91, 0x5b, 0x9a, 0x71, 0xdf, 0xcf, 0xd5, + 0xa0, 0x4b, 0x66, 0x7f, 0xba, 0xf3, 0xd4, 0xb3, 0xb9, 0x08, 0xb9, 0x82, 0x88, + 0x20, 0xdf, 0xec, 0xdd, 0x75, 0x37, 0x50, 0xb5, 0xf9, 0xd2, 0x21, 0x6e, 0x56, + 0xc6, 0x15, 0x11, 0x74, 0x7e, 0x86, 0x50, 0x86, 0x69, 0xe1, 0x00, 0xa3, 0xa7, + 0xb0, 0x9d, 0xb0, 0x39, 0x9d, 0xf3, 0x78, 0xf6, 0xdf, 0x53, 0x1b, 0xca, 0x4f, + 0xc5, 0x5a, 0x45, 0xe3, 0xc7, 0x56, 0x72, 0x08, 0x88, 0x05, 0x02, 0x5d, 0x27, + 0xf3, 0xc1, 0x77, 0x46, 0xba, 0xe1, 0x16, 0xc1, 0x5d, 0x9f, 0x47, 0x1f, 0x0f, + 0x62, 0x88, 0xa1, 0x50, 0x64, 0x7b, 0x2a, 0xfe, 0x9d, 0xf7, 0xcc, 0xcf, 0x01, + 0xf5, 0xcd, 0xe5, 0xf0, 0x46, 0x80, 0xbb, 0xfe, 0xd8, 0x7f, 0x6c, 0xf4, 0x29, + 0xfb, 0x27, 0xad, 0x6b, 0xab, 0xe7, 0x91, 0x76, 0x66, 0x11, 0xcf, 0x5b, 0xc2, + 0x0e, 0x48, 0xbe, 0xf1, 0x19, 0x25, 0x9b, 0x9b, 0x8a, 0x0e, 0x39, 0xc3, 0xdf, + 0x28, 0xcb, 0x95, 0x82, 0xea, 0x33, 0x86, 0x01, 0xcd, 0xc4, 0x81, 0xb3, 0x2f, + 0xb8, 0x2a, 0xde, 0xeb, 0xb3, 0xda, 0xde, 0x25, 0xd1, 0xa3, 0xdf, 0x20, 0xc3, + 0x7e, 0x71, 0x25, 0x06, 0xb5, 0xd9, 0x96, 0xc4, 0x9a, 0x9f, 0x0f, 0x30, 0xdd, + 0xcb, 0x91, 0xfe, 0x90, 0x04, 0xe1, 0xe8, 0x32, 0x94, 0xa6, 0xc9, 0x20, 0x3d, + 0x94, 0xe8, 0xdc, 0x2c, 0xbb, 0x44, 0x9d, 0xe4, 0x15, 0x50, 0x32, 0x60, 0x4e, + 0x47, 0x99, 0x70, 0x16, 0xb3, 0x04, 0xfd, 0x43, 0x7d, 0x82, 0x35, 0x04, 0x5e, + 0x25, 0x5a, 0x19, 0xb7, 0x43, 0xa0, 0xa9, 0xf2, 0xe3, 0x36, 0xb4, 0x4c, 0xae, + 0x30, 0x7b, 0xb3, 0x98, 0x7b, 0xd3, 0xe4, 0xe7, 0x77, 0xfb, 0xb3, 0x4c, 0x0a, + 0xb8, 0xcc, 0x3d, 0x67, 0x46, 0x6c, 0x0a, 0x88, 0xdd, 0x4c, 0xca, 0xd1, 0x8a, + 0x07, 0xa8, 0xd1, 0x06, 0x8d, 0xf5, 0xb6, 0x29, 0xe5, 0x71, 0x8d, 0x0f, 0x6d, + 0xf5, 0xc9, 0x57, 0xcf, 0x71, 0xbb, 0x00, 0xa5, 0x17, 0x8f, 0x17, 0x5c, 0xac, + 0xa9, 0x44, 0xe6, 0x35, 0xc5, 0x15, 0x9f, 0x73, 0x8e, 0x24, 0x02, 0xa2, 0xd2, + 0x1a, 0xa0, 0x81, 0xe1, 0x0e, 0x45, 0x6a, 0xfb, 0x00, 0xb9, 0xf6, 0x24, 0x16, + 0xc8, 0xb9, 0xc0, 0xf7, 0x22, 0x8f, 0x51, 0x07, 0x29, 0xe0, 0xbe, 0x3f, 0x30, + 0x53, 0x13, 0xd7, 0x7f, 0x73, 0x79, 0xdc, 0x2a, 0xf2, 0x48, 0x69, 0xc6, 0xc7, + 0x4e, 0xe4, 0x47, 0x14, 0x98, 0x86, 0x1d, 0x19, 0x2f, 0x0f, 0xf0, 0xf5, 0x08, + 0x28, 0x5d, 0xab, 0x6b, 0x6a, 0x36, 0xcc, 0xf7, 0xd1, 0x22, 0x56, 0xcc, 0x76, + 0xb9, 0x55, 0x03, 0x72, 0x0a, 0xc6, 0x72, 0xd0, 0x82, 0x68, 0xd2, 0xcf, 0x77, + 0x73, 0xb6, 0xba, 0x2a, 0x5f, 0x66, 0x48, 0x47, 0xbf, 0x70, 0x7f, 0x2f, 0xc1, + 0x0c, 0x98, 0xf2, 0xf0, 0x06, 0xec, 0x22, 0xcc, 0xb5, 0xa8, 0xc8, 0xb7, 0xc4, + 0x0c, 0x7c, 0x2d, 0x49, 0xa6, 0x63, 0x9b, 0x9f, 0x2c, 0xe3, 0x3c, 0x25, 0xc0, + 0x4b, 0xc4, 0x61, 0xe7, 0x44, 0xdf, 0xa5, 0x36, 0xb0, 0x0d, 0x94, 0xba, 0xdd, + 0xf4, 0xf4, 0xd1, 0x40, 0x44, 0xc6, 0x95, 0xa3, 0x38, 0x81, 0x47, 0x7d, 0xf1, + 0x24, 0xf0, 0xfc, 0xf2, 0x06, 0xa9, 0xfb, 0x2e, 0x65, 0xe3, 0x04, 0xcd, 0xbf, + 0x0c, 0x4d, 0x23, 0x90, 0x17, 0x0c, 0x13, 0x0a, 0xb8, 0x49, 0xc2, 0xf2, 0x2b, + 0x5c, 0xdd, 0x39, 0x21, 0x64, 0x0c, 0x8c, 0xf1, 0x97, 0x6a, 0xe1, 0x01, 0x0b, + 0x0d, 0xfd, 0x9c, 0xb2, 0x54, 0x3e, 0x45, 0xf9, 0x97, 0x49, 0xcc, 0x4d, 0x61, + 0xf2, 0xe8, 0xaa, 0xbf, 0xe9, 0x8b, 0xd9, 0x05, 0xfa, 0x39, 0x95, 0x1b, 0x33, + 0xea, 0x76, 0x9c, 0x45, 0xab, 0x95, 0x31, 0xc5, 0x72, 0x09, 0x86, 0x2a, 0xd1, + 0x2f, 0xd7, 0x6b, 0xa4, 0x80, 0x7e, 0x65, 0x41, 0x7b, 0x6c, 0xd1, 0x2f, 0xa8, + 0xec, 0x91, 0x6f, 0x01, 0x3e, 0xbb, 0x87, 0x06, 0xa9, 0x6e, 0xff, 0xed, 0xa0, + 0x6c, 0x4b, 0xe2, 0x4b, 0x04, 0x84, 0x63, 0x92, 0xe9, 0xd1, 0xe6, 0x93, 0x0e, + 0xae, 0x01, 0xfa, 0x21, 0xfb, 0xd7, 0x00, 0x58, 0x3f, 0xb5, 0x98, 0xb9, 0x2c, + 0x8f, 0x4e, 0xb8, 0xa6, 0x1a, 0xa6, 0x23, 0x5d, 0xb6, 0x0f, 0x28, 0x41, 0xcf, + 0x3a, 0x1c, 0x6a, 0xb5, 0x4c, 0x67, 0x06, 0x68, 0x44, 0x71, 0x1d, 0x09, 0x1e, + 0xb9, 0x31, 0xa1, 0xbd, 0x62, 0x81, 0xae, 0xdf, 0x2a, 0x0e, 0x8f, 0xab, 0x18, + 0x81, 0x72, 0x02, 0xa9, 0xbe, 0x06, 0x40, 0x2e, 0xd9, 0xcc, 0x72, 0x0c, 0x16, + 0xbf, 0xe8, 0x81, 0xe4, 0xdf, 0x42, 0x55, 0xe8, 0x7a, 0xfb, 0x7f, 0xc6, 0x2f, + 0x38, 0x11, 0x6b, 0xbe, 0x03, 0xcd, 0x8a, 0x3c, 0xb1, 0x1a, 0x27, 0xd5, 0x68, + 0x41, 0x47, 0x82, 0xf4, 0x7b, 0x1a, 0x44, 0xc9, 0x7c, 0x68, 0x04, 0x67, 0x69, + 0x4b, 0xc9, 0x70, 0x9d, 0x32, 0x91, 0x6c, 0x97, 0xe8, 0x00, 0x6c, 0xbb, 0x07, + 0xba, 0x0e, 0x41, 0x80, 0xa3, 0x73, 0x80, 0x38, 0xc3, 0x74, 0xc4, 0xcc, 0xe8, + 0xf3, 0x29, 0x59, 0xaf, 0xb2, 0x5f, 0x30, 0x3f, 0x58, 0x15, 0xc4, 0x53, 0x31, + 0x24, 0xac, 0xf9, 0xd1, 0x89, 0x40, 0xe7, 0x75, 0x22, 0xac, 0x5d, 0xc4, 0xb9, + 0x57, 0x0a, 0xae, 0x8f, 0x47, 0xb7, 0xf5, 0x7f, 0xd8, 0x76, 0x7b, 0xea, 0x1a, + 0x24, 0xae, 0x7b, 0xed, 0x65, 0xb4, 0xaf, 0xdc, 0x8f, 0x12, 0x78, 0xc3, 0x0e, + 0x2d, 0xb9, 0x8f, 0xd1, 0x72, 0x73, 0x0a, 0xc6, 0xbb, 0xed, 0x4f, 0x11, 0x27, + 0xcd, 0x32, 0xb0, 0x4a, 0x95, 0xb2, 0x05, 0x52, 0x6c, 0xfc, 0xb4, 0x01, 0xc4, + 0xd8, 0x1d, 0xba, 0x04, 0xa7, 0x02, 0x00, 0xfd, 0x6a, 0xcc, 0x0f, 0x22, 0x97, + 0x89, 0x16, 0x07, 0x22, 0xd1, 0x8a, 0x51, 0xab, 0xff, 0x33, 0x35, 0xf4, 0x3a, + 0x37, 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, 0x60, 0x52, 0x23, 0xd5, 0x3a, + 0x9a, 0xe0, 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, 0x3f, 0x7f, 0xac, 0x36, 0xc0, + 0x09, 0xa5, 0x6d, 0x4d, 0x95, 0xd1, 0xe8, 0x1d, 0x3b, 0x3e, 0xbc, 0xa7, 0xe5, + 0x4c, 0xc1, 0xa1, 0x2d, 0x12, 0x7b, 0x57, 0xc8, 0x13, 0x89, 0x76, 0xe7, 0x91, + 0x01, 0x3b, 0x01, 0x5f, 0x06, 0xa6, 0x24, 0xf5, 0x21, 0xb6, 0xee, 0x04, 0xec, + 0x98, 0x08, 0x93, 0xc7, 0xe5, 0xe0, 0x1a, 0x33, 0x62, 0x03, 0x59, 0x40, 0x94, + 0xf8, 0x28, 0x33, 0xd7, 0x44, 0x5f, 0xe2, 0xd0, 0x91, 0x30, 0xf6, 0x35, 0x11, + 0xda, 0x54, 0x83, 0x2d, 0xe9, 0x13, 0x6b, 0x39, 0xf4, 0x59, 0x9f, 0x5a, 0xa5, + 0xdf, 0xbb, 0x45, 0xda, 0x60, 0xcd, 0xce, 0xab, 0x7e, 0xef, 0xde, 0x89, 0xbe, + 0x63, 0xf3, 0xf7, 0xc0, 0xd2, 0x32, 0x48, 0x47, 0xcc, 0xe1, 0x40, 0x5d, 0xef, + 0x7c, 0x46, 0x9b, 0x0e, 0x27, 0x24, 0x94, 0xe5, 0xdf, 0x54, 0xf5, 0x68, 0x65, + 0x6c, 0xb9, 0xc8, 0x81, 0x8d, 0x92, 0xb7, 0x2b, 0x8b, 0xc3, 0x4d, 0xb7, 0xbb, + 0x31, 0x12, 0x48, 0x7e, 0x74, 0x6e, 0xef, 0xe4, 0xe8, 0x08, 0xbb, 0xb2, 0xc8, + 0x01, 0x67, 0x26, 0x4a, 0x28, 0x35, 0x95, 0xd8, 0x26, 0x29, 0xa5, 0x4d, 0x1b, + 0x5f, 0x57, 0x5e, 0x3e, 0x35, 0x60, 0x70, 0x2e, 0x4e, 0x0a, 0x11, 0x4a, 0xc7, + 0x17, 0xa7, 0xc5, 0x7f, 0x37, 0x80, 0xb3, 0x2f, 0xb1, 0xa6, 0xbe, 0x8d, 0x35, + 0x3f, 0xb6, 0x04, 0xcf, 0x5d, 0xc4, 0x94, 0xfb, 0xe7, 0x3d, 0xb2, 0x5e, 0x3d, + 0xba, 0xf7, 0xae, 0xd5, 0x04, 0xde, 0x93, 0x2a, 0xcb, 0x99, 0x17, 0xc2, 0x9b, + 0xe8, 0x2d, 0x7b, 0xcf, 0xbf, 0xc3, 0xf5, 0xef, 0xd9, 0xb8, 0x98, 0x8a, 0x53, + 0x93, 0xc4, 0xde, 0xda, 0xe6, 0xde, 0x88, 0x42, 0xc3, 0xc6, 0xe2, 0x97, 0x94, + 0xda, 0xc2, 0xee, 0x25, 0x32, 0xe8, 0x20, 0x9a, 0xa4, 0x89, 0x4c, 0xc6, 0xd7, + 0x28, 0x3c, 0xc0, 0x39, 0x5a, 0xc0, 0x35, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, + 0x50, 0x72, 0x6d, 0x21, 0x0a, 0x2c, 0x68, 0x83, 0x42, 0x25, ], txid: [ - 0x28, 0xd1, 0x6c, 0x3c, 0xd7, 0x8a, 0x6b, 0x7a, 0x50, 0xb1, 0x1a, 0x1b, 0x84, - 0x17, 0x76, 0x4c, 0x4e, 0x63, 0xc6, 0xe3, 0xd8, 0xaa, 0x28, 0x9f, 0x7e, 0x87, - 0xe3, 0x98, 0x45, 0x87, 0x27, 0x64, + 0x48, 0x9c, 0xea, 0x9c, 0x06, 0x30, 0x4d, 0x7d, 0x54, 0x8f, 0x7b, 0xc5, 0xb5, + 0x2e, 0x1d, 0x83, 0x31, 0x5b, 0x8f, 0x9f, 0x60, 0x98, 0x54, 0xd6, 0x11, 0xc9, + 0x0b, 0xba, 0x24, 0x45, 0xd1, 0xc7, ], auth_digest: [ - 0x33, 0x21, 0x55, 0xb1, 0xcc, 0x23, 0xa2, 0x57, 0x1e, 0x86, 0xe4, 0x9e, 0x06, - 0x01, 0x0c, 0xd2, 0x53, 0x21, 0xdc, 0xfc, 0xca, 0x34, 0xae, 0x14, 0xe8, 0xb3, - 0xf4, 0xf0, 0x02, 0x70, 0xd2, 0x87, + 0x81, 0xc7, 0x82, 0x3f, 0x53, 0xe9, 0x2d, 0xaf, 0x14, 0xd5, 0x01, 0xc2, 0xd6, + 0xd8, 0x37, 0x27, 0x5d, 0xef, 0xd0, 0x6b, 0x98, 0x2b, 0x43, 0xc0, 0x70, 0x7f, + 0xc6, 0x31, 0x08, 0xa5, 0xb3, 0x62, ], amounts: vec![], script_pubkeys: vec![], transparent_input: None, sighash_shielded: [ - 0x28, 0xd1, 0x6c, 0x3c, 0xd7, 0x8a, 0x6b, 0x7a, 0x50, 0xb1, 0x1a, 0x1b, 0x84, - 0x17, 0x76, 0x4c, 0x4e, 0x63, 0xc6, 0xe3, 0xd8, 0xaa, 0x28, 0x9f, 0x7e, 0x87, - 0xe3, 0x98, 0x45, 0x87, 0x27, 0x64, + 0x48, 0x9c, 0xea, 0x9c, 0x06, 0x30, 0x4d, 0x7d, 0x54, 0x8f, 0x7b, 0xc5, 0xb5, + 0x2e, 0x1d, 0x83, 0x31, 0x5b, 0x8f, 0x9f, 0x60, 0x98, 0x54, 0xd6, 0x11, 0xc9, + 0x0b, 0xba, 0x24, 0x45, 0xd1, 0xc7, ], sighash_all: None, sighash_none: None, @@ -6167,31 +6209,61 @@ pub mod zip_0244 { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x5e, - 0x3d, 0xba, 0xf7, 0xae, 0x12, 0x67, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0xff, 0xff, 0xff, 0x06, 0x04, 0xae, 0x12, 0x67, 0x0d, 0x00, 0xff, - 0xff, 0xff, 0xff, 0x01, 0x51, 0x6c, 0xf4, 0xad, 0xec, 0x75, 0x07, 0x00, 0x03, - 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x40, + 0x63, 0x5e, 0x9c, 0xc1, 0x4a, 0xfe, 0x10, 0x00, 0x00, 0x01, 0xca, 0x62, 0xb0, + 0x5f, 0x04, 0xc5, 0xf7, 0x30, 0x3e, 0x42, 0x70, 0x1d, 0x75, 0xff, 0x12, 0x18, + 0x58, 0x57, 0x46, 0x1d, 0xe4, 0xd1, 0x7e, 0x46, 0xe3, 0x33, 0x6d, 0x55, 0x44, + 0xa8, 0xbc, 0x10, 0x7c, 0xef, 0x93, 0xc6, 0x79, 0x2d, 0x01, 0xdf, 0x05, 0xe6, + 0xd5, 0x80, 0xf4, 0xd5, 0xd4, 0x8d, 0xf0, 0x42, 0x45, 0x1a, 0x33, 0x59, 0x0d, + 0x3e, 0x8c, 0xf4, 0x9b, 0x26, 0x27, 0x21, 0x8f, 0x0c, 0x29, 0x2f, 0xa6, 0x6a, + 0xda, 0x94, 0x5f, 0xa5, 0x5b, 0xb2, 0x35, 0x48, 0xe3, 0x3a, 0x83, 0xa5, 0x62, + 0x95, 0x7a, 0x31, 0x49, 0xa9, 0x93, 0xcc, 0x47, 0x23, 0x62, 0x29, 0x87, 0x36, + 0xa8, 0xb7, 0x00, 0x60, 0x95, 0x4e, 0x8c, 0x03, 0x40, 0x01, 0x00, 0x10, 0x26, + 0x21, 0xa9, 0xc9, 0xac, 0xcb, 0x78, 0x2e, 0x9e, 0x4a, 0x5f, 0xa8, 0x7f, 0x0a, + 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, 0x60, 0x28, 0x5c, 0x22, 0x62, 0x7c, 0x59, + 0x48, 0x3a, 0x5a, 0x4c, 0x78, 0xd9, 0x7c, 0xe4, 0x23, 0x01, 0x3d, 0x64, 0xb3, + 0x2c, 0xd1, 0x72, 0xef, 0xa5, 0x51, 0xbf, 0x7f, 0x36, 0x8f, 0x04, 0xbd, 0xae, + 0xc6, 0x09, 0x1a, 0x30, 0x04, 0xa7, 0x57, 0x59, 0x8b, 0x80, 0x1d, 0xcf, 0x67, + 0x5c, 0xb8, 0x3e, 0x43, 0xa5, 0x3a, 0xe8, 0xb2, 0x54, 0xd3, 0x33, 0xbc, 0xda, + 0x20, 0xd4, 0x81, 0x7d, 0x34, 0x77, 0xab, 0xfb, 0xa2, 0x5b, 0xb8, 0x3d, 0xf5, + 0x94, 0x9c, 0x12, 0x6f, 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, 0x91, + 0x20, 0xf4, 0xd4, 0x1e, 0x62, 0x91, 0x85, 0x00, 0x2c, 0x72, 0xc0, 0x12, 0xc4, + 0x14, 0xd2, 0x38, 0x2a, 0x6d, 0x47, 0xc7, 0xb3, 0xde, 0xab, 0xa7, 0x70, 0xc4, + 0x00, 0xca, 0x96, 0xb2, 0x81, 0x4f, 0x6b, 0x26, 0xc3, 0xef, 0x17, 0x42, 0x9f, + 0x1a, 0x98, 0xc8, 0x5d, 0x83, 0xdb, 0x20, 0xef, 0xad, 0x48, 0xbe, 0x89, 0x96, + 0xfb, 0x1b, 0xff, 0x59, 0x1e, 0xff, 0xf3, 0x60, 0xfe, 0x11, 0x99, 0x05, 0x6c, + 0x56, 0xe5, 0xfe, 0xec, 0x61, 0xa7, 0xb8, 0xb9, 0xf6, 0x99, 0xd6, 0x01, 0x2c, + 0x28, 0x49, 0x23, 0x2f, 0x32, 0x9f, 0xef, 0x95, 0xc7, 0xaf, 0x37, 0x00, 0x98, + 0xff, 0xe4, 0x91, 0x8e, 0x0c, 0xa1, 0xdf, 0x47, 0xf2, 0x75, 0x86, 0x7b, 0x73, + 0x9e, 0x0a, 0x51, 0x4d, 0x32, 0x09, 0x32, 0x5e, 0x21, 0x70, 0x45, 0x92, 0x7b, + 0x47, 0x9f, 0xfa, 0xc9, 0xff, 0x29, 0xbc, 0x74, 0x39, 0xda, 0xd9, 0xcd, 0xc9, + 0x55, 0xab, 0xd2, 0xad, 0x25, 0xe8, 0xda, 0x1a, 0x6a, 0x6d, 0x2e, 0xa9, 0x96, + 0x03, 0x20, 0x50, 0xb5, 0xe8, 0x04, 0x5c, 0x54, 0x91, 0xff, 0x16, 0xbe, 0x20, + 0xa0, 0x63, 0x48, 0xce, 0x02, 0x9a, 0x5f, 0xdd, 0x3f, 0xc7, 0x11, 0x69, 0x87, + 0x23, 0xde, 0xec, 0xd2, 0xdc, 0xee, 0x36, 0x0b, 0x43, 0xbc, 0x83, 0x3b, 0x00, + 0x02, 0x6b, 0x72, 0xd5, 0x3d, 0x57, 0x0b, 0x7e, 0xa9, 0x4c, 0x67, 0x1b, 0x51, + 0xe5, 0x61, 0x2b, 0x4b, 0xc4, 0xa7, 0x57, 0xd3, 0x25, 0x93, 0xe5, 0x49, 0xb9, + 0x49, 0x2e, 0xfa, 0x28, 0x80, 0xd6, 0x5a, 0x9a, 0x62, 0x4f, 0xda, 0xf5, 0x56, + 0x07, 0xd8, 0x1a, 0xf5, 0x91, 0xb3, 0xcd, 0xa4, 0xa5, 0xce, 0xa3, 0xaa, 0x80, + 0x55, 0xa6, 0xc6, 0x14, 0x88, 0xb7, 0xf1, 0x66, 0x48, 0x1c, 0xa0, 0x04, 0x00, ], txid: [ - 0x6b, 0xf4, 0xef, 0xe7, 0x7a, 0xf6, 0x9b, 0x72, 0x19, 0x47, 0x5f, 0x60, 0xa0, - 0xf7, 0x92, 0xdb, 0x02, 0x63, 0xe4, 0xe1, 0x2f, 0xa1, 0xd9, 0xee, 0x1a, 0x1b, - 0x9a, 0x68, 0x54, 0x05, 0x90, 0xda, + 0xcc, 0x94, 0xf0, 0xc9, 0x2b, 0x25, 0x93, 0x51, 0xca, 0xa1, 0x04, 0x00, 0xd9, + 0x1c, 0xa9, 0x6f, 0x10, 0x41, 0x51, 0xfe, 0xdd, 0x22, 0xc2, 0x8d, 0xa7, 0xb8, + 0x4f, 0x4d, 0x2b, 0x4d, 0xe7, 0x83, ], auth_digest: [ - 0x99, 0x3b, 0xfc, 0xa6, 0x14, 0x99, 0x75, 0xa4, 0x01, 0x37, 0x97, 0xea, 0xd5, - 0x58, 0x39, 0xa1, 0x3a, 0x0f, 0xb1, 0x52, 0xf6, 0x83, 0x72, 0xbb, 0x0e, 0x0f, - 0xd9, 0x49, 0x94, 0x77, 0xf9, 0x03, + 0xf3, 0x16, 0xf0, 0xbb, 0x3f, 0xd8, 0x7d, 0x8e, 0x21, 0xb8, 0xd9, 0x4b, 0xbd, + 0x0d, 0x3d, 0xfd, 0xbf, 0xeb, 0xa5, 0x1b, 0xb5, 0x31, 0xfd, 0xd4, 0x4d, 0xa9, + 0x5d, 0x76, 0xca, 0xe4, 0xe9, 0x9b, ], amounts: vec![], script_pubkeys: vec![], transparent_input: None, sighash_shielded: [ - 0x6b, 0xf4, 0xef, 0xe7, 0x7a, 0xf6, 0x9b, 0x72, 0x19, 0x47, 0x5f, 0x60, 0xa0, - 0xf7, 0x92, 0xdb, 0x02, 0x63, 0xe4, 0xe1, 0x2f, 0xa1, 0xd9, 0xee, 0x1a, 0x1b, - 0x9a, 0x68, 0x54, 0x05, 0x90, 0xda, + 0xcc, 0x94, 0xf0, 0xc9, 0x2b, 0x25, 0x93, 0x51, 0xca, 0xa1, 0x04, 0x00, 0xd9, + 0x1c, 0xa9, 0x6f, 0x10, 0x41, 0x51, 0xfe, 0xdd, 0x22, 0xc2, 0x8d, 0xa7, 0xb8, + 0x4f, 0x4d, 0x2b, 0x4d, 0xe7, 0x83, ], sighash_all: None, sighash_none: None, @@ -6202,532 +6274,962 @@ pub mod zip_0244 { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0xff, - 0x6a, 0xcc, 0x0f, 0xfc, 0x2e, 0x49, 0x0d, 0x03, 0x14, 0x6b, 0x9d, 0x49, 0xdd, - 0x8c, 0x78, 0x35, 0xf4, 0x3a, 0x37, 0xdc, 0xa0, 0x78, 0x7e, 0x3e, 0xc9, 0xf6, - 0x60, 0x52, 0x23, 0xd5, 0xba, 0x7a, 0xe0, 0xab, 0x90, 0x25, 0xb7, 0x3b, 0xc0, - 0x3f, 0x7f, 0xac, 0x36, 0xc0, 0x09, 0x63, 0x63, 0x63, 0x63, 0x51, 0x00, 0x63, - 0x53, 0x65, 0xbc, 0xa7, 0xe5, 0x4c, 0xc1, 0xa1, 0x2d, 0x12, 0x7b, 0x57, 0xc8, - 0x13, 0x89, 0x76, 0xe7, 0x91, 0x01, 0x3b, 0x01, 0x5f, 0x06, 0xa6, 0x24, 0xf5, - 0x21, 0xb6, 0xee, 0x04, 0xec, 0x98, 0x08, 0x93, 0xc7, 0xe5, 0xe0, 0x1a, 0x33, - 0x62, 0x03, 0x59, 0x04, 0xac, 0x00, 0x00, 0x53, 0xd7, 0x44, 0x5f, 0xe2, 0xd0, - 0x91, 0x30, 0xf6, 0x35, 0x11, 0xda, 0x54, 0x83, 0x2d, 0xe9, 0x13, 0x6b, 0x39, - 0xf4, 0x59, 0x9f, 0x5a, 0xa5, 0xdf, 0xbb, 0x45, 0xda, 0x60, 0xcd, 0xce, 0xab, - 0x7e, 0xef, 0xde, 0x89, 0xbe, 0x63, 0xf3, 0xf7, 0xc0, 0x04, 0x52, 0x00, 0x6a, - 0xac, 0xe1, 0x40, 0x5d, 0xef, 0x02, 0x44, 0xfd, 0x7f, 0x99, 0xb6, 0x7d, 0x04, - 0x00, 0x04, 0x63, 0x00, 0x63, 0xac, 0x12, 0xf6, 0x46, 0x50, 0x73, 0xe1, 0x02, - 0x00, 0x09, 0x63, 0x6a, 0x53, 0x51, 0x52, 0x00, 0x65, 0xac, 0x65, 0x00, 0x00, - 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x0e, + 0x32, 0x23, 0xde, 0x32, 0xad, 0x21, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xda, + 0xb5, 0xec, 0x1b, 0x05, 0x1c, 0x04, 0x00, 0x06, 0xf1, 0xea, 0x6a, 0x6a, 0x98, + 0xa0, 0xca, 0x30, 0xe6, 0x97, 0x81, 0xc4, 0x9c, 0xd3, 0xba, 0x27, 0x71, 0x02, + 0xfa, 0xff, 0x08, 0xb3, 0xaf, 0xfd, 0xc4, 0x82, 0x8f, 0x91, 0x02, 0xc9, 0xd8, + 0xfd, 0xd3, 0x06, 0x37, 0x8f, 0x02, 0x07, 0xe3, 0x6d, 0xa1, 0xd7, 0xed, 0x5e, + 0x92, 0xcb, 0x4f, 0x90, 0xba, 0x83, 0xa9, 0xe4, 0x96, 0x01, 0x31, 0xf1, 0x6f, + 0xcb, 0xb6, 0xf5, 0xd4, 0x20, 0x7e, 0xb0, 0x98, 0xb2, 0xb1, 0xfa, 0x0b, 0xc9, + 0xa0, 0x4c, 0x06, 0x97, 0x44, 0x1a, 0xd5, 0xd7, 0x03, 0xff, 0x7b, 0x13, 0x22, + 0x9a, 0x09, 0x75, 0xaa, 0x50, 0x22, 0xe8, 0xeb, 0xf5, 0xe4, 0x5c, 0xa3, 0x43, + 0x53, 0x6d, 0xd9, 0x22, 0x0a, 0xb4, 0xf8, 0xe5, 0xc2, 0x5a, 0x94, 0x62, 0xeb, + 0xcb, 0xb0, 0xfd, 0x5f, 0x14, 0x55, 0x4b, 0xc9, 0x77, 0x07, 0x8e, 0xff, 0xba, + 0x57, 0x02, 0x68, 0x4d, 0x45, 0x28, 0xf8, 0xc2, 0xbc, 0xf3, 0xec, 0x5d, 0x3b, + 0x95, 0x47, 0x53, 0x64, 0x61, 0x50, 0xfa, 0x26, 0x2c, 0x56, 0x17, 0x33, 0xf8, + 0x2e, 0x84, 0x29, 0xd6, 0xf1, 0x2f, 0x24, 0xfd, 0x36, 0x44, 0x96, 0xb3, 0xbe, + 0x08, 0x71, 0xca, 0x3d, 0xd9, 0x62, 0x53, 0x48, 0xa6, 0x14, 0xb5, 0x9b, 0xde, + 0x45, 0x88, 0x56, 0x49, 0xba, 0xe3, 0x6d, 0xe3, 0x4d, 0xef, 0x8f, 0xce, 0xc8, + 0x53, 0x43, 0x47, 0x5d, 0x97, 0x6a, 0xe1, 0xe9, 0xb2, 0x78, 0x29, 0xce, 0x2a, + 0xc5, 0xef, 0xd0, 0xb3, 0x99, 0xa8, 0xb4, 0x48, 0xbe, 0x65, 0x04, 0x29, 0x4e, + 0xe6, 0xb3, 0xc1, 0xc6, 0xa5, 0x34, 0x2d, 0x7c, 0x01, 0xae, 0x9d, 0x8a, 0xd3, + 0x07, 0x0c, 0x2b, 0x1a, 0x91, 0x57, 0x3a, 0xf5, 0xe0, 0xc5, 0xe4, 0xcb, 0xbf, + 0x4a, 0xcd, 0xc6, 0xb5, 0x4c, 0x92, 0x72, 0x20, 0x0d, 0x99, 0x70, 0x25, 0x0c, + 0x17, 0xc1, 0x03, 0x6f, 0x06, 0x08, 0x5c, 0x41, 0x85, 0x8e, 0xd3, 0xa0, 0xc4, + 0x81, 0x50, 0xbc, 0x69, 0x7e, 0x4a, 0x69, 0x5f, 0xef, 0x33, 0x5f, 0x7a, 0xd0, + 0x7e, 0x1a, 0x46, 0xdc, 0x76, 0x7f, 0xf8, 0x22, 0xdb, 0x70, 0xe6, 0x66, 0x90, + 0x80, 0xb9, 0x81, 0x6b, 0x22, 0x32, 0xc8, 0x1a, 0x4c, 0x66, 0xcc, 0x58, 0x6a, + 0xbf, 0xe1, 0xea, 0xa8, 0xca, 0x6c, 0xf4, 0x1f, 0xc3, 0xc3, 0xe6, 0xc7, 0xb8, + 0x86, 0xfb, 0x6d, 0xac, 0x9f, 0x48, 0x22, 0xb4, 0xfc, 0x6f, 0xff, 0x9d, 0x05, + 0x13, 0xd6, 0x1a, 0x21, 0xc8, 0x0a, 0x37, 0x76, 0x71, 0xd1, 0x35, 0xa6, 0x68, + 0xa0, 0xae, 0x2b, 0xb9, 0x34, 0xc8, 0x2c, 0x41, 0x42, 0xda, 0x69, 0xd1, 0x2c, + 0xa7, 0xde, 0x9a, 0x7d, 0xf7, 0x06, 0x40, 0x0e, 0xc7, 0x98, 0x78, 0xd8, 0x68, + 0xe1, 0x7e, 0x8f, 0x71, 0xea, 0x31, 0x49, 0x5a, 0xf8, 0x19, 0xa0, 0x16, 0xcc, + 0x41, 0x9e, 0x07, 0xc5, 0x01, 0xaa, 0x83, 0x09, 0xb2, 0xe6, 0xc8, 0x5b, 0x79, + 0xb2, 0x76, 0x37, 0x33, 0xa3, 0x7b, 0xbc, 0x04, 0x20, 0xd4, 0x25, 0x37, 0xb8, + 0x71, 0xb4, 0x29, 0x4a, 0x65, 0xd3, 0xe0, 0x55, 0xff, 0x71, 0x8d, 0xd9, 0xdc, + 0x8c, 0x75, 0xe7, 0xe5, 0xb2, 0xef, 0xe4, 0x42, 0x63, 0x73, 0x71, 0xb7, 0xc4, + 0x8f, 0x6e, 0xe9, 0x9e, 0x3e, 0xa3, 0x8a, 0x4b, 0x0f, 0x2f, 0x67, 0xfc, 0x2b, + 0x90, 0x8c, 0xda, 0x65, 0x7e, 0xae, 0x75, 0x4e, 0x03, 0x7e, 0x26, 0x2e, 0x9a, + 0x9f, 0x9b, 0xd7, 0xec, 0x42, 0x67, 0xed, 0x8e, 0x96, 0x93, 0x0e, 0x10, 0x84, + 0x78, 0x3c, 0x37, 0xd6, 0xf9, 0xdd, 0x15, 0xfd, 0x29, 0xf4, 0xcc, 0x47, 0x7e, + 0x66, 0xf1, 0x30, 0xd6, 0x30, 0x43, 0x0d, 0xcc, 0x01, 0x04, 0x89, 0x9b, 0x4f, + 0x9f, 0x46, 0xeb, 0x09, 0x0e, 0xf7, 0xfc, 0x90, 0xb4, 0x79, 0xab, 0xf6, 0x1f, + 0x93, 0x95, 0x5e, 0xe0, 0x0e, 0x6a, 0x18, 0x48, 0xf1, 0xab, 0x14, 0xad, 0x33, + 0x4f, 0x2b, 0x68, 0x03, 0x58, 0x08, 0xcd, 0xf1, 0xbb, 0x9e, 0x9d, 0x9a, 0x81, + 0x6b, 0xaf, 0x72, 0x8a, 0x95, 0x5b, 0x96, 0x0b, 0x77, 0x01, 0xfa, 0x62, 0x66, + 0x87, 0xdc, 0x3c, 0x9c, 0xba, 0x64, 0x63, 0x37, 0xb5, 0x3e, 0x29, 0x81, 0x6e, + 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, 0xe4, + 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, + 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, 0x95, 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, + 0x0a, 0x25, 0x3f, 0x05, 0xf6, 0x6c, 0x2e, 0xcf, 0xcb, 0xc0, 0xed, 0x43, 0xf5, + 0xec, 0x2e, 0x6d, 0x8d, 0xba, 0x15, 0xa5, 0x12, 0x54, 0xd9, 0x7b, 0x18, 0x21, + 0x10, 0x7c, 0x07, 0xdd, 0x9a, 0x16, 0xef, 0x84, 0x06, 0xf9, 0x43, 0xe2, 0x82, + 0xb9, 0x5d, 0x4b, 0x36, 0x25, 0x30, 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, 0xf6, + 0x02, 0x7d, 0xe5, 0xaf, 0x1e, 0x47, 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, + 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, + 0x67, 0x9d, 0xf0, 0x63, 0x76, 0x25, 0x04, 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, + 0x2e, 0x5e, 0xbc, 0x18, 0x5c, 0x8a, 0x2b, 0x7d, 0x43, 0x85, 0xf1, 0xc9, 0x5a, + 0xf9, 0x37, 0xdf, 0x78, 0xdf, 0xd8, 0x75, 0x7f, 0xab, 0x43, 0x49, 0x68, 0xb0, + 0xb5, 0x7c, 0x66, 0x57, 0x44, 0x68, 0xf1, 0x60, 0xb4, 0x47, 0xac, 0x82, 0x21, + 0xe5, 0x06, 0x06, 0x76, 0xa8, 0x42, 0xa1, 0xc6, 0xb7, 0x17, 0x2d, 0xd3, 0x34, + 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, 0xa5, + 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, + 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, 0xb3, 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, + 0xde, 0x26, 0xe7, 0xd1, 0xec, 0x3a, 0x9c, 0x8a, 0x09, 0x1f, 0xfd, 0xc7, 0x5b, + 0x7e, 0xcf, 0xdc, 0x7c, 0x12, 0x99, 0x5a, 0x5e, 0x37, 0xce, 0x34, 0x88, 0xbd, + 0x29, 0xf8, 0x62, 0x9d, 0x68, 0xf6, 0x96, 0x49, 0x24, 0x48, 0xdd, 0x52, 0x66, + 0x97, 0x47, 0x6d, 0xc0, 0x61, 0x34, 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, 0xff, + 0x9c, 0x60, 0xef, 0xce, 0x94, 0x3a, 0x00, 0x2e, 0xb9, 0xea, 0x07, 0xff, 0xce, + 0x04, 0x00, 0xc4, 0x9c, 0x60, 0x7f, 0xae, 0x20, 0xcb, 0x37, 0x80, 0xe3, 0x60, + 0x1f, 0xc0, 0x62, 0x58, 0x3b, 0x27, 0x44, 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, + 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, 0x19, 0x30, 0xb8, 0xa1, 0xba, 0xf3, + 0x9a, 0x91, 0x9a, 0x7b, 0x60, 0xbc, 0x60, 0x4d, 0x63, 0x18, 0x5f, 0x75, 0x92, + 0x21, 0xd8, 0x47, 0xcc, 0x54, 0xa2, 0x27, 0x65, 0xa4, 0xc3, 0x34, 0x75, 0xb5, + 0x79, 0x1e, 0x9a, 0xf3, 0x27, 0x1f, 0xc8, 0xd9, 0x35, 0x06, 0x67, 0x09, 0x0d, + 0x81, 0x84, 0xec, 0x50, 0x52, 0x7d, 0x33, 0xa3, 0xa8, 0x40, 0x72, 0xb4, 0x73, + 0x7b, 0x32, 0xc7, 0x9a, 0x46, 0x40, 0x6c, 0x16, 0x9d, 0xf8, 0x59, 0xfb, 0x28, + 0x15, 0x4b, 0x01, 0x4c, 0xaf, 0xb7, 0xa3, 0xea, 0x7a, 0x21, 0x2e, 0x40, 0x17, + 0x2a, 0xf2, 0x18, 0xd7, 0xa1, 0xec, 0xfe, 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, + 0x89, 0x83, 0xc1, 0x4d, 0xe4, 0x97, 0x47, 0x55, 0xda, 0xde, 0x80, 0x18, 0xc9, + 0xb8, 0xf4, 0x54, 0x3f, 0xf3, 0xc3, 0xfd, 0x86, 0x70, 0xc0, 0xbf, 0xbb, 0x3b, + 0x2c, 0x5d, 0xb8, 0x82, 0x3a, 0x6c, 0x8a, 0xe8, 0x2c, 0x45, 0xd1, 0x00, 0xbf, + 0x1c, 0xda, 0xdc, 0xb1, 0x11, 0x6e, 0xae, 0x3d, 0xb1, 0x00, 0x82, 0xd9, 0x3f, + 0xd2, 0x48, 0x04, 0x0d, 0xa9, 0x7d, 0x35, 0x43, 0x84, 0x3b, 0x86, 0xbf, 0x26, + 0x02, 0x1a, 0xfa, 0x92, 0x23, 0x9b, 0x87, 0x3d, 0xc6, 0xc3, 0x57, 0xea, 0xa8, + 0xaf, 0x4e, 0x26, ], txid: [ - 0xbc, 0x34, 0xe5, 0xca, 0x58, 0x1c, 0x5c, 0x65, 0x44, 0xaa, 0xfb, 0x3e, 0x58, - 0x65, 0x34, 0x8f, 0x71, 0xb8, 0xaa, 0x2a, 0x78, 0x2d, 0xf8, 0xb6, 0xbf, 0xa1, - 0x79, 0x1b, 0xf5, 0xa7, 0x37, 0x58, + 0xa3, 0x54, 0xb0, 0x9c, 0x01, 0x97, 0x84, 0x78, 0x0a, 0x7f, 0xd7, 0xa1, 0xb5, + 0xbd, 0xc7, 0xf3, 0x36, 0xcf, 0x41, 0x82, 0x8a, 0xf1, 0x35, 0xf2, 0xdd, 0x97, + 0x94, 0x65, 0x48, 0x45, 0x3f, 0xf0, ], auth_digest: [ - 0x6c, 0x36, 0xbc, 0x25, 0xfc, 0x48, 0x56, 0xe5, 0x09, 0x8e, 0x5d, 0x33, 0x03, - 0x3c, 0x5b, 0x38, 0x75, 0x21, 0x7f, 0xcb, 0x45, 0x52, 0x61, 0x18, 0xbb, 0x05, - 0x8a, 0x2d, 0xd7, 0xb6, 0xea, 0x5e, + 0x50, 0xe4, 0x62, 0x5a, 0xd9, 0xcd, 0x1a, 0x79, 0x24, 0x3f, 0xf2, 0xd1, 0xed, + 0xcf, 0xba, 0xf1, 0x19, 0x9a, 0xdc, 0xd1, 0xd4, 0xe9, 0x9d, 0x50, 0x73, 0x43, + 0x3c, 0x66, 0xa4, 0xa6, 0x61, 0x15, ], - amounts: vec![1848924248978091, 447389782351145, 620151782842275], - script_pubkeys: vec![vec![0xac, 0x00, 0x00], vec![0x65, 0x65], vec![]], - transparent_input: Some(0), + amounts: vec![], + script_pubkeys: vec![], + transparent_input: None, sighash_shielded: [ - 0xa9, 0x60, 0xf4, 0xba, 0xa5, 0xf4, 0x33, 0x1f, 0x4d, 0xad, 0xc3, 0x74, 0x56, - 0x6b, 0xc0, 0x47, 0xe7, 0xc0, 0x71, 0x53, 0xb0, 0x38, 0x5a, 0x58, 0x7a, 0x2b, - 0xe8, 0x6a, 0x51, 0x8a, 0xb5, 0xd3, + 0xa3, 0x54, 0xb0, 0x9c, 0x01, 0x97, 0x84, 0x78, 0x0a, 0x7f, 0xd7, 0xa1, 0xb5, + 0xbd, 0xc7, 0xf3, 0x36, 0xcf, 0x41, 0x82, 0x8a, 0xf1, 0x35, 0xf2, 0xdd, 0x97, + 0x94, 0x65, 0x48, 0x45, 0x3f, 0xf0, ], - sighash_all: Some([ - 0x8f, 0x60, 0x76, 0x56, 0xc5, 0x2d, 0x9a, 0xd2, 0x23, 0x11, 0x20, 0xc2, 0x4f, - 0xaa, 0x7b, 0x68, 0x55, 0xae, 0x57, 0x1b, 0xee, 0x46, 0xe6, 0x1d, 0x76, 0xa2, - 0x5c, 0xff, 0xb2, 0xbb, 0x4f, 0xcb, - ]), - sighash_none: Some([ - 0xfd, 0xcf, 0x8a, 0x04, 0x69, 0x0d, 0xc2, 0x76, 0x9d, 0x93, 0x43, 0x37, 0xfe, - 0x8b, 0x47, 0x24, 0x2a, 0x6e, 0xd7, 0xc9, 0xd8, 0x6d, 0x3e, 0x01, 0x33, 0x24, - 0x84, 0xd3, 0x8d, 0x71, 0xe7, 0x85, - ]), - sighash_single: Some([ - 0xb3, 0xa2, 0x8e, 0xbd, 0x7c, 0xf3, 0x7a, 0x44, 0x3a, 0x40, 0x90, 0x9f, 0x51, - 0x3f, 0x08, 0x1f, 0xbe, 0x0f, 0xd7, 0x8c, 0x67, 0xf7, 0xc4, 0xf0, 0x1b, 0x5f, - 0xb1, 0x15, 0x97, 0x89, 0x86, 0x1a, - ]), - sighash_all_anyone: Some([ - 0x62, 0xea, 0xda, 0x92, 0xbb, 0xc5, 0xaf, 0x09, 0xab, 0x7b, 0x95, 0x83, 0x4a, - 0xe6, 0xba, 0x41, 0x3b, 0x17, 0xcd, 0xf1, 0x96, 0xa6, 0xf9, 0x9c, 0x54, 0x1b, - 0x71, 0x0d, 0xda, 0xcf, 0xa5, 0x45, - ]), - sighash_none_anyone: Some([ - 0xdf, 0xf0, 0xeb, 0x1e, 0x03, 0xb9, 0xc2, 0xfe, 0x30, 0x1d, 0xb9, 0xb0, 0x18, - 0x35, 0x83, 0x61, 0x88, 0x93, 0xc8, 0x47, 0x4e, 0xf5, 0x65, 0x92, 0x1d, 0x5f, - 0x28, 0x32, 0xed, 0xe3, 0xbf, 0x49, - ]), - sighash_single_anyone: Some([ - 0x1d, 0xe6, 0x07, 0xf1, 0x88, 0xa4, 0x0b, 0x5c, 0x15, 0x22, 0x26, 0xd9, 0x4e, - 0x44, 0x41, 0x1b, 0x69, 0x02, 0x94, 0x7d, 0x42, 0xfb, 0xb2, 0x5f, 0xb8, 0x6c, - 0x9a, 0x4e, 0x77, 0xa4, 0xf3, 0x5b, - ]), + sighash_all: None, + sighash_none: None, + sighash_single: None, + sighash_all_anyone: None, + sighash_none_anyone: None, + sighash_single_anyone: None, }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x23, - 0xe1, 0x19, 0xf6, 0x35, 0xef, 0x1d, 0x05, 0x02, 0x4b, 0x21, 0x6b, 0x70, 0x23, - 0xfa, 0xdc, 0x2d, 0x25, 0x94, 0x9c, 0x90, 0x03, 0x7e, 0x71, 0xe3, 0xe5, 0x50, - 0x72, 0x6d, 0x21, 0x0a, 0x2c, 0x68, 0x83, 0x42, 0xe5, 0x24, 0x40, 0x63, 0x5e, - 0x9c, 0xc1, 0x4a, 0xfe, 0x10, 0x06, 0x65, 0x51, 0x51, 0x51, 0xac, 0x53, 0x78, - 0x2e, 0x9e, 0x4a, 0x5f, 0xa8, 0x7f, 0x0a, 0x95, 0x6f, 0x5b, 0x85, 0x50, 0x99, - 0x60, 0x28, 0x5c, 0x22, 0x62, 0x7c, 0x59, 0x48, 0x3a, 0x5a, 0x4c, 0x28, 0xcc, - 0xe4, 0xb1, 0x56, 0xe5, 0x51, 0x40, 0x6a, 0x7e, 0xe8, 0x35, 0x56, 0x56, 0xa2, - 0x00, 0x43, 0xe3, 0x8c, 0xe1, 0x03, 0xbd, 0x9a, 0x27, 0x4e, 0x28, 0x8d, 0x02, - 0x00, 0x00, 0xaa, 0xfe, 0x03, 0x32, 0x52, 0xc7, 0x03, 0x00, 0x05, 0x51, 0x6a, - 0x63, 0x65, 0x63, 0x38, 0xeb, 0x8b, 0x41, 0xca, 0x51, 0x04, 0x00, 0x06, 0x53, - 0x51, 0x63, 0x65, 0xac, 0xac, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x05, + 0x40, 0x65, 0x7f, 0xe3, 0x29, 0x14, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x06, 0x04, 0xe3, 0x29, 0x14, 0x10, 0x00, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, ], txid: [ - 0x90, 0xd2, 0x88, 0x6c, 0xb6, 0x28, 0x81, 0x33, 0x71, 0xc7, 0xd1, 0xbd, 0x02, - 0x03, 0x1b, 0x6c, 0xa6, 0x6b, 0x42, 0xd1, 0xdb, 0x4e, 0x11, 0x8d, 0x65, 0xf3, - 0x1b, 0x2d, 0xcc, 0xb6, 0x32, 0x35, + 0x7d, 0x3f, 0x83, 0x49, 0xa5, 0x1c, 0xb7, 0xd7, 0x97, 0x3e, 0x82, 0x16, 0x96, + 0xac, 0x6a, 0xc0, 0x5a, 0xc7, 0xb6, 0xde, 0x88, 0x18, 0xe8, 0x98, 0x36, 0x3d, + 0x19, 0x24, 0x93, 0x26, 0xbb, 0x16, ], auth_digest: [ - 0x9c, 0x05, 0x32, 0xe6, 0x78, 0x8f, 0xe9, 0xe2, 0x8b, 0x3b, 0x67, 0xf5, 0x71, - 0x98, 0x9b, 0xe7, 0x7a, 0xe7, 0x61, 0xdf, 0xd3, 0x75, 0xc7, 0x4b, 0xbf, 0x5d, - 0xb3, 0xca, 0xfa, 0xa1, 0xf9, 0xa5, + 0xdd, 0x6d, 0x69, 0x23, 0xbd, 0xba, 0xa3, 0xd4, 0x3d, 0xd9, 0x78, 0xcd, 0xc9, + 0x7f, 0x61, 0x9d, 0x7f, 0x45, 0xae, 0x88, 0x50, 0x88, 0x94, 0x95, 0x2f, 0x68, + 0xd1, 0xb8, 0x76, 0x4c, 0x0a, 0x96, + ], + amounts: vec![], + script_pubkeys: vec![], + transparent_input: None, + sighash_shielded: [ + 0x7d, 0x3f, 0x83, 0x49, 0xa5, 0x1c, 0xb7, 0xd7, 0x97, 0x3e, 0x82, 0x16, 0x96, + 0xac, 0x6a, 0xc0, 0x5a, 0xc7, 0xb6, 0xde, 0x88, 0x18, 0xe8, 0x98, 0x36, 0x3d, + 0x19, 0x24, 0x93, 0x26, 0xbb, 0x16, + ], + sighash_all: None, + sighash_none: None, + sighash_single: None, + sighash_all_anyone: None, + sighash_none_anyone: None, + sighash_single_anyone: None, + }, + TestVector { + tx: vec![ + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x5d, + 0x98, 0xf6, 0x8b, 0xd3, 0x7d, 0xe8, 0x17, 0x01, 0x08, 0xcc, 0xd8, 0x8d, 0x0c, + 0x81, 0x1e, 0x4c, 0x31, 0xfb, 0xb4, 0x9f, 0x3a, 0x90, 0xbb, 0xd0, 0x5d, 0xce, + 0x62, 0xf3, 0x44, 0xe7, 0x07, 0x75, 0x93, 0x15, 0x9a, 0xe3, 0x50, 0x50, 0xb0, + 0x4c, 0x9e, 0x6b, 0x86, 0xbc, 0x07, 0x63, 0x00, 0x00, 0x00, 0x6a, 0xac, 0x00, + 0x18, 0xca, 0x5b, 0x69, 0x03, 0x58, 0x02, 0x2f, 0x30, 0xa4, 0xa2, 0x06, 0x00, + 0x00, 0xa9, 0x9f, 0x39, 0x53, 0x35, 0x48, 0x05, 0x00, 0x06, 0xac, 0x63, 0x51, + 0x63, 0x53, 0x51, 0x6c, 0x56, 0x73, 0xeb, 0x90, 0xb1, 0x03, 0x00, 0x02, 0x63, + 0x00, 0x00, 0x00, 0x04, 0xa5, 0x48, 0x20, 0xe4, 0x12, 0xed, 0x0e, 0x91, 0x30, + 0x8a, 0x87, 0x77, 0x73, 0xa9, 0x87, 0xf5, 0x8b, 0xef, 0x52, 0x4f, 0x26, 0x3a, + 0xf3, 0x71, 0x85, 0x23, 0x7a, 0x25, 0x7d, 0xb6, 0xac, 0x91, 0x18, 0xb3, 0xb3, + 0x5d, 0x2f, 0xf8, 0x5b, 0x6f, 0xf6, 0x3a, 0xb9, 0x22, 0x77, 0x33, 0xe2, 0xea, + 0x03, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, 0x50, 0x74, 0x15, 0x6c, 0xc5, + 0xa5, 0xd6, 0x3e, 0x8e, 0x01, 0x99, 0x8a, 0x4a, 0x9b, 0x12, 0x44, 0xee, 0x6c, + 0xdd, 0xfd, 0x26, 0x74, 0x84, 0x1b, 0x16, 0x65, 0x48, 0xdc, 0x1c, 0xa1, 0x9d, + 0x1a, 0xa9, 0xb8, 0xff, 0x73, 0x6c, 0x22, 0x47, 0xb4, 0xed, 0x8d, 0xfe, 0x73, + 0x69, 0x03, 0xd7, 0x56, 0x2c, 0xde, 0xa6, 0x9f, 0xa7, 0x3e, 0x2e, 0x19, 0xc5, + 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, 0x5f, + 0x97, 0x0d, 0xf1, 0x25, 0x40, 0x18, 0xec, 0xfb, 0xfc, 0x08, 0xe7, 0xef, 0x3a, + 0xab, 0x3b, 0xea, 0xa4, 0x67, 0xce, 0x0c, 0xd2, 0xf7, 0x7f, 0x7b, 0x9d, 0xd2, + 0xef, 0xe9, 0x08, 0x29, 0xae, 0x8f, 0x28, 0x07, 0x7d, 0x88, 0x01, 0x73, 0xb6, + 0x40, 0xf2, 0xdd, 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, 0x7d, + 0x89, 0x13, 0x07, 0xbb, 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, 0x2f, + 0x74, 0xd5, 0xfc, 0xc0, 0x00, 0x94, 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, 0x3f, + 0xe6, 0x09, 0x68, 0x6f, 0x46, 0x32, 0x23, 0xb1, 0xe9, 0xbc, 0x03, 0xbd, 0xe8, + 0x95, 0xd1, 0x23, 0x8f, 0xad, 0x04, 0xa3, 0xbf, 0xce, 0x68, 0xa0, 0x75, 0xe8, + 0xa3, 0x7c, 0x0e, 0x87, 0xbf, 0x46, 0xdd, 0x01, 0x55, 0x45, 0xf9, 0xb4, 0xfb, + 0x0e, 0xec, 0x64, 0x5f, 0xfc, 0xbb, 0xe0, 0xca, 0x5f, 0x8c, 0x56, 0x1b, 0x25, + 0x7d, 0x52, 0xd6, 0x02, 0xd8, 0xc9, 0x4c, 0x50, 0x28, 0x73, 0xa0, 0x1d, 0x92, + 0x51, 0xd8, 0xc8, 0x60, 0xc0, 0x41, 0x52, 0x5b, 0x3b, 0xf4, 0xe3, 0xa2, 0xeb, + 0x92, 0x72, 0x81, 0x5c, 0x75, 0x86, 0x76, 0x84, 0x28, 0xb4, 0xc2, 0xb2, 0x5e, + 0x37, 0x45, 0xf0, 0x09, 0xc5, 0xdc, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, + 0xeb, 0x73, 0x6b, 0x68, 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, + 0x67, 0xe9, 0x41, 0x4c, 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, + 0x56, 0x78, 0xc4, 0x97, 0xfa, 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, + 0x0f, 0xc4, 0xa7, 0x6b, 0xfa, 0x8b, 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, + 0xd6, 0x60, 0x4b, 0x23, 0x30, 0xb6, 0xb3, 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, + 0x88, 0x3a, 0x75, 0x15, 0x88, 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0xc6, + 0x01, 0x92, 0xe8, 0x47, 0x6b, 0xd1, 0x17, 0x5d, 0x95, 0x62, 0x08, 0x7b, 0xdb, + 0x81, 0x8e, 0x66, 0x21, 0x62, 0x86, 0xba, 0xfe, 0x47, 0xff, 0x4d, 0xbc, 0xce, + 0xd5, 0x14, 0x44, 0x48, 0x0a, 0x9a, 0x56, 0x73, 0xec, 0xe7, 0xfa, 0xc7, 0x3a, + 0x0e, 0xd4, 0x1a, 0xb0, 0x05, 0x17, 0x53, 0xa7, 0xca, 0xa8, 0x9b, 0xe3, 0x13, + 0x9a, 0xfd, 0x97, 0x93, 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, 0x04, 0x65, 0x95, + 0xac, 0xd4, 0x7b, 0xf1, 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, 0x48, 0x03, + 0x6d, 0x3e, 0xe4, 0x37, 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, 0x3c, + 0x33, 0x58, 0x46, 0x57, 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, + 0x76, 0xfa, 0xb7, 0xb0, 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, + 0xb9, 0xf1, 0x7c, 0x7e, 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, + 0x4c, 0x2a, 0x65, 0x42, 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, 0x46, 0x49, 0xcd, + 0xa3, 0x2b, 0xf6, 0x86, 0x66, 0x61, 0x43, 0xf6, 0x22, 0xaa, 0x48, 0x04, 0x60, + 0xb5, 0xaf, 0xac, 0x51, 0x86, 0x07, 0xcd, 0x9a, 0xf8, 0xbc, 0xd6, 0xb5, 0x8c, + 0x30, 0x12, 0x73, 0x16, 0xb2, 0x5d, 0x5e, 0xa7, 0xbf, 0x6b, 0x0c, 0xab, 0x85, + 0x42, 0xff, 0x69, 0xd9, 0xb2, 0xf1, 0x80, 0xbe, 0x12, 0xed, 0x75, 0x34, 0x4a, + 0x39, 0x5a, 0xa1, 0x0f, 0x85, 0x2f, 0x08, 0x3a, 0xd6, 0x4e, 0xf4, 0x0e, 0x9c, + 0x03, 0x09, 0xe9, 0xbb, 0xa5, 0x4b, 0x8c, 0xb3, 0x3c, 0x95, 0x49, 0x8a, 0x69, + 0x53, 0x8d, 0x3a, 0xe5, 0xb2, 0x5e, 0x24, 0x70, 0x98, 0x30, 0x6f, 0xa8, 0xc7, + 0x4a, 0x8e, 0xe5, 0xbc, 0xa9, 0x41, 0x53, 0x1d, 0x61, 0xaa, 0xc2, 0x7a, 0xab, + 0x3d, 0xc5, 0x61, 0x7d, 0x56, 0x06, 0xc9, 0x57, 0x7a, 0x2a, 0x83, 0x46, 0xe8, + 0xd8, 0x5b, 0x32, 0xb8, 0x50, 0x57, 0x75, 0x10, 0x8d, 0xc8, 0x5e, 0x2a, 0xde, + 0x2e, 0xac, 0x1e, 0x63, 0x6e, 0x1a, 0xf4, 0x05, 0x4c, 0x8b, 0x6f, 0x57, 0x63, + 0x2d, 0xf2, 0x69, 0xc3, 0x72, 0x3b, 0x32, 0x08, 0x72, 0xe4, 0xc5, 0x7b, 0x21, + 0x83, 0x58, 0xdc, 0x7e, 0x99, 0x05, 0xbb, 0x04, 0xed, 0xf9, 0x2e, 0xdf, 0x0d, + 0xf6, 0x35, 0xf3, 0xbf, 0x36, 0x1e, 0x57, 0xa1, 0x32, 0x96, 0xe1, 0x44, 0x7a, + 0xf5, 0x08, 0x78, 0x72, 0xd6, 0x36, 0xe2, 0x75, 0x18, 0xa9, 0x87, 0x6e, 0x15, + 0xeb, 0x01, 0xf5, 0xe8, 0xde, 0xd8, 0x18, 0x92, 0x51, 0x1c, 0xc2, 0x85, 0x1b, + 0x00, 0xb8, 0x32, 0x71, 0x2a, 0x6d, 0x3b, 0xa5, 0x66, 0x65, 0x17, 0xbc, 0xd3, + 0x56, 0x76, 0x21, 0xa7, 0xcf, 0x84, 0x45, 0x58, 0x96, 0x53, 0x26, 0x20, 0x20, + 0xc3, 0x3b, 0xf7, 0x80, 0x31, 0xb8, 0xee, 0x07, 0x07, 0xde, 0x07, 0x20, 0x68, + 0xc1, 0x70, 0x57, 0x03, 0x27, 0xe6, 0xd9, 0xf5, 0xc6, 0xdd, 0xc3, 0x35, 0x40, + 0x2e, 0xfc, 0x54, 0x88, 0x62, 0xf5, 0xa0, 0x70, 0x94, 0xfd, 0x42, 0x8a, 0x7b, + 0xbc, 0x15, 0xd7, 0xb3, 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, 0x85, 0xf5, 0x8a, + 0x76, 0x64, 0x7d, 0x2b, 0xe4, 0xc2, 0xcd, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, + 0x71, 0xd7, 0xa0, 0x98, 0xba, 0xf7, 0x2c, 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, + 0xaa, 0xe4, 0x88, 0xbd, 0x7d, 0xe2, 0x59, 0xd3, 0x41, 0x5c, 0x2f, 0x3f, 0x6d, + 0x8b, 0xf6, 0x20, 0x2b, 0x51, 0x1e, 0xeb, 0x74, 0xaa, 0xa9, 0xc9, 0x85, 0x87, + 0x5f, 0x00, 0x62, 0xaf, 0x8a, 0x28, 0x40, 0xd5, 0x29, 0xca, 0xbb, 0xb0, 0x6f, + 0xf4, 0x3f, 0x4f, 0x19, 0x4c, 0xb1, 0xc7, 0xc9, 0x58, 0xcf, 0x62, 0x07, 0x40, + 0x4a, 0x24, 0xf8, 0xa4, 0x34, 0x23, 0x85, 0xaa, 0x8c, 0xff, 0x6a, 0x37, 0x6e, + 0x1f, 0x37, 0x2e, 0xac, 0x6a, 0xc4, 0xe4, 0x6c, 0xc0, 0x14, 0xd2, 0x0a, 0x8e, + 0x46, 0xbd, 0x54, 0xf7, 0xc4, 0x5d, 0xf3, 0xa9, 0x83, 0x4f, 0x77, 0xab, 0x7d, + 0x24, 0x96, 0x63, 0xa7, 0xd2, 0xa0, 0xcd, 0xe3, 0x62, 0xbd, 0x8c, 0x40, 0x41, + 0xe7, 0x92, 0x1e, 0x99, 0xe9, 0x30, 0xc8, 0xea, 0xde, 0xd5, 0x81, 0x0d, 0xac, + 0x92, 0x90, 0x03, 0x9e, 0x22, 0x3c, 0x80, 0x2c, 0xbc, 0xb6, 0xb5, 0x8c, 0x1b, + 0xa7, 0xed, 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x01, 0xeb, 0x7c, 0xd8, 0x5f, + 0xbd, 0x86, 0x8b, 0xa5, 0xef, 0xe1, 0xc4, 0x16, 0x7f, 0x28, 0x08, 0x91, 0x77, + 0xc8, 0x0d, 0x72, 0xf0, 0xb8, 0xcd, 0xca, 0x3c, 0x29, 0x74, 0x24, 0x9a, 0x71, + 0x9a, 0xb1, 0xd8, 0x0a, 0xe5, 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, + 0x5e, 0xac, 0x09, 0x99, 0x0f, 0xc6, 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, + 0x08, 0xd7, 0x47, 0x84, 0xaf, 0x00, 0x2d, 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, + 0xea, 0xe7, 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, 0x5a, 0x55, 0x59, 0xcf, 0x9e, + 0x2d, 0x3b, 0x60, 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, 0x86, + 0xb4, 0xd1, 0x46, 0x09, 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, 0xff, 0xe3, 0x0a, + 0x60, 0xf7, 0xbf, 0xf1, 0xd9, 0xfb, 0x83, 0x00, 0xed, 0x00, 0x92, 0x53, 0xba, + 0x9b, 0x99, 0x6f, 0xa0, 0x52, 0x41, 0xb1, 0x0f, 0x5a, 0xc9, 0xa8, 0x40, 0x8e, + 0x92, 0x5b, 0x62, 0x6b, 0xb2, 0x1a, 0x47, 0x1f, 0xe3, 0xbe, 0xde, 0x52, 0xbb, + 0xa0, 0x97, 0xb2, 0xa9, 0x9a, 0x9b, 0xa5, 0xa8, 0x66, 0x58, 0xc3, 0xfd, 0x9e, + 0xc5, 0x5b, 0xfa, 0x9b, 0x32, 0x85, 0x67, 0x25, 0x4a, 0xb3, 0x6d, 0x2c, 0x7f, + 0x44, 0xd2, 0xc7, 0xe1, 0x3e, 0xb5, 0x4b, 0xeb, 0x70, 0xea, 0x8f, 0xa9, 0x4b, + 0x6c, 0x6e, 0x01, 0x2d, 0x79, 0xe3, 0xf5, 0x36, 0x89, 0xc2, 0xb1, 0xa1, 0x8e, + 0xaf, 0x2d, 0x47, 0x1d, 0x13, 0xc1, 0xab, 0x39, 0xd9, 0x19, 0x4a, 0xe8, 0x43, + 0xab, 0x1d, 0x28, 0xff, 0xa8, 0xf6, 0x9d, 0xc7, 0xe1, 0x5c, 0xc3, 0x8b, 0x12, + 0xe8, 0xfc, 0xd7, 0x92, 0x55, 0xb7, 0x21, 0x60, 0x56, 0xd9, 0xed, 0xb7, 0x48, + 0x2f, 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x51, 0xc1, 0xa0, 0x8b, 0x8a, 0x11, + 0xd8, 0x4d, 0x04, 0x09, 0xb7, 0x34, 0xf4, 0x52, 0xaa, 0xf0, 0xd6, 0xb1, 0x8f, + 0x50, 0x25, 0x86, 0x83, 0xd3, 0xf9, 0xa7, 0x6d, 0x39, 0x9f, 0xd0, 0x47, 0xee, + 0xe2, 0x88, 0xbb, 0x45, 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, 0xc6, 0x23, 0x22, + 0x92, 0x4c, 0xd1, 0x3b, 0x5d, 0xd4, 0xee, 0xd6, 0x6e, 0xd8, 0xd9, 0x97, 0x2d, + 0x77, 0x26, 0x29, 0xea, 0x64, 0x74, 0x2e, 0x54, 0x73, 0x39, 0x81, 0xb0, 0x06, + 0xc0, 0x62, 0x46, 0x8e, 0x4b, 0xd8, 0xf7, 0xdd, 0x9a, 0xf6, 0x98, 0xf5, 0x2a, + 0xe8, 0x14, 0x63, 0x4e, 0x81, 0xd7, 0xf3, 0xe0, 0xc4, 0x20, 0x31, 0x7c, 0xac, + 0xa9, 0xae, 0x48, 0x11, 0xc6, 0xaf, 0x06, 0xfe, 0x80, 0xa8, 0xc0, 0x2a, 0xb7, + 0xa0, 0x0e, 0x18, 0xe4, 0xa6, 0xaa, 0x1e, 0xa1, 0xb7, 0x69, 0x45, 0xd2, 0x61, + 0x5d, 0x43, 0xac, 0x11, 0x8b, 0x56, 0xc2, 0xf2, 0x96, 0x0f, 0xe9, 0x3a, 0x02, + 0x5f, 0x13, 0xec, 0x91, 0xff, 0xc6, 0xd2, 0xc3, 0x53, 0x69, 0x9a, 0xbb, 0x09, + 0x2d, 0xed, 0xc0, 0x65, 0xdb, 0x8f, 0xa2, 0x14, 0xdb, 0xc4, 0x64, 0x66, 0xf8, + 0x97, 0xb8, 0x8c, 0x58, 0xb3, 0x01, 0x52, 0x13, 0x3a, 0xa3, 0x83, 0x1a, 0xf3, + 0x7c, 0x74, 0xd9, 0x9e, 0x9e, 0x36, 0xff, 0x70, 0x11, 0xd3, 0x23, 0x83, 0x05, + 0x69, 0x15, 0x08, 0xa2, 0xc3, 0xa4, 0x3e, 0x75, 0x5d, 0xc0, 0x81, 0xb5, 0x11, + 0xd6, 0x48, 0x2a, 0x7d, 0xb6, 0x5f, 0xa9, 0x69, 0x9e, 0xa8, 0x7f, 0xf4, 0x70, + 0x99, 0xed, 0x36, 0x37, 0xdb, 0xb0, 0xa3, 0xd0, 0xef, 0x79, 0x79, 0x6a, 0x8e, + 0xf1, 0xe4, 0xd9, 0x4d, 0x42, 0xb4, 0xbc, 0x2b, 0x4a, 0x03, 0x8a, 0xe6, 0xe4, + 0x6b, 0x24, 0xcf, 0xc8, 0x41, 0x53, 0xd3, 0x1e, 0xaf, 0x89, 0x50, 0x63, 0xa5, + 0xca, 0x95, 0x9b, 0xe6, 0x3f, 0x37, 0xf2, 0xba, 0x0d, 0x43, 0x23, 0x66, 0x73, + 0x6d, 0x86, 0x32, 0xfc, 0xe0, 0x72, 0xb6, 0xae, 0x5b, 0x6f, 0x3f, 0xd5, 0x9d, + 0x3f, 0xaf, 0xf6, 0x38, 0x27, 0x5a, 0x99, 0x2f, 0xef, 0xc8, 0x7e, 0x60, 0xd4, + 0x4c, 0x2c, 0xad, 0xc2, 0xb5, 0xc4, 0x94, 0xe3, 0xe7, 0x2e, 0xb4, 0x59, 0x7c, + 0x96, 0xb4, 0x01, 0x67, 0x79, 0x9a, 0x90, 0x01, 0xa2, 0xed, 0x36, 0x76, 0xa8, + 0xb4, 0x03, 0xae, 0x25, 0xff, 0xd7, 0x72, 0xf7, 0x08, 0x1e, 0x9a, 0x32, 0xbc, + 0xc1, 0xc5, 0xe2, 0xed, 0xd4, 0xe2, 0xa6, 0x57, 0x6b, 0x78, 0x3c, 0xce, 0x3a, + 0xae, 0x11, 0xfa, 0x43, 0x22, 0x62, 0x54, 0x88, 0x56, 0x18, 0x3e, 0xe6, 0x82, + 0xd5, 0xdc, 0x31, 0xbe, 0xb3, 0x8f, 0x06, 0x1c, 0xbd, 0xec, 0xa7, 0x02, 0x1a, + 0x44, 0x4e, 0x2d, 0xd4, 0x17, 0xdf, 0x26, 0xdc, 0xd2, 0x20, 0xf2, 0xb7, 0x31, + 0x77, 0x2b, 0x43, 0x9e, 0x96, 0xd6, 0x14, 0xe1, 0xfa, 0xcb, 0x48, 0x6c, 0x7a, + 0x7d, 0x51, 0x71, 0xb1, 0xde, 0x35, 0x9f, 0x6a, 0xd3, 0xa9, 0x6f, 0x64, 0x9c, + 0x96, 0x91, 0x02, 0xa1, 0x96, 0x4f, 0xb4, 0xb4, 0xa1, 0xa4, 0x27, 0x9c, 0x68, + 0xe6, 0xc3, 0x72, 0xe4, 0x21, 0x87, 0xd7, 0x54, 0xe8, 0x04, 0xa6, 0x16, 0x53, + 0x09, 0x20, 0x69, 0xfb, 0x9b, 0x6d, 0x25, 0x26, 0x68, 0x90, 0x80, 0x8b, 0x01, + 0x5d, 0xf2, 0x8c, 0x80, 0x10, 0x65, 0xda, 0x6f, 0xeb, 0xdc, 0x1a, 0x56, 0xbf, + 0xd0, 0x02, 0x62, 0x5a, 0xcf, 0xaa, 0x53, 0x73, 0xfd, 0xe1, 0x49, 0xc1, 0xcf, + 0xc3, 0x64, 0x9b, 0x48, 0x69, 0x26, 0x99, 0xbb, 0xad, 0x5b, 0x7b, 0xf9, 0x97, + 0x38, 0x75, 0xf9, 0xae, 0x6f, 0xc9, 0x69, 0x92, 0x9f, 0x18, 0x49, 0x2f, 0x7c, + 0x8d, 0xfe, 0x69, 0x97, 0x7a, 0x14, 0x2e, 0x92, 0xd6, 0xd0, 0x2c, 0xce, 0x90, + 0x00, 0x09, 0x99, 0x38, 0xe8, 0x16, 0x9f, 0xd4, 0x3d, 0x45, 0x24, 0xe9, 0xc4, + 0x8c, 0x24, 0x7f, 0x9d, 0x48, 0x4c, 0x73, 0xcf, 0x09, 0x39, 0x30, 0x39, 0xe4, + 0x53, 0x26, 0xb8, 0x3f, 0x81, 0xb8, 0x70, 0x37, 0x02, 0x05, 0x66, 0xae, 0x61, + 0xd6, 0x16, 0x42, 0x8a, 0x60, 0x4e, 0x42, 0xef, 0x3e, 0xf3, 0x30, 0x2d, 0x21, + 0x1d, 0x0c, 0xe2, 0xf8, 0xc5, 0x38, 0x6e, 0x5e, 0xca, 0x18, 0x24, 0x4d, 0x63, + 0xd6, 0x70, 0x46, 0x6a, 0xc5, 0x95, 0xb7, 0x7f, 0xb1, 0xfa, 0x26, 0x80, 0xec, + 0x0a, 0xee, 0x5c, 0xb8, 0x35, 0x52, 0x60, 0x50, 0x5c, 0x2c, 0x2e, 0x5d, 0x99, + 0x0f, 0xff, 0x1c, 0x51, 0x80, 0xfa, 0x5b, 0x55, 0x47, 0xb6, 0x19, 0x12, 0x24, + 0xa7, 0x34, 0x9e, 0xa7, 0x70, 0xf6, 0x29, 0xe9, 0x4e, 0x99, 0x54, 0x67, 0x2f, + 0x79, 0x52, 0x12, 0x57, 0xc8, 0x1d, 0x83, 0xff, 0x3e, 0x82, 0x18, 0xb3, 0xad, + 0xd9, 0xc0, 0x68, 0x93, 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, 0xfb, 0x13, + 0x3b, 0xfa, 0xbe, 0x48, 0x58, 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, 0x6e, 0xc0, + 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, 0x73, 0x3f, 0x44, 0x06, 0xe9, 0xd9, 0x67, + 0xc5, 0x60, 0xf3, 0x44, 0xd7, 0xe9, 0x04, 0xa2, 0x80, 0x45, 0xd9, 0x9f, 0x3a, + 0xf8, 0xc8, 0x2e, 0x97, 0xe1, 0xb9, 0xc1, 0xb2, 0x05, 0xe5, 0x85, 0xfb, 0xeb, + 0xb4, 0x8f, 0xaf, 0x58, 0xf1, 0xb6, 0x5d, 0xca, 0x24, 0x97, 0xe0, 0x9a, 0x70, + 0xaa, 0xd4, 0x86, 0x5f, 0x85, 0x71, 0x5a, 0x28, 0x0e, 0x18, 0x6f, 0x3f, 0xc1, + 0x74, 0x0d, 0x81, 0x84, 0xd3, 0x3e, 0x83, 0x22, 0x16, 0x95, 0x21, 0xcd, 0xc1, + 0x32, 0x21, 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0xe2, 0xde, 0x74, 0xb6, + 0xea, 0x55, 0xb4, 0xcb, 0x8f, 0x6f, 0x9b, 0xee, 0x98, 0xb1, 0x0d, 0x41, 0x51, + 0x09, 0x45, 0x5f, 0x48, 0xb7, 0x76, 0x08, 0x2d, 0xc3, 0x0b, 0x4b, 0xc7, 0x34, + 0x77, 0x07, 0x55, 0x11, 0x70, 0x03, 0x08, 0x15, 0x8c, 0xe2, 0xf2, 0xf9, 0xbf, + 0x0f, 0x69, 0x1b, 0x2c, 0xe5, 0x3e, 0x61, 0x14, 0x2c, 0xb7, 0x40, 0xc1, 0x5b, + 0x7b, 0x62, 0x3c, 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0xfa, 0x31, 0xbc, 0xdc, 0x66, + 0x5c, 0x6d, 0x71, 0x23, 0xe9, 0x53, 0x50, 0x81, 0x13, 0x75, 0x94, 0x7b, 0x05, + 0x5a, 0x43, 0xdb, 0x07, 0xe0, 0x3f, 0x33, 0x62, 0x7d, 0xf5, 0xc6, 0x38, 0xbf, + 0xad, 0x95, 0x6d, 0xdc, 0x1e, 0xa7, 0xd7, 0x62, 0x0a, 0x20, 0xf2, 0x79, 0x2f, + 0x63, 0x81, 0x7a, 0x1c, 0xf3, 0x25, 0x80, 0xd0, 0x42, 0x74, 0x23, 0x4a, 0xf2, + 0xa5, 0x1b, 0x56, 0xbb, 0x68, 0xa2, 0x9e, 0x43, 0xa9, 0x54, 0x14, 0x2b, 0xa4, + 0xca, 0x68, 0x23, 0xbd, 0xe9, 0x05, 0x3d, 0x72, 0xfd, 0xad, 0xbc, 0x61, 0xad, + 0x59, 0x36, 0xc5, 0x3f, 0xdd, 0x75, 0x79, 0x44, 0x6d, 0x11, 0xc4, 0x46, 0x07, + 0xf4, 0x16, 0x30, 0xe4, 0xc0, 0x89, 0x15, 0xe6, 0x31, 0x77, 0x15, 0x50, 0xe9, + 0xce, 0x1f, 0xca, 0x2c, 0x63, 0xfe, 0x06, 0xb7, 0x98, 0x9d, 0x58, 0x4f, 0xa7, + 0xd7, 0x82, 0xa8, 0x8c, 0x1e, 0x7d, 0x64, 0xb6, 0xfb, 0xf5, 0x5e, 0x35, 0x96, + 0xaf, 0x9b, 0xcb, 0x75, 0x85, 0xf8, 0xc7, 0xd3, 0xaa, 0x5c, 0x20, 0x82, 0xb2, + 0x65, 0x24, 0x9d, 0xf0, 0x57, 0x01, 0xda, 0xb0, 0x31, 0xc4, 0xba, 0xc1, 0xea, + 0x26, 0x7a, 0x29, 0x96, 0xa2, 0x02, 0x8d, 0x1e, 0x6a, 0x0f, 0x80, 0xa3, 0x84, + 0x7c, 0x53, 0x1d, 0xba, 0x96, 0xee, 0x65, 0xa2, 0x41, 0x89, 0xbd, 0x27, 0x12, + 0xe4, 0x0e, 0x95, 0x96, 0x64, 0x98, 0x1e, 0x58, 0xb2, 0xa4, 0xf9, 0x51, 0xef, + 0x8f, 0x49, 0x7d, 0xff, 0xf2, 0xf2, 0xf2, 0x71, 0xea, 0xb8, 0x9c, 0x62, 0x8e, + 0x18, 0xb5, 0xfc, 0xb4, 0x38, 0x82, 0x53, 0x7e, 0xaf, 0x6a, 0xd2, 0xa6, 0xb1, + 0x75, 0x46, 0x33, 0xca, 0xa8, 0x6b, 0xf2, 0xc7, 0x6f, 0x39, 0x93, 0x15, 0x4f, + 0xc7, 0x3e, 0x6f, 0xbb, 0xa2, 0x21, 0x0c, 0x27, 0x43, 0xf5, 0x30, 0xa4, 0x27, + 0x84, 0x9a, 0x30, 0x1e, 0x00, 0xe0, 0x11, 0x29, 0xf0, 0x3a, 0x46, 0x07, 0xf8, + 0x7c, 0xbe, 0x07, 0x62, 0xc0, 0xb1, 0xc6, 0x58, 0x55, 0xde, 0xba, 0x84, 0x22, + 0xca, 0x4b, 0x88, 0xab, 0xee, 0xa6, 0xa4, 0x38, 0x2c, 0xf1, 0x6c, 0xcd, 0x6d, + 0xc7, 0xc3, 0x7c, 0x44, 0xe5, 0x49, 0xc4, 0x53, 0x48, 0x19, 0xac, 0xd8, 0xbb, + 0x0a, 0x02, 0xa5, 0xfa, 0x7a, 0x1c, 0x1d, 0x38, 0x06, 0xfb, 0xc3, 0x40, 0x7f, + 0xd7, 0xda, 0x93, 0xfd, 0x0d, 0xe6, 0x40, 0x0d, 0x3a, 0xb8, 0x97, 0x74, 0x85, + 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, 0x7a, 0xdb, 0x2f, + 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, 0x99, 0xf2, 0x0f, + 0x26, 0x3b, 0x35, 0x9a, 0x11, 0x51, 0xa6, 0xb7, 0x5c, 0x01, 0x36, 0x5e, 0xb1, + 0x54, 0xae, 0x42, 0x14, 0x0d, 0x6e, 0x10, 0x34, 0x2f, 0x14, 0xf3, 0x4d, 0xc3, + 0x3e, 0x07, 0xff, 0x0e, 0x4d, 0x1a, 0x6b, 0xe3, 0x75, 0xb3, 0x2f, 0x84, 0xb9, + 0x2e, 0x5d, 0x81, 0xeb, 0xb6, 0x39, 0xc4, 0xf2, 0x7e, 0x71, 0x5a, 0xa4, 0x2c, + 0xc7, 0x57, 0x07, 0xd4, 0xeb, 0xd1, 0xbb, 0xfb, 0xe8, 0xf9, 0x0f, 0xc7, 0xc9, + 0x53, 0xe7, 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, 0x3d, 0x34, 0x51, + 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, 0x7a, 0xca, 0x14, + 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, 0xcc, 0x57, 0x9a, 0x7a, 0x8f, + 0xff, 0x7c, 0xa7, 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, 0xfc, 0x34, 0x15, 0x3b, + 0x2c, 0x3e, 0x8a, 0xfb, 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, 0x3b, 0xd5, 0xbc, + 0x87, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, 0x3f, 0xd1, 0xda, + 0xfb, 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, 0x11, 0x6d, 0x24, + 0x6a, 0xfe, 0x65, 0x0d, 0x84, 0x3c, 0xf8, 0x7a, 0xdf, 0xa0, 0x18, 0x04, 0x59, + 0x61, 0xa3, 0x75, 0xf8, 0x76, 0x21, 0x1e, 0x2d, 0xd0, 0xcd, 0xd4, 0x70, 0x6f, + 0xcc, 0x56, 0xa1, 0x87, 0xb1, 0x80, 0x2a, 0x25, 0x94, 0x44, 0x71, 0x9e, 0x30, + 0x22, 0x56, 0xee, 0x7a, 0xe8, 0x44, 0xf0, 0x3d, 0x20, 0x27, 0x3a, 0x67, 0x52, + 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x2e, 0x80, 0x80, + 0x0d, 0x0e, 0xda, 0xc6, 0xd2, 0xdc, 0x15, 0x69, 0x56, 0x0a, 0xda, 0x55, 0xd7, + 0x66, 0xd1, 0x46, 0x1d, 0x91, 0x3a, 0xe1, 0xf6, 0x98, 0x07, 0xa5, 0x78, 0x15, + 0x2f, 0xe0, 0x1f, 0x2f, 0xcc, 0x38, 0x4f, 0x59, 0x8f, 0xb1, 0xaf, 0x7c, 0x22, + 0x6f, 0xb8, 0xaa, 0xfe, 0xd5, 0x37, 0xa9, 0xc2, 0x65, 0x7e, 0xba, 0xc0, 0x3b, + 0xfc, 0x0b, 0x58, 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0x0d, 0x4d, 0x01, 0xdf, + 0x95, 0xc9, 0xbb, 0x7a, 0x10, 0x94, 0xd6, 0x57, 0x71, 0xa9, 0xbf, 0x98, 0xba, + 0x37, 0x60, 0x20, 0x74, 0x44, 0xa3, 0x04, 0xd7, 0x7b, 0xbe, 0xda, 0x6e, 0xae, + 0x16, 0x10, 0x0f, 0x45, 0x10, 0x8c, 0x6c, 0x6f, 0xae, 0x35, 0x9f, 0x64, 0x5c, + 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, 0xaf, 0x18, 0x77, 0x00, 0xc0, 0x82, + 0xdc, 0x47, 0x77, 0x40, 0xfb, 0x3f, 0x2c, 0xd7, 0xbb, 0x59, 0xfb, 0x35, 0x85, + 0x54, 0xe9, 0x4c, 0x7e, 0x67, 0x8c, 0xe0, 0x1a, 0xeb, 0xf9, 0x4e, 0x51, 0x5e, + 0x49, 0x72, 0x29, 0x67, 0x99, 0x5a, 0xea, 0x85, 0x8d, 0x64, 0xe7, 0x78, 0x9f, + 0xf3, 0x06, 0x36, 0x95, 0x77, 0x22, 0x81, 0x80, 0x32, 0x6a, 0x5b, 0x0a, 0xf4, + 0x75, 0xe2, 0x7a, 0x54, 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x76, 0x17, 0x0e, + 0x3f, 0xb0, 0x05, 0x02, 0x82, 0x61, 0xc9, 0x9c, 0x2d, 0xbd, 0x0e, 0xed, 0xee, + 0x87, 0x1c, 0x1c, 0x0f, 0x48, 0xb8, 0xe9, 0xb8, 0xe4, 0xbe, 0x77, 0xd1, 0xb7, + 0x37, 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, 0x55, 0xb5, 0xa6, + 0xcf, 0x61, 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, 0x27, 0xc2, 0x50, + 0xd1, 0x13, 0xb2, 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, 0x7d, 0xe4, 0x15, + 0xed, 0xb0, 0x80, 0x6c, 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, 0xca, 0x7e, 0xcd, + 0xc8, 0xda, 0x1b, 0xd5, 0x7a, 0x37, 0xf5, 0x5a, 0x46, 0x94, 0x0b, 0x45, 0xb2, + 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, 0x92, 0x7d, 0x1b, 0xd8, 0x60, 0xd4, 0x45, + 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, 0xe1, 0xd0, 0x01, 0x08, 0x02, 0x6c, + 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, 0xc3, 0x70, 0xbc, 0xe1, 0x8d, + 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, 0xd8, 0x02, 0xf7, 0x73, + 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0xf8, 0x18, 0xf9, 0x26, + 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, 0xfc, 0x0e, 0x70, 0x90, + 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, 0x0d, 0x22, 0x4a, 0xb7, 0xa1, 0x02, 0x4e, + 0x1d, 0x89, 0x3e, 0x74, 0x04, 0xfe, 0xdb, 0x34, 0x8e, 0x4d, 0x5e, 0x22, 0x35, + 0xc5, 0x9a, 0x78, 0x76, 0xa0, 0xfc, 0x60, 0x14, 0x5c, 0x6a, 0x00, 0x96, 0x87, + 0x68, 0x44, 0x60, 0x27, 0x1e, 0xe1, 0x33, 0xa4, 0x37, 0xfe, 0x52, 0xfb, 0x6c, + 0xfb, 0xa9, 0x7f, 0xce, 0xc1, 0x61, 0xdf, 0x51, 0x5d, 0xde, 0x90, 0x5a, 0x24, + 0xda, 0x6d, 0x37, 0xbd, 0xc3, 0x40, 0x44, 0xa9, 0x55, 0xe6, 0x82, 0xb4, 0x74, + 0x71, 0xca, 0x1e, 0x8c, 0x78, 0xc5, 0x1e, 0xd3, 0x77, 0xcd, 0x4a, 0xfa, 0x89, + 0x4b, 0xd9, 0xbd, 0x12, 0xe7, 0x07, 0x15, 0x6d, 0xa0, 0x72, 0x6f, 0x7c, 0xf5, + 0x72, 0x9f, 0xab, 0xe3, 0x72, 0x16, 0x04, 0x63, 0xfe, 0x04, 0x29, 0x24, 0x4d, + 0x06, 0x74, 0x89, 0xba, 0x5d, 0x09, 0x47, 0x2e, 0xcd, 0x9b, 0xcd, 0xc4, 0xd5, + 0xe4, 0xdf, 0x10, 0x1e, 0x18, 0x9d, 0xb8, 0x46, 0x3e, 0xb5, 0x38, 0x30, 0x7b, + 0x58, 0x7d, 0xef, 0xf7, 0x8d, 0xe9, 0xc7, 0x3a, 0xf2, 0x80, 0x80, 0xb2, 0xfd, + 0x05, 0x00, 0x3e, 0x11, 0xd3, 0xe1, 0xb3, 0x29, 0x9d, 0xc9, 0x52, 0x1f, 0x8b, + 0x51, 0x3b, 0xad, 0xb0, 0x10, 0xe9, 0x1b, 0xfe, 0xb9, 0x1b, 0x0b, 0x2a, 0x6c, + 0xb1, 0x29, 0xc2, 0xe8, 0x25, 0xa5, 0x97, 0xb8, 0xfb, 0x75, 0xbc, 0x56, 0x2d, + 0x65, 0x4d, 0x62, 0x10, 0x46, 0x40, 0xdd, 0x74, 0xe5, 0x6c, 0xd1, 0x4b, 0xaa, + 0xba, 0x56, 0x5b, 0x84, 0xb8, 0x45, 0xe1, 0x63, 0xd1, 0xca, 0xef, 0x25, 0x33, + 0xc3, 0x98, 0x16, 0x37, 0x20, 0x4f, 0x96, 0xa5, 0x9c, 0x8e, 0x80, 0x24, 0xd9, + 0x04, 0x1b, 0x20, 0x29, 0xe9, 0x4c, 0x15, 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, + 0xba, 0x3f, 0x38, 0x0a, 0x4d, 0x20, 0xf1, 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, + 0xff, 0x8f, 0x3d, 0x73, 0x45, 0x9a, 0xfe, 0x24, 0x1f, 0x72, 0x3c, 0x08, 0x48, + 0x23, 0x23, 0x0e, 0x00, 0x3d, 0x3d, 0x21, 0xe5, 0x35, 0x01, 0xec, 0x04, 0x99, + 0xb0, 0x83, 0xa7, 0xda, 0xd6, 0x85, 0xc5, 0x71, 0x27, 0xf4, 0xde, 0x64, 0x73, + 0x3a, 0x88, 0x0c, 0x2d, 0xb2, 0x8f, 0xda, 0xab, 0xf1, 0xb5, 0x42, 0xd2, 0x05, + 0xf6, 0x64, 0xa3, 0x51, 0x35, 0x71, 0x27, 0x11, 0xdc, 0xcc, 0xd9, 0x31, 0xa5, + 0x0b, 0x9c, 0x56, 0x61, 0x88, 0x23, 0x60, 0xd4, 0xca, 0xc0, 0x04, 0x76, 0x81, + 0xbc, 0x2e, 0x2b, 0x3b, 0xf6, 0xc9, 0x97, 0x60, 0xd7, 0xcf, 0xb4, 0xfa, 0x21, + 0x39, 0x43, 0x77, 0xa4, 0x55, 0x1c, 0x76, 0xd1, 0xf7, 0x5a, 0xc0, 0x3c, 0x26, + 0x20, 0x54, 0xdf, 0xfd, 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, + 0x9e, 0xea, 0x45, 0x01, 0xe2, 0x99, 0x0a, 0x53, 0xa5, 0xcd, 0x2a, 0x46, 0xa4, + 0x01, 0x57, 0x65, 0x88, 0xfd, 0x7d, 0x05, 0x8a, 0x26, 0xf2, 0x84, 0x38, 0xe5, + 0x78, 0x2f, 0x45, 0xac, 0x1d, 0x07, 0xf6, 0xf6, 0xf5, 0xed, 0x73, 0x74, 0x1d, + 0x57, 0x85, 0x83, 0x7a, 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, + 0xdd, 0x99, 0x08, 0x4e, 0x9f, 0x88, 0x03, 0xc9, 0x3a, 0xfc, 0xed, 0x83, 0x39, + 0x00, 0x00, 0xbf, 0x83, 0xfc, 0x07, 0x34, 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, + 0x93, 0x57, 0x14, 0xe2, 0x4a, 0xab, 0x56, 0x6f, 0x4f, 0x08, 0x42, 0x40, 0x14, + 0xc4, 0xec, 0xa9, 0x1b, 0x59, 0x0f, 0x08, 0x2b, 0x67, 0x3f, 0x36, 0x1c, 0x87, + 0x41, 0x5d, 0x37, 0xbd, 0x20, 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, 0x6d, 0xdf, 0x18, + 0x65, 0xf7, 0x66, 0x70, 0x2e, 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, 0x0e, 0xe8, + 0x59, 0x7a, 0xae, 0x19, 0x63, 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, 0xbe, + 0x32, 0xc6, 0x75, 0xbe, 0x18, 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, + 0x08, 0x9c, 0x28, 0x3f, 0x19, 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, + 0xf5, 0x00, 0x43, 0x4f, 0x28, 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, + 0xf1, 0x36, 0xa4, 0xc6, 0xa0, 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, + 0xae, 0x83, 0x88, 0x60, 0xad, 0xc8, 0x8a, 0xac, 0x1c, 0xe6, 0x13, 0x81, 0x64, + 0x3e, 0xec, 0xd2, 0xcf, 0x72, 0x24, 0x8f, 0x78, 0x6f, 0x43, 0xd3, 0x0d, 0x78, + 0x37, 0xd0, 0x48, 0xe2, 0x60, 0x12, 0xcb, 0xaa, 0x6c, 0xe7, 0xbb, 0x57, 0x8a, + 0x1f, 0x85, 0xf2, 0x7d, 0xc3, 0xe9, 0x3c, 0xe4, 0x5e, 0x25, 0x3a, 0xc5, 0x8c, + 0xf7, 0x2e, 0xe2, 0x42, 0x02, 0x60, 0x57, 0x72, 0x5d, 0x63, 0xea, 0xd2, 0xc0, + 0xc0, 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0x27, 0x0a, 0x67, 0xdf, 0xb3, 0x63, 0x47, + 0xc9, 0xcf, 0x6a, 0xe0, 0x61, 0xee, 0x62, 0xf6, 0x17, 0x69, 0xba, 0x38, 0x9d, + 0xc0, 0xa9, 0x6b, 0x8b, 0x04, 0x7a, 0xe3, 0xb4, 0x2b, 0x89, 0x6b, 0xb4, 0x1d, + 0xdb, 0x82, 0xf8, 0x78, 0xd9, 0xac, 0x7f, 0xfb, 0x0b, 0xd4, 0x39, 0x1d, 0xf1, + 0xd8, 0x79, 0x89, 0x9a, 0x3e, 0xf5, 0x7b, 0xfd, 0x0d, 0x1f, 0x77, 0x55, 0x64, + 0x8e, 0xdd, 0x85, 0xbb, 0x05, 0x2a, 0x4f, 0xa9, 0xe5, 0x1c, 0x2f, 0x35, 0xa4, + 0x81, 0x5d, 0xf9, 0x6d, 0xac, 0xac, 0x29, 0x0e, 0xdf, 0x16, 0x18, 0xa2, 0x5b, + 0xdd, 0x25, 0xc6, 0x73, 0x92, 0xb7, 0x96, 0x4d, 0x90, 0x3b, 0x92, 0x07, 0x50, + 0x38, 0x70, 0x59, 0x7b, 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, 0xa2, + 0xd4, 0x2e, 0xc9, 0x2b, 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, + 0x2a, 0xa1, 0xe7, 0x4f, 0x33, 0xf7, 0xc0, 0x97, 0x12, 0x26, 0xac, 0xcf, 0x7c, + 0x90, 0x37, 0xa5, 0x36, 0x84, 0x86, 0x77, 0x51, 0x68, 0x90, 0x90, 0x1c, 0xb6, + 0x1a, 0x9f, 0x09, 0x8b, 0x15, 0xd1, 0x5c, 0x9d, 0x32, 0x7a, 0x32, 0xb9, 0x30, + 0xa7, 0xcb, 0x12, 0x24, 0x78, 0xf8, 0x5a, 0x1c, 0x6c, 0x31, 0x1a, 0xee, 0x72, + 0x1c, 0x0b, 0xd2, 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, + 0xcd, 0x82, 0xc8, 0x0d, 0x36, 0x7e, 0x2e, 0xac, 0xcb, 0x1e, 0x6e, 0x63, 0x0d, + 0x9a, 0x6f, 0x44, 0x23, 0x59, 0xb5, 0x57, 0xf4, 0xa7, 0x77, 0xab, 0x1b, 0x15, + 0xea, 0xa1, 0x29, 0x47, 0x50, 0xd4, 0x06, 0x3a, 0x0c, 0x1e, 0x45, 0x9f, 0x1b, + 0xdc, 0xbf, 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, + 0x79, 0x87, 0x40, 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, + 0xa0, 0xae, 0x0f, ], - amounts: vec![1561051182746413, 1535468271734483], - script_pubkeys: vec![ - vec![0x65, 0x6a, 0x51, 0x6a, 0xac, 0x51, 0x6a, 0x65, 0x52], - vec![0x52], + txid: [ + 0x8c, 0x23, 0xea, 0xeb, 0x8f, 0x61, 0x22, 0x8c, 0x8b, 0x2f, 0x63, 0x3a, 0x7d, + 0xdc, 0xa1, 0x95, 0xc2, 0x71, 0x89, 0x13, 0xd5, 0x6b, 0x6f, 0x75, 0xc2, 0xef, + 0x52, 0x02, 0xa9, 0x67, 0x55, 0x61, ], - transparent_input: Some(1), + auth_digest: [ + 0xd3, 0x95, 0x72, 0xcb, 0x8a, 0x62, 0x3d, 0x50, 0x8c, 0xcb, 0xa0, 0xd2, 0x43, + 0x93, 0x73, 0x0e, 0xc3, 0x94, 0x02, 0x06, 0x3f, 0x2c, 0x50, 0xfe, 0x56, 0xcd, + 0xe8, 0xaa, 0xc1, 0xe9, 0x40, 0x24, + ], + amounts: vec![1180186385139632], + script_pubkeys: vec![vec![0xac, 0x00, 0xac, 0x6a, 0x53, 0x00, 0x00]], + transparent_input: Some(0), sighash_shielded: [ - 0x24, 0xa9, 0x1d, 0x01, 0x7e, 0x69, 0x1f, 0xe7, 0xd5, 0x80, 0xe3, 0xfc, 0x16, - 0x87, 0x2d, 0x61, 0x2c, 0x14, 0xbf, 0xcb, 0xe5, 0xe2, 0x72, 0x5e, 0x16, 0xd0, - 0x9e, 0xc0, 0xc1, 0xc9, 0x13, 0x05, + 0xfd, 0x8d, 0x30, 0x0c, 0x1c, 0xbb, 0xfe, 0x6e, 0xcf, 0x3d, 0x3a, 0xe3, 0x1a, + 0x98, 0xf2, 0x55, 0x3f, 0xa5, 0xbd, 0x1b, 0xb6, 0x4c, 0x8a, 0xda, 0x81, 0x8f, + 0x06, 0xb4, 0x8c, 0x79, 0xde, 0x4c, ], sighash_all: Some([ - 0x2b, 0xea, 0x7c, 0x00, 0xcf, 0x77, 0xfa, 0x59, 0xa6, 0x3a, 0xb0, 0xbd, 0x3e, - 0xb7, 0xb1, 0x06, 0x59, 0xf8, 0xfc, 0x9e, 0x4c, 0x48, 0x94, 0xba, 0xfc, 0x37, - 0x64, 0x0e, 0x86, 0x55, 0xf5, 0x62, + 0x74, 0xe4, 0xe7, 0x22, 0x42, 0x49, 0x22, 0x07, 0x94, 0xae, 0x08, 0xba, 0x5e, + 0xdf, 0x96, 0xcd, 0x84, 0x18, 0xfc, 0x82, 0x9f, 0xdf, 0xd2, 0xf1, 0x51, 0x62, + 0xb7, 0x7c, 0x11, 0x01, 0x37, 0x04, ]), sighash_none: Some([ - 0xe6, 0x36, 0x03, 0xea, 0xde, 0x7d, 0xde, 0x98, 0xef, 0x0e, 0xd6, 0x8d, 0xe6, - 0x40, 0x70, 0x7d, 0xf6, 0xcc, 0x9c, 0x33, 0x78, 0x37, 0xbc, 0xbd, 0xcd, 0xe0, - 0x5a, 0x07, 0xff, 0x7d, 0x87, 0x3b, + 0x1a, 0x33, 0xce, 0x50, 0x7d, 0x53, 0x74, 0xe5, 0x6b, 0x00, 0xcb, 0x88, 0xb9, + 0xcc, 0x85, 0xda, 0xb5, 0x89, 0xf1, 0xe2, 0x2d, 0x92, 0x77, 0xdb, 0x69, 0x58, + 0xf7, 0xce, 0x1a, 0x8a, 0x47, 0x02, ]), sighash_single: Some([ - 0xe4, 0xb2, 0xf9, 0x8a, 0xd7, 0xb5, 0x5f, 0xb2, 0x56, 0xa1, 0x29, 0x23, 0x30, - 0x3a, 0xbc, 0xae, 0xee, 0x38, 0x35, 0x10, 0x90, 0xe9, 0x76, 0xb0, 0x19, 0x5d, - 0xd7, 0x5b, 0xdc, 0xf9, 0x4a, 0xd9, + 0x26, 0xa1, 0xbe, 0x98, 0xd2, 0xb0, 0x84, 0xb2, 0xc3, 0x6f, 0x77, 0x6c, 0xfb, + 0xe3, 0x18, 0x3c, 0xf1, 0x82, 0xf4, 0xe8, 0xdd, 0x29, 0x21, 0x5f, 0x00, 0x98, + 0x0d, 0xac, 0x17, 0x75, 0xf7, 0x2a, ]), sighash_all_anyone: Some([ - 0x61, 0xc7, 0x05, 0xd5, 0x50, 0x5f, 0x0d, 0x5c, 0xfb, 0x3a, 0x28, 0x51, 0x9d, - 0x79, 0x1f, 0x14, 0x57, 0x70, 0x4f, 0x7b, 0x38, 0x39, 0x2e, 0xff, 0x88, 0x5a, - 0x82, 0x07, 0xfa, 0x68, 0x3c, 0x57, + 0x4a, 0x32, 0x56, 0x8d, 0x12, 0xc2, 0xc7, 0x40, 0xef, 0xb4, 0x4b, 0xbd, 0xa6, + 0x39, 0x36, 0x4e, 0xe9, 0x9b, 0xce, 0x7d, 0xe7, 0xc0, 0xcf, 0x22, 0x6e, 0xd1, + 0x44, 0xe8, 0xd2, 0xd0, 0xd0, 0xa8, ]), sighash_none_anyone: Some([ - 0xf3, 0x5e, 0xa9, 0xbe, 0xb0, 0xb7, 0xed, 0x68, 0x2d, 0x27, 0xef, 0x78, 0xdd, - 0xe1, 0x17, 0x8d, 0x6a, 0x55, 0xf3, 0x07, 0xc8, 0x51, 0x21, 0xcd, 0x83, 0x02, - 0x58, 0xd8, 0x9d, 0x33, 0xcd, 0xd1, + 0x2c, 0xf4, 0xfb, 0xd3, 0x2a, 0x88, 0x62, 0x4f, 0x16, 0x4a, 0x87, 0x0c, 0x59, + 0x37, 0xe3, 0x8f, 0x55, 0x23, 0xc4, 0xaf, 0x06, 0x08, 0x1c, 0xae, 0x64, 0x06, + 0x36, 0x8e, 0x4c, 0x5d, 0xcf, 0x21, ]), sighash_single_anyone: Some([ - 0xae, 0xce, 0x3f, 0x45, 0x76, 0x98, 0x76, 0xd8, 0x7b, 0x50, 0x47, 0x8b, 0x90, - 0xcd, 0x5e, 0x3b, 0x37, 0xb7, 0xf4, 0xc5, 0x5b, 0x38, 0xf7, 0x56, 0xa5, 0x74, - 0x86, 0xa3, 0x10, 0x61, 0xdf, 0xa8, + 0x1b, 0x7d, 0xfa, 0x1f, 0x21, 0x6f, 0x7f, 0x52, 0xfc, 0x66, 0x6f, 0xb8, 0x35, + 0xbc, 0xa1, 0x6d, 0xd7, 0xbe, 0xd5, 0x5a, 0xf0, 0xf5, 0x36, 0x8b, 0x85, 0x46, + 0xbe, 0x84, 0x6a, 0xd8, 0xa1, 0xf9, ]), }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x47, - 0x23, 0x62, 0x29, 0x87, 0xd8, 0xd7, 0x04, 0x00, 0x00, 0x02, 0xac, 0xa3, 0xc4, - 0xc6, 0x43, 0x3b, 0x1d, 0xa6, 0x05, 0x95, 0xc2, 0xba, 0xfc, 0x72, 0x2b, 0x38, - 0xe7, 0x91, 0x0f, 0x63, 0x61, 0x6b, 0x22, 0xc9, 0xd6, 0x77, 0xb1, 0x79, 0x79, - 0x56, 0x6d, 0xb2, 0x14, 0x9b, 0x1d, 0x99, 0x34, 0x1e, 0x4e, 0x6f, 0x91, 0x20, - 0xf4, 0xd4, 0x1e, 0x62, 0x91, 0x85, 0x00, 0x2c, 0x72, 0xc0, 0x12, 0xc4, 0x14, - 0xd2, 0x38, 0x2a, 0x6d, 0x47, 0xc7, 0xb3, 0xde, 0xab, 0x59, 0x1e, 0xff, 0xf3, - 0x60, 0xfe, 0x11, 0x99, 0x05, 0x6c, 0x56, 0xe5, 0xfe, 0xec, 0x61, 0xa7, 0xb8, - 0xb9, 0xf6, 0x99, 0xd6, 0x01, 0x2c, 0x28, 0x49, 0x23, 0x2f, 0x32, 0x9f, 0xef, - 0x95, 0xc7, 0xd1, 0x81, 0x17, 0x2c, 0x28, 0x4c, 0xe8, 0xa4, 0xb3, 0x22, 0x96, - 0x1a, 0xd7, 0x81, 0xa5, 0xb9, 0x73, 0x6d, 0x7f, 0x12, 0xe8, 0x64, 0x34, 0x53, - 0xc1, 0x05, 0xa7, 0x9a, 0x9f, 0x5a, 0xe0, 0x09, 0xfa, 0x1a, 0xe6, 0xc2, 0x5a, - 0x94, 0x62, 0xeb, 0xcb, 0xb0, 0xfd, 0x5f, 0x14, 0x55, 0x4b, 0xc9, 0x77, 0x47, - 0xc3, 0x3e, 0x34, 0xda, 0x90, 0xc8, 0x16, 0xd8, 0xd0, 0xd5, 0x0b, 0xfe, 0x37, - 0x61, 0x8c, 0x58, 0x12, 0x89, 0x14, 0x84, 0xfa, 0x25, 0x93, 0x22, 0xc1, 0x50, - 0x92, 0xd4, 0x15, 0x5d, 0x86, 0x96, 0xd6, 0xf1, 0x2f, 0x24, 0xfd, 0x36, 0x44, - 0x96, 0xb3, 0xbe, 0x08, 0x71, 0xca, 0x3d, 0x02, 0xd2, 0xb6, 0xbc, 0xd5, 0x9e, - 0xad, 0x5e, 0x27, 0xe8, 0x3e, 0xf2, 0xd4, 0x40, 0x87, 0x54, 0xe9, 0x00, 0x31, - 0x61, 0x87, 0x76, 0x69, 0xe1, 0xa4, 0xd8, 0x50, 0xbf, 0x9f, 0xc1, 0xc2, 0x31, - 0x85, 0x4d, 0x03, 0x7e, 0x26, 0x2f, 0x9a, 0x9f, 0x9b, 0xd8, 0x90, 0x44, 0x67, - 0xea, 0xea, 0xd8, 0x3f, 0x09, 0x38, 0xe2, 0x6e, 0x34, 0x5f, 0x9c, 0xc6, 0x95, - 0x98, 0x5f, 0x00, 0xa1, 0x25, 0x5a, 0x0a, 0x4f, 0x95, 0xdb, 0x9d, 0xad, 0xcd, - 0xb7, 0xc2, 0x40, 0x89, 0x9a, 0xea, 0x27, 0x83, 0xc2, 0xd2, 0x1c, 0x2d, 0x32, - 0x79, 0xf8, 0x86, 0xf7, 0xab, 0x3d, 0x4e, 0x8a, 0xf5, 0x38, 0x1f, 0xa0, 0xb0, - 0x18, 0x48, 0xf1, 0xab, 0x14, 0xad, 0x33, 0x4f, 0x2b, 0x68, 0x03, 0x58, 0x08, - 0xcd, 0xf1, 0xbb, 0x9e, 0x9d, 0x9a, 0x81, 0x6b, 0xaf, 0x72, 0x8a, 0x95, 0x5b, - 0x96, 0x0b, 0x77, 0x01, 0xfa, 0x62, 0x66, 0x87, 0xdc, 0x3c, 0x9c, 0xba, 0x64, - 0x63, 0x37, 0xb5, 0x3e, 0x29, 0x81, 0x6e, 0x94, 0x82, 0xdd, 0xf5, 0x57, 0x8a, - 0x87, 0x68, 0xaa, 0xe4, 0x77, 0xfc, 0xe4, 0x10, 0xac, 0x2d, 0x5d, 0xe6, 0x09, - 0x58, 0x61, 0xc1, 0x11, 0xd7, 0xfe, 0xb3, 0xe6, 0xbb, 0x4f, 0xbb, 0x5a, 0x54, - 0x95, 0x54, 0x95, 0x97, 0x27, 0x98, 0x35, 0x0a, 0x25, 0x3f, 0x05, 0xf6, 0x6c, - 0x2e, 0xcf, 0xcb, 0xc0, 0xed, 0x43, 0xf5, 0xec, 0x2e, 0x6d, 0x8d, 0xba, 0x15, - 0xa5, 0x12, 0x54, 0xd9, 0x7b, 0x18, 0x21, 0x10, 0x7c, 0x07, 0xdd, 0x9a, 0x16, - 0xef, 0x84, 0x06, 0xf9, 0x43, 0xe2, 0x82, 0xb9, 0x5d, 0x4b, 0x36, 0x25, 0x30, - 0xc9, 0x13, 0xd6, 0xba, 0x42, 0x1d, 0xf6, 0x02, 0x7d, 0xe5, 0xaf, 0x1e, 0x47, - 0x45, 0xd5, 0x86, 0x81, 0x06, 0x95, 0x4b, 0xe6, 0xc1, 0x96, 0x27, 0x80, 0xa2, - 0x94, 0x10, 0x72, 0xe9, 0x51, 0x31, 0xb1, 0x67, 0x9d, 0xf0, 0x63, 0x76, 0x25, - 0x04, 0x2c, 0x37, 0xd4, 0x8f, 0xfb, 0x15, 0x2e, 0x5e, 0xbc, 0x18, 0x5c, 0x8a, - 0x2b, 0x7d, 0x43, 0x85, 0xf1, 0xc9, 0x5a, 0xf9, 0x37, 0xdf, 0x78, 0xdf, 0xd8, - 0x75, 0x7f, 0xab, 0x43, 0x49, 0x68, 0xb0, 0xb5, 0x7c, 0x66, 0x57, 0x44, 0x68, - 0xf1, 0x60, 0xb4, 0x47, 0xac, 0x82, 0x21, 0xe5, 0x06, 0x06, 0x76, 0xa8, 0x42, - 0xa1, 0xc6, 0xb7, 0x17, 0x2d, 0xd3, 0x34, 0x0f, 0x76, 0x40, 0x70, 0xab, 0x1f, - 0xe0, 0x91, 0xc5, 0xc7, 0x4c, 0x95, 0xa5, 0xdc, 0x04, 0x33, 0x90, 0x72, 0x3a, - 0x4c, 0x12, 0x7d, 0xa1, 0x4c, 0xdd, 0xe1, 0xdc, 0x26, 0x75, 0xa6, 0x23, 0x40, - 0xb3, 0xe6, 0xaf, 0xd0, 0x52, 0x2a, 0x31, 0xde, 0x26, 0xe7, 0xd1, 0xec, 0x3a, - 0x9c, 0x8a, 0x09, 0x1f, 0xfd, 0xc7, 0x5b, 0x7e, 0xcf, 0xdc, 0x7c, 0x12, 0x99, - 0x5a, 0x5e, 0x37, 0xce, 0x34, 0x88, 0xbd, 0x29, 0xf8, 0x62, 0x9d, 0x68, 0xf6, - 0x96, 0x49, 0x24, 0x48, 0xdd, 0x52, 0x66, 0x97, 0x47, 0x6d, 0xc0, 0x61, 0x34, - 0x6e, 0xbe, 0x3f, 0x67, 0x72, 0x17, 0xff, 0x9c, 0x60, 0xef, 0xce, 0x94, 0x3a, - 0xf2, 0x8d, 0xfd, 0x3f, 0x9e, 0x59, 0x69, 0x25, 0x98, 0xa6, 0x04, 0x7c, 0x23, - 0xc4, 0xc0, 0x14, 0x00, 0xf1, 0xab, 0x57, 0x30, 0xea, 0xc0, 0xae, 0x8d, 0x58, - 0x43, 0xd5, 0x05, 0x1c, 0x37, 0x62, 0x40, 0x17, 0x2a, 0xf2, 0x18, 0xd7, 0xa1, - 0xec, 0xfe, 0x65, 0xb4, 0xf7, 0x51, 0x00, 0x63, 0x89, 0x83, 0xc1, 0x4d, 0xe4, - 0x97, 0x47, 0x55, 0xda, 0xde, 0x80, 0x18, 0xc9, 0xb8, 0xf4, 0x54, 0x3f, 0xb0, - 0x95, 0x96, 0x15, 0x13, 0xe6, 0x7c, 0x61, 0xdb, 0xc5, 0x9c, 0x60, 0x7f, 0x9b, - 0x51, 0xf8, 0xd0, 0x9b, 0xdc, 0xad, 0x28, 0xbc, 0xfb, 0x9e, 0x5d, 0x27, 0x44, - 0xea, 0x88, 0x48, 0xb2, 0x62, 0x3a, 0xc0, 0x7f, 0x8e, 0xf6, 0x1a, 0x81, 0xa3, - 0x59, 0x10, 0xb8, 0xa1, 0xba, 0xf3, 0x9a, 0x91, 0x9a, 0x7b, 0x60, 0xbc, 0x60, - 0x4d, 0x63, 0x18, 0x5f, 0x75, 0x92, 0x21, 0xd8, 0x47, 0xcc, 0x54, 0xa2, 0x27, - 0x65, 0xa4, 0xc3, 0x34, 0x75, 0xb5, 0x79, 0x1e, 0x9a, 0xf3, 0x27, 0x1f, 0xc8, - 0xd9, 0x35, 0x06, 0x67, 0x09, 0x0d, 0x81, 0x84, 0xec, 0x50, 0x52, 0x2d, 0x80, - 0x4f, 0x23, 0xc4, 0xfb, 0x44, 0xff, 0xa4, 0x81, 0xbc, 0x92, 0xae, 0x40, 0x8d, - 0x1b, 0x9f, 0x2b, 0x13, 0x19, 0x04, 0xf9, 0x70, 0x5c, 0x59, 0xe2, 0xf4, 0xbd, - 0xe7, 0xa3, 0xb2, 0xc0, 0x85, 0xd9, 0x3f, 0xd2, 0xab, 0xc5, 0xe1, 0x4d, 0x16, - 0x30, 0x01, 0xa1, 0x2f, 0x51, 0x93, 0x8d, 0x02, 0x1a, 0xfa, 0x92, 0x23, 0x9b, - 0x87, 0x3d, 0xc6, 0xc3, 0x57, 0xea, 0xa8, 0xaf, 0x4e, 0xe6, 0xd0, 0x05, 0x40, - 0x65, 0x7f, 0xe3, 0x29, 0x14, 0x10, 0x3b, 0x5d, 0x98, 0xf6, 0x8b, 0xd3, 0xe2, - 0xb5, 0x35, 0x9f, 0x08, 0xcc, 0xd8, 0x8d, 0x0c, 0x81, 0x1e, 0x4c, 0x31, 0xfb, - 0xb4, 0x9f, 0x3a, 0x90, 0xbb, 0xd0, 0x5d, 0xce, 0x62, 0xf3, 0x44, 0xe7, 0x07, - 0x75, 0x93, 0x15, 0x9a, 0xe3, 0x50, 0x50, 0xb0, 0x4c, 0x9e, 0x6b, 0x86, 0xbc, - 0x43, 0x2d, 0xc8, 0xb0, 0x48, 0xc7, 0x3c, 0x00, 0x18, 0xca, 0x5b, 0x69, 0x41, - 0x12, 0x97, 0x73, 0x2a, 0x4e, 0x1a, 0xa9, 0x9a, 0x92, 0x8c, 0x71, 0xe7, 0xa2, - 0x4f, 0xd2, 0x77, 0x85, 0x6a, 0xa4, 0x25, 0x01, 0xe5, 0x1b, 0x01, 0x2a, 0xea, - 0x94, 0x46, 0xa2, 0x10, 0x4e, 0x93, 0xf8, 0x15, 0xa0, 0xb3, 0xa2, 0x9b, 0x45, - 0x83, 0x14, 0xf3, 0xd8, 0xbe, 0x2b, 0x98, 0x23, 0xd3, 0x42, 0x15, 0x05, 0xff, - 0x6d, 0x88, 0x90, 0xe9, 0x04, 0xa2, 0x4a, 0x7d, 0xe9, 0x51, 0xa2, 0xa1, 0xc6, - 0x4e, 0xd2, 0xe4, 0xf9, 0xe9, 0xa5, 0x16, 0x5e, 0xba, 0x47, 0x99, 0xce, 0xfe, - 0xb5, 0xd1, 0x48, 0x00, 0x55, 0x45, 0xf9, 0xb5, 0xfb, 0x0e, 0xec, 0x65, 0x03, - 0xfe, 0xbb, 0xdd, 0x26, 0xa2, 0x38, 0x51, 0x43, 0x83, 0x73, 0x4a, 0xfe, 0xc8, - 0xa4, 0x81, 0xcf, 0xb2, 0xfe, 0x1f, 0xf9, 0x2f, 0x1e, 0xa7, 0x84, 0x07, 0xb4, - 0x07, 0xc6, 0xb8, 0x4a, 0x21, 0x4e, 0xf6, 0x07, 0xcc, 0x59, 0x04, 0xd9, 0xe8, - 0xc7, 0x3f, 0xeb, 0xff, 0xa0, 0x1c, 0x2b, 0x17, 0x79, 0xdc, 0x42, 0x0f, 0x08, - 0x9e, 0xad, 0xe2, 0x0b, 0x69, 0xd5, 0xd7, 0xc4, 0x3c, 0xeb, 0x73, 0x6b, 0x68, - 0x31, 0xe8, 0xc1, 0x10, 0xf1, 0x6c, 0xfd, 0xb3, 0xa4, 0x67, 0xe9, 0x41, 0x4c, - 0x00, 0xec, 0xf1, 0x37, 0x31, 0x50, 0x08, 0x94, 0x55, 0x56, 0x78, 0xc4, 0x97, - 0xfa, 0xba, 0x9a, 0x95, 0xd0, 0x1c, 0xc4, 0x64, 0x39, 0x0f, 0xc4, 0xa7, 0x6b, - 0xfa, 0x8b, 0x0e, 0x1c, 0x68, 0xa5, 0x25, 0xd7, 0x06, 0xd6, 0x60, 0x4b, 0x23, - 0x30, 0xb6, 0xb3, 0x48, 0x52, 0x15, 0xf6, 0x06, 0xf1, 0x88, 0x3a, 0x75, 0x15, - 0x88, 0xc7, 0xef, 0xa5, 0x06, 0xc3, 0xe8, 0xd0, 0xc6, 0x01, 0x92, 0xe8, 0x47, - 0x6b, 0xd1, 0x17, 0x5d, 0x95, 0x62, 0x08, 0x7b, 0xdb, 0x81, 0x8e, 0x66, 0x21, - 0x62, 0x86, 0xba, 0xfe, 0x47, 0xff, 0x4d, 0xbc, 0xce, 0xd5, 0x14, 0x44, 0x48, - 0x0a, 0x9a, 0x56, 0x73, 0xec, 0xe7, 0xfa, 0xc7, 0x3a, 0x0e, 0xd4, 0x1a, 0xb0, - 0x05, 0x17, 0x53, 0xa7, 0xca, 0xa8, 0x9b, 0xe3, 0x13, 0x9a, 0xfd, 0x97, 0x93, - 0xb3, 0xe0, 0x2f, 0x27, 0xf0, 0x40, 0x04, 0x65, 0x95, 0xac, 0xd4, 0x7b, 0xf1, - 0x3f, 0xd0, 0xda, 0x27, 0xf0, 0x9e, 0xda, 0x48, 0x03, 0x6d, 0x3e, 0xe4, 0x37, - 0xf2, 0xee, 0x8f, 0x86, 0x06, 0xea, 0x97, 0x34, 0x3c, 0x33, 0x58, 0x46, 0x57, - 0xf4, 0x6d, 0xba, 0x99, 0xdb, 0x5c, 0xfe, 0x6c, 0xa1, 0x76, 0xfa, 0xb7, 0xb0, - 0xf3, 0xbf, 0xa0, 0xab, 0x61, 0xe3, 0x40, 0xc3, 0x4e, 0xb9, 0xf1, 0x7c, 0x7e, - 0xc2, 0xbe, 0x03, 0xb1, 0x80, 0xf0, 0xbb, 0x6f, 0x43, 0x4c, 0x2a, 0x65, 0x42, - 0xe0, 0x0e, 0x84, 0x37, 0x3f, 0x4f, 0x46, 0x49, 0xcd, 0xa3, 0x2b, 0xf6, 0x86, - 0x66, 0x61, 0x43, 0xf6, 0x22, 0xaa, 0x48, 0x04, 0x60, 0xb5, 0xaf, 0xac, 0x51, - 0x86, 0x07, 0xcd, 0x9a, 0xf8, 0xbc, 0xd6, 0xb5, 0x8c, 0x30, 0x12, 0x73, 0x16, - 0xb2, 0x5d, 0x5e, 0xa7, 0xbf, 0x6b, 0x0c, 0xab, 0x85, 0x42, 0xff, 0x69, 0xd9, - 0xb2, 0xf1, 0x80, 0xbe, 0x12, 0xed, 0x75, 0x34, 0x4a, 0x39, 0x5a, 0xa1, 0x0f, - 0x85, 0x2f, 0x08, 0x3a, 0xd6, 0x4e, 0xf4, 0x0e, 0x9c, 0x03, 0x09, 0xe9, 0xbb, - 0xa5, 0x4b, 0x8c, 0xb3, 0x3c, 0x95, 0x49, 0x8a, 0x69, 0x53, 0x8d, 0x3a, 0xe5, - 0xb2, 0x5e, 0x24, 0x70, 0x98, 0x30, 0x6f, 0xa8, 0xc7, 0x4a, 0x8e, 0xe5, 0xbc, - 0xa9, 0x41, 0x53, 0x1d, 0x61, 0xaa, 0xc2, 0x7a, 0xab, 0x3d, 0xc5, 0x61, 0x7d, - 0x56, 0x06, 0xc9, 0x57, 0x7a, 0x2a, 0x83, 0x46, 0xe8, 0xd8, 0x5b, 0x32, 0xb8, - 0x50, 0x57, 0x75, 0x10, 0x8d, 0xc8, 0x5e, 0x2a, 0xde, 0x2e, 0xac, 0x1e, 0x63, - 0x6e, 0x1a, 0xf4, 0x05, 0x4c, 0x8b, 0x6f, 0x57, 0x63, 0x2d, 0xf2, 0x69, 0xc3, - 0x72, 0x3b, 0x32, 0x08, 0x72, 0xe4, 0xc5, 0x7b, 0x21, 0x83, 0x58, 0xdc, 0x7e, - 0x99, 0x05, 0xbb, 0x04, 0xed, 0xf9, 0x2e, 0xdf, 0x0d, 0xf6, 0x35, 0xf3, 0xbf, - 0x36, 0x1e, 0x57, 0xa1, 0x32, 0x96, 0xe1, 0x44, 0x7a, 0xf5, 0x08, 0x78, 0x72, - 0xd6, 0x36, 0xe2, 0x75, 0x18, 0xa9, 0x87, 0x6e, 0x15, 0xeb, 0x01, 0xf5, 0xe8, - 0xde, 0xd8, 0x18, 0x92, 0x51, 0x1c, 0xc2, 0x85, 0x1b, 0x00, 0xb8, 0x32, 0x71, - 0x2a, 0x6d, 0x3b, 0xa5, 0x66, 0x65, 0x17, 0xbc, 0xd3, 0x56, 0x76, 0x21, 0xa7, - 0xcf, 0x84, 0x45, 0x58, 0x96, 0x53, 0x26, 0x20, 0x20, 0xc3, 0x3b, 0xf7, 0x80, - 0x31, 0xb8, 0xee, 0x07, 0x07, 0xde, 0x07, 0x20, 0x68, 0xc1, 0x70, 0x57, 0x03, - 0x27, 0xe6, 0xd9, 0xf5, 0xc6, 0xdd, 0xc3, 0x35, 0x40, 0x2e, 0xfc, 0x54, 0x88, - 0x62, 0xf5, 0xa0, 0x70, 0x94, 0xfd, 0x42, 0x8a, 0x7b, 0xbc, 0x15, 0xd7, 0xb3, - 0x8d, 0x05, 0x36, 0x2c, 0x9c, 0xa9, 0x85, 0xf5, 0x8a, 0x76, 0x64, 0x7d, 0x2b, - 0xe4, 0xc2, 0xcd, 0x6b, 0x3d, 0x17, 0xd6, 0x87, 0x09, 0x71, 0xd7, 0xa0, 0x98, - 0xba, 0xf7, 0x2c, 0x6f, 0x6f, 0x12, 0x14, 0xcf, 0x1f, 0xaa, 0xe4, 0x88, 0xbd, - 0x7d, 0xe2, 0x59, 0xd3, 0x41, 0x5c, 0x2f, 0x0d, 0xde, 0xc7, 0x45, 0x70, 0x04, - 0xf3, 0x57, 0x08, 0xd1, 0xec, 0xcc, 0xcc, 0x0d, 0xf6, 0x5a, 0x04, 0x94, 0x3a, - 0xd5, 0xcb, 0xc1, 0x3f, 0x29, 0x5f, 0x00, 0x0f, 0xe0, 0x56, 0xc4, 0x0b, 0x2d, - 0x88, 0xf2, 0x7d, 0xc3, 0x4c, 0xfe, 0xb8, 0x03, 0xbe, 0x34, 0x83, 0xa9, 0xeb, - 0xf9, 0xb5, 0xa9, 0x02, 0x60, 0x57, 0x72, 0x5d, 0x63, 0xea, 0xd2, 0xc0, 0xc0, - 0xff, 0x1f, 0xe2, 0x6a, 0xc1, 0xe7, 0xbd, 0xfc, 0xd6, 0xfa, 0xd8, 0x75, 0x84, - 0x2d, 0x19, 0x4f, 0x33, 0x17, 0x50, 0x46, 0x2c, 0x06, 0xb8, 0xd7, 0x98, 0x2d, - 0x67, 0x99, 0x5e, 0xd5, 0xd3, 0xae, 0x96, 0xa0, 0x5a, 0xe0, 0x06, 0x7f, 0x4e, - 0xb1, 0xc7, 0xc9, 0x32, 0x31, 0xbd, 0x39, 0x77, 0x3c, 0xbe, 0x0a, 0x9d, 0x33, - 0xa0, 0xa4, 0x0b, 0x10, 0x1d, 0x02, 0x00, 0x77, 0xd9, 0x7c, 0xe4, 0x24, 0x01, - 0x3d, 0x64, 0xb4, 0xd0, 0xd2, 0x72, 0xec, 0x01, 0x94, 0x6b, 0x7a, 0x5e, 0xed, - 0xfa, 0xb4, 0xd6, 0x8c, 0xd6, 0xd1, 0xb2, 0x66, 0x7d, 0x04, 0xb2, 0x9d, 0x0c, - 0xaf, 0x37, 0x00, 0x98, 0xff, 0xe4, 0x91, 0x8e, 0x0c, 0xa1, 0xdf, 0x47, 0xf2, - 0x75, 0x86, 0x7b, 0x73, 0x9e, 0x0a, 0x51, 0x4d, 0x32, 0x09, 0x32, 0x5e, 0x21, - 0x70, 0x45, 0x92, 0x7b, 0x47, 0x9c, 0x1c, 0xe2, 0xe5, 0xd5, 0x4f, 0x25, 0x48, - 0x8c, 0xad, 0x15, 0x13, 0xe3, 0xf4, 0x4a, 0x21, 0x26, 0x6c, 0xfd, 0x84, 0x16, - 0x33, 0x32, 0x7d, 0xee, 0x6c, 0xf8, 0x10, 0xfb, 0xf7, 0x39, 0x3e, 0x31, 0x7d, - 0x9e, 0x53, 0xd1, 0xbe, 0x1d, 0x5a, 0xe7, 0x83, 0x9b, 0x66, 0xb9, 0x43, 0xb9, - 0xed, 0x18, 0xf2, 0xc5, 0x30, 0xe9, 0x75, 0x42, 0x23, 0x32, 0xc3, 0x43, 0x9c, - 0xce, 0x49, 0xa2, 0x9f, 0x2a, 0x33, 0x6a, 0x48, 0x51, 0x26, 0x3c, 0x5e, 0x9b, - 0xd1, 0x3d, 0x73, 0x11, 0x09, 0xe8, 0x44, 0xb7, 0xf8, 0xc3, 0x92, 0xa5, 0xc1, - 0xdc, 0xaa, 0x2a, 0xe5, 0xf5, 0x0f, 0xf6, 0x3f, 0xab, 0x97, 0x65, 0xe0, 0x16, - 0x70, 0x2c, 0x35, 0xa6, 0x7c, 0xd7, 0x36, 0x4d, 0x3f, 0xab, 0x55, 0x2f, 0xb3, - 0x49, 0xe3, 0x5c, 0x15, 0xc5, 0x02, 0x50, 0x45, 0x3f, 0xd1, 0x8f, 0x7b, 0x85, - 0x59, 0x92, 0x63, 0x2e, 0x2c, 0x76, 0xc0, 0xfb, 0xf1, 0xef, 0x96, 0x3e, 0xa8, - 0x0e, 0x32, 0x23, 0xde, 0x32, 0x77, 0xbc, 0x55, 0x92, 0x51, 0x72, 0x58, 0x29, - 0xec, 0x03, 0xf2, 0x13, 0xba, 0x89, 0x55, 0xca, 0xb2, 0x82, 0xd9, 0x62, 0x53, - 0x48, 0xa6, 0x14, 0xb5, 0x9b, 0xde, 0x45, 0x88, 0x56, 0x49, 0xba, 0xe3, 0x6d, - 0xe3, 0x4d, 0xef, 0x8f, 0xce, 0xc8, 0x53, 0x43, 0x47, 0x5d, 0x97, 0x6a, 0xe1, - 0xe9, 0xb2, 0x78, 0x29, 0xce, 0x2a, 0xc5, 0xef, 0xd0, 0xb3, 0x99, 0xa8, 0xb4, - 0x48, 0xbe, 0x65, 0x04, 0x29, 0x4e, 0xe6, 0xb3, 0xc1, 0xc6, 0xa5, 0x34, 0x2d, - 0x7c, 0x01, 0xae, 0x9d, 0x8a, 0xd3, 0x07, 0x0c, 0x2b, 0x1a, 0x91, 0x57, 0x3a, - 0xf5, 0xe0, 0xc5, 0xe4, 0xcb, 0xbf, 0x4a, 0xcd, 0xc6, 0xb5, 0x4c, 0x92, 0x72, - 0x20, 0x0d, 0x99, 0x70, 0x25, 0x0c, 0x17, 0xc1, 0x03, 0x6f, 0x06, 0x08, 0x5c, - 0x41, 0x85, 0x8e, 0xd3, 0xa0, 0xc4, 0x81, 0x50, 0xbc, 0x69, 0x7e, 0x4a, 0x69, - 0x5f, 0xef, 0x33, 0x5f, 0x7a, 0xd0, 0x7e, 0x1a, 0x46, 0xdc, 0x76, 0x7f, 0xf8, - 0x22, 0xdb, 0x70, 0xe6, 0x66, 0x90, 0x80, 0xb9, 0x81, 0x6b, 0x22, 0x32, 0xc8, - 0x1a, 0x4c, 0x66, 0xcc, 0x58, 0x6a, 0xbf, 0xe1, 0xea, 0xa8, 0xca, 0x6c, 0xf4, - 0x1f, 0xc3, 0xc3, 0xe6, 0xc7, 0xb8, 0x86, 0xfb, 0x6d, 0xac, 0x9f, 0x48, 0x22, - 0xb4, 0xfc, 0x6f, 0xff, 0x9d, 0x05, 0x13, 0xd6, 0x1a, 0x21, 0xc8, 0x0a, 0x37, - 0x76, 0x71, 0xd1, 0x35, 0xa6, 0x68, 0xa0, 0xae, 0x2b, 0xb9, 0x34, 0xc8, 0x2c, - 0x41, 0x42, 0xda, 0x69, 0xd1, 0x2c, 0xa7, 0x24, 0x75, 0x6a, 0x37, 0x9a, 0x69, - 0xf8, 0x3e, 0x70, 0xce, 0xe0, 0xc7, 0x8c, 0xf3, 0x13, 0xa7, 0x77, 0xfa, 0xb4, - 0x8e, 0xe2, 0x03, 0xe1, 0x4f, 0xed, 0x62, 0x41, 0x62, 0xe9, 0xcf, 0x38, 0x65, - 0x24, 0x5c, 0xfb, 0x31, 0xea, 0x07, 0xee, 0x88, 0x9e, 0x47, 0x0f, 0xee, 0x46, - 0xa0, 0x62, 0x30, 0xf7, 0x00, 0x51, 0xf1, 0x1e, 0x79, 0x8c, 0x72, 0x0d, 0x37, - 0xf2, 0x27, 0xca, 0x01, 0xb1, 0x09, 0xa1, 0xce, 0xe9, 0x2a, 0xd5, 0xf6, 0xb0, - 0x20, 0x1a, 0xe7, 0x1e, 0xab, 0x44, 0x69, 0x99, 0xcd, 0xcb, 0xc4, 0xa5, 0xfc, - 0x3b, 0x1a, 0xf1, 0x38, 0x94, 0xae, 0x93, 0xdd, 0xff, 0xe8, 0xee, 0x18, 0x50, - 0x13, 0x6b, 0x30, 0xcd, 0xa1, 0xd8, 0x3d, 0x8d, 0x3b, 0xea, 0x7b, 0x13, 0x1c, - 0x06, 0x14, 0x1c, 0xc2, 0xa8, 0x5f, 0xa5, 0xb4, 0x3d, 0x05, 0xec, 0x95, 0x4e, - 0x11, 0xb6, 0xf3, 0x7b, 0x03, 0xf4, 0x62, 0x13, 0xe9, 0x42, 0xa7, 0xe1, 0x9a, - 0x46, 0xe9, 0x70, 0xb5, 0xc5, 0x06, 0x70, 0x84, 0x30, 0x31, 0x7b, 0x1b, 0xb3, - 0xb3, 0x5d, 0xf6, 0x8a, 0xe3, 0x3a, 0x49, 0x26, 0xa0, 0x3e, 0x6b, 0xfe, 0xb5, - 0x51, 0x04, 0x16, 0xfc, 0xbb, 0x05, 0x24, 0xc9, 0xca, 0x50, 0x74, 0x15, 0x6c, - 0xc5, 0xa5, 0xd6, 0xfe, 0x1c, 0x99, 0x5e, 0xdc, 0x60, 0xa2, 0xf5, 0x50, 0x41, - 0x1a, 0xa4, 0x1e, 0x3d, 0xa3, 0xbd, 0xcf, 0x64, 0xbc, 0xf0, 0x4a, 0x05, 0x10, - 0x57, 0x1b, 0x93, 0x6d, 0x47, 0xe5, 0x5c, 0xec, 0x03, 0x30, 0xee, 0x8d, 0xfe, - 0x73, 0x56, 0x34, 0x04, 0xf0, 0x47, 0xd7, 0xf3, 0xa8, 0xa3, 0xd7, 0x74, 0x3b, - 0xc5, 0x54, 0x95, 0x52, 0x10, 0xf1, 0xeb, 0x0d, 0x08, 0x59, 0x9e, 0xa7, 0x7d, - 0x5f, 0x97, 0x4d, 0x87, 0x17, 0x6d, 0x37, 0xd9, 0x8b, 0x9c, 0x0a, 0xd4, 0x40, - 0x40, 0x72, 0x09, 0xed, 0x6a, 0x9f, 0x08, 0x46, 0x4d, 0x56, 0x55, 0x93, 0xe1, - 0xa6, 0x3b, 0x93, 0x85, 0x36, 0xb4, 0x92, 0x44, 0xe9, 0x7d, 0x88, 0x01, 0x73, - 0xb6, 0x40, 0xf2, 0xdd, 0xb7, 0x4d, 0x06, 0x8e, 0xcb, 0x46, 0xcf, 0x28, 0x9b, - 0x7d, 0x89, 0x13, 0x07, 0xbb, 0xa3, 0x70, 0x54, 0xcf, 0x91, 0xb3, 0x1f, 0xc8, - 0x2f, 0x74, 0xd5, 0xfc, 0xc0, 0x00, 0x94, 0x2e, 0xde, 0x91, 0x18, 0x25, 0xf5, - 0x3f, 0xe6, 0x66, 0xb0, 0xc9, 0xaa, 0x8c, 0xff, 0x6a, 0x37, 0x6e, 0x1f, 0x37, - 0x2e, 0xac, 0x6a, 0xc4, 0xe4, 0x6c, 0xc0, 0x94, 0x22, 0x45, 0xd4, 0xc2, 0xdc, - 0xf0, 0x2d, 0x76, 0x40, 0xff, 0xcc, 0x5a, 0x6a, 0xc3, 0xa8, 0x7f, 0x5c, 0x41, - 0x15, 0x51, 0xbc, 0xc2, 0xf2, 0x6c, 0xb9, 0x49, 0x61, 0xd5, 0x3f, 0x95, 0xdd, - 0xb1, 0x9a, 0xe9, 0x30, 0xc8, 0xd7, 0x0f, 0x03, 0x1b, 0x29, 0xa5, 0xdf, 0x99, - 0xff, 0x36, 0x69, 0x5e, 0x80, 0x2c, 0xbc, 0xb6, 0xb5, 0x8c, 0x1b, 0xa7, 0xed, - 0x5e, 0xac, 0xfa, 0x76, 0x41, 0x4a, 0x41, 0xad, 0x4a, 0x44, 0xf7, 0x1f, 0x1b, - 0x58, 0x0d, 0x34, 0xc3, 0xa9, 0x52, 0x92, 0x0b, 0x25, 0x4a, 0x14, 0x5f, 0xea, - 0x51, 0x7f, 0x5b, 0x42, 0xb2, 0xf6, 0x5e, 0xcd, 0x0f, 0x82, 0x59, 0x54, 0x78, - 0xd8, 0x0a, 0xe5, 0xc8, 0xce, 0xea, 0x12, 0xa1, 0x61, 0xcc, 0xbb, 0x5e, 0xac, - 0x09, 0x99, 0x0f, 0xc6, 0x19, 0xa4, 0x60, 0x80, 0x43, 0x6d, 0xbd, 0x08, 0xd7, - 0x47, 0x84, 0xaf, 0x00, 0x2d, 0x58, 0xe0, 0x6f, 0xaf, 0x7f, 0x3c, 0xea, 0xe7, - 0xd3, 0x41, 0x9b, 0x1f, 0xca, 0x26, 0x5a, 0x55, 0x59, 0xcf, 0x9e, 0x2d, 0x3b, - 0x60, 0x97, 0x8d, 0x81, 0xa6, 0x78, 0xb9, 0xed, 0x8e, 0x44, 0x86, 0xb4, 0xd1, - 0x46, 0x09, 0xd6, 0xc1, 0x27, 0xc0, 0xc2, 0xfb, 0xff, 0xe3, 0x0a, 0x60, 0x51, - 0x98, 0x36, 0x70, 0x17, 0xdf, 0x5c, 0x2b, 0x2c, 0x02, 0x0b, 0x40, 0x50, 0x35, - 0xfe, 0xb4, 0xb2, 0xcd, 0xfe, 0x3a, 0x28, 0x1b, 0xdb, 0xd9, 0x68, 0xe0, 0xa9, - 0x0f, 0xa6, 0x51, 0x36, 0x1a, 0x42, 0xde, 0x27, 0x2c, 0xb8, 0xc2, 0xf5, 0x4e, - 0x96, 0xf5, 0x1d, 0xf9, 0x1e, 0xf1, 0x19, 0xcc, 0x7a, 0xb7, 0xe1, 0x36, 0xa3, - 0xbd, 0xb8, 0x18, 0xb4, 0xd7, 0x8c, 0x8e, 0x98, 0x66, 0x70, 0x03, 0x02, 0x74, - 0x39, 0x22, 0x65, 0x43, 0x32, 0x81, 0xc8, 0xa7, 0x71, 0x17, 0x1c, 0x2b, 0x70, - 0xa0, 0x72, 0x72, 0xd2, 0xfb, 0xaa, 0xbf, 0x81, 0x3b, 0xf2, 0xcc, 0x8c, 0x2b, - 0x2b, 0xc2, 0x56, 0xd4, 0x98, 0x27, 0xff, 0xa8, 0xf6, 0xb0, 0x96, 0xb4, 0xc3, - 0xa7, 0x92, 0xc5, 0xde, 0x00, 0x3f, 0x4c, 0x33, 0xb7, 0x21, 0x60, 0x56, 0xd9, - 0xed, 0xb7, 0x48, 0x2f, 0xb9, 0x8a, 0xa0, 0x33, 0xb6, 0x5e, 0x11, 0x99, 0xf5, - 0x83, 0x7e, 0x81, 0xed, 0x2f, 0xe4, 0x94, 0xa7, 0x19, 0xff, 0xc6, 0x53, 0xfd, - 0x2b, 0xb9, 0xef, 0x91, 0x32, 0x7a, 0xc2, 0x10, 0x48, 0x2a, 0x6d, 0xed, 0x0a, - 0xb8, 0xe1, 0xc8, 0x09, 0x88, 0xbb, 0x45, 0x85, 0x85, 0x1d, 0xc9, 0x3e, 0xcc, - 0xc6, 0x23, 0x22, 0x92, 0x4c, 0xd1, 0x3b, 0x5d, 0xd4, 0xee, 0xd6, 0x6e, 0xd8, - 0xd9, 0x97, 0x2d, 0x77, 0x26, 0x29, 0xea, 0x64, 0x74, 0x2e, 0xe8, 0x3c, 0x04, - 0x11, 0x2f, 0x09, 0xae, 0x57, 0x48, 0x27, 0xaa, 0x4b, 0xeb, 0x00, 0x38, 0xf2, - 0x55, 0x5a, 0x8b, 0xa3, 0x6a, 0x9b, 0xfb, 0xa0, 0x28, 0xd7, 0xc2, 0x1e, 0xa3, - 0xcd, 0x0b, 0xba, 0xa9, 0xae, 0x48, 0x11, 0xc6, 0xaf, 0x06, 0xfe, 0x80, 0xa8, - 0xc0, 0x2a, 0xb7, 0xa0, 0x0e, 0x18, 0xe4, 0xa6, 0xaa, 0x1e, 0xa1, 0xb7, 0x69, - 0x45, 0xd2, 0x61, 0x5d, 0x43, 0xac, 0x11, 0x8b, 0x56, 0xc2, 0xf2, 0x96, 0x0f, - 0xe9, 0x3a, 0x02, 0x5f, 0x13, 0xec, 0x91, 0xff, 0xc6, 0xd2, 0xc3, 0x53, 0x69, - 0x9a, 0xbb, 0x09, 0x2d, 0xed, 0xc0, 0x65, 0xdb, 0x8f, 0xa2, 0x14, 0xdb, 0xc4, - 0x64, 0x66, 0xf8, 0x97, 0xb8, 0x8c, 0x58, 0xb3, 0x01, 0x52, 0x13, 0x3a, 0xa3, - 0x83, 0x1a, 0xf3, 0x7c, 0x74, 0xd9, 0x9e, 0x9e, 0x36, 0xff, 0x70, 0x11, 0xd3, - 0x23, 0x83, 0x05, 0x69, 0x15, 0x08, 0xa2, 0xc3, 0xa4, 0x3e, 0x75, 0x5d, 0xc0, - 0x81, 0xb5, 0x11, 0xd6, 0x48, 0x2a, 0x7d, 0xb6, 0x5f, 0xa9, 0x69, 0x9e, 0xa8, - 0x7f, 0xf4, 0x70, 0x99, 0xed, 0x36, 0x37, 0xdb, 0xb0, 0xa3, 0xd0, 0xef, 0x79, - 0x79, 0x6a, 0x8e, 0xf1, 0xe4, 0xd9, 0x4d, 0x42, 0xb4, 0xbc, 0x2b, 0x4a, 0x03, - 0x8a, 0xe6, 0xe4, 0x6b, 0x24, 0xcf, 0xc8, 0x41, 0x53, 0xd3, 0x1e, 0xaf, 0x89, - 0x50, 0x63, 0xa5, 0xca, 0x95, 0x9b, 0xe6, 0x3f, 0x37, 0xf2, 0xba, 0x0d, 0x43, - 0x23, 0x66, 0x73, 0x6d, 0x86, 0x32, 0xfc, 0xe0, 0x72, 0xb6, 0xae, 0x5b, 0x6f, - 0x3f, 0xd5, 0x9d, 0x3f, 0xaf, 0xf6, 0x38, 0x27, 0x5a, 0x99, 0x2f, 0xef, 0xc8, - 0x7e, 0x60, 0xd4, 0x4c, 0x2c, 0xad, 0xc2, 0xb5, 0xc4, 0x94, 0xe3, 0xe7, 0x2e, - 0xb4, 0x59, 0x7c, 0x96, 0xb4, 0x01, 0x67, 0x79, 0x9a, 0x90, 0x01, 0xa2, 0xed, - 0x36, 0x76, 0xa8, 0xb4, 0x03, 0xae, 0x25, 0xff, 0xd7, 0x72, 0xf7, 0x08, 0x1e, - 0x9a, 0x32, 0xbc, 0xc1, 0xc5, 0xe2, 0xed, 0xd4, 0xe2, 0xa6, 0x57, 0x6b, 0x78, - 0x3c, 0xce, 0x3a, 0xae, 0x11, 0xfa, 0x43, 0x22, 0x62, 0x54, 0x88, 0x56, 0x18, - 0x3e, 0xe6, 0x82, 0xd5, 0xdc, 0x31, 0xbe, 0xb3, 0x8f, 0x06, 0x1c, 0xbd, 0xec, - 0xa7, 0x02, 0x1a, 0x44, 0x4e, 0x2d, 0xd4, 0x17, 0xdf, 0x26, 0xdc, 0xd2, 0x20, - 0xf2, 0xb7, 0x31, 0x77, 0x2b, 0x43, 0x9e, 0x96, 0xd6, 0x14, 0xe1, 0xfa, 0xcb, - 0x48, 0x6c, 0x7a, 0x7d, 0x51, 0x71, 0xb1, 0xde, 0x35, 0x9f, 0x6a, 0xd3, 0xa9, - 0x6f, 0x64, 0x9c, 0x96, 0x91, 0x02, 0xa1, 0x96, 0x4f, 0xb4, 0xb4, 0xa1, 0xa4, - 0x27, 0x9c, 0x68, 0xe6, 0xc3, 0x72, 0xe4, 0x21, 0x87, 0xd7, 0x54, 0xe8, 0x04, - 0xa6, 0x16, 0x53, 0x09, 0x20, 0x69, 0xfb, 0x9b, 0x6d, 0x25, 0x26, 0x68, 0x90, - 0x80, 0x8b, 0x01, 0x5d, 0xf2, 0x8c, 0x80, 0x10, 0x65, 0xda, 0x6f, 0xeb, 0xdc, - 0x1a, 0x56, 0xbf, 0xd0, 0x02, 0x62, 0x5a, 0xcf, 0xaa, 0x53, 0x73, 0xfd, 0xe1, - 0x49, 0xc1, 0xcf, 0xc3, 0x64, 0x9b, 0x48, 0x69, 0x69, 0x6d, 0x44, 0xec, 0xb1, - 0x24, 0x79, 0xc5, 0xeb, 0xef, 0x99, 0x5f, 0x10, 0x02, 0x9f, 0x8b, 0x53, 0x0e, - 0xeb, 0x3f, 0xdc, 0x2e, 0x50, 0xe8, 0x75, 0x7f, 0xc0, 0xbb, 0x9e, 0x26, 0x30, - 0x23, 0xdb, 0x82, 0xf8, 0x78, 0xd9, 0xac, 0x7f, 0xfb, 0x0b, 0xd4, 0x39, 0x1d, - 0xf1, 0xd8, 0x79, 0x89, 0x9a, 0x3e, 0xf5, 0x7b, 0xfd, 0x0d, 0x1f, 0x77, 0x55, - 0x64, 0x8e, 0xdd, 0x85, 0xbb, 0x05, 0x2a, 0x6e, 0xdf, 0x71, 0xcd, 0x26, 0x28, - 0xc9, 0x87, 0x42, 0x9f, 0x36, 0xdc, 0x50, 0x5c, 0xcc, 0x43, 0xf3, 0x0e, 0x7a, - 0x86, 0x9c, 0x9e, 0x25, 0x5e, 0x2a, 0xf9, 0xfc, 0xf3, 0x0c, 0x12, 0x17, 0x96, - 0xd1, 0x90, 0x00, 0x09, 0x60, 0xcb, 0x6f, 0xe2, 0xf1, 0xbf, 0x24, 0x61, 0x18, - 0xb4, 0x98, 0xf3, 0x24, 0x7f, 0x9d, 0x48, 0x4c, 0x73, 0xcf, 0x09, 0x39, 0x30, - 0x39, 0xe4, 0x53, 0x26, 0xb8, 0xff, 0xff, 0xb3, 0xe7, 0xe6, 0x15, 0x9c, 0x46, - 0x69, 0x9f, 0x10, 0x07, 0x92, 0xd4, 0x67, 0x29, 0x50, 0x34, 0x8a, 0x90, 0x55, - 0x2e, 0x45, 0x94, 0x3b, 0xee, 0xac, 0xf0, 0x3f, 0x32, 0x16, 0xf9, 0x4e, 0x27, - 0x4d, 0x63, 0xd6, 0x37, 0xd9, 0xf1, 0x90, 0xe8, 0xa2, 0x66, 0xcd, 0xee, 0xf1, - 0x53, 0x53, 0x0b, 0xee, 0x5c, 0xb8, 0x35, 0x52, 0x60, 0x50, 0x5c, 0x2c, 0x2e, - 0x5d, 0x99, 0x0f, 0xff, 0xdc, 0x34, 0xec, 0x0f, 0xf7, 0xf1, 0xaf, 0x81, 0xb2, - 0x4c, 0xed, 0x0e, 0xfa, 0x62, 0x13, 0xda, 0x6c, 0x7c, 0x60, 0xc4, 0x87, 0xf5, - 0xf7, 0xb0, 0x3f, 0x81, 0x60, 0xa0, 0x57, 0xf4, 0x6d, 0x05, 0xbf, 0x82, 0x18, - 0xb3, 0xad, 0xd9, 0xc0, 0x68, 0x93, 0xbd, 0x02, 0xdb, 0x9b, 0x61, 0x19, 0x1d, - 0xfb, 0x13, 0x3b, 0xfa, 0xbe, 0x48, 0x58, 0xe4, 0x7a, 0x4c, 0xc3, 0x2e, 0x41, - 0x6e, 0xc0, 0x8b, 0x8a, 0xc7, 0x91, 0x5a, 0x43, 0x73, 0x3f, 0x44, 0x06, 0xe9, - 0xd9, 0x67, 0xc5, 0x60, 0xf3, 0x44, 0xd7, 0xe9, 0x04, 0xa2, 0x80, 0x45, 0xd9, - 0x1e, 0x50, 0xd7, 0x9e, 0x42, 0x86, 0x7c, 0x0a, 0xd0, 0xff, 0xb5, 0x5f, 0x68, - 0x87, 0x5e, 0x58, 0x64, 0x20, 0x10, 0x8a, 0x1b, 0x09, 0x25, 0x76, 0x41, 0x5d, - 0xc1, 0x36, 0x93, 0xa1, 0x21, 0x2b, 0x0e, 0x70, 0x03, 0x08, 0x4e, 0xf9, 0x5a, - 0x27, 0xa7, 0xd4, 0x28, 0x4d, 0x27, 0x61, 0x11, 0xd8, 0x60, 0x14, 0x2c, 0xb7, - 0x40, 0xc1, 0x5b, 0x7b, 0x62, 0x3c, 0xf4, 0x8b, 0x3f, 0x7b, 0xfe, 0x3a, 0xf0, - 0x8d, 0xf8, 0xd1, 0xd3, 0xe1, 0x1f, 0xf1, 0x98, 0x21, 0x4e, 0x67, 0x37, 0x76, - 0xf0, 0x4f, 0x0c, 0x4e, 0x84, 0x6c, 0x32, 0xa1, 0x0c, 0x0d, 0x55, 0x9e, 0x49, - 0x68, 0xb4, 0xf8, 0xe1, 0xb9, 0x6c, 0xdc, 0x1e, 0xa7, 0xea, 0x31, 0xdd, 0x86, - 0xd6, 0x80, 0xe2, 0x59, 0x85, 0xe1, 0xd5, 0xd0, 0x25, 0x80, 0xd0, 0x42, 0x74, - 0x23, 0x4a, 0xf2, 0xa5, 0x1b, 0x56, 0xbb, 0x68, 0xa2, 0x9e, 0x03, 0xba, 0xb7, - 0xb5, 0x0f, 0x30, 0x6e, 0xf5, 0xd9, 0xa4, 0xf8, 0x13, 0x5d, 0x69, 0x61, 0x4a, - 0xb3, 0x41, 0x58, 0xfb, 0xa3, 0x70, 0xf7, 0x87, 0x63, 0xd4, 0x02, 0x00, 0x81, - 0xfe, 0x39, 0xcc, 0x23, 0x16, 0x30, 0xe4, 0xc0, 0x89, 0x15, 0xe6, 0x31, 0x77, - 0x15, 0x50, 0xe9, 0xce, 0x1f, 0xca, 0x2c, 0x63, 0xfe, 0x06, 0xb7, 0x98, 0x9d, - 0x58, 0x4f, 0xa7, 0xd7, 0x82, 0xa8, 0x8c, 0x1e, 0x7d, 0x64, 0xb6, 0xfb, 0xf5, - 0x5e, 0x35, 0x96, 0xaf, 0x9b, 0xcb, 0x75, 0x85, 0xf8, 0xc7, 0xd3, 0xaa, 0x5c, - 0x20, 0x82, 0xb2, 0x65, 0x24, 0x9d, 0xf0, 0x57, 0x01, 0xda, 0xb0, 0x31, 0xc4, - 0xba, 0xc1, 0xea, 0x26, 0x7a, 0x29, 0x96, 0xa2, 0x02, 0x8d, 0x1e, 0x6a, 0x0f, - 0x80, 0xa3, 0x84, 0x7c, 0x53, 0x1d, 0xba, 0x96, 0xee, 0x65, 0xa2, 0x41, 0x89, - 0xbd, 0x27, 0x12, 0xe4, 0x0e, 0x95, 0x96, 0x64, 0x98, 0x1e, 0x58, 0xb2, 0xa4, - 0xf9, 0x51, 0xef, 0x8f, 0x49, 0x7d, 0xff, 0xf2, 0xf2, 0xf2, 0x71, 0xea, 0xb8, - 0x9c, 0x62, 0x8e, 0x18, 0xb5, 0xfc, 0xb4, 0x38, 0x82, 0x53, 0x7e, 0xaf, 0x6a, - 0xd2, 0xa6, 0xb1, 0x75, 0x46, 0x33, 0xca, 0xa8, 0x6b, 0xf2, 0xc7, 0x6f, 0x39, - 0x93, 0x15, 0x4f, 0xc7, 0x3e, 0x6f, 0xbb, 0xa2, 0x21, 0x0c, 0x27, 0x43, 0xf5, - 0x30, 0xa4, 0x27, 0x84, 0x9a, 0x30, 0x1e, 0x00, 0xe0, 0x11, 0x29, 0xf0, 0x3a, - 0x46, 0x07, 0xf8, 0x7c, 0xbe, 0x07, 0x62, 0xc0, 0xb1, 0xc6, 0x58, 0x55, 0xde, - 0xba, 0x84, 0x22, 0xca, 0x4b, 0x88, 0xab, 0xee, 0xa6, 0xa4, 0x38, 0x2c, 0xf1, - 0x6c, 0xcd, 0x6d, 0xc7, 0xc3, 0x7c, 0x44, 0xe5, 0x49, 0xc4, 0x53, 0x48, 0x19, - 0xac, 0xd8, 0xbb, 0x0a, 0x02, 0xa5, 0xfa, 0x7a, 0x1c, 0x1d, 0x38, 0x06, 0xfb, - 0xc3, 0x40, 0x7f, 0xd7, 0xda, 0x93, 0xfd, 0x0d, 0xe6, 0x40, 0x0d, 0x3a, 0xb8, - 0x97, 0x74, 0x85, 0xcd, 0xdf, 0xbe, 0xd5, 0x93, 0x2f, 0x50, 0x7b, 0x79, 0x94, - 0x7a, 0xdb, 0x2f, 0xad, 0x37, 0x61, 0x5a, 0xa7, 0x17, 0xdb, 0x5f, 0x29, 0x80, - 0x99, 0xf2, 0x0f, 0x26, 0x3b, 0x35, 0x9a, 0x11, 0x51, 0xa6, 0xb7, 0x5c, 0x01, - 0x36, 0x5e, 0xb1, 0x54, 0xae, 0x42, 0x14, 0x0d, 0x6e, 0x10, 0x34, 0x2f, 0x14, - 0xf3, 0x4d, 0xc3, 0x3e, 0x07, 0xff, 0x0e, 0x4d, 0x1a, 0x6b, 0xe3, 0x75, 0xb3, - 0x2f, 0x84, 0xb9, 0x2e, 0x5d, 0x81, 0xeb, 0xb6, 0x39, 0xc4, 0xf2, 0x7e, 0x71, - 0x5a, 0xa4, 0x2c, 0xc7, 0x57, 0x07, 0xd4, 0xeb, 0xd1, 0xbb, 0xfb, 0xe8, 0xf9, - 0x0f, 0xc7, 0xc9, 0x53, 0xe7, 0xa9, 0x71, 0x5e, 0x65, 0xaf, 0x82, 0x67, 0x37, - 0x3d, 0x34, 0x51, 0x67, 0x4f, 0xf0, 0x84, 0xef, 0xd9, 0x2c, 0xcf, 0x3b, 0xcc, - 0x7a, 0xca, 0x14, 0x67, 0xb6, 0x32, 0x7e, 0x4f, 0x95, 0x22, 0xb2, 0xcc, 0x57, - 0x9a, 0x7a, 0x8f, 0xff, 0x7c, 0xa7, 0xcf, 0x14, 0x5d, 0xfc, 0x13, 0xea, 0xfc, - 0x34, 0x15, 0x3b, 0x2c, 0x3e, 0x8a, 0xfb, 0xe5, 0x34, 0x44, 0xd0, 0xc7, 0x3b, - 0x3b, 0xd5, 0xbc, 0x87, 0x0b, 0x01, 0xcd, 0x45, 0x79, 0x11, 0xe3, 0x56, 0x31, - 0x3f, 0xd1, 0xda, 0xfb, 0x4c, 0x81, 0x51, 0x63, 0x4a, 0x01, 0xaf, 0xf7, 0xcf, - 0x11, 0x6d, 0x43, 0x3c, 0x3d, 0x2b, 0x3a, 0xdd, 0xa9, 0xce, 0xbe, 0x18, 0xf7, - 0xd1, 0x72, 0x44, 0x3e, 0x5e, 0x7b, 0x5a, 0xc9, 0xab, 0xe8, 0xdb, 0x22, 0x56, - 0xd7, 0xeb, 0xe2, 0xff, 0x28, 0x02, 0x09, 0x39, 0x50, 0x38, 0x70, 0x59, 0x7b, - 0x9a, 0x95, 0x58, 0x92, 0xc7, 0x38, 0x96, 0x50, 0xa2, 0xd4, 0x2e, 0xc9, 0x2b, - 0xe7, 0x23, 0xfe, 0xdf, 0x2f, 0x2e, 0xde, 0x5a, 0x47, 0x2a, 0xa1, 0xe7, 0x4f, - 0x33, 0xad, 0x41, 0x90, 0x15, 0x44, 0xed, 0xbb, 0xe3, 0xac, 0x46, 0x4c, 0xf4, - 0x39, 0x19, 0x60, 0x15, 0xf4, 0xf2, 0x2a, 0xc2, 0xb8, 0xfc, 0x01, 0x49, 0x6b, - 0xea, 0xb4, 0xd4, 0x59, 0x07, 0xf4, 0x79, 0x81, 0x2a, 0x25, 0x94, 0x31, 0xa2, - 0xcb, 0xc9, 0x3d, 0x4f, 0x3b, 0x84, 0xe4, 0xdd, 0x36, 0x60, 0x20, 0x27, 0x3a, - 0x67, 0x52, 0xe5, 0x01, 0xaf, 0x6f, 0xf1, 0xb7, 0x8d, 0xdc, 0x81, 0x7e, 0x6e, - 0xa3, 0x51, 0xd6, 0x00, 0x6b, 0xec, 0xf8, 0xd2, 0xff, 0xb0, 0x39, 0x90, 0xf6, - 0x77, 0x74, 0xa8, 0x1e, 0x05, 0xb7, 0xf4, 0xbb, 0xad, 0x85, 0x77, 0xfa, 0x27, - 0xc9, 0xde, 0x64, 0xe1, 0xb1, 0x1d, 0xcf, 0x38, 0x4f, 0x59, 0x56, 0x44, 0x37, - 0x48, 0x75, 0x5a, 0x9f, 0xc6, 0xf2, 0xa0, 0x0b, 0x10, 0xc3, 0x65, 0x7e, 0xba, - 0xc0, 0x3b, 0xfc, 0x0b, 0x58, 0x7b, 0xef, 0x2f, 0x45, 0xec, 0x8a, 0xcd, 0xaa, - 0x51, 0xc1, 0x43, 0xb0, 0xcb, 0x25, 0xb9, 0x14, 0x2c, 0x61, 0xbd, 0x79, 0x0a, - 0x80, 0xd7, 0xc2, 0x3f, 0x90, 0xcc, 0x03, 0x49, 0x5b, 0x51, 0xe4, 0xd2, 0x84, - 0x3e, 0x55, 0x7f, 0x9e, 0x25, 0x45, 0x10, 0x8c, 0x6c, 0x6f, 0xae, 0x35, 0x9f, - 0x64, 0x5c, 0x27, 0x68, 0x91, 0xc0, 0xdc, 0xab, 0x3f, 0xaf, 0x18, 0x77, 0x00, - 0xc0, 0x03, 0x10, 0xa4, 0xfe, 0xf5, 0x63, 0x14, 0x00, 0x00, 0x9a, 0x2d, 0xbd, - 0x0e, 0x13, 0x8d, 0x2d, 0xea, 0xe4, 0x1c, 0xae, 0xa5, 0xf1, 0x86, 0x57, 0x7a, - 0x77, 0xd1, 0xb7, 0x37, 0xfe, 0x21, 0xf0, 0xfa, 0x5a, 0x18, 0xeb, 0xb5, 0x27, - 0x55, 0xb5, 0x26, 0xef, 0x61, 0x30, 0xfb, 0x56, 0x94, 0x4c, 0xfa, 0xb8, 0x75, - 0x27, 0xc2, 0x50, 0xd1, 0x13, 0xb2, 0x9b, 0xca, 0xc9, 0xaa, 0xa1, 0x0c, 0x2e, - 0x7d, 0xe4, 0x15, 0xed, 0xb0, 0x80, 0x6c, 0x6d, 0xa0, 0x30, 0x20, 0xa1, 0x34, - 0xca, 0x7e, 0xcd, 0xc8, 0xda, 0x1b, 0xd5, 0x7a, 0x37, 0xf5, 0x5a, 0x46, 0x94, - 0x0b, 0x45, 0xb2, 0x41, 0xb1, 0xc1, 0x6e, 0xe1, 0x00, 0x92, 0x7d, 0x1b, 0xd8, - 0x60, 0xd4, 0x45, 0xa9, 0xde, 0x50, 0xd4, 0xc3, 0x84, 0xd6, 0xe1, 0xd0, 0x01, - 0x08, 0x02, 0x6c, 0x0e, 0xa5, 0xeb, 0xbf, 0x0b, 0x72, 0xfb, 0xf5, 0xc3, 0x70, - 0xbc, 0xe1, 0x8d, 0x3a, 0xcb, 0xc4, 0x65, 0x99, 0x09, 0x9b, 0xaa, 0xe1, 0xd8, - 0x02, 0xf7, 0x73, 0x33, 0x49, 0x4a, 0x7a, 0xe1, 0x30, 0xfe, 0x86, 0xe8, 0xf8, - 0x18, 0xf9, 0x26, 0x1a, 0x2d, 0xad, 0xb4, 0x12, 0x52, 0x29, 0xba, 0x0f, 0xfc, - 0x0e, 0x70, 0x90, 0x32, 0x44, 0x30, 0xb5, 0x21, 0xa9, 0x0d, 0x22, 0x4a, 0xb7, - 0xa1, 0x02, 0x4e, 0x1d, 0x89, 0x3e, 0x74, 0x04, 0xfe, 0xdb, 0x34, 0x8e, 0x4d, - 0x5e, 0x22, 0x35, 0xc5, 0x9a, 0x78, 0x76, 0xa0, 0xfc, 0x60, 0x14, 0x5c, 0x6a, - 0x00, 0x96, 0x87, 0x68, 0x44, 0x60, 0x27, 0x1e, 0xe1, 0x33, 0xa4, 0x37, 0xfe, - 0x52, 0xfb, 0x6c, 0xfb, 0xa9, 0x7f, 0xce, 0xc1, 0x61, 0xdf, 0x51, 0x5d, 0xde, - 0x90, 0x5a, 0x24, 0xda, 0x6d, 0x37, 0xbd, 0xc3, 0x40, 0x44, 0xa9, 0x55, 0xe6, - 0x82, 0xb4, 0x74, 0x71, 0xca, 0x1e, 0x8c, 0x78, 0xc5, 0x1e, 0xd3, 0x77, 0xcd, - 0x4a, 0xfa, 0x89, 0x4b, 0xd9, 0xbd, 0x12, 0xe7, 0x07, 0x15, 0x6d, 0xa0, 0x72, - 0x6f, 0x7c, 0xf5, 0x72, 0x9f, 0xab, 0xe3, 0x72, 0x16, 0x22, 0x15, 0x07, 0xc5, - 0x50, 0x6e, 0xf5, 0x9e, 0xce, 0x2a, 0x58, 0x1c, 0x9d, 0x8b, 0x0b, 0x20, 0x74, - 0xab, 0x0e, 0x84, 0x8c, 0xa6, 0xb7, 0x05, 0x4d, 0x18, 0x41, 0x83, 0x7e, 0x87, - 0x91, 0xbd, 0x82, 0x71, 0x5a, 0x28, 0xab, 0x56, 0x9a, 0x9a, 0x28, 0x7a, 0x4f, - 0x64, 0x90, 0x08, 0x6b, 0x1c, 0x22, 0x16, 0x95, 0x21, 0xcd, 0xc1, 0x32, 0x21, - 0x29, 0x39, 0xc8, 0x4a, 0x10, 0x89, 0x64, 0x22, 0x17, 0x02, 0x34, 0xcd, 0x82, - 0x05, 0x5a, 0x8c, 0x1c, 0x2e, 0x53, 0xa0, 0xe2, 0x14, 0x93, 0x8a, 0x97, 0xed, - 0x7c, 0xc8, 0xde, 0x0f, 0x4e, 0xd4, 0xb2, 0x1b, 0x94, 0x5b, 0x55, 0xe9, 0xeb, - 0x05, 0x59, 0xea, 0x85, 0x8d, 0x43, 0xfc, 0x31, 0x13, 0x16, 0x5e, 0xa1, 0x8b, - 0x7b, 0x89, 0x3a, 0x5e, 0x32, 0x6a, 0x5b, 0x0a, 0xf4, 0x75, 0xe2, 0x7a, 0x54, - 0xb2, 0x07, 0xb4, 0x1f, 0x92, 0xe3, 0x36, 0x99, 0x06, 0x0c, 0xb6, 0x70, 0x4a, - 0xb5, 0x69, 0x0d, 0xb5, 0x7a, 0xa8, 0x12, 0xcb, 0x9c, 0x24, 0x43, 0x06, 0x44, - 0xc3, 0xb3, 0xb2, 0xa4, 0x4f, 0x27, 0x18, 0xa7, 0xdf, 0x88, 0xab, 0xc4, 0x11, - 0x7b, 0x58, 0x7d, 0xef, 0xf7, 0x8d, 0xe9, 0xc7, 0x3a, 0xf2, 0x80, 0x80, 0xb2, - 0xfd, 0x05, 0x00, 0x3e, 0x11, 0xd3, 0xe1, 0xb3, 0x29, 0x9d, 0xc9, 0x52, 0x1f, - 0x8b, 0x51, 0x3b, 0xad, 0xb0, 0x10, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x98, + 0xaf, 0x08, 0x3d, 0x98, 0x08, 0x71, 0x08, 0x00, 0x00, 0x02, 0x61, 0x75, 0xd8, + 0xc3, 0xd6, 0x75, 0x62, 0xff, 0x06, 0xa2, 0x1b, 0x39, 0xcd, 0x17, 0x31, 0x63, + 0xb2, 0xec, 0xa3, 0x01, 0x32, 0x19, 0xc7, 0xac, 0x6a, 0x51, 0xdf, 0x3f, 0x26, + 0x44, 0x4a, 0xa8, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, 0x56, 0xfe, + 0x4b, 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, 0xda, + 0xc4, 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0xc7, 0x2f, 0xc1, 0x8b, + 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, 0xb3, 0x17, 0x1e, 0xf4, 0xb5, + 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, 0xa4, 0xcf, 0xb8, 0x96, 0x39, + 0xab, 0x23, 0xa3, 0xde, 0xf6, 0x5e, 0x3e, 0xa8, 0x60, 0x5a, 0xa8, 0x78, 0x16, + 0x1e, 0xad, 0x53, 0x6c, 0x11, 0x83, 0x0a, 0x4d, 0xe8, 0x1a, 0x0f, 0x4e, 0x15, + 0x18, 0xc1, 0x50, 0x91, 0x54, 0x04, 0x90, 0xc6, 0x0d, 0x31, 0xbc, 0xa7, 0xe7, + 0x4b, 0x3e, 0x3b, 0xa3, 0xd0, 0xe8, 0xa6, 0x39, 0x2a, 0x06, 0x2b, 0x8e, 0x86, + 0xd9, 0xd7, 0xd0, 0x0b, 0x21, 0x70, 0x1e, 0x7b, 0x06, 0x2e, 0x06, 0xb1, 0xbc, + 0xd8, 0x57, 0x96, 0xfa, 0xae, 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, + 0x97, 0x09, 0x3e, 0x2c, 0x1f, 0x3a, 0xe8, 0x55, 0xf6, 0x5a, 0xea, 0x91, 0xe1, + 0x31, 0x2f, 0xc6, 0xb8, 0xa4, 0x35, 0x1a, 0x01, 0xb4, 0x59, 0x75, 0xe1, 0x88, + 0x45, 0xee, 0x5f, 0x1c, 0xf5, 0x78, 0x2a, 0x0e, 0x97, 0xc7, 0x4d, 0xe6, 0x34, + 0x6d, 0x27, 0xc1, 0x2e, 0x6c, 0x7d, 0x4a, 0x1c, 0x73, 0xa0, 0x02, 0xd8, 0xb2, + 0x98, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, 0x9e, 0x33, 0xc4, 0xfb, + 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, 0x37, 0xd5, 0x1c, 0x65, + 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0xf3, 0x62, 0xed, 0xe2, 0x25, 0xb5, + 0x90, 0xcf, 0x68, 0xc6, 0x05, 0xaf, 0x57, 0x77, 0x9f, 0x8a, 0xab, 0xab, 0x24, + 0x5d, 0x87, 0x9d, 0x5e, 0x89, 0x95, 0x48, 0x20, 0x48, 0x90, 0xc3, 0x59, 0xda, + 0xb7, 0x4e, 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, 0x3a, 0x55, 0xd6, 0xc7, + 0x30, 0x6e, 0x74, 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, 0xa2, 0x48, 0x73, 0x68, + 0x18, 0x67, 0xa7, 0x89, 0x3d, 0x77, 0xcb, 0x7f, 0x29, 0xb8, 0xc8, 0x47, 0xc5, + 0x83, 0xf2, 0xd0, 0x71, 0xa6, 0x86, 0x61, 0x6e, 0x20, 0x67, 0x19, 0xf7, 0x61, + 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, 0x06, 0x16, 0x3d, 0x2b, 0x84, 0x59, 0x03, + 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, 0x63, 0x4f, 0x24, 0xd9, 0xad, 0x39, + 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, 0x64, 0x5f, 0x93, 0x2e, 0x14, + 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, 0x14, 0xf1, 0x12, 0xe6, + 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, 0x63, 0x83, 0x05, 0xc9, + 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, 0x3e, 0x6d, 0xd3, 0x6e, + 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, 0xa0, 0x9a, 0x32, 0x98, + 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, 0xcf, 0x9a, 0x7d, 0xee, + 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, 0xfd, 0xcb, 0x42, 0x20, + 0x90, 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, 0xc0, 0x1f, 0x2a, 0xfe, + 0x33, 0x07, 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, 0x50, 0xdd, 0x84, 0x83, + 0x9b, 0xc3, 0xea, 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, 0x9c, 0xf0, 0x75, 0x33, + 0xd2, 0x6e, 0x1e, 0x27, 0xa3, 0xef, 0xb0, 0x32, 0xc3, 0xa3, 0xb3, 0x4b, 0xd3, + 0x09, 0x26, 0x22, 0xd2, 0x06, 0x2a, 0xe5, 0x36, 0xef, 0x51, 0x49, 0xc4, 0x9b, + 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, 0x6e, 0x67, 0x57, 0x61, 0x00, 0x8b, 0x0d, + 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, 0xbb, 0xe0, 0xfa, 0xda, 0x25, 0x5d, + 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, 0xc2, 0xde, 0xe5, 0x45, 0x5d, + 0x1f, 0xa9, 0xa9, 0xf3, 0xdb, 0x77, 0x79, 0xb5, 0x84, 0x64, 0x34, 0x64, 0xaa, + 0x80, 0x14, 0xba, 0x66, 0x99, 0x4d, 0xe2, 0x55, 0x17, 0xf8, 0x39, 0x80, 0xe6, + 0x6e, 0xe4, 0xf6, 0x23, 0x14, 0xae, 0x6d, 0xbe, 0xf4, 0x52, 0xd5, 0xd3, 0x8b, + 0x0a, 0x16, 0xf3, 0x99, 0x1f, 0x36, 0xd8, 0xa8, 0xb3, 0x9d, 0xdc, 0x0d, 0x55, + 0x95, 0xee, 0xd9, 0x87, 0x62, 0x87, 0x8c, 0xdf, 0x3f, 0x4a, 0x2e, 0xdc, 0x5c, + 0xda, 0x77, 0xd5, 0xfe, 0x4f, 0xaf, 0x63, 0xa1, 0x5f, 0x56, 0x8a, 0x54, 0x0d, + 0xa5, 0x7d, 0xd9, 0xbe, 0xb6, 0xfb, 0x1a, 0x97, 0x7c, 0xcb, 0x91, 0xb4, 0xd7, + 0x9c, 0xb3, 0x9b, 0x28, 0x91, 0x1a, 0x29, 0xe7, 0xbf, 0x02, 0x8a, 0xc6, 0x10, + 0x37, 0x96, 0xdf, 0xb6, 0xb2, 0x09, 0x67, 0x23, 0x9a, 0xd3, 0x73, 0xc3, 0x8c, + 0x53, 0xf6, 0xdf, 0x18, 0x23, 0xd4, 0x95, 0x0a, 0x02, 0x83, 0xe9, 0x9b, 0x9c, + 0x06, 0xab, 0x29, 0x66, 0x66, 0x7c, 0x9d, 0xf6, 0x77, 0x71, 0x6b, 0x0c, 0xad, + 0xed, 0x81, 0x8d, 0xf9, 0xe4, 0x49, 0xc0, 0x72, 0xe2, 0x2f, 0x9d, 0x98, 0xbb, + 0x0f, 0x9b, 0x03, 0xbd, 0x5f, 0xd0, 0x13, 0xfc, 0xef, 0x3e, 0xd6, 0xa4, 0x9a, + 0xeb, 0x98, 0x72, 0x02, 0x54, 0x08, 0x7e, 0xf7, 0x28, 0xe3, 0x19, 0x47, 0xff, + 0xe8, 0xf7, 0x66, 0xe6, 0x3e, 0xe4, 0x6f, 0xf2, 0x08, 0x16, 0xd5, 0xfa, 0x8f, + 0xf5, 0x5a, 0x26, 0x39, 0x89, 0x61, 0x49, 0x0a, 0xb9, 0xae, 0x36, 0x6f, 0xc5, + 0xa2, 0xd1, 0x99, 0x6e, 0xd6, 0x93, 0xcc, 0xca, 0x82, 0x35, 0x6f, 0x60, 0x0a, + 0xb0, 0x99, 0xf6, 0xec, 0xa8, 0xbf, 0xe6, 0x45, 0x27, 0x0d, 0x3f, 0x95, 0xed, + 0xba, 0x5b, 0x0d, 0xe7, 0xa3, 0x28, 0x19, 0x23, 0x3b, 0xcc, 0x75, 0x4a, 0x5c, + 0xe2, 0xe5, 0xea, 0x07, 0x84, 0x2e, 0x5f, 0xf2, 0xce, 0xbe, 0x62, 0xad, 0x76, + 0xe8, 0xef, 0xf8, 0xd1, 0x5e, 0xa4, 0xc2, 0x4a, 0x5f, 0x20, 0x78, 0x68, 0x31, + 0x9a, 0x5a, 0xf6, 0xb0, 0x35, 0xbe, 0x3f, 0x44, 0xf4, 0x34, 0x09, 0x4f, 0x6e, + 0x52, 0x5b, 0xe6, 0x14, 0xda, 0xc9, 0x20, 0xa3, 0x30, 0xbd, 0xfb, 0x26, 0xd7, + 0x5f, 0xe7, 0xb4, 0xb3, 0x65, 0xd0, 0x94, 0x45, 0x92, 0x50, 0xaa, 0xa5, 0x54, + 0x44, 0x89, 0xfb, 0x1d, 0x99, 0x25, 0x81, 0x80, 0x0a, 0x77, 0xb8, 0x91, 0x21, + 0x57, 0xfc, 0x97, 0x13, 0xaa, 0xac, 0x25, 0xb4, 0xc2, 0x6e, 0xb0, 0x3f, 0x71, + 0x66, 0x46, 0x61, 0x9a, 0xf0, 0x24, 0x56, 0xae, 0x69, 0x59, 0x62, 0xfe, 0x5e, + 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, 0x52, 0xec, 0xd3, 0x33, 0xe1, 0x84, 0x12, + 0xdb, 0x91, 0xe1, 0x5f, 0x7c, 0xbc, 0x70, 0xb4, 0xcd, 0x7e, 0x8e, 0x3c, 0x95, + 0x1f, 0x35, 0x85, 0x72, 0xe3, 0x77, 0x67, 0xe7, 0xd5, 0x27, 0x34, 0xd3, 0x37, + 0x2a, 0x3a, 0x5d, 0x03, 0x00, 0xe1, 0xf7, 0x43, 0x6e, 0x1e, 0x76, 0x43, 0x76, + 0x71, 0xde, 0x6e, 0x83, 0xe3, 0x51, 0xa5, 0xc6, 0xb2, 0x63, 0x4f, 0xa6, 0xa2, + 0xf7, 0x80, 0xae, 0xb7, 0x14, 0x65, 0xc4, 0xa1, 0xb1, 0x8d, 0x10, 0x84, 0x5e, + 0x1a, 0xa2, 0xa4, 0x52, 0xf3, 0x73, 0x1c, 0x8c, 0xb6, 0x50, 0x82, 0xa6, 0x22, + 0xa7, 0xc2, 0xe0, 0x01, 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, 0x42, 0xd6, 0x99, 0x04, + 0x66, 0x64, 0x9a, 0x90, 0x5c, 0x68, 0x4c, 0x32, 0x51, 0x71, 0x6d, 0x61, 0xf7, + 0x60, 0xd5, 0x3d, 0xe6, 0xe3, 0xf7, 0x90, 0xfb, 0xa7, 0xf5, 0xf1, 0xf4, 0xde, + 0x26, 0x71, 0x13, 0xbd, 0xfc, 0xd7, 0x42, 0x28, 0x22, 0x33, 0x0b, 0x32, 0xd5, + 0x8e, 0x67, 0x77, 0x76, 0x5f, 0x22, 0xa4, 0x11, 0x63, 0x44, 0xee, 0xb6, 0x5b, + 0x2e, 0xc5, 0x16, 0x39, 0x3a, 0xb3, 0x75, 0x1b, 0x53, 0x56, 0xd2, 0xb0, 0xc9, + 0x50, 0x0c, 0x0f, 0x3e, 0x46, 0x91, 0x81, 0x03, 0x5b, 0xc3, 0x66, 0x0f, 0x0b, + 0x8f, 0x9f, 0xbe, 0x6e, 0x40, 0xb5, 0xe8, 0x9c, 0xb7, 0x9b, 0x06, 0x37, 0x14, + 0xca, 0x75, 0xe7, 0x2e, 0x2e, 0x10, 0x0a, 0x10, 0xd6, 0x3b, 0xf7, 0x84, 0xdf, + 0x08, 0x20, 0xef, 0x25, 0xf8, 0xef, 0x40, 0xfe, 0x5f, 0x05, 0xfb, 0x95, 0x68, + 0x3f, 0x91, 0x05, 0xff, 0x3c, 0xb2, 0xd2, 0x19, 0xab, 0x76, 0x60, 0x5a, 0x06, + 0x4f, 0x69, 0x21, 0x9f, 0x1d, 0xc0, 0xd0, 0x0b, 0x3b, 0x48, 0x64, 0x2f, 0x97, + 0x0d, 0xc0, 0x0c, 0xca, 0x4b, 0x8b, 0x43, 0x30, 0x8b, 0xe1, 0x82, 0x86, 0xec, + 0x5a, 0x42, 0x88, 0xd6, 0x00, 0xa3, 0x78, 0x5c, 0x2e, 0xc0, 0x3e, 0x02, 0xe5, + 0xd0, 0x2f, 0x53, 0x35, 0x4b, 0x05, 0x2f, 0xd3, 0xda, 0x0d, 0xff, 0x82, 0xcd, + 0x1f, 0x55, 0xeb, 0xca, 0x57, 0xb6, 0x33, 0x7c, 0x85, 0x93, 0x8a, 0x79, 0x81, + 0x3d, 0x20, 0x21, 0xd6, 0x09, 0x4c, 0x68, 0xb3, 0x75, 0xe9, 0x84, 0xf6, 0x83, + 0x93, 0x30, 0x08, 0x71, 0xe3, 0x48, 0xfc, 0x52, 0x36, 0xcc, 0xa6, 0x33, 0x05, + 0x44, 0xe5, 0x46, 0x39, 0xb5, 0x41, 0x87, 0x01, 0xff, 0x4c, 0xc4, 0x5a, 0x31, + 0xf6, 0x2e, 0xdd, 0x84, 0x3d, 0xbb, 0xdc, 0x5a, 0xa7, 0x27, 0xab, 0x79, 0xb4, + 0x42, 0x68, 0x3c, 0x49, 0x56, 0xbb, 0xb1, 0x95, 0xa4, 0xfa, 0x66, 0xdc, 0x9c, + 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, 0x42, + 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, 0xcd, 0xd7, 0x99, 0x2c, 0xff, 0x3e, 0xca, + 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, 0x0e, 0x68, 0xae, 0x38, 0x75, 0x34, 0xb9, + 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, 0xbf, 0x5f, 0x68, 0x78, 0x7d, 0x37, 0x0c, + 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, 0xd6, 0x01, 0xae, 0x90, 0x49, 0x54, 0x37, + 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, 0x7a, + 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, + 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x24, 0x55, 0xc7, 0x16, 0x64, 0xa2, 0xdc, 0xee, + 0x94, 0xbe, 0x35, 0xa8, 0x91, 0x41, 0xdb, 0xa2, 0x8a, 0xc1, 0x0b, 0x64, 0xb2, + 0x6a, 0xd4, 0x5f, 0x52, 0xb4, 0x9e, 0xe2, 0x3a, 0x5f, 0x69, 0xb0, 0x93, 0xcc, + 0xf5, 0x84, 0x44, 0x1f, 0xb5, 0x7a, 0xf0, 0xb7, 0x7a, 0x02, 0x78, 0x5a, 0xe1, + 0xda, 0xc0, 0x90, 0x91, 0xc6, 0x9d, 0xa9, 0x6f, 0x43, 0x3a, 0x47, 0x06, 0xad, + 0x45, 0x0b, 0x7c, 0x09, 0xd6, 0xac, 0x50, 0x85, 0x27, 0x99, 0x64, 0xe6, 0xb2, + 0x95, 0xab, 0x95, 0x47, 0x9e, 0x9f, 0x1d, 0x7e, 0x09, 0x07, 0x8c, 0x09, 0x4a, + 0x14, 0x35, 0x10, 0x2a, 0x5d, 0xac, 0x9d, 0x1e, 0xc2, 0xe6, 0x63, 0x93, 0x04, + 0x30, 0x67, 0xcb, 0x96, 0xc0, 0xd4, 0x28, 0x95, 0x3b, 0x97, 0xd0, 0x96, 0xba, + 0xea, 0xc4, 0x0e, 0x15, 0x63, 0x33, 0x8b, 0x02, 0x5f, 0x8d, 0xd9, 0x77, 0xe6, + 0x5d, 0x56, 0x09, 0x04, 0xa6, 0x72, 0x1b, 0x30, 0xef, 0xc4, 0x10, 0x17, 0xae, + 0x4d, 0x23, 0x15, 0x58, 0xc5, 0xc8, 0x2c, 0xc7, 0xdd, 0x7e, 0x33, 0x56, 0xc0, + 0x9d, 0xc2, 0x49, 0x06, 0xf0, 0x43, 0x8d, 0xfc, 0xc3, 0x00, 0x85, 0x6a, 0xc2, + 0xce, 0xd8, 0xf7, 0x7f, 0xa8, 0x01, 0x57, 0x36, 0xc6, 0x61, 0xe8, 0x02, 0x48, + 0xae, 0xeb, 0x77, 0x48, 0x74, 0xaa, 0x79, 0xd2, 0x90, 0xb8, 0xf5, 0x02, 0x7a, + 0x0a, 0x50, 0x95, 0x37, 0xfc, 0x7c, 0x68, 0x9b, 0x7a, 0xd8, 0x61, 0x16, 0xcf, + 0xec, 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, + 0xf7, 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, + 0xe1, 0x73, 0x29, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, + 0x0c, 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, + 0x59, 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0xa6, 0x01, 0xbb, 0x1c, + 0xb8, 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, 0xee, 0xb0, 0x23, 0x01, + 0xc8, 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, 0xfd, 0x6c, 0x1e, + 0xbf, 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, 0x38, 0x22, + 0x15, 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, 0x26, + 0x61, 0xdd, 0xb3, 0xd8, 0x7d, 0x0e, 0xa6, 0xc5, 0x76, 0x45, 0x74, 0x90, 0xef, + 0xe3, 0xca, 0x30, 0x7e, 0x5d, 0x4e, 0x54, 0x69, 0x13, 0x55, 0xf2, 0xa1, 0x35, + 0x0c, 0x0f, 0x71, 0x9d, 0x01, 0x0d, 0xcc, 0xdd, 0xd3, 0xd2, 0x91, 0x2a, 0x87, + 0xd9, 0xb7, 0x1e, 0x86, 0x6c, 0x9f, 0x62, 0xf5, 0xbe, 0x9b, 0x19, 0xed, 0x1c, + 0xec, 0x22, 0x0c, 0x9e, 0x76, 0x12, 0xa0, 0x9a, 0x54, 0x60, 0x25, 0x0a, 0x04, + 0x0f, 0x20, 0xed, 0x1e, 0x0e, 0x64, 0x43, 0xa5, 0x56, 0xb4, 0x17, 0x1c, 0x24, + 0xac, 0x46, 0x16, 0x09, 0x53, 0x03, 0x25, 0x6e, 0x48, 0xca, 0x4d, 0x53, 0x5a, + 0x2f, 0x9c, 0xa2, 0x94, 0x5b, 0x19, 0x56, 0x56, 0xac, 0xb5, 0x75, 0xc0, 0x0f, + 0x73, 0x85, 0xdf, 0xb6, 0x97, 0x99, 0x29, 0xa5, 0x90, 0xef, 0x02, 0xac, 0x33, + 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x24, 0x86, + 0xc9, 0x23, 0x12, 0x60, 0x8f, 0xb9, 0x3e, 0x14, 0x32, 0xfd, 0xc2, 0x9b, 0x76, + 0x58, 0x25, 0x3d, 0xdd, 0xff, 0xa2, 0x95, 0xf3, 0x93, 0xd8, 0x1b, 0x0c, 0x85, + 0x67, 0x42, 0xb3, 0xaa, 0x36, 0x14, 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, + 0x6b, 0xf0, 0x54, 0x55, 0x7c, 0xe2, 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, + 0xec, 0x89, 0x09, 0xff, 0x51, 0xa4, 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x51, 0xec, + 0xa4, 0x21, 0x94, 0x0c, 0xc6, 0xd6, 0xc1, 0x29, 0x9f, 0x01, 0xf8, 0x1a, 0x61, + 0xe0, 0xc9, 0xe6, 0xf8, 0xeb, 0x5e, 0x99, 0x50, 0xeb, 0x9c, 0x8d, 0xb0, 0x85, + 0x71, 0x0d, 0xba, 0xba, 0xa8, 0xb4, 0x95, 0x55, 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, + 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, 0x04, 0x7a, 0xf1, 0x52, 0x50, 0x8f, 0x57, + 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, 0x92, 0x5c, 0x99, 0xac, 0xea, 0x3e, 0xe8, + 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, 0x39, 0x66, 0xe7, 0x14, 0xef, 0x48, 0x0f, + 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, 0xaa, + 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, + 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, + 0x1a, 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, + 0x63, 0x9c, 0xda, 0x00, 0x75, 0xa2, 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, + 0x99, 0x49, 0x5b, 0xd9, 0x13, 0x3d, 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, + 0xba, 0x92, 0xc7, 0xb6, 0x06, 0xa5, 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, + 0x59, 0x6f, 0x27, 0x88, 0xf3, 0xc8, 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, + 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, + 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, 0x08, 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, + 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, 0x96, 0xfa, 0x08, 0x74, 0x86, 0x9c, 0x02, + 0xf3, 0xdc, 0xa1, 0x1c, 0x3b, 0x90, 0xcb, 0x21, 0x4e, 0x68, 0xbc, 0x1c, 0xae, + 0x03, 0x9d, 0x7a, 0x14, 0x6c, 0xdc, 0x1d, 0x60, 0x9d, 0x7a, 0x6b, 0x3f, 0xd5, + 0xd4, 0x61, 0xb0, 0x95, 0x1c, 0x82, 0xcf, 0xb3, 0xe7, 0x63, 0xfa, 0xd2, 0xd1, + 0xbc, 0x76, 0x78, 0xcd, 0xf8, 0x27, 0x79, 0xf8, 0xfd, 0x5a, 0x1c, 0xe2, 0x2a, + 0x8d, 0x3c, 0x45, 0x47, 0xab, 0xd9, 0x59, 0x83, 0x8a, 0x46, 0xfb, 0x80, 0xaf, + 0xe0, 0x1f, 0x8e, 0xcc, 0x99, 0x31, 0x51, 0x3b, 0x19, 0x62, 0xec, 0x54, 0x08, + 0x56, 0xcb, 0x18, 0x93, 0x87, 0xcf, 0xbf, 0xcc, 0x0f, 0x7c, 0x68, 0x22, 0x3c, + 0xba, 0x47, 0xfb, 0x0c, 0x9b, 0x48, 0x6e, 0x4d, 0x99, 0x17, 0x19, 0x41, 0xf7, + 0x67, 0x5a, 0x8b, 0x46, 0x32, 0x8a, 0x3b, 0xc1, 0x09, 0xbf, 0x07, 0xc6, 0x6d, + 0x5e, 0xde, 0x77, 0x1c, 0xc4, 0xc7, 0x4c, 0xe8, 0x03, 0x33, 0x82, 0x91, 0x91, + 0xee, 0xdc, 0x49, 0x35, 0x08, 0xa6, 0x44, 0x53, 0x0a, 0x61, 0x44, 0xf2, 0x2d, + 0xcf, 0x97, 0x52, 0x5a, 0x4c, 0xdc, 0xa1, 0xad, 0x71, 0x07, 0x3b, 0x08, 0x0b, + 0x73, 0xea, 0x45, 0x49, 0xf5, 0x40, 0x1b, 0xff, 0x43, 0x18, 0x26, 0x8e, 0x6a, + 0xd6, 0x37, 0x36, 0x31, 0x57, 0xa1, 0x9a, 0x53, 0xf1, 0x23, 0xa0, 0xb0, 0xe1, + 0x6d, 0x0b, 0x77, 0xf0, 0x20, 0x28, 0xda, 0x46, 0x41, 0x00, 0xfd, 0xe7, 0x6d, + 0x83, 0xdd, 0x0b, 0xb2, 0x24, 0xf7, 0xb5, 0x7a, 0x00, 0xc0, 0x2f, 0x68, 0xae, + 0x64, 0x8f, 0xdc, 0x52, 0x99, 0x57, 0xa1, 0x04, 0x90, 0xdc, 0xe1, 0xfd, 0xdb, + 0xb0, 0x90, 0x4f, 0x0d, 0x51, 0x8b, 0xb3, 0x87, 0x54, 0x40, 0x19, 0x98, 0x3b, + 0x61, 0x69, 0x75, 0xa7, 0x8e, 0x74, 0xd8, 0x54, 0xfd, 0xdc, 0x49, 0xb2, 0x55, + 0x16, 0x7b, 0x55, 0xef, 0x4b, 0xee, 0x46, 0x56, 0x68, 0xb2, 0x0e, 0xa4, 0x11, + 0x8c, 0xa5, 0x69, 0xae, 0x48, 0x0e, 0x0f, 0x6e, 0x5e, 0x04, 0x3a, 0x35, 0x7b, + 0x36, 0xd3, 0xab, 0x36, 0xc8, 0x61, 0xf2, 0x27, 0x83, 0x01, 0xdc, 0xe5, 0x76, + 0x74, 0xd5, 0x07, 0x3b, 0x3a, 0x6f, 0x51, 0x03, 0xa0, 0x79, 0x3a, 0xf1, 0xb7, + 0xd4, 0x6f, 0x95, 0x7e, 0x22, 0xd8, 0xd2, 0x58, 0x3b, 0xf1, 0x81, 0x83, 0x6c, + 0x3b, 0xe9, 0x93, 0x0b, 0xac, 0x8f, 0xa4, 0x60, 0xe9, 0x68, 0xaa, 0x71, 0x09, + 0x87, 0x0b, 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, 0x67, 0xae, + 0x17, 0xdb, 0xbc, 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, 0x8a, 0xc6, + 0xc6, 0x27, 0x00, 0x2c, 0xe2, 0x1c, 0x02, 0x14, 0x0f, 0xfe, 0x81, 0xec, 0x58, + 0xbf, 0x1e, 0x6d, 0x1b, 0xb7, 0xaa, 0xad, 0xa4, 0x1f, 0xba, 0x0b, 0xb5, 0x88, + 0x77, 0x8a, 0x7f, 0x65, 0x20, 0x2a, 0xd8, 0x11, 0xea, 0x73, 0xd2, 0x6c, 0x74, + 0x55, 0x03, 0x95, 0xaf, 0xf7, 0x53, 0x25, 0x10, 0x7c, 0x9b, 0x3f, 0x9a, 0xe9, + 0xdc, 0xdc, 0xd8, 0x6e, 0xd0, 0x81, 0xa2, 0xe7, 0x42, 0x47, 0x19, 0xa3, 0xd1, + 0x85, 0xb7, 0xe0, 0xa4, 0x3a, 0x47, 0x2e, 0x29, 0x8a, 0xc0, 0xaf, 0xdc, 0x52, + 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, 0xa0, 0x8b, + 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x76, 0xe2, 0x82, 0x1a, 0x41, 0x84, + 0x13, 0xeb, 0x7c, 0xea, 0xa5, 0xff, 0x12, 0x90, 0xb0, 0x3e, 0xc9, 0x1c, 0xe6, + 0xdd, 0x28, 0x13, 0x0c, 0x3a, 0xb0, 0xb2, 0x3b, 0x60, 0x2b, 0xd5, 0xbe, 0x5d, + 0xc2, 0x60, 0x03, 0xaa, 0xe0, 0x4b, 0x33, 0xd7, 0xbd, 0x25, 0x90, 0xe9, 0x0c, + 0x8c, 0x38, 0x8e, 0xa7, 0x95, 0x51, 0x22, 0x0c, 0xaa, 0xa6, 0x5f, 0x98, 0x1a, + 0x4c, 0xfc, 0x69, 0x4d, 0xbd, 0xbd, 0xb8, 0x09, 0x34, 0x38, 0x14, 0xf4, 0xc1, + 0x7a, 0xb5, 0x0b, 0xbf, 0x5b, 0xfc, 0x9d, 0x57, 0x27, 0x64, 0xb4, 0x24, 0x00, + 0xbb, 0x7a, 0x3a, 0x60, 0x90, 0x3d, 0x81, 0x52, 0x65, 0x6b, 0xe8, 0xbd, 0xae, + 0xe7, 0x95, 0x7d, 0xe5, 0xd8, 0xaa, 0x63, 0xa8, 0xa5, 0x0c, 0x38, 0xbd, 0x03, + 0x87, 0x72, 0xc4, 0x14, 0x3d, 0x0b, 0xea, 0xc7, 0x25, 0xc8, 0x3d, 0x92, 0x49, + 0x9e, 0x56, 0x75, 0x65, 0x47, 0x37, 0x43, 0xf4, 0xc8, 0xee, 0x4b, 0x52, 0x1d, + 0xea, 0xb8, 0x36, 0x06, 0xcc, 0x20, 0x9b, 0x9e, 0x0d, 0x25, 0x6c, 0x01, 0xb5, + 0x01, 0x26, 0xf4, 0xa8, 0x5e, 0x38, 0xbb, 0x68, 0x6f, 0x8d, 0xbf, 0x0d, 0xdb, + 0x84, 0xa3, 0x78, 0xa7, 0x96, 0x53, 0xa1, 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, + 0x2d, 0x5f, 0x6c, 0x4a, 0x3e, 0xfc, 0x5d, 0xd2, 0xce, 0xed, 0x21, 0xf5, 0x63, + 0x36, 0x48, 0xc2, 0xc3, 0x7a, 0xf9, 0xab, 0x36, 0x59, 0xb7, 0xd4, 0xd6, 0xa1, + 0x6f, 0x9c, 0x67, 0x42, 0x67, 0x30, 0x8b, 0xf1, 0x16, 0xb5, 0xb7, 0x13, 0x3d, + 0xc2, 0x1e, 0x80, 0x96, 0xc7, 0xe9, 0xf8, 0xe9, 0xe1, 0x0c, 0x1e, 0x3f, 0xac, + 0x40, 0x58, 0xb6, 0x82, 0xc6, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, 0xdd, + 0x4d, 0x64, 0xd9, 0x04, 0x61, 0x52, 0xb4, 0x76, 0x23, 0x32, 0x93, 0x9f, 0x17, + 0xe6, 0xaa, 0xf7, 0xd8, 0xb9, 0xd3, 0x58, 0xe2, 0x21, 0x8d, 0x4e, 0x0d, 0x69, + 0xa4, 0xf1, 0x19, 0xe1, 0xc6, 0x4e, 0xec, 0x4c, 0x8b, 0x53, 0x28, 0x09, 0x70, + 0x71, 0x31, 0xf0, 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, + 0x3d, 0x0a, 0x2b, 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, + 0xca, 0x80, 0xbb, 0x0a, 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, + 0xae, 0x25, 0x15, 0xd5, 0xf7, 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, + 0x09, 0xd8, 0x73, 0x51, 0x10, 0x12, 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, + 0xfb, 0x63, 0x4c, 0xff, 0x26, 0x58, 0xba, 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, + 0x5e, 0xce, 0xfb, 0x30, 0x15, 0xee, 0x3f, 0x03, 0xca, 0x52, 0xa1, 0x77, 0xf2, + 0x61, 0xec, 0xdc, 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, 0x40, 0x48, 0x46, 0xe9, + 0xc6, 0x47, 0xfc, 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, 0x4f, 0x64, 0x27, + 0x8a, 0xd8, 0xce, 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, 0x24, 0x5f, + 0xdd, 0xaf, 0x4e, 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, 0x96, + 0xad, 0x2d, 0x93, 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, + 0x00, 0xaa, 0x59, 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, + 0x69, 0x6b, 0x21, 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, 0x49, 0xd1, + 0x42, 0x06, 0x42, 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, 0xd4, + 0xe2, 0x0a, 0x79, 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, 0x4a, 0x70, + 0x91, 0xfe, 0x01, 0x5a, 0xda, 0x68, 0xfd, 0x84, 0x42, 0xe0, 0x18, 0x25, 0xc8, + 0x8d, 0xfe, 0x55, 0xcf, 0x5d, 0xe3, 0x89, 0x36, 0xf7, 0xce, 0x25, 0x31, 0x1b, + 0x90, 0x2b, 0xa9, 0x7a, 0x3c, 0x12, 0xa9, 0x5c, 0xfa, 0x1c, 0x3a, 0x59, 0x1b, + 0x81, 0x8f, 0x60, 0x83, 0x27, 0x09, 0xd9, 0xe4, 0x83, 0x9e, 0x41, 0x0f, 0xb3, + 0x6b, 0x84, 0xf3, 0xac, 0x4f, 0x07, 0x0f, 0xc3, 0x5e, 0x16, 0x19, 0x78, 0x25, + 0x9e, 0x5b, 0x8e, 0xdc, 0x74, 0x4d, 0x90, 0x91, 0x9a, 0xa7, 0x70, 0xbb, 0x36, + 0x21, 0x51, 0x28, 0xe5, 0x82, 0xb5, 0x96, 0x41, 0xe2, 0x38, 0x52, 0xe9, 0x58, + 0xeb, 0x8f, 0xc3, 0xc0, 0xaa, 0x96, 0x15, 0x2b, 0xa4, 0xf7, 0x7f, 0x13, 0x8d, + 0x6a, 0x67, 0x12, 0xa3, 0xae, 0x32, 0x26, 0x01, 0x58, 0x83, 0xf8, 0x1d, 0xb2, + 0x3e, 0x58, 0x3c, 0x86, 0x9c, 0x4c, 0x71, 0x14, 0x3a, 0x6f, 0xff, 0xd6, 0x5e, + 0x8d, 0xfd, 0xc5, 0x0c, 0x99, 0xa2, 0xf1, 0xf3, 0x14, 0xcd, 0xcc, 0x71, 0x35, + 0x9e, 0x23, 0x5f, 0x1d, 0x7d, 0xc2, 0xb5, 0xf3, 0x8e, 0xf7, 0xb9, 0x70, 0x84, + 0x31, 0x63, 0xc0, 0x3f, 0x9d, 0xd4, 0x0a, 0x80, 0x15, 0xef, 0xdc, 0x87, 0x91, + 0x95, 0x6a, 0x3f, 0x3c, 0xed, 0xd9, 0xea, 0x64, 0xf8, 0xef, 0xa7, 0xa0, 0x81, + 0x5a, 0x70, 0x38, 0x1d, 0x71, 0x46, 0x78, 0x17, 0xbd, 0x04, 0xca, 0x52, 0x9a, + 0xed, 0xe0, 0x7f, 0xf6, 0x0d, 0x17, 0x6a, 0xed, 0x0f, 0x85, 0x5a, 0x2e, 0xae, + 0xa8, 0x9e, 0xae, 0xac, 0xa8, 0x93, 0x58, 0xc0, 0x81, 0x82, 0x6a, 0x08, 0x12, + 0xa5, 0xbc, 0xa2, 0x8b, 0xe1, 0x37, 0x3f, 0x08, 0x6d, 0xbd, 0xba, 0x7e, 0x43, + 0xe2, 0x03, 0x21, 0x2c, 0x9f, 0xed, 0x21, 0x47, 0x4b, 0xa1, 0x9a, 0x05, 0x5f, + 0xfc, 0xc1, 0x79, 0x41, 0x2e, 0x89, 0x3a, 0x74, 0x48, 0x32, 0x29, 0x8c, 0x5f, + 0xe2, 0x4c, 0xc6, 0xb1, 0x86, 0x67, 0xf4, 0x9b, 0x34, 0xdf, 0xb1, 0x23, 0x79, + 0x26, 0x74, 0x19, 0xa9, 0xcb, 0x94, 0x03, 0xd8, 0x16, 0x7d, 0x8d, 0x1e, 0x91, + 0xd2, 0x81, 0x1a, 0x04, 0x3b, 0x29, 0x24, 0x3b, 0x06, 0x9b, 0x37, 0x58, 0x78, + 0x47, 0xdc, 0x6f, 0xcd, 0xdb, 0x18, 0x31, 0xbd, 0x1c, 0xc2, 0x56, 0x7c, 0xa0, + 0x33, 0xac, 0x40, 0xf7, 0x4a, 0xb6, 0x95, 0x5f, 0x68, 0x3b, 0x12, 0xe4, 0xe8, + 0x25, 0x4e, 0x4e, 0xa7, 0x60, 0xd3, 0x8b, 0x3f, 0x46, 0x79, 0x1c, 0x5c, 0x4c, + 0xb1, 0x2b, 0xc7, 0xcc, 0xb0, 0xed, 0x18, 0x65, 0xf2, 0x5d, 0x60, 0x1c, 0x30, + 0x3f, 0x81, 0xfb, 0x1f, 0xa1, 0xdb, 0x48, 0x53, 0x3d, 0x3d, 0x6b, 0x28, 0x8e, + 0x4d, 0x9a, 0x4d, 0xff, 0x8e, 0xc2, 0x1c, 0x96, 0xf5, 0x78, 0x39, 0x97, 0x10, + 0xc8, 0x25, 0xfe, 0x7e, 0x32, 0xf9, 0x3a, 0x8c, 0x07, 0x43, 0xf9, 0xeb, 0xd5, + 0x4c, 0xc1, 0x51, 0xc7, 0x61, 0x03, 0x37, 0xae, 0xbf, 0x7e, 0x9b, 0x91, 0x57, + 0x20, 0xa5, 0x43, 0x51, 0xd4, 0x9a, 0xb8, 0xc2, 0x2f, 0xa3, 0x49, 0x98, 0xdc, + 0xf5, 0x28, 0x65, 0x9c, 0x24, 0x40, 0xd8, 0x6c, 0x8d, 0x42, 0x5c, 0xc2, 0x29, + 0x9c, 0x16, 0xeb, 0x02, 0xb6, 0x17, 0x0e, 0xc3, 0x33, 0xbd, 0x30, 0xd3, 0xc1, + 0xa1, 0x9d, 0x71, 0x52, 0xad, 0xaa, 0xb4, 0xce, 0x8d, 0xea, 0x5f, 0xef, 0x0e, + 0xf3, 0x02, 0x51, 0x48, 0x9f, 0xcf, 0x58, 0xd6, 0xe1, 0xad, 0x85, 0xa9, 0x14, + 0x8f, 0xbd, 0xf9, 0xa9, 0x53, 0x32, 0xaa, 0x60, 0x5c, 0x5d, 0x54, 0x83, 0x0e, + 0xaa, 0xdc, 0x4a, 0xeb, 0x1a, 0x2a, 0x07, 0x08, 0xb4, 0xd4, 0xdc, 0xf2, 0x83, + 0x54, 0x46, 0xe0, 0xad, 0xfa, 0x85, 0xe7, 0x60, 0xbc, 0x1b, 0xdd, 0x63, 0xb3, + 0xc2, 0x7b, 0x64, 0xf1, 0xbe, 0x9d, 0xa1, 0x49, 0xea, 0x9c, 0x85, 0xf3, 0x0b, + 0x93, 0xa0, 0x91, 0x6b, 0x1c, 0x05, 0x19, 0x29, 0xef, 0x29, 0xc7, 0x89, 0xa1, + 0x2a, 0x31, 0xad, 0x13, 0x14, 0xe2, 0xed, 0xe0, 0x8f, 0xad, 0x31, 0x03, 0xab, + 0xeb, 0xc7, 0xc3, 0x0b, 0xdd, 0x29, 0xfe, 0x9a, 0xbe, 0x9a, 0x55, 0xa0, 0x11, + 0x59, 0xc7, 0x52, 0xed, 0xad, 0x81, 0x74, 0x47, 0x0b, 0x43, 0xcc, 0x55, 0x47, + 0xbf, 0xac, 0xa6, 0xa8, 0x20, 0x18, 0x11, 0x7f, 0x72, 0x64, 0x13, 0x90, 0xf0, + 0x86, 0xb6, 0xe1, 0x49, 0x8b, 0xe6, 0x95, 0x48, 0x52, 0x7e, 0x6a, 0xda, 0x2b, + 0x38, 0xb9, 0xfe, 0x12, 0x1e, 0xf6, 0x70, 0xaf, 0x74, 0x37, 0xd3, 0x25, 0x36, + 0xd5, 0xcf, 0x5c, 0x4a, 0xb1, 0x9d, 0xd9, 0x97, 0x71, 0x58, 0x2d, 0x03, 0x81, + 0x04, 0xb7, 0xe0, 0x39, 0xa3, 0x76, 0xf7, 0xac, 0xbb, 0xea, 0xdb, 0x34, 0xf9, + 0x45, 0xbe, 0xb9, 0xd7, 0xca, 0x0e, 0x4e, 0x3d, 0x5c, 0x5e, 0x4e, 0xb1, 0xd8, + 0x52, 0x6e, 0xbd, 0x13, 0xda, 0xcb, 0x1b, 0xa3, 0x57, 0x35, 0xc6, 0xd0, 0x4a, + 0x45, 0x55, 0xac, 0xf4, 0xbf, 0x11, 0x76, 0x26, 0x50, 0x0d, 0x77, 0xb3, 0x81, + 0x89, 0xdd, 0x48, 0x88, 0x04, 0x12, 0x25, 0xac, 0xbe, 0x38, 0x74, 0xa4, 0xc0, + 0xf6, 0x07, 0xfe, 0x67, 0x45, 0xf9, 0x35, 0x5b, 0x3f, 0xa1, 0x88, 0xf1, 0xd6, + 0x5c, 0x09, 0xf3, 0x89, 0xaf, 0x1b, 0x9d, 0x62, 0x32, 0xaa, 0x79, 0x44, 0x79, + 0x19, 0xc5, 0x50, 0xf6, 0xf3, 0x1f, 0xec, 0x35, 0x48, 0x1c, 0xb9, 0x22, 0xde, + 0x2d, 0xb5, 0xb4, 0xda, 0x2f, 0x81, 0x94, 0x86, 0x17, 0x02, 0x8e, 0x32, 0x17, + 0x06, 0xa3, 0xa7, 0x78, 0xc1, 0x93, 0x8c, 0x44, 0x3b, 0xb0, 0x0e, 0x5b, 0x0f, + 0xf0, 0x6a, 0xd8, 0xab, 0x9b, 0x1a, 0xb0, 0xc1, 0x14, 0x77, 0x67, 0x3f, 0x85, + 0xdf, 0x95, 0x61, 0xdb, 0xea, 0x45, 0xd5, 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, + 0x07, 0x10, 0xae, 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, + 0x67, 0xb1, 0x49, 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, + 0x7b, 0xdc, 0x8b, 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, + 0xb3, 0xe8, 0x7a, 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, + 0x1e, 0xa0, 0xad, 0xe8, 0x24, 0xf3, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, + 0x91, 0x6a, 0x74, 0x38, 0x8e, 0xe8, 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, + 0xa2, 0x61, 0x3a, 0x06, 0x12, 0xc4, 0x69, 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, + 0xe4, 0xfc, 0x25, 0xc1, 0xca, 0xdb, 0xa9, 0x5a, 0x80, 0x7c, 0xe6, 0x1e, 0x5a, + 0x53, 0x03, 0xfa, 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, 0xb5, 0xa8, 0xad, 0xc3, + 0x4f, 0xd4, 0x75, 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, 0x1f, 0x3f, 0x07, + 0xda, 0x9a, 0x39, 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, 0x7a, 0xdf, + 0xe9, 0x56, 0x48, 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, 0x58, + 0x30, 0x99, 0xaf, 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, + 0xb6, 0xfd, 0x8c, 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, + 0xbc, 0x3e, 0x4e, 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, + 0x68, 0x76, 0xbe, 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, + 0x3d, 0x28, 0xc0, 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, + 0xfb, 0x40, 0xcf, 0xa5, 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, + 0xec, 0xee, 0x93, 0xd4, 0x6d, 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, + 0x54, 0x8b, 0x10, 0x9c, 0xe7, 0x64, 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, + 0x64, 0x94, 0xde, 0x82, 0xdb, 0x6e, 0x50, 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, + 0x9a, 0x40, 0xd7, 0xa3, 0x1c, 0x4a, 0x04, 0xb6, 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, + 0xdd, 0x56, 0xf5, 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, 0xf7, 0x95, 0x39, 0x81, + 0xd5, 0x5a, 0x96, 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, 0x42, 0xe5, 0xba, + 0xfe, 0xc8, 0x84, 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, 0x60, 0xf9, + 0x8f, 0xeb, 0x82, 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, 0x82, + 0x36, 0xc5, 0xca, 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, + 0xe5, 0x6c, 0x77, 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, + 0xbc, 0x6e, 0x65, 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, + 0x24, 0x1b, 0xf7, 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, + 0x52, 0x69, 0xfd, 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, + 0x99, 0x8a, 0x3f, 0x7d, 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, + 0x24, 0xc4, 0x98, 0x63, 0x5e, 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, + 0x9f, 0x73, 0x48, 0x8e, 0xb7, 0xcf, 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, + 0xf9, 0x1a, 0xd7, 0x75, 0x79, 0x65, 0xc2, 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, + 0x7e, 0x89, 0xee, 0x09, 0x62, 0xf5, 0x8c, 0x05, 0x1d, 0x11, 0xd0, 0x55, 0xfc, + 0xe2, 0x04, 0xa5, 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, 0x26, 0x48, 0xb8, 0x17, + 0x4c, 0xbc, 0xfc, 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x83, 0x6a, 0x7a, 0xbf, 0x02, + 0xcf, 0x1a, 0x4e, 0xb8, 0xed, 0xc9, 0xe0, 0xba, 0x76, 0x0f, 0x63, 0xb2, 0xd4, + 0x07, 0x61, 0x9c, 0x48, 0x2d, 0xaa, 0xb4, 0x20, 0x99, 0x55, 0xbb, 0x50, 0x9e, + 0x84, 0x99, 0x91, 0x17, 0x91, 0xb3, 0x0d, 0xf6, 0x13, 0xaa, 0xe8, 0x90, 0x1d, + 0x68, 0xef, 0x8d, 0x06, 0x63, 0xc0, 0xb6, 0x9c, 0x01, 0xfc, 0xc4, 0x53, 0x91, + 0xfd, 0x5b, 0x87, 0x63, 0xfb, 0x96, 0x17, 0xdd, 0x98, 0x85, 0xae, 0xba, 0x10, + 0x5b, 0xa2, 0x19, 0xdc, 0xa6, 0x6d, 0x96, 0xb8, 0x72, 0xd8, 0x80, 0x33, 0x91, + 0x4a, 0x7a, 0x0b, 0x85, 0xaa, 0x96, 0x29, 0x22, 0x6e, 0x01, 0x71, 0xa6, 0x0b, + 0x8b, 0x0c, 0x88, 0xa3, 0x24, 0x75, 0x58, 0xf3, 0xe1, 0xee, 0xf6, 0xde, 0xc7, + 0xb0, 0x91, 0xed, 0x3a, 0x5f, 0x39, 0xcb, 0x20, 0x23, 0xd4, 0x67, 0x89, 0xeb, + 0x7d, 0x98, 0x9a, 0xf7, 0x79, 0x25, 0x0b, 0x7c, 0xa3, 0xa1, 0xa0, 0x5c, 0xb3, + 0xc1, 0xee, 0xb0, 0xa4, 0xc8, 0x60, 0x18, 0xc2, 0xdb, 0xc9, 0x5b, 0x2b, 0x0b, + 0x2f, 0x40, 0x69, 0x82, 0xdb, 0x04, 0x16, 0x55, 0x46, 0xba, 0x0a, 0x08, 0xa0, + 0x70, 0xba, 0x05, 0xb3, 0xe4, 0xdb, 0xfd, 0x3a, 0x2b, 0xfc, 0xc9, 0xee, 0x6e, + 0xd0, 0x16, 0xc0, 0xf6, 0x65, 0xbe, 0x81, 0x33, 0xb7, 0xdc, 0x1d, 0x86, 0x04, + 0x4d, 0xb0, 0xf9, 0xdb, 0x40, 0xfb, 0x0e, 0x9f, 0x8b, 0xc2, 0xe4, 0xdb, 0x53, + 0x82, 0xa8, 0xb4, 0xf8, 0x15, 0xb4, 0xe8, 0x43, 0x4a, 0xd0, 0xdf, 0xbc, 0x51, + 0xa5, 0xe9, 0xb1, 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, + 0xfd, 0xaf, 0xbb, 0x0c, 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, + 0x8a, 0xba, 0x43, 0x64, 0xe8, 0x4b, 0xac, 0x37, 0x92, 0x98, 0xdf, 0x29, 0x32, + 0xe6, 0x9b, 0xb5, 0xd0, 0x45, 0x51, 0x6e, 0xfc, 0x33, 0xae, 0x6c, 0xc3, 0x94, + 0x7c, 0xeb, 0x09, 0xed, 0x37, 0x16, 0x67, 0x21, 0x2a, 0x83, 0x1b, 0x54, 0x85, + 0xea, 0xfc, 0xe8, 0x48, 0x81, 0x88, 0xea, 0x4e, 0x27, 0xd0, 0xcd, 0xf7, 0xdd, + 0xd3, 0x48, 0xab, 0xff, 0x77, 0x7f, 0x4a, 0x13, 0xbb, 0xc7, 0x16, 0xb6, 0xa5, + 0x94, 0x4e, 0xe7, 0x27, 0x96, 0x56, 0x90, 0xe2, 0x09, 0xb4, 0x9e, 0xb9, 0x62, + 0xc0, 0x39, 0x97, 0x5f, 0x93, 0x9e, 0xd5, 0xc6, 0xe4, 0xc4, 0x00, 0xd8, 0x87, + 0x75, 0x94, 0x33, 0xd3, 0xad, 0x71, 0x6d, 0xa0, 0xcb, 0x44, 0x61, 0x13, 0xc7, + 0x72, 0x7a, 0x64, 0xb5, 0x8c, 0x3f, 0x8a, 0x0f, 0x81, 0x18, 0x9f, 0x98, 0x00, + 0x52, 0x33, 0xa8, 0x13, 0x66, 0xae, 0xe7, 0x3c, 0xec, 0x85, 0x22, 0x8e, 0xbc, + 0xfd, 0x5e, 0xe3, 0xc3, 0xfb, 0x44, 0xdb, 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, + 0xb7, 0xb5, 0xfc, 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, + 0x83, 0x35, 0x65, 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, + 0xad, 0x8c, 0x7d, 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, + 0x05, 0x7c, 0x5a, 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, + 0x4c, 0x28, 0xa5, 0xfa, 0x38, 0x5d, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, + 0x42, 0x70, 0x7d, 0xb3, 0x69, 0x7a, 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, + 0xc0, 0x7f, 0xe4, 0x73, 0x50, 0xd1, 0x01, 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, + 0xfb, 0x7c, 0x73, 0xe8, 0x45, 0x0d, 0xf8, 0x14, 0xef, 0x62, 0x32, 0xf7, 0x49, + 0x0f, 0x63, 0xcc, 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, 0x6e, 0xaf, 0xfc, 0x28, + 0xfe, 0xa4, 0x48, 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, 0xc0, 0xc7, 0xf9, + 0xa7, 0xb1, 0x53, 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, 0x73, 0xde, + 0x19, 0x19, 0x31, 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, 0xeb, + 0xb2, 0x7d, 0xac, 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, + 0x7a, 0xe1, 0x0a, 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, + 0x59, 0x49, 0x43, 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, + 0x6b, 0xd2, 0x63, 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, + 0x9a, 0x7f, 0xfe, 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, + 0x2c, 0x39, 0x22, 0xf7, 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, + 0x8a, 0x84, 0xb5, 0xae, 0x2d, 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, + 0x0f, 0x96, 0x7e, 0x6b, 0x5b, 0xc9, 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, + 0x7c, 0x6e, 0xe1, 0xca, 0xd0, 0xd9, 0x74, 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, + 0xe4, 0xf6, 0x3d, 0x33, 0x15, 0x6d, 0xad, 0xd5, 0x4c, 0x2f, 0xaf, 0x89, 0x11, + 0x4a, 0x12, 0x7b, 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, 0xf3, 0x03, 0xf4, 0x59, + 0xd0, 0x4f, 0xc0, 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, 0xf3, 0x3a, 0x55, + 0x8b, 0xd7, 0x1a, 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, 0x4e, 0x02, + 0xc3, 0xc0, 0xa4, 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, 0x4c, + 0xb2, 0xd3, 0x23, 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, + 0x42, 0xc8, 0xb2, 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, + 0x60, 0x34, 0x51, 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, + 0xbb, 0x78, 0xd2, 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, + 0x3c, 0x1e, 0x2d, 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, + 0xe7, 0x48, 0x76, 0xc5, 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, + 0xe0, 0x0d, 0xde, 0x23, 0x6a, 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, + 0xaf, 0xde, 0x5c, 0x42, 0x36, 0x40, 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, + 0x11, 0xa2, 0xe1, 0xd1, 0x84, 0xc6, 0x7c, 0x52, 0x8d, 0xf9, 0x2d, 0x53, 0xae, + 0xc4, 0x4a, 0x40, 0xa4, 0xea, 0x2a, 0x13, 0x1b, 0x47, 0x33, 0xcf, 0xe4, 0x5c, + 0x6b, 0x00, 0x00, 0xe3, 0xb9, 0x7e, 0x98, 0xc3, 0x2a, 0x07, 0x00, 0x5c, 0xc0, + 0x2f, 0x35, 0xcd, 0x64, 0xf1, 0x4a, 0x9e, 0xa8, 0xd8, 0xc7, 0x08, 0x42, 0xd6, + 0x09, 0x01, 0xd2, 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, 0x0f, 0x12, + 0xb0, 0x11, 0xb2, 0x14, 0x36, 0x8e, 0xc7, 0x55, 0x76, 0xe4, 0x7d, 0x16, 0x9e, + 0x39, 0x38, 0xbf, 0x6a, 0xe2, 0xaa, 0x8f, 0xf7, 0xcf, 0xba, 0x7c, 0xac, 0xb1, + 0xf9, 0x2b, 0x6e, 0x4c, 0x24, 0x97, 0xbf, 0xfa, 0x9f, 0x17, 0xca, 0xd2, 0x42, + 0xfa, 0x9c, 0x31, 0x79, 0xc1, 0xa3, 0xaa, 0x81, 0xf7, 0x36, 0x16, 0x49, 0x57, + 0x2c, 0x71, 0x5c, 0x25, 0xa1, 0xf6, 0xcd, 0xf4, 0xef, 0xdb, 0x31, 0xf9, 0x7a, + 0x12, 0x2b, 0x0e, 0x34, 0x9e, 0x8d, 0x1e, 0x89, 0xb1, 0x7a, 0xa0, 0x58, 0xd2, + 0x11, 0xac, 0x1c, 0x36, 0x40, 0xfe, 0xa6, 0xcd, 0x73, 0x13, 0xff, 0xd5, 0x1d, + 0x18, 0x56, 0xa7, 0xe0, 0x92, 0x4d, 0x71, 0x0f, 0xdd, 0x4b, 0x15, 0xa1, 0x1f, + 0xba, 0x46, 0x7f, 0x09, 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0xe2, 0x96, 0x24, 0xc5, + 0x32, 0x19, 0xa6, 0x0c, 0xd0, 0x28, 0x8b, 0x81, 0x5d, 0xb3, 0x0e, 0x1b, 0x29, + 0x6e, 0x0c, 0xfd, 0x02, 0x7e, 0xc8, 0xf6, 0x30, 0x0d, 0x2e, 0x48, 0x29, 0x32, + 0x29, 0x99, 0x95, 0xcb, 0x84, 0x99, 0x66, 0x21, 0x47, 0x99, 0xee, 0x90, 0xc7, + 0xd5, 0x79, 0x2d, 0x22, 0xd9, 0x10, 0x49, 0x01, 0xee, 0xbd, 0x30, 0x57, 0x3d, + 0x21, 0xca, 0x5c, 0x4e, 0xf9, 0xd5, 0x02, 0xa1, 0x6f, 0x15, 0x22, 0x47, 0x58, + 0x96, 0xd7, 0x9b, 0xc5, 0x38, 0xf7, 0x52, 0xcc, 0x29, 0x5b, 0x3e, 0x4c, 0x94, + 0x0f, 0x99, 0xc3, 0xca, 0xf4, 0xa5, 0xb9, 0xb5, 0x2e, 0x74, 0xc4, 0xe8, 0xd9, + 0x86, 0x4e, 0x64, 0xd0, 0x17, 0xcd, 0x37, 0x12, 0x91, 0xf0, 0xbe, 0xeb, 0x22, + 0x13, 0xfc, 0x4a, 0xf1, 0xe4, 0x50, 0xe4, 0xd5, 0x21, 0x7c, 0x66, 0x17, 0x00, + 0x8c, 0x78, 0xf4, 0xfb, 0x11, 0x12, 0xf4, 0x02, 0x8a, 0x70, 0x4f, 0xc5, 0xa9, + 0x38, 0x2c, 0x6b, 0x03, 0xb5, 0x34, 0x96, 0x84, 0x08, 0x3e, 0xc9, 0x48, 0x26, + 0x41, 0x61, 0xda, 0x8f, 0x7b, 0xce, 0xb5, 0x96, 0x0e, 0xdf, 0xd4, 0xc1, 0xfd, + 0x08, 0xc5, 0xb2, 0x46, 0xe0, 0xa2, 0x86, 0xac, 0x1a, 0x38, 0x87, 0x8d, 0xf7, + 0xfc, 0x90, 0xd7, 0x17, 0x7f, 0x6c, 0x18, 0x0c, 0x81, 0x6d, 0x58, 0x24, 0x53, + 0xd8, 0x17, 0x85, 0x60, 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, + 0x42, 0x3e, 0x2e, 0xae, 0xa6, 0xc8, 0x44, 0xc3, 0x28, 0x53, 0x4b, 0xc6, 0x91, + 0x39, 0x07, 0x03, 0x24, 0x7c, 0x89, 0xe2, 0x92, 0xa3, 0xae, 0x09, 0xe5, 0x35, + 0x61, 0x16, 0x62, 0x38, 0x3e, 0x14, 0x1a, 0x54, 0x2a, 0xf9, 0xe4, 0x62, 0xa7, + 0x38, 0xf8, 0x94, 0xe9, 0x89, 0xce, 0x99, 0xa8, 0x9c, 0xdc, 0x7f, 0x40, 0x6b, + 0x87, 0xe0, 0x09, 0x12, 0x1e, 0x06, 0xf6, 0xa1, 0xbf, 0x62, 0xa0, 0x8b, 0xf4, + 0x35, 0x19, ], txid: [ - 0x3f, 0x1b, 0x9f, 0xaa, 0x40, 0x5d, 0x82, 0x70, 0xe2, 0xd9, 0x53, 0x8e, 0x33, - 0x9f, 0x91, 0x97, 0x93, 0x84, 0x16, 0x91, 0xab, 0x03, 0x3d, 0x18, 0x30, 0xa8, - 0xdc, 0xbe, 0xed, 0x4a, 0xfc, 0x4d, + 0xa3, 0xa2, 0x20, 0x42, 0xd0, 0x60, 0x1b, 0xa1, 0xaf, 0xe7, 0x87, 0x17, 0x25, + 0xbf, 0xbe, 0xdc, 0x9f, 0x71, 0xaa, 0x18, 0x71, 0x27, 0x54, 0x03, 0xf2, 0x9a, + 0x40, 0x9e, 0x89, 0x00, 0x79, 0x3d, ], auth_digest: [ - 0xc9, 0x0c, 0x05, 0x9f, 0xeb, 0x7c, 0x80, 0x7a, 0x6b, 0x34, 0x77, 0x7c, 0x14, - 0xa6, 0xc0, 0x28, 0xb0, 0x92, 0xd8, 0x2c, 0xd5, 0x85, 0x5e, 0xd5, 0xfe, 0x8d, - 0xef, 0xae, 0x87, 0xd2, 0x89, 0xf7, + 0x3e, 0xbb, 0x77, 0x16, 0xca, 0x0b, 0x7a, 0x41, 0x85, 0x19, 0xc0, 0xcc, 0x14, + 0xd8, 0x79, 0xdc, 0x26, 0x70, 0x23, 0xaa, 0xc3, 0x80, 0x84, 0xb8, 0x4d, 0xe3, + 0xd9, 0xa3, 0x21, 0xf9, 0xf7, 0x85, ], amounts: vec![], script_pubkeys: vec![], transparent_input: None, sighash_shielded: [ - 0x3f, 0x1b, 0x9f, 0xaa, 0x40, 0x5d, 0x82, 0x70, 0xe2, 0xd9, 0x53, 0x8e, 0x33, - 0x9f, 0x91, 0x97, 0x93, 0x84, 0x16, 0x91, 0xab, 0x03, 0x3d, 0x18, 0x30, 0xa8, - 0xdc, 0xbe, 0xed, 0x4a, 0xfc, 0x4d, + 0xa3, 0xa2, 0x20, 0x42, 0xd0, 0x60, 0x1b, 0xa1, 0xaf, 0xe7, 0x87, 0x17, 0x25, + 0xbf, 0xbe, 0xdc, 0x9f, 0x71, 0xaa, 0x18, 0x71, 0x27, 0x54, 0x03, 0xf2, 0x9a, + 0x40, 0x9e, 0x89, 0x00, 0x79, 0x3d, ], sighash_all: None, sighash_none: None, @@ -6738,638 +7240,179 @@ pub mod zip_0244 { }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x1b, - 0xfe, 0xb9, 0x1b, 0x0b, 0x31, 0x69, 0x1c, 0x03, 0xc2, 0xe8, 0x25, 0xa5, 0x97, - 0xb8, 0xfb, 0x75, 0xbc, 0x56, 0x2d, 0x65, 0x4d, 0x62, 0x10, 0x46, 0x40, 0xdd, - 0x74, 0xe5, 0x6c, 0xd1, 0x4b, 0xaa, 0xba, 0x56, 0x5b, 0x84, 0xb8, 0x45, 0xe1, - 0x63, 0xd1, 0xca, 0xef, 0x25, 0x01, 0x53, 0x98, 0x16, 0x37, 0x20, 0x4f, 0x96, - 0xa5, 0x9c, 0x8e, 0x80, 0x24, 0xd9, 0x04, 0x1b, 0x20, 0x29, 0xe9, 0x4c, 0x15, - 0x24, 0x5f, 0x1a, 0x95, 0x88, 0x40, 0xba, 0x3f, 0x38, 0x0a, 0x4d, 0x20, 0xf1, - 0x18, 0x4e, 0x77, 0x82, 0x7d, 0xe3, 0xff, 0x8f, 0x01, 0x53, 0x45, 0x9a, 0xfe, - 0x24, 0x1f, 0x72, 0x3c, 0x08, 0x48, 0x23, 0x23, 0x0e, 0x00, 0x3d, 0x3d, 0x21, - 0xe5, 0x35, 0x01, 0xec, 0x04, 0x99, 0xb0, 0x83, 0xa7, 0xda, 0xd6, 0x85, 0xc5, - 0x71, 0x27, 0xf4, 0xde, 0x64, 0x73, 0x3a, 0x88, 0x0c, 0x2d, 0xb2, 0x07, 0x52, - 0x53, 0x51, 0x63, 0x52, 0x52, 0x63, 0xf6, 0x64, 0xa3, 0x51, 0x00, 0x00, 0x00, - 0x03, 0xf9, 0x27, 0xb9, 0x46, 0x9e, 0x18, 0x22, 0x9d, 0x02, 0xc3, 0x3d, 0xec, - 0x3f, 0x11, 0x7c, 0x5d, 0x2a, 0x8a, 0x85, 0xdb, 0x9b, 0x57, 0x56, 0xdd, 0x52, - 0xb8, 0x19, 0x0d, 0xb2, 0x59, 0x62, 0x80, 0xfa, 0x21, 0x39, 0x43, 0x77, 0xa4, - 0x55, 0x1c, 0x76, 0xd1, 0xf7, 0x5a, 0xc0, 0x3c, 0x26, 0x20, 0x54, 0xdf, 0xfd, - 0x79, 0xa9, 0xde, 0xd0, 0x5e, 0x88, 0x89, 0x58, 0x19, 0x9e, 0xea, 0x45, 0x01, - 0xcc, 0xfa, 0x41, 0x52, 0xd4, 0x45, 0xa6, 0xb3, 0x08, 0x54, 0x9e, 0xfc, 0x1d, - 0x9b, 0x2b, 0x97, 0xd3, 0x9d, 0xa9, 0x0c, 0x63, 0x88, 0xbe, 0x80, 0x52, 0x45, - 0x83, 0x25, 0xbf, 0xd2, 0xf5, 0xbf, 0x73, 0x74, 0x1d, 0x57, 0x85, 0x83, 0x7a, - 0x6b, 0x84, 0x4b, 0x47, 0x47, 0x75, 0x71, 0x8c, 0x29, 0xdd, 0x99, 0x08, 0x4e, - 0x9f, 0x88, 0xef, 0x15, 0x3a, 0x83, 0x29, 0xf5, 0x32, 0xa6, 0x90, 0x17, 0x1c, - 0x2d, 0x1e, 0x30, 0x74, 0xdf, 0xae, 0x3e, 0x23, 0xdb, 0x39, 0x48, 0xa4, 0x53, - 0xc3, 0x94, 0x81, 0xa9, 0x91, 0x4d, 0xd0, 0xac, 0x79, 0xe9, 0x27, 0x36, 0x01, - 0x29, 0xbe, 0x3a, 0x7f, 0x11, 0x95, 0x44, 0x12, 0x20, 0x00, 0x61, 0x0b, 0xd2, - 0xaa, 0xcb, 0xd8, 0x23, 0x25, 0xa5, 0x9b, 0x95, 0x15, 0x4e, 0xcd, 0x82, 0xc8, - 0x8d, 0x23, 0xab, 0xd1, 0xe2, 0x07, 0x70, 0xff, 0xb8, 0xaa, 0xbf, 0x83, 0xfc, - 0x07, 0x34, 0x96, 0x4c, 0xcd, 0x41, 0x1d, 0x1c, 0x93, 0x57, 0x14, 0xe2, 0x4a, - 0xab, 0x56, 0x6f, 0x4f, 0x08, 0x42, 0x40, 0x14, 0xc4, 0xec, 0xa9, 0x1b, 0x59, - 0x0f, 0x08, 0x2b, 0x47, 0x3f, 0x36, 0x1c, 0x87, 0x41, 0x5d, 0x37, 0xbd, 0x20, - 0xd7, 0x0f, 0xd0, 0xb5, 0x2b, 0x6d, 0xdf, 0x18, 0x65, 0xf7, 0x66, 0x70, 0x2e, - 0x32, 0xb0, 0x5b, 0x3c, 0xf1, 0x63, 0x0e, 0xe8, 0x59, 0x7a, 0xae, 0x19, 0x63, - 0x3f, 0x35, 0x16, 0xa8, 0x55, 0x5a, 0xc5, 0xbe, 0x32, 0xc6, 0x75, 0xbe, 0x18, - 0x17, 0xef, 0xbf, 0xfd, 0x93, 0x69, 0x04, 0x1a, 0x08, 0x9c, 0x28, 0x3f, 0x19, - 0x64, 0x99, 0x68, 0xc2, 0x49, 0x8c, 0xde, 0x56, 0xf5, 0x00, 0x43, 0x4f, 0x28, - 0x0d, 0x77, 0xa9, 0xc6, 0x2e, 0x43, 0xcb, 0xd3, 0xf1, 0x36, 0xa4, 0xc6, 0xa0, - 0x0a, 0x43, 0xe6, 0xed, 0x53, 0x0c, 0xb2, 0xe8, 0xae, 0x83, 0x88, 0x60, 0xad, - 0xc8, 0x8a, 0xac, 0xc7, 0xbd, 0x6a, 0x00, 0xae, 0x0c, 0x19, 0xff, 0x45, 0x33, - 0xa4, 0x85, 0xef, 0xde, 0x08, 0x2b, 0x5f, 0x4d, 0x1f, 0x7a, 0x8e, 0xbe, 0x7e, - 0xd8, 0x2b, 0x7b, 0x05, 0xa8, 0xcf, 0xe1, 0xe3, 0x73, 0x45, 0x9f, 0x1b, 0xdc, - 0xbf, 0x95, 0x25, 0x74, 0x7e, 0x8c, 0x95, 0x08, 0xa5, 0x55, 0xfa, 0xcb, 0x79, - 0x87, 0x40, 0xe0, 0xbd, 0xf9, 0x94, 0xd9, 0x73, 0x9b, 0xbe, 0x55, 0x38, 0xa0, - 0xae, 0x0f, 0x07, 0x6c, 0x58, 0x2c, 0x0f, 0x5b, 0xa8, 0x78, 0xb9, 0x9b, 0x82, - 0x49, 0xdb, 0x1d, 0x7e, 0x95, 0x05, 0x6c, 0x98, 0xaf, 0x08, 0x3d, 0x98, 0xcb, - 0x0e, 0xd9, 0xe3, 0xf7, 0x43, 0x6e, 0x1c, 0x76, 0x43, 0x76, 0x6f, 0x96, 0x6b, - 0x83, 0xe9, 0x99, 0x20, 0x6e, 0xbd, 0x13, 0x93, 0xb9, 0xb2, 0xa7, 0xf4, 0x14, - 0x48, 0x0f, 0xa0, 0x17, 0x48, 0x00, 0x69, 0xf8, 0x5c, 0x77, 0x49, 0xc4, 0x35, - 0xae, 0x2f, 0xba, 0x2d, 0xdc, 0x10, 0x38, 0xd5, 0x47, 0xd8, 0x48, 0x54, 0x81, - 0x7e, 0xf3, 0x96, 0x35, 0xc2, 0x98, 0x27, 0xaa, 0xd8, 0x67, 0x26, 0xc9, 0xad, - 0xe3, 0xb2, 0x65, 0xb9, 0x08, 0x6c, 0x8b, 0x5b, 0x75, 0xef, 0x56, 0xfe, 0x4b, - 0xd8, 0xb4, 0xd6, 0x28, 0x93, 0x89, 0x5b, 0x3f, 0xd2, 0x73, 0x4f, 0xda, 0xc4, - 0x64, 0x15, 0x6d, 0x7e, 0x5e, 0xbc, 0x7e, 0xcf, 0x1d, 0x83, 0xb8, 0x6f, 0x65, - 0x96, 0x37, 0xe3, 0xb1, 0x42, 0xc1, 0x64, 0x96, 0x3b, 0x8c, 0xdc, 0xf4, 0xba, - 0x4f, 0x40, 0x35, 0xdf, 0xfc, 0x5a, 0x78, 0x94, 0x58, 0x84, 0x77, 0x81, 0x91, - 0x8a, 0xc7, 0x2f, 0xc1, 0x8b, 0xbb, 0xf5, 0x11, 0x00, 0x32, 0xe6, 0x6d, 0x75, - 0xb3, 0x17, 0x1e, 0xf4, 0xb5, 0x13, 0x29, 0x01, 0x64, 0xa7, 0x7b, 0x42, 0xb0, - 0xa4, 0xcf, 0xb8, 0x96, 0x39, 0xab, 0x23, 0x84, 0x5e, 0x1a, 0xa2, 0xa4, 0x52, - 0xf3, 0x73, 0x1c, 0x8c, 0xb6, 0x50, 0x82, 0xa6, 0x22, 0xa7, 0xc2, 0xe0, 0x01, - 0x3e, 0xa4, 0x7d, 0x0b, 0xdd, 0x42, 0xd6, 0x99, 0x04, 0x66, 0x64, 0x9a, 0x90, - 0x5c, 0x68, 0x4c, 0x32, 0x51, 0x71, 0x6d, 0x61, 0xf7, 0x60, 0xd5, 0x3d, 0xe6, - 0xe3, 0xf7, 0x90, 0xfb, 0xa7, 0xf5, 0xf1, 0xf4, 0xde, 0x26, 0x71, 0x13, 0xbd, - 0xfc, 0xd7, 0x42, 0x28, 0x22, 0x33, 0x0b, 0x32, 0xd5, 0x8e, 0x67, 0x77, 0x76, - 0x5f, 0x22, 0xa4, 0x11, 0x63, 0x44, 0xee, 0xb6, 0x5b, 0x2e, 0xc5, 0x16, 0x39, - 0x3a, 0xb3, 0x75, 0x1b, 0x53, 0x56, 0xd2, 0xb0, 0xc9, 0x50, 0x0c, 0x0f, 0x3e, - 0x46, 0x91, 0x81, 0x03, 0x5b, 0xc3, 0x66, 0x0f, 0x0b, 0x8f, 0x9f, 0xbe, 0x6e, - 0x40, 0xb5, 0xe8, 0x9c, 0xb7, 0x9b, 0x06, 0x37, 0x14, 0xca, 0x75, 0xe7, 0x2e, - 0x2e, 0x10, 0x0a, 0x10, 0xd6, 0x3b, 0xf7, 0x84, 0xdf, 0x08, 0x20, 0xef, 0x25, - 0xf8, 0xef, 0x40, 0xfe, 0x5f, 0x05, 0xfb, 0x95, 0x68, 0x3f, 0x91, 0x05, 0xff, - 0x3c, 0xb2, 0xd2, 0x19, 0xab, 0x76, 0x60, 0x5a, 0x06, 0x4f, 0x69, 0x21, 0x9f, - 0x1d, 0xc0, 0xd0, 0x0b, 0x3b, 0x48, 0x64, 0x2f, 0x97, 0x0d, 0xc0, 0x0c, 0xca, - 0x4b, 0x8b, 0x43, 0x30, 0x8b, 0xe1, 0x82, 0x86, 0xec, 0x5a, 0x42, 0x88, 0xd6, - 0x00, 0xa3, 0x78, 0x5c, 0xb6, 0x22, 0xd4, 0x68, 0xa4, 0xc6, 0x96, 0x9b, 0x37, - 0x92, 0xf2, 0x48, 0x50, 0x27, 0xd0, 0xad, 0x9a, 0xa4, 0xa9, 0xc2, 0xcc, 0x97, - 0x2f, 0x9e, 0xe5, 0x19, 0x0a, 0x95, 0xb1, 0xeb, 0x05, 0x8d, 0xdd, 0xd8, 0xc0, - 0x8e, 0x7d, 0x75, 0x3f, 0x5e, 0x01, 0x1b, 0x2b, 0xcf, 0xee, 0x1d, 0x52, 0xc1, - 0xc4, 0xf2, 0x0a, 0xa3, 0xf7, 0x12, 0x74, 0x1f, 0xc0, 0x93, 0xa1, 0xb3, 0x6a, - 0xf5, 0x55, 0xf7, 0x4e, 0x30, 0xf8, 0x5d, 0x5c, 0xc9, 0x59, 0x30, 0x7f, 0x74, - 0x35, 0xf7, 0xef, 0x04, 0xca, 0x2c, 0x31, 0x25, 0xbc, 0xef, 0x2a, 0x99, 0x01, - 0x76, 0xae, 0x33, 0x93, 0x25, 0xd5, 0xa5, 0x88, 0xda, 0x57, 0x96, 0xfa, 0xae, - 0x5b, 0xab, 0x7c, 0x82, 0x97, 0x7c, 0x0f, 0xf7, 0x97, 0x09, 0x3e, 0x2c, 0x1f, - 0x3a, 0x77, 0x82, 0xa6, 0xd3, 0x9a, 0x61, 0xee, 0x55, 0x28, 0x99, 0x0d, 0x8d, - 0x36, 0x9e, 0x8e, 0xdc, 0xfe, 0x38, 0xbb, 0x70, 0x2d, 0xff, 0x02, 0xda, 0x34, - 0x28, 0x54, 0x5d, 0x9d, 0x61, 0x57, 0xa5, 0x1e, 0x55, 0xeb, 0xca, 0x6a, 0x85, - 0x06, 0xe3, 0x69, 0x9a, 0x3d, 0x70, 0x85, 0xa4, 0xd9, 0xfe, 0xd5, 0x09, 0x4c, - 0x68, 0xb3, 0x75, 0xe9, 0x84, 0xf6, 0x83, 0x93, 0x30, 0x08, 0x71, 0xe3, 0x08, - 0xfc, 0xf7, 0x4e, 0x27, 0x6b, 0x62, 0x26, 0x6a, 0x8f, 0x4e, 0xe3, 0x94, 0x5f, - 0x09, 0x4d, 0x17, 0xa7, 0xc0, 0x7c, 0xfe, 0x0b, 0xfd, 0x48, 0x95, 0xa1, 0x4f, - 0xac, 0x97, 0x1c, 0x92, 0xa1, 0x95, 0xb4, 0x42, 0x68, 0x3c, 0x49, 0x56, 0xbb, - 0xb1, 0x95, 0xa4, 0xfa, 0x66, 0xdc, 0x9c, 0xd5, 0x42, 0xc7, 0x6b, 0x91, 0x50, - 0xc8, 0x4b, 0xf8, 0x90, 0x78, 0x99, 0x42, 0xf5, 0x5c, 0x20, 0x0b, 0x77, 0x3e, - 0xcd, 0xd7, 0x99, 0x2c, 0xff, 0x3e, 0xca, 0x24, 0xde, 0x3e, 0x09, 0x84, 0xe1, - 0x0e, 0x68, 0xae, 0x38, 0x75, 0x34, 0xb9, 0x6c, 0xde, 0x37, 0x92, 0xf1, 0x35, - 0xbf, 0x5f, 0x68, 0x78, 0x7d, 0x37, 0x0c, 0xa8, 0xc4, 0xc4, 0x07, 0x4d, 0xc5, - 0xd6, 0x01, 0xae, 0x90, 0x49, 0x54, 0x37, 0xc3, 0xc2, 0xd4, 0x8a, 0x3d, 0x96, - 0x66, 0x83, 0xac, 0x05, 0x16, 0x0b, 0x7a, 0x84, 0xea, 0xa7, 0xaa, 0xb7, 0x40, - 0x09, 0xe5, 0x7a, 0x85, 0xf7, 0xbf, 0x68, 0xa2, 0xe4, 0x82, 0x00, 0x0f, 0x82, - 0x9c, 0x54, 0x50, 0x73, 0xa1, 0x5d, 0x5c, 0xd0, 0xfc, 0xc5, 0x74, 0x39, 0xa4, - 0x35, 0x0e, 0xaf, 0x09, 0x8d, 0xfb, 0x82, 0xa0, 0x85, 0xea, 0x8a, 0x4a, 0xf6, - 0xfa, 0x83, 0x81, 0xf0, 0x65, 0x88, 0x19, 0xea, 0xb4, 0x83, 0xf6, 0x5b, 0x32, - 0x5d, 0x5a, 0xed, 0xa1, 0x52, 0x32, 0xcf, 0xad, 0xec, 0x75, 0xab, 0x18, 0x66, - 0xe4, 0xc0, 0x15, 0x5a, 0x9c, 0x74, 0xa7, 0xa5, 0x7c, 0xcf, 0x34, 0xc4, 0x83, - 0xac, 0x7d, 0xa1, 0x58, 0x8a, 0x1b, 0x6b, 0x99, 0x41, 0xf1, 0x10, 0x40, 0xf9, - 0x4c, 0xf7, 0x8f, 0xad, 0x89, 0xbf, 0x11, 0xfe, 0xd6, 0x9a, 0xa0, 0xd8, 0x31, - 0x05, 0xad, 0xac, 0xdd, 0x4e, 0x5f, 0x04, 0xa6, 0x24, 0x24, 0x02, 0x3c, 0x9b, - 0x9e, 0x33, 0xc4, 0xfb, 0x7f, 0x12, 0xbd, 0xf2, 0x1f, 0x07, 0xf2, 0x65, 0xc5, - 0x37, 0xd5, 0x1c, 0x65, 0x51, 0xf4, 0x61, 0x7b, 0x91, 0x5d, 0x21, 0x99, 0x18, - 0x39, 0xc3, 0xd0, 0xd3, 0x63, 0x93, 0xd6, 0x46, 0xe0, 0xa8, 0xa4, 0x15, 0x09, - 0x21, 0x7d, 0x0e, 0x7d, 0x2c, 0xa1, 0xa0, 0xa0, 0xd6, 0x77, 0xa3, 0xea, 0xca, - 0x23, 0xed, 0xeb, 0x07, 0xb7, 0x4e, 0x65, 0x2a, 0x0b, 0xc5, 0x0c, 0x6c, 0x08, - 0x3a, 0x55, 0xd6, 0xc7, 0x30, 0x6e, 0x74, 0x08, 0x6f, 0x47, 0x68, 0x93, 0x3a, - 0xa2, 0x48, 0x73, 0x68, 0x18, 0x67, 0xa7, 0x89, 0x3d, 0x77, 0xcb, 0x7f, 0x29, - 0xb8, 0xc8, 0x47, 0xc5, 0x83, 0xf2, 0xd0, 0x71, 0xa6, 0x86, 0x61, 0x6e, 0x20, - 0x67, 0x19, 0xf7, 0x61, 0xae, 0x39, 0xc1, 0x10, 0x44, 0x2e, 0x06, 0x16, 0x3d, - 0x2b, 0x84, 0x59, 0x03, 0x60, 0x69, 0x5d, 0x4e, 0x19, 0x84, 0x9e, 0x63, 0x4f, - 0x24, 0xd9, 0xad, 0x39, 0x6c, 0x19, 0xff, 0x83, 0xce, 0x74, 0xf4, 0x6e, 0x64, - 0x5f, 0x93, 0x2e, 0x14, 0x1a, 0x41, 0x19, 0x59, 0x36, 0xc8, 0x5d, 0x51, 0x44, - 0x14, 0xf1, 0x12, 0xe6, 0x0b, 0x1a, 0x25, 0x37, 0xc3, 0x8d, 0x6d, 0xc6, 0xc4, - 0x63, 0x83, 0x05, 0xc9, 0xbd, 0x6c, 0x62, 0xe3, 0x66, 0xbc, 0x63, 0x12, 0x3e, - 0x3e, 0x6d, 0xd3, 0x6e, 0xed, 0xd3, 0x13, 0x6f, 0xce, 0x8d, 0xee, 0xca, 0x2a, - 0xa0, 0x9a, 0x32, 0x98, 0xa3, 0x9d, 0x83, 0x85, 0x9e, 0xfc, 0x9b, 0x2b, 0x69, - 0xcf, 0x9a, 0x7d, 0xee, 0x08, 0xa9, 0x8e, 0x4b, 0xe5, 0x58, 0xac, 0x79, 0x12, - 0xfd, 0xcb, 0x42, 0x20, 0x90, 0x75, 0x42, 0x02, 0x60, 0xf7, 0xca, 0xd0, 0xf2, - 0xc0, 0x1f, 0x2a, 0xfe, 0x33, 0x07, 0x3f, 0x26, 0x24, 0x9d, 0x94, 0x4f, 0x7a, - 0x50, 0xdd, 0x84, 0x83, 0x9b, 0xc3, 0xea, 0x7f, 0xde, 0xe4, 0xed, 0x71, 0x44, - 0x9c, 0xf0, 0x75, 0x33, 0xd2, 0x6e, 0x1e, 0x27, 0xa3, 0xef, 0xb0, 0x32, 0xc3, - 0xa3, 0xb3, 0x4b, 0xd3, 0x09, 0x26, 0x22, 0xd2, 0x06, 0x2a, 0xe5, 0x36, 0xef, - 0x51, 0x49, 0xc4, 0x9b, 0x5b, 0xc9, 0x47, 0x5e, 0xaf, 0xab, 0x6e, 0x67, 0x57, - 0x61, 0x00, 0x8b, 0x0d, 0xad, 0xde, 0xec, 0xaa, 0x60, 0x44, 0x70, 0xbb, 0xe0, - 0xfa, 0xda, 0x25, 0x5d, 0x29, 0x0e, 0x92, 0xb1, 0x90, 0xc2, 0xc2, 0xd8, 0xc2, - 0xde, 0xe5, 0x45, 0x5d, 0x1f, 0xa9, 0xa9, 0xf3, 0xdb, 0x77, 0x79, 0xb5, 0x84, - 0x64, 0x34, 0x64, 0xaa, 0x80, 0x14, 0xba, 0x66, 0x99, 0x4d, 0xe2, 0x55, 0x17, - 0xf8, 0x39, 0x80, 0xe6, 0x6e, 0xe4, 0xf6, 0x23, 0x14, 0xae, 0x6d, 0xbe, 0xf4, - 0x52, 0xd5, 0xd3, 0x8b, 0x0a, 0x16, 0xf3, 0x99, 0x1f, 0x36, 0xd8, 0xa8, 0xb3, - 0x9d, 0xdc, 0x0d, 0x55, 0x95, 0xee, 0xd9, 0x87, 0x62, 0x87, 0x8c, 0xdf, 0x3f, - 0x4a, 0x2e, 0xdc, 0x5c, 0xda, 0x77, 0xd5, 0xfe, 0x4f, 0xaf, 0x63, 0xa1, 0x5f, - 0x56, 0x8a, 0x54, 0x0d, 0xa5, 0x7d, 0xd9, 0xbe, 0xb6, 0xfb, 0x1a, 0x97, 0x7c, - 0xcb, 0x91, 0xb4, 0xd7, 0x9c, 0xb3, 0x9b, 0x28, 0x91, 0x1a, 0x29, 0xe7, 0xbf, - 0x02, 0x8a, 0xc6, 0x10, 0x37, 0x96, 0xdf, 0xb6, 0xb2, 0x09, 0x67, 0x23, 0x9a, - 0xd3, 0x73, 0xc3, 0xc5, 0x1d, 0x39, 0x27, 0xf2, 0x38, 0x00, 0x19, 0xfb, 0xdb, - 0xdd, 0xe5, 0x96, 0x97, 0x32, 0x26, 0x36, 0xa0, 0xae, 0xa1, 0xfd, 0x22, 0xc5, - 0x88, 0x57, 0x5c, 0x0f, 0x89, 0x64, 0x9e, 0x9f, 0x3e, 0xd3, 0x93, 0xcc, 0xca, - 0xbb, 0xa2, 0xe7, 0x94, 0xb7, 0xc4, 0xb2, 0xda, 0xf8, 0xdd, 0xeb, 0x7f, 0x45, - 0x27, 0x0d, 0x3f, 0x95, 0xed, 0xba, 0x5b, 0x0d, 0xe7, 0xa3, 0x28, 0x19, 0x23, - 0x3b, 0x0c, 0x55, 0x35, 0x01, 0x14, 0xcc, 0xbc, 0x48, 0x15, 0x86, 0xfd, 0x05, - 0x42, 0xc3, 0xa0, 0xaf, 0xdd, 0x24, 0x52, 0x28, 0xac, 0x74, 0x74, 0xb3, 0xf5, - 0x49, 0xb1, 0x03, 0xa0, 0x06, 0x2d, 0xf1, 0xbd, 0xae, 0x35, 0xbe, 0x3f, 0x6a, - 0x92, 0xda, 0xd6, 0x17, 0x7c, 0xb8, 0x48, 0xee, 0xe2, 0x4c, 0x85, 0x20, 0xa3, - 0x30, 0xbd, 0xfb, 0x26, 0xd7, 0x5f, 0xe7, 0xb4, 0xb3, 0x65, 0xd0, 0x94, 0x45, - 0x12, 0x22, 0xea, 0xe1, 0x8b, 0x98, 0x49, 0xf5, 0xaa, 0x17, 0xe5, 0x2c, 0xa5, - 0xc7, 0x1e, 0x84, 0x40, 0x75, 0xcd, 0x44, 0x03, 0x8e, 0x5c, 0x89, 0x4c, 0xa2, - 0xcd, 0x19, 0x76, 0x5c, 0xf8, 0xf6, 0x1b, 0x61, 0x9a, 0xf0, 0x24, 0x56, 0xae, - 0x69, 0x59, 0x62, 0xfe, 0x5e, 0x93, 0x1a, 0x63, 0xb5, 0xc7, 0x90, 0x52, 0xec, - 0xd3, 0x33, 0xe1, 0x84, 0x12, 0xdb, 0x91, 0xe1, 0x5f, 0x7c, 0xbc, 0x70, 0xb4, - 0xcd, 0x7e, 0x8e, 0x3c, 0x95, 0x1f, 0x35, 0x85, 0x72, 0xe3, 0x77, 0x67, 0xe7, - 0xd5, 0x27, 0x04, 0xa6, 0x72, 0x1b, 0x30, 0xef, 0xc4, 0x10, 0x17, 0xae, 0x4d, - 0x23, 0x15, 0x58, 0xc5, 0xc8, 0x2c, 0xc7, 0xdd, 0x7e, 0x33, 0x56, 0xc0, 0x9d, - 0xc2, 0x49, 0x06, 0xf0, 0x43, 0x8d, 0xfc, 0xc3, 0x00, 0x85, 0x6a, 0xc2, 0xce, - 0xd8, 0xf7, 0x7f, 0xa8, 0x01, 0x57, 0x36, 0xc6, 0x61, 0xe8, 0x02, 0x48, 0xae, - 0xeb, 0x77, 0x48, 0x74, 0xaa, 0x79, 0xd2, 0x90, 0xb8, 0xf5, 0x02, 0x7a, 0x0a, - 0x50, 0x95, 0x37, 0xfc, 0x7c, 0x68, 0x9b, 0x7a, 0xd8, 0x61, 0x16, 0xcf, 0xec, - 0x26, 0x47, 0xcc, 0xaa, 0xe1, 0xc7, 0x4b, 0x41, 0x6f, 0x3e, 0x6a, 0xe8, 0xf7, - 0xcc, 0x60, 0xea, 0xaf, 0x7b, 0x6a, 0x59, 0x0d, 0x51, 0x54, 0x41, 0x38, 0xe1, - 0x73, 0x29, 0x45, 0x60, 0x3a, 0x53, 0x46, 0x2c, 0x60, 0xe1, 0xf6, 0xcb, 0x0c, - 0x9c, 0xa0, 0x39, 0x0c, 0x48, 0x82, 0x24, 0xc3, 0x13, 0x26, 0x9f, 0xcd, 0x59, - 0xfc, 0xb6, 0x11, 0xfb, 0x2d, 0x9b, 0x4c, 0x8f, 0xa6, 0x01, 0xbb, 0x1c, 0xb8, - 0xd0, 0x7d, 0x79, 0x7b, 0xf5, 0xde, 0x52, 0xbc, 0xee, 0xb0, 0x23, 0x01, 0xc8, - 0x96, 0x2a, 0xc1, 0xfc, 0x04, 0x91, 0xdc, 0x81, 0xaf, 0xfd, 0x6c, 0x1e, 0xbf, - 0x89, 0xa1, 0x3d, 0x6f, 0x29, 0x0e, 0xda, 0x5d, 0x5c, 0xef, 0x38, 0x22, 0x15, - 0xc5, 0xe9, 0x51, 0xd7, 0x13, 0x05, 0xef, 0x33, 0xd9, 0x73, 0x71, 0x26, 0xd0, - 0xe6, 0x62, 0x90, 0x5f, 0x12, 0x50, 0x92, 0x6f, 0x6a, 0x22, 0x99, 0x90, 0xe3, - 0x8f, 0x69, 0xad, 0x9a, 0x91, 0x92, 0xb3, 0x02, 0xf2, 0x6b, 0xdd, 0xa4, 0x65, - 0xd9, 0x0b, 0x94, 0xb1, 0x2c, 0x57, 0xfa, 0x3f, 0xd6, 0x93, 0x00, 0x83, 0xf1, - 0x84, 0x43, 0x8d, 0x8a, 0x88, 0x9d, 0x3f, 0x5e, 0xce, 0xa2, 0xc6, 0xd2, 0x3d, - 0x67, 0x36, 0xf2, 0xa0, 0xf1, 0x8e, 0x26, 0xf4, 0xfa, 0x45, 0xd1, 0xbe, 0x8f, - 0x3d, 0xc4, 0xa7, 0x07, 0x13, 0x7e, 0x95, 0xd2, 0xad, 0x59, 0x4f, 0x6c, 0x03, - 0xd2, 0x49, 0x23, 0x06, 0x7a, 0xe4, 0x7f, 0xd6, 0x42, 0x5e, 0xfb, 0x9c, 0x1d, - 0x50, 0x4e, 0x6f, 0xd5, 0x57, 0x53, 0x40, 0x94, 0x56, 0x01, 0xfe, 0x80, 0x6f, - 0x57, 0x56, 0xac, 0xb5, 0x62, 0xf1, 0x3c, 0x0c, 0xa1, 0xd8, 0x03, 0xa1, 0x95, - 0xc2, 0xeb, 0xb2, 0xef, 0x02, 0xac, 0x33, 0xe6, 0xa8, 0x8d, 0xea, 0x07, 0x5b, - 0xa9, 0x96, 0xd3, 0xc3, 0x36, 0x64, 0x8e, 0x86, 0x94, 0xd3, 0xa1, 0x9d, 0x3d, - 0xca, 0x53, 0x1b, 0xeb, 0x50, 0xd4, 0x32, 0x7c, 0x5c, 0x0c, 0x23, 0xcb, 0x7c, - 0xfd, 0xb0, 0x8c, 0xa7, 0xcf, 0x2c, 0xac, 0x6b, 0xc1, 0x39, 0xd0, 0x74, 0x14, - 0x73, 0xd3, 0x76, 0x02, 0x9c, 0xb4, 0xab, 0x6b, 0xf0, 0x54, 0x55, 0x7c, 0xe2, - 0x94, 0xc7, 0x28, 0xa4, 0x68, 0x7d, 0x57, 0xec, 0x89, 0x09, 0xff, 0x51, 0xa4, - 0xd0, 0x2f, 0x9d, 0xcd, 0x11, 0x19, 0x3d, 0x7d, 0x1c, 0x9f, 0xda, 0xe6, 0xa1, - 0x73, 0x96, 0xa1, 0xbf, 0x57, 0xa9, 0x94, 0x93, 0x4f, 0x5e, 0x7a, 0x59, 0xf0, - 0x45, 0xde, 0xbe, 0xaf, 0xf6, 0x2e, 0xf3, 0x26, 0xb9, 0x47, 0xf2, 0xa8, 0xb4, - 0x95, 0x55, 0xe4, 0xd9, 0x9b, 0x3b, 0xf5, 0xc8, 0x1f, 0xf9, 0xfe, 0x31, 0x4e, - 0x04, 0x7a, 0xf1, 0x52, 0x50, 0x8f, 0x57, 0x01, 0x5c, 0xa4, 0x02, 0xc6, 0x7d, - 0x92, 0x5c, 0x99, 0xac, 0xea, 0x3e, 0xe8, 0xcc, 0x4b, 0x00, 0x8c, 0x5c, 0xb4, - 0x39, 0x66, 0xe7, 0x14, 0xef, 0x48, 0x0f, 0xd0, 0x5e, 0x07, 0xc7, 0xb2, 0xdd, - 0xa9, 0xaa, 0x39, 0x66, 0x11, 0x3e, 0xaa, 0x29, 0x3d, 0x3f, 0x62, 0x2b, 0x30, - 0x9d, 0x64, 0x80, 0x3c, 0xe1, 0xe6, 0x37, 0x8b, 0x6a, 0xac, 0x4f, 0xab, 0x52, - 0x7c, 0x43, 0xcd, 0x45, 0xed, 0x0a, 0x3c, 0x1a, 0x4b, 0x9f, 0xb1, 0x8d, 0xcc, - 0xcf, 0xcd, 0xb6, 0xac, 0x0c, 0x24, 0x21, 0x63, 0x9c, 0xda, 0x00, 0x75, 0xa2, - 0x0d, 0xc5, 0x11, 0x1b, 0x8d, 0x3d, 0x31, 0x99, 0x49, 0x5b, 0xd9, 0x13, 0x3d, - 0xba, 0xb9, 0x45, 0x41, 0x41, 0x0e, 0x4f, 0xba, 0x92, 0xc7, 0xb6, 0x06, 0xa5, - 0xcb, 0x12, 0x2f, 0x14, 0x0c, 0xf1, 0xa3, 0x59, 0x6f, 0x27, 0x88, 0xf3, 0xc8, - 0xb9, 0x26, 0x60, 0xf1, 0x4c, 0xb6, 0x5a, 0xf5, 0xdd, 0x23, 0xdf, 0xdb, 0xac, - 0x13, 0x71, 0xec, 0xf4, 0xb3, 0x37, 0x12, 0xfe, 0xd2, 0x29, 0x2c, 0x44, 0xf7, - 0x08, 0x34, 0xcf, 0x96, 0xc0, 0x5d, 0x58, 0x82, 0x7e, 0x69, 0xbf, 0xc2, 0xe6, - 0x96, 0xfa, 0x08, 0x74, 0x02, 0x5e, 0x2c, 0x3d, 0x19, 0xb0, 0x72, 0x02, 0x00, - 0x31, 0x51, 0x3b, 0x19, 0x62, 0xec, 0x54, 0x08, 0x56, 0xcb, 0x18, 0x93, 0x87, - 0xcf, 0xbf, 0xcc, 0x0f, 0x7c, 0x68, 0x22, 0x3c, 0xba, 0x47, 0xfb, 0x0c, 0x9b, - 0x48, 0x6e, 0x4d, 0x99, 0x17, 0x19, 0x61, 0xf7, 0x67, 0x5a, 0x8b, 0x46, 0x32, - 0x8a, 0x3b, 0xc1, 0x09, 0xbf, 0x07, 0xc6, 0x6d, 0x5e, 0xde, 0x77, 0x1c, 0xc4, - 0xc7, 0x4c, 0xe8, 0x03, 0x33, 0x82, 0x91, 0x91, 0xee, 0xdc, 0x49, 0x35, 0x08, - 0xa6, 0x44, 0x53, 0x0a, 0x61, 0x44, 0xf2, 0x2d, 0xcf, 0x97, 0x52, 0x5a, 0x4c, - 0xdc, 0xa1, 0xad, 0x71, 0x07, 0x3b, 0x08, 0x0b, 0x73, 0xea, 0x45, 0x49, 0xf5, - 0x40, 0x1b, 0xff, 0x43, 0x18, 0x26, 0x8e, 0x6a, 0xd6, 0x37, 0x36, 0x31, 0x57, - 0xa1, 0x9a, 0x53, 0xf1, 0x23, 0xa0, 0xb0, 0xe1, 0x6d, 0x0b, 0x77, 0xf0, 0x20, - 0x28, 0xda, 0x46, 0x41, 0x00, 0xfd, 0xe7, 0x6d, 0x83, 0xdd, 0x0b, 0xb2, 0x24, - 0xed, 0xe2, 0x80, 0x42, 0x29, 0x0a, 0xb2, 0xbc, 0xe8, 0x54, 0x13, 0x9b, 0xca, - 0x36, 0xe5, 0xb2, 0xcb, 0xdf, 0xdd, 0x91, 0x06, 0xfc, 0x9f, 0x18, 0xb9, 0x55, - 0x53, 0xe4, 0xfe, 0x54, 0x8b, 0x3e, 0x4a, 0x87, 0xda, 0xa7, 0xef, 0x1e, 0xe3, - 0x8e, 0xe9, 0xb4, 0xe0, 0xdc, 0xd6, 0x3e, 0x80, 0xec, 0xbb, 0xa7, 0xe7, 0x4b, - 0x3e, 0x3b, 0xa3, 0xd0, 0xe8, 0xa6, 0x39, 0x2a, 0x06, 0x2b, 0x8e, 0x06, 0x5a, - 0x54, 0x41, 0x4c, 0x3c, 0x5b, 0xd9, 0xce, 0x4e, 0x85, 0xca, 0x62, 0x93, 0xe8, - 0x84, 0xd1, 0x45, 0x6a, 0x4c, 0x31, 0xe1, 0x65, 0x4f, 0xf2, 0x3e, 0xf2, 0x6e, - 0x2e, 0x14, 0xe1, 0x29, 0x8a, 0x49, 0xc0, 0x72, 0xe2, 0x2f, 0x9d, 0x98, 0xbb, - 0x0f, 0x9b, 0x03, 0xbd, 0x5f, 0xd0, 0x13, 0xfc, 0xef, 0x3e, 0xd6, 0xa4, 0x9a, - 0xeb, 0x98, 0x72, 0x02, 0x54, 0x08, 0x7e, 0xf7, 0x28, 0xe3, 0x19, 0xdb, 0x96, - 0x4c, 0xea, 0x54, 0xd0, 0xec, 0xa7, 0x6c, 0xfe, 0x56, 0x28, 0x8b, 0x6f, 0x64, - 0xf4, 0xa1, 0x9d, 0xf3, 0x7e, 0xd1, 0x7b, 0xe8, 0x12, 0xe8, 0x2d, 0x7d, 0x40, - 0x53, 0x6f, 0x37, 0x8a, 0x93, 0x1c, 0x82, 0xcf, 0x71, 0x11, 0xd6, 0xe1, 0x17, - 0x80, 0x93, 0x63, 0x80, 0x9b, 0x6b, 0xe3, 0x78, 0xf8, 0xfd, 0x5a, 0x1c, 0xe2, - 0x2a, 0x8d, 0x3c, 0x45, 0x47, 0xab, 0xd9, 0x59, 0x83, 0x0a, 0xaa, 0xf0, 0x13, - 0xde, 0x2b, 0xf2, 0x7a, 0x1f, 0xba, 0xe8, 0xb1, 0x6f, 0x38, 0xd1, 0x34, 0x9b, - 0x60, 0x31, 0xce, 0x02, 0x34, 0x8a, 0x24, 0x05, 0x79, 0xc0, 0xe5, 0x35, 0x79, - 0x04, 0x58, 0xb4, 0x96, 0x3b, 0x61, 0x69, 0x33, 0xd1, 0x00, 0x5c, 0x1d, 0x03, - 0xd4, 0xc9, 0x51, 0x80, 0xc8, 0xd1, 0x7a, 0x55, 0xef, 0x4b, 0xee, 0x46, 0x56, - 0x68, 0xb2, 0x0e, 0xa4, 0x11, 0x8c, 0xa5, 0x69, 0x2e, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x2f, + 0xff, 0xe8, 0x6e, 0x2a, 0xa3, 0xb8, 0x14, 0x00, 0x02, 0x6f, 0x96, 0xe4, 0xcf, + 0x2d, 0xb8, 0x03, 0x00, 0x04, 0x52, 0xac, 0x6a, 0x52, 0x9a, 0x5c, 0x86, 0xba, + 0xc8, 0x3c, 0x02, 0x00, 0x06, 0x52, 0xac, 0x6a, 0x6a, 0x6a, 0x63, 0x01, 0x2c, + 0x82, 0x93, 0x53, 0xa7, 0x44, 0xb1, 0xde, 0x28, 0x3f, 0x10, 0x90, 0xeb, 0x7a, + 0x9f, 0x80, 0xc0, 0xf7, 0x5c, 0x03, 0xc5, 0x51, 0x0e, 0x6c, 0x7c, 0x62, 0x7a, + 0x8c, 0xf9, 0x41, 0x0d, 0xbc, 0x99, 0x27, 0xe9, 0xd7, 0xf4, 0x88, 0x4e, 0x6e, + 0xd3, 0xfd, 0x5e, 0x4b, 0x7c, 0xb8, 0x35, 0xb8, 0x33, 0x08, 0x96, 0x4e, 0x3c, + 0x46, 0x87, 0x3f, 0xd6, 0x13, 0x31, 0x7b, 0x91, 0xd2, 0x92, 0x36, 0xea, 0x90, + 0xe3, 0x65, 0xd1, 0x62, 0xcc, 0x05, 0x1c, 0x84, 0x6d, 0x24, 0x21, 0x76, 0xda, + 0xf6, 0xd2, 0x86, 0x18, 0xae, 0x31, 0xfb, 0xaa, 0xe9, 0x99, 0xa9, 0x3f, 0x17, + 0x5c, 0x69, 0x38, 0xe6, 0x01, 0xc2, 0x72, 0x08, 0x2e, 0xce, 0x96, 0x7f, 0x8d, + 0x4f, 0xcc, 0x35, 0x2c, 0x04, 0xf2, 0xb1, 0x50, 0x13, 0x61, 0xd7, 0xed, 0xa7, + 0x9a, 0x11, 0x98, 0x66, 0x1f, 0x1c, 0xf2, 0x9d, 0x09, 0xc7, 0x87, 0xaf, 0xbc, + 0xa2, 0x00, 0x36, 0x04, 0xc9, 0x99, 0x94, 0x4d, 0xe3, 0xc0, 0xfc, 0xf8, 0x31, + 0x93, 0xa1, 0x8d, 0x35, 0x88, 0x3a, 0xae, 0x56, 0xb1, 0x36, 0x7b, 0x24, 0x08, + 0x55, 0x42, 0xd2, 0x40, 0x12, 0xf9, 0x9e, 0x59, 0x58, 0x00, 0x80, 0x8a, 0x2e, + 0x2f, 0xe3, 0x6c, 0x1f, 0x2c, 0x60, 0x3d, 0x07, 0x84, 0x98, 0x59, 0x75, 0xd3, + 0x67, 0x1c, 0xfd, 0x9a, 0x8a, 0xd8, 0xeb, 0xbd, 0x76, 0x43, 0x8e, 0xf6, 0x49, + 0x79, 0xbf, 0x65, 0x15, 0xed, 0x4a, 0x68, 0x40, 0xb0, 0x88, 0x3a, 0x9e, 0x6e, + 0xf6, 0x4a, 0x0e, 0xfc, 0xae, 0x1c, 0xf2, 0x1d, 0xfe, 0x74, 0x85, 0x4e, 0x84, + 0xc2, 0x74, 0x9f, 0xac, 0x03, 0x82, 0x52, 0x75, 0xc9, 0xb6, 0x30, 0x21, 0x84, + 0xc7, 0x2d, 0xf4, 0xc4, 0xbb, 0x28, 0x62, 0xe4, 0xe8, 0xa7, 0xd9, 0xa4, 0xa2, + 0x82, 0x86, 0x6f, 0x9a, 0x7b, 0x2c, 0xfc, 0x9a, 0x56, 0x31, 0x3d, 0xa0, 0xc4, + 0x7a, 0x34, 0xb7, 0xb9, 0xcd, 0xa3, 0xac, 0xe8, 0x18, 0x5f, 0x07, 0xdf, 0x36, + 0xe4, 0x48, 0xa7, 0x6a, 0xa4, 0x77, 0xf2, 0x24, 0xd8, 0x7a, 0x07, 0x4f, 0x43, + 0xaf, 0x5d, 0x5f, 0x79, 0xb3, 0xab, 0x11, 0x28, 0xf0, 0x81, 0x91, 0x44, 0x7f, + 0xa6, 0x46, 0xbf, 0xdd, 0xe5, 0xb5, 0x1e, 0x23, 0x3c, 0xa6, 0x15, 0x5d, 0x10, + 0x15, 0x85, 0xbc, 0x2c, 0x40, 0x15, 0x8a, 0xc2, 0x10, 0x6e, 0x66, 0xa2, 0x6e, + 0x46, 0x42, 0x33, 0x70, 0x63, 0x68, 0x76, 0xb4, 0x34, 0xa7, 0x4f, 0x8c, 0xe8, + 0x06, 0x00, 0x50, 0xb0, 0x82, 0xa7, 0x9b, 0x61, 0xbb, 0x5d, 0x34, 0x4e, 0xb5, + 0xa1, 0x15, 0x83, 0x26, 0xce, 0xd9, 0xa9, 0xd9, 0xf5, 0x4f, 0xb2, 0xfe, 0x8f, + 0x9f, 0x05, 0xcd, 0x11, 0x1e, 0xe4, 0x6c, 0x47, 0x10, 0xf6, 0xf6, 0x3a, 0x62, + 0x69, 0x45, 0x57, 0xef, 0x1b, 0x12, 0xc8, 0x80, 0x06, 0xb6, 0x78, 0x72, 0x50, + 0x5f, 0x4e, 0x88, 0x3b, 0x58, 0x59, 0x07, 0x92, 0x9a, 0x2f, 0x3f, 0xdb, 0x0d, + 0x8f, 0x79, 0x14, 0xc4, 0x2d, 0xde, 0x2d, 0x20, 0x00, 0xf5, 0xae, 0x02, 0xd4, + 0x18, 0x21, 0xc8, 0xe1, 0xee, 0x01, 0x38, 0xeb, 0xcb, 0x72, 0x8d, 0x7c, 0x6c, + 0x3c, 0x80, 0x02, 0x7e, 0x43, 0x75, 0x94, 0xc6, 0x70, 0xfd, 0x6f, 0x39, 0x08, + 0x22, 0x2e, 0xe7, 0xa1, 0xb9, 0x17, 0xf8, 0x27, 0x1a, 0xbe, 0x66, 0x0e, 0x39, + 0xe0, 0x51, 0xaa, 0xa6, 0xfc, 0xa1, 0x86, 0x22, 0x76, 0xe2, 0xba, 0xa0, 0xfe, + 0x0b, 0x16, 0x2a, 0xeb, 0xcf, 0xe3, 0xd9, 0x34, 0x9c, 0x8d, 0x15, 0x4b, 0xb7, + 0xee, 0x28, 0x21, 0x2c, 0x1b, 0xaa, 0x70, 0x5d, 0x82, 0x07, 0x0d, 0x70, 0x32, + 0xf2, 0x69, 0x5d, 0x17, 0x96, 0x80, 0x9f, 0xab, 0x41, 0x24, 0x69, 0x26, 0xaf, + 0x99, 0x2b, 0x6e, 0xee, 0x95, 0xa9, 0xa0, 0x6b, 0xc4, 0x56, 0x2c, 0x5f, 0x2f, + 0x1b, 0x19, 0x54, 0x95, 0x00, 0x37, 0x2e, 0x7a, 0xd5, 0x79, 0xa6, 0xd6, 0xd7, + 0x8b, 0x33, 0x15, 0x31, 0x30, 0xfb, 0x44, 0x8f, 0xb7, 0x9e, 0x8a, 0x66, 0x9d, + 0xb8, 0xa0, 0xf3, 0x5c, 0xdf, 0x9a, 0xe5, 0xd3, 0x2d, 0x73, 0x2f, 0xc7, 0x94, + 0x18, 0xe2, 0x3b, 0x45, 0x1d, 0xdc, 0x95, 0xa2, 0x2a, 0xba, 0xbb, 0x05, 0x6e, + 0xc6, 0xb5, 0xe8, 0xba, 0x4f, 0x52, 0x4d, 0xfa, 0xfe, 0x87, 0x52, 0x62, 0xdd, + 0x7b, 0xe4, 0x1c, 0xbb, 0xc6, 0x24, 0x20, 0xd4, 0xad, 0x6d, 0xf5, 0xc9, 0xb7, + 0x13, 0x60, 0x4f, 0x65, 0x60, 0x88, 0xa4, 0x48, 0x5e, 0x93, 0xbe, 0x19, 0x07, + 0xd2, 0x7a, 0xc6, 0xec, 0x3c, 0x57, 0x25, 0x9b, 0xd6, 0x98, 0x1d, 0x42, 0xc1, + 0xb7, 0x8a, 0x29, 0xad, 0x96, 0x85, 0xe6, 0x3c, 0x49, 0x4d, 0x41, 0x29, 0x62, + 0x3e, 0xa1, 0xa7, 0xff, 0xec, 0x85, 0xfa, 0x29, 0x41, 0x10, 0x73, 0xed, 0xb2, + 0x97, 0x8e, 0xf4, 0xe4, 0x69, 0xdd, 0xd5, 0xcd, 0xa9, 0x86, 0x18, 0x99, 0x95, + 0xf8, 0x8d, 0x6a, 0xb3, 0x66, 0xdb, 0x01, 0x90, 0x01, 0xf5, 0xb2, 0x52, 0x88, + 0xcf, 0x86, 0x0f, 0xd9, 0x98, 0xee, 0x57, 0x3c, 0x8c, 0xc4, 0x8a, 0xa9, 0xef, + 0xcf, 0x9b, 0x61, 0x7e, 0x04, 0x3c, 0x32, 0x9c, 0xd1, 0xaa, 0x1a, 0x0e, 0xd3, + 0xa4, 0x02, 0xfb, 0x96, 0xe3, 0x36, 0xc7, 0x19, 0xe6, 0x25, 0x3c, 0xb6, 0x91, + 0xaa, 0x0d, 0xb5, 0x27, 0x36, 0x62, 0x6e, 0xd1, 0x97, 0x88, 0x75, 0x88, 0x8e, + 0xc7, 0x6c, 0x84, 0x6b, 0xc2, 0x27, 0x27, 0x2a, 0x58, 0x53, 0x17, 0xdf, 0xf0, + 0xb1, 0x14, 0x8d, 0x92, 0xd6, 0xf5, 0xfb, 0x7d, 0x95, 0x33, 0x67, 0x70, 0xa7, + 0xd1, 0x6f, 0xac, 0x1a, 0xdd, 0x86, 0x07, 0x76, 0xcb, 0x48, 0x02, 0x21, 0xf8, + 0xfb, 0x33, 0xd7, 0xe4, 0xe9, 0xb0, 0x79, 0x02, 0xd2, 0xff, 0x86, 0xfd, 0xac, + 0x72, 0x09, 0x62, 0x34, 0xae, 0xd4, 0x8d, 0xe8, 0x92, 0xff, 0x73, 0x55, 0x07, + 0x3b, 0xbf, 0x06, 0x15, 0xf6, 0x7b, 0x11, 0x00, 0xcc, 0x2e, 0xa3, 0xba, 0x3d, + 0x6c, 0x1a, 0x1a, 0x90, 0x87, 0xb1, 0x19, 0xba, 0xee, 0xbf, 0xa6, 0x2b, 0xc9, + 0xf0, 0xec, 0x47, 0x9d, 0x99, 0xc1, 0xa3, 0xb1, 0x58, 0xb5, 0x14, 0xd1, 0x62, + 0x9d, 0xb3, 0x99, 0x3f, 0x11, 0x67, 0x2a, 0x26, 0x70, 0x8e, 0x5a, 0xd8, 0x16, + 0xb5, 0x47, 0xab, 0x7e, 0x82, 0x7d, 0x07, 0xe8, 0xd1, 0x9c, 0xeb, 0x3b, 0x19, + 0x05, 0x00, 0xee, 0xdf, 0x46, 0x0a, 0xa3, 0xbe, 0xb4, 0x34, 0x19, 0xc6, 0xb0, + 0x82, 0xe8, 0x35, 0xce, 0x84, 0xca, 0x13, 0xb6, 0x90, 0x8a, 0x88, 0x13, 0xc0, + 0x21, 0xde, 0x9f, 0xa9, 0xa4, 0x4e, 0x4c, 0x18, 0x31, 0xa0, 0x81, 0xf2, 0xc1, + 0xf3, 0xfd, 0x78, 0x25, 0x49, 0xd3, 0xf3, 0x24, 0x57, 0x59, 0x60, 0x6d, 0x9f, + 0x92, 0xd5, 0x54, 0x8a, 0xcf, 0xea, 0xdb, 0xaf, 0x9c, 0xaa, 0x6b, 0x93, 0xdc, + 0x08, 0x82, 0x8d, 0x74, 0xf6, 0xd5, 0xfd, 0xd8, 0x33, 0x31, 0xf0, 0x96, 0x91, + 0x45, 0x95, 0x52, 0x97, 0xe6, 0x9f, 0x00, 0xfd, 0x29, 0x87, 0xf2, 0xda, 0x2b, + 0x94, 0xb9, 0x95, 0xfe, 0xcb, 0xe6, 0x22, 0xa7, 0x35, 0xef, 0x7f, 0x12, 0x07, + 0xf6, 0x71, 0x62, 0x94, 0x89, 0x20, 0x2b, 0xea, 0x0b, 0x47, 0x5e, 0x51, 0x68, + 0x1a, 0xa1, 0x67, 0x78, 0xb3, 0x9b, 0xd9, 0x23, 0xc9, 0x8d, 0xc6, 0xff, 0x83, + 0x73, 0xc7, 0x9b, 0xb1, 0x70, 0x30, 0x41, 0x7b, 0xc2, 0x00, 0xc8, 0xf0, 0xb8, + 0x55, 0xac, 0xfe, 0xc1, 0x79, 0xf7, 0x67, 0x4c, 0xec, 0x27, 0x21, 0xa1, 0x0f, + 0xca, 0x69, 0x3d, 0x83, 0xcf, 0xe5, 0xb8, 0xcd, 0xcc, 0x18, 0xf8, 0x1a, 0xd6, + 0x17, 0xfa, 0x26, 0xf0, 0xdf, 0xb8, 0x36, 0x55, 0xb8, 0xa2, 0x9a, 0x7f, 0x83, + 0x42, 0x32, 0x42, 0x5e, 0x8c, 0x47, 0x45, 0x88, 0xf1, 0x8d, 0xd3, 0x26, 0xaa, + 0x39, 0x6c, 0x3e, 0x47, 0x75, 0xe0, 0x02, 0x05, 0xfc, 0x9e, 0x45, 0xf7, 0xb7, + 0xd2, 0xe6, 0xd5, 0x5d, 0xcb, 0x90, 0xe2, 0x3f, 0xf6, 0xb5, 0x08, 0x45, 0x9a, + 0xa6, 0x99, 0xbf, 0xcb, 0xd5, 0x0f, 0x29, 0xa9, 0x9b, 0x2f, 0xf0, 0xfa, 0x16, + 0x0f, 0x2c, 0xd6, 0x9a, 0x80, 0xea, 0x9e, 0x83, 0x1c, 0x29, 0x4b, 0x4c, 0xfa, + 0x7b, 0xf0, 0x02, 0x38, 0x12, 0xfd, 0x67, 0x01, 0xbb, 0x13, 0xb5, 0xe4, 0xbc, + 0x12, 0xdc, 0x73, 0xd4, 0xe3, 0xef, 0x4f, 0x4a, 0x89, 0x2b, 0x43, 0x14, 0x8c, + 0xa7, 0x3e, 0x21, 0xa2, 0x7f, 0x89, 0x95, 0x17, 0x06, 0xbc, 0x22, 0x08, 0x43, + 0x94, 0x4f, 0x66, 0x0e, 0x1b, 0xa7, 0x84, 0x2b, 0x3e, 0x90, 0x30, 0x53, 0x83, + 0x89, 0x6e, 0xc4, 0x90, 0x5f, 0x70, 0xc7, 0x8b, 0x69, 0x4e, 0x6a, 0x5a, 0x3e, + 0x43, 0x12, 0xcd, 0x82, 0x08, 0x13, 0x2b, 0x84, 0x0f, 0x05, 0xc7, 0x14, 0x52, + 0x3c, 0xa8, 0x19, 0x72, 0x0a, 0xe2, 0x27, 0xfd, 0x1a, 0xcb, 0xa7, 0x14, 0xfa, + 0x4f, 0xc4, 0x5f, 0xc5, 0x39, 0x88, 0x57, 0xb4, 0x0d, 0xc1, 0x48, 0x79, 0x85, + 0x6f, 0x35, 0x4b, 0xa4, 0xd2, 0x58, 0x1d, 0x0c, 0xda, 0x54, 0xb6, 0x38, 0xba, + 0x9d, 0x76, 0xf9, 0xb5, 0x2d, 0x17, 0xc8, 0xf8, 0x8e, 0xe6, 0x3f, 0x58, 0x45, + 0xb5, 0xdc, 0xef, 0xa4, 0xc3, 0x47, 0x9b, 0xce, 0x9a, 0xca, 0xd1, 0x8b, 0x4a, + 0xea, 0xe0, 0x3c, 0x0e, 0xae, 0x22, 0x5d, 0x42, 0x84, 0x8b, 0xde, 0xaa, 0x53, + 0x6d, 0x7d, 0x8d, 0xd3, 0xbc, 0x97, 0x9f, 0x06, 0x58, 0x66, 0x73, 0xbc, 0x6f, + 0xf1, 0xc5, 0xd3, 0xb3, 0x20, 0xf3, 0x49, 0xa5, 0xb3, 0xa8, 0xb3, 0x55, 0x59, + 0x22, 0x96, 0xaa, 0xf6, 0x1c, 0x5b, 0x72, 0x52, 0xf7, 0x3e, 0xc0, 0xa9, 0x46, + 0x6a, 0x1b, 0x85, 0x76, 0x4f, 0xb0, 0x83, 0x1b, 0x4a, 0x1a, 0x36, 0x89, 0x0e, + 0x22, 0x4c, 0x01, 0xac, 0xfc, 0xe4, 0x8e, 0xe3, 0xed, 0x93, 0x87, 0x73, 0x98, + 0xe0, 0x72, 0x6d, 0x02, 0x93, 0x6d, 0x0d, 0x03, 0x2e, 0x18, 0xe3, 0x28, 0x8b, + 0x26, 0xc3, 0xaf, 0xc9, 0x3b, 0x05, 0x72, 0x1d, 0xf1, 0xd3, 0xa4, 0x14, 0x66, + 0x54, 0x46, 0xcf, 0x1e, 0x0f, 0x26, 0xcf, 0x15, 0xc3, 0x55, 0x4e, 0xf6, 0x1d, + 0xd3, 0x32, 0x42, 0x6b, 0x94, 0x5e, 0x3c, 0xb8, 0xf0, 0x35, 0x4a, 0x9f, 0xb7, + 0x2a, 0xe3, 0x50, 0x7a, 0xef, 0xe8, 0x9b, 0xe5, 0x41, 0x66, 0x45, 0x93, 0xb6, + 0xee, 0x77, 0xa2, 0xa7, 0x5f, 0x8b, 0x26, 0xa2, 0xb1, 0x3c, 0x2c, 0xa8, 0x04, + 0x00, ], txid: [ - 0x67, 0x62, 0xf9, 0xc5, 0x72, 0x30, 0xa5, 0x8d, 0xca, 0x6d, 0x44, 0x45, 0x47, - 0xb2, 0xf6, 0xe0, 0xe2, 0x13, 0x49, 0x2d, 0xbb, 0x40, 0x56, 0x4a, 0xe1, 0x01, - 0xdf, 0x13, 0x94, 0x1c, 0x61, 0x52, + 0x39, 0x8d, 0xb1, 0x2e, 0x1b, 0x6e, 0x4c, 0xd2, 0xe6, 0xce, 0xee, 0x3c, 0x6e, + 0x02, 0x09, 0xbf, 0xa1, 0x09, 0x9f, 0x64, 0xec, 0x07, 0x69, 0x99, 0x77, 0xd4, + 0xfa, 0xf8, 0xb8, 0xa0, 0x5d, 0x56, ], auth_digest: [ - 0x1c, 0x3e, 0xc5, 0x10, 0x4d, 0x96, 0xb6, 0x68, 0x37, 0xb6, 0xe3, 0x81, 0xf7, - 0x02, 0xc7, 0xe4, 0x8a, 0x09, 0x7a, 0xaf, 0x12, 0x5c, 0x9b, 0x82, 0x89, 0x5b, - 0x57, 0x8b, 0x92, 0xea, 0xfd, 0x14, - ], - amounts: vec![787459282010655, 1685382316228727, 1715663111103469], - script_pubkeys: vec![ - vec![0x65, 0x6a], - vec![0x65, 0x00, 0x51, 0x52, 0x6a], - vec![0x52, 0x6a, 0x51, 0x53, 0x00, 0x51, 0x52, 0x51, 0x6a], + 0xd3, 0x5f, 0xea, 0x1a, 0x83, 0x57, 0x72, 0x49, 0x39, 0x12, 0x47, 0x0b, 0x73, + 0x84, 0xb5, 0xdd, 0xc4, 0xe0, 0xa4, 0xda, 0x0e, 0xa7, 0x52, 0xc2, 0x56, 0xd9, + 0xcb, 0xab, 0x9f, 0x03, 0x00, 0xd0, ], - transparent_input: Some(2), + amounts: vec![], + script_pubkeys: vec![], + transparent_input: None, sighash_shielded: [ - 0xa7, 0xe2, 0x72, 0xca, 0x04, 0x40, 0x87, 0xc4, 0xd3, 0x56, 0x61, 0x88, 0x8b, - 0x34, 0x8c, 0x57, 0xe9, 0x8b, 0x79, 0x81, 0xa1, 0x6f, 0xe5, 0xe8, 0x81, 0x81, - 0xc8, 0xe1, 0x5a, 0xae, 0x58, 0x1c, + 0x39, 0x8d, 0xb1, 0x2e, 0x1b, 0x6e, 0x4c, 0xd2, 0xe6, 0xce, 0xee, 0x3c, 0x6e, + 0x02, 0x09, 0xbf, 0xa1, 0x09, 0x9f, 0x64, 0xec, 0x07, 0x69, 0x99, 0x77, 0xd4, + 0xfa, 0xf8, 0xb8, 0xa0, 0x5d, 0x56, ], - sighash_all: Some([ - 0xda, 0x3e, 0xdd, 0x81, 0xf4, 0xfa, 0x79, 0xe4, 0x7f, 0xb6, 0x76, 0xca, 0x0b, - 0x56, 0xb1, 0x29, 0x9f, 0xf5, 0xb5, 0xec, 0x58, 0x23, 0xec, 0x87, 0x1e, 0x3d, - 0x7c, 0x12, 0x88, 0x4f, 0xe5, 0x77, - ]), - sighash_none: Some([ - 0xdd, 0xe8, 0x6c, 0x69, 0x61, 0xd0, 0x2d, 0x65, 0x51, 0x03, 0xc9, 0xd1, 0x9c, - 0x89, 0x62, 0x3f, 0xde, 0x4e, 0xc6, 0xb5, 0x28, 0x2b, 0xb8, 0xfb, 0xc7, 0xe8, - 0xba, 0x46, 0x91, 0x1e, 0x9a, 0x3e, - ]), + sighash_all: None, + sighash_none: None, sighash_single: None, - sighash_all_anyone: Some([ - 0x41, 0x15, 0x08, 0xbb, 0x7b, 0x21, 0x94, 0xf6, 0x17, 0xad, 0xc6, 0xc7, 0x82, - 0xbb, 0x77, 0x20, 0xc8, 0xdf, 0xc2, 0x5f, 0xef, 0x3b, 0xc4, 0x8e, 0xc7, 0x31, - 0xa2, 0x4a, 0xa2, 0xc1, 0xc1, 0x05, - ]), - sighash_none_anyone: Some([ - 0xb4, 0x25, 0x3a, 0x25, 0xbf, 0x7e, 0xe6, 0xcd, 0x20, 0x9c, 0x5f, 0x07, 0x66, - 0x6f, 0xea, 0x85, 0x3e, 0x4b, 0x80, 0x08, 0x62, 0xa2, 0x9a, 0xa5, 0xa8, 0x96, - 0x1f, 0x95, 0x32, 0x03, 0xa3, 0xb0, - ]), + sighash_all_anyone: None, + sighash_none_anyone: None, sighash_single_anyone: None, }, TestVector { tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x81, - 0x83, 0x6c, 0x3b, 0xe9, 0x9a, 0x08, 0x17, 0x03, 0xa4, 0x60, 0xe9, 0x68, 0xaa, - 0x71, 0x09, 0x87, 0x0b, 0xbe, 0xd1, 0x7d, 0xf5, 0xf8, 0x88, 0xc8, 0xca, 0x14, - 0x67, 0xae, 0x17, 0xdb, 0xbc, 0xde, 0x31, 0xc1, 0x10, 0x5c, 0xb5, 0xbd, 0xa8, - 0x8a, 0xc6, 0xc6, 0x27, 0x00, 0x04, 0x52, 0xac, 0x52, 0xac, 0x0f, 0xfe, 0x81, - 0xec, 0x58, 0xbf, 0x1e, 0x6d, 0x1b, 0xb7, 0xaa, 0xad, 0xa4, 0x1f, 0xba, 0x0b, - 0xb5, 0x88, 0x77, 0x8a, 0x7f, 0x65, 0x20, 0x2a, 0xd8, 0x11, 0xea, 0x73, 0xd2, - 0x6c, 0x74, 0x55, 0x03, 0x95, 0xaf, 0xf7, 0x53, 0x25, 0x10, 0x7c, 0x09, 0x6a, - 0x52, 0x51, 0xac, 0xac, 0x00, 0x65, 0x00, 0x51, 0xa2, 0xe7, 0x42, 0x47, 0x19, - 0xa3, 0xd1, 0x85, 0xb7, 0xe0, 0xa4, 0x3a, 0x47, 0x2e, 0x29, 0x8a, 0xc0, 0xaf, - 0xdc, 0x52, 0x87, 0xd7, 0xad, 0x12, 0x4c, 0xd9, 0x40, 0x5a, 0x62, 0xcd, 0x1c, - 0xa0, 0x8b, 0x28, 0x2e, 0xfe, 0xf7, 0xf9, 0x28, 0xdf, 0x08, 0x52, 0x52, 0x52, - 0x51, 0xac, 0x53, 0x53, 0xac, 0xea, 0xa5, 0xff, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x67, + 0x57, 0x64, 0x3f, 0xc0, 0x72, 0xca, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x06, 0x04, 0xc0, 0x72, 0xca, 0x10, 0x00, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, ], txid: [ - 0x22, 0x1d, 0x40, 0x59, 0x7b, 0x56, 0x3f, 0x20, 0x64, 0x58, 0xf9, 0x73, 0x6b, - 0x85, 0x49, 0x23, 0x7c, 0x55, 0x54, 0x24, 0x2c, 0x41, 0x90, 0x22, 0x43, 0x5a, - 0x33, 0x50, 0xa0, 0x70, 0x8e, 0xa1, + 0xb6, 0x58, 0x22, 0x02, 0xbb, 0xf3, 0xb8, 0xdd, 0x13, 0xe5, 0x68, 0x1c, 0x33, + 0x42, 0x98, 0x3c, 0x1f, 0xcd, 0x8b, 0x1a, 0xcf, 0xe5, 0xd6, 0x94, 0x9f, 0xbe, + 0xb8, 0x09, 0xb7, 0xd2, 0xd6, 0xaa, ], auth_digest: [ - 0x6a, 0x75, 0xe4, 0x93, 0x24, 0xe8, 0x53, 0x20, 0xfe, 0x2f, 0x22, 0x46, 0x66, - 0x18, 0xb7, 0x0b, 0x4b, 0xbe, 0xfe, 0xa2, 0x48, 0xe5, 0xd3, 0x67, 0x3f, 0x18, - 0xf2, 0xe4, 0x87, 0xa2, 0xb2, 0x0a, - ], - amounts: vec![1076763594431866, 316847576141144, 1780844721475339], - script_pubkeys: vec![ - vec![0x00, 0x65, 0x51, 0xac, 0x65, 0x63, 0x00, 0x53], - vec![0x63, 0x52, 0x00, 0x53], - vec![0xac, 0xac, 0x00, 0x65, 0x6a, 0x63, 0x51], + 0xc1, 0xc4, 0xed, 0x29, 0x92, 0xe4, 0x54, 0x80, 0xe8, 0x8a, 0xee, 0x5f, 0xb8, + 0x61, 0x88, 0x0a, 0x33, 0x86, 0x6f, 0x88, 0x7c, 0x14, 0xd4, 0x60, 0x5b, 0x5d, + 0xa4, 0xb1, 0xe0, 0x09, 0x62, 0x1b, ], - transparent_input: Some(2), + amounts: vec![], + script_pubkeys: vec![], + transparent_input: None, sighash_shielded: [ - 0xb5, 0xa1, 0x8f, 0xf6, 0x57, 0x83, 0x9c, 0x69, 0x79, 0xc2, 0xf2, 0xaf, 0xae, - 0xea, 0xf2, 0xf5, 0xc1, 0xcf, 0x43, 0xdf, 0x92, 0xf4, 0xa6, 0x57, 0x55, 0xfa, - 0x42, 0xae, 0x2b, 0x77, 0x06, 0xab, + 0xb6, 0x58, 0x22, 0x02, 0xbb, 0xf3, 0xb8, 0xdd, 0x13, 0xe5, 0x68, 0x1c, 0x33, + 0x42, 0x98, 0x3c, 0x1f, 0xcd, 0x8b, 0x1a, 0xcf, 0xe5, 0xd6, 0x94, 0x9f, 0xbe, + 0xb8, 0x09, 0xb7, 0xd2, 0xd6, 0xaa, ], - sighash_all: Some([ - 0x9d, 0x80, 0x2c, 0x8a, 0xce, 0x5b, 0xc5, 0xf5, 0xb0, 0x3c, 0x7d, 0xac, 0x8a, - 0x29, 0xef, 0x33, 0x42, 0x4d, 0xef, 0x82, 0xcb, 0xc4, 0xfc, 0x84, 0x00, 0xc0, - 0xbb, 0x9d, 0x5e, 0x08, 0x41, 0x47, - ]), - sighash_none: Some([ - 0xae, 0x2d, 0xb1, 0x4c, 0x57, 0x78, 0x1f, 0xb5, 0x5c, 0x2f, 0x66, 0x58, 0xf6, - 0x14, 0x18, 0x83, 0xf7, 0xeb, 0xe0, 0xd3, 0x9f, 0x43, 0x9c, 0xf5, 0x66, 0xdc, - 0x55, 0x0f, 0xb9, 0xda, 0x71, 0x68, - ]), + sighash_all: None, + sighash_none: None, sighash_single: None, - sighash_all_anyone: Some([ - 0xe7, 0x11, 0x83, 0x4b, 0x5a, 0x4e, 0xb8, 0x4a, 0xa2, 0x98, 0x6a, 0x53, 0xc2, - 0xb2, 0xba, 0x2f, 0xd6, 0x37, 0x4e, 0x66, 0x6f, 0x03, 0x11, 0xbf, 0xca, 0x8c, - 0xbc, 0xee, 0xfd, 0xde, 0x1e, 0x38, - ]), - sighash_none_anyone: Some([ - 0x5c, 0x3a, 0x08, 0x39, 0xfd, 0xc7, 0x34, 0x17, 0xae, 0x7d, 0x5f, 0x15, 0xdc, - 0xee, 0xd6, 0xc1, 0xa4, 0xcb, 0xe8, 0x0c, 0x6c, 0x25, 0xce, 0x03, 0x86, 0xfe, - 0xf7, 0xc0, 0x58, 0xa8, 0xb9, 0x43, - ]), + sighash_all_anyone: None, + sighash_none_anyone: None, sighash_single_anyone: None, }, - TestVector { - tx: vec![ - 0x05, 0x00, 0x00, 0x80, 0x0a, 0x27, 0xa7, 0x26, 0xb4, 0xd0, 0xd6, 0xc2, 0x57, - 0xb8, 0x57, 0x51, 0x23, 0x5d, 0xbc, 0x10, 0x02, 0x52, 0xe4, 0x1e, 0x00, 0x29, - 0x31, 0xb4, 0x57, 0x46, 0x19, 0x8e, 0x5d, 0xd9, 0x57, 0x1a, 0x56, 0xa7, 0xe0, - 0xd4, 0x23, 0xff, 0x27, 0x98, 0x9d, 0x3e, 0xb4, 0x17, 0xec, 0xd3, 0xc3, 0x09, - 0x3f, 0xb8, 0x2c, 0x56, 0x58, 0x00, 0x96, 0x24, 0xc5, 0x32, 0x19, 0xa6, 0x0c, - 0xd0, 0xa8, 0xc4, 0xda, 0x36, 0x7e, 0x29, 0xa7, 0x17, 0x79, 0xa7, 0x30, 0x32, - 0x98, 0x5a, 0x3d, 0x1f, 0xd0, 0x3d, 0xd4, 0xd0, 0x6e, 0x05, 0x56, 0x6f, 0x3b, - 0x84, 0x36, 0x7c, 0xf0, 0xfa, 0xee, 0x9b, 0x09, 0x63, 0x52, 0x52, 0x00, 0x52, - 0x6a, 0x53, 0xac, 0xac, 0x5d, 0x82, 0xd0, 0xa6, 0x02, 0xef, 0xab, 0xec, 0xef, - 0x1b, 0xc7, 0x01, 0x00, 0x02, 0x00, 0x63, 0x97, 0x76, 0x63, 0x55, 0x0e, 0x76, - 0x06, 0x00, 0x01, 0x6a, 0x00, 0x00, 0x03, 0x09, 0xa8, 0x9a, 0x5f, 0x40, 0xb3, - 0x73, 0x03, 0xe1, 0x81, 0x6d, 0xf1, 0x3a, 0x9d, 0x7e, 0x20, 0xdb, 0x15, 0x9c, - 0x9f, 0x42, 0x77, 0x3a, 0x2f, 0xb0, 0x23, 0xd9, 0x5a, 0xbb, 0x1e, 0x1c, 0xbe, - 0x81, 0xc0, 0x92, 0xed, 0xb2, 0x30, 0xfa, 0x38, 0xea, 0x13, 0xc5, 0xde, 0x7c, - 0x0e, 0x50, 0x31, 0xa1, 0xe8, 0x4d, 0xae, 0xc3, 0xeb, 0xe6, 0x2d, 0x5f, 0x6c, - 0x4a, 0xbe, 0x5c, 0xe9, 0x0a, 0x3f, 0xcd, 0xc3, 0xa6, 0x50, 0x0c, 0x01, 0x1c, - 0x8a, 0x0f, 0xc0, 0x3d, 0xb6, 0xcc, 0x0c, 0x56, 0xcf, 0xd6, 0x54, 0x3a, 0xed, - 0x33, 0xac, 0x6b, 0x7c, 0x4d, 0xb7, 0x83, 0xde, 0xe6, 0xb3, 0x29, 0x27, 0x7f, - 0x96, 0xc7, 0xe9, 0x0b, 0xb9, 0xb4, 0x73, 0x02, 0x46, 0x5f, 0x37, 0x5c, 0x1d, - 0x3c, 0xa4, 0x8e, 0x54, 0xfa, 0xca, 0xe0, 0xf9, 0xc2, 0xdd, 0x4d, 0x64, 0xd9, - 0x04, 0x61, 0x52, 0xb4, 0x36, 0x34, 0x22, 0x7f, 0xbe, 0x32, 0xf6, 0x63, 0xbd, - 0x1d, 0x90, 0xbb, 0xfa, 0x22, 0xf0, 0xe9, 0xc7, 0x93, 0x47, 0x71, 0x93, 0xdd, - 0xcb, 0x40, 0x18, 0x1a, 0x67, 0x9e, 0xae, 0x78, 0x11, 0x32, 0x32, 0x31, 0xf0, - 0x1f, 0x55, 0xc7, 0xad, 0x04, 0xcf, 0xb6, 0x3f, 0x7c, 0x4a, 0x3d, 0x0a, 0x2b, - 0x0f, 0xfb, 0x0b, 0x05, 0xa6, 0xbe, 0x05, 0x5b, 0x8c, 0x94, 0xca, 0x80, 0xbb, - 0x0a, 0x1d, 0x13, 0xcd, 0x4c, 0xd6, 0x9a, 0xb9, 0x83, 0x04, 0xae, 0x25, 0x15, - 0xd5, 0xf7, 0x69, 0x9d, 0x4a, 0xbe, 0xe5, 0xc2, 0x0b, 0xe6, 0x09, 0xd8, 0x73, - 0x51, 0x10, 0x12, 0xf2, 0x34, 0xbd, 0x85, 0xa7, 0xef, 0xf5, 0xfb, 0x63, 0x4c, - 0xff, 0x26, 0x58, 0xba, 0x65, 0x16, 0x04, 0x85, 0x63, 0x09, 0x5e, 0xce, 0xfb, - 0x30, 0x15, 0xee, 0x3f, 0x03, 0xca, 0x52, 0xa1, 0x77, 0xf2, 0x61, 0xec, 0xdc, - 0x26, 0xbc, 0x08, 0x9d, 0x34, 0xc6, 0x40, 0x48, 0x46, 0xe9, 0xc6, 0x47, 0xfc, - 0xfe, 0x98, 0xcc, 0x6a, 0xcd, 0xbb, 0x46, 0x4f, 0x64, 0x27, 0x8a, 0xd8, 0xce, - 0x9d, 0x1a, 0xe0, 0xd4, 0x15, 0xbc, 0x0c, 0x05, 0x24, 0x5f, 0xdd, 0xaf, 0x4e, - 0xbc, 0x8d, 0xc7, 0x03, 0xa8, 0x5c, 0xb2, 0x70, 0xf7, 0x96, 0xad, 0x2d, 0x93, - 0x7e, 0x2a, 0xc0, 0xd5, 0xe0, 0xa3, 0x48, 0x21, 0x75, 0x80, 0x00, 0xaa, 0x59, - 0xc9, 0xd4, 0x65, 0x24, 0x85, 0x29, 0x4e, 0xe0, 0xab, 0x29, 0x69, 0x6b, 0x21, - 0x43, 0x0f, 0xa5, 0x4d, 0xcf, 0xbf, 0x2b, 0x9c, 0x49, 0xd1, 0x42, 0x06, 0x42, - 0x09, 0xee, 0xee, 0xd4, 0xd4, 0x71, 0xff, 0xc0, 0x17, 0xd4, 0xe2, 0x0a, 0x79, - 0x6b, 0x09, 0x27, 0x80, 0x4c, 0x06, 0x1b, 0x9f, 0x4a, 0x70, 0x91, 0xfe, 0x01, - 0x5a, 0xda, 0x68, 0xfd, 0x84, 0x42, 0xe0, 0x18, 0x25, 0xc8, 0x8d, 0xfe, 0x55, - 0xcf, 0x5d, 0xe3, 0x89, 0x36, 0xf7, 0xce, 0x25, 0x31, 0x1b, 0x90, 0x2b, 0xa9, - 0x7a, 0x3c, 0x12, 0xa9, 0x5c, 0xfa, 0x1c, 0x3a, 0x59, 0x1b, 0x81, 0x8f, 0x60, - 0x83, 0x27, 0x09, 0xd9, 0xe4, 0x83, 0x9e, 0x41, 0x0f, 0xb3, 0x6b, 0x84, 0xf3, - 0xac, 0x4f, 0x07, 0x0f, 0xc3, 0x5e, 0x16, 0x19, 0x78, 0x25, 0x9e, 0x5b, 0x8e, - 0xdc, 0x74, 0x4d, 0x90, 0x91, 0x9a, 0xa7, 0x70, 0xbb, 0x36, 0x21, 0x51, 0x28, - 0xe5, 0x82, 0xb5, 0x96, 0x41, 0xe2, 0x38, 0x52, 0xe9, 0x58, 0xeb, 0x8f, 0xc3, - 0xc0, 0xaa, 0x96, 0x15, 0x2b, 0xa4, 0xf7, 0x7f, 0x13, 0x8d, 0x6a, 0x67, 0x12, - 0xa3, 0xae, 0x32, 0x26, 0x01, 0x58, 0x83, 0xf8, 0x1d, 0xb2, 0x3e, 0x58, 0x3c, - 0x86, 0x9c, 0x4c, 0x71, 0x14, 0x3a, 0x6f, 0xff, 0xd6, 0x5e, 0x8d, 0xfd, 0xc5, - 0x0c, 0x99, 0xa2, 0xf1, 0xf3, 0x14, 0xcd, 0xcc, 0x71, 0x35, 0x9e, 0x23, 0x5f, - 0x1d, 0x7d, 0xc2, 0xb5, 0xf3, 0x8e, 0xf7, 0xb9, 0x70, 0x84, 0x31, 0x63, 0xc0, - 0x3f, 0x9d, 0xd4, 0x0a, 0x80, 0x15, 0xef, 0xdc, 0x87, 0x91, 0x95, 0x6a, 0x3f, - 0x3c, 0xed, 0xd9, 0xea, 0x64, 0xf8, 0xef, 0xa7, 0xa0, 0x81, 0x5a, 0x70, 0x38, - 0x1d, 0x71, 0x46, 0x78, 0x17, 0xbd, 0x04, 0xca, 0x52, 0x9a, 0xed, 0xe0, 0x7f, - 0xf6, 0x0d, 0x17, 0x6a, 0xed, 0x0f, 0x85, 0x5a, 0x2e, 0xae, 0xa8, 0x9e, 0xae, - 0xac, 0xa8, 0x93, 0x58, 0xc0, 0x81, 0x82, 0x6a, 0x08, 0x12, 0xa5, 0xbc, 0xa2, - 0x8b, 0xe1, 0x37, 0x3f, 0x08, 0x6d, 0xbd, 0xba, 0x7e, 0x43, 0xe2, 0x03, 0x21, - 0x2c, 0x9f, 0xed, 0x21, 0x47, 0x4b, 0xa1, 0x9a, 0x05, 0x5f, 0xfc, 0xc1, 0x79, - 0x41, 0x2e, 0x89, 0x3a, 0x74, 0x48, 0x32, 0x29, 0x8c, 0x5f, 0xe2, 0x4c, 0xc6, - 0xb1, 0x86, 0x67, 0xf4, 0x9b, 0x34, 0xdf, 0xb1, 0x23, 0x79, 0x26, 0x74, 0x19, - 0xa9, 0xcb, 0x94, 0x03, 0xd8, 0x16, 0x7d, 0x8d, 0x1e, 0x91, 0xd2, 0x81, 0x1a, - 0x04, 0x3b, 0x29, 0x24, 0x3b, 0x06, 0x9b, 0x37, 0x58, 0x78, 0x47, 0xdc, 0x6f, - 0xcd, 0xdb, 0x18, 0x31, 0xbd, 0x1c, 0xc2, 0x56, 0x7c, 0xa0, 0x33, 0xac, 0x40, - 0xf7, 0x4a, 0xb6, 0x95, 0x5f, 0x68, 0x3b, 0x12, 0xe4, 0xe8, 0x25, 0x4e, 0x4e, - 0xa7, 0x60, 0xd3, 0x8b, 0x3f, 0x46, 0x79, 0x1c, 0x5c, 0x4c, 0xb1, 0x2b, 0xc7, - 0xcc, 0xb0, 0xed, 0x18, 0x65, 0xf2, 0x5d, 0x60, 0x1c, 0x30, 0x3f, 0x81, 0xfb, - 0x1f, 0xa1, 0xdb, 0x48, 0x53, 0x3d, 0x3d, 0x6b, 0x28, 0x8e, 0x4d, 0x9a, 0x4d, - 0xff, 0x8e, 0xc2, 0x1c, 0x96, 0xf5, 0x78, 0x39, 0x97, 0x10, 0xc8, 0x25, 0xfe, - 0x7e, 0x32, 0xf9, 0x3a, 0x8c, 0x07, 0x43, 0xf9, 0xeb, 0xd5, 0x4c, 0xc1, 0x51, - 0xc7, 0x61, 0x03, 0x37, 0xae, 0xbf, 0x7e, 0x9b, 0x91, 0x57, 0x20, 0xa5, 0x43, - 0x51, 0xd4, 0x9a, 0xb8, 0xc2, 0x2f, 0xa3, 0x49, 0x98, 0xdc, 0xf5, 0x83, 0xd4, - 0x38, 0x73, 0x61, 0xef, 0x3f, 0xf8, 0x6f, 0x50, 0xec, 0x53, 0xf4, 0x92, 0x49, - 0xe4, 0xad, 0x34, 0x96, 0x03, 0x06, 0x6f, 0xc9, 0xc6, 0x61, 0xd6, 0x9f, 0x91, - 0x1d, 0xfa, 0x72, 0x41, 0xc8, 0xd5, 0x79, 0x2d, 0x78, 0x33, 0x2e, 0x93, 0xdb, - 0x65, 0x93, 0xe5, 0x93, 0xfd, 0x5d, 0x45, 0x6a, 0xbd, 0xac, 0x79, 0xa7, 0x16, - 0xfa, 0x6e, 0x3f, 0x39, 0x28, 0xa8, 0x4d, 0x19, 0x70, 0x86, 0xec, 0xc2, 0x7e, - 0xac, 0x18, 0x8f, 0xf2, 0xb7, 0x15, 0x21, 0x76, 0x2a, 0xd4, 0x7b, 0xec, 0x08, - 0x99, 0x2d, 0x86, 0x85, 0x0e, 0xb3, 0xea, 0x13, 0xd5, 0x07, 0x08, 0x07, 0xa2, - 0xcb, 0x66, 0x80, 0xa2, 0x49, 0xea, 0x1c, 0x04, 0x20, 0x37, 0x48, 0xda, 0xab, - 0x9b, 0x0d, 0x3b, 0x3c, 0x2e, 0x9d, 0xcf, 0xe7, 0x76, 0x0c, 0x79, 0xdd, 0xa3, - 0xc0, 0x25, 0x9e, 0x7d, 0xa9, 0xcc, 0xfa, 0x5f, 0xb6, 0x47, 0xa5, 0xe2, 0x0f, - 0x3f, 0x3b, 0xc8, 0x66, 0xda, 0x24, 0xea, 0xde, 0x36, 0xb6, 0x83, 0xa2, 0xbd, - 0x71, 0x97, 0xfb, 0x67, 0x27, 0x26, 0xf4, 0x20, 0x08, 0xb4, 0x6a, 0xd7, 0xf8, - 0xab, 0xdb, 0x18, 0x11, 0x7f, 0x32, 0x2c, 0x57, 0xdc, 0x01, 0x7b, 0x0a, 0x37, - 0x1f, 0x48, 0x63, 0x13, 0x5b, 0x4d, 0xb5, 0xa1, 0xb6, 0xe0, 0x11, 0x1e, 0x63, - 0x0e, 0x23, 0x45, 0x9a, 0x74, 0x88, 0x33, 0x99, 0x1c, 0xff, 0x71, 0xa0, 0x5c, - 0x4a, 0xb1, 0x9d, 0xd9, 0x97, 0x71, 0x58, 0x2d, 0x03, 0x81, 0x04, 0xb7, 0xe0, - 0x39, 0xa3, 0x76, 0xf7, 0xac, 0xbb, 0xea, 0xdb, 0x34, 0xf9, 0x45, 0xbe, 0xb9, - 0xd7, 0xca, 0x0e, 0x4e, 0x3d, 0x5c, 0x5e, 0x4e, 0xb1, 0xd8, 0x52, 0x6e, 0xbd, - 0x13, 0xda, 0xcb, 0x1b, 0xa3, 0x57, 0x35, 0xc6, 0xd0, 0x4a, 0x45, 0x55, 0xac, - 0xf4, 0xbf, 0x11, 0x76, 0x26, 0x50, 0x0d, 0x77, 0xb3, 0x81, 0x89, 0xdd, 0x48, - 0x88, 0x04, 0x12, 0x25, 0xac, 0xbe, 0x38, 0x74, 0xa4, 0xc0, 0xf6, 0x07, 0xfe, - 0x67, 0x45, 0xf9, 0x35, 0x5b, 0x3f, 0xa1, 0x88, 0xf1, 0xd6, 0x5c, 0x09, 0xf3, - 0x89, 0xaf, 0x1b, 0x9d, 0x62, 0x32, 0xaa, 0x79, 0x44, 0x79, 0x19, 0xc5, 0x50, - 0xf6, 0xf3, 0x1f, 0xec, 0x35, 0x48, 0x1c, 0xb9, 0x22, 0xde, 0x2d, 0xb5, 0xb4, - 0xda, 0x2f, 0x81, 0x94, 0x86, 0x17, 0x02, 0x8e, 0x32, 0x17, 0x06, 0xa3, 0xa7, - 0x78, 0xc1, 0x93, 0x8c, 0x44, 0x3b, 0xb0, 0x0e, 0x5b, 0x0f, 0xf0, 0x6a, 0xd8, - 0xab, 0x9b, 0x1a, 0xb0, 0xc1, 0x14, 0x77, 0x67, 0x3f, 0x85, 0xdf, 0x95, 0x61, - 0xdb, 0xea, 0x45, 0xd5, 0xf9, 0x78, 0x1e, 0xbe, 0x31, 0x7a, 0x07, 0x10, 0xae, - 0x54, 0x61, 0xe3, 0x4f, 0xe6, 0xf1, 0xb1, 0xaa, 0x9b, 0x4e, 0x67, 0xb1, 0x49, - 0x10, 0x98, 0x48, 0x02, 0xc2, 0xa7, 0xe3, 0x81, 0x93, 0xbc, 0x7b, 0xdc, 0x8b, - 0xa3, 0xe4, 0xe3, 0xd1, 0xd9, 0x33, 0xbf, 0xb5, 0x80, 0xf5, 0xb3, 0xe8, 0x7a, - 0x2a, 0x06, 0x51, 0x70, 0x51, 0x41, 0x0f, 0xe1, 0xb4, 0xff, 0x1e, 0xa0, 0xad, - 0xe8, 0x24, 0xf3, 0x38, 0x51, 0x54, 0x56, 0xa5, 0x7c, 0x7a, 0x91, 0x6a, 0x74, - 0x38, 0x8e, 0xe8, 0xf1, 0x28, 0x1f, 0x9a, 0xde, 0x0a, 0xe2, 0xa2, 0x61, 0x3a, - 0x06, 0x12, 0xc4, 0x69, 0xdf, 0x79, 0x2b, 0x8d, 0xf4, 0xca, 0xe4, 0xfc, 0x25, - 0xc1, 0xca, 0xdb, 0xa9, 0x5a, 0x80, 0x7c, 0xe6, 0x1e, 0x5a, 0x53, 0x03, 0xfa, - 0xaf, 0x9e, 0x14, 0x65, 0x39, 0x96, 0xb5, 0xa8, 0xad, 0xc3, 0x4f, 0xd4, 0x75, - 0xef, 0x14, 0x99, 0x09, 0x4b, 0xab, 0xaf, 0x1f, 0x3f, 0x07, 0xda, 0x9a, 0x39, - 0x0b, 0x1d, 0x9f, 0xc9, 0xa0, 0x83, 0x27, 0x98, 0x7a, 0xdf, 0xe9, 0x56, 0x48, - 0x63, 0xfb, 0xdf, 0xa8, 0xf6, 0xb4, 0x6a, 0x88, 0x41, 0x58, 0x30, 0x99, 0xaf, - 0xb7, 0x87, 0x01, 0x18, 0xfa, 0xce, 0x76, 0x34, 0x7e, 0x40, 0xb6, 0xfd, 0x8c, - 0xd1, 0x55, 0x82, 0xae, 0x8e, 0x23, 0xbe, 0x9a, 0x02, 0x19, 0xbc, 0x3e, 0x4e, - 0x45, 0x46, 0xa3, 0x0d, 0x3b, 0xbb, 0xbd, 0x16, 0x86, 0x08, 0x68, 0x76, 0xbe, - 0x0e, 0x4c, 0x85, 0x9b, 0xe7, 0x1f, 0xb5, 0x8f, 0x4f, 0xab, 0x3d, 0x28, 0xc0, - 0xb4, 0xf7, 0xe7, 0x5a, 0xd1, 0xed, 0xb7, 0xf8, 0x89, 0x46, 0xfb, 0x40, 0xcf, - 0xa5, 0x78, 0x6a, 0x0f, 0xcb, 0xa1, 0x30, 0x3c, 0x83, 0x47, 0xec, 0xee, 0x93, - 0xd4, 0x6d, 0x14, 0x0b, 0xb5, 0xf6, 0x95, 0x31, 0xd6, 0x66, 0x54, 0x8b, 0x10, - 0x9c, 0xe7, 0x64, 0xbe, 0xad, 0x7c, 0x87, 0xbd, 0x4c, 0x87, 0x64, 0x94, 0xde, - 0x82, 0xdb, 0x6e, 0x50, 0x73, 0xa6, 0xc9, 0x4f, 0x7c, 0x09, 0x9a, 0x40, 0xd7, - 0xa3, 0x1c, 0x4a, 0x04, 0xb6, 0x9c, 0x9f, 0xcc, 0xf3, 0xc7, 0xdd, 0x56, 0xf5, - 0x54, 0x47, 0x76, 0xc5, 0x3b, 0x4d, 0xf7, 0x95, 0x39, 0x81, 0xd5, 0x5a, 0x96, - 0xa6, 0xdc, 0xff, 0x99, 0x04, 0xa9, 0x08, 0x42, 0xe5, 0xba, 0xfe, 0xc8, 0x84, - 0x0c, 0x2d, 0x25, 0x5b, 0xf5, 0xad, 0x61, 0xc4, 0x60, 0xf9, 0x8f, 0xeb, 0x82, - 0xa1, 0x0f, 0xa1, 0xc0, 0x99, 0xf6, 0x27, 0x76, 0x79, 0x82, 0x36, 0xc5, 0xca, - 0x7f, 0x1e, 0x46, 0xeb, 0xdb, 0x2b, 0x14, 0x4d, 0x87, 0x13, 0xe5, 0x6c, 0x77, - 0x2f, 0x2c, 0x3b, 0x86, 0x0e, 0xa5, 0xb0, 0x3a, 0x88, 0x54, 0xbc, 0x6e, 0x65, - 0x90, 0xd6, 0x3c, 0xc0, 0xea, 0x54, 0xf1, 0x0b, 0x73, 0xba, 0x24, 0x1b, 0xf7, - 0x4b, 0x63, 0x55, 0x51, 0xa2, 0xaa, 0xca, 0x96, 0x87, 0xac, 0x52, 0x69, 0xfd, - 0x36, 0x8b, 0x26, 0xd7, 0x0a, 0x73, 0x7f, 0x26, 0x76, 0x85, 0x99, 0x8a, 0x3f, - 0x7d, 0x26, 0x37, 0x91, 0x49, 0x09, 0xc7, 0x46, 0x49, 0x5d, 0x24, 0xc4, 0x98, - 0x63, 0x5e, 0xf9, 0x7a, 0xc6, 0x6a, 0x40, 0x08, 0x94, 0xc0, 0x9f, 0x73, 0x48, - 0x8e, 0xb7, 0xcf, 0x33, 0xf6, 0xda, 0xd1, 0x66, 0x6a, 0x05, 0xf9, 0x1a, 0xd7, - 0x75, 0x79, 0x65, 0xc2, 0x99, 0x36, 0xe7, 0xfa, 0x48, 0xd7, 0x7e, 0x89, 0xee, - 0x09, 0x62, 0xf5, 0x8c, 0x05, 0x1d, 0x11, 0xd0, 0x55, 0xfc, 0xe2, 0x04, 0xa5, - 0x62, 0xde, 0x68, 0x08, 0x8a, 0x1b, 0x26, 0x48, 0xb8, 0x17, 0x4c, 0xbc, 0xfc, - 0x8b, 0x5b, 0x5c, 0xd0, 0x77, 0x11, 0x5a, 0xfd, 0xe1, 0x78, 0x3f, 0x5c, 0xdb, - 0x26, 0xf7, 0xbf, 0xdf, 0x87, 0xb2, 0x1b, 0x1c, 0x70, 0xdc, 0x56, 0xbf, 0x1c, - 0x82, 0x85, 0x7a, 0x40, 0xca, 0x2a, 0xa2, 0x36, 0xec, 0x56, 0x69, 0x12, 0xd8, - 0x64, 0x93, 0x7a, 0xa0, 0x7d, 0xdf, 0xfc, 0xd3, 0x77, 0x39, 0x5c, 0xba, 0x61, - 0x6d, 0x63, 0xc0, 0xb6, 0x9c, 0x01, 0xfc, 0xc4, 0x53, 0x91, 0xfd, 0x5b, 0x87, - 0x63, 0xfb, 0x96, 0xd7, 0xca, 0x33, 0x3a, 0x12, 0x79, 0x11, 0xb4, 0xed, 0x95, - 0xb0, 0x0c, 0x24, 0xcb, 0x57, 0x8f, 0xfa, 0xb9, 0xf1, 0x11, 0x60, 0x30, 0x04, - 0x86, 0x08, 0xcc, 0x99, 0x0e, 0x74, 0xeb, 0xad, 0x5c, 0x34, 0x8a, 0xd9, 0xa8, - 0x85, 0xe9, 0x07, 0xe0, 0xbe, 0x5a, 0x78, 0x83, 0xc8, 0x84, 0x89, 0xcb, 0x41, - 0x43, 0x2d, 0xac, 0x86, 0x20, 0x23, 0xd4, 0x67, 0x89, 0xeb, 0x7d, 0x98, 0x9a, - 0xf7, 0x79, 0xe5, 0xb8, 0xd2, 0x83, 0x05, 0xd7, 0xe2, 0x12, 0x4d, 0x3b, 0x55, - 0x77, 0x0f, 0x8c, 0x05, 0x0a, 0xb2, 0x5e, 0x1a, 0x46, 0x02, 0xeb, 0x58, 0xcf, - 0x12, 0x34, 0xea, 0xe1, 0x5f, 0x33, 0xbb, 0xde, 0xce, 0x27, 0xa6, 0xb1, 0x2d, - 0xb3, 0xe4, 0xdb, 0xfd, 0x3a, 0x2b, 0xfc, 0xc9, 0xee, 0x6e, 0xd0, 0x16, 0xc0, - 0xf6, 0x65, 0xbe, 0x81, 0x33, 0xb7, 0xdc, 0x1d, 0x86, 0x04, 0x4d, 0xb0, 0xf9, - 0xdb, 0x40, 0xfb, 0x0e, 0x9f, 0x8b, 0xc2, 0xe4, 0xdb, 0x53, 0x82, 0xa8, 0xb4, - 0xf8, 0x15, 0xb4, 0xe8, 0x43, 0x4a, 0xd0, 0xdf, 0xbc, 0x51, 0xa5, 0xe9, 0xb1, - 0x45, 0xe1, 0x59, 0x6c, 0xbf, 0x46, 0x70, 0xb7, 0xe0, 0x5d, 0xfd, 0xaf, 0xbb, - 0x0c, 0xf3, 0xdd, 0xee, 0x28, 0xd7, 0x6a, 0x82, 0x42, 0x8e, 0x8a, 0xba, 0x43, - 0x64, 0xe8, 0x4b, 0xac, 0x37, 0x92, 0x98, 0xdf, 0x29, 0x32, 0xe6, 0x9b, 0xb5, - 0xd0, 0x45, 0x51, 0x6e, 0xfc, 0x33, 0xae, 0x6c, 0xc3, 0x94, 0x7c, 0xeb, 0x09, - 0xed, 0x37, 0x16, 0x67, 0x21, 0x2a, 0x83, 0x1b, 0x54, 0x85, 0xea, 0xfc, 0xe8, - 0x48, 0x81, 0x88, 0xea, 0x4e, 0x27, 0xd0, 0xcd, 0xf7, 0xdd, 0xd3, 0x48, 0xab, - 0xff, 0x77, 0x7f, 0x4a, 0x13, 0xbb, 0xc7, 0x16, 0xb6, 0xa5, 0x94, 0x4e, 0xe7, - 0x27, 0x96, 0x56, 0x90, 0xe2, 0x09, 0xb4, 0x9e, 0xb9, 0x62, 0xc0, 0x39, 0x97, - 0x5f, 0x93, 0x9e, 0xd5, 0xc6, 0xe4, 0xc4, 0x00, 0xd8, 0x87, 0x75, 0x94, 0x33, - 0xd3, 0xad, 0x71, 0x6d, 0xa0, 0xcb, 0x44, 0x61, 0x13, 0xc7, 0x72, 0x7a, 0x64, - 0xb5, 0x8c, 0x3f, 0x8a, 0x0f, 0x81, 0x18, 0x9f, 0x98, 0x00, 0x52, 0x33, 0xa8, - 0x13, 0x66, 0xae, 0xe7, 0x3c, 0xec, 0x85, 0x22, 0x8e, 0xbc, 0xfd, 0x5e, 0xe3, - 0xc3, 0xfb, 0x44, 0xdb, 0x76, 0xba, 0x24, 0x3f, 0x28, 0x42, 0xb7, 0xb5, 0xfc, - 0x74, 0x6a, 0xe5, 0x1b, 0x0b, 0xc4, 0xbd, 0x4f, 0xc9, 0xfd, 0x83, 0x35, 0x65, - 0xea, 0x85, 0x2b, 0x92, 0xb2, 0x24, 0xf6, 0x99, 0x03, 0x18, 0xad, 0x8c, 0x7d, - 0x94, 0x37, 0xe2, 0x0e, 0x2a, 0x1f, 0x20, 0xe8, 0x18, 0xf9, 0x05, 0x7c, 0x5a, - 0xba, 0xaa, 0x2e, 0x5c, 0x15, 0xb9, 0x49, 0x45, 0xcd, 0x42, 0x4c, 0x28, 0xa5, - 0xfa, 0x38, 0x5d, 0xad, 0xfe, 0x49, 0x07, 0xb2, 0x74, 0xd8, 0x42, 0x70, 0x7d, - 0xb3, 0x69, 0x7a, 0x5a, 0xe6, 0xc8, 0xf5, 0x42, 0xe5, 0xec, 0xc0, 0x7f, 0xe4, - 0x73, 0x50, 0xd1, 0x01, 0x46, 0x70, 0x21, 0x2e, 0xfe, 0x81, 0xfb, 0x7c, 0x73, - 0xe8, 0x45, 0x0d, 0xf8, 0x14, 0xef, 0x62, 0x32, 0xf7, 0x49, 0x0f, 0x63, 0xcc, - 0xf0, 0x74, 0x80, 0xf8, 0x84, 0xa6, 0x6e, 0xaf, 0xfc, 0x28, 0xfe, 0xa4, 0x48, - 0xd7, 0xb4, 0x01, 0xcd, 0xae, 0x10, 0xe7, 0xc0, 0xc7, 0xf9, 0xa7, 0xb1, 0x53, - 0x31, 0x96, 0x9f, 0xc8, 0xcb, 0x36, 0x39, 0x67, 0x73, 0xde, 0x19, 0x19, 0x31, - 0xc7, 0x50, 0xf6, 0xce, 0x5c, 0xaa, 0xf2, 0x97, 0x68, 0xeb, 0xb2, 0x7d, 0xac, - 0xc7, 0x38, 0x05, 0x6a, 0x81, 0x25, 0xb4, 0x77, 0x2b, 0xf8, 0x7a, 0xe1, 0x0a, - 0x8a, 0x30, 0x9b, 0x9b, 0xd6, 0x55, 0x04, 0x3c, 0xfc, 0x31, 0x59, 0x49, 0x43, - 0x68, 0xc5, 0xab, 0x8c, 0xad, 0xb7, 0xf6, 0x71, 0xe9, 0x62, 0x6b, 0xd2, 0x63, - 0xe3, 0x11, 0x81, 0xa6, 0x04, 0xb5, 0x06, 0xa0, 0x3b, 0x43, 0x9a, 0x7f, 0xfe, - 0x43, 0x55, 0x89, 0x24, 0x77, 0xe2, 0xbd, 0xf3, 0x38, 0xc6, 0x2c, 0x39, 0x22, - 0xf7, 0xd3, 0xc9, 0xa5, 0x6c, 0x71, 0x03, 0xd9, 0x11, 0x94, 0x8a, 0x84, 0xb5, - 0xae, 0x2d, 0xbb, 0x16, 0xa3, 0x76, 0x1a, 0xdd, 0x05, 0x3a, 0x0f, 0x96, 0x7e, - 0x6b, 0x5b, 0xc9, 0x42, 0x11, 0xb6, 0x54, 0x71, 0x53, 0x26, 0x7c, 0x6e, 0xe1, - 0xca, 0xd0, 0xd9, 0x74, 0xa7, 0x10, 0x88, 0x58, 0x37, 0x35, 0xe4, 0xf6, 0x3d, - 0x33, 0x15, 0x6d, 0xad, 0xd5, 0x4c, 0x2f, 0xaf, 0x89, 0x11, 0x4a, 0x12, 0x7b, - 0x97, 0xb9, 0x4c, 0xc2, 0xa2, 0x2e, 0xf3, 0x03, 0xf4, 0x59, 0xd0, 0x4f, 0xc0, - 0xb5, 0x3a, 0xce, 0x59, 0x18, 0xd4, 0x7f, 0xf3, 0x3a, 0x55, 0x8b, 0xd7, 0x1a, - 0x75, 0xf3, 0x55, 0xfb, 0xd0, 0x6b, 0xbc, 0xcf, 0x4e, 0x02, 0xc3, 0xc0, 0xa4, - 0xb6, 0x3d, 0x0c, 0xc9, 0x49, 0x80, 0x1d, 0x63, 0xa6, 0x4c, 0xb2, 0xd3, 0x23, - 0x73, 0xb2, 0xc7, 0xb2, 0x74, 0xab, 0x2d, 0xb4, 0x68, 0x21, 0x42, 0xc8, 0xb2, - 0x1d, 0x84, 0xc4, 0x81, 0xf5, 0xef, 0x21, 0xe4, 0xb5, 0xe3, 0x60, 0x34, 0x51, - 0xbf, 0x94, 0x77, 0x4d, 0x0e, 0xf4, 0x7f, 0x63, 0xfa, 0x6a, 0xbb, 0x78, 0xd2, - 0x1c, 0x19, 0x3c, 0xbe, 0x65, 0xb6, 0x95, 0xfe, 0x67, 0x42, 0x3c, 0x1e, 0x2d, - 0x31, 0x2e, 0x27, 0x76, 0xfa, 0x24, 0xec, 0xe8, 0x46, 0x83, 0xe7, 0x48, 0x76, - 0xc5, 0x5e, 0xa0, 0x36, 0x9e, 0x4e, 0xa0, 0xe8, 0x64, 0x94, 0xe0, 0x0d, 0xde, - 0x23, 0x6a, 0x16, 0x89, 0x73, 0x1f, 0x0a, 0x5d, 0x82, 0x03, 0xaf, 0xde, 0x5c, - 0x42, 0x36, 0x40, 0xb8, 0x1e, 0x4f, 0x63, 0x1c, 0x98, 0x1c, 0x03, 0x83, 0x9f, - 0x4b, 0x44, 0xc9, 0xe8, 0x03, 0x00, 0x23, 0xf8, 0xb9, 0xd8, 0x17, 0x85, 0x60, - 0xda, 0xf9, 0x75, 0x11, 0x19, 0x55, 0xa2, 0xbc, 0xa3, 0x42, 0x3e, 0xee, 0xfc, - 0x52, 0x7b, 0xe3, 0xa8, 0x54, 0x3e, 0xb9, 0x0a, 0x5e, 0xc0, 0x2f, 0x35, 0xc7, - 0xc6, 0x4b, 0x7d, 0xd5, 0x9a, 0x72, 0xda, 0x00, 0x74, 0x63, 0x4e, 0x01, 0xd2, - 0xab, 0xf3, 0x63, 0x7a, 0xdd, 0x77, 0xc7, 0x35, 0x0f, 0x12, 0xb0, 0x11, 0xb2, - 0x94, 0x16, 0x8e, 0xc7, 0x55, 0x76, 0xe4, 0x7d, 0x16, 0x9e, 0x39, 0x38, 0xbf, - 0x6a, 0xe2, 0xaa, 0x8f, 0xf7, 0xcf, 0xba, 0x7c, 0xac, 0xb1, 0xf9, 0x2b, 0x6e, - 0x4c, 0x24, 0x97, 0xbf, 0xfa, 0x9f, 0x17, 0xca, 0xd2, 0x42, 0xfa, 0x9c, 0x31, - 0x79, 0xc1, 0xa3, 0xaa, 0x81, 0xf7, 0x36, 0x16, 0x49, 0x57, 0x2c, 0x71, 0x5c, - 0x25, 0xa1, 0xf6, 0xcd, 0x5a, 0xce, 0x82, 0xc0, 0x0a, 0xb2, 0x34, 0x2b, 0x9c, - 0x3c, 0xb4, 0xff, 0xfd, 0xda, 0x16, 0x0c, 0xa5, 0xab, 0x9e, 0x9b, 0xaf, 0x21, - 0x39, 0xef, 0x9a, 0xfb, 0xe1, 0xb1, 0xf3, 0x09, 0x46, 0x2a, 0xfc, 0xe4, 0x62, - 0xa7, 0x9b, 0xb9, 0x69, 0x8e, 0x22, 0xc9, 0x57, 0xc5, 0x90, 0xa7, 0x53, 0xa7, - 0x6b, 0x87, 0xe0, 0x09, 0x12, 0x1e, 0x06, 0xf6, 0xa1, 0xbf, 0x62, 0xa0, 0x8b, - 0xf4, 0x35, 0xd9, 0x2e, 0x2f, 0xff, 0xe8, 0x6e, 0x2a, 0x9c, 0xbb, 0xa9, 0x13, - 0x3a, 0x68, 0xe4, 0xae, 0xbf, 0x33, 0xc3, 0x84, 0x36, 0xf2, 0x54, 0x5f, 0xc2, - 0xd5, 0x28, 0x32, 0xd1, 0x65, 0xaf, 0x41, 0x5b, 0x24, 0x4a, 0xdc, 0x5f, 0x57, - 0x37, 0x7d, 0xee, 0xdf, 0x46, 0x0a, 0xa3, 0xbe, 0xb4, 0x34, 0x19, 0xc6, 0xb0, - 0x82, 0xe8, 0x35, 0xce, 0xe2, 0xf1, 0x6f, 0x2f, 0x87, 0x67, 0xf0, 0x3d, 0x9f, - 0x42, 0xa8, 0x4a, 0x76, 0xcb, 0x68, 0x67, 0xb2, 0xbc, 0x75, 0xba, 0xee, 0xcc, - 0xaf, 0xe6, 0x15, 0x19, 0xcf, 0xce, 0xac, 0x55, 0x27, 0x96, 0x1b, 0x32, 0x4d, - 0xce, 0x09, 0x33, 0x5a, 0x58, 0x53, 0xa6, 0xb4, 0xda, 0x3e, 0x47, 0x1f, 0xc1, - 0xfb, 0x19, 0x6f, 0x76, 0xd9, 0xb8, 0x79, 0xc7, 0x20, 0x08, 0x62, 0xea, 0xd1, - 0x8d, 0xea, 0x1f, 0x3e, 0xc9, 0x03, 0x7f, 0x37, 0xb6, 0xea, 0x28, 0x91, 0x66, - 0x51, 0x0b, 0x47, 0x5b, 0x20, 0x04, 0x4d, 0x45, 0x2e, 0x0f, 0x6e, 0xc3, 0xab, - 0x47, 0x16, 0x15, 0x07, 0xd5, 0x3a, 0x2d, 0xc6, 0x09, 0x49, 0xf1, 0xe4, 0x50, - 0xc3, 0xea, 0xda, 0xef, 0x88, 0x6e, 0x6b, 0x82, 0x7c, 0x5b, 0xb5, 0xef, 0x11, - 0xf4, 0x02, 0x8a, 0x70, 0x4f, 0xc5, 0xa9, 0x38, 0x2c, 0x6b, 0x03, 0xe7, 0xd8, - 0x08, 0x1e, 0x07, 0x98, 0x92, 0x86, 0xa0, 0xd9, 0xce, 0x56, 0x1f, 0xaa, 0x1b, - 0x6e, 0x96, 0x23, 0xd7, 0xab, 0x71, 0x00, 0x7f, 0xd2, 0x77, 0xb9, 0x86, 0xa0, - 0x48, 0x83, 0x46, 0x02, 0xea, 0xf8, 0x78, 0x0f, 0x06, 0x75, 0xba, 0xae, 0x68, - 0x41, 0x5d, 0x3a, 0xf0, 0x10, 0x19, 0xb5, 0xea, 0x48, 0x0d, 0xce, 0x93, 0x62, - 0xec, 0x8d, 0x5d, 0xf3, 0xe7, 0x80, 0xff, 0xa7, 0x2e, 0xba, 0x8a, 0x8d, 0xf7, - 0x3c, 0x54, 0x08, 0x70, 0xa8, 0x39, 0xbb, 0x03, 0x91, 0x0a, 0x49, 0x17, 0x70, - 0xe1, 0xc8, 0x4b, 0x22, 0x3e, 0xe9, 0x16, 0x52, 0x70, 0xc4, 0xcc, 0xf6, 0xfc, - 0x70, 0x75, 0xc3, 0x7e, 0x6f, 0xbb, 0x14, 0x38, 0x15, 0x07, 0xfa, 0x18, 0xf1, - 0x39, 0x53, 0x33, 0x6a, 0xb2, 0xbe, 0xdc, 0x60, 0x0c, 0x61, 0x5b, 0xd4, 0x99, - 0x27, 0xe9, 0xd7, 0xf4, 0x88, 0x4e, 0x6e, 0xd3, 0xfd, 0x5e, 0x4b, 0x7c, 0x38, - ], - txid: [ - 0x5b, 0xb4, 0x4e, 0xbf, 0x80, 0x30, 0xac, 0x2f, 0xb7, 0x4d, 0x82, 0xb4, 0x32, - 0xd4, 0x80, 0x21, 0x8a, 0x3d, 0x16, 0x48, 0xe3, 0x27, 0x0b, 0x89, 0xff, 0xb3, - 0xcf, 0x73, 0x5c, 0x2c, 0xe7, 0xa0, - ], - auth_digest: [ - 0xb3, 0xd8, 0xef, 0x97, 0x5a, 0x6a, 0xfa, 0x72, 0x00, 0x92, 0x3c, 0x11, 0x60, - 0xb7, 0xeb, 0xcf, 0xce, 0x43, 0xb5, 0xb9, 0x1e, 0xe3, 0xb3, 0xdd, 0x91, 0x78, - 0x49, 0x38, 0xbf, 0xa6, 0x8e, 0xa6, - ], - amounts: vec![1399781968202734, 1999413718097392], - script_pubkeys: vec![ - vec![0x00, 0x53, 0x00], - vec![0x53, 0x51, 0x52, 0x52, 0x65, 0x52, 0x00, 0x53, 0x63], - ], - transparent_input: Some(1), - sighash_shielded: [ - 0xa8, 0x19, 0x23, 0x45, 0x81, 0x21, 0xcd, 0xb5, 0x64, 0x75, 0xf9, 0x6e, 0xd2, - 0xd9, 0x20, 0x80, 0xf5, 0x6e, 0xd3, 0x06, 0xe4, 0x1f, 0x45, 0x01, 0x2a, 0xf5, - 0x7c, 0xfb, 0x34, 0x8a, 0xcd, 0xa1, - ], - sighash_all: Some([ - 0x0b, 0x75, 0x2d, 0xe9, 0x48, 0x55, 0x2d, 0x11, 0x70, 0xc1, 0xc9, 0x38, 0x2d, - 0xb1, 0x4e, 0xb4, 0x6a, 0xda, 0x2d, 0xb1, 0x64, 0xda, 0x90, 0x14, 0x1a, 0x62, - 0x6a, 0x03, 0x5d, 0xf3, 0xb4, 0xd5, - ]), - sighash_none: Some([ - 0xef, 0x8a, 0xf0, 0x6f, 0x6a, 0xec, 0x49, 0x39, 0x4f, 0x46, 0x6d, 0xdd, 0x5a, - 0x6c, 0x11, 0x2f, 0x80, 0xde, 0xd7, 0x68, 0x7c, 0xa2, 0x1c, 0x10, 0x78, 0x2f, - 0xda, 0x26, 0x1b, 0xe5, 0xf6, 0x87, - ]), - sighash_single: Some([ - 0x9b, 0xa5, 0x4f, 0xf9, 0xf5, 0xda, 0x79, 0xfb, 0xa5, 0x1c, 0xdf, 0x48, 0x91, - 0xc0, 0x21, 0xd8, 0xdb, 0xe8, 0x88, 0xbf, 0x21, 0x5f, 0x7c, 0x2f, 0xd7, 0x9e, - 0x43, 0xba, 0x5d, 0xd1, 0xcc, 0x76, - ]), - sighash_all_anyone: Some([ - 0x22, 0x54, 0x83, 0x9a, 0x4e, 0xd2, 0x5a, 0x96, 0x54, 0x8d, 0xd8, 0x04, 0xdc, - 0x33, 0x38, 0x29, 0xba, 0xa4, 0xda, 0x26, 0x77, 0xe9, 0xc8, 0x3d, 0xf8, 0xab, - 0x2d, 0x5a, 0x57, 0xcd, 0x66, 0x6a, - ]), - sighash_none_anyone: Some([ - 0x14, 0x97, 0xbf, 0x31, 0xdf, 0x9b, 0x0f, 0x6e, 0x77, 0xe1, 0x17, 0x3a, 0x9e, - 0xb4, 0x08, 0xef, 0x5e, 0x19, 0xd8, 0x44, 0xaa, 0x9a, 0x85, 0xb6, 0xe7, 0x54, - 0x6f, 0x30, 0xde, 0x1f, 0x0b, 0xe2, - ]), - sighash_single_anyone: Some([ - 0x39, 0xac, 0xb5, 0xfd, 0x91, 0xa1, 0x2d, 0xd4, 0x07, 0x36, 0xfc, 0x6a, 0xba, - 0x53, 0xfd, 0xf5, 0x2f, 0x05, 0x83, 0x80, 0x94, 0xc3, 0xaa, 0x6e, 0xf3, 0x45, - 0xd9, 0x4a, 0x1a, 0x07, 0x24, 0xbf, - ]), - }, ] } } From db9d03dfd280b7d8dbe848a3530f32f7d60be9cf Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 23 Jan 2023 13:37:04 +0200 Subject: [PATCH 27/34] updated orchard commit in cargo.toml --- zcash_primitives/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index f2111d0750..0476e7d96d 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -38,7 +38,7 @@ jubjub = "0.9" lazy_static = "1" memuse = "0.2" nonempty = "0.7" -orchard = { version = "0.3", git = "https://github.com/QED-it/orchard.git", rev = "55ce92f015057e06850118b5cea5e0ff350ff96d" } +orchard = { version = "0.3", git = "https://github.com/QED-it/orchard.git", rev = "c6e048a4474f0bef5182ed56e5d2ecff6fea0389" } proptest = { version = "1.0.0", optional = true } rand = "0.8" rand_core = "0.6" @@ -54,7 +54,7 @@ zcash_note_encryption = { version = "0.2", path = "../components/zcash_note_encr criterion = "0.3" proptest = "1.0.0" rand_xorshift = "0.3" -orchard = { version = "0.3", features = ["test-dependencies"], git = "https://github.com/QED-it/orchard.git", rev = "55ce92f015057e06850118b5cea5e0ff350ff96d" } +orchard = { version = "0.3", features = ["test-dependencies"], git = "https://github.com/QED-it/orchard.git", rev = "c6e048a4474f0bef5182ed56e5d2ecff6fea0389" } [target.'cfg(unix)'.dev-dependencies] pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 From b6f28c22f493e6b0b7659a5b0ef5e78a58e90a2a Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 24 Jan 2023 10:35:54 +0200 Subject: [PATCH 28/34] fmt --- zcash_primitives/src/transaction/components/sapling.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/zcash_primitives/src/transaction/components/sapling.rs b/zcash_primitives/src/transaction/components/sapling.rs index e2a7d61c33..95547fe097 100644 --- a/zcash_primitives/src/transaction/components/sapling.rs +++ b/zcash_primitives/src/transaction/components/sapling.rs @@ -273,9 +273,7 @@ impl DynamicUsage for OutputDescription { } } -impl ShieldedOutput> - for OutputDescription -{ +impl ShieldedOutput> for OutputDescription { fn ephemeral_key(&self) -> EphemeralKeyBytes { self.ephemeral_key.clone() } From d08c1b720be343bb2c59a73406565f343a74f558 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 24 Jan 2023 11:23:38 +0200 Subject: [PATCH 29/34] fixed zcash_client_backend and simplified cargo.toml --- Cargo.toml | 3 +-- zcash_client_backend/src/proto.rs | 3 ++- zcash_client_backend/src/scan.rs | 20 ++++++++++---------- zcash_primitives/Cargo.toml | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 848619a907..8c805cb4a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,5 +23,4 @@ zcash_encoding = { path = "components/zcash_encoding" } zcash_note_encryption = { path = "components/zcash_note_encryption" } schemer = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } schemer-rusqlite = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } -group = { git = "https://github.com/zkcrypto/group.git", rev = "f61e3e420ed1220c8f1f80988f8c6c5e202d8715" } -orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "5a50fb8d11361d3f7d1f3b2f6c0a468f88c0db49" } +orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "c6e048a4474f0bef5182ed56e5d2ecff6fea0389" } diff --git a/zcash_client_backend/src/proto.rs b/zcash_client_backend/src/proto.rs index a1eb43dbc9..7ba6bf3088 100644 --- a/zcash_client_backend/src/proto.rs +++ b/zcash_client_backend/src/proto.rs @@ -9,7 +9,8 @@ use zcash_primitives::{ transaction::{components::sapling, TxId}, }; -use zcash_note_encryption::{EphemeralKeyBytes, COMPACT_NOTE_SIZE}; +use zcash_note_encryption::{EphemeralKeyBytes}; +use orchard::note_encryption_v3::COMPACT_NOTE_SIZE_V3 as COMPACT_NOTE_SIZE; pub mod compact_formats; diff --git a/zcash_client_backend/src/scan.rs b/zcash_client_backend/src/scan.rs index a568be4f0a..8904757ac3 100644 --- a/zcash_client_backend/src/scan.rs +++ b/zcash_client_backend/src/scan.rs @@ -8,7 +8,7 @@ use std::sync::{ }; use memuse::DynamicUsage; -use zcash_note_encryption::{batch, BatchDomain, Domain, ShieldedOutput, COMPACT_NOTE_SIZE}; +use zcash_note_encryption::{batch, BatchDomain, Domain, ShieldedOutput}; use zcash_primitives::{block::BlockHash, transaction::TxId}; /// A decrypted note. @@ -208,7 +208,7 @@ impl Task for WithUsageTask { } /// A batch of outputs to trial decrypt. -pub(crate) struct Batch> { +pub(crate) struct Batch> { tags: Vec, ivks: Vec, /// We currently store outputs and repliers as parallel vectors, because @@ -227,7 +227,7 @@ where A: DynamicUsage, D: BatchDomain + DynamicUsage, D::IncomingViewingKey: DynamicUsage, - Output: ShieldedOutput + DynamicUsage, + Output: ShieldedOutput + DynamicUsage, { fn dynamic_usage(&self) -> usize { self.tags.dynamic_usage() @@ -257,7 +257,7 @@ impl Batch where A: Clone, D: BatchDomain, - Output: ShieldedOutput, + Output: ShieldedOutput, { /// Constructs a new batch. fn new(tags: Vec, ivks: Vec) -> Self { @@ -284,7 +284,7 @@ where D::Memo: Send, D::Note: Send, D::Recipient: Send, - Output: ShieldedOutput + Send + 'static, + Output: ShieldedOutput + Send + 'static, { /// Runs the batch of trial decryptions, and reports the results. fn run(self) { @@ -323,7 +323,7 @@ where } } -impl + Clone> Batch { +impl + Clone> Batch { /// Adds the given outputs to this batch. /// /// `replier` will be called with the result of every output. @@ -364,7 +364,7 @@ impl DynamicUsage for ResultKey { pub(crate) struct BatchRunner where D: BatchDomain, - Output: ShieldedOutput, + Output: ShieldedOutput, T: Tasks>, { batch_size_threshold: usize, @@ -381,7 +381,7 @@ where A: DynamicUsage, D: BatchDomain + DynamicUsage, D::IncomingViewingKey: DynamicUsage, - Output: ShieldedOutput + DynamicUsage, + Output: ShieldedOutput + DynamicUsage, T: Tasks> + DynamicUsage, { fn dynamic_usage(&self) -> usize { @@ -412,7 +412,7 @@ impl BatchRunner where A: Clone, D: BatchDomain, - Output: ShieldedOutput, + Output: ShieldedOutput, T: Tasks>, { /// Constructs a new batch runner for the given incoming viewing keys. @@ -438,7 +438,7 @@ where D::Memo: Send, D::Note: Send, D::Recipient: Send, - Output: ShieldedOutput + Clone + Send + 'static, + Output: ShieldedOutput + Clone + Send + 'static, T: Tasks>, { /// Batches the given outputs for trial decryption. diff --git a/zcash_primitives/Cargo.toml b/zcash_primitives/Cargo.toml index 5c32326fa2..dc7ec2d867 100644 --- a/zcash_primitives/Cargo.toml +++ b/zcash_primitives/Cargo.toml @@ -38,7 +38,7 @@ jubjub = "0.9" lazy_static = "1" memuse = "0.2.1" nonempty = "0.7" -orchard = { version = "0.3", git = "https://github.com/QED-it/orchard.git", rev = "c6e048a4474f0bef5182ed56e5d2ecff6fea0389" } +orchard = "0.3" proptest = { version = "1.0.0", optional = true } rand = "0.8" rand_core = "0.6" @@ -58,7 +58,7 @@ features = ["pre-zip-212"] criterion = "0.3" proptest = "1.0.0" rand_xorshift = "0.3" -orchard = { version = "0.3", features = ["test-dependencies"], git = "https://github.com/QED-it/orchard.git", rev = "c6e048a4474f0bef5182ed56e5d2ecff6fea0389" } +orchard = { version = "0.3", features = ["test-dependencies"] } [target.'cfg(unix)'.dev-dependencies] pprof = { version = "0.9", features = ["criterion", "flamegraph"] } # MSRV 1.56 From 6183ec47b87654845cf0c679f22b620ab6452164 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 24 Jan 2023 13:14:49 +0200 Subject: [PATCH 30/34] fixed benches/noted_decryption --- zcash_client_backend/src/proto.rs | 2 +- zcash_primitives/benches/note_decryption.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zcash_client_backend/src/proto.rs b/zcash_client_backend/src/proto.rs index 7ba6bf3088..24f27af836 100644 --- a/zcash_client_backend/src/proto.rs +++ b/zcash_client_backend/src/proto.rs @@ -9,8 +9,8 @@ use zcash_primitives::{ transaction::{components::sapling, TxId}, }; -use zcash_note_encryption::{EphemeralKeyBytes}; use orchard::note_encryption_v3::COMPACT_NOTE_SIZE_V3 as COMPACT_NOTE_SIZE; +use zcash_note_encryption::EphemeralKeyBytes; pub mod compact_formats; diff --git a/zcash_primitives/benches/note_decryption.rs b/zcash_primitives/benches/note_decryption.rs index 0e8e5a84be..747cf53f1b 100644 --- a/zcash_primitives/benches/note_decryption.rs +++ b/zcash_primitives/benches/note_decryption.rs @@ -54,7 +54,7 @@ fn bench_note_decryption(c: &mut Criterion) { let ne = sapling_note_encryption::<_, TestNetwork>(None, note, pa, MemoBytes::empty(), &mut rng); let ephemeral_key = ne.epk().to_bytes().into(); - let enc_ciphertext = ne.encrypt_note_plaintext(); + let enc_ciphertext = ne.encrypt_note_plaintext().0; let out_ciphertext = ne.encrypt_outgoing_plaintext(&cv, &cmu, &mut rng); OutputDescription { From ce74cd582420baaff39c51aab4de66216bcd8462 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 31 Jan 2023 14:43:41 +0200 Subject: [PATCH 31/34] updated Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 8c805cb4a2..dc7ee048d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,4 +23,4 @@ zcash_encoding = { path = "components/zcash_encoding" } zcash_note_encryption = { path = "components/zcash_note_encryption" } schemer = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } schemer-rusqlite = { git = "https://github.com/aschampion/schemer.git", rev = "6726b60f43f72c6e24a18d31be0ec7d42829e5e1" } -orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "c6e048a4474f0bef5182ed56e5d2ecff6fea0389" } +orchard = { version = "0.3", git = "https://github.com/QED-it/orchard", rev = "35da288c7867c5b0fb0ae84e444915689e49084c" } From 07c377ddedf71ab7c7a266d284b054a2dafc2ed4 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 31 Jan 2023 15:00:56 +0200 Subject: [PATCH 32/34] removed .as_mut() --- components/zcash_note_encryption/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 758cd85ebf..64ecc16ad0 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -418,7 +418,7 @@ impl NoteEncryption { let output = input.as_mut(); let tag = ChaCha20Poly1305::new(key.as_ref().into()) - .encrypt_in_place_detached([0u8; 12][..].into(), &[], output.as_mut()) + .encrypt_in_place_detached([0u8; 12][..].into(), &[], output) .unwrap(); D::NoteCiphertextBytes::from(&[output, tag.as_ref()].concat()) } From e033ab7f5554a2f6876a7c07631d3aa85b227268 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 8 Feb 2023 16:16:58 +0200 Subject: [PATCH 33/34] fmt --- components/zcash_note_encryption/src/lib.rs | 34 ++------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/components/zcash_note_encryption/src/lib.rs b/components/zcash_note_encryption/src/lib.rs index 64ecc16ad0..a6ec6cbec2 100644 --- a/components/zcash_note_encryption/src/lib.rs +++ b/components/zcash_note_encryption/src/lib.rs @@ -223,8 +223,6 @@ pub trait Domain { /// such as rules like [ZIP 212] that become active at a specific block height. /// /// [ZIP 212]: https://zips.z.cash/zip-0212 - /// - /// This function only takes in plaintext bytes with the memo removed, as in compact notes. fn parse_note_plaintext_without_memo_ivk( &self, ivk: &Self::IncomingViewingKey, @@ -245,8 +243,6 @@ pub trait Domain { /// such as rules like [ZIP 212] that become active at a specific block height. /// /// [ZIP 212]: https://zips.z.cash/zip-0212 - /// - /// This function only takes in plaintext bytes with the memo removed, as in compact notes. fn parse_note_plaintext_without_memo_ovk( &self, pk_d: &Self::DiversifiedTransmissionKey, @@ -333,8 +329,7 @@ pub trait ShieldedOutput { /// Exposes the note ciphertext of the output. Returns `None` if the output is compact. fn enc_ciphertext(&self) -> Option; - /// Exposes the note ciphertext of the output in the compact note context. - /// This always returns a value, since a full note ciphertext can be truncated to a compact ciphertext. + /// Exposes the compact note ciphertext of the output. fn enc_ciphertext_compact(&self) -> D::CompactNoteCiphertextBytes; } @@ -465,11 +460,6 @@ impl NoteEncryption { /// /// Implements section 4.19.2 of the /// [Zcash Protocol Specification](https://zips.z.cash/protocol/nu5.pdf#decryptivk). -/// -/// This function is only meant to be used with full notes, not compact notes. -/// If the note is a compact note, then this function returns `None`. -/// -/// For compact notes, use `try_compact_note_decryption`. pub fn try_note_decryption>( domain: &D, ivk: &D::IncomingViewingKey, @@ -484,10 +474,6 @@ pub fn try_note_decryption>( try_note_decryption_inner(domain, ivk, &ephemeral_key, output, &key) } -/// This function is only meant to be used with full notes, not compact notes. -/// If the note is a compact note, then this function returns `None`. -/// -/// For compact notes, use `try_compact_note_decryption_inner`. fn try_note_decryption_inner>( domain: &D, ivk: &D::IncomingViewingKey, @@ -515,7 +501,6 @@ fn try_note_decryption_inner>( Some((note, to, memo)) } -/// This function only takes in plaintext bytes with the memo removed, as in compact notes. fn parse_note_plaintext_without_memo_ivk( domain: &D, ivk: &D::IncomingViewingKey, @@ -566,11 +551,6 @@ fn check_note_validity( /// Implements the procedure specified in [`ZIP 307`]. /// /// [`ZIP 307`]: https://zips.z.cash/zip-0307 -/// -/// This function is only meant to be used with compact notes, not full notes. -/// If the note is a full note, then this function returns `None`. -/// -/// For full notes, use 'try_note_decryption` and `try_note_decryption_inner`. pub fn try_compact_note_decryption>( domain: &D, ivk: &D::IncomingViewingKey, @@ -585,10 +565,6 @@ pub fn try_compact_note_decryption>( try_compact_note_decryption_inner(domain, ivk, &ephemeral_key, output, &key) } -/// This function is only meant to be used with compact notes, not full notes. -/// If the note is a full note, then this function returns `None`. -/// -/// For full notes, use 'try_note_decryption` and `try_note_decryption_inner`. fn try_compact_note_decryption_inner>( domain: &D, ivk: &D::IncomingViewingKey, @@ -622,9 +598,6 @@ fn try_compact_note_decryption_inner>( /// Implements [Zcash Protocol Specification section 4.19.3][decryptovk]. /// /// [decryptovk]: https://zips.z.cash/protocol/nu5.pdf#decryptovk -/// -/// This function is only meant to be used with full notes, not compact notes. -/// If the note is a compact note, then this function returns `None`. pub fn try_output_recovery_with_ovk>( domain: &D, ovk: &D::OutgoingViewingKey, @@ -645,9 +618,6 @@ pub fn try_output_recovery_with_ovk>( /// Implements part of section 4.19.3 of the /// [Zcash Protocol Specification](https://zips.z.cash/protocol/nu5.pdf#decryptovk). /// For decryption using a Full Viewing Key see [`try_output_recovery_with_ovk`]. -/// -/// This function is only meant to be used with full notes, not compact notes. -/// If the note is a compact note, then this function returns `None`. pub fn try_output_recovery_with_ock>( domain: &D, ock: &OutgoingCipherKey, @@ -706,7 +676,7 @@ pub fn try_output_recovery_with_ock>( } } -// Splits the AEAD tag from the actual ciphertext . +// Splits the AEAD tag from the ciphertext. fn extract_tag(enc_ciphertext: &mut Vec) -> (&mut [u8], [u8; AEAD_TAG_SIZE]) { let tag_loc = enc_ciphertext.len() - AEAD_TAG_SIZE; From 4b1768197c97639c1b29dbcbf0b63b033a8e1568 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 8 Feb 2023 16:20:54 +0200 Subject: [PATCH 34/34] fmt2 --- zcash_primitives/src/transaction/components/sapling.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/zcash_primitives/src/transaction/components/sapling.rs b/zcash_primitives/src/transaction/components/sapling.rs index 95547fe097..676d2f0acf 100644 --- a/zcash_primitives/src/transaction/components/sapling.rs +++ b/zcash_primitives/src/transaction/components/sapling.rs @@ -437,7 +437,6 @@ impl ShieldedOutput> for CompactOutpu } fn enc_ciphertext(&self) -> Option { - //Some(NoteCiphertextBytes(self.enc_ciphertext)) None }