From f2d542dfb6b6585490ff97b74f12c8b6b8e97f73 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Wed, 10 Dec 2025 10:20:14 +0000 Subject: [PATCH 01/19] feat: get previous ciphertext from server --- examples/CRISP/client/libs/crispSDKWorker.js | 1 + .../src/hooks/enclave/useEnclaveServer.ts | 9 ++- .../client/src/hooks/voting/useVoteCasting.ts | 4 +- examples/CRISP/client/src/model/vote.model.ts | 9 +++ examples/CRISP/crates/evm_helpers/src/lib.rs | 75 ++++++++++++++++--- .../contracts/CRISPProgram.sol | 14 ++++ examples/CRISP/server/src/server/models.rs | 11 +++ examples/CRISP/server/src/server/repo.rs | 12 +++ .../CRISP/server/src/server/routes/state.rs | 75 +++++++++++++++++-- 9 files changed, 192 insertions(+), 18 deletions(-) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index a6f75705f5..6387e2c559 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -33,6 +33,7 @@ self.onmessage = async function (event) { balance, previousCiphertext, }) + const encodedProof = encodeSolidityProof(proof) self.postMessage({ diff --git a/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts b/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts index ec6ad335a5..093a375100 100644 --- a/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts +++ b/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts @@ -9,6 +9,8 @@ import { BroadcastVoteRequest, BroadcastVoteResponse, CurrentRound, + GetPreviousCiphertextRequest, + GetPreviousCiphertextResponse, VoteStateLite, VoteStatusRequest, VoteStatusResponse, @@ -27,10 +29,12 @@ const EnclaveEndpoints = { GetWebAllResult: `${ENCLAVE_API}/state/all`, BroadcastVote: `${ENCLAVE_API}/voting/broadcast`, GetVoteStatus: `${ENCLAVE_API}/voting/status`, + GetPreviousCiphertext: `${ENCLAVE_API}/state/previous-ciphertext`, } as const export const useEnclaveServer = () => { - const { GetCurrentRound, GetWebAllResult, BroadcastVote, GetRoundStateLite, GetWebResult, GetVoteStatus } = EnclaveEndpoints + const { GetCurrentRound, GetWebAllResult, BroadcastVote, GetRoundStateLite, GetWebResult, GetVoteStatus, GetPreviousCiphertext } = + EnclaveEndpoints const { fetchData, isLoading } = useApi() const getCurrentRound = () => fetchData(GetCurrentRound) const getRoundStateLite = (round_id: number) => fetchData(GetRoundStateLite, 'post', { round_id }) @@ -38,6 +42,8 @@ export const useEnclaveServer = () => { const getWebResult = () => fetchData(GetWebAllResult, 'get') const getWebResultByRound = (round_id: number) => fetchData(GetWebResult, 'post', { round_id }) const getVoteStatus = (request: VoteStatusRequest) => fetchData(GetVoteStatus, 'post', request) + const getPreviousCiphertext = (request: GetPreviousCiphertextRequest) => + fetchData(GetPreviousCiphertext, 'post', request) return { isLoading, @@ -47,5 +53,6 @@ export const useEnclaveServer = () => { getRoundStateLite, broadcastVote, getVoteStatus, + getPreviousCiphertext, } } diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index c8cb321f44..b5f0aa0aa9 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -55,6 +55,8 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo hasVotedInCurrentRound, } = useVoteManagementContext() + const { getPreviousCiphertext } = useEnclaveServer() + const roundState = customRoundState ?? contextRoundState const votingRound = customVotingRound ?? contextVotingRound @@ -214,7 +216,7 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo signMessageAsync, markVotedInRound, resetVotingState, - votingRound, + getPreviousCiphertext, ], ) diff --git a/examples/CRISP/client/src/model/vote.model.ts b/examples/CRISP/client/src/model/vote.model.ts index 190bf2e106..d13e0840d9 100644 --- a/examples/CRISP/client/src/model/vote.model.ts +++ b/examples/CRISP/client/src/model/vote.model.ts @@ -55,3 +55,12 @@ export interface VoteStateLite { committee_public_key: number[] emojis: [string, string] } + +export interface GetPreviousCiphertextRequest { + round_id: number + address: string +} + +export interface GetPreviousCiphertextResponse { + ciphertext: Uint8Array +} diff --git a/examples/CRISP/crates/evm_helpers/src/lib.rs b/examples/CRISP/crates/evm_helpers/src/lib.rs index 4e53009f8a..13f6e46227 100644 --- a/examples/CRISP/crates/evm_helpers/src/lib.rs +++ b/examples/CRISP/crates/evm_helpers/src/lib.rs @@ -26,6 +26,7 @@ sol! { #[sol(rpc)] contract CRISPProgram { function setMerkleRoot(uint256 e3_id, uint256 _root) external; + function getSlotIndex(uint256 e3_id, address slot_address) external view returns (uint256); } } @@ -33,6 +34,16 @@ sol! { event InputPublished(uint256 indexed e3Id, bytes vote, uint256 index); } +/// Type alias for read-only provider (no wallet) +pub type CRISPReadProvider = FillProvider< + JoinFill< + Identity, + JoinFill>>, + >, + RootProvider, + Ethereum, +>; + /// Type alias for write provider (same as EnclaveWriteProvider) pub type CRISPWriteProvider = FillProvider< JoinFill< @@ -48,23 +59,18 @@ pub type CRISPWriteProvider = FillProvider< /// CRISP contract instance for interacting with CRISPProgram #[derive(Clone)] -pub struct CRISPContract { - provider: Arc, +pub struct CRISPContract

{ + provider: Arc

, contract_address: Address, } -impl CRISPContract { - /// Get the contract address - pub fn address(&self) -> &Address { - &self.contract_address - } - - /// Create a new CRISP contract instance +impl CRISPContract { + /// Create a new CRISP contract instance with write capabilities pub async fn new( http_rpc_url: &str, private_key: &str, contract_address: &str, - ) -> Result { + ) -> Result { let contract_address = contract_address.parse()?; let signer: PrivateKeySigner = private_key.parse()?; let wallet = EthereumWallet::from(signer); @@ -97,6 +103,46 @@ impl CRISPContract { } } +impl CRISPContract { + /// Create a read-only CRISP contract instance (no private key required) + pub async fn new_read_only(http_rpc_url: &str, contract_address: &str) -> Result { + let contract_address = contract_address.parse()?; + let provider = ProviderBuilder::new().connect(http_rpc_url).await?; + + Ok(CRISPContract { + provider: Arc::new(provider), + contract_address, + }) + } + + /// Get the slot index from a given slot address + pub async fn get_slot_index_from_address( + &self, + e3_id: U256, + slot_address: Address, + ) -> Result { + let contract = CRISPProgram::new(self.contract_address, self.provider.as_ref()); + + if let Some(slot_index) = contract + .getSlotIndex(e3_id, slot_address) + .call() + .await + .ok() + { + return Ok(slot_index); + } + + Err(eyre::eyre!("Slot address not found for given e3_id")) + } +} + +impl

CRISPContract

{ + /// Get the contract address + pub fn address(&self) -> &Address { + &self.contract_address + } +} + /// Factory for creating CRISP contract instances pub struct CRISPContractFactory; @@ -106,7 +152,14 @@ impl CRISPContractFactory { http_rpc_url: &str, contract_address: &str, private_key: &str, - ) -> Result { + ) -> Result> { CRISPContract::new(http_rpc_url, private_key, contract_address).await } + + pub async fn create_read( + http_rpc_url: &str, + contract_address: &str, + ) -> Result> { + CRISPContract::new_read_only(http_rpc_url, contract_address).await + } } diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol index 3c2a65f78f..1b92672a2b 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol @@ -52,6 +52,8 @@ contract CRISPProgram is IE3Program, Ownable { error InvalidMerkleRoot(); error MerkleRootAlreadySet(); error InvalidTallyLength(); + error SlotIsEmpty(); + // Events event InputPublished(uint256 indexed e3Id, bytes vote, uint256 index); @@ -250,4 +252,16 @@ contract CRISPProgram is IE3Program, Ownable { return result; } + + /// @notice Get the slot index for a given E3 ID and slot address + /// @param e3Id The E3 program ID + /// @param slotAddress The slot address + /// @return The slot index + function getSlotIndex(uint256 e3Id, address slotAddress) external view returns (uint40) { + uint40 storedIndexPlusOne = e3Data[e3Id].voteSlots[slotAddress]; + if (storedIndexPlusOne == 0) { + revert SlotIsEmpty(); + } + return storedIndexPlusOne - 1; + } } diff --git a/examples/CRISP/server/src/server/models.rs b/examples/CRISP/server/src/server/models.rs index 66cc8266d2..7179d4a388 100644 --- a/examples/CRISP/server/src/server/models.rs +++ b/examples/CRISP/server/src/server/models.rs @@ -105,6 +105,17 @@ pub struct GetRoundRequest { pub round_id: u64, } +#[derive(Debug, Deserialize, Serialize)] +pub struct PreviousCiphertextRequest { + pub round_id: u64, + pub address: String, +} + +#[derive(Serialize)] +pub struct PreviousCiphertextResponse { + pub ciphertext: Vec, +} + #[derive(Debug, Deserialize, Serialize)] pub struct ComputeProviderParams { pub name: String, diff --git a/examples/CRISP/server/src/server/repo.rs b/examples/CRISP/server/src/server/repo.rs index 944326979a..d6eae9e2ff 100644 --- a/examples/CRISP/server/src/server/repo.rs +++ b/examples/CRISP/server/src/server/repo.rs @@ -117,6 +117,18 @@ impl CrispE3Repository { Ok(()) } + pub async fn get_ciphertext_input(&mut self, index: u64) -> Result>> { + let e3_crisp = self.get_crisp().await?; + for (vote, i) in e3_crisp.ciphertext_inputs { + if i == index { + return Ok(Some(vote)); + } + } + Err(eyre::eyre!( + "Could not find ciphertext_input for index '{index}'" + )) + } + pub async fn initialize_round( &mut self, token_address: String, diff --git a/examples/CRISP/server/src/server/routes/state.rs b/examples/CRISP/server/src/server/routes/state.rs index 7ae055fc12..f2f0a51f3b 100644 --- a/examples/CRISP/server/src/server/routes/state.rs +++ b/examples/CRISP/server/src/server/routes/state.rs @@ -4,16 +4,17 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. +use std::str::FromStr; + use crate::server::{ - app_data::AppData, - models::{GetRoundRequest, WebhookPayload}, - CONFIG, + CONFIG, app_data::AppData, models::{GetRoundRequest, PreviousCiphertextRequest, PreviousCiphertextResponse, WebhookPayload} }; use actix_web::{web, HttpResponse, Responder}; -use alloy::primitives::{Bytes, U256}; +use alloy::primitives::{Address, Bytes, U256}; use e3_sdk::evm_helpers::contracts::{ EnclaveContract, EnclaveContractFactory, EnclaveWrite, ReadWrite, }; +use evm_helpers::CRISPContractFactory; use log::{error, info}; pub fn setup_routes(config: &mut web::ServiceConfig) { @@ -26,10 +27,74 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { // be included on chain .route("/add-result", web::post().to(handle_program_server_result)) // Get the token holders hashes for a given round - .route("/token-holders", web::post().to(get_token_holders_hashes)), + .route("/token-holders", web::post().to(get_token_holders_hashes)) + .route( + "/previous-ciphertext", + web::post().to(handle_get_previous_ciphertext), + ), ); } +/// Endpoint to get the ciphertext input at a certain slot. Used for masking operations +/// +/// # Arguments +/// * `data` - The round id and the slot index +/// +/// # Returns +/// * A JSON response with the result of the operation. If sucessful it includes the ciphertext input at the given slot +async fn handle_get_previous_ciphertext( + data: web::Json, + store: web::Data, +) -> impl Responder { + let incoming = data.into_inner(); + + let contract = + match CRISPContractFactory::create_read(&CONFIG.http_rpc_url, &CONFIG.e3_program_address) + .await + { + Ok(contract) => contract, + Err(e) => { + error!("Failed to create CRISP contract: {:?}", e); + return HttpResponse::InternalServerError().body("Failed to create CRISP contract"); + } + }; + + let address = match Address::from_str(incoming.address.as_str()) { + Ok(addr) => addr, + Err(e) => { + error!("Invalid address format: {:?}", e); + return HttpResponse::BadRequest().body("Invalid address format"); + } + }; + + let slot_index = match contract + .get_slot_index_from_address(U256::from(incoming.round_id), address) + .await + { + Ok(index) => index.to::(), + Err(e) => { + error!("Error getting slot index from address: {:?}", e); + return HttpResponse::InternalServerError() + .body("Failed to get slot index from address"); + } + }; + + match store + .e3(incoming.round_id) + .get_ciphertext_input(slot_index) + .await + { + Ok(Some(ciphertext)) => HttpResponse::Ok().json(PreviousCiphertextResponse { + ciphertext + }), + Ok(None) => HttpResponse::NotFound().body("Ciphertext not found"), + Err(e) => { + error!("Error getting previous ciphertext: {:?}", e); + HttpResponse::InternalServerError().body("Failed to get previous ciphertext") + } + } +} + /// Webhook callback from program server /// /// # Arguments From 2ca4a8cb2a1de3af05c39e79c8db67a882862938 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:12:11 +0000 Subject: [PATCH 02/19] chore: add masking specific function --- examples/CRISP/client/libs/crispSDKWorker.js | 36 ++++++--- .../voteManagement/VoteManagement.types.ts | 3 + .../client/src/hooks/voting/useSDKWorker.tsx | 6 +- .../client/src/hooks/voting/useVoteCasting.ts | 46 +++++++++-- examples/CRISP/crates/evm_helpers/src/lib.rs | 7 +- .../CRISP/crates/zk-inputs-wasm/src/lib.rs | 27 ++++++- examples/CRISP/crates/zk-inputs/src/lib.rs | 79 ++++++++++++++++++- .../CRISP/packages/crisp-sdk/src/constants.ts | 2 + .../CRISP/packages/crisp-sdk/src/types.ts | 5 +- examples/CRISP/packages/crisp-sdk/src/vote.ts | 47 ++++++++--- .../CRISP/server/src/server/routes/state.rs | 10 ++- 11 files changed, 223 insertions(+), 45 deletions(-) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index 6387e2c559..4d54ebeb4f 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -4,14 +4,14 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { hashLeaf, generateVoteProof, encodeSolidityProof } from '@crisp-e3/sdk' +import { hashLeaf, generateVoteProof, encodeSolidityProof, generateMaskVoteProof } from '@crisp-e3/sdk' self.onmessage = async function (event) { const { type, data } = event.data switch (type) { case 'generate_proof': try { - const { voteId, publicKey, address, signature, previousCiphertext } = data + const { voteId, publicKey, address: slotAddress, signature, previousCiphertext, messageHash, isFirstVote, isMasking } = data // voteId is either 0 or 1, so we need to encode the vote accordingly. // We are adapting to the current CRISP application. @@ -20,19 +20,33 @@ self.onmessage = async function (event) { // todo: get the leaves from the server (pass them from the client). const merkleLeaves = [ - hashLeaf(address, balance), + hashLeaf(slotAddress, balance), 4720511075913887710172192848636076523165432993226978491435561065722130431597n, 14131255645332550266535358189863475289290770471998199141522479556687499890181n, ] - const proof = await generateVoteProof({ - vote, - publicKey, - signature, - merkleLeaves, - balance, - previousCiphertext, - }) + let proof + + if (isMasking) { + proof = await generateMaskVoteProof({ + vote, + publicKey, + balance, + previousCiphertext, + isFirstVote, + slotAddress, + }) + } else { + proof = await generateVoteProof({ + vote, + publicKey, + signature, + merkleLeaves, + balance, + messageHash, + isFirstVote, + }) + } const encodedProof = encodeSolidityProof(proof) diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index 4dd7cfac3d..62b3d5dabb 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -42,6 +42,9 @@ export type VoteManagementContextType = { publicKey: Uint8Array, address: string, signature: string, + messageHash: `0x${string}`, + isFirstVote: boolean, + isMasking: boolean, previousCiphertext?: Uint8Array, ) => Promise broadcastVote: (vote: BroadcastVoteRequest) => Promise diff --git a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx index 703b204a33..ae9e0e9055 100644 --- a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx +++ b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx @@ -30,6 +30,9 @@ export const useSDKWorkerHook = () => { publicKey: Uint8Array, address: string, signature: string, + messageHash: `0x${string}`, + isFirstVote: boolean, + isMasking: boolean, previousCiphertext?: Uint8Array, ): Promise => { if (!workerRef.current) { @@ -42,9 +45,8 @@ export const useSDKWorkerHook = () => { workerRef.current!.postMessage({ type: 'generate_proof', - data: { voteId, publicKey, address, signature, previousCiphertext }, + data: { voteId, publicKey, address, signature, messageHash, previousCiphertext, isFirstVote, isMasking }, }) - workerRef.current!.onmessage = async (event) => { const { type, success, encodedProof, error } = event.data diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index b5f0aa0aa9..a2bda14211 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -69,9 +69,26 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo const [stepMessage, setStepMessage] = useState('') const handleProofGeneration = useCallback( - async (vote: Poll, address: string, signature: string, previousCiphertext?: Uint8Array) => { + async ( + vote: Poll, + address: string, + signature: string, + messageHash: `0x${string}`, + isFirstVote: boolean, + isMasking: boolean, + previousCiphertext?: Uint8Array, + ) => { if (!votingRound) throw new Error('No voting round available for proof generation') - return generateProof(BigInt(vote.value), new Uint8Array(votingRound.pk_bytes), address, signature, previousCiphertext) + return generateProof( + BigInt(vote.value), + new Uint8Array(votingRound.pk_bytes), + address, + signature, + messageHash, + isFirstVote, + isMasking, + previousCiphertext, + ) }, [generateProof, votingRound], ) @@ -84,7 +101,7 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo }, []) const castVoteWithProof = useCallback( - async (pollSelected: Poll | null, isVoteUpdate: boolean = false) => { + async (pollSelected: Poll | null, isVoteUpdate: boolean = false, isMasking: boolean = false) => { if (!pollSelected) { console.log('Cannot cast vote: Poll option not selected.') showToast({ type: 'danger', message: 'Please select a poll option first.' }) @@ -126,10 +143,25 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setLastActiveStep('encrypting') setStepMessage('') - // @todo get this from the contract or server - const newEncryptionTemp = encryptVote({ yes: 0n, no: 0n }, new Uint8Array(votingRound!.pk_bytes)) - const previousCiphertext = isVoteUpdate ? newEncryptionTemp : undefined - const encodedProof = await handleProofGeneration(pollSelected, user.address, signature, previousCiphertext) + const previousCiphertextFromServer = isVoteUpdate + ? await getPreviousCiphertext({ + round_id: roundState.id, + address: user.address, + }) + : undefined + + const previousCiphertext = previousCiphertextFromServer && previousCiphertextFromServer?.ciphertext + + const encodedProof = await handleProofGeneration( + pollSelected, + user.address, + signature, + messageHash, + !isVoteUpdate, + isMasking, + previousCiphertext, + ) + if (!encodedProof) { throw new Error('Failed to encrypt vote.') } diff --git a/examples/CRISP/crates/evm_helpers/src/lib.rs b/examples/CRISP/crates/evm_helpers/src/lib.rs index 13f6e46227..67a8a296e6 100644 --- a/examples/CRISP/crates/evm_helpers/src/lib.rs +++ b/examples/CRISP/crates/evm_helpers/src/lib.rs @@ -123,12 +123,7 @@ impl CRISPContract { ) -> Result { let contract = CRISPProgram::new(self.contract_address, self.provider.as_ref()); - if let Some(slot_index) = contract - .getSlotIndex(e3_id, slot_address) - .call() - .await - .ok() - { + if let Some(slot_index) = contract.getSlotIndex(e3_id, slot_address).call().await.ok() { return Ok(slot_index); } diff --git a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs index cdfff8be8b..e811c737dc 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs @@ -47,7 +47,7 @@ impl ZKInputsGenerator { Ok(ZKInputsGenerator { generator }) } - /// Generate a CRISP ZK inputs from JavaScript. + /// Generate CRISP ZK inputs from JavaScript. #[wasm_bindgen(js_name = "generateInputs")] pub fn generate_inputs( &self, @@ -72,6 +72,31 @@ impl ZKInputsGenerator { } } + /// Generate CRISP ZK inputs for a Masking vote from JavaScript. + #[wasm_bindgen(js_name = "generateInputsForMasking")] + pub fn generate_inputs_for_masking( + &self, + prev_ciphertext: &[u8], + public_key: &[u8], + vote: Vec, + ) -> Result { + let vote_vec: Vec = vote.into_iter().map(|v| v as u64).collect(); + + match self + .generator + .generate_inputs_for_masking(prev_ciphertext, public_key, vote_vec) + { + Ok(inputs_json) => { + // Parse the JSON string and return as JsValue. + match js_sys::JSON::parse(&inputs_json) { + Ok(js_value) => Ok(js_value), + Err(_) => Err(JsValue::from_str("Failed to parse inputs JSON")), + } + } + Err(e) => Err(JsValue::from_str(&e.to_string())), + } + } + /// Generate a public key from JavaScript. #[wasm_bindgen(js_name = "generatePublicKey")] pub fn generate_public_key(&self) -> Result, JsValue> { diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 0b72c0dc1d..19ff933143 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -9,9 +9,11 @@ //! This crate contains the main logic for generating CRISP inputs for zero-knowledge proofs. use crisp_constants::get_default_paramset; -use e3_sdk::bfv_helpers::build_bfv_params_arc; +use e3_sdk::bfv_helpers::{ + build_bfv_params_arc, + utils::greco::{abi_decode_greco_ciphertext, greco_to_bfv_ciphertext} +}; use e3_sdk::bfv_helpers::BfvParamSet; -use e3_sdk::bfv_helpers::BfvParamSets; use eyre::{Context, Result}; use fhe::bfv::BfvParameters; use fhe::bfv::Ciphertext; @@ -63,6 +65,79 @@ impl ZKInputsGenerator { Self::from_set(get_default_paramset()) } + /// Generates CRISP ZK inputs for a vote encryption and addition operation. + /// Note that this accepts the previous ciphertext in GRECO ABI encoded format. + /// + /// # Arguments + /// * `prev_ciphertext` - Previous ciphertext bytes to add to (in GRECO ABI Encoded format) + /// * `public_key` - Public key bytes for encryption + /// * `vote` - Vote value as a vector of coefficients + /// + /// # Returns + /// JSON string containing the CRISP ZK inputs + pub fn generate_inputs_for_masking( + &self, + prev_ciphertext: &[u8], + public_key: &[u8], + vote: Vec, + ) -> Result { + // Deserialize the provided public key. + let pk = PublicKey::from_bytes(public_key, &self.bfv_params) + .with_context(|| "Failed to deserialize public key")?; + + // Encode the plaintext into a polynomial. + let pt = Plaintext::try_encode(&vote, Encoding::poly(), &self.bfv_params) + .with_context(|| "Failed to encode plaintext")?; + + // Encrypt using the provided public key to ensure ciphertext matches the key. + let (ct, u_rns, e0_rns, e1_rns) = pk + .try_encrypt_extended(&pt, &mut thread_rng()) + .with_context(|| "Failed to encrypt plaintext")?; + + let (_, bounds) = GrecoBounds::compute(&self.bfv_params, 0)?; + + let bit_pk = shared::template::calculate_bit_width(&bounds.pk_bounds[0].to_string())?; + + // Compute the vectors of the GRECO inputs. + let greco_vectors = GrecoVectors::compute( + &pt, + &u_rns, + &e0_rns, + &e1_rns, + &ct, + &pk, + &self.bfv_params, + bit_pk, + ) + .with_context(|| "Failed to compute vectors")?; + + let (crypto_params, bounds) = GrecoBounds::compute(&self.bfv_params, 0) + .with_context(|| "Failed to compute bounds")?; + + // Ciphertext Addition Section. + // Deserialize the previous ciphertext. + let (ct0is, ct1is) = abi_decode_greco_ciphertext(prev_ciphertext, &self.bfv_params); + let prev_ct = greco_to_bfv_ciphertext(&ct0is, &ct1is, &self.bfv_params); + + // Compute the ciphertext addition. + let sum_ct = &ct + &prev_ct; + + // Compute the inputs of the ciphertext addition. + let ciphertext_addition_inputs = + CiphertextAdditionInputs::compute(&pt, &prev_ct, &ct, &sum_ct, &self.bfv_params) + .with_context(|| "Failed to compute ciphertext addition inputs")?; + + // Construct Inputs Section. + let inputs = construct_inputs( + &crypto_params, + &bounds, + &greco_vectors.standard_form(), + &ciphertext_addition_inputs.standard_form(), + ); + + Ok(serialize_inputs_to_json(&inputs)?) + } + /// Generates CRISP ZK inputs for a vote encryption and addition operation. /// /// # Arguments diff --git a/examples/CRISP/packages/crisp-sdk/src/constants.ts b/examples/CRISP/packages/crisp-sdk/src/constants.ts index 6ae052f1f5..62c84d13e1 100644 --- a/examples/CRISP/packages/crisp-sdk/src/constants.ts +++ b/examples/CRISP/packages/crisp-sdk/src/constants.ts @@ -34,3 +34,5 @@ export const SIGNATURE_MESSAGE_HASH = hashMessage(SIGNATURE_MESSAGE) // Placeholder signature for masking votes. export const MASK_SIGNATURE = '0x8e7d77112641d59e9409ec3052041703bb9d9e6ed39bfcf75aefbcafe829ac6b21dd7648116ad5db0466fcb4bd468dcb28f6c069def8bc47cd9d859c85a016e31b' + +export const zeroVote = { yes: 0n, no: 0n } diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index cdbe96b54d..b564519a6e 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -175,17 +175,18 @@ export type ProofInputs = { signature: `0x${string}` balance: bigint slotAddress: string - previousCiphertext?: Uint8Array merkleProof: MerkleProof messageHash?: `0x${string}` + isFirstVote: boolean } export type MaskVoteProofInputs = { previousCiphertext?: Uint8Array - merkleLeaves: string[] | bigint[] publicKey: Uint8Array balance: bigint slotAddress: string + isFirstVote: boolean + merkleRoot: bigint } export type VoteProofInputs = { diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index dd0a474eb8..a09bbe241a 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -7,7 +7,13 @@ import { ZKInputsGenerator } from '@crisp-e3/zk-inputs' import { type CircuitInputs, type Vote, ExecuteCircuitResult, MaskVoteProofInputs, ProofInputs, VoteProofInputs } from './types' import { generateMerkleProof, toBinary, extractSignatureComponents, getAddressFromSignature, getOptimalThreadCount } from './utils' -import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE } from './constants' +import { + MAXIMUM_VOTE_VALUE, + MASK_SIGNATURE, + zeroVote, + SIGNATURE_MESSAGE_HASH, + MERKLE_TREE_MAX_DEPTH, +} from './constants' import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' import circuit from '../../../circuits/target/crisp_circuit.json' @@ -130,10 +136,10 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise b.toString()) crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() crispInputs.balance = proofInputs.balance.toString() - crispInputs.is_first_vote = !proofInputs.previousCiphertext + crispInputs.is_first_vote = proofInputs.isFirstVote crispInputs.merkle_root = proofInputs.merkleProof.proof.root.toString() crispInputs.merkle_proof_length = proofInputs.merkleProof.length.toString() crispInputs.merkle_proof_indices = proofInputs.merkleProof.indices.map((i) => i.toString()) @@ -158,6 +164,32 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise => { + const encodedVote = encodeVote(zeroVote) + + let crispInputs = await zkInputsGenerator.generateInputsForMasking( + proofInputs.previousCiphertext || encryptVote(zeroVote, proofInputs.publicKey), + proofInputs.publicKey, + encodedVote, + ) + + const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents(MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH) + + crispInputs.hashed_message = Array.from(messageHash).map((b) => b.toString()) + crispInputs.public_key_x = Array.from(publicKeyX).map((b) => b.toString()) + crispInputs.public_key_y = Array.from(publicKeyY).map((b) => b.toString()) + crispInputs.signature = Array.from(signature).map((b) => b.toString()) + crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() + crispInputs.balance = proofInputs.balance.toString() + crispInputs.is_first_vote = proofInputs.isFirstVote + crispInputs.merkle_root = proofInputs.merkleRoot.toString() + crispInputs.merkle_proof_length = '0' + crispInputs.merkle_proof_indices = Array.from({ length: MERKLE_TREE_MAX_DEPTH }, () => '0') + crispInputs.merkle_proof_siblings = Array.from({ length: MERKLE_TREE_MAX_DEPTH }, () => '0') + + return crispInputs +} + export const executeCircuit = async (crispInputs: CircuitInputs): Promise => { const noir = new Noir(circuit as CompiledCircuit) @@ -204,13 +236,8 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { } export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofInputs) => { - const merkleProof = generateMerkleProof(maskVoteProofInputs.balance, maskVoteProofInputs.slotAddress, maskVoteProofInputs.merkleLeaves) - - const crispInputs = await generateCircuitInputs({ + const crispInputs = await generateCircuitInputsForMasking({ ...maskVoteProofInputs, - signature: MASK_SIGNATURE, - vote: { yes: 0n, no: 0n }, - merkleProof, }) return generateProof(crispInputs) diff --git a/examples/CRISP/server/src/server/routes/state.rs b/examples/CRISP/server/src/server/routes/state.rs index f2f0a51f3b..1e7b6459a7 100644 --- a/examples/CRISP/server/src/server/routes/state.rs +++ b/examples/CRISP/server/src/server/routes/state.rs @@ -7,7 +7,11 @@ use std::str::FromStr; use crate::server::{ - CONFIG, app_data::AppData, models::{GetRoundRequest, PreviousCiphertextRequest, PreviousCiphertextResponse, WebhookPayload} + app_data::AppData, + models::{ + GetRoundRequest, PreviousCiphertextRequest, PreviousCiphertextResponse, WebhookPayload, + }, + CONFIG, }; use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; @@ -84,9 +88,7 @@ async fn handle_get_previous_ciphertext( .get_ciphertext_input(slot_index) .await { - Ok(Some(ciphertext)) => HttpResponse::Ok().json(PreviousCiphertextResponse { - ciphertext - }), + Ok(Some(ciphertext)) => HttpResponse::Ok().json(PreviousCiphertextResponse { ciphertext }), Ok(None) => HttpResponse::NotFound().body("Ciphertext not found"), Err(e) => { error!("Error getting previous ciphertext: {:?}", e); From d6d9dfb708d8dd53dd885cfd945b35a398709280 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:35:02 +0000 Subject: [PATCH 03/19] chore: pr comments --- .../client/src/hooks/voting/useVoteCasting.ts | 4 ++++ examples/CRISP/crates/evm_helpers/src/lib.rs | 7 +++---- examples/CRISP/packages/crisp-sdk/src/vote.ts | 2 +- .../packages/crisp-sdk/tests/vote.test.ts | 21 +++++++++++-------- examples/CRISP/server/src/server/repo.rs | 7 +++---- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index a2bda14211..b52487505a 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -152,6 +152,10 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo const previousCiphertext = previousCiphertextFromServer && previousCiphertextFromServer?.ciphertext + if (isMasking && isVoteUpdate && !previousCiphertext) { + throw new Error('Previous ciphertext required for masking vote update.') + } + const encodedProof = await handleProofGeneration( pollSelected, user.address, diff --git a/examples/CRISP/crates/evm_helpers/src/lib.rs b/examples/CRISP/crates/evm_helpers/src/lib.rs index 67a8a296e6..594e8112c8 100644 --- a/examples/CRISP/crates/evm_helpers/src/lib.rs +++ b/examples/CRISP/crates/evm_helpers/src/lib.rs @@ -123,11 +123,10 @@ impl CRISPContract { ) -> Result { let contract = CRISPProgram::new(self.contract_address, self.provider.as_ref()); - if let Some(slot_index) = contract.getSlotIndex(e3_id, slot_address).call().await.ok() { - return Ok(slot_index); + match contract.getSlotIndex(e3_id, slot_address).call().await { + Ok(slot_index) => Ok(slot_index), + Err(e) => Err(eyre::eyre!("Failed to get slot index: {}", e)), } - - Err(eyre::eyre!("Slot address not found for given e3_id")) } } diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index a09bbe241a..ac1e9f367e 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -167,7 +167,7 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise => { const encodedVote = encodeVote(zeroVote) - let crispInputs = await zkInputsGenerator.generateInputsForMasking( + let crispInputs = await zkInputsGenerator.generateInputsForUpdate( proofInputs.previousCiphertext || encryptVote(zeroVote, proofInputs.publicKey), proofInputs.publicKey, encodedVote, diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 846f81ef0e..59b76c94fe 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -6,7 +6,7 @@ import { describe, it, expect, beforeAll } from 'vitest' import { Vote } from '../src/types' -import { MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE } from '../src/constants' +import { MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, zeroVote } from '../src/constants' import { generateMerkleProof } from '../src/utils' import { decodeTally, @@ -18,6 +18,7 @@ import { encodeVote, generateCircuitInputs, executeCircuit, + generateCircuitInputsForMasking, } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' @@ -98,6 +99,7 @@ describe('Vote', () => { balance, slotAddress: address, merkleProof, + isFirstVote: true, }) const { returnValue } = await executeCircuit(crispInputs) @@ -121,14 +123,12 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, slotAddress, LEAVES) - const crispInputs = await generateCircuitInputs({ - vote: { yes: 0n, no: 0n }, + const crispInputs = await generateCircuitInputsForMasking({ publicKey, - previousCiphertext, - signature: MASK_SIGNATURE, - merkleProof, balance, slotAddress, + isFirstVote: true, + merkleRoot: merkleProof.proof.root, }) const { returnValue } = await executeCircuit(crispInputs) @@ -153,12 +153,13 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, slotAddress, LEAVES) const crispInputs = await generateCircuitInputs({ - vote: { yes: 0n, no: 0n }, + vote: zeroVote, publicKey, signature: MASK_SIGNATURE, merkleProof, balance, slotAddress, + isFirstVote: true, }) const { returnValue } = await executeCircuit(crispInputs) @@ -205,7 +206,8 @@ describe('Vote', () => { slotAddress, publicKey, previousCiphertext, - merkleLeaves: LEAVES, + isFirstVote: false, + merkleRoot: generateMerkleProof(balance, slotAddress, LEAVES).proof.root, }) expect(proof).toBeDefined() @@ -222,7 +224,8 @@ describe('Vote', () => { balance, slotAddress, publicKey, - merkleLeaves: LEAVES, + isFirstVote: true, + merkleRoot: generateMerkleProof(balance, slotAddress, LEAVES).proof.root, }) expect(proof).toBeDefined() diff --git a/examples/CRISP/server/src/server/repo.rs b/examples/CRISP/server/src/server/repo.rs index d6eae9e2ff..d2a44a0125 100644 --- a/examples/CRISP/server/src/server/repo.rs +++ b/examples/CRISP/server/src/server/repo.rs @@ -117,16 +117,15 @@ impl CrispE3Repository { Ok(()) } - pub async fn get_ciphertext_input(&mut self, index: u64) -> Result>> { + pub async fn get_ciphertext_input(&self, index: u64) -> Result>> { let e3_crisp = self.get_crisp().await?; for (vote, i) in e3_crisp.ciphertext_inputs { if i == index { return Ok(Some(vote)); } } - Err(eyre::eyre!( - "Could not find ciphertext_input for index '{index}'" - )) + + Ok(None) } pub async fn initialize_round( From edcb2591ba0dcf861a5f31f422571c5b204594d3 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:26:52 +0000 Subject: [PATCH 04/19] chore: add function to check if a slot is empty --- .../contracts/CRISPProgram.sol | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol index 1b92672a2b..1fd3d25485 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/CRISPProgram.sol @@ -179,6 +179,26 @@ contract CRISPProgram is IE3Program, Ownable { return (yes, no); } + /// @notice Get the slot index for a given E3 ID and slot address + /// @param e3Id The E3 program ID + /// @param slotAddress The slot address + /// @return The slot index + function getSlotIndex(uint256 e3Id, address slotAddress) external view returns (uint40) { + uint40 storedIndexPlusOne = e3Data[e3Id].voteSlots[slotAddress]; + if (storedIndexPlusOne == 0) { + revert SlotIsEmpty(); + } + return storedIndexPlusOne - 1; + } + + /// @notice Check if a slot is empty for a given E3 ID and slot address + /// @param e3Id The E3 program ID + /// @param slotAddress The slot address + /// @return Whether the slot is empty or not + function isSlotEmptyByAddress(uint256 e3Id, address slotAddress) external view returns (bool) { + return e3Data[e3Id].voteSlots[slotAddress] == 0; + } + /// @inheritdoc IE3Program function verify(uint256 e3Id, bytes32 ciphertextOutputHash, bytes memory proof) external view override returns (bool) { if (e3Data[e3Id].paramsHash == bytes32(0)) revert E3DoesNotExist(); @@ -252,16 +272,4 @@ contract CRISPProgram is IE3Program, Ownable { return result; } - - /// @notice Get the slot index for a given E3 ID and slot address - /// @param e3Id The E3 program ID - /// @param slotAddress The slot address - /// @return The slot index - function getSlotIndex(uint256 e3Id, address slotAddress) external view returns (uint40) { - uint40 storedIndexPlusOne = e3Data[e3Id].voteSlots[slotAddress]; - if (storedIndexPlusOne == 0) { - revert SlotIsEmpty(); - } - return storedIndexPlusOne - 1; - } } From 35ebe74b9edfa1df0f80e5f87f0acfb3570a803c Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Thu, 18 Dec 2025 08:51:07 +0000 Subject: [PATCH 05/19] chore: add get slot is empty --- examples/CRISP/crates/evm_helpers/src/lib.rs | 15 +++++++++ .../CRISP/packages/crisp-sdk/src/constants.ts | 1 + .../CRISP/packages/crisp-sdk/src/state.ts | 31 ++++++++++++++++++- .../CRISP/server/src/server/routes/state.rs | 31 ++++++++++++++++++- 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/examples/CRISP/crates/evm_helpers/src/lib.rs b/examples/CRISP/crates/evm_helpers/src/lib.rs index 594e8112c8..d9e4025ee0 100644 --- a/examples/CRISP/crates/evm_helpers/src/lib.rs +++ b/examples/CRISP/crates/evm_helpers/src/lib.rs @@ -27,6 +27,7 @@ sol! { contract CRISPProgram { function setMerkleRoot(uint256 e3_id, uint256 _root) external; function getSlotIndex(uint256 e3_id, address slot_address) external view returns (uint256); + function isSlotEmptyByAddress(uint256 e3_id, address slot_address) external view returns (bool); } } @@ -128,6 +129,20 @@ impl CRISPContract { Err(e) => Err(eyre::eyre!("Failed to get slot index: {}", e)), } } + + /// Check if a slot is empty by its address + pub async fn get_is_slot_empty_by_address( + &self, + e3_id: U256, + slot_address: Address, + ) -> Result { + let contract = CRISPProgram::new(self.contract_address, self.provider.as_ref()); + + match contract.isSlotEmptyByAddress(e3_id, slot_address).call().await { + Ok(is_empty) => Ok(is_empty), + Err(e) => Err(eyre::eyre!("Failed to check if slot is empty: {}", e)), + } + } } impl

CRISPContract

{ diff --git a/examples/CRISP/packages/crisp-sdk/src/constants.ts b/examples/CRISP/packages/crisp-sdk/src/constants.ts index 62c84d13e1..d4e3a98023 100644 --- a/examples/CRISP/packages/crisp-sdk/src/constants.ts +++ b/examples/CRISP/packages/crisp-sdk/src/constants.ts @@ -8,6 +8,7 @@ import { hashMessage } from 'viem' export const CRISP_SERVER_TOKEN_TREE_ENDPOINT = 'state/token-holders' export const CRISP_SERVER_STATE_LITE_ENDPOINT = 'state/lite' +export const CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT = 'state/previous-ciphertext' export const MERKLE_TREE_MAX_DEPTH = 20 // static, hardcoded in the circuit. diff --git a/examples/CRISP/packages/crisp-sdk/src/state.ts b/examples/CRISP/packages/crisp-sdk/src/state.ts index c9d4581605..9c2f73d279 100644 --- a/examples/CRISP/packages/crisp-sdk/src/state.ts +++ b/examples/CRISP/packages/crisp-sdk/src/state.ts @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { CRISP_SERVER_STATE_LITE_ENDPOINT } from './constants' +import { CRISP_SERVER_STATE_LITE_ENDPOINT, CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT } from './constants' import type { RoundDetailsResponse, RoundDetails, TokenDetails } from './types' @@ -53,3 +53,32 @@ export const getRoundTokenDetails = async (serverUrl: string, e3Id: number): Pro snapshotBlock: roundDetails.startBlock, } } + +/** + * Get the previous ciphertext for a slot from the CRISP server + * @param serverUrl + * @param e3Id + * @param address + * @returns + */ +export const getPreviousCiphertext = async (serverUrl: string, e3Id: number, address: string): Promise => { + const response = await fetch(`${serverUrl}/${CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ round_id: e3Id, address }), + }) + + if (!response.ok) { + throw new Error(`Failed to fetch previous ciphertext: ${response.statusText}`) + } + + const data = await response.json() + + return data.previous_ciphertext as Uint8Array; +} + +export const getIsSlotEmpty = async (serverUrl: string, e3Id: number, address: string): Promise => { + +} \ No newline at end of file diff --git a/examples/CRISP/server/src/server/routes/state.rs b/examples/CRISP/server/src/server/routes/state.rs index 1e7b6459a7..d1d3f663dc 100644 --- a/examples/CRISP/server/src/server/routes/state.rs +++ b/examples/CRISP/server/src/server/routes/state.rs @@ -35,7 +35,8 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { .route( "/previous-ciphertext", web::post().to(handle_get_previous_ciphertext), - ), + ) + .route("/is-slot-empty", web::post().to(handle_get_previous_ciphertext)), ); } @@ -280,3 +281,31 @@ async fn get_token_holders_hashes( } } } + +async fn handle_is_slot_empty( + data: web::Json, + store: web::Data, +) -> Responder { + let incoming = data.into_inner(); + + let contract = + match CRISPContractFactory::create_read(&CONFIG.http_rpc_url, &CONFIG.e3_program_address) + .await + { + Ok(contract) => contract, + Err(e) => { + error!("Failed to create CRISP contract: {:?}", e); + return HttpResponse::InternalServerError().body("Failed to create CRISP contract"); + } + }; + + let address = match Address::from_str(incoming.address.as_str()) { + Ok(addr) => addr, + Err(e) => { + error!("Invalid address format: {:?}", e); + return HttpResponse::BadRequest().body("Invalid address format"); + } + }; + + +} \ No newline at end of file From 8f7de4660d70eb32f7c3ab62bcf2edf76bc3dff3 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Thu, 18 Dec 2025 18:06:22 +0000 Subject: [PATCH 06/19] chore: simplify voting interface --- examples/CRISP/client/libs/crispSDKWorker.js | 12 +- .../src/hooks/enclave/useEnclaveServer.ts | 8 +- .../client/src/hooks/voting/useSDKWorker.tsx | 6 +- .../client/src/hooks/voting/useVoteCasting.ts | 19 -- examples/CRISP/client/src/model/vote.model.ts | 9 - .../CRISP/crates/zk-inputs-wasm/src/lib.rs | 8 +- examples/CRISP/crates/zk-inputs/src/lib.rs | 2 +- .../CRISP/packages/crisp-sdk/src/constants.ts | 1 + .../CRISP/packages/crisp-sdk/src/state.ts | 41 ++++- .../CRISP/packages/crisp-sdk/src/types.ts | 19 +- examples/CRISP/packages/crisp-sdk/src/vote.ts | 172 ++++++++++++------ .../packages/crisp-sdk/tests/vote.test.ts | 1 - examples/CRISP/server/src/server/models.rs | 11 ++ .../CRISP/server/src/server/routes/state.rs | 34 ++-- 14 files changed, 216 insertions(+), 127 deletions(-) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index 4d54ebeb4f..d41e8d0534 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -11,7 +11,7 @@ self.onmessage = async function (event) { switch (type) { case 'generate_proof': try { - const { voteId, publicKey, address: slotAddress, signature, previousCiphertext, messageHash, isFirstVote, isMasking } = data + const { voteId, publicKey, address: slotAddress, signature, messageHash, isMasking, crispServer } = data // voteId is either 0 or 1, so we need to encode the vote accordingly. // We are adapting to the current CRISP application. @@ -29,22 +29,24 @@ self.onmessage = async function (event) { if (isMasking) { proof = await generateMaskVoteProof({ - vote, + serverUrl: crispServer, + e3Id: voteId, publicKey, balance, - previousCiphertext, - isFirstVote, slotAddress, + merkleLeaves, }) } else { proof = await generateVoteProof({ + serverUrl: crispServer, vote, + e3Id: voteId, publicKey, signature, merkleLeaves, balance, messageHash, - isFirstVote, + slotAddress }) } diff --git a/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts b/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts index 093a375100..aff8a27ef6 100644 --- a/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts +++ b/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts @@ -9,8 +9,6 @@ import { BroadcastVoteRequest, BroadcastVoteResponse, CurrentRound, - GetPreviousCiphertextRequest, - GetPreviousCiphertextResponse, VoteStateLite, VoteStatusRequest, VoteStatusResponse, @@ -29,11 +27,10 @@ const EnclaveEndpoints = { GetWebAllResult: `${ENCLAVE_API}/state/all`, BroadcastVote: `${ENCLAVE_API}/voting/broadcast`, GetVoteStatus: `${ENCLAVE_API}/voting/status`, - GetPreviousCiphertext: `${ENCLAVE_API}/state/previous-ciphertext`, } as const export const useEnclaveServer = () => { - const { GetCurrentRound, GetWebAllResult, BroadcastVote, GetRoundStateLite, GetWebResult, GetVoteStatus, GetPreviousCiphertext } = + const { GetCurrentRound, GetWebAllResult, BroadcastVote, GetRoundStateLite, GetWebResult, GetVoteStatus } = EnclaveEndpoints const { fetchData, isLoading } = useApi() const getCurrentRound = () => fetchData(GetCurrentRound) @@ -42,8 +39,6 @@ export const useEnclaveServer = () => { const getWebResult = () => fetchData(GetWebAllResult, 'get') const getWebResultByRound = (round_id: number) => fetchData(GetWebResult, 'post', { round_id }) const getVoteStatus = (request: VoteStatusRequest) => fetchData(GetVoteStatus, 'post', request) - const getPreviousCiphertext = (request: GetPreviousCiphertextRequest) => - fetchData(GetPreviousCiphertext, 'post', request) return { isLoading, @@ -53,6 +48,5 @@ export const useEnclaveServer = () => { getRoundStateLite, broadcastVote, getVoteStatus, - getPreviousCiphertext, } } diff --git a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx index ae9e0e9055..f3ce1053cc 100644 --- a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx +++ b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx @@ -8,6 +8,8 @@ import { useState, useEffect, useRef } from 'react' import { handleGenericError } from '@/utils/handle-generic-error' import { useNotificationAlertContext } from '@/context/NotificationAlert' +const ENCLAVE_API = import.meta.env.VITE_ENCLAVE_API + export const useSDKWorkerHook = () => { const { showToast } = useNotificationAlertContext() const [isLoading, setIsLoading] = useState(false) @@ -31,9 +33,7 @@ export const useSDKWorkerHook = () => { address: string, signature: string, messageHash: `0x${string}`, - isFirstVote: boolean, isMasking: boolean, - previousCiphertext?: Uint8Array, ): Promise => { if (!workerRef.current) { console.error('Worker not initialized') @@ -45,7 +45,7 @@ export const useSDKWorkerHook = () => { workerRef.current!.postMessage({ type: 'generate_proof', - data: { voteId, publicKey, address, signature, messageHash, previousCiphertext, isFirstVote, isMasking }, + data: { voteId, publicKey, address, signature, messageHash, isMasking, crispServer: ENCLAVE_API }, }) workerRef.current!.onmessage = async (event) => { const { type, success, encodedProof, error } = event.data diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index b52487505a..240858433d 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -13,8 +13,6 @@ import { useNotificationAlertContext } from '@/context/NotificationAlert/Notific import { Poll } from '@/model/poll.model' import { BroadcastVoteRequest, VoteStateLite, VotingRound } from '@/model/vote.model' -import { encryptVote, SIGNATURE_MESSAGE } from '@crisp-e3/sdk' - export type VotingStep = 'idle' | 'signing' | 'encrypting' | 'generating_proof' | 'broadcasting' | 'confirming' | 'complete' | 'error' const extractCleanErrorMessage = (errorMessage: string | undefined): string => { @@ -55,8 +53,6 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo hasVotedInCurrentRound, } = useVoteManagementContext() - const { getPreviousCiphertext } = useEnclaveServer() - const roundState = customRoundState ?? contextRoundState const votingRound = customVotingRound ?? contextVotingRound @@ -143,19 +139,6 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setLastActiveStep('encrypting') setStepMessage('') - const previousCiphertextFromServer = isVoteUpdate - ? await getPreviousCiphertext({ - round_id: roundState.id, - address: user.address, - }) - : undefined - - const previousCiphertext = previousCiphertextFromServer && previousCiphertextFromServer?.ciphertext - - if (isMasking && isVoteUpdate && !previousCiphertext) { - throw new Error('Previous ciphertext required for masking vote update.') - } - const encodedProof = await handleProofGeneration( pollSelected, user.address, @@ -163,7 +146,6 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo messageHash, !isVoteUpdate, isMasking, - previousCiphertext, ) if (!encodedProof) { @@ -252,7 +234,6 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo signMessageAsync, markVotedInRound, resetVotingState, - getPreviousCiphertext, ], ) diff --git a/examples/CRISP/client/src/model/vote.model.ts b/examples/CRISP/client/src/model/vote.model.ts index d13e0840d9..190bf2e106 100644 --- a/examples/CRISP/client/src/model/vote.model.ts +++ b/examples/CRISP/client/src/model/vote.model.ts @@ -55,12 +55,3 @@ export interface VoteStateLite { committee_public_key: number[] emojis: [string, string] } - -export interface GetPreviousCiphertextRequest { - round_id: number - address: string -} - -export interface GetPreviousCiphertextResponse { - ciphertext: Uint8Array -} diff --git a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs index e811c737dc..50cb82cc76 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs-wasm/src/lib.rs @@ -72,9 +72,9 @@ impl ZKInputsGenerator { } } - /// Generate CRISP ZK inputs for a Masking vote from JavaScript. - #[wasm_bindgen(js_name = "generateInputsForMasking")] - pub fn generate_inputs_for_masking( + /// Generate CRISP ZK inputs for a vote update (either from voter or as a masker) from JavaScript. + #[wasm_bindgen(js_name = "generateInputsForUpdate")] + pub fn generate_inputs_for_update( &self, prev_ciphertext: &[u8], public_key: &[u8], @@ -84,7 +84,7 @@ impl ZKInputsGenerator { match self .generator - .generate_inputs_for_masking(prev_ciphertext, public_key, vote_vec) + .generate_inputs_for_update(prev_ciphertext, public_key, vote_vec) { Ok(inputs_json) => { // Parse the JSON string and return as JsValue. diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 19ff933143..2eb9f48c2c 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -75,7 +75,7 @@ impl ZKInputsGenerator { /// /// # Returns /// JSON string containing the CRISP ZK inputs - pub fn generate_inputs_for_masking( + pub fn generate_inputs_for_update( &self, prev_ciphertext: &[u8], public_key: &[u8], diff --git a/examples/CRISP/packages/crisp-sdk/src/constants.ts b/examples/CRISP/packages/crisp-sdk/src/constants.ts index d4e3a98023..b3a07c28fa 100644 --- a/examples/CRISP/packages/crisp-sdk/src/constants.ts +++ b/examples/CRISP/packages/crisp-sdk/src/constants.ts @@ -9,6 +9,7 @@ import { hashMessage } from 'viem' export const CRISP_SERVER_TOKEN_TREE_ENDPOINT = 'state/token-holders' export const CRISP_SERVER_STATE_LITE_ENDPOINT = 'state/lite' export const CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT = 'state/previous-ciphertext' +export const CRISP_SERVER_IS_SLOT_EMPTY_ENDPOINT = 'state/is-slot-empty' export const MERKLE_TREE_MAX_DEPTH = 20 // static, hardcoded in the circuit. diff --git a/examples/CRISP/packages/crisp-sdk/src/state.ts b/examples/CRISP/packages/crisp-sdk/src/state.ts index 9c2f73d279..2aab15a46d 100644 --- a/examples/CRISP/packages/crisp-sdk/src/state.ts +++ b/examples/CRISP/packages/crisp-sdk/src/state.ts @@ -4,7 +4,11 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { CRISP_SERVER_STATE_LITE_ENDPOINT, CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT } from './constants' +import { + CRISP_SERVER_STATE_LITE_ENDPOINT, + CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT, + CRISP_SERVER_IS_SLOT_EMPTY_ENDPOINT, +} from './constants' import type { RoundDetailsResponse, RoundDetails, TokenDetails } from './types' @@ -56,10 +60,10 @@ export const getRoundTokenDetails = async (serverUrl: string, e3Id: number): Pro /** * Get the previous ciphertext for a slot from the CRISP server - * @param serverUrl - * @param e3Id - * @param address - * @returns + * @param serverUrl - The base URL of the CRISP server + * @param e3Id - The e3Id of the round + * @param address - The address of the slot + * @returns The previous ciphertext for the slot */ export const getPreviousCiphertext = async (serverUrl: string, e3Id: number, address: string): Promise => { const response = await fetch(`${serverUrl}/${CRISP_SERVER_PREVIOUS_CIPHERTEXT_ENDPOINT}`, { @@ -76,9 +80,30 @@ export const getPreviousCiphertext = async (serverUrl: string, e3Id: number, add const data = await response.json() - return data.previous_ciphertext as Uint8Array; + return data.previous_ciphertext as Uint8Array } +/** + * Check if a slot is empty for a given E3 ID and slot address + * @param serverUrl - The base URL of the CRISP server + * @param e3Id - The e3Id of the round + * @param address - The address of the slot + * @returns Whether the slot is empty or not + */ export const getIsSlotEmpty = async (serverUrl: string, e3Id: number, address: string): Promise => { - -} \ No newline at end of file + const response = await fetch(`${serverUrl}/${CRISP_SERVER_IS_SLOT_EMPTY_ENDPOINT}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ round_id: e3Id, address }), + }) + + if (!response.ok) { + throw new Error(`Failed to check if slot is empty: ${response.statusText}`) + } + + const data = await response.json() + + return data.is_empty as boolean +} diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index b564519a6e..0ced69b757 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -170,31 +170,36 @@ export type ExecuteCircuitResult = { } export type ProofInputs = { + previousCiphertext: Uint8Array vote: Vote publicKey: Uint8Array - signature: `0x${string}` + signature: Uint8Array + publicKeyX: Uint8Array + publicKeyY: Uint8Array balance: bigint slotAddress: string merkleProof: MerkleProof - messageHash?: `0x${string}` + messageHash: Uint8Array isFirstVote: boolean } export type MaskVoteProofInputs = { - previousCiphertext?: Uint8Array + serverUrl: string + e3Id: number publicKey: Uint8Array balance: bigint slotAddress: string - isFirstVote: boolean - merkleRoot: bigint + merkleLeaves: string[] | bigint[] } export type VoteProofInputs = { + serverUrl: string + e3Id: number merkleLeaves: string[] | bigint[] publicKey: Uint8Array balance: bigint vote: Vote signature: `0x${string}` - previousCiphertext?: Uint8Array - messageHash?: `0x${string}` + messageHash: `0x${string}` + slotAddress: string } diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index ac1e9f367e..29f220cad4 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -6,19 +6,20 @@ import { ZKInputsGenerator } from '@crisp-e3/zk-inputs' import { type CircuitInputs, type Vote, ExecuteCircuitResult, MaskVoteProofInputs, ProofInputs, VoteProofInputs } from './types' -import { generateMerkleProof, toBinary, extractSignatureComponents, getAddressFromSignature, getOptimalThreadCount } from './utils' import { - MAXIMUM_VOTE_VALUE, - MASK_SIGNATURE, - zeroVote, - SIGNATURE_MESSAGE_HASH, - MERKLE_TREE_MAX_DEPTH, -} from './constants' + generateMerkleProof, + toBinary, + extractSignatureComponents, + getAddressFromSignature, + getOptimalThreadCount, +} from './utils' +import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE, zeroVote, SIGNATURE_MESSAGE_HASH } from './constants' import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' import circuit from '../../../circuits/target/crisp_circuit.json' import { bytesToHex, encodeAbiParameters, parseAbiParameters, numberToHex, getAddress, hexToBytes } from 'viem/utils' import { Hex } from 'viem' +import { getIsSlotEmpty, getPreviousCiphertext } from './state' // Initialize the ZKInputsGenerator. const zkInputsGenerator: ZKInputsGenerator = ZKInputsGenerator.withDefaults() @@ -122,37 +123,57 @@ export const decodeTally = (tallyBytes: string): Vote => { } } +/** + * Encrypt the vote using the public key. + * @param vote - The vote to encrypt. + * @param publicKey - The public key to use for encryption. + * @returns The encrypted vote as a Uint8Array. + */ export const encryptVote = (vote: Vote, publicKey: Uint8Array): Uint8Array => { const encodedVote = encodeVote(vote) return zkInputsGenerator.encryptVote(publicKey, encodedVote) } +/** + * Generate a random public key. + * @returns The generated public key as a Uint8Array. + */ export const generatePublicKey = (): Uint8Array => { return zkInputsGenerator.generatePublicKey() } +/** + * Generate the circuit inputs for a vote proof. + * This works for both vote and masking. + * @param proofInputs - The proof inputs. + * @returns The circuit inputs as a CircuitInputs object. + */ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise => { const encodedVote = encodeVote(proofInputs.vote) - let crispInputs = await zkInputsGenerator.generateInputs( - // A placeholder ciphertext vote will be generated. - // This is safe because the circuit will not check the ciphertext addition if - // the previous ciphertext is not provided (is_first_vote is true). - encryptVote(zeroVote, proofInputs.publicKey), - proofInputs.publicKey, - encodedVote, - ) - - const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents( - proofInputs.signature, - proofInputs.messageHash, - ) + let crispInputs: CircuitInputs + + if (proofInputs.isFirstVote) { + crispInputs = await zkInputsGenerator.generateInputs( + // A placeholder ciphertext vote will be generated. + // This is safe because the circuit will not check the ciphertext addition if + // the previous ciphertext is not provided (is_first_vote is true). + encryptVote(zeroVote, proofInputs.publicKey), + proofInputs.publicKey, + encodedVote, + ) + } else { + if (!proofInputs.previousCiphertext) { + throw new Error('Previous ciphertext is required for non-first votes') + } + crispInputs = await zkInputsGenerator.generateInputsForUpdate(proofInputs.previousCiphertext, proofInputs.publicKey, encodedVote) + } - crispInputs.hashed_message = Array.from(messageHash).map((b) => b.toString()) - crispInputs.public_key_x = Array.from(publicKeyX).map((b) => b.toString()) - crispInputs.public_key_y = Array.from(publicKeyY).map((b) => b.toString()) - crispInputs.signature = Array.from(signature).map((b) => b.toString()) + crispInputs.hashed_message = Array.from(proofInputs.messageHash).map((b) => b.toString()) + crispInputs.public_key_x = Array.from(proofInputs.publicKeyX).map((b) => b.toString()) + crispInputs.public_key_y = Array.from(proofInputs.publicKeyY).map((b) => b.toString()) + crispInputs.signature = Array.from(proofInputs.signature).map((b) => b.toString()) crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() crispInputs.balance = proofInputs.balance.toString() crispInputs.is_first_vote = proofInputs.isFirstVote @@ -164,38 +185,22 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise => { - const encodedVote = encodeVote(zeroVote) - - let crispInputs = await zkInputsGenerator.generateInputsForUpdate( - proofInputs.previousCiphertext || encryptVote(zeroVote, proofInputs.publicKey), - proofInputs.publicKey, - encodedVote, - ) - - const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents(MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH) - - crispInputs.hashed_message = Array.from(messageHash).map((b) => b.toString()) - crispInputs.public_key_x = Array.from(publicKeyX).map((b) => b.toString()) - crispInputs.public_key_y = Array.from(publicKeyY).map((b) => b.toString()) - crispInputs.signature = Array.from(signature).map((b) => b.toString()) - crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() - crispInputs.balance = proofInputs.balance.toString() - crispInputs.is_first_vote = proofInputs.isFirstVote - crispInputs.merkle_root = proofInputs.merkleRoot.toString() - crispInputs.merkle_proof_length = '0' - crispInputs.merkle_proof_indices = Array.from({ length: MERKLE_TREE_MAX_DEPTH }, () => '0') - crispInputs.merkle_proof_siblings = Array.from({ length: MERKLE_TREE_MAX_DEPTH }, () => '0') - - return crispInputs -} - +/** + * Execute the circuit. + * @param crispInputs - The circuit inputs. + * @returns The execute circuit result. + */ export const executeCircuit = async (crispInputs: CircuitInputs): Promise => { const noir = new Noir(circuit as CompiledCircuit) return noir.execute(crispInputs) as Promise } +/** + * Generate a proof for the CRISP circuit given the circuit inputs. + * @param crispInputs - The circuit inputs. + * @returns The proof. + */ export const generateProof = async (crispInputs: CircuitInputs): Promise => { const { witness } = await executeCircuit(crispInputs) const backend = new UltraHonkBackend(circuit.bytecode, { threads: optimalThreadCount }) @@ -207,6 +212,11 @@ export const generateProof = async (crispInputs: CircuitInputs): Promise { if (voteProofInputs.vote.yes > voteProofInputs.balance || voteProofInputs.vote.no > voteProofInputs.balance) { throw new Error('Invalid vote: vote exceeds balance') @@ -224,25 +234,83 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { // The address slot of an actual vote always is the address of the public key that signed the message. const address = await getAddressFromSignature(voteProofInputs.signature, voteProofInputs.messageHash) + const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents( + voteProofInputs.signature, + voteProofInputs.messageHash, + ) + const merkleProof = generateMerkleProof(voteProofInputs.balance, address, voteProofInputs.merkleLeaves) + // check if the slot is empty first + const isSlotEmpty = await getIsSlotEmpty(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) + + let previousCiphertext: Uint8Array + if (!isSlotEmpty) { + previousCiphertext = await getPreviousCiphertext(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) + } else { + previousCiphertext = encryptVote(zeroVote, voteProofInputs.publicKey) + } + const crispInputs = await generateCircuitInputs({ ...voteProofInputs, slotAddress: address, merkleProof, + isFirstVote: isSlotEmpty, + previousCiphertext, + messageHash, + publicKeyX, + publicKeyY, + signature, }) return generateProof(crispInputs) } -export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofInputs) => { - const crispInputs = await generateCircuitInputsForMasking({ +/** + * Generate a proof for a vote masking operation. + * @param maskVoteProofInputs The mask vote proof inputs. + * @returns + */ +export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofInputs): Promise => { + // check if the slot is empty first + const isSlotEmpty = await getIsSlotEmpty(maskVoteProofInputs.serverUrl, maskVoteProofInputs.e3Id, maskVoteProofInputs.slotAddress) + + let previousCiphertext: Uint8Array | undefined + + if (!isSlotEmpty) { + previousCiphertext = await getPreviousCiphertext( + maskVoteProofInputs.serverUrl, + maskVoteProofInputs.e3Id, + maskVoteProofInputs.slotAddress, + ) + } else { + previousCiphertext = encryptVote(zeroVote, maskVoteProofInputs.publicKey) + } + + const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents(MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH) + + const merkleProof = generateMerkleProof(maskVoteProofInputs.balance, maskVoteProofInputs.slotAddress, maskVoteProofInputs.merkleLeaves) + + const crispInputs = await generateCircuitInputs({ ...maskVoteProofInputs, + previousCiphertext, + isFirstVote: isSlotEmpty, + messageHash, + publicKeyX, + publicKeyY, + signature, + vote: zeroVote, + merkleProof, }) return generateProof(crispInputs) } +/** + * Locally verify a Noir proof. + * @param proof - The proof to verify. + * @returns True if the proof is valid, false otherwise. + */ export const verifyProof = async (proof: ProofData): Promise => { const backend = new UltraHonkBackend((circuit as CompiledCircuit).bytecode, { threads: optimalThreadCount }) diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 59b76c94fe..dfdb6337d7 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -18,7 +18,6 @@ import { encodeVote, generateCircuitInputs, executeCircuit, - generateCircuitInputsForMasking, } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' diff --git a/examples/CRISP/server/src/server/models.rs b/examples/CRISP/server/src/server/models.rs index 7179d4a388..e91a839fb9 100644 --- a/examples/CRISP/server/src/server/models.rs +++ b/examples/CRISP/server/src/server/models.rs @@ -116,6 +116,17 @@ pub struct PreviousCiphertextResponse { pub ciphertext: Vec, } +#[derive(Debug, Deserialize, Serialize)] +pub struct IsSlotEmptyRequest { + pub round_id: u64, + pub address: String, +} + +#[derive(Serialize)] +pub struct IsSlotEmptyResponse { + pub is_empty: bool, +} + #[derive(Debug, Deserialize, Serialize)] pub struct ComputeProviderParams { pub name: String, diff --git a/examples/CRISP/server/src/server/routes/state.rs b/examples/CRISP/server/src/server/routes/state.rs index d1d3f663dc..9131e89b48 100644 --- a/examples/CRISP/server/src/server/routes/state.rs +++ b/examples/CRISP/server/src/server/routes/state.rs @@ -7,11 +7,9 @@ use std::str::FromStr; use crate::server::{ - app_data::AppData, - models::{ - GetRoundRequest, PreviousCiphertextRequest, PreviousCiphertextResponse, WebhookPayload, - }, - CONFIG, + CONFIG, app_data::AppData, models::{ + GetRoundRequest, IsSlotEmptyRequest, IsSlotEmptyResponse, PreviousCiphertextRequest, PreviousCiphertextResponse, WebhookPayload + } }; use actix_web::{web, HttpResponse, Responder}; use alloy::primitives::{Address, Bytes, U256}; @@ -36,7 +34,7 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { "/previous-ciphertext", web::post().to(handle_get_previous_ciphertext), ) - .route("/is-slot-empty", web::post().to(handle_get_previous_ciphertext)), + .route("/is-slot-empty", web::post().to(handle_is_slot_empty)), ); } @@ -282,10 +280,12 @@ async fn get_token_holders_hashes( } } +/// Check if a slot is empty given an address +/// /// # Arguments +/// * `PreviousCiphertextRequest` - The request containing round_id and address async fn handle_is_slot_empty( - data: web::Json, - store: web::Data, -) -> Responder { + data: web::Json, +) -> impl Responder { let incoming = data.into_inner(); let contract = @@ -307,5 +307,17 @@ async fn handle_is_slot_empty( } }; - -} \ No newline at end of file + let is_empty = match contract + .get_is_slot_empty_by_address(U256::from(incoming.round_id), address) + .await + { + Ok(empty) => empty, + Err(e) => { + error!("Error checking if slot is empty: {:?}", e); + return HttpResponse::InternalServerError() + .body("Failed to check if slot is empty"); + } + }; + + HttpResponse::Ok().json(IsSlotEmptyResponse { is_empty } ) +} From f478bed7edb09fd09241a004c01ade1b32999f18 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Thu, 18 Dec 2025 18:07:04 +0000 Subject: [PATCH 07/19] chore: format --- examples/CRISP/client/libs/crispSDKWorker.js | 2 +- .../CRISP/client/src/hooks/enclave/useEnclaveServer.ts | 3 +-- .../CRISP/client/src/hooks/voting/useVoteCasting.ts | 9 +-------- examples/CRISP/packages/crisp-sdk/src/vote.ts | 10 ++-------- 4 files changed, 5 insertions(+), 19 deletions(-) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index d41e8d0534..66fe7cc5ad 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -46,7 +46,7 @@ self.onmessage = async function (event) { merkleLeaves, balance, messageHash, - slotAddress + slotAddress, }) } diff --git a/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts b/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts index aff8a27ef6..ec6ad335a5 100644 --- a/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts +++ b/examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts @@ -30,8 +30,7 @@ const EnclaveEndpoints = { } as const export const useEnclaveServer = () => { - const { GetCurrentRound, GetWebAllResult, BroadcastVote, GetRoundStateLite, GetWebResult, GetVoteStatus } = - EnclaveEndpoints + const { GetCurrentRound, GetWebAllResult, BroadcastVote, GetRoundStateLite, GetWebResult, GetVoteStatus } = EnclaveEndpoints const { fetchData, isLoading } = useApi() const getCurrentRound = () => fetchData(GetCurrentRound) const getRoundStateLite = (round_id: number) => fetchData(GetRoundStateLite, 'post', { round_id }) diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index 240858433d..78b640c3b9 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -139,14 +139,7 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setLastActiveStep('encrypting') setStepMessage('') - const encodedProof = await handleProofGeneration( - pollSelected, - user.address, - signature, - messageHash, - !isVoteUpdate, - isMasking, - ) + const encodedProof = await handleProofGeneration(pollSelected, user.address, signature, messageHash, !isVoteUpdate, isMasking) if (!encodedProof) { throw new Error('Failed to encrypt vote.') diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index 29f220cad4..ed38176021 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -6,13 +6,7 @@ import { ZKInputsGenerator } from '@crisp-e3/zk-inputs' import { type CircuitInputs, type Vote, ExecuteCircuitResult, MaskVoteProofInputs, ProofInputs, VoteProofInputs } from './types' -import { - generateMerkleProof, - toBinary, - extractSignatureComponents, - getAddressFromSignature, - getOptimalThreadCount, -} from './utils' +import { generateMerkleProof, toBinary, extractSignatureComponents, getAddressFromSignature, getOptimalThreadCount } from './utils' import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE, zeroVote, SIGNATURE_MESSAGE_HASH } from './constants' import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' @@ -269,7 +263,7 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { /** * Generate a proof for a vote masking operation. * @param maskVoteProofInputs The mask vote proof inputs. - * @returns + * @returns */ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofInputs): Promise => { // check if the slot is empty first From 1e27eeb1bee1b2ffb71d061bb3cee1f70bc50bef Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:57:58 +0000 Subject: [PATCH 08/19] chore: add tests and fix update --- examples/CRISP/client/libs/crispSDKWorker.js | 7 +- .../voteManagement/VoteManagement.types.ts | 8 +- .../client/src/hooks/voting/useSDKWorker.tsx | 7 +- .../client/src/hooks/voting/useVoteCasting.ts | 25 +- examples/CRISP/client/src/model/vote.model.ts | 5 + .../CRISP/packages/crisp-sdk/src/state.ts | 2 +- .../CRISP/packages/crisp-sdk/src/types.ts | 12 +- examples/CRISP/packages/crisp-sdk/src/vote.ts | 21 +- .../packages/crisp-sdk/tests/previous.json | 1860 +++++++++++++++++ .../packages/crisp-sdk/tests/vote.test.ts | 106 +- 10 files changed, 1987 insertions(+), 66 deletions(-) create mode 100644 examples/CRISP/packages/crisp-sdk/tests/previous.json diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index 66fe7cc5ad..0cc3201133 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -11,12 +11,7 @@ self.onmessage = async function (event) { switch (type) { case 'generate_proof': try { - const { voteId, publicKey, address: slotAddress, signature, messageHash, isMasking, crispServer } = data - - // voteId is either 0 or 1, so we need to encode the vote accordingly. - // We are adapting to the current CRISP application. - const balance = 1n - const vote = voteId === 0 ? { yes: 0n, no: balance } : { yes: balance, no: 0n } + const { voteId, vote, publicKey, balance, address: slotAddress, signature, messageHash, isMasking, crispServer } = data // todo: get the leaves from the server (pass them from the client). const merkleLeaves = [ diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index 62b3d5dabb..58ec12b40a 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -6,7 +6,7 @@ import type React from 'react' import { ReactNode } from 'react' -import { BroadcastVoteRequest, BroadcastVoteResponse, VotingRound, VoteStateLite } from '@/model/vote.model' +import { BroadcastVoteRequest, BroadcastVoteResponse, VotingRound, VoteStateLite, Vote } from '@/model/vote.model' import { Poll, PollRequestResult, PollResult } from '@/model/poll.model' export type VoteStatus = { @@ -38,14 +38,14 @@ export type VoteManagementContextType = { setVotingRound: React.Dispatch> setUser: React.Dispatch> generateProof: ( - voteId: bigint, + voteId: number, + vote: Vote, publicKey: Uint8Array, address: string, + balance: number, signature: string, messageHash: `0x${string}`, - isFirstVote: boolean, isMasking: boolean, - previousCiphertext?: Uint8Array, ) => Promise broadcastVote: (vote: BroadcastVoteRequest) => Promise getRoundStateLite: (roundCount: number) => Promise diff --git a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx index f3ce1053cc..1bed0e8be5 100644 --- a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx +++ b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx @@ -7,6 +7,7 @@ import { useState, useEffect, useRef } from 'react' import { handleGenericError } from '@/utils/handle-generic-error' import { useNotificationAlertContext } from '@/context/NotificationAlert' +import { Vote } from '@/model/vote.model' const ENCLAVE_API = import.meta.env.VITE_ENCLAVE_API @@ -28,9 +29,11 @@ export const useSDKWorkerHook = () => { }, []) const generateProof = async ( - voteId: bigint, + voteId: number, + vote: Vote, publicKey: Uint8Array, address: string, + balance: number, signature: string, messageHash: `0x${string}`, isMasking: boolean, @@ -45,7 +48,7 @@ export const useSDKWorkerHook = () => { workerRef.current!.postMessage({ type: 'generate_proof', - data: { voteId, publicKey, address, signature, messageHash, isMasking, crispServer: ENCLAVE_API }, + data: { voteId, vote, balance, publicKey, address, signature, messageHash, isMasking, crispServer: ENCLAVE_API }, }) workerRef.current!.onmessage = async (event) => { const { type, success, encodedProof, error } = event.data diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index 78b640c3b9..ba6ced41d2 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -11,7 +11,7 @@ import { useSignMessage } from 'wagmi' import { useVoteManagementContext } from '@/context/voteManagement' import { useNotificationAlertContext } from '@/context/NotificationAlert/NotificationAlert.context.tsx' import { Poll } from '@/model/poll.model' -import { BroadcastVoteRequest, VoteStateLite, VotingRound } from '@/model/vote.model' +import { BroadcastVoteRequest, Vote, VoteStateLite, VotingRound } from '@/model/vote.model' export type VotingStep = 'idle' | 'signing' | 'encrypting' | 'generating_proof' | 'broadcasting' | 'confirming' | 'complete' | 'error' @@ -65,25 +65,17 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo const [stepMessage, setStepMessage] = useState('') const handleProofGeneration = useCallback( - async ( - vote: Poll, - address: string, - signature: string, - messageHash: `0x${string}`, - isFirstVote: boolean, - isMasking: boolean, - previousCiphertext?: Uint8Array, - ) => { + async (vote: Vote, address: string, balance: number, signature: string, messageHash: `0x${string}`, isMasking: boolean) => { if (!votingRound) throw new Error('No voting round available for proof generation') return generateProof( - BigInt(vote.value), + votingRound.round_id, + vote, new Uint8Array(votingRound.pk_bytes), address, + balance, signature, messageHash, - isFirstVote, isMasking, - previousCiphertext, ) }, [generateProof, votingRound], @@ -139,7 +131,12 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setLastActiveStep('encrypting') setStepMessage('') - const encodedProof = await handleProofGeneration(pollSelected, user.address, signature, messageHash, !isVoteUpdate, isMasking) + // voteId is either 0 or 1, so we need to encode the vote accordingly. + // We are adapting to the current CRISP application. + const balance = 1 + const vote = pollSelected.value === 0 ? { yes: balance, no: 0 } : { yes: 0, no: balance } + + const encodedProof = await handleProofGeneration(vote, user.address, balance, signature, messageHash, isMasking) if (!encodedProof) { throw new Error('Failed to encrypt vote.') diff --git a/examples/CRISP/client/src/model/vote.model.ts b/examples/CRISP/client/src/model/vote.model.ts index 190bf2e106..c0a78105d5 100644 --- a/examples/CRISP/client/src/model/vote.model.ts +++ b/examples/CRISP/client/src/model/vote.model.ts @@ -55,3 +55,8 @@ export interface VoteStateLite { committee_public_key: number[] emojis: [string, string] } + +export interface Vote { + yes: number + no: number +} diff --git a/examples/CRISP/packages/crisp-sdk/src/state.ts b/examples/CRISP/packages/crisp-sdk/src/state.ts index 2aab15a46d..ea012abb4e 100644 --- a/examples/CRISP/packages/crisp-sdk/src/state.ts +++ b/examples/CRISP/packages/crisp-sdk/src/state.ts @@ -80,7 +80,7 @@ export const getPreviousCiphertext = async (serverUrl: string, e3Id: number, add const data = await response.json() - return data.previous_ciphertext as Uint8Array + return data.ciphertext as Uint8Array } /** diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index 0ced69b757..0ed308877a 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -173,13 +173,10 @@ export type ProofInputs = { previousCiphertext: Uint8Array vote: Vote publicKey: Uint8Array - signature: Uint8Array - publicKeyX: Uint8Array - publicKeyY: Uint8Array + signature: Signature balance: bigint slotAddress: string merkleProof: MerkleProof - messageHash: Uint8Array isFirstVote: boolean } @@ -203,3 +200,10 @@ export type VoteProofInputs = { messageHash: `0x${string}` slotAddress: string } + +export type Signature = { + publicKeyX: Uint8Array + publicKeyY: Uint8Array + signature: Uint8Array + messageHash: Uint8Array +} diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index ed38176021..15f1eeaebf 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -164,10 +164,10 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise b.toString()) - crispInputs.public_key_x = Array.from(proofInputs.publicKeyX).map((b) => b.toString()) - crispInputs.public_key_y = Array.from(proofInputs.publicKeyY).map((b) => b.toString()) - crispInputs.signature = Array.from(proofInputs.signature).map((b) => b.toString()) + crispInputs.hashed_message = Array.from(proofInputs.signature.messageHash).map((b) => b.toString()) + crispInputs.public_key_x = Array.from(proofInputs.signature.publicKeyX).map((b) => b.toString()) + crispInputs.public_key_y = Array.from(proofInputs.signature.publicKeyY).map((b) => b.toString()) + crispInputs.signature = Array.from(proofInputs.signature.signature).map((b) => b.toString()) crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() crispInputs.balance = proofInputs.balance.toString() crispInputs.is_first_vote = proofInputs.isFirstVote @@ -228,10 +228,7 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { // The address slot of an actual vote always is the address of the public key that signed the message. const address = await getAddressFromSignature(voteProofInputs.signature, voteProofInputs.messageHash) - const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents( - voteProofInputs.signature, - voteProofInputs.messageHash, - ) + const signature = await extractSignatureComponents(voteProofInputs.signature, voteProofInputs.messageHash) const merkleProof = generateMerkleProof(voteProofInputs.balance, address, voteProofInputs.merkleLeaves) @@ -251,9 +248,6 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { merkleProof, isFirstVote: isSlotEmpty, previousCiphertext, - messageHash, - publicKeyX, - publicKeyY, signature, }) @@ -281,7 +275,7 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn previousCiphertext = encryptVote(zeroVote, maskVoteProofInputs.publicKey) } - const { messageHash, publicKeyX, publicKeyY, signature } = await extractSignatureComponents(MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH) + const signature = await extractSignatureComponents(MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH) const merkleProof = generateMerkleProof(maskVoteProofInputs.balance, maskVoteProofInputs.slotAddress, maskVoteProofInputs.merkleLeaves) @@ -289,9 +283,6 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn ...maskVoteProofInputs, previousCiphertext, isFirstVote: isSlotEmpty, - messageHash, - publicKeyX, - publicKeyY, signature, vote: zeroVote, merkleProof, diff --git a/examples/CRISP/packages/crisp-sdk/tests/previous.json b/examples/CRISP/packages/crisp-sdk/tests/previous.json new file mode 100644 index 0000000000..cd4d5fbe43 --- /dev/null +++ b/examples/CRISP/packages/crisp-sdk/tests/previous.json @@ -0,0 +1,1860 @@ +[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 147, 53, 41, 191, 223, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 49, 40, 127, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 79, 150, 215, 168, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 186, 190, 77, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 50, 137, + 242, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, 3, 39, 22, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 241, 137, 106, 171, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 106, 249, 44, 212, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 255, 227, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 129, 34, 213, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 175, 160, 109, 35, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 146, 199, 35, 225, 44, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 103, 248, 109, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 180, 22, 194, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 175, 175, 31, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 146, 202, 94, 241, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 145, 183, 117, 69, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 180, 119, 211, + 29, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 36, + 189, 139, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 131, 199, 22, 40, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 89, 182, 189, 220, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 243, 189, 2, 238, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 12, 107, + 180, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, + 52, 87, 193, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 56, 70, 62, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 12, 52, 21, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 169, 131, 44, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 81, 172, 168, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 243, 117, 54, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 146, 4, 154, 16, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 191, 254, 208, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 33, 36, 54, + 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 201, 215, 127, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 242, 28, 151, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 55, 37, 43, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 90, 175, 210, 217, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 67, 27, + 252, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 182, 147, 96, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 16, 186, 189, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 188, 152, 93, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 112, 153, 133, 157, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 134, 193, 248, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 244, 164, 92, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 147, 159, 247, 81, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 96, 254, 163, 13, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 144, 182, 64, 153, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 103, 78, 57, 80, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 135, 210, 222, 45, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 140, 245, 82, 222, 192, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 143, 30, 107, 193, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 15, + 242, 167, 22, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 143, 243, 61, 252, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 114, 87, 69, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 88, 127, 167, 237, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 73, 27, 156, + 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 164, + 64, 4, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 55, 106, 218, 239, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 159, 50, 40, 233, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 136, 19, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 144, 56, 149, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 143, 120, 27, 192, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 171, 2, 143, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 199, 36, 206, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 217, 11, 123, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 65, 173, + 14, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 77, 153, 37, 147, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 207, 73, 207, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 177, 16, 189, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 15, 86, 22, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 2, 55, 34, 61, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 139, 253, 231, 193, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 25, 77, 107, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 150, 216, 75, 158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 58, 104, 66, 86, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 190, 239, 97, 209, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 36, 76, 37, 2, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 242, 217, 168, 25, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 124, 152, 199, 188, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 134, 221, 207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 189, 59, 123, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 22, 157, 116, 131, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 161, 208, 107, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 82, 72, 45, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 224, 216, 169, + 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 28, + 58, 8, 90, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 189, 73, 56, 44, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 140, 80, 120, 174, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 239, 150, 20, 150, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 112, 151, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 165, 105, 116, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 119, 183, 246, 231, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 5, 175, 49, 224, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 145, 4, 239, 97, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 83, 248, + 153, 1, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, + 24, 117, 146, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 179, 58, 132, 178, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 114, 198, 109, 12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 255, 13, 52, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 218, 49, 245, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 242, 229, 196, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 52, 93, 163, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 192, 40, 111, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 65, 81, + 243, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 82, 175, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 190, 130, 188, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 214, 174, 72, 250, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 147, 49, 138, 69, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 140, 227, 91, 243, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 168, 214, 84, 188, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 193, 33, 247, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 248, 135, 53, 222, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 41, 237, 40, 95, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 250, 109, 48, 124, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 224, 53, 176, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 213, 168, 102, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 131, 132, 171, 3, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 146, 19, 67, 195, 98, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 145, 64, 180, 195, 78, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 73, 34, 194, 20, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 30, 216, 29, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 133, 56, 106, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 147, 121, 250, 186, 90, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 140, 223, 166, 224, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 3, 26, 238, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 113, 33, 211, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 170, 143, 8, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 250, 163, 13, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 133, 66, 204, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 137, 139, 54, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 126, 148, 188, 211, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 201, 240, 250, + 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 81, 211, 213, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 132, 169, 236, 39, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 168, 87, 176, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 185, 32, 64, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 143, 174, 194, 180, 68, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 165, 30, 155, 65, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 161, 48, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 205, 68, 208, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 177, 244, 252, + 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 244, 125, 150, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 133, 116, 241, 238, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 117, 67, 99, 165, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 77, 44, 70, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 90, 29, 109, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 3, 199, 1, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 97, 158, 145, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 198, 16, 12, 108, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 98, 111, 31, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 46, 72, 127, 23, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 110, 88, 147, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 64, 61, 160, 242, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 250, 80, 141, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 217, 21, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 229, 5, 1, 119, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 200, 248, + 239, 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, + 209, 209, 241, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 91, 67, 128, 33, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 80, 202, 103, 27, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 224, 72, 157, 42, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 34, 212, + 202, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 137, 55, 178, 20, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 97, 86, 251, 15, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 97, 56, 219, 138, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 190, 22, 20, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 222, 166, 236, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 63, 227, 37, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 187, 170, 225, 76, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 98, 92, 99, 215, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 19, 55, 105, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 140, 53, 180, 163, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 104, 162, 171, 246, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 138, 145, 233, 220, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 192, 90, 232, 165, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 239, 112, 117, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 93, 241, 144, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 113, 20, 93, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 84, 212, 220, 67, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 62, 59, 8, + 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 57, 7, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 24, 20, 251, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 2, 140, 148, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 162, 210, 9, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 145, 111, 171, 176, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 192, + 25, 203, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 186, 78, 123, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 0, 249, 211, 144, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 18, 59, 185, 72, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 5, 1, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 53, 85, 209, 244, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 29, 228, 13, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 113, 44, 86, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 44, 111, 207, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 142, 1, 83, 111, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 246, 67, + 35, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 182, 222, 14, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 47, 52, 178, 15, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 79, 136, 168, 217, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 156, 62, 10, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 103, 133, 192, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 169, 178, 26, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 102, 233, 226, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 119, 164, 70, 186, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 80, 180, 93, + 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 246, 249, 163, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 235, 85, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 68, 236, 116, 236, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 50, 111, 177, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 242, 233, 94, 191, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 247, 226, 72, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 42, 251, 128, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 130, 53, 17, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 187, 15, 50, + 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 208, 8, 194, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 209, 95, 43, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 119, 3, 228, 4, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 143, 240, 9, 26, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 174, 174, 39, + 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 203, 234, 86, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 151, 193, 140, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 154, 21, 238, 143, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 181, 147, 20, 40, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 141, 196, 118, 231, 59, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 56, 171, 131, 223, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 10, 184, 201, 180, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 67, 30, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 30, 122, 191, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 146, 117, 20, 26, 14, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 206, 80, 62, 57, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 49, 216, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 3, 177, 24, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 134, 192, 96, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 146, 93, 214, 71, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 142, 226, 247, 44, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 137, 191, 182, 104, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 59, 162, 222, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 202, 95, 250, 24, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 219, 111, 137, 70, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 146, 88, 142, 38, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 205, 161, 39, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 199, 79, 242, 128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 77, 20, 184, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 83, 171, 10, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 183, 232, 188, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 254, 49, 67, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 147, 105, 221, 51, 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 144, 56, 22, 79, 97, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 147, 226, 41, 211, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 219, 155, 127, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 53, 9, 236, 33, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 192, 100, 235, 160, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 87, 78, 135, 182, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 2, 9, 213, 153, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 47, 70, 197, 145, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 206, 23, 80, 170, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 35, 186, 214, 248, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 76, 104, 222, 215, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 51, 58, + 211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 93, 21, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 235, 35, 79, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 150, 107, 134, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 80, 200, + 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 210, 67, 82, 113, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 13, 4, 61, 173, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 146, 217, 42, 236, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 29, 3, 109, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 107, 13, 81, 130, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 7, 10, 144, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 227, 146, 232, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 216, 161, 247, 190, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 142, 89, 8, 233, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 123, 184, + 153, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 249, 95, 116, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 80, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 134, 9, 105, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 211, 153, 167, + 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 168, + 42, 229, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 218, 156, 127, 30, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 196, 23, 183, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 59, 143, 94, 250, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 146, 185, 189, 180, 252, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 145, 147, 51, 121, 180, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 211, 166, 128, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 205, 236, 185, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 77, 203, 20, 234, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 145, 130, 172, 31, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 106, 182, 142, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 130, 115, 228, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 214, 129, 74, 64, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 174, 142, 223, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 45, 73, 211, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 141, 142, 194, 28, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 62, 98, 254, 192, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 237, 43, 158, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 43, 112, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 125, 164, 132, 135, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 213, 120, 200, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 40, 146, 115, 183, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 235, 230, 221, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 55, 37, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 87, 150, 55, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 143, 254, 245, 140, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 49, 191, 72, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 108, + 107, 89, 125, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 142, 117, 255, 68, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 14, 253, 201, 192, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 28, 93, 74, 116, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 156, 150, 130, + 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 100, 147, 199, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 34, 253, 85, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 135, 224, 104, 158, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 101, 199, 244, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 37, 183, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 88, 18, 182, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 194, 225, 237, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 147, 239, 59, 33, 99, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 142, 28, 206, 202, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 224, 144, 111, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 234, 241, 187, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 161, 194, 29, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 205, 112, 253, 133, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 34, 124, + 135, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 208, 137, 178, 216, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 111, 112, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 42, 230, 153, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 180, 91, 165, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 148, 94, 68, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 110, 163, 91, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 211, 59, 159, 14, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 41, 249, 46, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 168, 212, 10, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 145, 173, 203, 242, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 89, 45, 78, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 142, 146, 216, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 13, 67, 50, 86, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 220, 124, 0, 99, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 77, 174, 137, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 18, 33, 180, 31, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 144, 104, 215, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 146, 133, 29, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 48, 212, 118, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 252, 177, 178, 39, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 63, 7, 6, 206, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 161, 9, 100, 253, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 199, 119, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 82, 128, 144, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 142, 202, 79, 223, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 82, 167, 40, 24, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 84, 37, 152, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 188, 133, 204, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 145, 194, 210, 254, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 147, 206, 124, 103, 82, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 59, 123, 134, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 16, 81, 181, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 138, 61, 20, 198, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 143, 210, 128, 210, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 154, 108, 175, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 216, 120, 169, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 117, 156, 68, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 28, 223, 172, 37, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 141, 251, 152, 164, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 104, 209, 4, 111, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 145, 8, 194, 73, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 87, 62, 188, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 134, 201, + 182, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 167, 53, 245, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 19, 182, 183, 21, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 4, 23, 135, 106, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 57, 64, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 243, 106, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 177, 131, 224, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 236, 224, 74, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 87, 20, 150, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 143, 144, 42, 126, 149, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 144, 216, 220, 45, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 193, 72, 161, 188, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 3, 30, 227, 221, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 39, 24, 13, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 172, 225, 134, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 205, 68, 51, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 129, 160, 247, 67, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 141, 120, 222, 133, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 143, 85, 181, 18, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 99, 60, 80, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 233, + 119, 223, 167, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 144, 11, 229, 119, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 135, 108, 248, 57, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 240, 175, 90, 108, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 193, 63, 217, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 36, 229, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 209, 17, 65, 111, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 142, 227, 102, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 243, 152, 25, + 155, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 29, + 64, 31, 40, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 143, 128, 50, 166, 26, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 166, 207, 152, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 204, 145, 56, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 146, 178, 76, 100, 240, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 140, 192, 202, 99, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 145, 26, 237, 25, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 37, 159, 18, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 45, 248, 173, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 56, 25, 249, 70, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 108, 210, 183, 154, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 110, 125, 134, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 238, 93, 201, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 50, 1, 213, 190, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 226, 238, 254, 61, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 248, 154, 74, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 239, 94, 236, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 39, 251, 173, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 124, 251, 229, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 106, 41, 152, 126, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 140, 229, 30, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 147, 53, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 86, 101, 231, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 174, 227, 65, + 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 211, + 10, 115, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 141, 87, 104, 79, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 131, 253, 165, 195, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 255, 105, 194, 106, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 158, 109, + 126, 79, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, + 251, 84, 194, 20, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 145, 177, 156, 55, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 139, 52, 34, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 210, 208, 243, + 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 57, + 92, 21, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 216, 6, 150, 235, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 239, 152, 225, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 233, 35, 253, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 16, 26, 254, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 45, + 104, 42, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 145, 145, 120, 227, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 216, 54, 4, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 164, 183, 247, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 205, 115, 52, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 136, 213, 224, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 182, 242, 194, 149, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 219, 45, 64, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 214, 43, 61, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 214, 131, 82, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 21, 168, 105, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 140, 158, 107, 177, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 214, 233, 167, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 104, 97, + 206, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, + 183, 86, 236, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 143, 168, 225, 240, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 145, 214, 113, 107, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 142, 213, 215, 234, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 143, 198, 178, 252, 212, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 131, 87, 141, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 85, 198, 194, 106, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 221, 63, 224, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 77, 133, 41, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 254, + 113, 26, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 89, 61, 240, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 33, 66, 57, 217, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 49, 90, 185, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 66, 226, 11, 239, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 143, 62, 176, 114, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 7, 88, 84, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 12, 22, 235, 26, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 144, 252, 70, 109, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 144, 243, 177, 63, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 15, 63, 217, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 140, 39, 52, 146, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 63, 12, 210, 154, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 160, 78, 234, 104, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 129, 216, 212, 187, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 158, 10, 92, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 170, 49, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 146, 55, 211, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 142, 154, 198, 145, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 144, 59, 177, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 62, 196, 52, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 22, 128, 5, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 254, 172, 125, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 144, 87, 190, 171, 67, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 78, 217, 53, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 16, 167, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 71, 204, 126, 73, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 147, 53, 167, 71, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 226, 37, + 100, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 43, 61, 68, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 47, 51, 89, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 75, 67, 206, 120, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 105, 123, 198, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 191, 173, 43, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 207, 136, 18, 120, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 142, 129, 143, 47, 105, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 216, 107, 236, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 153, 12, + 168, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 219, 163, 107, 71, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 172, 221, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 240, 87, 231, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 142, 3, 192, 116, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 110, 195, 142, 224, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 143, 8, 207, 163, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 147, 162, 41, 182, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 224, 197, 18, + 112, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 237, + 212, 25, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 233, 11, 64, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 183, 50, 249, 233, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 87, 134, 24, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 172, 25, 252, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 82, 106, 193, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109, 171, 66, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 216, 52, 147, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 202, 242, 48, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 198, 163, + 83, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, + 207, 252, 12, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 208, 178, 208, 225, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 104, 86, 200, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 203, 230, 223, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 247, 137, 223, 193, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 240, 243, 55, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 141, 64, 215, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 153, 99, 187, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 173, 81, 58, 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 144, 225, 145, 114, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 53, 76, 130, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 215, 148, 114, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 240, 156, 67, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 250, 151, + 216, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 249, 64, 26, 3, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 188, 139, 36, 247, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 88, 142, 195, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 113, 41, 203, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 38, 154, 125, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 99, 197, 63, 23, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 141, 85, 210, 43, 194, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 147, 110, 156, 212, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 190, 152, 54, + 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 73, 182, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 130, 56, 50, 195, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 20, 92, 81, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 212, 63, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 190, + 161, 30, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 143, 209, 63, 53, 2, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 143, 62, 113, 144, 188, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 145, 83, 68, 132, 242, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 147, 123, 73, 236, 85, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 146, 174, 53, 184, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 69, 2, 71, 54, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 144, 107, 181, 47, 71, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 138, 14, 196, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 121, 96, 49, 157, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 6, 128, + 197, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 102, 194, 96, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 26, 29, 131, 193, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 90, 199, 67, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 247, 250, 6, 71, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 213, 123, 26, 4, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 17, 108, 251, 78, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 169, 200, 180, 102, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 144, 115, 201, 60, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 181, 128, 39, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 52, 95, 252, 163, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 48, 77, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 102, 50, 158, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 37, 128, 138, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 157, 56, 174, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 47, + 88, 86, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 139, 18, 42, 177, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 181, 31, 242, 100, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 218, 170, 112, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 99, 116, 163, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 163, 5, 118, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 26, 222, 18, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 58, 4, 107, 131, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 227, 173, 153, 96, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 216, 209, 49, 37, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 106, 208, 205, 192, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 189, 155, 133, 83, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 223, 117, 122, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 60, 26, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 134, + 170, 153, 132, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 140, 200, 179, 173, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 112, 88, 218, 130, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 254, 253, 213, 73, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 17, 168, 69, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 12, 44, 230, 133, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 121, 104, 131, 117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 249, 167, 69, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 39, 25, 19, 49, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 146, 51, 187, 212, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 218, 241, 207, 148, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 160, 135, 73, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 144, 162, 210, 219, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 143, 86, 9, 89, 215, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 145, 11, 35, 185, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 97, 48, 204, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 208, 24, 230, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 225, 97, 42, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 119, 67, + 202, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 133, 70, 228, 48, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 145, 11, 19, 61, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 147, 33, 200, 240, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 91, 249, 38, 235, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 6, 198, 157, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 192, 210, 219, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 225, 197, 177, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 119, 101, 143, 237, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 200, 196, 23, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 132, 28, 92, 54, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 158, 225, 179, 168, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 5, 149, 240, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 32, 22, 140, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 52, 86, 151, + 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 61, 86, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 102, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 164, 56, 67, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 106, 68, 237, 147, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 212, 200, 145, 132, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 125, 150, 130, 85, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 17, 1, 177, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 175, 40, 105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 22, 77, 209, 95, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 147, 167, 96, 75, 139, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 144, 203, 134, 102, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 45, 93, 59, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 211, 186, 23, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 65, 7, 204, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 214, 29, 249, 254, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 146, 3, 164, 38, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 175, 25, 41, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 211, 165, 81, 90, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 101, 247, 106, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 115, 13, 167, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 1, 92, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 145, 56, 70, 57, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 147, 91, 212, 129, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 189, 150, 70, 110, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 242, 243, + 232, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 193, 210, 203, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 187, 230, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, 53, 32, 107, 130, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 73, 65, 76, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 0, + 156, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 173, 49, 184, 92, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 9, 196, 176, 57, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 237, 145, 68, 161, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 4, 16, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 180, 162, 204, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 221, 201, 56, 179, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 220, 38, 102, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 203, 247, 219, 201, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 152, 94, 182, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 71, 167, 221, 50, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 68, 95, 31, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 92, 20, 250, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 188, 220, 127, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 226, 130, 62, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 108, + 63, 115, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 248, 200, 207, 116, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 168, 148, 226, 132, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 153, 8, 63, 129, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 70, 99, + 121, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, + 141, 54, 160, 187, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 32, 113, 99, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 227, 73, 146, 103, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 32, 252, 188, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 113, 3, 78, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 214, 86, 143, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 174, 84, 76, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 228, 93, 224, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 139, 89, 50, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 212, 12, 151, 237, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 81, 172, 30, 13, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 147, 55, 231, 149, 227, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 147, 154, 18, 246, 57, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 123, 39, 138, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 208, 115, 191, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 191, 154, 9, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 233, 14, 19, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 253, + 93, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, + 226, 66, 197, 33, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 145, 211, 180, 200, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 142, 8, 203, 111, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 114, 47, 219, 144, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 247, 72, 234, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 93, 138, 102, 182, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 134, 80, 122, 208, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 50, 120, 65, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 109, 241, 110, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 94, 86, + 43, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, + 150, 80, 253, 95, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 141, 245, 31, 171, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 254, 8, 120, 106, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 149, 174, 120, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 233, 197, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 196, 6, 169, 60, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 213, 30, 131, 13, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 252, 187, 36, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 48, 59, 154, 239, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 214, 76, 41, 179, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 186, 50, 170, 224, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 138, 136, 176, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 101, 207, 232, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 34, 88, + 15, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, + 170, 125, 197, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 144, 150, 158, 53, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 140, 161, 19, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 137, 228, 114, + 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 224, + 35, 55, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 145, 33, 243, 194, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 117, 103, 94, 16, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 137, 201, 5, 90, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 122, 171, 44, + 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 232, + 129, 57, 39, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 233, 2, 189, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 87, 137, 73, 134, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 147, 122, 98, 200, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 52, 30, 252, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 97, 2, 2, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 99, 206, 185, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 13, 75, 200, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 212, 49, 170, 127, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 192, 143, 21, + 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 138, 96, 103, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 189, 197, 77, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 1, 66, 149, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 147, 24, 185, 7, 5, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 141, 43, 154, 194, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 143, 99, 250, 105, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 141, 25, 233, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 199, 39, 25, 143, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 210, 154, 173, 245, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 151, 135, 251, 121, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 62, 67, 112, 139, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 206, 71, 92, 149, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 252, 143, 120, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 49, 144, 91, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 239, 171, 36, 35, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 226, 9, 77, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 45, 227, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 181, 85, 206, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 23, 248, 38, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 141, 160, 10, 93, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 114, 254, 225, 14, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 50, 209, 57, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 186, 85, 186, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 224, 135, 150, + 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 210, 202, 88, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 77, 126, 78, 100, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 252, 71, 5, 226, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 44, 15, 107, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 146, 242, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 95, + 253, 92, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 216, 230, 187, 111, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 144, 190, 76, 11, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 5, 59, 70, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 173, 250, 72, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 96, 85, 17, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 252, 247, 175, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 145, 170, 40, 244, 37, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 143, 252, 1, 125, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 145, 41, 130, 51, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 68, 188, 228, 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 140, 74, 249, 7, 109, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 142, 63, 226, 4, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 249, 85, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 185, 228, 126, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 75, 225, 172, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 40, 0, 244, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 160, 58, 12, 8, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 142, 254, 211, 243, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 147, 7, 121, 212, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 219, 86, 9, 201, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 153, 235, 16, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 140, 205, 34, 161, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 188, 214, 162, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 110, 159, 246, 120, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 94, 140, 47, 207, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 107, 225, 62, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 6, 23, 210, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 131, 183, 62, 89, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 163, 199, 73, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 116, 170, 167, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 149, 75, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 103, 130, + 18, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 7, + 157, 111, 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 145, 195, 8, 11, 231, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 139, 242, 252, 24, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 138, 130, 175, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 203, + 68, 197, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, + 94, 29, 37, 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 146, 98, 252, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 162, 170, 122, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 247, 239, 227, + 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 115, + 66, 99, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 176, 164, 249, 253, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 47, 210, 16, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 158, 174, 248, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 84, 27, + 62, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 179, 255, 30, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 135, 67, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 186, 137, 166, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 73, 72, 192, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 136, 149, 99, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 178, 39, 235, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 30, 197, 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 187, 157, 227, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 129, 40, + 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 182, 175, 192, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 242, 183, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 71, 105, 176, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 68, 57, 5, 58, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 165, 211, + 143, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 243, 99, 91, 51, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 241, 247, 234, 230, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 193, 18, 146, 125, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 196, 171, 98, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 234, 188, 74, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 163, 181, 108, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 159, 94, 57, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 197, 125, 228, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 25, 68, 217, 174, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 244, 28, 32, 78, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 130, 181, 209, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 74, 174, 226, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 18, 133, 50, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 228, 119, 133, 80, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 166, 231, 88, 63, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 211, 254, 187, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 213, 146, 211, 36, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 250, 22, 185, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 247, 45, 41, 18, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 74, 94, 168, 66, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 202, 242, 68, 67, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 216, 98, 170, 235, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 128, 226, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 10, 53, 105, 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 26, 128, 125, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 213, 249, 143, 247, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 179, 245, 134, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74, 170, 147, 157, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 77, 75, 234, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 144, 204, 119, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 147, 70, 218, 230, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 142, 242, 15, 182, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 196, 77, 165, + 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 31, + 51, 111, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 92, 0, 254, 44, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 92, 146, 16, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 86, 7, 160, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 156, 43, 211, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 144, 50, 228, 196, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 174, 253, 252, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 39, 205, 163, 237, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 158, 14, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 98, 167, 162, 207, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 174, 248, 11, 241, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 179, 70, 116, 124, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 126, 87, 163, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 58, 55, 33, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 141, 134, 8, 9, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 172, 44, 236, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 153, 100, 52, 163, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 112, 83, 91, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 43, 56, 21, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 196, 216, 72, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 108, 193, 145, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 150, 148, 105, 214, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 174, 245, 238, 235, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 111, 137, 50, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 136, 216, 9, 140, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 216, 247, 61, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 88, 144, 183, 174, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 217, 122, 142, 39, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 250, 55, 192, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 149, 35, 171, 248, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 96, 225, 109, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 28, 76, 204, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 232, 243, + 151, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 207, 88, 96, 93, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 71, 200, 193, 185, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 155, 23, 162, 153, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 143, 231, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 187, 150, 242, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 183, 15, 190, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 25, 125, 79, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 124, 215, 182, 103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 231, 117, 127, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 165, 231, 147, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 163, 242, 144, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 18, 126, 40, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 123, 138, 87, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 29, 210, 114, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 8, 38, 42, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 147, 124, 180, 193, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 227, 232, 165, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 211, 85, + 222, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 130, 129, 78, 132, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 41, 167, 80, 225, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 172, 247, 86, 63, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 135, 180, 102, + 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 85, 8, + 207, 189, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, + 187, 100, 91, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 82, 240, 20, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 130, 99, 76, 211, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 232, 138, 36, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 110, 75, 179, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 154, 226, 167, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 254, 230, 61, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 131, 135, 181, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 78, 211, 235, + 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 231, 21, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 57, 123, 123, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 67, 151, 31, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 245, 182, 6, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 141, 134, 66, 90, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 237, 37, + 59, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 237, 61, 124, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 239, 164, 6, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 110, 79, 37, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 195, 91, 164, + 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 100, 236, 162, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 93, 222, 177, 229, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 211, 123, 183, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 28, 76, 239, 161, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 144, 47, 138, 137, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 219, 155, 199, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 143, 95, 30, 233, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 175, 24, 123, 212, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 207, 144, 115, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 118, 60, 1, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 61, 91, 246, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 143, 150, 26, 207, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 191, 176, 99, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 159, 1, + 244, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, + 202, 195, 203, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 140, 235, 17, 67, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 174, 39, 219, 172, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 154, 219, 152, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 109, 202, 21, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 36, 32, 115, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 25, 122, 231, 66, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 147, 237, 209, 81, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 124, 217, 185, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 149, 47, 125, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 145, 23, 127, 189, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 114, 32, 142, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 206, 219, 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 29, 86, 60, 90, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 229, 246, 133, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 80, 19, 102, 246, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 223, 255, 152, 226, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 133, 39, 15, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 93, 130, 197, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 43, 181, 66, 86, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 229, 220, 91, 21, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 135, 63, 248, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 18, 149, 14, 96, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 210, 61, 80, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 84, 135, 175, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 165, 100, 122, 120, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 80, 139, 72, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 16, 11, 101, 128, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 197, 207, 210, 219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 51, 91, 51, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 34, 46, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 145, 225, 94, 231, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 61, 26, 16, 30, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 145, 172, 118, 55, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 89, 18, 6, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 245, 243, 200, 29, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 215, 78, 14, + 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 75, + 204, 233, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 109, 25, 48, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 231, 110, 248, 160, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 233, 35, 218, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 119, 138, 14, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 213, 70, 39, 23, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 145, 208, 43, 185, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 95, 199, 121, 87, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 207, 4, 85, + 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 155, + 194, 43, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 73, 92, 45, 154, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 186, 100, 37, 31, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 179, 216, 247, 200, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 35, 64, 52, 191, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 27, 241, 97, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 36, 213, 143, 251, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 43, 219, 100, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 251, 211, 117, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 212, 213, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 26, 42, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 160, 50, 203, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 79, 39, 57, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 11, 187, 71, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 44, 47, 214, + 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 210, 150, 65, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 20, 217, 109, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 220, 70, 207, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 143, 35, 248, 4, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 120, 18, 192, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 32, 17, 169, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 26, 124, 230, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 106, 35, 51, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 173, 20, + 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 250, + 202, 135, 244, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 74, 163, 190, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 15, 160, 4, 140, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 77, 13, 214, 32, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 132, 252, 107, 120, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 150, 82, 128, 11, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 253, 153, 100, 175, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 198, 28, 71, 223, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 12, 118, 144, 227, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, 5, 99, 227, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 57, 142, 47, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 48, 15, 131, 203, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 163, 30, 32, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 7, 58, 107, 212, 89, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 146, 170, 72, 2, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 139, 96, 169, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 127, 52, 114, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71, 70, 0, 94, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 141, 240, 221, 31, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 35, 168, 229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 249, 25, 152, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 226, 117, 117, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 155, 224, 221, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 108, 33, 154, 73, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 146, 162, 105, 114, 53, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 79, 177, 146, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 116, 216, 250, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 148, 64, 62, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 84, 143, 213, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 142, 99, 2, 231, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 161, 160, 18, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 174, 143, 68, 49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 74, 29, 4, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 58, 247, 65, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 230, 14, 183, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 238, 63, 71, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 138, 5, 2, 93, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 118, 202, 252, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 94, 121, 202, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 195, 55, 14, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 230, 13, 61, 110, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 111, 234, 221, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 242, 192, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 124, + 121, 175, 24, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 144, 242, 16, 59, 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 146, 255, 142, 188, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 215, 201, 190, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 222, 112, + 182, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 113, 18, 39, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 88, 219, 233, 180, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 239, 185, 249, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 237, 148, 115, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 24, 2, 148, 2, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 147, 26, 207, 94, 250, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 145, 181, 60, 89, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 239, 181, 208, 186, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 15, 226, 165, 222, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 163, 100, 126, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 170, 72, 214, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 117, 10, 109, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 116, 221, 244, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 197, 107, 75, 205, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 211, 129, 105, 105, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 90, 109, 21, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 147, 176, 194, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 202, 22, 52, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 208, 18, 188, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 143, 202, 182, 37, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 175, 6, 225, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 158, 21, 52, 213, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 2, 239, 177, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 9, 184, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 163, 40, 85, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 144, 130, 16, 127, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 141, 62, 41, 66, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 196, 110, 242, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 219, 50, 33, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 35, 42, 119, 197, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 118, 99, 171, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 120, 88, 246, 227, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 175, 46, 92, 51, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 128, 168, 214, 192, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 255, 9, 125, 212, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 191, 159, 12, 161, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 8, 41, 197, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 227, 219, 230, 141, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 139, 247, 25, 55, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 118, 163, 245, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 208, 134, 42, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 237, 218, + 10, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 64, 79, 239, 136, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 169, 204, 245, 122, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 219, 247, 63, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 24, 140, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, + 102, 57, 189, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 140, 58, 176, 144, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 175, 87, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 192, 66, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 205, 16, 161, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 183, 88, 174, 53, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 146, 46, 32, 139, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 8, 16, 172, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 133, 240, 9, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 217, 96, 200, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 141, 220, 210, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 37, 201, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 232, 119, 218, 49, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 165, 87, 108, 103, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 170, 175, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 142, 47, 211, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 44, 220, 11, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 146, 7, 249, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 194, 94, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 210, 1, 7, 18, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 239, 7, 139, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 217, 68, 100, 78, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 147, 178, 235, 49, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 145, 96, 30, 254, 141, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 141, 4, 176, 168, 113, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 125, 71, 252, 12, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 206, 240, 4, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 233, 73, 193, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 99, 22, 210, + 3, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 93, + 226, 200, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 147, 175, 13, 237, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 41, 207, 166, 226, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 238, 170, 57, 172, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 44, 138, + 6, 8, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 68, + 192, 17, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 179, 83, 31, 85, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 73, 146, 45, 108, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 250, 156, 161, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 231, 3, 56, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 234, 213, 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 204, 190, 238, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 10, 190, 42, 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 118, 197, 151, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 235, 114, 40, 76, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 22, 43, 223, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 225, 246, 79, 142, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 219, 136, 110, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 109, 50, 135, 119, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 34, 118, 194, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 228, 33, 27, 207, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 113, 76, 139, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 206, 216, 158, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 166, 255, + 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 48, 158, 20, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 220, 32, 128, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 206, 170, 246, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 143, 210, 24, 78, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 70, + 168, 146, 62, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 72, 20, 232, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 141, 36, 220, 150, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 48, 56, 230, 150, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 198, 251, 97, 45, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 136, 153, 36, 40, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 69, 205, 233, 15, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 31, 185, 191, 189, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 38, 115, 127, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 128, 207, 41, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 251, 147, 131, 35, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 84, 115, 36, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 156, 242, 178, 132, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 142, 38, 8, 130, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 144, 85, 120, 156, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 248, 0, 157, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 131, 205, 197, 158, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 214, 156, 9, 182, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 155, 128, 218, + 201, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 1, + 57, 43, 85, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 145, 214, 154, 196, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 102, 41, 5, 75, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 186, 125, 97, 95, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 117, 249, 225, + 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 145, + 152, 162, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 202, 116, 64, 74, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 86, 173, 138, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 254, 40, 41, 17, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 147, 219, 220, 133, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 118, 190, 168, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 150, 159, 253, 250, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 67, 210, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 218, 18, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 133, + 247, 99, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 127, 83, 217, 163, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 51, 101, 23, 66, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 8, 47, 142, 71, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 243, 149, 116, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 58, 231, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 20, 218, 45, 123, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 143, 247, 92, 167, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 49, 57, 0, 135, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 153, 74, 167, 201, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 40, 21, 214, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 241, 179, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 108, 29, 184, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 190, 243, 21, 104, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 22, 204, 207, 115, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 102, 52, 99, 155, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 226, 120, 253, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 67, 14, 159, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 64, 110, 28, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 118, 223, 132, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 106, 55, 249, 26, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 100, 191, 18, 138, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 165, 247, 11, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 237, 122, + 2, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 255, 115, 160, 21, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 65, 175, 102, 239, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 156, 218, 152, 180, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 108, 84, 189, 204, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 126, 145, 95, 33, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 109, 244, 80, 83, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 70, 0, 252, 158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 156, 80, 134, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 220, 43, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 250, 80, + 54, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 66, 104, 182, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 110, 83, 208, 53, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 175, 88, 243, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 118, 195, 79, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 100, 178, 28, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 193, 162, 102, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 247, 91, 152, 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 142, 139, 35, 72, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 144, 92, 55, 38, 247, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 142, 108, 33, 105, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 98, 140, 109, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 77, 132, 234, 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 65, 17, 132, 242, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 123, 162, 28, 5, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 188, 135, 94, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 45, 187, 141, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 135, 16, 236, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163, 78, 157, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 98, 84, 19, 29, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 234, 181, 12, 83, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 57, 227, 254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 104, 121, 214, 52, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 143, 152, 78, 98, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 245, 87, + 225, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 245, 127, 231, 41, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 229, 208, 52, 134, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 74, 219, 227, 241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 33, 166, 120, 112, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 134, 102, 44, 29, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 248, 251, 210, 113, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 122, 249, 149, 36, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 111, 60, 156, 243, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 195, 226, 142, 21, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 82, 78, 229, 137, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 1, 90, 193, 75, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 99, 142, 123, 103, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 69, 107, 107, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 117, 117, 168, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 203, 39, 71, 164, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 224, 166, 160, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 224, 0, 240, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 141, 81, 167, 31, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 109, + 147, 101, 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 142, 72, 255, 189, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 120, 253, 219, 18, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 29, 243, 83, 210, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 34, 136, 14, 102, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 230, 122, 204, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 132, 41, 181, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 47, 165, 234, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 100, 235, 215, + 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 96, + 244, 85, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 76, 92, 133, 80, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 169, 244, 29, 202, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 128, 113, 172, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 221, 237, 249, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 69, 85, 24, 235, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 73, 123, 7, 139, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 144, 200, 205, 60, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 163, 184, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 18, 128, 37, 151, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 225, 88, 104, 38, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 123, 180, 122, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 147, 66, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 199, 139, + 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 103, 120, 124, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 198, 56, 115, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 250, 166, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 141, 160, 137, + 71, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 253, + 108, 114, 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 136, 169, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 45, 229, 45, 188, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 220, 192, 56, 74, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 13, 112, 53, 196, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 69, 158, 107, 59, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 192, 39, 255, 106, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 141, 76, 53, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 25, 157, 120, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 213, 57, + 139, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 180, 245, 233, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 144, 201, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 87, 204, 192, 150, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 146, 58, 13, 4, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 187, 69, + 173, 238, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, + 105, 108, 153, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 181, 203, 193, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 187, 96, 111, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 168, 34, 119, 247, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 142, 174, 137, 197, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 85, 15, 199, 157, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 141, 36, 197, 131, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 12, 40, 128, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 10, 0, + 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 122, 19, 46, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 3, 233, 106, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 249, 111, 157, 251, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 216, 211, 61, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 12, 28, 65, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 90, 142, 155, 75, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 50, 64, 25, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 69, 22, 203, 227, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 102, 59, 20, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 22, 123, 229, 159, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 115, 57, 91, 72, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 36, 167, 245, 216, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 104, 121, 246, 150, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 67, 70, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 152, 36, 106, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 134, 82, 9, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 137, 103, 12, 131, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 72, 187, 201, 87, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 169, 28, 160, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 18, 17, 52, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 207, 125, 119, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 15, 59, 196, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 255, 75, 47, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 0, 88, 172, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 74, 99, 105, 121, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 210, 118, 8, 224, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 247, 121, 207, 214, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 213, 75, 51, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 134, 80, 92, 148, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 255, 150, 148, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 229, 141, 241, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 229, 214, 47, 66, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 113, 241, 225, 167, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 214, 231, 214, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 208, 157, 164, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 27, 157, 214, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 252, 190, 29, 81, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 27, 12, 143, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 117, 53, 138, 86, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 59, 3, 255, 9, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 186, 89, 98, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 18, 35, 69, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 141, 234, 23, + 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 243, + 142, 169, 183, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 143, 31, 223, 251, 145, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 141, 92, 236, 89, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 158, 173, 179, 171, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 32, 91, 110, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 169, 34, 119, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 141, 213, 234, 94, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 202, 87, 4, 84, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 161, 102, 181, 104, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 89, 224, 227, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 88, 160, 90, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 118, 19, 250, 6, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 141, 150, 27, 192, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 216, 169, + 81, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 104, 46, 171, 146, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 11, 216, 120, 152, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 38, 208, 15, 247, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 141, 119, 138, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 45, 250, 34, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 42, 119, 247, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 122, 201, 220, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 143, 237, 160, 209, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 156, 159, 157, 2, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 147, 72, 204, 175, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 124, 61, 240, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 140, 246, 76, 174, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 46, 91, 180, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 179, 44, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 186, 124, 192, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 199, 43, 5, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 81, 37, 155, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 99, 143, 220, 72, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 183, 17, 51, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 180, 50, 180, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 114, 133, 225, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 116, 6, 46, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 37, 129, 47, 94, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 233, 0, 43, 158, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 189, 3, 120, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 215, 110, 220, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 175, 130, 255, 91, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 244, 40, 75, 179, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 147, 76, 213, 198, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 189, 2, 129, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 29, 152, 148, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 161, 231, 107, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 167, 97, 148, + 10, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 77, + 157, 212, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 214, 63, 206, 153, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 65, 56, 181, 144, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 26, 253, 21, 126, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 178, 155, 116, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 195, 87, 86, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 131, 17, 78, 99, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 142, 164, 45, 149, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 120, 125, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 255, 87, 45, 63, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 36, 30, 13, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 174, 117, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 76, 52, 62, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 46, 129, 20, 172, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 141, 60, 214, 12, 68, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 201, 18, 216, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 120, 147, 168, 115, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 218, 219, 170, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 254, 179, + 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 18, 63, 125, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 45, 146, 246, 129, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 158, 38, 130, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 59, 84, 214, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 195, + 215, 5, 31, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 141, 185, 2, 67, 126, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 140, 250, 185, 104, 205, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 47, 209, 156, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 195, 84, + 18, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 243, 168, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 144, 240, 204, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 16, 163, 123, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 142, 77, 103, 45, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 133, + 116, 192, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 144, 132, 21, 3, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 224, 38, 171, 121, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 62, 81, 44, 237, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 246, 25, 193, + 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 172, 135, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 154, 38, 213, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 196, 218, 203, 230, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 254, 113, 156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, + 188, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, + 207, 158, 62, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 140, 145, 144, 104, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 185, 166, 38, 76, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 60, 109, 139, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 149, 46, 83, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 140, 89, 147, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 200, 192, 1, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 198, 234, 14, 222, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 156, 176, + 18, 230, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 115, 107, 140, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 10, 113, 77, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 140, 179, 101, 57, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 22, 130, 143, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 75, 203, 72, 155, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 61, 227, 124, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 220, 10, 100, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 168, 162, 176, + 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 199, 158, 47, 164, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 79, 150, 206, 146, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 54, 158, 224, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 159, 69, 160, 121, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 26, 3, 192, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 112, 234, 39, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 192, 182, 54, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 134, 19, 135, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5, 97, 181, 219, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 118, 246, + 208, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 67, 133, 50, 110, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 238, 34, 210, 123, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 27, 70, 185, 238, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 95, 109, 174, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 217, 29, 150, 147, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 241, 223, 106, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 255, 255, 233, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 166, 23, 0, 15, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 235, 67, 238, + 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 45, + 148, 19, 103, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 35, 12, 241, 82, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 147, 161, 212, 124, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 48, 71, 179, 215, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 57, 82, + 246, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 59, 236, 245, 31, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 249, 195, 61, 120, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 238, 194, 220, 22, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 212, 96, 61, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 9, 2, 141, 205, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 106, 148, 213, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 219, 53, 84, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 60, 174, 3, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 156, 224, 103, 162, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 14, 237, 175, 5, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 65, 72, 32, 48, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 223, 28, 215, 145, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 172, 180, 61, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 50, 140, 125, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 208, + 37, 206, 17, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 140, 148, 234, 69, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 147, 238, 191, 46, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 117, 195, 106, 160, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 231, 40, + 1, 151, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, + 158, 155, 213, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 218, 208, 214, 112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 48, 45, 210, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9, 34, 96, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 240, 240, 114, 110, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 159, 165, 45, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 160, 68, 148, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 224, 121, 71, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 19, 206, 86, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 170, + 2, 93, 59, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, + 183, 191, 168, 105, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 140, 6, 142, 96, 152, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 141, 152, 215, 160, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 137, 122, 143, + 221, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 75, + 187, 123, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 141, 232, 14, 64, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 68, 32, 227, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 253, 194, 246, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 230, 202, 181, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 61, 214, 153, 182, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 72, 81, 199, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 203, 62, 242, 116, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 43, 174, 244, + 153, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 41, + 103, 230, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 220, 182, 172, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 225, 122, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 1, 131, 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 147, 199, 222, 229, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 227, 247, 110, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 14, 94, 55, 144, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 161, 161, 197, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 15, 13, 52, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 251, 186, 108, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 106, 188, 199, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 182, 242, 114, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 14, 42, 194, 80, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 40, 182, 136, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 140, 229, 18, 182, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 255, 203, 80, 42, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 65, 56, 77, 166, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 126, 52, 128, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 99, 171, 52, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 179, 235, 203, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 123, 200, 43, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 115, 103, 49, 230, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 107, 143, 6, 44, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 2, 219, 78, 121, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 77, 95, 136, 49, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 79, 74, 220, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 64, 87, 152, 93, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 158, 196, 93, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 34, 196, 247, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 77, 19, 121, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 60, 206, 70, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 154, 231, 236, 150, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 224, 7, + 198, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 150, 180, 134, 25, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 211, 62, 69, 50, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 53, 75, 30, 243, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 133, 94, 5, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 232, 162, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 242, 195, 56, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 152, 172, 126, 211, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 128, 248, 104, + 163, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 145, + 157, 47, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 220, 71, 157, 34, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 198, 191, 226, 252, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 97, 30, 176, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 62, 230, 121, 165, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 235, 164, 77, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 209, 84, 230, 4, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 30, 160, 177, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 175, 54, 91, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 25, 108, + 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 197, + 169, 180, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 34, 164, 150, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 141, 68, 213, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2, 99, 215, 153, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 76, 76, + 138, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 141, 228, 152, 18, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 24, 180, 100, 197, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 0, 64, 132, 157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 152, 48, 121, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 231, 40, 148, 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 167, 56, 157, 102, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 91, 217, 18, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 154, 40, 7, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 162, 129, 16, 54, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 141, 86, 211, 22, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 171, 80, 57, 194, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 143, 181, 6, 184, 248, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 143, 94, 49, 63, 52, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 69, 95, 152, 126, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 30, 39, 21, 217, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 102, 134, 58, 69, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, + 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 167, 227, 146, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 61, 127, 121, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 143, 1, 213, 86, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 73, 207, + 209, 109, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, + 134, 127, 22, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 69, 136, 216, 220, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 229, 85, 154, 131, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 246, 87, 64, 103, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 61, 129, + 193, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, + 36, 78, 219, 193, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 144, 29, 5, 253, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 185, 110, 132, 23, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 196, 33, 115, 182, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 72, 233, + 66, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 129, 1, 136, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 242, 18, 192, 92, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 62, 245, 99, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 126, 106, 1, 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 214, 36, 206, 179, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 146, 159, 66, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 239, 53, 58, 32, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 166, 139, 217, 236, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 2, 187, 182, 118, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 235, 71, 73, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 235, 25, 29, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 112, 138, 57, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 202, 236, 254, 161, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 215, 68, 249, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 95, 41, 130, 237, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 26, 50, 128, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 210, 208, 225, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 72, 77, 100, 10, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 80, 67, 177, + 195, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 103, + 90, 112, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 26, 51, 144, 89, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 128, 101, 241, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2, 139, 30, 241, 117, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 113, 58, 159, 127, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 142, 113, 138, 216, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 221, 250, 230, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 191, 211, 91, 201, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 31, 198, 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 195, 130, 188, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 171, 160, 243, 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 19, 54, 131, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 228, 232, 75, 80, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 145, 172, 97, 247, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 145, 80, 26, 169, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 226, 244, 104, 12, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 47, 181, 21, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 159, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 14, 244, 215, + 169, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 236, + 48, 113, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 59, 32, 67, 123, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 60, 226, 172, 46, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 65, 14, 220, 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 11, 201, 177, 253, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 120, 6, 45, 31, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 144, 9, 156, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 234, 80, 167, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 130, 190, 36, 107, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 140, 47, 67, 182, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 232, 193, 7, 131, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 29, 228, 100, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 227, 128, 123, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 20, 219, 146, 232, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 142, 27, 184, 217, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 69, 35, 147, 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 144, 248, 164, 65, 162, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 141, 79, 59, 4, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 171, 85, 12, 236, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 154, 183, + 87, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 235, 86, 35, 93, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 194, 73, 236, 128, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 207, 132, 21, 179, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 161, 167, 50, 146, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 64, 66, + 109, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 199, 168, 119, 29, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 11, 14, 128, 151, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 162, 212, 81, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 145, 128, 178, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 203, 10, 253, 249, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 238, 153, 34, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 220, 132, 210, 218, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 65, 205, 87, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 91, 29, 91, + 194, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 76, + 154, 174, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 6, 208, 6, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 162, 105, 15, 165, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 244, 113, 178, 205, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 160, 132, 222, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 10, 105, 111, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 222, 249, 200, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 31, 227, 190, 109, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 81, 225, 162, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 175, 108, 122, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 16, 179, 217, 196, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 156, 154, 204, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 76, 2, 251, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 179, 9, 35, 206, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 140, 174, 177, 118, 55, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 102, 254, 72, 241, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 46, 193, 204, 48, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 115, 126, 219, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 193, 217, 204, 36, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, + 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 89, 31, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 150, 238, 105, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 130, 74, 107, 15, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 141, 119, 104, 22, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 180, 251, 43, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 79, 186, 40, 132, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 149, 61, 172, 95, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 128, 55, 242, 119, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 172, 13, 161, 141, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 32, 18, 215, 41, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 48, 59, 98, 188, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 221, 158, 239, 193, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 95, 196, 71, 30, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 240, 186, 52, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 185, 192, 165, 192, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 49, 97, 59, 142, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 45, 147, 30, 43, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 37, 234, 47, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 72, 217, 150, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 239, 24, 228, 34, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 146, 122, 234, 41, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 121, 235, 172, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 98, 228, 69, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 216, 239, 231, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 175, 144, 74, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 85, 161, 12, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 140, 126, 42, 202, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 108, 201, + 228, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 234, 29, 111, 136, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 88, 242, 187, 38, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 200, 112, 165, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 173, 182, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 140, 54, 192, 120, 153, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 64, 53, 242, 105, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 128, 44, 123, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 169, 198, 21, 116, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 140, 70, 175, 0, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 144, 149, 208, 32, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 221, 190, 18, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 146, 9, 135, 111, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 239, 128, 126, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 138, 94, 211, + 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 238, 9, 109, 45, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 25, 100, 65, 69, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 242, 123, 101, 248, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 222, 43, 93, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 191, 231, 163, 157, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 141, 191, 233, 228, 181, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 171, 142, 240, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 187, 65, 106, 100, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 141, 60, 125, 101, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 58, + 197, 135, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 122, 4, 35, 213, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 238, 182, 44, 169, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 45, 136, 87, 124, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 249, 131, 145, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 245, 91, 198, 154, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 181, 56, 187, 116, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 190, 145, 202, 106, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 12, 67, 50, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 120, 163, 93, 30, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 244, 91, 120, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 152, 71, 212, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 87, 67, 136, 51, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 188, 1, 247, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 241, + 143, 134, 102, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 155, 138, 115, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 25, 190, 154, 159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 207, 195, 116, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 246, 116, 124, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 152, 242, 127, 50, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 255, 165, 158, 19, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 107, 166, 169, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 246, 20, + 207, 135, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, + 126, 125, 163, 59, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 144, 37, 225, 47, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 254, 21, 119, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 213, 90, 117, 227, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 21, 22, 66, 107, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 20, 218, 138, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 244, 82, 145, 108, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 176, 52, 125, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 175, 38, 155, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, + 61, 174, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 46, 68, 103, 68, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 15, 244, 171, 180, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 204, 149, 232, 15, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 219, 184, 140, + 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 254, 224, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 110, 42, 216, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 232, 200, 179, 178, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 89, 48, 133, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 202, 34, 232, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 78, 227, 125, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 94, 76, 175, 12, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 226, 241, 194, 107, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 3, 187, 156, 172, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 19, 103, 177, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 123, 236, 101, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 37, 84, 6, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, 148, 122, 1, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 72, 254, 187, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 226, 47, 114, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 179, 5, 164, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 83, 136, 45, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 73, 108, 189, 224, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 58, 37, + 226, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 66, 227, 144, 231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 218, 151, 122, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 250, 168, 125, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 226, 105, 65, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, + 24, 232, 184, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 109, 174, 198, 90, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 201, 0, 33, 212, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 200, 76, 129, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 176, 15, 114, 172, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 48, 135, 9, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 156, 207, 141, 240, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 145, 121, 143, 203, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 243, 121, + 125, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 82, 225, 222, 218, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 188, 255, 46, 140, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 101, 30, 174, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 173, 37, 199, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 33, + 202, 75, 175, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 143, 161, 173, 6, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 92, 6, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 78, 12, 67, 184, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 203, 245, 163, 169, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 203, 71, 194, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 183, 117, 45, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 218, 168, 218, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 214, 233, 1, + 143, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 114, + 49, 168, 220, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 100, 9, 247, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 126, 196, 100, 160, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 186, 8, 186, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 184, 169, 41, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 134, 190, 118, 98, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 146, 251, 196, 225, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 5, 33, 167, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 78, 138, 198, + 173, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 135, + 114, 109, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 85, 63, 198, 244, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 110, 125, 238, 176, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 107, 242, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 207, 237, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 140, 27, 146, 175, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 205, 122, 17, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 108, 214, 244, 132, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 249, 165, 249, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 232, 115, 117, 231, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 157, 231, 27, 57, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 237, 85, 102, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 85, 41, 43, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 146, 236, 100, 182, 185, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 136, 29, 77, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 219, 89, 205, 78, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 142, 138, 116, 249, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 62, 206, 5, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 242, 81, 68, 123, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 94, 247, + 85, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 133, 28, 230, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 108, 229, 239, 186, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 64, 1, 242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 216, 80, 197, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 148, + 1, 84, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 248, 126, 72, 150, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 16, 98, 93, 80, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 252, 67, 69, 21, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 175, 23, 81, 111, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 98, 214, + 247, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 178, 212, 210, 65, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 75, 55, 147, 184, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 112, 241, 57, 33, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 61, 43, 77, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 55, 15, 234, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 124, 222, 166, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10, 64, 214, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 33, 104, 69, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 32, 89, + 37, 27, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, + 54, 13, 157, 21, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 143, 47, 224, 164, 158, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 140, 148, 180, 175, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 144, 174, 119, 109, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 105, + 115, 150, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 188, 138, 195, 30, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 12, 42, 78, 162, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 214, 165, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 244, 169, 79, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 189, 150, 30, 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 45, 113, 201, 179, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 141, 170, 243, 91, 43, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 147, 114, 53, 54, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 12, + 146, 33, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 124, 84, 190, 79, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 174, 70, 72, 221, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 180, 183, 25, 233, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 100, 128, 183, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 209, 72, 13, 204, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 47, 42, 156, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 213, 150, 116, 255, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 146, 222, 47, 170, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 124, 234, 20, 5, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 242, 250, 31, 24, 48, 100, 78, 114, 225, 49, 160, + 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 232, 121, 246, 200, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 100, 153, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, + 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 68, 91, 33, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 23, 185, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 175, 10, 143, 243, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 144, 37, 214, 180, 252, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 140, 226, 5, 218, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 241, 149, 209, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 73, 207, 199, 247, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 153, 196, 134, 126, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 86, 185, 107, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 186, 197, 1, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 25, + 39, 38, 252, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 141, 80, 2, 135, 199, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 92, 225, 16, 209, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 146, 4, 107, 130, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 158, 42, + 200, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 107, 63, 135, 208, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 234, 108, 194, 59, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 88, 162, 54, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 112, 90, 33, 205, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, + 72, 121, 185, 112, 145, 67, 225, 245, 146, 208, 103, 111, 22, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, + 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 77, 197, 63, 63, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 46, 15, 142, 45, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 71, 131, 233, 166, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 212, 65, 247, 159, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 81, 81, 125, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 35, 194, 125, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 69, 54, 112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 223, 76, 237, 188, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 196, 39, 102, 153, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 75, 7, 192, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 199, 37, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 156, 246, 140, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 181, 36, 107, 52, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 19, 62, 224, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 12, 111, 225, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 74, 78, 200, 117, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 251, 166, 190, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 154, 114, 212, + 213, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 168, + 85, 57, 114, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 116, 87, 127, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 82, 115, 232, 180, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 180, 177, 208, 72, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, + 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 84, 139, 239, 176, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 230, 207, 186, 58, 48, 100, 78, 114, 225, 49, + 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 162, 52, 139, 141, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 219, 116, 72, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 176, 185, 234, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 212, + 209, 190, 12, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 167, 37, 36, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 18, 241, 90, 84, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 157, 107, 127, 177, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 176, 185, 196, + 133, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 44, + 165, 237, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 42, 205, 107, 87, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 207, 29, 213, 81, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 77, 221, 101, 199, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 50, 64, + 115, 46, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, + 56, 84, 126, 41, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 147, 148, 219, 102, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 141, 30, 74, 134, 156, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, + 112, 145, 67, 225, 245, 145, 91, 38, 195, 214, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 140, 17, 159, 241, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 221, 249, 203, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 166, 58, 90, 150, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 140, 54, 253, 220, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 201, 31, 187, 48, 100, 78, 114, 225, 49, 160, 41, + 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 227, 135, 124, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 134, 189, 204, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 187, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 25, 45, + 122, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 142, 126, + 47, 129, 200, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 146, 25, 124, 176, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 223, 27, 146, 231, 48, 100, + 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 140, 156, 180, 102, 245, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 183, 148, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 34, 200, 221, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 179, 227, 214, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 255, 216, 72, 222, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 86, 8, 211, + 74, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 141, + 221, 52, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 124, 120, 35, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 251, 73, 225, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 93, 244, 161, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 105, 48, 174, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 14, + 19, 26, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195, 145, 177, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 81, 88, 71, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 221, 153, 217, 16, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 142, 238, 243, 223, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 39, 87, 179, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 30, 181, 12, 52, 48, 100, 78, 114, + 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 20, 43, 48, 77, 48, 100, 78, + 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 122, 137, 160, 215, 48, + 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 215, 81, 56, + 37, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 143, 4, + 205, 244, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 32, 203, 4, 20, 48, 100, 78, 114, 225, + 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 212, 51, 44, 140, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 88, 128, 199, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 191, 12, 146, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 140, 216, 7, 28, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, + 245, 140, 131, 94, 243, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 253, 221, 176, 135, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 229, 20, 64, 48, 100, 78, 114, 225, 49, 160, 41, 184, + 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 67, 182, 164, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 210, 17, 244, 0, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, + 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 146, 231, 10, 15, 131, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, + 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 5, 141, 235, 146, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, + 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 147, 37, 134, 102, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 192, 85, 162, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 234, 222, 91, 19, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 146, 168, 105, 156, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 175, 69, 92, + 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 56, 73, 38, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 140, 70, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 169, 244, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 214, 43, 126, 153, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 71, 47, 249, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 236, 117, 124, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 174, 170, 84, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, + 67, 225, 245, 143, 201, 63, 19, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 131, 42, 220, 230, + 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 145, 165, 17, + 129, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 25, 44, 230, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 129, 163, 3, 137, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, + 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 141, 247, 244, 120, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 24, 144, 202, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, + 121, 185, 112, 145, 67, 225, 245, 142, 31, 172, 185, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 139, 140, 255, 132, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 144, 115, 22, 198, 101, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 140, 28, 34, 239, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 111, 62, 196, + 130, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, 144, 14, + 118, 143, 56, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, 225, 245, + 140, 37, 238, 199, 11, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, 145, 67, + 225, 245, 141, 238, 214, 13, 7, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, 185, 112, + 145, 67, 225, 245, 147, 101, 251, 49, 167, 48, 100, 78, 114, 225, 49, 160, 41, 184, 80, 69, 182, 129, 129, 88, 93, 40, 51, 232, 72, 121, + 185, 112, 145, 67, 225, 245, 143, 35, 19, 195, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 77, + 65, 92, 164 +] diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index dfdb6337d7..d63cbf399a 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -3,11 +3,10 @@ // This file is provided WITHOUT ANY WARRANTY; // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. - -import { describe, it, expect, beforeAll } from 'vitest' -import { Vote } from '../src/types' -import { MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, zeroVote } from '../src/constants' -import { generateMerkleProof } from '../src/utils' +import { describe, it, expect, beforeAll, beforeEach, afterEach, vi } from 'vitest' +import { Signature, Vote } from '../src/types' +import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, zeroVote } from '../src/constants' +import { extractSignatureComponents, generateMerkleProof } from '../src/utils' import { decodeTally, encryptVote, @@ -21,7 +20,8 @@ import { } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' -import { ECDSA_PRIVATE_KEY, LEAVES } from './constants' +import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, LEAVES } from './constants' +import previousCiphertextEncoded from './previous.json' describe('Vote', () => { let vote: Vote @@ -30,18 +30,40 @@ describe('Vote', () => { let address: string let slotAddress: string let publicKey: Uint8Array - let previousCiphertext: Uint8Array + let derivedSignatureComponents: Signature + + const e3Id = 0 + + const mockedPreviousCiphertextResponse = { + ciphertext: previousCiphertextEncoded, + } + + const mockedIsSlotEmptyTrueResponse = { + is_empty: true, + } + + const mockedIsSlotEmptyFalseResponse = { + is_empty: false, + } + + beforeEach(() => { + vi.clearAllMocks() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) // Setup the test environment. beforeAll(async () => { vote = { yes: 10n, no: 0n } signature = await signMessage({ message: SIGNATURE_MESSAGE, privateKey: ECDSA_PRIVATE_KEY }) + derivedSignatureComponents = await extractSignatureComponents(signature, SIGNATURE_MESSAGE_HASH) balance = 100n address = publicKeyToAddress(await recoverPublicKey({ hash: SIGNATURE_MESSAGE_HASH, signature })) // Address of the last leaf in the Merkle tree, used for mask votes. slotAddress = '0x145B2260E2DAa2965F933A76f5ff5aE3be5A7e5a' publicKey = generatePublicKey() - previousCiphertext = encryptVote(vote, publicKey) }) describe('decodeTally', () => { @@ -91,14 +113,19 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, address, LEAVES) + const sig = await extractSignatureComponents(signature, SIGNATURE_MESSAGE_HASH) + + const previousCiphertext = encryptVote(zeroVote, publicKey) + const crispInputs = await generateCircuitInputs({ vote, publicKey, - signature, + signature: sig, balance, slotAddress: address, merkleProof, isFirstVote: true, + previousCiphertext, }) const { returnValue } = await executeCircuit(crispInputs) @@ -122,12 +149,17 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, slotAddress, LEAVES) - const crispInputs = await generateCircuitInputsForMasking({ + // update to an invalid leaf to fail auth in the circuit + merkleProof.leaf = 0n + const crispInputs = await generateCircuitInputs({ publicKey, balance, slotAddress, - isFirstVote: true, - merkleRoot: merkleProof.proof.root, + isFirstVote: false, + merkleProof, + vote: zeroVote, + signature: derivedSignatureComponents, + previousCiphertext: new Uint8Array(previousCiphertextEncoded), }) const { returnValue } = await executeCircuit(crispInputs) @@ -154,11 +186,12 @@ describe('Vote', () => { const crispInputs = await generateCircuitInputs({ vote: zeroVote, publicKey, - signature: MASK_SIGNATURE, + signature: derivedSignatureComponents, merkleProof, balance, slotAddress, isFirstVote: true, + previousCiphertext: encryptVote(vote, publicKey), }) const { returnValue } = await executeCircuit(crispInputs) @@ -180,12 +213,23 @@ describe('Vote', () => { describe('generateVoteProof', () => { it('Should generate a valid vote proof', { timeout: 100000 }, async () => { + const mockIsSlotEmptyResponse = { + ok: true, + json: async () => mockedIsSlotEmptyTrueResponse, + } as Response + + vi.spyOn(global, 'fetch').mockResolvedValue(mockIsSlotEmptyResponse) + const proof = await generateVoteProof({ vote, publicKey, signature, merkleLeaves: LEAVES, balance, + messageHash: SIGNATURE_MESSAGE_HASH, + serverUrl: CRISP_SERVER_URL, + slotAddress, + e3Id, }) expect(proof).toBeDefined() @@ -196,17 +240,26 @@ describe('Vote', () => { expect(isValid).toBe(true) }) + + it('Should return the new ciphertext as output', { timeout: 100000 }, async () => {}) }) describe('generateMaskVoteProof', () => { - it('Should generate a valid mask vote proof with a previous ciphertext', { timeout: 100000 }, async () => { + it('Should generate a valid mask vote proof when there are no votes in the slot', { timeout: 100000 }, async () => { + const mockIsSlotEmptyResponse = { + ok: true, + json: async () => mockedIsSlotEmptyTrueResponse, + } as Response + + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse) + const proof = await generateMaskVoteProof({ balance, slotAddress, publicKey, - previousCiphertext, - isFirstVote: false, - merkleRoot: generateMerkleProof(balance, slotAddress, LEAVES).proof.root, + merkleLeaves: LEAVES, + e3Id: 0, + serverUrl: CRISP_SERVER_URL, }) expect(proof).toBeDefined() @@ -218,13 +271,26 @@ describe('Vote', () => { expect(isValid).toBe(true) }) - it('Should generate a valid mask vote proof without a previous ciphertext', { timeout: 100000 }, async () => { + it('Should generate a valid mask vote proof when there is a previous vote in the slot', { timeout: 100000 }, async () => { + const mockIsSlotEmptyResponse = { + ok: true, + json: async () => mockedIsSlotEmptyFalseResponse, + } as Response + + const mockFetchResponse = { + ok: true, + json: async () => mockedPreviousCiphertextResponse, + } as Response + + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse).mockResolvedValueOnce(mockFetchResponse) + const proof = await generateMaskVoteProof({ balance, slotAddress, publicKey, - isFirstVote: true, - merkleRoot: generateMerkleProof(balance, slotAddress, LEAVES).proof.root, + merkleLeaves: LEAVES, + e3Id: 0, + serverUrl: CRISP_SERVER_URL, }) expect(proof).toBeDefined() From 26c088622b29cbffa6db143e4bb392f168ab102a Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:12:43 +0000 Subject: [PATCH 09/19] chore: re-add custom signature per round --- examples/CRISP/client/src/hooks/voting/useVoteCasting.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index ba6ced41d2..c74cbb825e 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -12,6 +12,7 @@ import { useVoteManagementContext } from '@/context/voteManagement' import { useNotificationAlertContext } from '@/context/NotificationAlert/NotificationAlert.context.tsx' import { Poll } from '@/model/poll.model' import { BroadcastVoteRequest, Vote, VoteStateLite, VotingRound } from '@/model/vote.model' +import { hashMessage } from 'viem' export type VotingStep = 'idle' | 'signing' | 'encrypting' | 'generating_proof' | 'broadcasting' | 'confirming' | 'complete' | 'error' @@ -115,9 +116,12 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setLastActiveStep('signing') setStepMessage('Please sign the message in your wallet...') + const message = `Vote for round ${roundState.id}` + const messageHash = hashMessage(message) + let signature: string try { - signature = await signMessageAsync({ message: SIGNATURE_MESSAGE }) + signature = await signMessageAsync({ message }) // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (signError) { console.log('User rejected signature or signing failed') From a34e55c2587dde78353096e70dafeac684da6256 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:27:28 +0000 Subject: [PATCH 10/19] chore: pr comments --- .../src/context/voteManagement/VoteManagement.types.ts | 2 +- examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx | 2 +- examples/CRISP/client/src/hooks/voting/useVoteCasting.ts | 6 +++--- examples/CRISP/client/src/model/vote.model.ts | 4 ++-- examples/CRISP/packages/crisp-sdk/src/state.ts | 2 +- examples/CRISP/packages/crisp-sdk/src/vote.ts | 2 +- examples/CRISP/packages/crisp-sdk/tests/vote.test.ts | 2 -- examples/CRISP/server/src/server/routes/state.rs | 4 ++-- 8 files changed, 11 insertions(+), 13 deletions(-) diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index 58ec12b40a..ed5dbc991d 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -42,7 +42,7 @@ export type VoteManagementContextType = { vote: Vote, publicKey: Uint8Array, address: string, - balance: number, + balance: bigint, signature: string, messageHash: `0x${string}`, isMasking: boolean, diff --git a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx index 1bed0e8be5..93cde09540 100644 --- a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx +++ b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx @@ -33,7 +33,7 @@ export const useSDKWorkerHook = () => { vote: Vote, publicKey: Uint8Array, address: string, - balance: number, + balance: bigint, signature: string, messageHash: `0x${string}`, isMasking: boolean, diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index c74cbb825e..9eb248dfa7 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -66,7 +66,7 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo const [stepMessage, setStepMessage] = useState('') const handleProofGeneration = useCallback( - async (vote: Vote, address: string, balance: number, signature: string, messageHash: `0x${string}`, isMasking: boolean) => { + async (vote: Vote, address: string, balance: bigint, signature: string, messageHash: `0x${string}`, isMasking: boolean) => { if (!votingRound) throw new Error('No voting round available for proof generation') return generateProof( votingRound.round_id, @@ -137,8 +137,8 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo // voteId is either 0 or 1, so we need to encode the vote accordingly. // We are adapting to the current CRISP application. - const balance = 1 - const vote = pollSelected.value === 0 ? { yes: balance, no: 0 } : { yes: 0, no: balance } + const balance = 1n + const vote = pollSelected.value === 0 ? { yes: balance, no: 0n } : { yes: 0n, no: balance } const encodedProof = await handleProofGeneration(vote, user.address, balance, signature, messageHash, isMasking) diff --git a/examples/CRISP/client/src/model/vote.model.ts b/examples/CRISP/client/src/model/vote.model.ts index c0a78105d5..148824c536 100644 --- a/examples/CRISP/client/src/model/vote.model.ts +++ b/examples/CRISP/client/src/model/vote.model.ts @@ -57,6 +57,6 @@ export interface VoteStateLite { } export interface Vote { - yes: number - no: number + yes: bigint + no: bigint } diff --git a/examples/CRISP/packages/crisp-sdk/src/state.ts b/examples/CRISP/packages/crisp-sdk/src/state.ts index ea012abb4e..f744a6f516 100644 --- a/examples/CRISP/packages/crisp-sdk/src/state.ts +++ b/examples/CRISP/packages/crisp-sdk/src/state.ts @@ -80,7 +80,7 @@ export const getPreviousCiphertext = async (serverUrl: string, e3Id: number, add const data = await response.json() - return data.ciphertext as Uint8Array + return new Uint8Array(data.ciphertext) } /** diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index 15f1eeaebf..d674bd4a08 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -263,7 +263,7 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn // check if the slot is empty first const isSlotEmpty = await getIsSlotEmpty(maskVoteProofInputs.serverUrl, maskVoteProofInputs.e3Id, maskVoteProofInputs.slotAddress) - let previousCiphertext: Uint8Array | undefined + let previousCiphertext: Uint8Array if (!isSlotEmpty) { previousCiphertext = await getPreviousCiphertext( diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index d63cbf399a..bc57cc0835 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -240,8 +240,6 @@ describe('Vote', () => { expect(isValid).toBe(true) }) - - it('Should return the new ciphertext as output', { timeout: 100000 }, async () => {}) }) describe('generateMaskVoteProof', () => { diff --git a/examples/CRISP/server/src/server/routes/state.rs b/examples/CRISP/server/src/server/routes/state.rs index 9131e89b48..5e4c848f32 100644 --- a/examples/CRISP/server/src/server/routes/state.rs +++ b/examples/CRISP/server/src/server/routes/state.rs @@ -281,8 +281,8 @@ async fn get_token_holders_hashes( } /// Check if a slot is empty given an address -/// /// # Arguments -/// * `PreviousCiphertextRequest` - The request containing round_id and address +/// # Arguments +/// * `IsSlotEmptyRequest` - The request containing round_id and address async fn handle_is_slot_empty( data: web::Json, ) -> impl Responder { From 1e0ad073b7452e3e253be201551528de4a6820b9 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:35:59 +0000 Subject: [PATCH 11/19] chore: typo --- examples/CRISP/server/src/server/routes/state.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CRISP/server/src/server/routes/state.rs b/examples/CRISP/server/src/server/routes/state.rs index 5e4c848f32..a24f770f30 100644 --- a/examples/CRISP/server/src/server/routes/state.rs +++ b/examples/CRISP/server/src/server/routes/state.rs @@ -44,7 +44,7 @@ pub fn setup_routes(config: &mut web::ServiceConfig) { /// * `data` - The round id and the slot index /// /// # Returns -/// * A JSON response with the result of the operation. If sucessful it includes the ciphertext input at the given slot +/// * A JSON response with the result of the operation. If sucessfull it includes the ciphertext input at the given slot async fn handle_get_previous_ciphertext( data: web::Json, store: web::Data, From 8f529418db8cd947faea4294e17714796fdb51a7 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 12:27:16 +0000 Subject: [PATCH 12/19] chore: PR comments --- examples/CRISP/client/libs/crispSDKWorker.js | 6 ++-- .../voteManagement/VoteManagement.types.ts | 2 +- .../client/src/hooks/voting/useSDKWorker.tsx | 4 +-- .../client/src/hooks/voting/useVoteCasting.ts | 3 +- .../CRISP/packages/crisp-sdk/src/constants.ts | 2 +- .../CRISP/packages/crisp-sdk/src/types.ts | 3 +- examples/CRISP/packages/crisp-sdk/src/vote.ts | 31 +++++++++---------- .../packages/crisp-sdk/tests/vote.test.ts | 24 +++++++------- 8 files changed, 37 insertions(+), 38 deletions(-) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index 0cc3201133..c328abd381 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -11,7 +11,7 @@ self.onmessage = async function (event) { switch (type) { case 'generate_proof': try { - const { voteId, vote, publicKey, balance, address: slotAddress, signature, messageHash, isMasking, crispServer } = data + const { e3Id, vote, publicKey, balance, address: slotAddress, signature, messageHash, isMasking, crispServer } = data // todo: get the leaves from the server (pass them from the client). const merkleLeaves = [ @@ -25,7 +25,7 @@ self.onmessage = async function (event) { if (isMasking) { proof = await generateMaskVoteProof({ serverUrl: crispServer, - e3Id: voteId, + e3Id, publicKey, balance, slotAddress, @@ -35,7 +35,7 @@ self.onmessage = async function (event) { proof = await generateVoteProof({ serverUrl: crispServer, vote, - e3Id: voteId, + e3Id, publicKey, signature, merkleLeaves, diff --git a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts index ed5dbc991d..2b45ff400e 100644 --- a/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts +++ b/examples/CRISP/client/src/context/voteManagement/VoteManagement.types.ts @@ -38,7 +38,7 @@ export type VoteManagementContextType = { setVotingRound: React.Dispatch> setUser: React.Dispatch> generateProof: ( - voteId: number, + e3Id: number, vote: Vote, publicKey: Uint8Array, address: string, diff --git a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx index 93cde09540..ff5e8cc700 100644 --- a/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx +++ b/examples/CRISP/client/src/hooks/voting/useSDKWorker.tsx @@ -29,7 +29,7 @@ export const useSDKWorkerHook = () => { }, []) const generateProof = async ( - voteId: number, + e3Id: number, vote: Vote, publicKey: Uint8Array, address: string, @@ -48,7 +48,7 @@ export const useSDKWorkerHook = () => { workerRef.current!.postMessage({ type: 'generate_proof', - data: { voteId, vote, balance, publicKey, address, signature, messageHash, isMasking, crispServer: ENCLAVE_API }, + data: { e3Id, vote, balance, publicKey, address, signature, messageHash, isMasking, crispServer: ENCLAVE_API }, }) workerRef.current!.onmessage = async (event) => { const { type, success, encodedProof, error } = event.data diff --git a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts index 9eb248dfa7..0d90ce0fca 100644 --- a/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts +++ b/examples/CRISP/client/src/hooks/voting/useVoteCasting.ts @@ -135,8 +135,7 @@ export const useVoteCasting = (customRoundState?: VoteStateLite | null, customVo setLastActiveStep('encrypting') setStepMessage('') - // voteId is either 0 or 1, so we need to encode the vote accordingly. - // We are adapting to the current CRISP application. + // vote is either 0 or 1, so we need to encode the vote accordingly. const balance = 1n const vote = pollSelected.value === 0 ? { yes: balance, no: 0n } : { yes: 0n, no: balance } diff --git a/examples/CRISP/packages/crisp-sdk/src/constants.ts b/examples/CRISP/packages/crisp-sdk/src/constants.ts index b3a07c28fa..b7222499a3 100644 --- a/examples/CRISP/packages/crisp-sdk/src/constants.ts +++ b/examples/CRISP/packages/crisp-sdk/src/constants.ts @@ -37,4 +37,4 @@ export const SIGNATURE_MESSAGE_HASH = hashMessage(SIGNATURE_MESSAGE) export const MASK_SIGNATURE = '0x8e7d77112641d59e9409ec3052041703bb9d9e6ed39bfcf75aefbcafe829ac6b21dd7648116ad5db0466fcb4bd468dcb28f6c069def8bc47cd9d859c85a016e31b' -export const zeroVote = { yes: 0n, no: 0n } +export const ZERO_VOTE = { yes: 0n, no: 0n } diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index 0ed308877a..9ec98d203b 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -173,7 +173,8 @@ export type ProofInputs = { previousCiphertext: Uint8Array vote: Vote publicKey: Uint8Array - signature: Signature + signature: `0x${string}` + messageHash: `0x${string}` balance: bigint slotAddress: string merkleProof: MerkleProof diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index d674bd4a08..3b55233199 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -7,7 +7,7 @@ import { ZKInputsGenerator } from '@crisp-e3/zk-inputs' import { type CircuitInputs, type Vote, ExecuteCircuitResult, MaskVoteProofInputs, ProofInputs, VoteProofInputs } from './types' import { generateMerkleProof, toBinary, extractSignatureComponents, getAddressFromSignature, getOptimalThreadCount } from './utils' -import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE, zeroVote, SIGNATURE_MESSAGE_HASH } from './constants' +import { MAXIMUM_VOTE_VALUE, MASK_SIGNATURE, ZERO_VOTE, SIGNATURE_MESSAGE_HASH } from './constants' import { Noir, type CompiledCircuit } from '@noir-lang/noir_js' import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' import circuit from '../../../circuits/target/crisp_circuit.json' @@ -153,7 +153,7 @@ export const generateCircuitInputs = async (proofInputs: ProofInputs): Promise b.toString()) - crispInputs.public_key_x = Array.from(proofInputs.signature.publicKeyX).map((b) => b.toString()) - crispInputs.public_key_y = Array.from(proofInputs.signature.publicKeyY).map((b) => b.toString()) - crispInputs.signature = Array.from(proofInputs.signature.signature).map((b) => b.toString()) + const signature = await extractSignatureComponents(proofInputs.signature, proofInputs.messageHash) + + crispInputs.hashed_message = Array.from(signature.messageHash).map((b) => b.toString()) + crispInputs.public_key_x = Array.from(signature.publicKeyX).map((b) => b.toString()) + crispInputs.public_key_y = Array.from(signature.publicKeyY).map((b) => b.toString()) + crispInputs.signature = Array.from(signature.signature).map((b) => b.toString()) crispInputs.slot_address = proofInputs.slotAddress.toLowerCase() crispInputs.balance = proofInputs.balance.toString() crispInputs.is_first_vote = proofInputs.isFirstVote @@ -225,11 +227,8 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { throw new Error('Invalid vote: vote is negative') } - // The address slot of an actual vote always is the address of the public key that signed the message. const address = await getAddressFromSignature(voteProofInputs.signature, voteProofInputs.messageHash) - const signature = await extractSignatureComponents(voteProofInputs.signature, voteProofInputs.messageHash) - const merkleProof = generateMerkleProof(voteProofInputs.balance, address, voteProofInputs.merkleLeaves) // check if the slot is empty first @@ -239,7 +238,7 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { if (!isSlotEmpty) { previousCiphertext = await getPreviousCiphertext(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) } else { - previousCiphertext = encryptVote(zeroVote, voteProofInputs.publicKey) + previousCiphertext = encryptVote(ZERO_VOTE, voteProofInputs.publicKey) } const crispInputs = await generateCircuitInputs({ @@ -248,7 +247,8 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { merkleProof, isFirstVote: isSlotEmpty, previousCiphertext, - signature, + signature: voteProofInputs.signature, + messageHash: voteProofInputs.messageHash, }) return generateProof(crispInputs) @@ -272,19 +272,18 @@ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofIn maskVoteProofInputs.slotAddress, ) } else { - previousCiphertext = encryptVote(zeroVote, maskVoteProofInputs.publicKey) + previousCiphertext = encryptVote(ZERO_VOTE, maskVoteProofInputs.publicKey) } - const signature = await extractSignatureComponents(MASK_SIGNATURE, SIGNATURE_MESSAGE_HASH) - const merkleProof = generateMerkleProof(maskVoteProofInputs.balance, maskVoteProofInputs.slotAddress, maskVoteProofInputs.merkleLeaves) const crispInputs = await generateCircuitInputs({ ...maskVoteProofInputs, previousCiphertext, isFirstVote: isSlotEmpty, - signature, - vote: zeroVote, + signature: MASK_SIGNATURE, + messageHash: SIGNATURE_MESSAGE_HASH, + vote: ZERO_VOTE, merkleProof, }) diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index bc57cc0835..12d9a04366 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -4,9 +4,9 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. import { describe, it, expect, beforeAll, beforeEach, afterEach, vi } from 'vitest' -import { Signature, Vote } from '../src/types' -import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, zeroVote } from '../src/constants' -import { extractSignatureComponents, generateMerkleProof } from '../src/utils' +import { Vote } from '../src/types' +import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, ZERO_VOTE, MASK_SIGNATURE } from '../src/constants' +import { generateMerkleProof } from '../src/utils' import { decodeTally, encryptVote, @@ -30,7 +30,6 @@ describe('Vote', () => { let address: string let slotAddress: string let publicKey: Uint8Array - let derivedSignatureComponents: Signature const e3Id = 0 @@ -58,7 +57,6 @@ describe('Vote', () => { beforeAll(async () => { vote = { yes: 10n, no: 0n } signature = await signMessage({ message: SIGNATURE_MESSAGE, privateKey: ECDSA_PRIVATE_KEY }) - derivedSignatureComponents = await extractSignatureComponents(signature, SIGNATURE_MESSAGE_HASH) balance = 100n address = publicKeyToAddress(await recoverPublicKey({ hash: SIGNATURE_MESSAGE_HASH, signature })) // Address of the last leaf in the Merkle tree, used for mask votes. @@ -113,14 +111,14 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, address, LEAVES) - const sig = await extractSignatureComponents(signature, SIGNATURE_MESSAGE_HASH) - const previousCiphertext = encryptVote(zeroVote, publicKey) + const previousCiphertext = encryptVote(ZERO_VOTE, publicKey) const crispInputs = await generateCircuitInputs({ vote, publicKey, - signature: sig, + signature, + messageHash: SIGNATURE_MESSAGE_HASH, balance, slotAddress: address, merkleProof, @@ -157,8 +155,9 @@ describe('Vote', () => { slotAddress, isFirstVote: false, merkleProof, - vote: zeroVote, - signature: derivedSignatureComponents, + vote: ZERO_VOTE, + signature: MASK_SIGNATURE, + messageHash: SIGNATURE_MESSAGE_HASH, previousCiphertext: new Uint8Array(previousCiphertextEncoded), }) @@ -184,9 +183,10 @@ describe('Vote', () => { // Using generateCircuitInputs directly to check the output of the circuit. const merkleProof = generateMerkleProof(balance, slotAddress, LEAVES) const crispInputs = await generateCircuitInputs({ - vote: zeroVote, + vote: ZERO_VOTE, publicKey, - signature: derivedSignatureComponents, + signature: MASK_SIGNATURE, + messageHash: SIGNATURE_MESSAGE_HASH, merkleProof, balance, slotAddress, From 8edec80be0701280bb8a38e37bb22574b7910f9d Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:04:37 +0000 Subject: [PATCH 13/19] chore: update noir toolchain --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c4b0dc42d0..57b21fcae5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ env: CIPHERNODE_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/ciphernode NODE_VERSION: 22 RUST_TOOLCHAIN: 1.86.0 - NOIR_TOOLCHAIN: v1.0.0-beta.15 + NOIR_TOOLCHAIN: v1.0.0-beta.17 HARDHAT_VAR_MNEMONIC: 'test test test test test test test test test test test junk' HARDHAT_VAR_INFURA_API_KEY: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' PRIVATE_KEY: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' From 1f391d3231db2b2406d357d89c1bf6ddf8d4daa5 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:18:20 +0000 Subject: [PATCH 14/19] revert: noir version --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 57b21fcae5..c4b0dc42d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ env: CIPHERNODE_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/ciphernode NODE_VERSION: 22 RUST_TOOLCHAIN: 1.86.0 - NOIR_TOOLCHAIN: v1.0.0-beta.17 + NOIR_TOOLCHAIN: v1.0.0-beta.15 HARDHAT_VAR_MNEMONIC: 'test test test test test test test test test test test junk' HARDHAT_VAR_INFURA_API_KEY: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' PRIVATE_KEY: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' From ed6251165bdd681d36766c122a38eadd31381269 Mon Sep 17 00:00:00 2001 From: Cedoor Date: Fri, 19 Dec 2025 18:07:51 +0100 Subject: [PATCH 15/19] chore: Fix test fetch mocks to use mockResolvedValueOnce --- examples/CRISP/packages/crisp-sdk/tests/state.test.ts | 4 ++-- examples/CRISP/packages/crisp-sdk/tests/token.test.ts | 2 +- examples/CRISP/packages/crisp-sdk/tests/vote.test.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/CRISP/packages/crisp-sdk/tests/state.test.ts b/examples/CRISP/packages/crisp-sdk/tests/state.test.ts index 7a89007eec..0b4593d96d 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/state.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/state.test.ts @@ -46,7 +46,7 @@ describe('State', () => { json: async () => mockResponse, } as Response - vi.spyOn(global, 'fetch').mockResolvedValue(mockFetchResponse) + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockFetchResponse) const state = await getRoundDetails(CRISP_SERVER_URL, 0) @@ -87,7 +87,7 @@ describe('State', () => { json: async () => mockResponse, } as Response - vi.spyOn(global, 'fetch').mockResolvedValue(mockFetchResponse) + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockFetchResponse) const tokenDetails = await getRoundTokenDetails(CRISP_SERVER_URL, 0) diff --git a/examples/CRISP/packages/crisp-sdk/tests/token.test.ts b/examples/CRISP/packages/crisp-sdk/tests/token.test.ts index a222879b23..6922b5080e 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/token.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/token.test.ts @@ -26,7 +26,7 @@ describe('Token data fetching', () => { json: async () => mockHashes, } as Response - vi.spyOn(global, 'fetch').mockResolvedValue(mockResponse) + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockResponse) const data = await getTreeData(CRISP_SERVER_URL, 0) diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 12d9a04366..b78ee9f732 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -218,7 +218,7 @@ describe('Vote', () => { json: async () => mockedIsSlotEmptyTrueResponse, } as Response - vi.spyOn(global, 'fetch').mockResolvedValue(mockIsSlotEmptyResponse) + vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse) const proof = await generateVoteProof({ vote, From 9ee72e14cbb7819ec40de6db3399703f1bb6795e Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:43:43 +0000 Subject: [PATCH 16/19] feat: add sdk class --- .../tests/crisp.contracts.test.ts | 8 +++ examples/CRISP/packages/crisp-sdk/src/sdk.ts | 69 +++++++++++++++++++ .../CRISP/packages/crisp-sdk/src/types.ts | 23 ++++++- examples/CRISP/packages/crisp-sdk/src/vote.ts | 34 ++------- .../packages/crisp-sdk/tests/vote.test.ts | 21 ++---- 5 files changed, 110 insertions(+), 45 deletions(-) create mode 100644 examples/CRISP/packages/crisp-sdk/src/sdk.ts diff --git a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts index 40a7597d51..09f7fa8caf 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts @@ -14,11 +14,13 @@ import { encodeSolidityProof, generateMerkleTree, SIGNATURE_MESSAGE_HASH, + encryptVote, } from '@crisp-e3/sdk' import { expect } from 'chai' import { deployCRISPProgram, deployHonkVerifier, deployMockEnclave, ethers } from './utils' let publicKey = generatePublicKey() +const previousCiphertext = encryptVote({ yes: 0n, no: 0n }, publicKey) describe('CRISP Contracts', function () { describe('decode tally', () => { @@ -59,6 +61,9 @@ describe('CRISP Contracts', function () { merkleLeaves: leaves, balance, messageHash: SIGNATURE_MESSAGE_HASH, + isFirstVote: true, + previousCiphertext, + slotAddress: address, }) const isValid = await honkVerifier.verify(proof.proof, proof.publicInputs) @@ -89,6 +94,9 @@ describe('CRISP Contracts', function () { merkleLeaves: leaves, balance, messageHash: SIGNATURE_MESSAGE_HASH, + isFirstVote: true, + previousCiphertext, + slotAddress: address, }) const encodedProof = encodeSolidityProof(proof) diff --git a/examples/CRISP/packages/crisp-sdk/src/sdk.ts b/examples/CRISP/packages/crisp-sdk/src/sdk.ts new file mode 100644 index 0000000000..3cc3f7aaf6 --- /dev/null +++ b/examples/CRISP/packages/crisp-sdk/src/sdk.ts @@ -0,0 +1,69 @@ +import { getIsSlotEmpty, getPreviousCiphertext } from './state' +import { encryptVote, generateMaskVoteProof, generateVoteProof } from './vote' +import { ZERO_VOTE } from './constants' + +import type { ProofData } from '@aztec/bb.js' +import type { MaskVoteProofRequest, VoteProofRequest } from './types' + +/** + * A class representing the Crisp SDK. + */ +export class CrispSDK { + /** + * The server URL for the Crisp SDK. + * It's used by methods that communicate directly with the Crisp server. + */ + private serverUrl: string + + /** + * Create a new instance + * @param serverUrl + */ + constructor(serverUrl: string) { + this.serverUrl = serverUrl + } + + /** + * Generate a proof for a vote masking. + */ + async generateMaskVoteProof(maskProofInputs: MaskVoteProofRequest): Promise { + // check if the slot is empty first + const isSlotEmpty = await getIsSlotEmpty(this.serverUrl, maskProofInputs.e3Id, maskProofInputs.slotAddress) + + let previousCiphertext: Uint8Array + if (!isSlotEmpty) { + previousCiphertext = await getPreviousCiphertext(maskProofInputs.serverUrl, maskProofInputs.e3Id, maskProofInputs.slotAddress) + } else { + previousCiphertext = encryptVote(ZERO_VOTE, maskProofInputs.publicKey) + } + + return generateMaskVoteProof({ + ...maskProofInputs, + previousCiphertext, + isFirstVote: isSlotEmpty, + }) + } + + /** + * Generate a proof for a vote. + * @param voteProofInputs - The inputs required to generate the vote proof. + * @returns A promise that resolves to the generated proof data. + */ + async generateVoteProof(voteProofInputs: VoteProofRequest): Promise { + // check if the slot is empty first + const isSlotEmpty = await getIsSlotEmpty(this.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) + + let previousCiphertext: Uint8Array + if (!isSlotEmpty) { + previousCiphertext = await getPreviousCiphertext(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) + } else { + previousCiphertext = encryptVote(ZERO_VOTE, voteProofInputs.publicKey) + } + + return generateVoteProof({ + ...voteProofInputs, + previousCiphertext, + isFirstVote: isSlotEmpty, + }) + } +} diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index 9ec98d203b..dc20a807fe 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -182,6 +182,15 @@ export type ProofInputs = { } export type MaskVoteProofInputs = { + publicKey: Uint8Array + balance: bigint + slotAddress: string + merkleLeaves: string[] | bigint[] + isFirstVote: boolean + previousCiphertext: Uint8Array +} + +export type MaskVoteProofRequest = { serverUrl: string e3Id: number publicKey: Uint8Array @@ -190,7 +199,7 @@ export type MaskVoteProofInputs = { merkleLeaves: string[] | bigint[] } -export type VoteProofInputs = { +export type VoteProofRequest = { serverUrl: string e3Id: number merkleLeaves: string[] | bigint[] @@ -202,6 +211,18 @@ export type VoteProofInputs = { slotAddress: string } +export type VoteProofInputs = { + merkleLeaves: string[] | bigint[] + publicKey: Uint8Array + balance: bigint + vote: Vote + signature: `0x${string}` + messageHash: `0x${string}` + slotAddress: string + isFirstVote: boolean + previousCiphertext: Uint8Array +} + export type Signature = { publicKeyX: Uint8Array publicKeyY: Uint8Array diff --git a/examples/CRISP/packages/crisp-sdk/src/vote.ts b/examples/CRISP/packages/crisp-sdk/src/vote.ts index 3b55233199..e3577be926 100644 --- a/examples/CRISP/packages/crisp-sdk/src/vote.ts +++ b/examples/CRISP/packages/crisp-sdk/src/vote.ts @@ -13,7 +13,6 @@ import { UltraHonkBackend, type ProofData } from '@aztec/bb.js' import circuit from '../../../circuits/target/crisp_circuit.json' import { bytesToHex, encodeAbiParameters, parseAbiParameters, numberToHex, getAddress, hexToBytes } from 'viem/utils' import { Hex } from 'viem' -import { getIsSlotEmpty, getPreviousCiphertext } from './state' // Initialize the ZKInputsGenerator. const zkInputsGenerator: ZKInputsGenerator = ZKInputsGenerator.withDefaults() @@ -231,22 +230,12 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { const merkleProof = generateMerkleProof(voteProofInputs.balance, address, voteProofInputs.merkleLeaves) - // check if the slot is empty first - const isSlotEmpty = await getIsSlotEmpty(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) - - let previousCiphertext: Uint8Array - if (!isSlotEmpty) { - previousCiphertext = await getPreviousCiphertext(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) - } else { - previousCiphertext = encryptVote(ZERO_VOTE, voteProofInputs.publicKey) - } - const crispInputs = await generateCircuitInputs({ ...voteProofInputs, slotAddress: address, merkleProof, - isFirstVote: isSlotEmpty, - previousCiphertext, + isFirstVote: voteProofInputs.isFirstVote, + previousCiphertext: voteProofInputs.previousCiphertext, signature: voteProofInputs.signature, messageHash: voteProofInputs.messageHash, }) @@ -260,27 +249,12 @@ export const generateVoteProof = async (voteProofInputs: VoteProofInputs) => { * @returns */ export const generateMaskVoteProof = async (maskVoteProofInputs: MaskVoteProofInputs): Promise => { - // check if the slot is empty first - const isSlotEmpty = await getIsSlotEmpty(maskVoteProofInputs.serverUrl, maskVoteProofInputs.e3Id, maskVoteProofInputs.slotAddress) - - let previousCiphertext: Uint8Array - - if (!isSlotEmpty) { - previousCiphertext = await getPreviousCiphertext( - maskVoteProofInputs.serverUrl, - maskVoteProofInputs.e3Id, - maskVoteProofInputs.slotAddress, - ) - } else { - previousCiphertext = encryptVote(ZERO_VOTE, maskVoteProofInputs.publicKey) - } - const merkleProof = generateMerkleProof(maskVoteProofInputs.balance, maskVoteProofInputs.slotAddress, maskVoteProofInputs.merkleLeaves) const crispInputs = await generateCircuitInputs({ ...maskVoteProofInputs, - previousCiphertext, - isFirstVote: isSlotEmpty, + previousCiphertext: maskVoteProofInputs.previousCiphertext, + isFirstVote: maskVoteProofInputs.isFirstVote, signature: MASK_SIGNATURE, messageHash: SIGNATURE_MESSAGE_HASH, vote: ZERO_VOTE, diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index b78ee9f732..f796b6dec8 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -7,21 +7,12 @@ import { describe, it, expect, beforeAll, beforeEach, afterEach, vi } from 'vite import { Vote } from '../src/types' import { SIGNATURE_MESSAGE_HASH, SIGNATURE_MESSAGE, ZERO_VOTE, MASK_SIGNATURE } from '../src/constants' import { generateMerkleProof } from '../src/utils' -import { - decodeTally, - encryptVote, - generateVoteProof, - generateMaskVoteProof, - generatePublicKey, - verifyProof, - encodeVote, - generateCircuitInputs, - executeCircuit, -} from '../src/vote' +import { decodeTally, encryptVote, generatePublicKey, verifyProof, encodeVote, generateCircuitInputs, executeCircuit } from '../src/vote' import { publicKeyToAddress, signMessage } from 'viem/accounts' import { Hex, recoverPublicKey } from 'viem' import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, LEAVES } from './constants' import previousCiphertextEncoded from './previous.json' +import { CrispSDK } from '../src/sdk' describe('Vote', () => { let vote: Vote @@ -53,6 +44,8 @@ describe('Vote', () => { vi.restoreAllMocks() }) + const sdk = new CrispSDK(CRISP_SERVER_URL) + // Setup the test environment. beforeAll(async () => { vote = { yes: 10n, no: 0n } @@ -220,7 +213,7 @@ describe('Vote', () => { vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse) - const proof = await generateVoteProof({ + const proof = await sdk.generateVoteProof({ vote, publicKey, signature, @@ -251,7 +244,7 @@ describe('Vote', () => { vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse) - const proof = await generateMaskVoteProof({ + const proof = await sdk.generateMaskVoteProof({ balance, slotAddress, publicKey, @@ -282,7 +275,7 @@ describe('Vote', () => { vi.spyOn(global, 'fetch').mockResolvedValueOnce(mockIsSlotEmptyResponse).mockResolvedValueOnce(mockFetchResponse) - const proof = await generateMaskVoteProof({ + const proof = await sdk.generateMaskVoteProof({ balance, slotAddress, publicKey, From d3a7fc382e9739b765eba926d89cc444f6a1076f Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:49:19 +0000 Subject: [PATCH 17/19] chore: update worker and exports --- examples/CRISP/client/libs/crispSDKWorker.js | 8 +++++--- examples/CRISP/packages/crisp-sdk/src/index.ts | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/CRISP/client/libs/crispSDKWorker.js b/examples/CRISP/client/libs/crispSDKWorker.js index c328abd381..7f1812faba 100755 --- a/examples/CRISP/client/libs/crispSDKWorker.js +++ b/examples/CRISP/client/libs/crispSDKWorker.js @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { hashLeaf, generateVoteProof, encodeSolidityProof, generateMaskVoteProof } from '@crisp-e3/sdk' +import { hashLeaf, encodeSolidityProof, CrispSDK } from '@crisp-e3/sdk' self.onmessage = async function (event) { const { type, data } = event.data @@ -20,10 +20,12 @@ self.onmessage = async function (event) { 14131255645332550266535358189863475289290770471998199141522479556687499890181n, ] + const sdk = new CrispSDK(crispServer) + let proof if (isMasking) { - proof = await generateMaskVoteProof({ + proof = await sdk.generateMaskVoteProof({ serverUrl: crispServer, e3Id, publicKey, @@ -32,7 +34,7 @@ self.onmessage = async function (event) { merkleLeaves, }) } else { - proof = await generateVoteProof({ + proof = await sdk.generateVoteProof({ serverUrl: crispServer, vote, e3Id, diff --git a/examples/CRISP/packages/crisp-sdk/src/index.ts b/examples/CRISP/packages/crisp-sdk/src/index.ts index 98819cf6f5..91d49395ae 100644 --- a/examples/CRISP/packages/crisp-sdk/src/index.ts +++ b/examples/CRISP/packages/crisp-sdk/src/index.ts @@ -17,5 +17,6 @@ export { encryptVote, encodeSolidityProof, } from './vote' +export { CrispSDK } from './sdk' export type { RoundDetails, RoundDetailsResponse, TokenDetails, Vote, MaskVoteProofInputs, VoteProofInputs } from './types' From 27958dee74d48aad0ee1e5daf60df40e4337731e Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:51:48 +0000 Subject: [PATCH 18/19] chore: license --- examples/CRISP/packages/crisp-sdk/src/sdk.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/CRISP/packages/crisp-sdk/src/sdk.ts b/examples/CRISP/packages/crisp-sdk/src/sdk.ts index 3cc3f7aaf6..f166e72df6 100644 --- a/examples/CRISP/packages/crisp-sdk/src/sdk.ts +++ b/examples/CRISP/packages/crisp-sdk/src/sdk.ts @@ -1,3 +1,9 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + import { getIsSlotEmpty, getPreviousCiphertext } from './state' import { encryptVote, generateMaskVoteProof, generateVoteProof } from './vote' import { ZERO_VOTE } from './constants' From 821d65fb766b1739acc65d706f02f08e3dc3e685 Mon Sep 17 00:00:00 2001 From: ctrlc03 <93448202+ctrlc03@users.noreply.github.com> Date: Fri, 19 Dec 2025 18:00:26 +0000 Subject: [PATCH 19/19] chore: reuse this.serverUrl --- examples/CRISP/packages/crisp-sdk/src/sdk.ts | 4 ++-- examples/CRISP/packages/crisp-sdk/src/types.ts | 2 -- examples/CRISP/packages/crisp-sdk/tests/vote.test.ts | 3 --- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/examples/CRISP/packages/crisp-sdk/src/sdk.ts b/examples/CRISP/packages/crisp-sdk/src/sdk.ts index f166e72df6..f4a2b24e63 100644 --- a/examples/CRISP/packages/crisp-sdk/src/sdk.ts +++ b/examples/CRISP/packages/crisp-sdk/src/sdk.ts @@ -38,7 +38,7 @@ export class CrispSDK { let previousCiphertext: Uint8Array if (!isSlotEmpty) { - previousCiphertext = await getPreviousCiphertext(maskProofInputs.serverUrl, maskProofInputs.e3Id, maskProofInputs.slotAddress) + previousCiphertext = await getPreviousCiphertext(this.serverUrl, maskProofInputs.e3Id, maskProofInputs.slotAddress) } else { previousCiphertext = encryptVote(ZERO_VOTE, maskProofInputs.publicKey) } @@ -61,7 +61,7 @@ export class CrispSDK { let previousCiphertext: Uint8Array if (!isSlotEmpty) { - previousCiphertext = await getPreviousCiphertext(voteProofInputs.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) + previousCiphertext = await getPreviousCiphertext(this.serverUrl, voteProofInputs.e3Id, voteProofInputs.slotAddress) } else { previousCiphertext = encryptVote(ZERO_VOTE, voteProofInputs.publicKey) } diff --git a/examples/CRISP/packages/crisp-sdk/src/types.ts b/examples/CRISP/packages/crisp-sdk/src/types.ts index dc20a807fe..3ccc55867d 100644 --- a/examples/CRISP/packages/crisp-sdk/src/types.ts +++ b/examples/CRISP/packages/crisp-sdk/src/types.ts @@ -191,7 +191,6 @@ export type MaskVoteProofInputs = { } export type MaskVoteProofRequest = { - serverUrl: string e3Id: number publicKey: Uint8Array balance: bigint @@ -200,7 +199,6 @@ export type MaskVoteProofRequest = { } export type VoteProofRequest = { - serverUrl: string e3Id: number merkleLeaves: string[] | bigint[] publicKey: Uint8Array diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index f796b6dec8..fd8fc92590 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -220,7 +220,6 @@ describe('Vote', () => { merkleLeaves: LEAVES, balance, messageHash: SIGNATURE_MESSAGE_HASH, - serverUrl: CRISP_SERVER_URL, slotAddress, e3Id, }) @@ -250,7 +249,6 @@ describe('Vote', () => { publicKey, merkleLeaves: LEAVES, e3Id: 0, - serverUrl: CRISP_SERVER_URL, }) expect(proof).toBeDefined() @@ -281,7 +279,6 @@ describe('Vote', () => { publicKey, merkleLeaves: LEAVES, e3Id: 0, - serverUrl: CRISP_SERVER_URL, }) expect(proof).toBeDefined()