More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 5,859 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 15286422 | 2 days ago | IN | 0 ETH | 0.00000005 | ||||
Set Approval For... | 15254286 | 3 days ago | IN | 0 ETH | 0.0000002 | ||||
Set Approval For... | 15246362 | 3 days ago | IN | 0 ETH | 0.00000023 | ||||
Set Approval For... | 15217423 | 4 days ago | IN | 0 ETH | 0.00000014 | ||||
Set Approval For... | 15217255 | 4 days ago | IN | 0 ETH | 0.00000015 | ||||
Set Approval For... | 15138929 | 6 days ago | IN | 0 ETH | 0.00000003 | ||||
Set Approval For... | 15136825 | 6 days ago | IN | 0 ETH | 0.00000008 | ||||
Set Approval For... | 15136754 | 6 days ago | IN | 0 ETH | 0.00000008 | ||||
Set Approval For... | 15131448 | 6 days ago | IN | 0 ETH | 0.00000003 | ||||
Set Approval For... | 14937839 | 10 days ago | IN | 0 ETH | 0 | ||||
Set Approval For... | 14925226 | 11 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14838608 | 13 days ago | IN | 0 ETH | 0 | ||||
Set Approval For... | 14768621 | 14 days ago | IN | 0 ETH | 0.00000005 | ||||
Set Approval For... | 14763995 | 14 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14763995 | 14 days ago | IN | 0 ETH | 0.00000003 | ||||
Set Approval For... | 14751092 | 15 days ago | IN | 0 ETH | 0.00000009 | ||||
Set Approval For... | 14735751 | 15 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14636804 | 17 days ago | IN | 0 ETH | 0.00000006 | ||||
Set Approval For... | 14598254 | 18 days ago | IN | 0 ETH | 0 | ||||
Set Approval For... | 14581158 | 19 days ago | IN | 0 ETH | 0.00000001 | ||||
Set Approval For... | 14518961 | 20 days ago | IN | 0 ETH | 0.00000002 | ||||
Set Approval For... | 14516366 | 20 days ago | IN | 0 ETH | 0.00000002 | ||||
Safe Transfer Fr... | 14476625 | 21 days ago | IN | 0 ETH | 0 | ||||
Set Approval For... | 14463022 | 21 days ago | IN | 0 ETH | 0.00000019 | ||||
Set Approval For... | 14443572 | 22 days ago | IN | 0 ETH | 0.00000046 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
562816 | 343 days ago | 24.0453 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MintifyBlastKeys
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at blastscan.io on 2024-03-06 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the Merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates Merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** *@dev The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the Merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: closedsea/src/OperatorFilterer.sol pragma solidity ^0.8.4; /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) { // If the function selector has not been overwritten, // it is an out-of-gas error. if eq(shr(224, mload(0x00)), functionSelector) { // To prevent gas under-estimation. revert(0, 0) } } // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if the caller is a blocked operator. modifier onlyAllowedOperator(address from) virtual { if (from != msg.sender) { if (!_isPriorityOperator(msg.sender)) { if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender); } } _; } /// @dev Modifier to guard a function from approving a blocked operator.. modifier onlyAllowedOperatorApproval(address operator) virtual { if (!_isPriorityOperator(operator)) { if (_operatorFilteringEnabled()) _revertIfBlocked(operator); } _; } /// @dev Helper function that reverts if the `operator` is blocked by the registry. function _revertIfBlocked(address operator) private view { /// @solidity memory-safe-assembly assembly { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`. mstore(0x3a, operator) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } /// @dev For deriving contracts to override, so that operator filtering /// can be turned on / off. /// Returns true by default. function _operatorFilteringEnabled() internal view virtual returns (bool) { return true; } /// @dev For deriving contracts to override, so that preferred marketplaces can /// skip operator filtering, helping users save gas. /// Returns false for all inputs by default. function _isPriorityOperator(address) internal view virtual returns (bool) { return false; } } // File: @openzeppelin/contracts/utils/structs/BitMaps.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol) pragma solidity ^0.8.0; /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. * Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. */ library BitMaps { struct BitMap { mapping(uint256 => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo(BitMap storage bitmap, uint256 index, bool value) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] &= ~mask; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: Mintify Blast Keys.sol pragma solidity ^0.8.18; error MaxPerOrderExceeded(); error MaxSupplyExceeded(); error MaxPerWalletExceeded(); error PresaleClosed(); error NotInPresaleList(); error PublicSaleClosed(); error TransfersLocked(); error NotAllowedByRegistry(); error RegistryNotSet(); error WrongWeiSent(); error MaxFeeExceeded(); error InputLengthsMismatch(); error InvalidMerkleProof(); enum YieldMode { AUTOMATIC, VOID, CLAIMABLE } enum GasMode { VOID, CLAIMABLE } interface IRegistry { function isAllowedOperator(address operator) external view returns (bool); } interface IERC20Rebasing { /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); // changes the yield mode of the caller and update the balance // to reflect the configuration function configure(YieldMode) external returns (uint256); // "claimable" yield mode accounts can call this this claim their yield // to another address function claim(address recipient, uint256 amount) external returns (uint256); // read the claimable amount for an account function getClaimableAmount(address account) external view returns (uint256); } interface IBlast{ // configure function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external; function configure(YieldMode _yield, GasMode gasMode, address governor) external; // base configuration options function configureClaimableYield() external; function configureClaimableYieldOnBehalf(address contractAddress) external; function configureAutomaticYield() external; function configureAutomaticYieldOnBehalf(address contractAddress) external; function configureVoidYield() external; function configureVoidYieldOnBehalf(address contractAddress) external; function configureClaimableGas() external; function configureClaimableGasOnBehalf(address contractAddress) external; function configureVoidGas() external; function configureVoidGasOnBehalf(address contractAddress) external; function configureGovernor(address _governor) external; function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external; // claim yield function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256); function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256); // claim gas function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256); function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256); // read functions function readClaimableYield(address contractAddress) external view returns (uint256); function readYieldConfiguration(address contractAddress) external view returns (uint8); function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode); } contract MintifyBlastKeys is Ownable, OperatorFilterer, ERC2981, ERC721A { using BitMaps for BitMaps.BitMap; bool public presaleOpen; bool public publicOpen; uint256 private maxSupply = 10000; uint256 private maxPerWallet; uint256 private maxPerOrder; uint256 private publicPrice = 26900000000000000; uint256 private presalePrice = 30000000000000000; bytes32 public merkleRoot; bool public operatorFilteringEnabled = true; bool public initialTransferLockOn = true; bool public isRegistryActive; address public registryAddress; string public _baseTokenURI = "https://genesis-metas.mintify.xyz"; IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002); IERC20Rebasing public constant USDB = IERC20Rebasing(0x4300000000000000000000000000000000000003); // MAINNET BLAST // IERC20Rebasing public constant USDB = IERC20Rebasing(0x4200000000000000000000000000000000000022); // SEPOLIA BLAST IERC20Rebasing public constant WETH = IERC20Rebasing(0x4300000000000000000000000000000000000004); // MAINNET BLAST // IERC20Rebasing public constant WETH = IERC20Rebasing(0x4200000000000000000000000000000000000023); // SEPOLIA BLAST YieldMode public yieldMode = YieldMode.AUTOMATIC; GasMode public gasMode = GasMode.CLAIMABLE; constructor() ERC721A("Mintify Blast Keys", "MNFBLK") { // ============== // BLAST yield and gas fees configuration // ============== BLAST.configureAutomaticYield(); BLAST.configureClaimableGas(); USDB.configure(YieldMode.AUTOMATIC); //configure claimable yield for USDB WETH.configure(YieldMode.AUTOMATIC); //configure claimable yield for WETH // Register operator filtering _registerForOperatorFiltering(); // Set initial 2% royalty _setDefaultRoyalty(owner(), 200); } // PreSale Mint function presaleMint(uint256 quantity, bytes32[] calldata merkleProof) external payable { if (maxPerOrder != 0 && quantity > maxPerOrder) { revert MaxPerOrderExceeded(); } if (maxSupply != 0 && totalSupply() + quantity > maxSupply) { revert MaxSupplyExceeded(); } if (maxPerWallet != 0 && balanceOf(msg.sender) + quantity > maxPerWallet) { revert MaxPerWalletExceeded(); } if (!presaleOpen) { revert PresaleClosed(); } if (msg.value != (presalePrice * quantity)) { revert WrongWeiSent(); } // Using Merkle Tree bytes32 node = keccak256(abi.encodePacked(msg.sender)); if (!MerkleProof.verify(merkleProof, merkleRoot, node)) { revert InvalidMerkleProof(); } _mint(msg.sender, quantity); } // Public Mint function publicMint(uint256 quantity) external payable { if (maxPerOrder != 0 && quantity > maxPerOrder) { revert MaxPerOrderExceeded(); } if (maxSupply != 0 && totalSupply() + quantity > maxSupply) { revert MaxSupplyExceeded(); } if (maxPerWallet != 0 && balanceOf(msg.sender) + quantity > maxPerWallet) { revert MaxPerWalletExceeded(); } if (!publicOpen) { revert PublicSaleClosed(); } if (msg.value != (publicPrice * quantity)) { revert WrongWeiSent(); } _mint(msg.sender, quantity); } // ========================================================================= // BLAST Functions // ========================================================================= // ================== // Owner Functions // ================== // Set yield mode function setYieldMode(YieldMode _newMode) external onlyOwner { yieldMode = _newMode; BLAST.configure(yieldMode, gasMode, address(this)); } // Set WETH yield mode function setWETHYieldMode(YieldMode _newMode) external onlyOwner { WETH.configure(_newMode); } // Set USDB yield mode function setUSDBYieldMode(YieldMode _newMode) external onlyOwner { USDB.configure(_newMode); } // Claim all yield function claimAllYield() external onlyOwner { BLAST.claimAllYield(address(this), msg.sender); } // Claim yield by amount function claimYield(uint256 _amount) external onlyOwner { BLAST.claimYield(address(this), msg.sender, _amount); } // Claim WETH yield function claimWETHYield() external onlyOwner { WETH.claim(msg.sender, WETH.getClaimableAmount(address(this))); } // Claim USDB yield function claimUSDBYield() external onlyOwner { USDB.claim(msg.sender, USDB.getClaimableAmount(address(this))); } // Set gas mode function setGasMode(GasMode _newMode) external onlyOwner { gasMode = _newMode; BLAST.configure(yieldMode, gasMode, address(this)); } // Claim gas fees function claimAllGasFees() external onlyOwner { BLAST.claimAllGas(address(this), msg.sender); } // Claim matured fees function claimMaturedGasFees() external onlyOwner { BLAST.claimMaxGas(address(this), msg.sender); } // ================== // Public Functions // ================== function getYieldMode() public view returns (YieldMode) { return yieldMode; } function getGassMode() public view returns (GasMode) { return gasMode; } // ========================================================================= // Owner Only Functions // ========================================================================= // Owner airdrop function airDrop(address[] memory users, uint256[] memory amounts) external onlyOwner { // iterate over users and amounts if (users.length != amounts.length) { revert InputLengthsMismatch(); } for (uint256 i; i < users.length;) { if (maxSupply != 0 && totalSupply() + amounts[i] > maxSupply) { revert MaxSupplyExceeded(); } _mint(users[i], amounts[i]); unchecked { ++i; } } } // Owner unrestricted mint function ownerMint(address to, uint256 quantity) external onlyOwner { if (maxSupply != 0 && totalSupply() + quantity > maxSupply) { revert MaxSupplyExceeded(); } _mint(to, quantity); } // Enables or disables public sale function setPublicState(bool newState) external onlyOwner { publicOpen = newState; } // Enables or disables presale function setPresaleState(bool newState) external onlyOwner { presaleOpen = newState; } // Set merkle root function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } // Set max supply function setMaxSupply(uint256 newMaxSupply) external onlyOwner { maxSupply = newMaxSupply; } // Set max per wallet function setMaxPerWallet(uint256 newMaxPerWallet) external onlyOwner { maxPerWallet = newMaxPerWallet; } // Set max per order function setMaxPerOrder(uint256 newMaxPerOrder) external onlyOwner { maxPerOrder = newMaxPerOrder; } // Set public sale price function setPublicSalePrice(uint256 newPrice) external onlyOwner { publicPrice = newPrice; } // Set presale price function setPresalePrice(uint256 newPrice) external onlyOwner { presalePrice = newPrice; } // Withdraw Balance to owner function withdraw() public onlyOwner { payable(owner()).transfer(address(this).balance); } // Withdraw Balance to Address function withdrawTo(address payable _to) public onlyOwner { _to.transfer(address(this).balance); } // Break Transfer Lock function breakLock() external onlyOwner { initialTransferLockOn = false; } // Withdraw any ERC20 balance function withdrawERC20(address _token, address _to) external onlyOwner { IERC20Rebasing token = IERC20Rebasing(_token); token.transfer(_to, token.balanceOf(address(this))); } // Withdraw WETH function withdrawWETH(address _to) external onlyOwner { WETH.transfer(_to, WETH.balanceOf(address(this))); } // Withdraw USDB function withdrawUSDB(address _to) external onlyOwner { USDB.transfer(_to, USDB.balanceOf(address(this))); } // ========================================================================= // ERC721A Misc // ========================================================================= function _startTokenId() internal pure override returns (uint256) { return 1; } // ========================================================================= // Operator filtering // ========================================================================= function setApprovalForAll(address operator, bool approved) public override (ERC721A) onlyAllowedOperatorApproval(operator) { if (initialTransferLockOn) { revert TransfersLocked(); } super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override (ERC721A) onlyAllowedOperatorApproval(operator) { if (initialTransferLockOn) { revert TransfersLocked(); } super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override (ERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function setOperatorFilteringEnabled(bool value) public onlyOwner { operatorFilteringEnabled = value; } function _operatorFilteringEnabled() internal view override returns (bool) { return operatorFilteringEnabled; } // ========================================================================= // Registry Check // ========================================================================= function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal override { if (initialTransferLockOn && from != address(0) && to != address(0)) { revert TransfersLocked(); } if (_isValidAgainstRegistry(msg.sender)) { super._beforeTokenTransfers(from, to, startTokenId, quantity); } else { revert NotAllowedByRegistry(); } } function _isValidAgainstRegistry(address operator) internal view returns (bool) { if (isRegistryActive) { IRegistry registry = IRegistry(registryAddress); return registry.isAllowedOperator(operator); } return true; } function setIsRegistryActive(bool _isRegistryActive) external onlyOwner { if (registryAddress == address(0)) revert RegistryNotSet(); isRegistryActive = _isRegistryActive; } function setRegistryAddress(address _registryAddress) external onlyOwner { registryAddress = _registryAddress; } // ========================================================================= // ERC165 // ========================================================================= function supportsInterface(bytes4 interfaceId) public view override (ERC721A, ERC2981) returns (bool) { // Supports the following `interfaceId`s: // - IERC165: 0x01ffc9a7 // - IERC721: 0x80ac58cd // - IERC721Metadata: 0x5b5e139f // - IERC2981: 0x2a55205a return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } // ========================================================================= // ERC2891 // ========================================================================= function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { if (feeNumerator > 1000) { revert MaxFeeExceeded(); } _setDefaultRoyalty(receiver, feeNumerator); } function setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) external onlyOwner { if (feeNumerator > 1000) { revert MaxFeeExceeded(); } _setTokenRoyalty(tokenId, receiver, feeNumerator); } // ========================================================================= // Metadata // ========================================================================= function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, "/blast/", _toString(tokenId))) : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InputLengthsMismatch","type":"error"},{"inputs":[],"name":"InvalidMerkleProof","type":"error"},{"inputs":[],"name":"MaxFeeExceeded","type":"error"},{"inputs":[],"name":"MaxPerOrderExceeded","type":"error"},{"inputs":[],"name":"MaxPerWalletExceeded","type":"error"},{"inputs":[],"name":"MaxSupplyExceeded","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"NotAllowedByRegistry","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"PresaleClosed","type":"error"},{"inputs":[],"name":"PublicSaleClosed","type":"error"},{"inputs":[],"name":"RegistryNotSet","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"TransfersLocked","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"WrongWeiSent","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDB","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"breakLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllGasFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimMaturedGasFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimUSDBYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimWETHYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"claimYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasMode","outputs":[{"internalType":"enum GasMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGassMode","outputs":[{"internalType":"enum GasMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYieldMode","outputs":[{"internalType":"enum YieldMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialTransferLockOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRegistryActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum GasMode","name":"_newMode","type":"uint8"}],"name":"setGasMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isRegistryActive","type":"bool"}],"name":"setIsRegistryActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerOrder","type":"uint256"}],"name":"setMaxPerOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setPublicState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registryAddress","type":"address"}],"name":"setRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YieldMode","name":"_newMode","type":"uint8"}],"name":"setUSDBYieldMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YieldMode","name":"_newMode","type":"uint8"}],"name":"setWETHYieldMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum YieldMode","name":"_newMode","type":"uint8"}],"name":"setYieldMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawUSDB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldMode","outputs":[{"internalType":"enum YieldMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052612710600c55665f916850754000600f55666a94d74f430000601055600160125f6101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506040518060600160405280602181526020016200640c60219139601390816200007f91906200098e565b505f60145f6101000a81548160ff02191690836002811115620000a757620000a662000a72565b5b02179055506001601460016101000a81548160ff02191690836001811115620000d557620000d462000a72565b5b0217905550348015620000e6575f80fd5b506040518060400160405280601281526020017f4d696e7469667920426c617374204b65797300000000000000000000000000008152506040518060400160405280600681526020017f4d4e46424c4b00000000000000000000000000000000000000000000000000008152506200017362000167620003ef60201b60201c565b620003f660201b60201c565b81600590816200018491906200098e565b5080600690816200019691906200098e565b50620001a7620004b760201b60201c565b600381905550505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16637114177a6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801562000209575f80fd5b505af11580156200021c573d5f803e3d5ffd5b5050505073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff16634e606c476040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156200027a575f80fd5b505af11580156200028d573d5f803e3d5ffd5b5050505073430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff16631a33757d5f6040518263ffffffff1660e01b8152600401620002e0919062000aee565b6020604051808303815f875af1158015620002fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000323919062000b3c565b5073430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff16631a33757d5f6040518263ffffffff1660e01b815260040162000373919062000aee565b6020604051808303815f875af115801562000390573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003b6919062000b3c565b50620003c7620004bf60201b60201c565b620003e9620003db620004e860201b60201c565b60c86200050f60201b60201c565b62000c7e565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6001905090565b620004e6733cc6cdda760b79bafa08df41ecfa224f810dceb66001620006ad60201b60201c565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200051f6200072160201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005779062000bf0565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005e89062000c5e565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b637d3e3dbe8260601b60601c925081620006dc5782620006d457634420e4869050620006dc565b63a0af290390505b8060e01b5f52306004528260245260045f60445f806daaeb6d7670e522a718067333cd4e5af16200071857805f5160e01c0362000717575f80fd5b5b5f602452505050565b5f612710905090565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620007a657607f821691505b602082108103620007bc57620007bb62000761565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620008207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e3565b6200082c8683620007e3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000876620008706200086a8462000844565b6200084d565b62000844565b9050919050565b5f819050919050565b620008918362000856565b620008a9620008a0826200087d565b848454620007ef565b825550505050565b5f90565b620008bf620008b1565b620008cc81848462000886565b505050565b5b81811015620008f357620008e75f82620008b5565b600181019050620008d2565b5050565b601f82111562000942576200090c81620007c2565b6200091784620007d4565b8101602085101562000927578190505b6200093f6200093685620007d4565b830182620008d1565b50505b505050565b5f82821c905092915050565b5f620009645f198460080262000947565b1980831691505092915050565b5f6200097e838362000953565b9150826002028217905092915050565b62000999826200072a565b67ffffffffffffffff811115620009b557620009b462000734565b5b620009c182546200078e565b620009ce828285620008f7565b5f60209050601f83116001811462000a04575f8415620009ef578287015190505b620009fb858262000971565b86555062000a6a565b601f19841662000a1486620007c2565b5f5b8281101562000a3d5784890151825560018201915060208501945060208101905062000a16565b8683101562000a5d578489015162000a59601f89168262000953565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6003811062000ab35762000ab262000a72565b5b50565b5f81905062000ac58262000a9f565b919050565b5f62000ad68262000ab6565b9050919050565b62000ae88162000aca565b82525050565b5f60208201905062000b035f83018462000add565b92915050565b5f80fd5b62000b188162000844565b811462000b23575f80fd5b50565b5f8151905062000b368162000b0d565b92915050565b5f6020828403121562000b545762000b5362000b09565b5b5f62000b638482850162000b26565b91505092915050565b5f82825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c206578636565645f8201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b5f62000bd8602a8362000b6c565b915062000be58262000b7c565b604082019050919050565b5f6020820190508181035f83015262000c098162000bca565b9050919050565b7f455243323938313a20696e76616c6964207265636569766572000000000000005f82015250565b5f62000c4660198362000b6c565b915062000c538262000c10565b602082019050919050565b5f6020820190508181035f83015262000c778162000c38565b9050919050565b6157808062000c8c5f395ff3fe6080604052600436106103e3575f3560e01c8063791a251911610207578063b88656a811610117578063cfc86f7b116100aa578063e3e1e8ef11610079578063e3e1e8ef14610d66578063e985e9c514610d82578063ed9aab5114610dbe578063f2fde38b14610de8578063fb796e6c14610e10576103e3565b8063cfc86f7b14610cd6578063d7a5b5d714610d00578063d93d93a214610d16578063e268e4d314610d3e576103e3565b8063bee6348a116100e6578063bee6348a14610c20578063c48156af14610c4a578063c5bcfbf314610c72578063c87b56dd14610c9a576103e3565b8063b88656a814610b8a578063b88d4fde14610bb2578063ba70c51514610bce578063bce4d6ae14610bf8576103e3565b80639ad302941161019a578063a73ea62d11610169578063a73ea62d14610abc578063ab7b499314610ae6578063abd017ea14610b0e578063ad5c464814610b38578063b7c0b8e814610b62576103e3565b80639ad3029414610a52578063a22cb46514610a68578063a4951daf14610a90578063a70138c114610aa6576103e3565b80639456fbcc116101d65780639456fbcc146109c057806395d89b41146109e857806397d7577614610a1257806399807a3014610a3c576103e3565b8063791a25191461091e5780637cb64759146109465780638da5cb5b1461096e578063918d439b14610998576103e3565b8063409a33ce1161030257806354373ccd1161029557806365216a411161026457806365216a41146108545780636f8b44b01461087c57806370a08231146108a4578063715018a6146108e057806372b0d90c146108f6576103e3565b806354373ccd1461079e57806355f804b3146107c85780635944c753146107f05780636352211e14610818576103e3565b806347f6997b116102d157806347f6997b146106fa578063484b973c146107245780634c8336fb1461074c5780635328ae0114610774576103e3565b8063409a33ce1461067857806340bd2e231461068e57806342842e0e146106b657806346fff98d146106d2576103e3565b806323b872dd1161037a5780632f5f367b116103495780632f5f367b146105e857806331a0edec146106105780633549345e1461063a5780633ccfd60b14610662576103e3565b806323b872dd146105495780632a55205a146105655780632db11544146105a25780632eb4a7ab146105be576103e3565b8063095ea7b3116103b6578063095ea7b3146104b15780630d236be6146104cd57806312b36510146104f557806318160ddd1461051f576103e3565b806301ffc9a7146103e757806304634d8d1461042357806306fdde031461044b578063081812fc14610475575b5f80fd5b3480156103f2575f80fd5b5061040d6004803603810190610408919061411e565b610e3a565b60405161041a9190614163565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190614217565b610e5b565b005b348015610456575f80fd5b5061045f610ebb565b60405161046c91906142df565b60405180910390f35b348015610480575f80fd5b5061049b60048036038101906104969190614332565b610f4b565b6040516104a8919061436c565b60405180910390f35b6104cb60048036038101906104c69190614385565b610fc5565b005b3480156104d8575f80fd5b506104f360048036038101906104ee91906143e6565b611041565b005b348015610500575f80fd5b50610509611111565b6040516105169190614163565b60405180910390f35b34801561052a575f80fd5b50610533611124565b6040516105409190614420565b60405180910390f35b610563600480360381019061055e9190614439565b61113a565b005b348015610570575f80fd5b5061058b60048036038101906105869190614489565b6111a5565b6040516105999291906144c7565b60405180910390f35b6105bc60048036038101906105b79190614332565b611381565b005b3480156105c9575f80fd5b506105d261151d565b6040516105df9190614506565b60405180910390f35b3480156105f3575f80fd5b5061060e60048036038101906106099190614542565b611523565b005b34801561061b575f80fd5b506106246115f2565b60405161063191906145c8565b60405180910390f35b348015610645575f80fd5b50610660600480360381019061065b9190614332565b61160a565b005b34801561066d575f80fd5b5061067661161c565b005b348015610683575f80fd5b5061068c611671565b005b348015610699575f80fd5b506106b460048036038101906106af9190614332565b61170b565b005b6106d060048036038101906106cb9190614439565b6117a8565b005b3480156106dd575f80fd5b506106f860048036038101906106f3919061460b565b611813565b005b348015610705575f80fd5b5061070e6118bf565b60405161071b91906146a9565b60405180910390f35b34801561072f575f80fd5b5061074a60048036038101906107459190614385565b6118d2565b005b348015610757575f80fd5b50610772600480360381019061076d9190614542565b611944565b005b34801561077f575f80fd5b506107886119dd565b6040516107959190614708565b60405180910390f35b3480156107a9575f80fd5b506107b26119ef565b6040516107bf91906146a9565b60405180910390f35b3480156107d3575f80fd5b506107ee60048036038101906107e99190614782565b611a05565b005b3480156107fb575f80fd5b50610816600480360381019061081191906147cd565b611a23565b005b348015610823575f80fd5b5061083e60048036038101906108399190614332565b611a85565b60405161084b919061436c565b60405180910390f35b34801561085f575f80fd5b5061087a60048036038101906108759190614a15565b611a96565b005b348015610887575f80fd5b506108a2600480360381019061089d9190614332565b611ba8565b005b3480156108af575f80fd5b506108ca60048036038101906108c59190614a8b565b611bba565b6040516108d79190614420565b60405180910390f35b3480156108eb575f80fd5b506108f4611c6f565b005b348015610901575f80fd5b5061091c60048036038101906109179190614af1565b611c82565b005b348015610929575f80fd5b50610944600480360381019061093f9190614332565b611cd1565b005b348015610951575f80fd5b5061096c60048036038101906109679190614b46565b611ce3565b005b348015610979575f80fd5b50610982611cf5565b60405161098f919061436c565b60405180910390f35b3480156109a3575f80fd5b506109be60048036038101906109b99190614a8b565b611d1c565b005b3480156109cb575f80fd5b506109e660048036038101906109e19190614b71565b611e42565b005b3480156109f3575f80fd5b506109fc611f46565b604051610a0991906142df565b60405180910390f35b348015610a1d575f80fd5b50610a26611fd6565b604051610a339190614bcf565b60405180910390f35b348015610a47575f80fd5b50610a50611fee565b005b348015610a5d575f80fd5b50610a66612088565b005b348015610a73575f80fd5b50610a8e6004803603810190610a899190614be8565b612122565b005b348015610a9b575f80fd5b50610aa461219e565b005b348015610ab1575f80fd5b50610aba6122c3565b005b348015610ac7575f80fd5b50610ad06122e7565b604051610add9190614708565b60405180910390f35b348015610af1575f80fd5b50610b0c6004803603810190610b079190614a8b565b6122fc565b005b348015610b19575f80fd5b50610b22612348565b604051610b2f9190614163565b60405180910390f35b348015610b43575f80fd5b50610b4c61235b565b604051610b5991906145c8565b60405180910390f35b348015610b6d575f80fd5b50610b886004803603810190610b83919061460b565b612373565b005b348015610b95575f80fd5b50610bb06004803603810190610bab9190614542565b612397565b005b610bcc6004803603810190610bc79190614cd6565b612430565b005b348015610bd9575f80fd5b50610be261249d565b604051610bef9190614163565b60405180910390f35b348015610c03575f80fd5b50610c1e6004803603810190610c19919061460b565b6124b0565b005b348015610c2b575f80fd5b50610c346124d4565b604051610c419190614163565b60405180910390f35b348015610c55575f80fd5b50610c706004803603810190610c6b919061460b565b6124e6565b005b348015610c7d575f80fd5b50610c986004803603810190610c939190614a8b565b61250b565b005b348015610ca5575f80fd5b50610cc06004803603810190610cbb9190614332565b612631565b604051610ccd91906142df565b60405180910390f35b348015610ce1575f80fd5b50610cea6126cc565b604051610cf791906142df565b60405180910390f35b348015610d0b575f80fd5b50610d14612758565b005b348015610d21575f80fd5b50610d3c6004803603810190610d379190614332565b61287d565b005b348015610d49575f80fd5b50610d646004803603810190610d5f9190614332565b61288f565b005b610d806004803603810190610d7b9190614dab565b6128a1565b005b348015610d8d575f80fd5b50610da86004803603810190610da39190614b71565b612aec565b604051610db59190614163565b60405180910390f35b348015610dc9575f80fd5b50610dd2612b7a565b604051610ddf919061436c565b60405180910390f35b348015610df3575f80fd5b50610e0e6004803603810190610e099190614a8b565b612ba0565b005b348015610e1b575f80fd5b50610e24612c22565b604051610e319190614163565b60405180910390f35b5f610e4482612c34565b80610e545750610e5382612cc5565b5b9050919050565b610e63612d3e565b6103e8816bffffffffffffffffffffffff161115610ead576040517ff4df6ae500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb78282612dbc565b5050565b606060058054610eca90614e35565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef690614e35565b8015610f415780601f10610f1857610100808354040283529160200191610f41565b820191905f5260205f20905b815481529060010190602001808311610f2457829003601f168201915b5050505050905090565b5f610f5582612f4c565b610f8b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610fcf81612fa7565b610feb57610fdb612fad565b15610fea57610fe981612fc2565b5b5b601260019054906101000a900460ff1615611032576040517fdb89e3f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61103c8383613001565b505050565b611049612d3e565b80601460016101000a81548160ff0219169083600181111561106e5761106d614636565b5b021790555073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663c8992e6160145f9054906101000a900460ff16601460019054906101000a900460ff16306040518463ffffffff1660e01b81526004016110e193929190614e65565b5f604051808303815f87803b1580156110f8575f80fd5b505af115801561110a573d5f803e3d5ffd5b5050505050565b601260019054906101000a900460ff1681565b5f61112d613140565b6004546003540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111945761117733612fa7565b61119357611183612fad565b156111925761119133612fc2565b5b5b5b61119f848484613148565b50505050565b5f805f60025f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff160361132e5760016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f611337613457565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113639190614ec7565b61136d9190614f35565b9050815f0151819350935050509250929050565b5f600e54141580156113945750600e5481115b156113cb576040517fadc57a4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600c54141580156113f05750600c54816113e4611124565b6113ee9190614f65565b115b15611427576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d541415801561144d5750600d548161144133611bba565b61144b9190614f65565b115b15611484576040517ff560625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b60019054906101000a900460ff166114ca576040517fdd4e010600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f546114d89190614ec7565b3414611510576040517f327c6a5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61151a3382613460565b50565b60115481565b61152b612d3e565b8060145f6101000a81548160ff0219169083600281111561154f5761154e614636565b5b021790555073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663c8992e6160145f9054906101000a900460ff16601460019054906101000a900460ff16306040518463ffffffff1660e01b81526004016115c293929190614e65565b5f604051808303815f87803b1580156115d9575f80fd5b505af11580156115eb573d5f803e3d5ffd5b5050505050565b73430000000000000000000000000000000000000381565b611612612d3e565b8060108190555050565b611624612d3e565b61162c611cf5565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561166e573d5f803e3d5ffd5b50565b611679612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663860043b630336040518363ffffffff1660e01b81526004016116c8929190614f98565b6020604051808303815f875af11580156116e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117089190614fd3565b50565b611713612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663f97196623033846040518463ffffffff1660e01b815260040161176493929190614ffe565b6020604051808303815f875af1158015611780573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a49190614fd3565b5050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611802576117e533612fa7565b611801576117f1612fad565b15611800576117ff33612fc2565b5b5b5b61180d84848461360b565b50505050565b61181b612d3e565b5f73ffffffffffffffffffffffffffffffffffffffff16601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118a2576040517fe048e71000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601260026101000a81548160ff02191690831515021790555050565b601460019054906101000a900460ff1681565b6118da612d3e565b5f600c54141580156118ff5750600c54816118f3611124565b6118fd9190614f65565b115b15611936576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119408282613460565b5050565b61194c612d3e565b73430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff16631a33757d826040518263ffffffff1660e01b81526004016119999190614708565b6020604051808303815f875af11580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d99190614fd3565b5050565b60145f9054906101000a900460ff1681565b5f601460019054906101000a900460ff16905090565b611a0d612d3e565b818160139182611a1e9291906151d1565b505050565b611a2b612d3e565b6103e8816bffffffffffffffffffffffff161115611a75576040517ff4df6ae500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a8083838361362a565b505050565b5f611a8f826137ca565b9050919050565b611a9e612d3e565b8051825114611ad9576040517ffc4c603600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015611ba3575f600c5414158015611b235750600c54828281518110611b0757611b0661529e565b5b6020026020010151611b17611124565b611b219190614f65565b115b15611b5a576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b98838281518110611b7057611b6f61529e565b5b6020026020010151838381518110611b8b57611b8a61529e565b5b6020026020010151613460565b806001019050611adb565b505050565b611bb0612d3e565b80600c8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611c77612d3e565b611c805f61388e565b565b611c8a612d3e565b8073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611ccd573d5f803e3d5ffd5b5050565b611cd9612d3e565b80600f8190555050565b611ceb612d3e565b8060118190555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d24612d3e565b73430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8273430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da2919061436c565b602060405180830381865afa158015611dbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de19190614fd3565b6040518363ffffffff1660e01b8152600401611dfe9291906144c7565b6020604051808303815f875af1158015611e1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3e91906152df565b5050565b611e4a612d3e565b5f8290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ea4919061436c565b602060405180830381865afa158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee39190614fd3565b6040518363ffffffff1660e01b8152600401611f009291906144c7565b6020604051808303815f875af1158015611f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4091906152df565b50505050565b606060068054611f5590614e35565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8190614e35565b8015611fcc5780601f10611fa357610100808354040283529160200191611fcc565b820191905f5260205f20905b815481529060010190602001808311611faf57829003601f168201915b5050505050905090565b73430000000000000000000000000000000000000281565b611ff6612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663662aa11d30336040518363ffffffff1660e01b8152600401612045929190614f98565b6020604051808303815f875af1158015612061573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120859190614fd3565b50565b612090612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30336040518363ffffffff1660e01b81526004016120df929190614f98565b6020604051808303815f875af11580156120fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211f9190614fd3565b50565b8161212c81612fa7565b61214857612138612fad565b156121475761214681612fc2565b5b5b601260019054906101000a900460ff161561218f576040517fdb89e3f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612199838361394f565b505050565b6121a6612d3e565b73430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff1663aad3ec963373430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff1663e12f3a61306040518263ffffffff1660e01b8152600401612224919061436c565b602060405180830381865afa15801561223f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122639190614fd3565b6040518363ffffffff1660e01b81526004016122809291906144c7565b6020604051808303815f875af115801561229c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c09190614fd3565b50565b6122cb612d3e565b5f601260016101000a81548160ff021916908315150217905550565b5f60145f9054906101000a900460ff16905090565b612304612d3e565b80601260036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601260029054906101000a900460ff1681565b73430000000000000000000000000000000000000481565b61237b612d3e565b8060125f6101000a81548160ff02191690831515021790555050565b61239f612d3e565b73430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff16631a33757d826040518263ffffffff1660e01b81526004016123ec9190614708565b6020604051808303815f875af1158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c9190614fd3565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461248a5761246d33612fa7565b61248957612479612fad565b156124885761248733612fc2565b5b5b5b61249685858585613a55565b5050505050565b600b60019054906101000a900460ff1681565b6124b8612d3e565b80600b5f6101000a81548160ff02191690831515021790555050565b600b5f9054906101000a900460ff1681565b6124ee612d3e565b80600b60016101000a81548160ff02191690831515021790555050565b612513612d3e565b73430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8273430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612591919061436c565b602060405180830381865afa1580156125ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d09190614fd3565b6040518363ffffffff1660e01b81526004016125ed9291906144c7565b6020604051808303815f875af1158015612609573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262d91906152df565b5050565b606061263c82612f4c565b612672576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61267b613ac7565b90505f8151036126995760405180602001604052805f8152506126c4565b806126a384613b57565b6040516020016126b492919061538e565b6040516020818303038152906040525b915050919050565b601380546126d990614e35565b80601f016020809104026020016040519081016040528092919081815260200182805461270590614e35565b80156127505780601f1061272757610100808354040283529160200191612750565b820191905f5260205f20905b81548152906001019060200180831161273357829003601f168201915b505050505081565b612760612d3e565b73430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663aad3ec963373430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663e12f3a61306040518263ffffffff1660e01b81526004016127de919061436c565b602060405180830381865afa1580156127f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281d9190614fd3565b6040518363ffffffff1660e01b815260040161283a9291906144c7565b6020604051808303815f875af1158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190614fd3565b50565b612885612d3e565b80600e8190555050565b612897612d3e565b80600d8190555050565b5f600e54141580156128b45750600e5483115b156128eb576040517fadc57a4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600c54141580156129105750600c5483612904611124565b61290e9190614f65565b115b15612947576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d541415801561296d5750600d548361296133611bba565b61296b9190614f65565b115b156129a4576040517ff560625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f9054906101000a900460ff166129e9576040517f178883df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826010546129f79190614ec7565b3414612a2f576040517f327c6a5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f33604051602001612a419190615401565b604051602081830303815290604052805190602001209050612aa68383808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505060115483613ba6565b612adc576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ae63385613460565b50505050565b5f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612ba8612d3e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d9061548b565b60405180910390fd5b612c1f8161388e565b50565b60125f9054906101000a900460ff1681565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c8e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cbe5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d375750612d3682613bbc565b5b9050919050565b612d46613c25565b73ffffffffffffffffffffffffffffffffffffffff16612d64611cf5565b73ffffffffffffffffffffffffffffffffffffffff1614612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db1906154f3565b60405180910390fd5b565b612dc4613457565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1990615581565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e87906155e9565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b5f81612f56613140565b11158015612f65575060035482105b8015612fa057505f7c010000000000000000000000000000000000000000000000000000000060075f8581526020019081526020015f205416145b9050919050565b5f919050565b5f60125f9054906101000a900460ff16905090565b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa612ffa573d5f803e3d5ffd5b5f603a5250565b5f61300b82611a85565b90508073ffffffffffffffffffffffffffffffffffffffff1661302c613c2c565b73ffffffffffffffffffffffffffffffffffffffff161461308f5761305881613053613c2c565b612aec565b61308e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260095f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f613152826137ca565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131b9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806131c484613c33565b915091506131da81876131d5613c2c565b613c56565b613226576131ef866131ea613c2c565b612aec565b613225576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361328b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132988686866001613c99565b80156132a2575f82555b60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061336a85613346888887613da7565b7c020000000000000000000000000000000000000000000000000000000017613dce565b60075f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036133e7575f6001850190505f60075f8381526020019081526020015f2054036133e55760035481146133e4578360075f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461344f8686866001613df8565b505050505050565b5f612710905090565b5f60035490505f820361349f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134ab5f848385613c99565b600160406001901b17820260085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555061351d8361350e5f865f613da7565b61351785613dfe565b17613dce565b60075f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146135b75780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061357e565b505f82036135f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060038190555050506136065f848385613df8565b505050565b61362583838360405180602001604052805f815250612430565b505050565b613632613457565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368790615581565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f590615651565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060025f8581526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b5f80829050806137d8613140565b1161385757600354811015613856575f60075f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613854575b5f810361384a5760075f836001900393508381526020019081526020015f20549050613823565b8092505050613889565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600a5f61395b613c2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613a04613c2c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613a499190614163565b60405180910390a35050565b613a6084848461113a565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613ac157613a8a84848484613e0d565b613ac0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060138054613ad690614e35565b80601f0160208091040260200160405190810160405280929190818152602001828054613b0290614e35565b8015613b4d5780601f10613b2457610100808354040283529160200191613b4d565b820191905f5260205f20905b815481529060010190602001808311613b3057829003601f168201915b5050505050905090565b606060a060405101806040526020810391505f825281835b600115613b9157600184039350600a81066030018453600a8104905080613b6f575b50828103602084039350808452505050919050565b5f82613bb28584613f58565b1490509392505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f33905090565b5f805f60095f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b601260019054906101000a900460ff168015613ce157505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015613d1957505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613d50576040517fdb89e3f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5933613fa6565b15613d6f57613d6a8484848461406c565b613da1565b6040517f4c80d8be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b5f8060e883901c905060e8613dbd868684614072565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f6001821460e11b9050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613e32613c2c565b8786866040518563ffffffff1660e01b8152600401613e5494939291906156c1565b6020604051808303815f875af1925050508015613e8f57506040513d601f19601f82011682018060405250810190613e8c919061571f565b60015b613f05573d805f8114613ebd576040519150601f19603f3d011682016040523d82523d5f602084013e613ec2565b606091505b505f815103613efd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b5f808290505f5b8451811015613f9b57613f8c82868381518110613f7f57613f7e61529e565b5b602002602001015161407a565b91508080600101915050613f5f565b508091505092915050565b5f601260029054906101000a900460ff1615614062575f601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e18bc08a846040518263ffffffff1660e01b815260040161401b919061436c565b602060405180830381865afa158015614036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061405a91906152df565b915050614067565b600190505b919050565b50505050565b5f9392505050565b5f8183106140915761408c82846140a4565b61409c565b61409b83836140a4565b5b905092915050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6140fd816140c9565b8114614107575f80fd5b50565b5f81359050614118816140f4565b92915050565b5f60208284031215614133576141326140c1565b5b5f6141408482850161410a565b91505092915050565b5f8115159050919050565b61415d81614149565b82525050565b5f6020820190506141765f830184614154565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141a58261417c565b9050919050565b6141b58161419b565b81146141bf575f80fd5b50565b5f813590506141d0816141ac565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b6141f6816141d6565b8114614200575f80fd5b50565b5f81359050614211816141ed565b92915050565b5f806040838503121561422d5761422c6140c1565b5b5f61423a858286016141c2565b925050602061424b85828601614203565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561428c578082015181840152602081019050614271565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6142b182614255565b6142bb818561425f565b93506142cb81856020860161426f565b6142d481614297565b840191505092915050565b5f6020820190508181035f8301526142f781846142a7565b905092915050565b5f819050919050565b614311816142ff565b811461431b575f80fd5b50565b5f8135905061432c81614308565b92915050565b5f60208284031215614347576143466140c1565b5b5f6143548482850161431e565b91505092915050565b6143668161419b565b82525050565b5f60208201905061437f5f83018461435d565b92915050565b5f806040838503121561439b5761439a6140c1565b5b5f6143a8858286016141c2565b92505060206143b98582860161431e565b9150509250929050565b600281106143cf575f80fd5b50565b5f813590506143e0816143c3565b92915050565b5f602082840312156143fb576143fa6140c1565b5b5f614408848285016143d2565b91505092915050565b61441a816142ff565b82525050565b5f6020820190506144335f830184614411565b92915050565b5f805f606084860312156144505761444f6140c1565b5b5f61445d868287016141c2565b935050602061446e868287016141c2565b925050604061447f8682870161431e565b9150509250925092565b5f806040838503121561449f5761449e6140c1565b5b5f6144ac8582860161431e565b92505060206144bd8582860161431e565b9150509250929050565b5f6040820190506144da5f83018561435d565b6144e76020830184614411565b9392505050565b5f819050919050565b614500816144ee565b82525050565b5f6020820190506145195f8301846144f7565b92915050565b6003811061452b575f80fd5b50565b5f8135905061453c8161451f565b92915050565b5f60208284031215614557576145566140c1565b5b5f6145648482850161452e565b91505092915050565b5f819050919050565b5f61459061458b6145868461417c565b61456d565b61417c565b9050919050565b5f6145a182614576565b9050919050565b5f6145b282614597565b9050919050565b6145c2816145a8565b82525050565b5f6020820190506145db5f8301846145b9565b92915050565b6145ea81614149565b81146145f4575f80fd5b50565b5f81359050614605816145e1565b92915050565b5f602082840312156146205761461f6140c1565b5b5f61462d848285016145f7565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6002811061467457614673614636565b5b50565b5f81905061468482614663565b919050565b5f61469382614677565b9050919050565b6146a381614689565b82525050565b5f6020820190506146bc5f83018461469a565b92915050565b600381106146d3576146d2614636565b5b50565b5f8190506146e3826146c2565b919050565b5f6146f2826146d6565b9050919050565b614702816146e8565b82525050565b5f60208201905061471b5f8301846146f9565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261474257614741614721565b5b8235905067ffffffffffffffff81111561475f5761475e614725565b5b60208301915083600182028301111561477b5761477a614729565b5b9250929050565b5f8060208385031215614798576147976140c1565b5b5f83013567ffffffffffffffff8111156147b5576147b46140c5565b5b6147c18582860161472d565b92509250509250929050565b5f805f606084860312156147e4576147e36140c1565b5b5f6147f18682870161431e565b9350506020614802868287016141c2565b925050604061481386828701614203565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61485382614297565b810181811067ffffffffffffffff821117156148725761487161481d565b5b80604052505050565b5f6148846140b8565b9050614890828261484a565b919050565b5f67ffffffffffffffff8211156148af576148ae61481d565b5b602082029050602081019050919050565b5f6148d26148cd84614895565b61487b565b905080838252602082019050602084028301858111156148f5576148f4614729565b5b835b8181101561491e578061490a88826141c2565b8452602084019350506020810190506148f7565b5050509392505050565b5f82601f83011261493c5761493b614721565b5b813561494c8482602086016148c0565b91505092915050565b5f67ffffffffffffffff82111561496f5761496e61481d565b5b602082029050602081019050919050565b5f61499261498d84614955565b61487b565b905080838252602082019050602084028301858111156149b5576149b4614729565b5b835b818110156149de57806149ca888261431e565b8452602084019350506020810190506149b7565b5050509392505050565b5f82601f8301126149fc576149fb614721565b5b8135614a0c848260208601614980565b91505092915050565b5f8060408385031215614a2b57614a2a6140c1565b5b5f83013567ffffffffffffffff811115614a4857614a476140c5565b5b614a5485828601614928565b925050602083013567ffffffffffffffff811115614a7557614a746140c5565b5b614a81858286016149e8565b9150509250929050565b5f60208284031215614aa057614a9f6140c1565b5b5f614aad848285016141c2565b91505092915050565b5f614ac08261417c565b9050919050565b614ad081614ab6565b8114614ada575f80fd5b50565b5f81359050614aeb81614ac7565b92915050565b5f60208284031215614b0657614b056140c1565b5b5f614b1384828501614add565b91505092915050565b614b25816144ee565b8114614b2f575f80fd5b50565b5f81359050614b4081614b1c565b92915050565b5f60208284031215614b5b57614b5a6140c1565b5b5f614b6884828501614b32565b91505092915050565b5f8060408385031215614b8757614b866140c1565b5b5f614b94858286016141c2565b9250506020614ba5858286016141c2565b9150509250929050565b5f614bb982614597565b9050919050565b614bc981614baf565b82525050565b5f602082019050614be25f830184614bc0565b92915050565b5f8060408385031215614bfe57614bfd6140c1565b5b5f614c0b858286016141c2565b9250506020614c1c858286016145f7565b9150509250929050565b5f80fd5b5f67ffffffffffffffff821115614c4457614c4361481d565b5b614c4d82614297565b9050602081019050919050565b828183375f83830152505050565b5f614c7a614c7584614c2a565b61487b565b905082815260208101848484011115614c9657614c95614c26565b5b614ca1848285614c5a565b509392505050565b5f82601f830112614cbd57614cbc614721565b5b8135614ccd848260208601614c68565b91505092915050565b5f805f8060808587031215614cee57614ced6140c1565b5b5f614cfb878288016141c2565b9450506020614d0c878288016141c2565b9350506040614d1d8782880161431e565b925050606085013567ffffffffffffffff811115614d3e57614d3d6140c5565b5b614d4a87828801614ca9565b91505092959194509250565b5f8083601f840112614d6b57614d6a614721565b5b8235905067ffffffffffffffff811115614d8857614d87614725565b5b602083019150836020820283011115614da457614da3614729565b5b9250929050565b5f805f60408486031215614dc257614dc16140c1565b5b5f614dcf8682870161431e565b935050602084013567ffffffffffffffff811115614df057614def6140c5565b5b614dfc86828701614d56565b92509250509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614e4c57607f821691505b602082108103614e5f57614e5e614e08565b5b50919050565b5f606082019050614e785f8301866146f9565b614e85602083018561469a565b614e92604083018461435d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614ed1826142ff565b9150614edc836142ff565b9250828202614eea816142ff565b91508282048414831517614f0157614f00614e9a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614f3f826142ff565b9150614f4a836142ff565b925082614f5a57614f59614f08565b5b828204905092915050565b5f614f6f826142ff565b9150614f7a836142ff565b9250828201905080821115614f9257614f91614e9a565b5b92915050565b5f604082019050614fab5f83018561435d565b614fb8602083018461435d565b9392505050565b5f81519050614fcd81614308565b92915050565b5f60208284031215614fe857614fe76140c1565b5b5f614ff584828501614fbf565b91505092915050565b5f6060820190506150115f83018661435d565b61501e602083018561435d565b61502b6040830184614411565b949350505050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026150997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261505e565b6150a3868361505e565b95508019841693508086168417925050509392505050565b5f6150d56150d06150cb846142ff565b61456d565b6142ff565b9050919050565b5f819050919050565b6150ee836150bb565b6151026150fa826150dc565b84845461506a565b825550505050565b5f90565b61511661510a565b6151218184846150e5565b505050565b5b81811015615144576151395f8261510e565b600181019050615127565b5050565b601f8211156151895761515a8161503d565b6151638461504f565b81016020851015615172578190505b61518661517e8561504f565b830182615126565b50505b505050565b5f82821c905092915050565b5f6151a95f198460080261518e565b1980831691505092915050565b5f6151c1838361519a565b9150826002028217905092915050565b6151db8383615033565b67ffffffffffffffff8111156151f4576151f361481d565b5b6151fe8254614e35565b615209828285615148565b5f601f831160018114615236575f8415615224578287013590505b61522e85826151b6565b865550615295565b601f1984166152448661503d565b5f5b8281101561526b57848901358255600182019150602085019450602081019050615246565b868310156152885784890135615284601f89168261519a565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506152d9816145e1565b92915050565b5f602082840312156152f4576152f36140c1565b5b5f615301848285016152cb565b91505092915050565b5f81905092915050565b5f61531e82614255565b615328818561530a565b935061533881856020860161426f565b80840191505092915050565b7f2f626c6173742f000000000000000000000000000000000000000000000000005f82015250565b5f61537860078361530a565b915061538382615344565b600782019050919050565b5f6153998285615314565b91506153a48261536c565b91506153b08284615314565b91508190509392505050565b5f8160601b9050919050565b5f6153d2826153bc565b9050919050565b5f6153e3826153c8565b9050919050565b6153fb6153f68261419b565b6153d9565b82525050565b5f61540c82846153ea565b60148201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61547560268361425f565b91506154808261541b565b604082019050919050565b5f6020820190508181035f8301526154a281615469565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6154dd60208361425f565b91506154e8826154a9565b602082019050919050565b5f6020820190508181035f83015261550a816154d1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c206578636565645f8201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b5f61556b602a8361425f565b915061557682615511565b604082019050919050565b5f6020820190508181035f8301526155988161555f565b9050919050565b7f455243323938313a20696e76616c6964207265636569766572000000000000005f82015250565b5f6155d360198361425f565b91506155de8261559f565b602082019050919050565b5f6020820190508181035f830152615600816155c7565b9050919050565b7f455243323938313a20496e76616c696420706172616d657465727300000000005f82015250565b5f61563b601b8361425f565b915061564682615607565b602082019050919050565b5f6020820190508181035f8301526156688161562f565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6156938261566f565b61569d8185615679565b93506156ad81856020860161426f565b6156b681614297565b840191505092915050565b5f6080820190506156d45f83018761435d565b6156e1602083018661435d565b6156ee6040830185614411565b81810360608301526157008184615689565b905095945050505050565b5f81519050615719816140f4565b92915050565b5f60208284031215615734576157336140c1565b5b5f6157418482850161570b565b9150509291505056fea2646970667358221220ba91937f37ff1fa378cdbe43752eaced336d86cff0cfd6c5d151db55dfae34d164736f6c6343000818003368747470733a2f2f67656e657369732d6d657461732e6d696e746966792e78797a
Deployed Bytecode
0x6080604052600436106103e3575f3560e01c8063791a251911610207578063b88656a811610117578063cfc86f7b116100aa578063e3e1e8ef11610079578063e3e1e8ef14610d66578063e985e9c514610d82578063ed9aab5114610dbe578063f2fde38b14610de8578063fb796e6c14610e10576103e3565b8063cfc86f7b14610cd6578063d7a5b5d714610d00578063d93d93a214610d16578063e268e4d314610d3e576103e3565b8063bee6348a116100e6578063bee6348a14610c20578063c48156af14610c4a578063c5bcfbf314610c72578063c87b56dd14610c9a576103e3565b8063b88656a814610b8a578063b88d4fde14610bb2578063ba70c51514610bce578063bce4d6ae14610bf8576103e3565b80639ad302941161019a578063a73ea62d11610169578063a73ea62d14610abc578063ab7b499314610ae6578063abd017ea14610b0e578063ad5c464814610b38578063b7c0b8e814610b62576103e3565b80639ad3029414610a52578063a22cb46514610a68578063a4951daf14610a90578063a70138c114610aa6576103e3565b80639456fbcc116101d65780639456fbcc146109c057806395d89b41146109e857806397d7577614610a1257806399807a3014610a3c576103e3565b8063791a25191461091e5780637cb64759146109465780638da5cb5b1461096e578063918d439b14610998576103e3565b8063409a33ce1161030257806354373ccd1161029557806365216a411161026457806365216a41146108545780636f8b44b01461087c57806370a08231146108a4578063715018a6146108e057806372b0d90c146108f6576103e3565b806354373ccd1461079e57806355f804b3146107c85780635944c753146107f05780636352211e14610818576103e3565b806347f6997b116102d157806347f6997b146106fa578063484b973c146107245780634c8336fb1461074c5780635328ae0114610774576103e3565b8063409a33ce1461067857806340bd2e231461068e57806342842e0e146106b657806346fff98d146106d2576103e3565b806323b872dd1161037a5780632f5f367b116103495780632f5f367b146105e857806331a0edec146106105780633549345e1461063a5780633ccfd60b14610662576103e3565b806323b872dd146105495780632a55205a146105655780632db11544146105a25780632eb4a7ab146105be576103e3565b8063095ea7b3116103b6578063095ea7b3146104b15780630d236be6146104cd57806312b36510146104f557806318160ddd1461051f576103e3565b806301ffc9a7146103e757806304634d8d1461042357806306fdde031461044b578063081812fc14610475575b5f80fd5b3480156103f2575f80fd5b5061040d6004803603810190610408919061411e565b610e3a565b60405161041a9190614163565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190614217565b610e5b565b005b348015610456575f80fd5b5061045f610ebb565b60405161046c91906142df565b60405180910390f35b348015610480575f80fd5b5061049b60048036038101906104969190614332565b610f4b565b6040516104a8919061436c565b60405180910390f35b6104cb60048036038101906104c69190614385565b610fc5565b005b3480156104d8575f80fd5b506104f360048036038101906104ee91906143e6565b611041565b005b348015610500575f80fd5b50610509611111565b6040516105169190614163565b60405180910390f35b34801561052a575f80fd5b50610533611124565b6040516105409190614420565b60405180910390f35b610563600480360381019061055e9190614439565b61113a565b005b348015610570575f80fd5b5061058b60048036038101906105869190614489565b6111a5565b6040516105999291906144c7565b60405180910390f35b6105bc60048036038101906105b79190614332565b611381565b005b3480156105c9575f80fd5b506105d261151d565b6040516105df9190614506565b60405180910390f35b3480156105f3575f80fd5b5061060e60048036038101906106099190614542565b611523565b005b34801561061b575f80fd5b506106246115f2565b60405161063191906145c8565b60405180910390f35b348015610645575f80fd5b50610660600480360381019061065b9190614332565b61160a565b005b34801561066d575f80fd5b5061067661161c565b005b348015610683575f80fd5b5061068c611671565b005b348015610699575f80fd5b506106b460048036038101906106af9190614332565b61170b565b005b6106d060048036038101906106cb9190614439565b6117a8565b005b3480156106dd575f80fd5b506106f860048036038101906106f3919061460b565b611813565b005b348015610705575f80fd5b5061070e6118bf565b60405161071b91906146a9565b60405180910390f35b34801561072f575f80fd5b5061074a60048036038101906107459190614385565b6118d2565b005b348015610757575f80fd5b50610772600480360381019061076d9190614542565b611944565b005b34801561077f575f80fd5b506107886119dd565b6040516107959190614708565b60405180910390f35b3480156107a9575f80fd5b506107b26119ef565b6040516107bf91906146a9565b60405180910390f35b3480156107d3575f80fd5b506107ee60048036038101906107e99190614782565b611a05565b005b3480156107fb575f80fd5b50610816600480360381019061081191906147cd565b611a23565b005b348015610823575f80fd5b5061083e60048036038101906108399190614332565b611a85565b60405161084b919061436c565b60405180910390f35b34801561085f575f80fd5b5061087a60048036038101906108759190614a15565b611a96565b005b348015610887575f80fd5b506108a2600480360381019061089d9190614332565b611ba8565b005b3480156108af575f80fd5b506108ca60048036038101906108c59190614a8b565b611bba565b6040516108d79190614420565b60405180910390f35b3480156108eb575f80fd5b506108f4611c6f565b005b348015610901575f80fd5b5061091c60048036038101906109179190614af1565b611c82565b005b348015610929575f80fd5b50610944600480360381019061093f9190614332565b611cd1565b005b348015610951575f80fd5b5061096c60048036038101906109679190614b46565b611ce3565b005b348015610979575f80fd5b50610982611cf5565b60405161098f919061436c565b60405180910390f35b3480156109a3575f80fd5b506109be60048036038101906109b99190614a8b565b611d1c565b005b3480156109cb575f80fd5b506109e660048036038101906109e19190614b71565b611e42565b005b3480156109f3575f80fd5b506109fc611f46565b604051610a0991906142df565b60405180910390f35b348015610a1d575f80fd5b50610a26611fd6565b604051610a339190614bcf565b60405180910390f35b348015610a47575f80fd5b50610a50611fee565b005b348015610a5d575f80fd5b50610a66612088565b005b348015610a73575f80fd5b50610a8e6004803603810190610a899190614be8565b612122565b005b348015610a9b575f80fd5b50610aa461219e565b005b348015610ab1575f80fd5b50610aba6122c3565b005b348015610ac7575f80fd5b50610ad06122e7565b604051610add9190614708565b60405180910390f35b348015610af1575f80fd5b50610b0c6004803603810190610b079190614a8b565b6122fc565b005b348015610b19575f80fd5b50610b22612348565b604051610b2f9190614163565b60405180910390f35b348015610b43575f80fd5b50610b4c61235b565b604051610b5991906145c8565b60405180910390f35b348015610b6d575f80fd5b50610b886004803603810190610b83919061460b565b612373565b005b348015610b95575f80fd5b50610bb06004803603810190610bab9190614542565b612397565b005b610bcc6004803603810190610bc79190614cd6565b612430565b005b348015610bd9575f80fd5b50610be261249d565b604051610bef9190614163565b60405180910390f35b348015610c03575f80fd5b50610c1e6004803603810190610c19919061460b565b6124b0565b005b348015610c2b575f80fd5b50610c346124d4565b604051610c419190614163565b60405180910390f35b348015610c55575f80fd5b50610c706004803603810190610c6b919061460b565b6124e6565b005b348015610c7d575f80fd5b50610c986004803603810190610c939190614a8b565b61250b565b005b348015610ca5575f80fd5b50610cc06004803603810190610cbb9190614332565b612631565b604051610ccd91906142df565b60405180910390f35b348015610ce1575f80fd5b50610cea6126cc565b604051610cf791906142df565b60405180910390f35b348015610d0b575f80fd5b50610d14612758565b005b348015610d21575f80fd5b50610d3c6004803603810190610d379190614332565b61287d565b005b348015610d49575f80fd5b50610d646004803603810190610d5f9190614332565b61288f565b005b610d806004803603810190610d7b9190614dab565b6128a1565b005b348015610d8d575f80fd5b50610da86004803603810190610da39190614b71565b612aec565b604051610db59190614163565b60405180910390f35b348015610dc9575f80fd5b50610dd2612b7a565b604051610ddf919061436c565b60405180910390f35b348015610df3575f80fd5b50610e0e6004803603810190610e099190614a8b565b612ba0565b005b348015610e1b575f80fd5b50610e24612c22565b604051610e319190614163565b60405180910390f35b5f610e4482612c34565b80610e545750610e5382612cc5565b5b9050919050565b610e63612d3e565b6103e8816bffffffffffffffffffffffff161115610ead576040517ff4df6ae500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eb78282612dbc565b5050565b606060058054610eca90614e35565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef690614e35565b8015610f415780601f10610f1857610100808354040283529160200191610f41565b820191905f5260205f20905b815481529060010190602001808311610f2457829003601f168201915b5050505050905090565b5f610f5582612f4c565b610f8b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f8381526020019081526020015f205f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610fcf81612fa7565b610feb57610fdb612fad565b15610fea57610fe981612fc2565b5b5b601260019054906101000a900460ff1615611032576040517fdb89e3f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61103c8383613001565b505050565b611049612d3e565b80601460016101000a81548160ff0219169083600181111561106e5761106d614636565b5b021790555073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663c8992e6160145f9054906101000a900460ff16601460019054906101000a900460ff16306040518463ffffffff1660e01b81526004016110e193929190614e65565b5f604051808303815f87803b1580156110f8575f80fd5b505af115801561110a573d5f803e3d5ffd5b5050505050565b601260019054906101000a900460ff1681565b5f61112d613140565b6004546003540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111945761117733612fa7565b61119357611183612fad565b156111925761119133612fc2565b5b5b5b61119f848484613148565b50505050565b5f805f60025f8681526020019081526020015f206040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505f73ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff160361132e5760016040518060400160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020015f820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b5f611337613457565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866113639190614ec7565b61136d9190614f35565b9050815f0151819350935050509250929050565b5f600e54141580156113945750600e5481115b156113cb576040517fadc57a4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600c54141580156113f05750600c54816113e4611124565b6113ee9190614f65565b115b15611427576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d541415801561144d5750600d548161144133611bba565b61144b9190614f65565b115b15611484576040517ff560625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b60019054906101000a900460ff166114ca576040517fdd4e010600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600f546114d89190614ec7565b3414611510576040517f327c6a5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61151a3382613460565b50565b60115481565b61152b612d3e565b8060145f6101000a81548160ff0219169083600281111561154f5761154e614636565b5b021790555073430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663c8992e6160145f9054906101000a900460ff16601460019054906101000a900460ff16306040518463ffffffff1660e01b81526004016115c293929190614e65565b5f604051808303815f87803b1580156115d9575f80fd5b505af11580156115eb573d5f803e3d5ffd5b5050505050565b73430000000000000000000000000000000000000381565b611612612d3e565b8060108190555050565b611624612d3e565b61162c611cf5565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561166e573d5f803e3d5ffd5b50565b611679612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663860043b630336040518363ffffffff1660e01b81526004016116c8929190614f98565b6020604051808303815f875af11580156116e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117089190614fd3565b50565b611713612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663f97196623033846040518463ffffffff1660e01b815260040161176493929190614ffe565b6020604051808303815f875af1158015611780573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a49190614fd3565b5050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611802576117e533612fa7565b611801576117f1612fad565b15611800576117ff33612fc2565b5b5b5b61180d84848461360b565b50505050565b61181b612d3e565b5f73ffffffffffffffffffffffffffffffffffffffff16601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036118a2576040517fe048e71000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601260026101000a81548160ff02191690831515021790555050565b601460019054906101000a900460ff1681565b6118da612d3e565b5f600c54141580156118ff5750600c54816118f3611124565b6118fd9190614f65565b115b15611936576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119408282613460565b5050565b61194c612d3e565b73430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff16631a33757d826040518263ffffffff1660e01b81526004016119999190614708565b6020604051808303815f875af11580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d99190614fd3565b5050565b60145f9054906101000a900460ff1681565b5f601460019054906101000a900460ff16905090565b611a0d612d3e565b818160139182611a1e9291906151d1565b505050565b611a2b612d3e565b6103e8816bffffffffffffffffffffffff161115611a75576040517ff4df6ae500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a8083838361362a565b505050565b5f611a8f826137ca565b9050919050565b611a9e612d3e565b8051825114611ad9576040517ffc4c603600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015611ba3575f600c5414158015611b235750600c54828281518110611b0757611b0661529e565b5b6020026020010151611b17611124565b611b219190614f65565b115b15611b5a576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b98838281518110611b7057611b6f61529e565b5b6020026020010151838381518110611b8b57611b8a61529e565b5b6020026020010151613460565b806001019050611adb565b505050565b611bb0612d3e565b80600c8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c20576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054169050919050565b611c77612d3e565b611c805f61388e565b565b611c8a612d3e565b8073ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050158015611ccd573d5f803e3d5ffd5b5050565b611cd9612d3e565b80600f8190555050565b611ceb612d3e565b8060118190555050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d24612d3e565b73430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8273430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611da2919061436c565b602060405180830381865afa158015611dbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de19190614fd3565b6040518363ffffffff1660e01b8152600401611dfe9291906144c7565b6020604051808303815f875af1158015611e1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3e91906152df565b5050565b611e4a612d3e565b5f8290508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ea4919061436c565b602060405180830381865afa158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ee39190614fd3565b6040518363ffffffff1660e01b8152600401611f009291906144c7565b6020604051808303815f875af1158015611f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4091906152df565b50505050565b606060068054611f5590614e35565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8190614e35565b8015611fcc5780601f10611fa357610100808354040283529160200191611fcc565b820191905f5260205f20905b815481529060010190602001808311611faf57829003601f168201915b5050505050905090565b73430000000000000000000000000000000000000281565b611ff6612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663662aa11d30336040518363ffffffff1660e01b8152600401612045929190614f98565b6020604051808303815f875af1158015612061573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120859190614fd3565b50565b612090612d3e565b73430000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff1663954fa5ee30336040518363ffffffff1660e01b81526004016120df929190614f98565b6020604051808303815f875af11580156120fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061211f9190614fd3565b50565b8161212c81612fa7565b61214857612138612fad565b156121475761214681612fc2565b5b5b601260019054906101000a900460ff161561218f576040517fdb89e3f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612199838361394f565b505050565b6121a6612d3e565b73430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff1663aad3ec963373430000000000000000000000000000000000000373ffffffffffffffffffffffffffffffffffffffff1663e12f3a61306040518263ffffffff1660e01b8152600401612224919061436c565b602060405180830381865afa15801561223f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122639190614fd3565b6040518363ffffffff1660e01b81526004016122809291906144c7565b6020604051808303815f875af115801561229c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c09190614fd3565b50565b6122cb612d3e565b5f601260016101000a81548160ff021916908315150217905550565b5f60145f9054906101000a900460ff16905090565b612304612d3e565b80601260036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601260029054906101000a900460ff1681565b73430000000000000000000000000000000000000481565b61237b612d3e565b8060125f6101000a81548160ff02191690831515021790555050565b61239f612d3e565b73430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff16631a33757d826040518263ffffffff1660e01b81526004016123ec9190614708565b6020604051808303815f875af1158015612408573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242c9190614fd3565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461248a5761246d33612fa7565b61248957612479612fad565b156124885761248733612fc2565b5b5b5b61249685858585613a55565b5050505050565b600b60019054906101000a900460ff1681565b6124b8612d3e565b80600b5f6101000a81548160ff02191690831515021790555050565b600b5f9054906101000a900460ff1681565b6124ee612d3e565b80600b60016101000a81548160ff02191690831515021790555050565b612513612d3e565b73430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8273430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612591919061436c565b602060405180830381865afa1580156125ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d09190614fd3565b6040518363ffffffff1660e01b81526004016125ed9291906144c7565b6020604051808303815f875af1158015612609573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262d91906152df565b5050565b606061263c82612f4c565b612672576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61267b613ac7565b90505f8151036126995760405180602001604052805f8152506126c4565b806126a384613b57565b6040516020016126b492919061538e565b6040516020818303038152906040525b915050919050565b601380546126d990614e35565b80601f016020809104026020016040519081016040528092919081815260200182805461270590614e35565b80156127505780601f1061272757610100808354040283529160200191612750565b820191905f5260205f20905b81548152906001019060200180831161273357829003601f168201915b505050505081565b612760612d3e565b73430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663aad3ec963373430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663e12f3a61306040518263ffffffff1660e01b81526004016127de919061436c565b602060405180830381865afa1580156127f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281d9190614fd3565b6040518363ffffffff1660e01b815260040161283a9291906144c7565b6020604051808303815f875af1158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190614fd3565b50565b612885612d3e565b80600e8190555050565b612897612d3e565b80600d8190555050565b5f600e54141580156128b45750600e5483115b156128eb576040517fadc57a4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600c54141580156129105750600c5483612904611124565b61290e9190614f65565b115b15612947576040517f8a164f6300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600d541415801561296d5750600d548361296133611bba565b61296b9190614f65565b115b156129a4576040517ff560625a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5f9054906101000a900460ff166129e9576040517f178883df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826010546129f79190614ec7565b3414612a2f576040517f327c6a5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f33604051602001612a419190615401565b604051602081830303815290604052805190602001209050612aa68383808060200260200160405190810160405280939291908181526020018383602002808284375f81840152601f19601f8201169050808301925050505050505060115483613ba6565b612adc576040517fb05e92fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ae63385613460565b50505050565b5f600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612ba8612d3e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0d9061548b565b60405180910390fd5b612c1f8161388e565b50565b60125f9054906101000a900460ff1681565b5f6301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c8e57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612cbe5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d375750612d3682613bbc565b5b9050919050565b612d46613c25565b73ffffffffffffffffffffffffffffffffffffffff16612d64611cf5565b73ffffffffffffffffffffffffffffffffffffffff1614612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db1906154f3565b60405180910390fd5b565b612dc4613457565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1990615581565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e87906155e9565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060015f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b5f81612f56613140565b11158015612f65575060035482105b8015612fa057505f7c010000000000000000000000000000000000000000000000000000000060075f8581526020019081526020015f205416145b9050919050565b5f919050565b5f60125f9054906101000a900460ff16905090565b69c61711340011223344555f5230601a5280603a525f80604460166daaeb6d7670e522a718067333cd4e5afa612ffa573d5f803e3d5ffd5b5f603a5250565b5f61300b82611a85565b90508073ffffffffffffffffffffffffffffffffffffffff1661302c613c2c565b73ffffffffffffffffffffffffffffffffffffffff161461308f5761305881613053613c2c565b612aec565b61308e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b8260095f8481526020019081526020015f205f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b5f6001905090565b5f613152826137ca565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146131b9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806131c484613c33565b915091506131da81876131d5613c2c565b613c56565b613226576131ef866131ea613c2c565b612aec565b613225576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361328b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132988686866001613c99565b80156132a2575f82555b60085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8154600190039190508190555060085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f81546001019190508190555061336a85613346888887613da7565b7c020000000000000000000000000000000000000000000000000000000017613dce565b60075f8681526020019081526020015f20819055505f7c02000000000000000000000000000000000000000000000000000000008416036133e7575f6001850190505f60075f8381526020019081526020015f2054036133e55760035481146133e4578360075f8381526020019081526020015f20819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461344f8686866001613df8565b505050505050565b5f612710905090565b5f60035490505f820361349f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6134ab5f848385613c99565b600160406001901b17820260085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555061351d8361350e5f865f613da7565b61351785613dfe565b17613dce565b60075f8381526020019081526020015f20819055505f80838301905073ffffffffffffffffffffffffffffffffffffffff8516915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146135b75780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061357e565b505f82036135f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060038190555050506136065f848385613df8565b505050565b61362583838360405180602001604052805f815250612430565b505050565b613632613457565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613690576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161368790615581565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036136fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136f590615651565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff1681525060025f8581526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b5f80829050806137d8613140565b1161385757600354811015613856575f60075f8381526020019081526020015f205490505f7c0100000000000000000000000000000000000000000000000000000000821603613854575b5f810361384a5760075f836001900393508381526020019081526020015f20549050613823565b8092505050613889565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600a5f61395b613c2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16613a04613c2c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613a499190614163565b60405180910390a35050565b613a6084848461113a565b5f8373ffffffffffffffffffffffffffffffffffffffff163b14613ac157613a8a84848484613e0d565b613ac0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060138054613ad690614e35565b80601f0160208091040260200160405190810160405280929190818152602001828054613b0290614e35565b8015613b4d5780601f10613b2457610100808354040283529160200191613b4d565b820191905f5260205f20905b815481529060010190602001808311613b3057829003601f168201915b5050505050905090565b606060a060405101806040526020810391505f825281835b600115613b9157600184039350600a81066030018453600a8104905080613b6f575b50828103602084039350808452505050919050565b5f82613bb28584613f58565b1490509392505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b5f33905090565b5f805f60095f8581526020019081526020015f2090508092508254915050915091565b5f73ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b601260019054906101000a900460ff168015613ce157505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015613d1957505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15613d50576040517fdb89e3f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d5933613fa6565b15613d6f57613d6a8484848461406c565b613da1565b6040517f4c80d8be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b5f8060e883901c905060e8613dbd868684614072565b62ffffff16901b9150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b5f6001821460e11b9050919050565b5f8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613e32613c2c565b8786866040518563ffffffff1660e01b8152600401613e5494939291906156c1565b6020604051808303815f875af1925050508015613e8f57506040513d601f19601f82011682018060405250810190613e8c919061571f565b60015b613f05573d805f8114613ebd576040519150601f19603f3d011682016040523d82523d5f602084013e613ec2565b606091505b505f815103613efd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b5f808290505f5b8451811015613f9b57613f8c82868381518110613f7f57613f7e61529e565b5b602002602001015161407a565b91508080600101915050613f5f565b508091505092915050565b5f601260029054906101000a900460ff1615614062575f601260039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663e18bc08a846040518263ffffffff1660e01b815260040161401b919061436c565b602060405180830381865afa158015614036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061405a91906152df565b915050614067565b600190505b919050565b50505050565b5f9392505050565b5f8183106140915761408c82846140a4565b61409c565b61409b83836140a4565b5b905092915050565b5f825f528160205260405f20905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6140fd816140c9565b8114614107575f80fd5b50565b5f81359050614118816140f4565b92915050565b5f60208284031215614133576141326140c1565b5b5f6141408482850161410a565b91505092915050565b5f8115159050919050565b61415d81614149565b82525050565b5f6020820190506141765f830184614154565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6141a58261417c565b9050919050565b6141b58161419b565b81146141bf575f80fd5b50565b5f813590506141d0816141ac565b92915050565b5f6bffffffffffffffffffffffff82169050919050565b6141f6816141d6565b8114614200575f80fd5b50565b5f81359050614211816141ed565b92915050565b5f806040838503121561422d5761422c6140c1565b5b5f61423a858286016141c2565b925050602061424b85828601614203565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561428c578082015181840152602081019050614271565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6142b182614255565b6142bb818561425f565b93506142cb81856020860161426f565b6142d481614297565b840191505092915050565b5f6020820190508181035f8301526142f781846142a7565b905092915050565b5f819050919050565b614311816142ff565b811461431b575f80fd5b50565b5f8135905061432c81614308565b92915050565b5f60208284031215614347576143466140c1565b5b5f6143548482850161431e565b91505092915050565b6143668161419b565b82525050565b5f60208201905061437f5f83018461435d565b92915050565b5f806040838503121561439b5761439a6140c1565b5b5f6143a8858286016141c2565b92505060206143b98582860161431e565b9150509250929050565b600281106143cf575f80fd5b50565b5f813590506143e0816143c3565b92915050565b5f602082840312156143fb576143fa6140c1565b5b5f614408848285016143d2565b91505092915050565b61441a816142ff565b82525050565b5f6020820190506144335f830184614411565b92915050565b5f805f606084860312156144505761444f6140c1565b5b5f61445d868287016141c2565b935050602061446e868287016141c2565b925050604061447f8682870161431e565b9150509250925092565b5f806040838503121561449f5761449e6140c1565b5b5f6144ac8582860161431e565b92505060206144bd8582860161431e565b9150509250929050565b5f6040820190506144da5f83018561435d565b6144e76020830184614411565b9392505050565b5f819050919050565b614500816144ee565b82525050565b5f6020820190506145195f8301846144f7565b92915050565b6003811061452b575f80fd5b50565b5f8135905061453c8161451f565b92915050565b5f60208284031215614557576145566140c1565b5b5f6145648482850161452e565b91505092915050565b5f819050919050565b5f61459061458b6145868461417c565b61456d565b61417c565b9050919050565b5f6145a182614576565b9050919050565b5f6145b282614597565b9050919050565b6145c2816145a8565b82525050565b5f6020820190506145db5f8301846145b9565b92915050565b6145ea81614149565b81146145f4575f80fd5b50565b5f81359050614605816145e1565b92915050565b5f602082840312156146205761461f6140c1565b5b5f61462d848285016145f7565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6002811061467457614673614636565b5b50565b5f81905061468482614663565b919050565b5f61469382614677565b9050919050565b6146a381614689565b82525050565b5f6020820190506146bc5f83018461469a565b92915050565b600381106146d3576146d2614636565b5b50565b5f8190506146e3826146c2565b919050565b5f6146f2826146d6565b9050919050565b614702816146e8565b82525050565b5f60208201905061471b5f8301846146f9565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261474257614741614721565b5b8235905067ffffffffffffffff81111561475f5761475e614725565b5b60208301915083600182028301111561477b5761477a614729565b5b9250929050565b5f8060208385031215614798576147976140c1565b5b5f83013567ffffffffffffffff8111156147b5576147b46140c5565b5b6147c18582860161472d565b92509250509250929050565b5f805f606084860312156147e4576147e36140c1565b5b5f6147f18682870161431e565b9350506020614802868287016141c2565b925050604061481386828701614203565b9150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61485382614297565b810181811067ffffffffffffffff821117156148725761487161481d565b5b80604052505050565b5f6148846140b8565b9050614890828261484a565b919050565b5f67ffffffffffffffff8211156148af576148ae61481d565b5b602082029050602081019050919050565b5f6148d26148cd84614895565b61487b565b905080838252602082019050602084028301858111156148f5576148f4614729565b5b835b8181101561491e578061490a88826141c2565b8452602084019350506020810190506148f7565b5050509392505050565b5f82601f83011261493c5761493b614721565b5b813561494c8482602086016148c0565b91505092915050565b5f67ffffffffffffffff82111561496f5761496e61481d565b5b602082029050602081019050919050565b5f61499261498d84614955565b61487b565b905080838252602082019050602084028301858111156149b5576149b4614729565b5b835b818110156149de57806149ca888261431e565b8452602084019350506020810190506149b7565b5050509392505050565b5f82601f8301126149fc576149fb614721565b5b8135614a0c848260208601614980565b91505092915050565b5f8060408385031215614a2b57614a2a6140c1565b5b5f83013567ffffffffffffffff811115614a4857614a476140c5565b5b614a5485828601614928565b925050602083013567ffffffffffffffff811115614a7557614a746140c5565b5b614a81858286016149e8565b9150509250929050565b5f60208284031215614aa057614a9f6140c1565b5b5f614aad848285016141c2565b91505092915050565b5f614ac08261417c565b9050919050565b614ad081614ab6565b8114614ada575f80fd5b50565b5f81359050614aeb81614ac7565b92915050565b5f60208284031215614b0657614b056140c1565b5b5f614b1384828501614add565b91505092915050565b614b25816144ee565b8114614b2f575f80fd5b50565b5f81359050614b4081614b1c565b92915050565b5f60208284031215614b5b57614b5a6140c1565b5b5f614b6884828501614b32565b91505092915050565b5f8060408385031215614b8757614b866140c1565b5b5f614b94858286016141c2565b9250506020614ba5858286016141c2565b9150509250929050565b5f614bb982614597565b9050919050565b614bc981614baf565b82525050565b5f602082019050614be25f830184614bc0565b92915050565b5f8060408385031215614bfe57614bfd6140c1565b5b5f614c0b858286016141c2565b9250506020614c1c858286016145f7565b9150509250929050565b5f80fd5b5f67ffffffffffffffff821115614c4457614c4361481d565b5b614c4d82614297565b9050602081019050919050565b828183375f83830152505050565b5f614c7a614c7584614c2a565b61487b565b905082815260208101848484011115614c9657614c95614c26565b5b614ca1848285614c5a565b509392505050565b5f82601f830112614cbd57614cbc614721565b5b8135614ccd848260208601614c68565b91505092915050565b5f805f8060808587031215614cee57614ced6140c1565b5b5f614cfb878288016141c2565b9450506020614d0c878288016141c2565b9350506040614d1d8782880161431e565b925050606085013567ffffffffffffffff811115614d3e57614d3d6140c5565b5b614d4a87828801614ca9565b91505092959194509250565b5f8083601f840112614d6b57614d6a614721565b5b8235905067ffffffffffffffff811115614d8857614d87614725565b5b602083019150836020820283011115614da457614da3614729565b5b9250929050565b5f805f60408486031215614dc257614dc16140c1565b5b5f614dcf8682870161431e565b935050602084013567ffffffffffffffff811115614df057614def6140c5565b5b614dfc86828701614d56565b92509250509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614e4c57607f821691505b602082108103614e5f57614e5e614e08565b5b50919050565b5f606082019050614e785f8301866146f9565b614e85602083018561469a565b614e92604083018461435d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f614ed1826142ff565b9150614edc836142ff565b9250828202614eea816142ff565b91508282048414831517614f0157614f00614e9a565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614f3f826142ff565b9150614f4a836142ff565b925082614f5a57614f59614f08565b5b828204905092915050565b5f614f6f826142ff565b9150614f7a836142ff565b9250828201905080821115614f9257614f91614e9a565b5b92915050565b5f604082019050614fab5f83018561435d565b614fb8602083018461435d565b9392505050565b5f81519050614fcd81614308565b92915050565b5f60208284031215614fe857614fe76140c1565b5b5f614ff584828501614fbf565b91505092915050565b5f6060820190506150115f83018661435d565b61501e602083018561435d565b61502b6040830184614411565b949350505050565b5f82905092915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026150997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261505e565b6150a3868361505e565b95508019841693508086168417925050509392505050565b5f6150d56150d06150cb846142ff565b61456d565b6142ff565b9050919050565b5f819050919050565b6150ee836150bb565b6151026150fa826150dc565b84845461506a565b825550505050565b5f90565b61511661510a565b6151218184846150e5565b505050565b5b81811015615144576151395f8261510e565b600181019050615127565b5050565b601f8211156151895761515a8161503d565b6151638461504f565b81016020851015615172578190505b61518661517e8561504f565b830182615126565b50505b505050565b5f82821c905092915050565b5f6151a95f198460080261518e565b1980831691505092915050565b5f6151c1838361519a565b9150826002028217905092915050565b6151db8383615033565b67ffffffffffffffff8111156151f4576151f361481d565b5b6151fe8254614e35565b615209828285615148565b5f601f831160018114615236575f8415615224578287013590505b61522e85826151b6565b865550615295565b601f1984166152448661503d565b5f5b8281101561526b57848901358255600182019150602085019450602081019050615246565b868310156152885784890135615284601f89168261519a565b8355505b6001600288020188555050505b50505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f815190506152d9816145e1565b92915050565b5f602082840312156152f4576152f36140c1565b5b5f615301848285016152cb565b91505092915050565b5f81905092915050565b5f61531e82614255565b615328818561530a565b935061533881856020860161426f565b80840191505092915050565b7f2f626c6173742f000000000000000000000000000000000000000000000000005f82015250565b5f61537860078361530a565b915061538382615344565b600782019050919050565b5f6153998285615314565b91506153a48261536c565b91506153b08284615314565b91508190509392505050565b5f8160601b9050919050565b5f6153d2826153bc565b9050919050565b5f6153e3826153c8565b9050919050565b6153fb6153f68261419b565b6153d9565b82525050565b5f61540c82846153ea565b60148201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f61547560268361425f565b91506154808261541b565b604082019050919050565b5f6020820190508181035f8301526154a281615469565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6154dd60208361425f565b91506154e8826154a9565b602082019050919050565b5f6020820190508181035f83015261550a816154d1565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c206578636565645f8201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b5f61556b602a8361425f565b915061557682615511565b604082019050919050565b5f6020820190508181035f8301526155988161555f565b9050919050565b7f455243323938313a20696e76616c6964207265636569766572000000000000005f82015250565b5f6155d360198361425f565b91506155de8261559f565b602082019050919050565b5f6020820190508181035f830152615600816155c7565b9050919050565b7f455243323938313a20496e76616c696420706172616d657465727300000000005f82015250565b5f61563b601b8361425f565b915061564682615607565b602082019050919050565b5f6020820190508181035f8301526156688161562f565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6156938261566f565b61569d8185615679565b93506156ad81856020860161426f565b6156b681614297565b840191505092915050565b5f6080820190506156d45f83018761435d565b6156e1602083018661435d565b6156ee6040830185614411565b81810360608301526157008184615689565b905095945050505050565b5f81519050615719816140f4565b92915050565b5f60208284031215615734576157336140c1565b5b5f6157418482850161570b565b9150509291505056fea2646970667358221220ba91937f37ff1fa378cdbe43752eaced336d86cff0cfd6c5d151db55dfae34d164736f6c63430008180033
Deployed Bytecode Sourcemap
83260:14568:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95899:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96525:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47283:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53774:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93012:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88263:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83744:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43034:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93324:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21932:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;86175:657;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83660:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87159:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84027:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91081:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91227;;;;;;;;;;;;;:::i;:::-;;87641:109;;;;;;;;;;;;;:::i;:::-;;87789:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93554:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95347:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84574:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89808:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87500:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84519:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88894:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97272:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96762:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48676:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89231:537;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90496:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44218:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27160:103;;;;;;;;;;;;;:::i;:::-;;91375:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90941:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26519:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92033:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91654:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47459:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83939:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88593:113;;;;;;;;;;;;;:::i;:::-;;88449:109;;;;;;;;;;;;;:::i;:::-;;92698:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;88108:126;;;;;;;;;;;;;:::i;:::-;;91523:88;;;;;;;;;;;;;:::i;:::-;;88795:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95551:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83791:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84270:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94055:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87356:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93792:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83411:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90227:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83381:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90085:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91881:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97500:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83865:65;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;87949:126;;;;;;;;;;;;;:::i;:::-;;90789:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90637:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85238:909;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54723:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83826:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27418:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83694:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95899:404;95995:4;96215:38;96241:11;96215:25;:38::i;:::-;:80;;;;96257:38;96283:11;96257:25;:38::i;:::-;96215:80;96208:87;;95899:404;;;:::o;96525:229::-;26405:13;:11;:13::i;:::-;96638:4:::1;96623:12;:19;;;96619:75;;;96666:16;;;;;;;;;;;;;;96619:75;96704:42;96723:8;96733:12;96704:18;:42::i;:::-;96525:229:::0;;:::o;47283:100::-;47337:13;47370:5;47363:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47283:100;:::o;53774:218::-;53850:7;53875:16;53883:7;53875;:16::i;:::-;53870:64;;53900:34;;;;;;;;;;;;;;53870:64;53954:15;:24;53970:7;53954:24;;;;;;;;;;;:30;;;;;;;;;;;;53947:37;;53774:218;;;:::o;93012:304::-;93162:8;13628:29;13648:8;13628:19;:29::i;:::-;13623:122;;13678:27;:25;:27::i;:::-;13674:59;;;13707:26;13724:8;13707:16;:26::i;:::-;13674:59;13623:122;93192:21:::1;;;;;;;;;;;93188:78;;;93237:17;;;;;;;;;;;;;;93188:78;93276:32;93290:8;93300:7;93276:13;:32::i;:::-;93012:304:::0;;;:::o;88263:155::-;26405:13;:11;:13::i;:::-;88341:8:::1;88331:7;;:18;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;83977:42;88360:15;;;88376:9;;;;;;;;;;;88387:7;;;;;;;;;;;88404:4;88360:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;88263:155:::0;:::o;83744:40::-;;;;;;;;;;;;;:::o;43034:323::-;43095:7;43323:15;:13;:15::i;:::-;43308:12;;43292:13;;:28;:46;43285:53;;43034:323;:::o;93324:222::-;93479:4;13271:10;13263:18;;:4;:18;;;13259:184;;13303:31;13323:10;13303:19;:31::i;:::-;13298:134;;13359:27;:25;:27::i;:::-;13355:61;;;13388:28;13405:10;13388:16;:28::i;:::-;13355:61;13298:134;13259:184;93501:37:::1;93520:4;93526:2;93530:7;93501:18;:37::i;:::-;93324:222:::0;;;;:::o;21932:438::-;22027:7;22036;22056:26;22085:17;:26;22103:7;22085:26;;;;;;;;;;;22056:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22156:1;22128:30;;:7;:16;;;:30;;;22124:92;;22185:19;22175:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22124:92;22228:21;22292:17;:15;:17::i;:::-;22252:57;;22265:7;:23;;;22253:35;;:9;:35;;;;:::i;:::-;22252:57;;;;:::i;:::-;22228:81;;22330:7;:16;;;22348:13;22322:40;;;;;;21932:438;;;;;:::o;86175:657::-;86260:1;86245:11;;:16;;:42;;;;;86276:11;;86265:8;:22;86245:42;86241:103;;;86311:21;;;;;;;;;;;;;;86241:103;86371:1;86358:9;;:14;;:54;;;;;86403:9;;86392:8;86376:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;86358:54;86354:113;;;86436:19;;;;;;;;;;;;;;86354:113;86497:1;86481:12;;:17;;:68;;;;;86537:12;;86526:8;86502:21;86512:10;86502:9;:21::i;:::-;:32;;;;:::i;:::-;:47;86481:68;86477:130;;;86573:22;;;;;;;;;;;;;;86477:130;86622:10;;;;;;;;;;;86617:69;;86656:18;;;;;;;;;;;;;;86617:69;86728:8;86714:11;;:22;;;;:::i;:::-;86700:9;:37;86696:91;;86761:14;;;;;;;;;;;;;;86696:91;86797:27;86803:10;86815:8;86797:5;:27::i;:::-;86175:657;:::o;83660:25::-;;;;:::o;87159:161::-;26405:13;:11;:13::i;:::-;87243:8:::1;87231:9;;:20;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;83977:42;87262:15;;;87278:9;;;;;;;;;;;87289:7;;;;;;;;;;;87306:4;87262:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;87159:161:::0;:::o;84027:96::-;84080:42;84027:96;:::o;91081:104::-;26405:13;:11;:13::i;:::-;91169:8:::1;91154:12;:23;;;;91081:104:::0;:::o;91227:::-;26405:13;:11;:13::i;:::-;91283:7:::1;:5;:7::i;:::-;91275:25;;:48;91301:21;91275:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;91227:104::o:0;87641:109::-;26405:13;:11;:13::i;:::-;83977:42:::1;87696:19;;;87724:4;87731:10;87696:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;87641:109::o:0;87789:127::-;26405:13;:11;:13::i;:::-;83977:42:::1;87856:16;;;87881:4;87888:10;87900:7;87856:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;87789:127:::0;:::o;93554:230::-;93713:4;13271:10;13263:18;;:4;:18;;;13259:184;;13303:31;13323:10;13303:19;:31::i;:::-;13298:134;;13359:27;:25;:27::i;:::-;13355:61;;;13388:28;13405:10;13388:16;:28::i;:::-;13355:61;13298:134;13259:184;93735:41:::1;93758:4;93764:2;93768:7;93735:22;:41::i;:::-;93554:230:::0;;;;:::o;95347:196::-;26405:13;:11;:13::i;:::-;95461:1:::1;95434:29;;:15;;;;;;;;;;;:29;;::::0;95430:58:::1;;95472:16;;;;;;;;;;;;;;95430:58;95518:17;95499:16;;:36;;;;;;;;;;;;;;;;;;95347:196:::0;:::o;84574:42::-;;;;;;;;;;;;;:::o;89808:229::-;26405:13;:11;:13::i;:::-;89904:1:::1;89891:9;;:14;;:54;;;;;89936:9;;89925:8;89909:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;89891:54;89887:113;;;89969:19;;;;;;;;;;;;;;89887:113;90010:19;90016:2;90020:8;90010:5;:19::i;:::-;89808:229:::0;;:::o;87500:108::-;26405:13;:11;:13::i;:::-;84080:42:::1;87576:14;;;87591:8;87576:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;87500:108:::0;:::o;84519:48::-;;;;;;;;;;;;;:::o;88894:86::-;88938:7;88965;;;;;;;;;;;88958:14;;88894:86;:::o;97272:106::-;26405:13;:11;:13::i;:::-;97363:7:::1;;97347:13;:23;;;;;;;:::i;:::-;;97272:106:::0;;:::o;96762:287::-;26405:13;:11;:13::i;:::-;96926:4:::1;96911:12;:19;;;96907:75;;;96954:16;;;;;;;;;;;;;;96907:75;96992:49;97009:7;97018:8;97028:12;96992:16;:49::i;:::-;96762:287:::0;;;:::o;48676:152::-;48748:7;48791:27;48810:7;48791:18;:27::i;:::-;48768:52;;48676:152;;;:::o;89231:537::-;26405:13;:11;:13::i;:::-;89391:7:::1;:14;89375:5;:12;:30;89371:92;;89429:22;;;;;;;;;;;;;;89371:92;89478:9;89473:288;89493:5;:12;89489:1;:16;89473:288;;;89540:1;89527:9;;:14;;:56;;;;;89574:9;;89561:7;89569:1;89561:10;;;;;;;;:::i;:::-;;;;;;;;89545:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:38;89527:56;89523:123;;;89611:19;;;;;;;;;;;;;;89523:123;89660:27;89666:5;89672:1;89666:8;;;;;;;;:::i;:::-;;;;;;;;89676:7;89684:1;89676:10;;;;;;;;:::i;:::-;;;;;;;;89660:5;:27::i;:::-;89731:3;;;;;89473:288;;;;89231:537:::0;;:::o;90496:106::-;26405:13;:11;:13::i;:::-;90582:12:::1;90570:9;:24;;;;90496:106:::0;:::o;44218:233::-;44290:7;44331:1;44314:19;;:5;:19;;;44310:60;;44342:28;;;;;;;;;;;;;;44310:60;38377:13;44388:18;:25;44407:5;44388:25;;;;;;;;;;;;;;;;:55;44381:62;;44218:233;;;:::o;27160:103::-;26405:13;:11;:13::i;:::-;27225:30:::1;27252:1;27225:18;:30::i;:::-;27160:103::o:0;91375:112::-;26405:13;:11;:13::i;:::-;91444:3:::1;:12;;:35;91457:21;91444:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;91375:112:::0;:::o;90941:106::-;26405:13;:11;:13::i;:::-;91031:8:::1;91017:11;:22;;;;90941:106:::0;:::o;90359:::-;26405:13;:11;:13::i;:::-;90446:11:::1;90433:10;:24;;;;90359:106:::0;:::o;26519:87::-;26565:7;26592:6;;;;;;;;;;;26585:13;;26519:87;:::o;92033:122::-;26405:13;:11;:13::i;:::-;84080:42:::1;92098:13;;;92112:3;84080:42;92117:14;;;92140:4;92117:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;92098:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;92033:122:::0;:::o;91654:197::-;26405:13;:11;:13::i;:::-;91736:20:::1;91774:6;91736:45;;91792:5;:14;;;91807:3;91812:5;:15;;;91836:4;91812:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91792:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;91725:126;91654:197:::0;;:::o;47459:104::-;47515:13;47548:7;47541:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47459:104;:::o;83939:81::-;83977:42;83939:81;:::o;88593:113::-;26405:13;:11;:13::i;:::-;83977:42:::1;88654:17;;;88680:4;88687:10;88654:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;88593:113::o:0;88449:109::-;26405:13;:11;:13::i;:::-;83977:42:::1;88506:17;;;88532:4;88539:10;88506:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;88449:109::o:0;92698:306::-;92839:8;13628:29;13648:8;13628:19;:29::i;:::-;13623:122;;13678:27;:25;:27::i;:::-;13674:59;;;13707:26;13724:8;13707:16;:26::i;:::-;13674:59;13623:122;92869:21:::1;;;;;;;;;;;92865:78;;;92914:17;;;;;;;;;;;;;;92865:78;92953:43;92977:8;92987;92953:23;:43::i;:::-;92698:306:::0;;;:::o;88108:126::-;26405:13;:11;:13::i;:::-;84080:42:::1;88164:10;;;88175;84080:42;88187:23;;;88219:4;88187:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88164:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;88108:126::o:0;91523:88::-;26405:13;:11;:13::i;:::-;91598:5:::1;91574:21;;:29;;;;;;;;;;;;;;;;;;91523:88::o:0;88795:91::-;88840:9;88869;;;;;;;;;;;88862:16;;88795:91;:::o;95551:126::-;26405:13;:11;:13::i;:::-;95653:16:::1;95635:15;;:34;;;;;;;;;;;;;;;;;;95551:126:::0;:::o;83791:28::-;;;;;;;;;;;;;:::o;84270:96::-;84323:42;84270:96;:::o;94055:117::-;26405:13;:11;:13::i;:::-;94159:5:::1;94132:24;;:32;;;;;;;;;;;;;;;;;;94055:117:::0;:::o;87356:108::-;26405:13;:11;:13::i;:::-;84323:42:::1;87432:14;;;87447:8;87432:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;87356:108:::0;:::o;93792:255::-;93970:4;13271:10;13263:18;;:4;:18;;;13259:184;;13303:31;13323:10;13303:19;:31::i;:::-;13298:134;;13359:27;:25;:27::i;:::-;13355:61;;;13388:28;13405:10;13388:16;:28::i;:::-;13355:61;13298:134;13259:184;93992:47:::1;94015:4;94021:2;94025:7;94034:4;93992:22;:47::i;:::-;93792:255:::0;;;;;:::o;83411:22::-;;;;;;;;;;;;;:::o;90227:100::-;26405:13;:11;:13::i;:::-;90311:8:::1;90297:11;;:22;;;;;;;;;;;;;;;;;;90227:100:::0;:::o;83381:23::-;;;;;;;;;;;;;:::o;90085:98::-;26405:13;:11;:13::i;:::-;90167:8:::1;90154:10;;:21;;;;;;;;;;;;;;;;;;90085:98:::0;:::o;91881:122::-;26405:13;:11;:13::i;:::-;84323:42:::1;91946:13;;;91960:3;84323:42;91965:14;;;91988:4;91965:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91946:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;91881:122:::0;:::o;97500:323::-;97565:13;97596:16;97604:7;97596;:16::i;:::-;97591:59;;97621:29;;;;;;;;;;;;;;97591:59;97663:21;97687:10;:8;:10::i;:::-;97663:34;;97740:1;97721:7;97715:21;:26;:98;;;;;;;;;;;;;;;;;97768:7;97788:18;97798:7;97788:9;:18::i;:::-;97751:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;97715:98;97708:105;;;97500:323;;;:::o;83865:65::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;87949:126::-;26405:13;:11;:13::i;:::-;84323:42:::1;88005:10;;;88016;84323:42;88028:23;;;88060:4;88028:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;88005:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;87949:126::o:0;90789:114::-;26405:13;:11;:13::i;:::-;90881:14:::1;90867:11;:28;;;;90789:114:::0;:::o;90637:118::-;26405:13;:11;:13::i;:::-;90732:15:::1;90717:12;:30;;;;90637:118:::0;:::o;85238:909::-;85356:1;85341:11;;:16;;:42;;;;;85372:11;;85361:8;:22;85341:42;85337:103;;;85407:21;;;;;;;;;;;;;;85337:103;85467:1;85454:9;;:14;;:54;;;;;85499:9;;85488:8;85472:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;85454:54;85450:113;;;85532:19;;;;;;;;;;;;;;85450:113;85593:1;85577:12;;:17;;:68;;;;;85633:12;;85622:8;85598:21;85608:10;85598:9;:21::i;:::-;:32;;;;:::i;:::-;:47;85577:68;85573:130;;;85669:22;;;;;;;;;;;;;;85573:130;85718:11;;;;;;;;;;;85713:67;;85753:15;;;;;;;;;;;;;;85713:67;85823:8;85808:12;;:23;;;;:::i;:::-;85794:9;:38;85790:92;;85856:14;;;;;;;;;;;;;;85790:92;85924:12;85966:10;85949:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;85939:39;;;;;;85924:54;;85994:49;86013:11;;85994:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86026:10;;86038:4;85994:18;:49::i;:::-;85989:110;;86067:20;;;;;;;;;;;;;;85989:110;86112:27;86118:10;86130:8;86112:5;:27::i;:::-;85326:821;85238:909;;;:::o;54723:164::-;54820:4;54844:18;:25;54863:5;54844:25;;;;;;;;;;;;;;;:35;54870:8;54844:35;;;;;;;;;;;;;;;;;;;;;;;;;54837:42;;54723:164;;;;:::o;83826:30::-;;;;;;;;;;;;;:::o;27418:201::-;26405:13;:11;:13::i;:::-;27527:1:::1;27507:22;;:8;:22;;::::0;27499:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27583:28;27602:8;27583:18;:28::i;:::-;27418:201:::0;:::o;83694:43::-;;;;;;;;;;;;;:::o;46381:639::-;46466:4;46805:10;46790:25;;:11;:25;;;;:102;;;;46882:10;46867:25;;:11;:25;;;;46790:102;:179;;;;46959:10;46944:25;;:11;:25;;;;46790:179;46770:199;;46381:639;;;:::o;21662:215::-;21764:4;21803:26;21788:41;;;:11;:41;;;;:81;;;;21833:36;21857:11;21833:23;:36::i;:::-;21788:81;21781:88;;21662:215;;;:::o;26684:132::-;26759:12;:10;:12::i;:::-;26748:23;;:7;:5;:7::i;:::-;:23;;;26740:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26684:132::o;23020:332::-;23139:17;:15;:17::i;:::-;23123:33;;:12;:33;;;;23115:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;23242:1;23222:22;;:8;:22;;;23214:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23309:35;;;;;;;;23321:8;23309:35;;;;;;23331:12;23309:35;;;;;23287:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23020:332;;:::o;55145:282::-;55210:4;55266:7;55247:15;:13;:15::i;:::-;:26;;:66;;;;;55300:13;;55290:7;:23;55247:66;:153;;;;;55399:1;39153:8;55351:17;:26;55369:7;55351:26;;;;;;;;;;;;:44;:49;55247:153;55227:173;;55145:282;;;:::o;15677:106::-;15746:4;15677:106;;;:::o;94180:125::-;94249:4;94273:24;;;;;;;;;;;94266:31;;94180:125;:::o;13861:1359::-;14254:22;14248:4;14241:36;14347:9;14341:4;14334:23;14422:8;14416:4;14409:22;14599:4;14593;14587;14581;14554:25;14547:5;14536:68;14526:274;;14720:16;14714:4;14708;14693:44;14768:16;14762:4;14755:30;14526:274;15200:1;15194:4;15187:15;13861:1359;:::o;53207:408::-;53296:13;53312:16;53320:7;53312;:16::i;:::-;53296:32;;53368:5;53345:28;;:19;:17;:19::i;:::-;:28;;;53341:175;;53393:44;53410:5;53417:19;:17;:19::i;:::-;53393:16;:44::i;:::-;53388:128;;53465:35;;;;;;;;;;;;;;53388:128;53341:175;53561:2;53528:15;:24;53544:7;53528:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;53599:7;53595:2;53579:28;;53588:5;53579:28;;;;;;;;;;;;53285:330;53207:408;;:::o;92378:93::-;92435:7;92462:1;92455:8;;92378:93;:::o;57413:2825::-;57555:27;57585;57604:7;57585:18;:27::i;:::-;57555:57;;57670:4;57629:45;;57645:19;57629:45;;;57625:86;;57683:28;;;;;;;;;;;;;;57625:86;57725:27;57754:23;57781:35;57808:7;57781:26;:35::i;:::-;57724:92;;;;57916:68;57941:15;57958:4;57964:19;:17;:19::i;:::-;57916:24;:68::i;:::-;57911:180;;58004:43;58021:4;58027:19;:17;:19::i;:::-;58004:16;:43::i;:::-;57999:92;;58056:35;;;;;;;;;;;;;;57999:92;57911:180;58122:1;58108:16;;:2;:16;;;58104:52;;58133:23;;;;;;;;;;;;;;58104:52;58169:43;58191:4;58197:2;58201:7;58210:1;58169:21;:43::i;:::-;58305:15;58302:160;;;58445:1;58424:19;58417:30;58302:160;58842:18;:24;58861:4;58842:24;;;;;;;;;;;;;;;;58840:26;;;;;;;;;;;;58911:18;:22;58930:2;58911:22;;;;;;;;;;;;;;;;58909:24;;;;;;;;;;;59233:146;59270:2;59319:45;59334:4;59340:2;59344:19;59319:14;:45::i;:::-;39433:8;59291:73;59233:18;:146::i;:::-;59204:17;:26;59222:7;59204:26;;;;;;;;;;;:175;;;;59550:1;39433:8;59499:19;:47;:52;59495:627;;59572:19;59604:1;59594:7;:11;59572:33;;59761:1;59727:17;:30;59745:11;59727:30;;;;;;;;;;;;:35;59723:384;;59865:13;;59850:11;:28;59846:242;;60045:19;60012:17;:30;60030:11;60012:30;;;;;;;;;;;:52;;;;59846:242;59723:384;59553:569;59495:627;60169:7;60165:2;60150:27;;60159:4;60150:27;;;;;;;;;;;;60188:42;60209:4;60215:2;60219:7;60228:1;60188:20;:42::i;:::-;57544:2694;;;57413:2825;;;:::o;22652:97::-;22710:6;22736:5;22729:12;;22652:97;:::o;64794:2966::-;64867:20;64890:13;;64867:36;;64930:1;64918:8;:13;64914:44;;64940:18;;;;;;;;;;;;;;64914:44;64971:61;65001:1;65005:2;65009:12;65023:8;64971:21;:61::i;:::-;65515:1;38515:2;65485:1;:26;;65484:32;65472:8;:45;65446:18;:22;65465:2;65446:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;65794:139;65831:2;65885:33;65908:1;65912:2;65916:1;65885:14;:33::i;:::-;65852:30;65873:8;65852:20;:30::i;:::-;:66;65794:18;:139::i;:::-;65760:17;:31;65778:12;65760:31;;;;;;;;;;;:173;;;;65950:16;65981:11;66010:8;65995:12;:23;65981:37;;66531:16;66527:2;66523:25;66511:37;;66903:12;66863:8;66822:1;66760:25;66701:1;66640;66613:335;67274:1;67260:12;67256:20;67214:346;67315:3;67306:7;67303:16;67214:346;;67533:7;67523:8;67520:1;67493:25;67490:1;67487;67482:59;67368:1;67359:7;67355:15;67344:26;;67214:346;;;67218:77;67605:1;67593:8;:13;67589:45;;67615:19;;;;;;;;;;;;;;67589:45;67667:3;67651:13;:19;;;;65220:2462;;67692:60;67721:1;67725:2;67729:12;67743:8;67692:20;:60::i;:::-;64856:2904;64794:2966;;:::o;60334:193::-;60480:39;60497:4;60503:2;60507:7;60480:39;;;;;;;;;;;;:16;:39::i;:::-;60334:193;;;:::o;23803:356::-;23937:17;:15;:17::i;:::-;23921:33;;:12;:33;;;;23913:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;24040:1;24020:22;;:8;:22;;;24012:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24116:35;;;;;;;;24128:8;24116:35;;;;;;24138:12;24116:35;;;;;24087:17;:26;24105:7;24087:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23803:356;;;:::o;49831:1275::-;49898:7;49918:12;49933:7;49918:22;;50001:4;49982:15;:13;:15::i;:::-;:23;49978:1061;;50035:13;;50028:4;:20;50024:1015;;;50073:14;50090:17;:23;50108:4;50090:23;;;;;;;;;;;;50073:40;;50207:1;39153:8;50179:6;:24;:29;50175:845;;50844:113;50861:1;50851:6;:11;50844:113;;50904:17;:25;50922:6;;;;;;;50904:25;;;;;;;;;;;;50895:34;;50844:113;;;50990:6;50983:13;;;;;;50175:845;50050:989;50024:1015;49978:1061;51067:31;;;;;;;;;;;;;;49831:1275;;;;:::o;27779:191::-;27853:16;27872:6;;;;;;;;;;;27853:25;;27898:8;27889:6;;:17;;;;;;;;;;;;;;;;;;27953:8;27922:40;;27943:8;27922:40;;;;;;;;;;;;27842:128;27779:191;:::o;54332:234::-;54479:8;54427:18;:39;54446:19;:17;:19::i;:::-;54427:39;;;;;;;;;;;;;;;:49;54467:8;54427:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;54539:8;54503:55;;54518:19;:17;:19::i;:::-;54503:55;;;54549:8;54503:55;;;;;;:::i;:::-;;;;;;;;54332:234;;:::o;61125:407::-;61300:31;61313:4;61319:2;61323:7;61300:12;:31::i;:::-;61364:1;61346:2;:14;;;:19;61342:183;;61385:56;61416:4;61422:2;61426:7;61435:5;61385:30;:56::i;:::-;61380:145;;61469:40;;;;;;;;;;;;;;61380:145;61342:183;61125:407;;;;:::o;97386:106::-;97438:13;97471;97464:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97386:106;:::o;77660:1745::-;77725:17;78159:4;78152;78146:11;78142:22;78251:1;78245:4;78238:15;78326:4;78323:1;78319:12;78312:19;;78408:1;78403:3;78396:14;78512:3;78751:5;78733:428;78759:1;78733:428;;;78799:1;78794:3;78790:11;78783:18;;78970:2;78964:4;78960:13;78956:2;78952:22;78947:3;78939:36;79064:2;79058:4;79054:13;79046:21;;79131:4;78733:428;79121:25;78733:428;78737:21;79200:3;79195;79191:13;79315:4;79310:3;79306:14;79299:21;;79380:6;79375:3;79368:19;77764:1634;;;77660:1745;;;:::o;1336:156::-;1427:4;1480;1451:25;1464:5;1471:4;1451:12;:25::i;:::-;:33;1444:40;;1336:156;;;;;:::o;19216:157::-;19301:4;19340:25;19325:40;;;:11;:40;;;;19318:47;;19216:157;;;:::o;25070:98::-;25123:7;25150:10;25143:17;;25070:98;:::o;77453:105::-;77513:7;77540:10;77533:17;;77453:105;:::o;56308:485::-;56410:27;56439:23;56480:38;56521:15;:24;56537:7;56521:24;;;;;;;;;;;56480:65;;56698:18;56675:41;;56755:19;56749:26;56730:45;;56660:126;56308:485;;;:::o;55536:659::-;55685:11;55850:16;55843:5;55839:28;55830:37;;56010:16;55999:9;55995:32;55982:45;;56160:15;56149:9;56146:30;56138:5;56127:9;56124:20;56121:56;56111:66;;55536:659;;;;;:::o;94528:497::-;94701:21;;;;;;;;;;;:43;;;;;94742:1;94726:18;;:4;:18;;;;94701:43;:63;;;;;94762:1;94748:16;;:2;:16;;;;94701:63;94697:120;;;94788:17;;;;;;;;;;;;;;94697:120;94831:35;94855:10;94831:23;:35::i;:::-;94827:191;;;94883:61;94911:4;94917:2;94921:12;94935:8;94883:27;:61::i;:::-;94827:191;;;94984:22;;;;;;;;;;;;;;94827:191;94528:497;;;;:::o;76762:311::-;76897:7;76917:16;39557:3;76943:19;:41;;76917:68;;39557:3;77011:31;77022:4;77028:2;77032:9;77011:10;:31::i;:::-;77003:40;;:62;;76996:69;;;76762:311;;;;;:::o;51654:450::-;51734:14;51902:16;51895:5;51891:28;51882:37;;52079:5;52065:11;52040:23;52036:41;52033:52;52026:5;52023:63;52013:73;;51654:450;;;;:::o;63018:158::-;;;;;:::o;52206:324::-;52276:14;52509:1;52499:8;52496:15;52470:24;52466:46;52456:56;;52206:324;;;:::o;63616:716::-;63779:4;63825:2;63800:45;;;63846:19;:17;:19::i;:::-;63867:4;63873:7;63882:5;63800:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;63796:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64100:1;64083:6;:13;:18;64079:235;;64129:40;;;;;;;;;;;;;;64079:235;64272:6;64266:13;64257:6;64253:2;64249:15;64242:38;63796:529;63969:54;;;63959:64;;;:6;:64;;;;63952:71;;;63616:716;;;;;;:::o;2055:296::-;2138:7;2158:20;2181:4;2158:27;;2201:9;2196:118;2220:5;:12;2216:1;:16;2196:118;;;2269:33;2279:12;2293:5;2299:1;2293:8;;;;;;;;:::i;:::-;;;;;;;;2269:9;:33::i;:::-;2254:48;;2234:3;;;;;;;2196:118;;;;2331:12;2324:19;;;2055:296;;;;:::o;95033:306::-;95134:4;95160:16;;;;;;;;;;;95156:154;;;95193:18;95224:15;;;;;;;;;;;95193:47;;95262:8;:26;;;95289:8;95262:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;95255:43;;;;;95156:154;95327:4;95320:11;;95033:306;;;;:::o;62194:159::-;;;;;:::o;76463:147::-;76600:6;76463:147;;;;;:::o;9485:149::-;9548:7;9579:1;9575;:5;:51;;9606:20;9621:1;9624;9606:14;:20::i;:::-;9575:51;;;9583:20;9598:1;9601;9583:14;:20::i;:::-;9575:51;9568:58;;9485:149;;;;:::o;9759:268::-;9827:13;9934:1;9928:4;9921:15;9963:1;9957:4;9950:15;10004:4;9998;9988:21;9979:30;;9759:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:246::-;3248:1;3258:113;3272:6;3269:1;3266:13;3258:113;;;3357:1;3352:3;3348:11;3342:18;3338:1;3333:3;3329:11;3322:39;3294:2;3291:1;3287:10;3282:15;;3258:113;;;3405:1;3396:6;3391:3;3387:16;3380:27;3229:184;3167:246;;;:::o;3419:102::-;3460:6;3511:2;3507:7;3502:2;3495:5;3491:14;3487:28;3477:38;;3419:102;;;:::o;3527:377::-;3615:3;3643:39;3676:5;3643:39;:::i;:::-;3698:71;3762:6;3757:3;3698:71;:::i;:::-;3691:78;;3778:65;3836:6;3831:3;3824:4;3817:5;3813:16;3778:65;:::i;:::-;3868:29;3890:6;3868:29;:::i;:::-;3863:3;3859:39;3852:46;;3619:285;3527:377;;;;:::o;3910:313::-;4023:4;4061:2;4050:9;4046:18;4038:26;;4110:9;4104:4;4100:20;4096:1;4085:9;4081:17;4074:47;4138:78;4211:4;4202:6;4138:78;:::i;:::-;4130:86;;3910:313;;;;:::o;4229:77::-;4266:7;4295:5;4284:16;;4229:77;;;:::o;4312:122::-;4385:24;4403:5;4385:24;:::i;:::-;4378:5;4375:35;4365:63;;4424:1;4421;4414:12;4365:63;4312:122;:::o;4440:139::-;4486:5;4524:6;4511:20;4502:29;;4540:33;4567:5;4540:33;:::i;:::-;4440:139;;;;:::o;4585:329::-;4644:6;4693:2;4681:9;4672:7;4668:23;4664:32;4661:119;;;4699:79;;:::i;:::-;4661:119;4819:1;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4790:117;4585:329;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:111::-;5837:1;5830:5;5827:12;5817:40;;5853:1;5850;5843:12;5817:40;5752:111;:::o;5869:163::-;5927:5;5965:6;5952:20;5943:29;;5981:45;6020:5;5981:45;:::i;:::-;5869:163;;;;:::o;6038:353::-;6109:6;6158:2;6146:9;6137:7;6133:23;6129:32;6126:119;;;6164:79;;:::i;:::-;6126:119;6284:1;6309:65;6366:7;6357:6;6346:9;6342:22;6309:65;:::i;:::-;6299:75;;6255:129;6038:353;;;;:::o;6397:118::-;6484:24;6502:5;6484:24;:::i;:::-;6479:3;6472:37;6397:118;;:::o;6521:222::-;6614:4;6652:2;6641:9;6637:18;6629:26;;6665:71;6733:1;6722:9;6718:17;6709:6;6665:71;:::i;:::-;6521:222;;;;:::o;6749:619::-;6826:6;6834;6842;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7017:1;7042:53;7087:7;7078:6;7067:9;7063:22;7042:53;:::i;:::-;7032:63;;6988:117;7144:2;7170:53;7215:7;7206:6;7195:9;7191:22;7170:53;:::i;:::-;7160:63;;7115:118;7272:2;7298:53;7343:7;7334:6;7323:9;7319:22;7298:53;:::i;:::-;7288:63;;7243:118;6749:619;;;;;:::o;7374:474::-;7442:6;7450;7499:2;7487:9;7478:7;7474:23;7470:32;7467:119;;;7505:79;;:::i;:::-;7467:119;7625:1;7650:53;7695:7;7686:6;7675:9;7671:22;7650:53;:::i;:::-;7640:63;;7596:117;7752:2;7778:53;7823:7;7814:6;7803:9;7799:22;7778:53;:::i;:::-;7768:63;;7723:118;7374:474;;;;;:::o;7854:332::-;7975:4;8013:2;8002:9;7998:18;7990:26;;8026:71;8094:1;8083:9;8079:17;8070:6;8026:71;:::i;:::-;8107:72;8175:2;8164:9;8160:18;8151:6;8107:72;:::i;:::-;7854:332;;;;;:::o;8192:77::-;8229:7;8258:5;8247:16;;8192:77;;;:::o;8275:118::-;8362:24;8380:5;8362:24;:::i;:::-;8357:3;8350:37;8275:118;;:::o;8399:222::-;8492:4;8530:2;8519:9;8515:18;8507:26;;8543:71;8611:1;8600:9;8596:17;8587:6;8543:71;:::i;:::-;8399:222;;;;:::o;8627:113::-;8714:1;8707:5;8704:12;8694:40;;8730:1;8727;8720:12;8694:40;8627:113;:::o;8746:167::-;8806:5;8844:6;8831:20;8822:29;;8860:47;8901:5;8860:47;:::i;:::-;8746:167;;;;:::o;8919:357::-;8992:6;9041:2;9029:9;9020:7;9016:23;9012:32;9009:119;;;9047:79;;:::i;:::-;9009:119;9167:1;9192:67;9251:7;9242:6;9231:9;9227:22;9192:67;:::i;:::-;9182:77;;9138:131;8919:357;;;;:::o;9282:60::-;9310:3;9331:5;9324:12;;9282:60;;;:::o;9348:142::-;9398:9;9431:53;9449:34;9458:24;9476:5;9458:24;:::i;:::-;9449:34;:::i;:::-;9431:53;:::i;:::-;9418:66;;9348:142;;;:::o;9496:126::-;9546:9;9579:37;9610:5;9579:37;:::i;:::-;9566:50;;9496:126;;;:::o;9628:149::-;9701:9;9734:37;9765:5;9734:37;:::i;:::-;9721:50;;9628:149;;;:::o;9783:177::-;9893:60;9947:5;9893:60;:::i;:::-;9888:3;9881:73;9783:177;;:::o;9966:268::-;10082:4;10120:2;10109:9;10105:18;10097:26;;10133:94;10224:1;10213:9;10209:17;10200:6;10133:94;:::i;:::-;9966:268;;;;:::o;10240:116::-;10310:21;10325:5;10310:21;:::i;:::-;10303:5;10300:32;10290:60;;10346:1;10343;10336:12;10290:60;10240:116;:::o;10362:133::-;10405:5;10443:6;10430:20;10421:29;;10459:30;10483:5;10459:30;:::i;:::-;10362:133;;;;:::o;10501:323::-;10557:6;10606:2;10594:9;10585:7;10581:23;10577:32;10574:119;;;10612:79;;:::i;:::-;10574:119;10732:1;10757:50;10799:7;10790:6;10779:9;10775:22;10757:50;:::i;:::-;10747:60;;10703:114;10501:323;;;;:::o;10830:180::-;10878:77;10875:1;10868:88;10975:4;10972:1;10965:15;10999:4;10996:1;10989:15;11016:117;11101:1;11094:5;11091:12;11081:46;;11107:18;;:::i;:::-;11081:46;11016:117;:::o;11139:135::-;11188:7;11217:5;11206:16;;11223:45;11262:5;11223:45;:::i;:::-;11139:135;;;:::o;11280:::-;11340:9;11373:36;11403:5;11373:36;:::i;:::-;11360:49;;11280:135;;;:::o;11421:151::-;11518:47;11559:5;11518:47;:::i;:::-;11513:3;11506:60;11421:151;;:::o;11578:242::-;11681:4;11719:2;11708:9;11704:18;11696:26;;11732:81;11810:1;11799:9;11795:17;11786:6;11732:81;:::i;:::-;11578:242;;;;:::o;11826:119::-;11913:1;11906:5;11903:12;11893:46;;11919:18;;:::i;:::-;11893:46;11826:119;:::o;11951:139::-;12002:7;12031:5;12020:16;;12037:47;12078:5;12037:47;:::i;:::-;11951:139;;;:::o;12096:::-;12158:9;12191:38;12223:5;12191:38;:::i;:::-;12178:51;;12096:139;;;:::o;12241:155::-;12340:49;12383:5;12340:49;:::i;:::-;12335:3;12328:62;12241:155;;:::o;12402:246::-;12507:4;12545:2;12534:9;12530:18;12522:26;;12558:83;12638:1;12627:9;12623:17;12614:6;12558:83;:::i;:::-;12402:246;;;;:::o;12654:117::-;12763:1;12760;12753:12;12777:117;12886:1;12883;12876:12;12900:117;13009:1;13006;12999:12;13037:553;13095:8;13105:6;13155:3;13148:4;13140:6;13136:17;13132:27;13122:122;;13163:79;;:::i;:::-;13122:122;13276:6;13263:20;13253:30;;13306:18;13298:6;13295:30;13292:117;;;13328:79;;:::i;:::-;13292:117;13442:4;13434:6;13430:17;13418:29;;13496:3;13488:4;13480:6;13476:17;13466:8;13462:32;13459:41;13456:128;;;13503:79;;:::i;:::-;13456:128;13037:553;;;;;:::o;13596:529::-;13667:6;13675;13724:2;13712:9;13703:7;13699:23;13695:32;13692:119;;;13730:79;;:::i;:::-;13692:119;13878:1;13867:9;13863:17;13850:31;13908:18;13900:6;13897:30;13894:117;;;13930:79;;:::i;:::-;13894:117;14043:65;14100:7;14091:6;14080:9;14076:22;14043:65;:::i;:::-;14025:83;;;;13821:297;13596:529;;;;;:::o;14131:617::-;14207:6;14215;14223;14272:2;14260:9;14251:7;14247:23;14243:32;14240:119;;;14278:79;;:::i;:::-;14240:119;14398:1;14423:53;14468:7;14459:6;14448:9;14444:22;14423:53;:::i;:::-;14413:63;;14369:117;14525:2;14551:53;14596:7;14587:6;14576:9;14572:22;14551:53;:::i;:::-;14541:63;;14496:118;14653:2;14679:52;14723:7;14714:6;14703:9;14699:22;14679:52;:::i;:::-;14669:62;;14624:117;14131:617;;;;;:::o;14754:180::-;14802:77;14799:1;14792:88;14899:4;14896:1;14889:15;14923:4;14920:1;14913:15;14940:281;15023:27;15045:4;15023:27;:::i;:::-;15015:6;15011:40;15153:6;15141:10;15138:22;15117:18;15105:10;15102:34;15099:62;15096:88;;;15164:18;;:::i;:::-;15096:88;15204:10;15200:2;15193:22;14983:238;14940:281;;:::o;15227:129::-;15261:6;15288:20;;:::i;:::-;15278:30;;15317:33;15345:4;15337:6;15317:33;:::i;:::-;15227:129;;;:::o;15362:311::-;15439:4;15529:18;15521:6;15518:30;15515:56;;;15551:18;;:::i;:::-;15515:56;15601:4;15593:6;15589:17;15581:25;;15661:4;15655;15651:15;15643:23;;15362:311;;;:::o;15696:710::-;15792:5;15817:81;15833:64;15890:6;15833:64;:::i;:::-;15817:81;:::i;:::-;15808:90;;15918:5;15947:6;15940:5;15933:21;15981:4;15974:5;15970:16;15963:23;;16034:4;16026:6;16022:17;16014:6;16010:30;16063:3;16055:6;16052:15;16049:122;;;16082:79;;:::i;:::-;16049:122;16197:6;16180:220;16214:6;16209:3;16206:15;16180:220;;;16289:3;16318:37;16351:3;16339:10;16318:37;:::i;:::-;16313:3;16306:50;16385:4;16380:3;16376:14;16369:21;;16256:144;16240:4;16235:3;16231:14;16224:21;;16180:220;;;16184:21;15798:608;;15696:710;;;;;:::o;16429:370::-;16500:5;16549:3;16542:4;16534:6;16530:17;16526:27;16516:122;;16557:79;;:::i;:::-;16516:122;16674:6;16661:20;16699:94;16789:3;16781:6;16774:4;16766:6;16762:17;16699:94;:::i;:::-;16690:103;;16506:293;16429:370;;;;:::o;16805:311::-;16882:4;16972:18;16964:6;16961:30;16958:56;;;16994:18;;:::i;:::-;16958:56;17044:4;17036:6;17032:17;17024:25;;17104:4;17098;17094:15;17086:23;;16805:311;;;:::o;17139:710::-;17235:5;17260:81;17276:64;17333:6;17276:64;:::i;:::-;17260:81;:::i;:::-;17251:90;;17361:5;17390:6;17383:5;17376:21;17424:4;17417:5;17413:16;17406:23;;17477:4;17469:6;17465:17;17457:6;17453:30;17506:3;17498:6;17495:15;17492:122;;;17525:79;;:::i;:::-;17492:122;17640:6;17623:220;17657:6;17652:3;17649:15;17623:220;;;17732:3;17761:37;17794:3;17782:10;17761:37;:::i;:::-;17756:3;17749:50;17828:4;17823:3;17819:14;17812:21;;17699:144;17683:4;17678:3;17674:14;17667:21;;17623:220;;;17627:21;17241:608;;17139:710;;;;;:::o;17872:370::-;17943:5;17992:3;17985:4;17977:6;17973:17;17969:27;17959:122;;18000:79;;:::i;:::-;17959:122;18117:6;18104:20;18142:94;18232:3;18224:6;18217:4;18209:6;18205:17;18142:94;:::i;:::-;18133:103;;17949:293;17872:370;;;;:::o;18248:894::-;18366:6;18374;18423:2;18411:9;18402:7;18398:23;18394:32;18391:119;;;18429:79;;:::i;:::-;18391:119;18577:1;18566:9;18562:17;18549:31;18607:18;18599:6;18596:30;18593:117;;;18629:79;;:::i;:::-;18593:117;18734:78;18804:7;18795:6;18784:9;18780:22;18734:78;:::i;:::-;18724:88;;18520:302;18889:2;18878:9;18874:18;18861:32;18920:18;18912:6;18909:30;18906:117;;;18942:79;;:::i;:::-;18906:117;19047:78;19117:7;19108:6;19097:9;19093:22;19047:78;:::i;:::-;19037:88;;18832:303;18248:894;;;;;:::o;19148:329::-;19207:6;19256:2;19244:9;19235:7;19231:23;19227:32;19224:119;;;19262:79;;:::i;:::-;19224:119;19382:1;19407:53;19452:7;19443:6;19432:9;19428:22;19407:53;:::i;:::-;19397:63;;19353:117;19148:329;;;;:::o;19483:104::-;19528:7;19557:24;19575:5;19557:24;:::i;:::-;19546:35;;19483:104;;;:::o;19593:138::-;19674:32;19700:5;19674:32;:::i;:::-;19667:5;19664:43;19654:71;;19721:1;19718;19711:12;19654:71;19593:138;:::o;19737:155::-;19791:5;19829:6;19816:20;19807:29;;19845:41;19880:5;19845:41;:::i;:::-;19737:155;;;;:::o;19898:345::-;19965:6;20014:2;20002:9;19993:7;19989:23;19985:32;19982:119;;;20020:79;;:::i;:::-;19982:119;20140:1;20165:61;20218:7;20209:6;20198:9;20194:22;20165:61;:::i;:::-;20155:71;;20111:125;19898:345;;;;:::o;20249:122::-;20322:24;20340:5;20322:24;:::i;:::-;20315:5;20312:35;20302:63;;20361:1;20358;20351:12;20302:63;20249:122;:::o;20377:139::-;20423:5;20461:6;20448:20;20439:29;;20477:33;20504:5;20477:33;:::i;:::-;20377:139;;;;:::o;20522:329::-;20581:6;20630:2;20618:9;20609:7;20605:23;20601:32;20598:119;;;20636:79;;:::i;:::-;20598:119;20756:1;20781:53;20826:7;20817:6;20806:9;20802:22;20781:53;:::i;:::-;20771:63;;20727:117;20522:329;;;;:::o;20857:474::-;20925:6;20933;20982:2;20970:9;20961:7;20957:23;20953:32;20950:119;;;20988:79;;:::i;:::-;20950:119;21108:1;21133:53;21178:7;21169:6;21158:9;21154:22;21133:53;:::i;:::-;21123:63;;21079:117;21235:2;21261:53;21306:7;21297:6;21286:9;21282:22;21261:53;:::i;:::-;21251:63;;21206:118;20857:474;;;;;:::o;21337:141::-;21402:9;21435:37;21466:5;21435:37;:::i;:::-;21422:50;;21337:141;;;:::o;21484:161::-;21586:52;21632:5;21586:52;:::i;:::-;21581:3;21574:65;21484:161;;:::o;21651:252::-;21759:4;21797:2;21786:9;21782:18;21774:26;;21810:86;21893:1;21882:9;21878:17;21869:6;21810:86;:::i;:::-;21651:252;;;;:::o;21909:468::-;21974:6;21982;22031:2;22019:9;22010:7;22006:23;22002:32;21999:119;;;22037:79;;:::i;:::-;21999:119;22157:1;22182:53;22227:7;22218:6;22207:9;22203:22;22182:53;:::i;:::-;22172:63;;22128:117;22284:2;22310:50;22352:7;22343:6;22332:9;22328:22;22310:50;:::i;:::-;22300:60;;22255:115;21909:468;;;;;:::o;22383:117::-;22492:1;22489;22482:12;22506:307;22567:4;22657:18;22649:6;22646:30;22643:56;;;22679:18;;:::i;:::-;22643:56;22717:29;22739:6;22717:29;:::i;:::-;22709:37;;22801:4;22795;22791:15;22783:23;;22506:307;;;:::o;22819:146::-;22916:6;22911:3;22906;22893:30;22957:1;22948:6;22943:3;22939:16;22932:27;22819:146;;;:::o;22971:423::-;23048:5;23073:65;23089:48;23130:6;23089:48;:::i;:::-;23073:65;:::i;:::-;23064:74;;23161:6;23154:5;23147:21;23199:4;23192:5;23188:16;23237:3;23228:6;23223:3;23219:16;23216:25;23213:112;;;23244:79;;:::i;:::-;23213:112;23334:54;23381:6;23376:3;23371;23334:54;:::i;:::-;23054:340;22971:423;;;;;:::o;23413:338::-;23468:5;23517:3;23510:4;23502:6;23498:17;23494:27;23484:122;;23525:79;;:::i;:::-;23484:122;23642:6;23629:20;23667:78;23741:3;23733:6;23726:4;23718:6;23714:17;23667:78;:::i;:::-;23658:87;;23474:277;23413:338;;;;:::o;23757:943::-;23852:6;23860;23868;23876;23925:3;23913:9;23904:7;23900:23;23896:33;23893:120;;;23932:79;;:::i;:::-;23893:120;24052:1;24077:53;24122:7;24113:6;24102:9;24098:22;24077:53;:::i;:::-;24067:63;;24023:117;24179:2;24205:53;24250:7;24241:6;24230:9;24226:22;24205:53;:::i;:::-;24195:63;;24150:118;24307:2;24333:53;24378:7;24369:6;24358:9;24354:22;24333:53;:::i;:::-;24323:63;;24278:118;24463:2;24452:9;24448:18;24435:32;24494:18;24486:6;24483:30;24480:117;;;24516:79;;:::i;:::-;24480:117;24621:62;24675:7;24666:6;24655:9;24651:22;24621:62;:::i;:::-;24611:72;;24406:287;23757:943;;;;;;;:::o;24723:568::-;24796:8;24806:6;24856:3;24849:4;24841:6;24837:17;24833:27;24823:122;;24864:79;;:::i;:::-;24823:122;24977:6;24964:20;24954:30;;25007:18;24999:6;24996:30;24993:117;;;25029:79;;:::i;:::-;24993:117;25143:4;25135:6;25131:17;25119:29;;25197:3;25189:4;25181:6;25177:17;25167:8;25163:32;25160:41;25157:128;;;25204:79;;:::i;:::-;25157:128;24723:568;;;;;:::o;25297:704::-;25392:6;25400;25408;25457:2;25445:9;25436:7;25432:23;25428:32;25425:119;;;25463:79;;:::i;:::-;25425:119;25583:1;25608:53;25653:7;25644:6;25633:9;25629:22;25608:53;:::i;:::-;25598:63;;25554:117;25738:2;25727:9;25723:18;25710:32;25769:18;25761:6;25758:30;25755:117;;;25791:79;;:::i;:::-;25755:117;25904:80;25976:7;25967:6;25956:9;25952:22;25904:80;:::i;:::-;25886:98;;;;25681:313;25297:704;;;;;:::o;26007:180::-;26055:77;26052:1;26045:88;26152:4;26149:1;26142:15;26176:4;26173:1;26166:15;26193:320;26237:6;26274:1;26268:4;26264:12;26254:22;;26321:1;26315:4;26311:12;26342:18;26332:81;;26398:4;26390:6;26386:17;26376:27;;26332:81;26460:2;26452:6;26449:14;26429:18;26426:38;26423:84;;26479:18;;:::i;:::-;26423:84;26244:269;26193:320;;;:::o;26519:486::-;26690:4;26728:2;26717:9;26713:18;26705:26;;26741:83;26821:1;26810:9;26806:17;26797:6;26741:83;:::i;:::-;26834:82;26912:2;26901:9;26897:18;26888:6;26834:82;:::i;:::-;26926:72;26994:2;26983:9;26979:18;26970:6;26926:72;:::i;:::-;26519:486;;;;;;:::o;27011:180::-;27059:77;27056:1;27049:88;27156:4;27153:1;27146:15;27180:4;27177:1;27170:15;27197:410;27237:7;27260:20;27278:1;27260:20;:::i;:::-;27255:25;;27294:20;27312:1;27294:20;:::i;:::-;27289:25;;27349:1;27346;27342:9;27371:30;27389:11;27371:30;:::i;:::-;27360:41;;27550:1;27541:7;27537:15;27534:1;27531:22;27511:1;27504:9;27484:83;27461:139;;27580:18;;:::i;:::-;27461:139;27245:362;27197:410;;;;:::o;27613:180::-;27661:77;27658:1;27651:88;27758:4;27755:1;27748:15;27782:4;27779:1;27772:15;27799:185;27839:1;27856:20;27874:1;27856:20;:::i;:::-;27851:25;;27890:20;27908:1;27890:20;:::i;:::-;27885:25;;27929:1;27919:35;;27934:18;;:::i;:::-;27919:35;27976:1;27973;27969:9;27964:14;;27799:185;;;;:::o;27990:191::-;28030:3;28049:20;28067:1;28049:20;:::i;:::-;28044:25;;28083:20;28101:1;28083:20;:::i;:::-;28078:25;;28126:1;28123;28119:9;28112:16;;28147:3;28144:1;28141:10;28138:36;;;28154:18;;:::i;:::-;28138:36;27990:191;;;;:::o;28187:332::-;28308:4;28346:2;28335:9;28331:18;28323:26;;28359:71;28427:1;28416:9;28412:17;28403:6;28359:71;:::i;:::-;28440:72;28508:2;28497:9;28493:18;28484:6;28440:72;:::i;:::-;28187:332;;;;;:::o;28525:143::-;28582:5;28613:6;28607:13;28598:22;;28629:33;28656:5;28629:33;:::i;:::-;28525:143;;;;:::o;28674:351::-;28744:6;28793:2;28781:9;28772:7;28768:23;28764:32;28761:119;;;28799:79;;:::i;:::-;28761:119;28919:1;28944:64;29000:7;28991:6;28980:9;28976:22;28944:64;:::i;:::-;28934:74;;28890:128;28674:351;;;;:::o;29031:442::-;29180:4;29218:2;29207:9;29203:18;29195:26;;29231:71;29299:1;29288:9;29284:17;29275:6;29231:71;:::i;:::-;29312:72;29380:2;29369:9;29365:18;29356:6;29312:72;:::i;:::-;29394;29462:2;29451:9;29447:18;29438:6;29394:72;:::i;:::-;29031:442;;;;;;:::o;29479:97::-;29538:6;29566:3;29556:13;;29479:97;;;;:::o;29582:141::-;29631:4;29654:3;29646:11;;29677:3;29674:1;29667:14;29711:4;29708:1;29698:18;29690:26;;29582:141;;;:::o;29729:93::-;29766:6;29813:2;29808;29801:5;29797:14;29793:23;29783:33;;29729:93;;;:::o;29828:107::-;29872:8;29922:5;29916:4;29912:16;29891:37;;29828:107;;;;:::o;29941:393::-;30010:6;30060:1;30048:10;30044:18;30083:97;30113:66;30102:9;30083:97;:::i;:::-;30201:39;30231:8;30220:9;30201:39;:::i;:::-;30189:51;;30273:4;30269:9;30262:5;30258:21;30249:30;;30322:4;30312:8;30308:19;30301:5;30298:30;30288:40;;30017:317;;29941:393;;;;;:::o;30340:142::-;30390:9;30423:53;30441:34;30450:24;30468:5;30450:24;:::i;:::-;30441:34;:::i;:::-;30423:53;:::i;:::-;30410:66;;30340:142;;;:::o;30488:75::-;30531:3;30552:5;30545:12;;30488:75;;;:::o;30569:269::-;30679:39;30710:7;30679:39;:::i;:::-;30740:91;30789:41;30813:16;30789:41;:::i;:::-;30781:6;30774:4;30768:11;30740:91;:::i;:::-;30734:4;30727:105;30645:193;30569:269;;;:::o;30844:73::-;30889:3;30844:73;:::o;30923:189::-;31000:32;;:::i;:::-;31041:65;31099:6;31091;31085:4;31041:65;:::i;:::-;30976:136;30923:189;;:::o;31118:186::-;31178:120;31195:3;31188:5;31185:14;31178:120;;;31249:39;31286:1;31279:5;31249:39;:::i;:::-;31222:1;31215:5;31211:13;31202:22;;31178:120;;;31118:186;;:::o;31310:543::-;31411:2;31406:3;31403:11;31400:446;;;31445:38;31477:5;31445:38;:::i;:::-;31529:29;31547:10;31529:29;:::i;:::-;31519:8;31515:44;31712:2;31700:10;31697:18;31694:49;;;31733:8;31718:23;;31694:49;31756:80;31812:22;31830:3;31812:22;:::i;:::-;31802:8;31798:37;31785:11;31756:80;:::i;:::-;31415:431;;31400:446;31310:543;;;:::o;31859:117::-;31913:8;31963:5;31957:4;31953:16;31932:37;;31859:117;;;;:::o;31982:169::-;32026:6;32059:51;32107:1;32103:6;32095:5;32092:1;32088:13;32059:51;:::i;:::-;32055:56;32140:4;32134;32130:15;32120:25;;32033:118;31982:169;;;;:::o;32156:295::-;32232:4;32378:29;32403:3;32397:4;32378:29;:::i;:::-;32370:37;;32440:3;32437:1;32433:11;32427:4;32424:21;32416:29;;32156:295;;;;:::o;32456:1403::-;32580:44;32620:3;32615;32580:44;:::i;:::-;32689:18;32681:6;32678:30;32675:56;;;32711:18;;:::i;:::-;32675:56;32755:38;32787:4;32781:11;32755:38;:::i;:::-;32840:67;32900:6;32892;32886:4;32840:67;:::i;:::-;32934:1;32963:2;32955:6;32952:14;32980:1;32975:632;;;;33651:1;33668:6;33665:84;;;33724:9;33719:3;33715:19;33702:33;33693:42;;33665:84;33775:67;33835:6;33828:5;33775:67;:::i;:::-;33769:4;33762:81;33624:229;32945:908;;32975:632;33027:4;33023:9;33015:6;33011:22;33061:37;33093:4;33061:37;:::i;:::-;33120:1;33134:215;33148:7;33145:1;33142:14;33134:215;;;33234:9;33229:3;33225:19;33212:33;33204:6;33197:49;33285:1;33277:6;33273:14;33263:24;;33332:2;33321:9;33317:18;33304:31;;33171:4;33168:1;33164:12;33159:17;;33134:215;;;33377:6;33368:7;33365:19;33362:186;;;33442:9;33437:3;33433:19;33420:33;33485:48;33527:4;33519:6;33515:17;33504:9;33485:48;:::i;:::-;33477:6;33470:64;33385:163;33362:186;33594:1;33590;33582:6;33578:14;33574:22;33568:4;33561:36;32982:625;;;32945:908;;32555:1304;;;32456:1403;;;:::o;33865:180::-;33913:77;33910:1;33903:88;34010:4;34007:1;34000:15;34034:4;34031:1;34024:15;34051:137;34105:5;34136:6;34130:13;34121:22;;34152:30;34176:5;34152:30;:::i;:::-;34051:137;;;;:::o;34194:345::-;34261:6;34310:2;34298:9;34289:7;34285:23;34281:32;34278:119;;;34316:79;;:::i;:::-;34278:119;34436:1;34461:61;34514:7;34505:6;34494:9;34490:22;34461:61;:::i;:::-;34451:71;;34407:125;34194:345;;;;:::o;34545:148::-;34647:11;34684:3;34669:18;;34545:148;;;;:::o;34699:390::-;34805:3;34833:39;34866:5;34833:39;:::i;:::-;34888:89;34970:6;34965:3;34888:89;:::i;:::-;34881:96;;34986:65;35044:6;35039:3;35032:4;35025:5;35021:16;34986:65;:::i;:::-;35076:6;35071:3;35067:16;35060:23;;34809:280;34699:390;;;;:::o;35095:157::-;35235:9;35231:1;35223:6;35219:14;35212:33;35095:157;:::o;35258:400::-;35418:3;35439:84;35521:1;35516:3;35439:84;:::i;:::-;35432:91;;35532:93;35621:3;35532:93;:::i;:::-;35650:1;35645:3;35641:11;35634:18;;35258:400;;;:::o;35664:701::-;35945:3;35967:95;36058:3;36049:6;35967:95;:::i;:::-;35960:102;;36079:148;36223:3;36079:148;:::i;:::-;36072:155;;36244:95;36335:3;36326:6;36244:95;:::i;:::-;36237:102;;36356:3;36349:10;;35664:701;;;;;:::o;36371:94::-;36404:8;36452:5;36448:2;36444:14;36423:35;;36371:94;;;:::o;36471:::-;36510:7;36539:20;36553:5;36539:20;:::i;:::-;36528:31;;36471:94;;;:::o;36571:100::-;36610:7;36639:26;36659:5;36639:26;:::i;:::-;36628:37;;36571:100;;;:::o;36677:157::-;36782:45;36802:24;36820:5;36802:24;:::i;:::-;36782:45;:::i;:::-;36777:3;36770:58;36677:157;;:::o;36840:256::-;36952:3;36967:75;37038:3;37029:6;36967:75;:::i;:::-;37067:2;37062:3;37058:12;37051:19;;37087:3;37080:10;;36840:256;;;;:::o;37102:225::-;37242:34;37238:1;37230:6;37226:14;37219:58;37311:8;37306:2;37298:6;37294:15;37287:33;37102:225;:::o;37333:366::-;37475:3;37496:67;37560:2;37555:3;37496:67;:::i;:::-;37489:74;;37572:93;37661:3;37572:93;:::i;:::-;37690:2;37685:3;37681:12;37674:19;;37333:366;;;:::o;37705:419::-;37871:4;37909:2;37898:9;37894:18;37886:26;;37958:9;37952:4;37948:20;37944:1;37933:9;37929:17;37922:47;37986:131;38112:4;37986:131;:::i;:::-;37978:139;;37705:419;;;:::o;38130:182::-;38270:34;38266:1;38258:6;38254:14;38247:58;38130:182;:::o;38318:366::-;38460:3;38481:67;38545:2;38540:3;38481:67;:::i;:::-;38474:74;;38557:93;38646:3;38557:93;:::i;:::-;38675:2;38670:3;38666:12;38659:19;;38318:366;;;:::o;38690:419::-;38856:4;38894:2;38883:9;38879:18;38871:26;;38943:9;38937:4;38933:20;38929:1;38918:9;38914:17;38907:47;38971:131;39097:4;38971:131;:::i;:::-;38963:139;;38690:419;;;:::o;39115:229::-;39255:34;39251:1;39243:6;39239:14;39232:58;39324:12;39319:2;39311:6;39307:15;39300:37;39115:229;:::o;39350:366::-;39492:3;39513:67;39577:2;39572:3;39513:67;:::i;:::-;39506:74;;39589:93;39678:3;39589:93;:::i;:::-;39707:2;39702:3;39698:12;39691:19;;39350:366;;;:::o;39722:419::-;39888:4;39926:2;39915:9;39911:18;39903:26;;39975:9;39969:4;39965:20;39961:1;39950:9;39946:17;39939:47;40003:131;40129:4;40003:131;:::i;:::-;39995:139;;39722:419;;;:::o;40147:175::-;40287:27;40283:1;40275:6;40271:14;40264:51;40147:175;:::o;40328:366::-;40470:3;40491:67;40555:2;40550:3;40491:67;:::i;:::-;40484:74;;40567:93;40656:3;40567:93;:::i;:::-;40685:2;40680:3;40676:12;40669:19;;40328:366;;;:::o;40700:419::-;40866:4;40904:2;40893:9;40889:18;40881:26;;40953:9;40947:4;40943:20;40939:1;40928:9;40924:17;40917:47;40981:131;41107:4;40981:131;:::i;:::-;40973:139;;40700:419;;;:::o;41125:177::-;41265:29;41261:1;41253:6;41249:14;41242:53;41125:177;:::o;41308:366::-;41450:3;41471:67;41535:2;41530:3;41471:67;:::i;:::-;41464:74;;41547:93;41636:3;41547:93;:::i;:::-;41665:2;41660:3;41656:12;41649:19;;41308:366;;;:::o;41680:419::-;41846:4;41884:2;41873:9;41869:18;41861:26;;41933:9;41927:4;41923:20;41919:1;41908:9;41904:17;41897:47;41961:131;42087:4;41961:131;:::i;:::-;41953:139;;41680:419;;;:::o;42105:98::-;42156:6;42190:5;42184:12;42174:22;;42105:98;;;:::o;42209:168::-;42292:11;42326:6;42321:3;42314:19;42366:4;42361:3;42357:14;42342:29;;42209:168;;;;:::o;42383:373::-;42469:3;42497:38;42529:5;42497:38;:::i;:::-;42551:70;42614:6;42609:3;42551:70;:::i;:::-;42544:77;;42630:65;42688:6;42683:3;42676:4;42669:5;42665:16;42630:65;:::i;:::-;42720:29;42742:6;42720:29;:::i;:::-;42715:3;42711:39;42704:46;;42473:283;42383:373;;;;:::o;42762:640::-;42957:4;42995:3;42984:9;42980:19;42972:27;;43009:71;43077:1;43066:9;43062:17;43053:6;43009:71;:::i;:::-;43090:72;43158:2;43147:9;43143:18;43134:6;43090:72;:::i;:::-;43172;43240:2;43229:9;43225:18;43216:6;43172:72;:::i;:::-;43291:9;43285:4;43281:20;43276:2;43265:9;43261:18;43254:48;43319:76;43390:4;43381:6;43319:76;:::i;:::-;43311:84;;42762:640;;;;;;;:::o;43408:141::-;43464:5;43495:6;43489:13;43480:22;;43511:32;43537:5;43511:32;:::i;:::-;43408:141;;;;:::o;43555:349::-;43624:6;43673:2;43661:9;43652:7;43648:23;43644:32;43641:119;;;43679:79;;:::i;:::-;43641:119;43799:1;43824:63;43879:7;43870:6;43859:9;43855:22;43824:63;:::i;:::-;43814:73;;43770:127;43555:349;;;;:::o
Swarm Source
ipfs://ba91937f37ff1fa378cdbe43752eaced336d86cff0cfd6c5d151db55dfae34d1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.