import { ARCHIVE_HEIGHT, L1_TO_L2_MSG_TREE_HEIGHT, NOTE_HASH_TREE_HEIGHT } from '@aztec/constants'; import { type L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses'; import { BlockNumber, CheckpointNumber, EpochNumber, type SlotNumber } from '@aztec/foundation/branded-types'; import type { Fr } from '@aztec/foundation/curves/bn254'; import type { EthAddress } from '@aztec/foundation/eth-address'; import { MembershipWitness, SiblingPath } from '@aztec/foundation/trees'; import type { AztecAddress } from '../aztec-address/index.js'; import { BlockHash } from '../block/block_hash.js'; import { type BlockParameter } from '../block/block_parameter.js'; import { type DataInBlock } from '../block/in_block.js'; import { L2Block } from '../block/l2_block.js'; import { type L2BlockSource, type L2Tips } from '../block/l2_block_source.js'; import { type ContractClassPublic, type ContractInstanceWithAddress, type NodeInfo, type ProtocolContractAddresses } from '../contract/index.js'; import { GasFees } from '../gas/gas_fees.js'; import { SiloedTag, Tag, TxScopedL2Log } from '../logs/index.js'; import { type LogFilter } from '../logs/log_filter.js'; import { type ApiSchemaFor } from '../schemas/schemas.js'; import { MerkleTreeId } from '../trees/merkle_tree_id.js'; import { NullifierMembershipWitness } from '../trees/nullifier_membership_witness.js'; import { PublicDataWitness } from '../trees/public_data_witness.js'; import { BlockHeader, type IndexedTxEffect, PublicSimulationOutput, Tx, TxHash, TxReceipt, type TxValidationResult } from '../tx/index.js'; import type { SingleValidatorStats, ValidatorsStats } from '../validators/types.js'; import { type ComponentsVersions } from '../versioning/index.js'; import { type AllowedElement } from './allowed_element.js'; import { type GetContractClassLogsResponse, type GetPublicLogsResponse } from './get_logs_response.js'; import { type WorldStateSyncStatus } from './world_state.js'; /** * The aztec node. * We will probably implement the additional interfaces by means other than Aztec Node as it's currently a privacy leak */ export interface AztecNode extends Pick { /** * Returns the tips of the L2 chain. */ getL2Tips(): Promise; /** * Returns the sync status of the node's world state */ getWorldStateSyncStatus(): Promise; /** * Find the indexes of the given leaves in the given tree along with a block metadata pointing to the block in which * the leaves were inserted. * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param treeId - The tree to search in. * @param leafValues - The values to search for. * @returns The indices of leaves and the block metadata of a block in which the leaves were inserted. */ findLeavesIndexes(referenceBlock: BlockParameter, treeId: MerkleTreeId, leafValues: Fr[]): Promise<(DataInBlock | undefined)[]>; /** * Returns a nullifier membership witness for a given nullifier at a given block. * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param nullifier - Nullifier we try to find witness for. * @returns The nullifier membership witness (if found). */ getNullifierMembershipWitness(referenceBlock: BlockParameter, nullifier: Fr): Promise; /** * Returns a low nullifier membership witness for a given nullifier at a given block. * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param nullifier - Nullifier we try to find the low nullifier witness for. * @returns The low nullifier membership witness (if found). * @throws If the nullifier already exists in the tree, since non-inclusion cannot be proven. * @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked * list structure" of leaves and proving that a lower nullifier is pointing to a bigger next value than the nullifier * we are trying to prove non-inclusion for. */ getLowNullifierMembershipWitness(referenceBlock: BlockParameter, nullifier: Fr): Promise; /** * Returns a public data tree witness for a given leaf slot at a given block. * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param leafSlot - The leaf slot we try to find the witness for. * @returns The public data witness (if found). * @remarks The witness can be used to compute the current value of the public data tree leaf. If the low leaf preimage corresponds to an * "in range" slot, means that the slot doesn't exist and the value is 0. If the low leaf preimage corresponds to the exact slot, the current value * is contained in the leaf preimage. */ getPublicDataWitness(referenceBlock: BlockParameter, leafSlot: Fr): Promise; /** * Returns a membership witness for a given block hash in the archive tree. * * Block hashes are the leaves of the archive tree. Each time a new block is added to the chain, * its block hash is appended as a new leaf to the archive tree. This method finds the membership * witness (leaf index and sibling path) for a given block hash, which can be used to prove that * a specific block exists in the chain's history. * * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data * (which contains the root of the archive tree in which we are searching for the block hash). * @param blockHash - The block hash to find in the archive tree. */ getBlockHashMembershipWitness(referenceBlock: BlockParameter, blockHash: BlockHash): Promise | undefined>; /** * Returns a membership witness for a given note hash at a given block. * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param noteHash - The note hash we try to find the witness for. */ getNoteHashMembershipWitness(referenceBlock: BlockParameter, noteHash: Fr): Promise | undefined>; /** * Returns the index and a sibling path for a leaf in the committed l1 to l2 data tree. * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param l1ToL2Message - The l1ToL2Message to get the index / sibling path for. * @returns A tuple of the index and the sibling path of the L1ToL2Message (undefined if not found). */ getL1ToL2MessageMembershipWitness(referenceBlock: BlockParameter, l1ToL2Message: Fr): Promise<[bigint, SiblingPath] | undefined>; /** Returns the L2 checkpoint number in which this L1 to L2 message becomes available, or undefined if not found. */ getL1ToL2MessageCheckpoint(l1ToL2Message: Fr): Promise; /** * Returns whether an L1 to L2 message is synced by archiver. * @param l1ToL2Message - The L1 to L2 message to check. * @returns Whether the message is synced. * @deprecated Use `getL1ToL2MessageCheckpoint` instead. This method may return true even if the message is not ready to use. */ isL1ToL2MessageSynced(l1ToL2Message: Fr): Promise; /** * Returns all the L2 to L1 messages in an epoch. * @param epoch - The epoch at which to get the data. * @returns A nested array of the L2 to L1 messages in each tx of each block in each checkpoint in the epoch (empty * array if the epoch is not found). */ getL2ToL1Messages(epoch: EpochNumber): Promise; /** * Get a block specified by its block number or 'latest'. * @param blockParameter - The block parameter (block number, block hash, or 'latest'). * @returns The requested block. */ getBlock(blockParameter: BlockParameter): Promise; /** * Get a block specified by its hash. * @param blockHash - The block hash being requested. * @returns The requested block. */ getBlockByHash(blockHash: BlockHash): Promise; /** * Get a block specified by its archive root. * @param archive - The archive root being requested. * @returns The requested block. */ getBlockByArchive(archive: Fr): Promise; /** * Method to fetch the latest block number synchronized by the node. * @returns The block number. */ getBlockNumber(): Promise; /** * Fetches the latest proven block number. * @returns The block number. */ getProvenBlockNumber(): Promise; /** * Fetches the latest checkpointed block number. * @returns The block number. */ getCheckpointedBlockNumber(): Promise; /** * Method to fetch the latest checkpoint number synchronized by the node. * @returns The checkpoint number. */ getCheckpointNumber(): Promise; /** * Method to determine if the node is ready to accept transactions. * @returns - Flag indicating the readiness for tx submission. */ isReady(): Promise; /** * Returns the information about the server's node. Includes current Node version, compatible Noir version, * L1 chain identifier, protocol version, and L1 address of the rollup contract. * @returns - The node information. */ getNodeInfo(): Promise; /** * Method to request blocks. Will attempt to return all requested blocks but will return only those available. * @param from - The start of the range of blocks to return. * @param limit - The maximum number of blocks to return. * @returns The blocks requested. */ getBlocks(from: BlockNumber, limit: number): Promise; /** * Method to fetch the current min fees. * @returns The current min fees. */ getCurrentMinFees(): Promise; /** * Method to fetch the current max priority fee of txs in the mempool. * @returns The current max priority fees. */ getMaxPriorityFees(): Promise; /** * Method to fetch the version of the package. * @returns The node package version */ getNodeVersion(): Promise; /** * Method to fetch the version of the rollup the node is connected to. * @returns The rollup version. */ getVersion(): Promise; /** * Method to fetch the chain id of the base-layer for the rollup. * @returns The chain id. */ getChainId(): Promise; /** * Method to fetch the currently deployed l1 contract addresses. * @returns The deployed contract addresses. */ getL1ContractAddresses(): Promise; /** * Method to fetch the protocol contract addresses. */ getProtocolContractAddresses(): Promise; /** * Registers contract function signatures for debugging purposes. * @param functionSignatures - An array of function signatures to register by selector. */ registerContractFunctionSignatures(functionSignatures: string[]): Promise; /** * Gets public logs based on the provided filter. * @param filter - The filter to apply to the logs. * @returns The requested logs. */ getPublicLogs(filter: LogFilter): Promise; /** * Gets contract class logs based on the provided filter. * @param filter - The filter to apply to the logs. * @returns The requested logs. */ getContractClassLogs(filter: LogFilter): Promise; /** * Gets private logs that match any of the `tags`. For each tag, an array of matching logs is returned. An empty * array implies no logs match that tag. * @param tags - The tags to search for. * @param page - The page number (0-indexed) for pagination. * @param referenceBlock - Optional block hash used to ensure the block still exists before logs are retrieved. * This block is expected to represent the latest block to which the client has synced (called anchor block in PXE). * If specified and the block is not found, an error is thrown. This helps detect reorgs, which could result in * undefined behavior in the client's code. * @returns An array of log arrays, one per tag. Returns at most 10 logs per tag per page. If 10 logs are returned * for a tag, the caller should fetch the next page to check for more logs. */ getPrivateLogsByTags(tags: SiloedTag[], page?: number, referenceBlock?: BlockHash): Promise; /** * Gets public logs that match any of the `tags` from the specified contract. For each tag, an array of matching * logs is returned. An empty array implies no logs match that tag. * @param contractAddress - The contract address to search logs for. * @param tags - The tags to search for. * @param page - The page number (0-indexed) for pagination. * @param referenceBlock - Optional block hash used to ensure the block still exists before logs are retrieved. * This block is expected to represent the latest block to which the client has synced (called anchor block in PXE). * If specified and the block is not found, an error is thrown. This helps detect reorgs, which could result in * undefined behavior in the client's code. * @returns An array of log arrays, one per tag. Returns at most 10 logs per tag per page. If 10 logs are returned * for a tag, the caller should fetch the next page to check for more logs. */ getPublicLogsByTagsFromContract(contractAddress: AztecAddress, tags: Tag[], page?: number, referenceBlock?: BlockHash): Promise; /** * Method to submit a transaction to the p2p pool. * @param tx - The transaction to be submitted. * @returns Nothing. */ sendTx(tx: Tx): Promise; /** * Fetches a transaction receipt for a given transaction hash. Returns a mined receipt if it was added * to the chain, a pending receipt if it's still in the mempool of the connected Aztec node, or a dropped * receipt if not found in the connected Aztec node. * * @param txHash - The transaction hash. * @returns A receipt of the transaction. */ getTxReceipt(txHash: TxHash): Promise; /** * Gets a tx effect. * @param txHash - The hash of the tx corresponding to the tx effect. * @returns The requested tx effect with block info (or undefined if not found). */ getTxEffect(txHash: TxHash): Promise; /** * Method to retrieve pending txs. * @returns The pending txs. */ getPendingTxs(limit?: number, after?: TxHash): Promise; /** * Retrieves the number of pending txs * @returns The number of pending txs. */ getPendingTxCount(): Promise; /** * Method to retrieve a single pending tx. * @param txHash - The transaction hash to return. * @returns The pending tx if it exists. */ getTxByHash(txHash: TxHash): Promise; /** * Method to retrieve multiple pending txs. * @param txHash - The transaction hashes to return. * @returns The pending txs if exist. */ getTxsByHash(txHashes: TxHash[]): Promise; /** * Gets the storage value at the given contract storage slot. * * @remarks The storage slot here refers to the slot as it is defined in Noir not the index in the merkle tree. * Aztec's version of `eth_getStorageAt`. * * @param referenceBlock - The block parameter (block number, block hash, or 'latest') at which to get the data. * @param contract - Address of the contract to query. * @param slot - Slot to query. * @returns Storage value at the given contract slot. */ getPublicStorageAt(referenceBlock: BlockParameter, contract: AztecAddress, slot: Fr): Promise; /** * Returns the block header for a given block number, block hash, or 'latest'. * @param block - The block parameter (block number, block hash, or 'latest'). Defaults to 'latest'. * @returns The requested block header. */ getBlockHeader(block?: BlockParameter): Promise; /** * Get a block header specified by its archive root. * @param archive - The archive root being requested. * @returns The requested block header. */ getBlockHeaderByArchive(archive: Fr): Promise; /** Returns stats for validators if enabled. */ getValidatorsStats(): Promise; /** Returns stats for a single validator if enabled. */ getValidatorStats(validatorAddress: EthAddress, fromSlot?: SlotNumber, toSlot?: SlotNumber): Promise; /** * Simulates the public part of a transaction with the current state. * This currently just checks that the transaction execution succeeds. * @param tx - The transaction to simulate. **/ simulatePublicCalls(tx: Tx, skipFeeEnforcement?: boolean): Promise; /** * Returns true if the transaction is valid for inclusion at the current state. Valid transactions can be * made invalid by *other* transactions if e.g. they emit the same nullifiers, or come become invalid * due to e.g. the expiration_timestamp property. * @param tx - The transaction to validate for correctness. * @param isSimulation - True if the transaction is a simulated one without generated proofs. (Optional) * @param skipFeeEnforcement - True if the validation of the fee should be skipped. Useful when the simulation is for estimating fee (Optional) */ isValidTx(tx: Tx, options?: { isSimulation?: boolean; skipFeeEnforcement?: boolean; }): Promise; /** * Returns a registered contract class given its id. * @param id - Id of the contract class. */ getContractClass(id: Fr): Promise; /** * Returns a publicly deployed contract instance given its address. * @param address - Address of the deployed contract. */ getContract(address: AztecAddress): Promise; /** * Returns the ENR of this node for peer discovery, if available. */ getEncodedEnr(): Promise; /** * Returns the list of allowed public setup elements configured for this node. * @returns The list of allowed elements. */ getAllowedPublicSetup(): Promise; } export declare const AztecNodeApiSchema: ApiSchemaFor; export declare function createAztecNodeClient(url: string, versions?: Partial, fetch?: typeof import("@aztec/foundation/json-rpc/client").defaultFetch, batchWindowMS?: number): AztecNode; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWMtbm9kZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ludGVyZmFjZXMvYXp0ZWMtbm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkcsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQTZCLE1BQU0sdUNBQXVDLENBQUM7QUFDNUcsT0FBTyxFQUNMLFdBQVcsRUFHWCxnQkFBZ0IsRUFHaEIsV0FBVyxFQUVYLEtBQUssVUFBVSxFQUNoQixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUl6RSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUF3QixNQUFNLDZCQUE2QixDQUFDO0FBRXhGLE9BQU8sRUFBRSxLQUFLLFdBQVcsRUFBd0IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEtBQUssYUFBYSxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLDZCQUE2QixDQUFDO0FBRzVGLE9BQU8sRUFDTCxLQUFLLG1CQUFtQixFQUV4QixLQUFLLDJCQUEyQixFQUVoQyxLQUFLLFFBQVEsRUFFYixLQUFLLHlCQUF5QixFQUUvQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQW1CLE1BQU0sdUJBQXVCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssWUFBWSxFQUFxQixNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsV0FBVyxFQUNYLEtBQUssZUFBZSxFQUNwQixzQkFBc0IsRUFDdEIsRUFBRSxFQUNGLE1BQU0sRUFDTixTQUFTLEVBQ1QsS0FBSyxrQkFBa0IsRUFHeEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsS0FBSyxrQkFBa0IsRUFBZ0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQXdCLE1BQU0sc0JBQXNCLENBQUM7QUFFakYsT0FBTyxFQUNMLEtBQUssNEJBQTRCLEVBRWpDLEtBQUsscUJBQXFCLEVBRTNCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQThCLE1BQU0sa0JBQWtCLENBQUM7QUFFekY7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLFNBQ2YsU0FBUSxJQUFJLENBQ1YsYUFBYSxFQUNYLFdBQVcsR0FDWCxnQkFBZ0IsR0FDaEIsZ0JBQWdCLEdBQ2hCLFdBQVcsR0FDWCx1QkFBdUIsR0FDdkIsNEJBQTRCLENBQy9CO0lBQ0Q7O09BRUc7SUFDSCxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTdCOztPQUVHO0lBQ0gsdUJBQXVCLElBQUksT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFekQ7Ozs7Ozs7T0FPRztJQUNILGlCQUFpQixDQUNmLGNBQWMsRUFBRSxjQUFjLEVBQzlCLE1BQU0sRUFBRSxZQUFZLEVBQ3BCLFVBQVUsRUFBRSxFQUFFLEVBQUUsR0FDZixPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWhEOzs7OztPQUtHO0lBQ0gsNkJBQTZCLENBQzNCLGNBQWMsRUFBRSxjQUFjLEVBQzlCLFNBQVMsRUFBRSxFQUFFLEdBQ1osT0FBTyxDQUFDLDBCQUEwQixHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRW5EOzs7Ozs7Ozs7T0FTRztJQUNILGdDQUFnQyxDQUM5QixjQUFjLEVBQUUsY0FBYyxFQUM5QixTQUFTLEVBQUUsRUFBRSxHQUNaLE9BQU8sQ0FBQywwQkFBMEIsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUVuRDs7Ozs7Ozs7T0FRRztJQUNILG9CQUFvQixDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFM0c7Ozs7Ozs7Ozs7O09BV0c7SUFDSCw2QkFBNkIsQ0FDM0IsY0FBYyxFQUFFLGNBQWMsRUFDOUIsU0FBUyxFQUFFLFNBQVMsR0FDbkIsT0FBTyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sY0FBYyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFakU7Ozs7T0FJRztJQUNILDRCQUE0QixDQUMxQixjQUFjLEVBQUUsY0FBYyxFQUM5QixRQUFRLEVBQUUsRUFBRSxHQUNYLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLHFCQUFxQixDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFeEU7Ozs7O09BS0c7SUFDSCxpQ0FBaUMsQ0FDL0IsY0FBYyxFQUFFLGNBQWMsRUFDOUIsYUFBYSxFQUFFLEVBQUUsR0FDaEIsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLHdCQUF3QixDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUUvRSxvSEFBb0g7SUFDcEgsMEJBQTBCLENBQUMsYUFBYSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFckY7Ozs7O09BS0c7SUFDSCxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUzRDs7Ozs7T0FLRztJQUNILGlCQUFpQixDQUFDLEtBQUssRUFBRSxXQUFXLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFM0Q7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxjQUFjLEVBQUUsY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFdkU7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFbkU7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUU3RDs7O09BR0c7SUFDSCxjQUFjLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXZDOzs7T0FHRztJQUNILG9CQUFvQixJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU3Qzs7O09BR0c7SUFDSCwwQkFBMEIsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFbkQ7OztPQUdHO0lBQ0gsbUJBQW1CLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFakQ7OztPQUdHO0lBQ0gsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1Qjs7OztPQUlHO0lBQ0gsV0FBVyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVqQzs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFaEU7OztPQUdHO0lBQ0gsaUJBQWlCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRDOzs7T0FHRztJQUNILGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV2Qzs7O09BR0c7SUFDSCxjQUFjLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWxDOzs7T0FHRztJQUNILFVBQVUsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFOUI7OztPQUdHO0lBQ0gsVUFBVSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5Qjs7O09BR0c7SUFDSCxzQkFBc0IsSUFBSSxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUV2RDs7T0FFRztJQUNILDRCQUE0QixJQUFJLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRW5FOzs7T0FHRztJQUNILGtDQUFrQyxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVoRjs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFFakU7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFFL0U7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRS9HOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILCtCQUErQixDQUM3QixlQUFlLEVBQUUsWUFBWSxFQUM3QixJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQ1gsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUNiLGNBQWMsQ0FBQyxFQUFFLFNBQVMsR0FDekIsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUU5Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTlCOzs7Ozs7O09BT0c7SUFDSCxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFbEU7OztPQUdHO0lBQ0gsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFN0Q7OztPQUdHO0lBQ0gsaUJBQWlCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXJDOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXJEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWhEOzs7Ozs7Ozs7O09BVUc7SUFDSCxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbEc7Ozs7T0FJRztJQUNILGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUV6RTs7OztPQUlHO0lBQ0gsdUJBQXVCLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXZFLCtDQUErQztJQUMvQyxrQkFBa0IsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFL0MsdURBQXVEO0lBQ3ZELGlCQUFpQixDQUNmLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUNyQixNQUFNLENBQUMsRUFBRSxVQUFVLEdBQ2xCLE9BQU8sQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUU3Qzs7OztRQUlJO0lBQ0osbUJBQW1CLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUUzRjs7Ozs7OztPQU9HO0lBQ0gsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFBRSxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUM7UUFBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQTtLQUFFLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFbkg7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFbkU7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLE9BQU8sRUFBRSxZQUFZLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXJGOztPQUVHO0lBQ0gsYUFBYSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFN0M7OztPQUdHO0lBQ0gscUJBQXFCLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7Q0FDcEQ7QUFLRCxlQUFPLE1BQU0sa0JBQWtCLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0F5S3RELENBQUM7QUFFRix3QkFBZ0IscUJBQXFCLENBQ25DLEdBQUcsRUFBRSxNQUFNLEVBQ1gsUUFBUSxHQUFFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBTSxFQUMxQyxLQUFLLGtFQUE4QixFQUNuQyxhQUFhLFNBQUksR0FDaEIsU0FBUyxDQU9YIn0=