Overview
TokenID
7276
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
IRLPunks
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-30 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) /** * @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 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} * * _Available since v4.7._ */ 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. * * _Available since v4.4._ */ 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} * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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. * * _Available since v4.7._ */ 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). * * _Available since v4.7._ */ 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. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); 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. * * _Available since v4.7._ */ 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. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } 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) } } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } /** * @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); } } // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } /** * @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); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @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; } } /** * @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]; } } // ERC721A Contracts v4.2.3 // Creator: Chiru Labs // ERC721A Contracts v4.2.3 // Creator: Chiru Labs // ERC721A Contracts v4.2.3 // Creator: Chiru Labs /** * @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); } /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // ERC721A Contracts v4.2.3 // Creator: Chiru Labs /** * @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) } } } /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } pragma solidity ^0.8.19; contract IRLPunks is DefaultOperatorFilterer, ERC2981, ERC721AQueryable, Ownable { uint256 public constant SUPPLY = 10000; uint public totalFreeMinted = 0; uint public totalWLMinted = 0; uint256 public reservedSupply = 50; uint public price = 0.0069 ether; uint public publicPrice = 0.0089 ether; uint public maxPerWallet = 40; uint256 public freePerWL = 1; uint256 public maxPerWL = 5; string public baseURI; uint256 public Max_PublicPerTX = 20; using MerkleProof for bytes32[]; bytes32 public whitelistMerkleRoot; bool public WLSaleActive; bool public publicsaleActive; uint256 public walletsInWL; mapping (address => uint256) public _WLClaimed; mapping(address => uint256) public _freeMinted; mapping(address => uint256) public _maxPerWallet; constructor() ERC721A("IRL Punks", "IRL") { } function setPublicSaleActive() external onlyOwner { publicsaleActive = !publicsaleActive; } function setWLSaleActive() external onlyOwner { WLSaleActive = !WLSaleActive; } function setfreePerWL(uint256 count) external onlyOwner { freePerWL = count; } function setMaxPerWL(uint256 count) external onlyOwner { maxPerWL = count; } function setMax_PublicPerTX(uint256 count) external onlyOwner { Max_PublicPerTX = count; } function withdraw() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } function setMerkleRoot(bytes32 root) external onlyOwner { whitelistMerkleRoot = root; } function setCost(uint256 price_) external onlyOwner { price = price_; } function setPublicCost(uint256 publicPrice_) external onlyOwner { publicPrice = publicPrice_; } function setWalletsInWL(uint256 count) external onlyOwner { walletsInWL = count; } function costInspect() public view returns (uint256) { return price; } function costPublicInspect() public view returns (uint256) { return publicPrice; } function reservedMint(uint256 count) external onlyOwner { uint256 Remaining = reservedSupply; require(totalSupply() + count <= SUPPLY, "No more supply to be minted"); require(Remaining >= count, "Reserved Supply Minted"); reservedSupply = Remaining - count; _safeMint(msg.sender, count); } function presaleMint(uint256 count, bytes32[] memory proof) payable public { require(WLSaleActive, "Presale Not Active Yet"); require(_verify(_leaf(msg.sender), whitelistMerkleRoot, proof), "Wallet not whitelisted"); require(((totalSupply() + count) <= SUPPLY), "Sold Out!"); require(_WLClaimed[msg.sender] + count <= maxPerWL, "Max Presale Allocation reached"); require(((totalWLMinted + count) <= (SUPPLY - walletsInWL + totalFreeMinted)), "Only Guaranteed Free Supply Left"); bool MintForFree = (_freeMinted[msg.sender] < freePerWL); if(MintForFree) { if(count >= (freePerWL - _freeMinted[msg.sender])) { require(msg.value >= (count * price) - ((freePerWL - _freeMinted[msg.sender]) * price), "Please send enough ETH"); _freeMinted[msg.sender] = freePerWL; totalFreeMinted += freePerWL; totalWLMinted += count; } } else { require(msg.value >= count * price, "Please send enough ETH"); totalWLMinted += count; } _WLClaimed[msg.sender] += count; _safeMint(msg.sender, count); } function mint(uint256 count) payable public { require(publicsaleActive, "Public Not Active Yet"); require(((totalSupply() + count) <= SUPPLY), "Sold Out!"); require(msg.value >= count * publicPrice, "Please send enough ETH"); require ((count <= Max_PublicPerTX), "Max per transaction exceeded"); require (((_maxPerWallet[msg.sender] + count) <= maxPerWallet), "Max per wallet exceeded"); require(((totalSupply() + count) <= (SUPPLY - walletsInWL + totalFreeMinted)), "Only Guaranteed Free Supply Left"); _maxPerWallet[msg.sender] += count; _safeMint(msg.sender, count); } function _leaf(address account) public pure returns (bytes32) { return keccak256(abi.encodePacked(account)); } function _verify(bytes32 leaf, bytes32 root, bytes32[] memory proof) public pure returns (bool) { return MerkleProof.verify(proof, root, leaf); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setApprovalForAll(address operator, bool approved) public override(ERC721A, IERC721A) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override(ERC721A, IERC721A) payable onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) payable onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override(ERC721A, IERC721A) payable onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override(ERC721A, IERC721A) payable onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } }
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":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"Max_PublicPerTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_WLClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"_leaf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"_verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costInspect","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costPublicInspect","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"maxPerWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"count","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setMaxPerWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setMax_PublicPerTX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicPrice_","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWLSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setWalletsInWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setfreePerWL","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWLMinted","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":"walletsInWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b556000600c556032600d556618838370f34000600e55661f9e80ba804000600f55602860105560016011556005601255601480553480156200004957600080fd5b506040518060400160405280600981526020017f49524c2050756e6b7300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f49524c0000000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002c257801562000188576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200014e9291906200043e565b600060405180830381600087803b1580156200016957600080fd5b505af11580156200017e573d6000803e3d6000fd5b50505050620002c1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000242576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002089291906200043e565b600060405180830381600087803b1580156200022357600080fd5b505af115801562000238573d6000803e3d6000fd5b50505050620002c0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200028b91906200046b565b600060405180830381600087803b158015620002a657600080fd5b505af1158015620002bb573d6000803e3d6000fd5b505050505b5b5b50508160049081620002d5919062000702565b508060059081620002e7919062000702565b50620002f86200032660201b60201c565b600281905550505062000320620003146200032b60201b60201c565b6200033360201b60201c565b620007e9565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200042682620003f9565b9050919050565b620004388162000419565b82525050565b60006040820190506200045560008301856200042d565b6200046460208301846200042d565b9392505050565b60006020820190506200048260008301846200042d565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050a57607f821691505b60208210810362000520576200051f620004c2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200058a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200054b565b6200059686836200054b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005e3620005dd620005d784620005ae565b620005b8565b620005ae565b9050919050565b6000819050919050565b620005ff83620005c2565b620006176200060e82620005ea565b84845462000558565b825550505050565b600090565b6200062e6200061f565b6200063b818484620005f4565b505050565b5b8181101562000663576200065760008262000624565b60018101905062000641565b5050565b601f821115620006b2576200067c8162000526565b62000687846200053b565b8101602085101562000697578190505b620006af620006a6856200053b565b83018262000640565b50505b505050565b600082821c905092915050565b6000620006d760001984600802620006b7565b1980831691505092915050565b6000620006f28383620006c4565b9150826002028217905092915050565b6200070d8262000488565b67ffffffffffffffff81111562000729576200072862000493565b5b620007358254620004f1565b6200074282828562000667565b600060209050601f8311600181146200077a576000841562000765578287015190505b620007718582620006e4565b865550620007e1565b601f1984166200078a8662000526565b60005b82811015620007b4578489015182556001820191506020850194506020810190506200078d565b86831015620007d45784890151620007d0601f891682620006c4565b8355505b6001600288020188555050505b505050505050565b61529480620007f96000396000f3fe60806040526004361061038c5760003560e01c80637bf65c12116101dc578063aa98e0c611610102578063cb17e215116100a0578063e985e9c51161006f578063e985e9c514610d33578063ee64aefb14610d70578063f2fde38b14610d9b578063f809efe814610dc45761038c565b8063cb17e21514610c98578063dad7b5c914610cc1578063e3e1e8ef14610cec578063e6ac8eb514610d085761038c565b8063b9411601116100dc578063b941160114610bc8578063c23dc68f14610bf3578063c50497ae14610c30578063c87b56dd14610c5b5761038c565b8063aa98e0c614610b56578063abccc31e14610b81578063b88d4fde14610bac5761038c565b806395d89b411161017a578063a0712d6811610149578063a0712d6814610abd578063a0bcfc7f14610ad9578063a22cb46514610b02578063a945bf8014610b2b5761038c565b806395d89b41146109ed57806397731e4e14610a1857806399a2557a14610a55578063a035b1fe14610a925761038c565b8063811d2437116101b6578063811d2437146109335780638462151c1461095c5780638c74bf0e146109995780638da5cb5b146109c25761038c565b80637bf65c12146108b65780637cb64759146108e15780637f8448a91461090a5761038c565b806344a0d68a116102c15780635db7480e1161025f5780636c0360eb1161022e5780636c0360eb1461080c57806370a0823114610837578063715018a614610874578063726797271461088b5761038c565b80635db7480e1461072c5780636352211e1461076957806368785e11146107a657806369296ca0146107cf5761038c565b806349912e8d1161029b57806349912e8d1461065e5780634a75d0ec1461069b57806350c14952146106c65780635bbb2177146106ef5761038c565b806344a0d68a146105df57806344d19d2b14610608578063453c2310146106335761038c565b80632a55205a1161032e5780633ccfd60b116103085780633ccfd60b1461056a5780633e11ab3f1461058157806341f434341461059857806342842e0e146105c35761038c565b80632a55205a146104d65780632d393fb6146105145780633432123d1461053f5761038c565b8063095ea7b31161036a578063095ea7b31461043657806318160ddd146104525780631da4f08b1461047d57806323b872dd146104ba5761038c565b806301ffc9a71461039157806306fdde03146103ce578063081812fc146103f9575b600080fd5b34801561039d57600080fd5b506103b860048036038101906103b3919061386a565b610ddb565b6040516103c591906138b2565b60405180910390f35b3480156103da57600080fd5b506103e3610dfd565b6040516103f0919061395d565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b91906139b5565b610e8f565b60405161042d9190613a23565b60405180910390f35b610450600480360381019061044b9190613a6a565b610f0e565b005b34801561045e57600080fd5b50610467610f27565b6040516104749190613ab9565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f9190613ad4565b610f3e565b6040516104b19190613ab9565b60405180910390f35b6104d460048036038101906104cf9190613b01565b610f56565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613b54565b610fa5565b60405161050b929190613b94565b60405180910390f35b34801561052057600080fd5b5061052961118f565b6040516105369190613ab9565b60405180910390f35b34801561054b57600080fd5b50610554611195565b60405161056191906138b2565b60405180910390f35b34801561057657600080fd5b5061057f6111a8565b005b34801561058d57600080fd5b5061059661125f565b005b3480156105a457600080fd5b506105ad611293565b6040516105ba9190613c1c565b60405180910390f35b6105dd60048036038101906105d89190613b01565b6112a5565b005b3480156105eb57600080fd5b50610606600480360381019061060191906139b5565b6112f4565b005b34801561061457600080fd5b5061061d611306565b60405161062a9190613ab9565b60405180910390f35b34801561063f57600080fd5b5061064861130c565b6040516106559190613ab9565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613ad4565b611312565b6040516106929190613c50565b60405180910390f35b3480156106a757600080fd5b506106b0611342565b6040516106bd9190613ab9565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e891906139b5565b61134c565b005b3480156106fb57600080fd5b5061071660048036038101906107119190613cd0565b61135e565b6040516107239190613e80565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613ad4565b611421565b6040516107609190613ab9565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906139b5565b611439565b60405161079d9190613a23565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c891906139b5565b61144b565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613ad4565b61145d565b6040516108039190613ab9565b60405180910390f35b34801561081857600080fd5b50610821611475565b60405161082e919061395d565b60405180910390f35b34801561084357600080fd5b5061085e60048036038101906108599190613ad4565b611503565b60405161086b9190613ab9565b60405180910390f35b34801561088057600080fd5b506108896115bb565b005b34801561089757600080fd5b506108a06115cf565b6040516108ad9190613ab9565b60405180910390f35b3480156108c257600080fd5b506108cb6115d5565b6040516108d891906138b2565b60405180910390f35b3480156108ed57600080fd5b5061090860048036038101906109039190613ece565b6115e8565b005b34801561091657600080fd5b50610931600480360381019061092c91906139b5565b6115fa565b005b34801561093f57600080fd5b5061095a600480360381019061095591906139b5565b61160c565b005b34801561096857600080fd5b50610983600480360381019061097e9190613ad4565b61161e565b6040516109909190613fb9565b60405180910390f35b3480156109a557600080fd5b506109c060048036038101906109bb91906139b5565b611761565b005b3480156109ce57600080fd5b506109d761182a565b6040516109e49190613a23565b60405180910390f35b3480156109f957600080fd5b50610a02611854565b604051610a0f919061395d565b60405180910390f35b348015610a2457600080fd5b50610a3f6004803603810190610a3a9190614119565b6118e6565b604051610a4c91906138b2565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a779190614188565b6118fc565b604051610a899190613fb9565b60405180910390f35b348015610a9e57600080fd5b50610aa7611b08565b604051610ab49190613ab9565b60405180910390f35b610ad76004803603810190610ad291906139b5565b611b0e565b005b348015610ae557600080fd5b50610b006004803603810190610afb9190614290565b611dac565b005b348015610b0e57600080fd5b50610b296004803603810190610b249190614305565b611dc7565b005b348015610b3757600080fd5b50610b40611de0565b604051610b4d9190613ab9565b60405180910390f35b348015610b6257600080fd5b50610b6b611de6565b604051610b789190613c50565b60405180910390f35b348015610b8d57600080fd5b50610b96611dec565b604051610ba39190613ab9565b60405180910390f35b610bc66004803603810190610bc191906143e6565b611df2565b005b348015610bd457600080fd5b50610bdd611e43565b604051610bea9190613ab9565b60405180910390f35b348015610bff57600080fd5b50610c1a6004803603810190610c1591906139b5565b611e4d565b604051610c2791906144be565b60405180910390f35b348015610c3c57600080fd5b50610c45611eb7565b604051610c529190613ab9565b60405180910390f35b348015610c6757600080fd5b50610c826004803603810190610c7d91906139b5565b611ebd565b604051610c8f919061395d565b60405180910390f35b348015610ca457600080fd5b50610cbf6004803603810190610cba91906139b5565b611f5b565b005b348015610ccd57600080fd5b50610cd6611f6d565b604051610ce39190613ab9565b60405180910390f35b610d066004803603810190610d0191906144d9565b611f73565b005b348015610d1457600080fd5b50610d1d61240c565b604051610d2a9190613ab9565b60405180910390f35b348015610d3f57600080fd5b50610d5a6004803603810190610d559190614535565b612412565b604051610d6791906138b2565b60405180910390f35b348015610d7c57600080fd5b50610d856124a6565b604051610d929190613ab9565b60405180910390f35b348015610da757600080fd5b50610dc26004803603810190610dbd9190613ad4565b6124ac565b005b348015610dd057600080fd5b50610dd961252f565b005b6000610de682612563565b80610df65750610df5826125f5565b5b9050919050565b606060048054610e0c906145a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e38906145a4565b8015610e855780601f10610e5a57610100808354040283529160200191610e85565b820191906000526020600020905b815481529060010190602001808311610e6857829003601f168201915b5050505050905090565b6000610e9a8261266f565b610ed0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610f18816126ce565b610f2283836127cb565b505050565b6000610f3161290f565b6003546002540303905090565b601a6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f9457610f93336126ce565b5b610f9f848484612914565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361113a5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611144612c36565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866111709190614604565b61117a9190614675565b90508160000151819350935050509250929050565b60175481565b601660019054906101000a900460ff1681565b6111b0612c40565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516111d6906146d7565b60006040518083038185875af1925050503d8060008114611213576040519150601f19603f3d011682016040523d82523d6000602084013e611218565b606091505b505090508061125c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125390614738565b60405180910390fd5b50565b611267612c40565b601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112e3576112e2336126ce565b5b6112ee848484612cbe565b50505050565b6112fc612c40565b80600e8190555050565b600d5481565b60105481565b60008160405160200161132591906147a0565b604051602081830303815290604052805190602001209050919050565b6000600f54905090565b611354612c40565b8060148190555050565b6060600083839050905060008167ffffffffffffffff81111561138457611383613fdb565b5b6040519080825280602002602001820160405280156113bd57816020015b6113aa6137af565b8152602001906001900390816113a25790505b50905060005b828114611415576113ec8686838181106113e0576113df6147bb565b5b90506020020135611e4d565b8282815181106113ff576113fe6147bb565b5b60200260200101819052508060010190506113c3565b50809250505092915050565b60186020528060005260406000206000915090505481565b600061144482612cde565b9050919050565b611453612c40565b8060118190555050565b60196020528060005260406000206000915090505481565b60138054611482906145a4565b80601f01602080910402602001604051908101604052809291908181526020018280546114ae906145a4565b80156114fb5780601f106114d0576101008083540402835291602001916114fb565b820191906000526020600020905b8154815290600101906020018083116114de57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361156a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115c3612c40565b6115cd6000612daa565b565b60115481565b601660009054906101000a900460ff1681565b6115f0612c40565b8060158190555050565b611602612c40565b8060128190555050565b611614612c40565b80600f8190555050565b6060600080600061162e85611503565b905060008167ffffffffffffffff81111561164c5761164b613fdb565b5b60405190808252806020026020018201604052801561167a5781602001602082028036833780820191505090505b5090506116856137af565b600061168f61290f565b90505b838614611753576116a281612e70565b9150816040015161174857600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116ed57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611747578083878060010198508151811061173a576117396147bb565b5b6020026020010181815250505b5b806001019050611692565b508195505050505050919050565b611769612c40565b6000600d5490506127108261177c610f27565b61178691906147ea565b11156117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be9061486a565b60405180910390fd5b8181101561180a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611801906148d6565b60405180910390fd5b818161181691906148f6565b600d819055506118263383612e9b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054611863906145a4565b80601f016020809104026020016040519081016040528092919081815260200182805461188f906145a4565b80156118dc5780601f106118b1576101008083540402835291602001916118dc565b820191906000526020600020905b8154815290600101906020018083116118bf57829003601f168201915b5050505050905090565b60006118f3828486612eb9565b90509392505050565b6060818310611937576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611942612ed0565b905061194c61290f565b85101561195e5761195b61290f565b94505b8084111561196a578093505b600061197587611503565b905084861015611998576000868603905081811015611992578091505b5061199d565b600090505b60008167ffffffffffffffff8111156119b9576119b8613fdb565b5b6040519080825280602002602001820160405280156119e75781602001602082028036833780820191505090505b509050600082036119fe5780945050505050611b01565b6000611a0988611e4d565b905060008160400151611a1e57816000015190505b60008990505b888114158015611a345750848714155b15611af357611a4281612e70565b92508260400151611ae857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a8d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ae75780848880600101995081518110611ada57611ad96147bb565b5b6020026020010181815250505b5b806001019050611a24565b508583528296505050505050505b9392505050565b600e5481565b601660019054906101000a900460ff16611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490614976565b60405180910390fd5b61271081611b69610f27565b611b7391906147ea565b1115611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab906149e2565b60405180910390fd5b600f5481611bc29190614604565b341015611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90614a4e565b60405180910390fd5b601454811115611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090614aba565b60405180910390fd5b60105481601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9791906147ea565b1115611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614b26565b60405180910390fd5b600b54601754612710611ceb91906148f6565b611cf591906147ea565b81611cfe610f27565b611d0891906147ea565b1115611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4090614b92565b60405180910390fd5b80601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9891906147ea565b92505081905550611da93382612e9b565b50565b611db4612c40565b8060139081611dc39190614d54565b5050565b81611dd1816126ce565b611ddb8383612eda565b505050565b600f5481565b60155481565b600c5481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e3057611e2f336126ce565b5b611e3c85858585612fe5565b5050505050565b6000600e54905090565b611e556137af565b611e5d6137af565b611e6561290f565b831080611e795750611e75612ed0565b8310155b15611e875780915050611eb2565b611e9083612e70565b9050806040015115611ea55780915050611eb2565b611eae83613058565b9150505b919050565b61271081565b6060611ec88261266f565b611efe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f08613078565b90506000815103611f285760405180602001604052806000815250611f53565b80611f328461310a565b604051602001611f43929190614e62565b6040516020818303038152906040525b915050919050565b611f63612c40565b8060178190555050565b600b5481565b601660009054906101000a900460ff16611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990614ed2565b60405180910390fd5b611fd7611fce33611312565b601554836118e6565b612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d90614f3e565b60405180910390fd5b61271082612022610f27565b61202c91906147ea565b111561206d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612064906149e2565b60405180910390fd5b60125482601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120bb91906147ea565b11156120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614faa565b60405180910390fd5b600b5460175461271061210f91906148f6565b61211991906147ea565b82600c5461212791906147ea565b1115612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f90614b92565b60405180910390fd5b6000601154601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054109050801561233d57601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460115461220391906148f6565b831061233857600e54601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460115461225991906148f6565b6122639190614604565b600e54846122719190614604565b61227b91906148f6565b3410156122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490614a4e565b60405180910390fd5b601154601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601154600b600082825461231791906147ea565b9250508190555082600c600082825461233091906147ea565b925050819055505b6123a7565b600e548361234b9190614604565b34101561238d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238490614a4e565b60405180910390fd5b82600c600082825461239f91906147ea565b925050819055505b82601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123f691906147ea565b925050819055506124073384612e9b565b505050565b60145481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b6124b4612c40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a9061503c565b60405180910390fd5b61252c81612daa565b50565b612537612c40565b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125be57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125ee5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061266857506126678261315a565b5b9050919050565b60008161267a61290f565b11158015612689575060025482105b80156126c7575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156127c8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161274592919061505c565b602060405180830381865afa158015612762573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612786919061509a565b6127c757806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127be9190613a23565b60405180910390fd5b5b50565b60006127d682611439565b90508073ffffffffffffffffffffffffffffffffffffffff166127f76131c4565b73ffffffffffffffffffffffffffffffffffffffff161461285a576128238161281e6131c4565b612412565b612859576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061291f82612cde565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612986576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612992846131cc565b915091506129a881876129a36131c4565b6131f3565b6129f4576129bd866129b86131c4565b612412565b6129f3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a5a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a678686866001613237565b8015612a7257600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612b4085612b1c88888761323d565b7c020000000000000000000000000000000000000000000000000000000017613265565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612bc65760006001850190506000600660008381526020019081526020016000205403612bc4576002548114612bc3578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c2e8686866001613290565b505050505050565b6000612710905090565b612c48613296565b73ffffffffffffffffffffffffffffffffffffffff16612c6661182a565b73ffffffffffffffffffffffffffffffffffffffff1614612cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb390615113565b60405180910390fd5b565b612cd983838360405180602001604052806000815250611df2565b505050565b60008082905080612ced61290f565b11612d7357600254811015612d725760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612d70575b60008103612d66576006600083600190039350838152602001908152602001600020549050612d3c565b8092505050612da5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e786137af565b612e94600660008481526020019081526020016000205461329e565b9050919050565b612eb5828260405180602001604052806000815250613354565b5050565b600082612ec685846133f2565b1490509392505050565b6000600254905090565b8060096000612ee76131c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612f946131c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fd991906138b2565b60405180910390a35050565b612ff0848484610f56565b60008373ffffffffffffffffffffffffffffffffffffffff163b146130525761301b84848484613448565b613051576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6130606137af565b61307161306c83612cde565b61329e565b9050919050565b606060138054613087906145a4565b80601f01602080910402602001604051908101604052809291908181526020018280546130b3906145a4565b80156131005780601f106130d557610100808354040283529160200191613100565b820191906000526020600020905b8154815290600101906020018083116130e357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561314557600184039350600a81066030018453600a8104905080613123575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613254868684613598565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6132a66137af565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b61335e83836135a1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146133ed5760006002549050600083820390505b61339f6000868380600101945086613448565b6133d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061338c5781600254146133ea57600080fd5b50505b505050565b60008082905060005b845181101561343d576134288286838151811061341b5761341a6147bb565b5b602002602001015161375d565b9150808061343590615133565b9150506133fb565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261346e6131c4565b8786866040518563ffffffff1660e01b815260040161349094939291906151d0565b6020604051808303816000875af19250505080156134cc57506040513d601f19601f820116820180604052508101906134c99190615231565b60015b613545573d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b50600081510361353d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006002549050600082036135e2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ef6000848385613237565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061366683613657600086600061323d565b61366085613788565b17613265565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461370757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506136cc565b5060008203613742576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060028190555050506137586000848385613290565b505050565b6000818310613775576137708284613798565b613780565b61377f8383613798565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61384781613812565b811461385257600080fd5b50565b6000813590506138648161383e565b92915050565b6000602082840312156138805761387f613808565b5b600061388e84828501613855565b91505092915050565b60008115159050919050565b6138ac81613897565b82525050565b60006020820190506138c760008301846138a3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139075780820151818401526020810190506138ec565b60008484015250505050565b6000601f19601f8301169050919050565b600061392f826138cd565b61393981856138d8565b93506139498185602086016138e9565b61395281613913565b840191505092915050565b600060208201905081810360008301526139778184613924565b905092915050565b6000819050919050565b6139928161397f565b811461399d57600080fd5b50565b6000813590506139af81613989565b92915050565b6000602082840312156139cb576139ca613808565b5b60006139d9848285016139a0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a0d826139e2565b9050919050565b613a1d81613a02565b82525050565b6000602082019050613a386000830184613a14565b92915050565b613a4781613a02565b8114613a5257600080fd5b50565b600081359050613a6481613a3e565b92915050565b60008060408385031215613a8157613a80613808565b5b6000613a8f85828601613a55565b9250506020613aa0858286016139a0565b9150509250929050565b613ab38161397f565b82525050565b6000602082019050613ace6000830184613aaa565b92915050565b600060208284031215613aea57613ae9613808565b5b6000613af884828501613a55565b91505092915050565b600080600060608486031215613b1a57613b19613808565b5b6000613b2886828701613a55565b9350506020613b3986828701613a55565b9250506040613b4a868287016139a0565b9150509250925092565b60008060408385031215613b6b57613b6a613808565b5b6000613b79858286016139a0565b9250506020613b8a858286016139a0565b9150509250929050565b6000604082019050613ba96000830185613a14565b613bb66020830184613aaa565b9392505050565b6000819050919050565b6000613be2613bdd613bd8846139e2565b613bbd565b6139e2565b9050919050565b6000613bf482613bc7565b9050919050565b6000613c0682613be9565b9050919050565b613c1681613bfb565b82525050565b6000602082019050613c316000830184613c0d565b92915050565b6000819050919050565b613c4a81613c37565b82525050565b6000602082019050613c656000830184613c41565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c9057613c8f613c6b565b5b8235905067ffffffffffffffff811115613cad57613cac613c70565b5b602083019150836020820283011115613cc957613cc8613c75565b5b9250929050565b60008060208385031215613ce757613ce6613808565b5b600083013567ffffffffffffffff811115613d0557613d0461380d565b5b613d1185828601613c7a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d5281613a02565b82525050565b600067ffffffffffffffff82169050919050565b613d7581613d58565b82525050565b613d8481613897565b82525050565b600062ffffff82169050919050565b613da281613d8a565b82525050565b608082016000820151613dbe6000850182613d49565b506020820151613dd16020850182613d6c565b506040820151613de46040850182613d7b565b506060820151613df76060850182613d99565b50505050565b6000613e098383613da8565b60808301905092915050565b6000602082019050919050565b6000613e2d82613d1d565b613e378185613d28565b9350613e4283613d39565b8060005b83811015613e73578151613e5a8882613dfd565b9750613e6583613e15565b925050600181019050613e46565b5085935050505092915050565b60006020820190508181036000830152613e9a8184613e22565b905092915050565b613eab81613c37565b8114613eb657600080fd5b50565b600081359050613ec881613ea2565b92915050565b600060208284031215613ee457613ee3613808565b5b6000613ef284828501613eb9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f308161397f565b82525050565b6000613f428383613f27565b60208301905092915050565b6000602082019050919050565b6000613f6682613efb565b613f708185613f06565b9350613f7b83613f17565b8060005b83811015613fac578151613f938882613f36565b9750613f9e83613f4e565b925050600181019050613f7f565b5085935050505092915050565b60006020820190508181036000830152613fd38184613f5b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61401382613913565b810181811067ffffffffffffffff8211171561403257614031613fdb565b5b80604052505050565b60006140456137fe565b9050614051828261400a565b919050565b600067ffffffffffffffff82111561407157614070613fdb565b5b602082029050602081019050919050565b600061409561409084614056565b61403b565b905080838252602082019050602084028301858111156140b8576140b7613c75565b5b835b818110156140e157806140cd8882613eb9565b8452602084019350506020810190506140ba565b5050509392505050565b600082601f830112614100576140ff613c6b565b5b8135614110848260208601614082565b91505092915050565b60008060006060848603121561413257614131613808565b5b600061414086828701613eb9565b935050602061415186828701613eb9565b925050604084013567ffffffffffffffff8111156141725761417161380d565b5b61417e868287016140eb565b9150509250925092565b6000806000606084860312156141a1576141a0613808565b5b60006141af86828701613a55565b93505060206141c0868287016139a0565b92505060406141d1868287016139a0565b9150509250925092565b600080fd5b600067ffffffffffffffff8211156141fb576141fa613fdb565b5b61420482613913565b9050602081019050919050565b82818337600083830152505050565b600061423361422e846141e0565b61403b565b90508281526020810184848401111561424f5761424e6141db565b5b61425a848285614211565b509392505050565b600082601f83011261427757614276613c6b565b5b8135614287848260208601614220565b91505092915050565b6000602082840312156142a6576142a5613808565b5b600082013567ffffffffffffffff8111156142c4576142c361380d565b5b6142d084828501614262565b91505092915050565b6142e281613897565b81146142ed57600080fd5b50565b6000813590506142ff816142d9565b92915050565b6000806040838503121561431c5761431b613808565b5b600061432a85828601613a55565b925050602061433b858286016142f0565b9150509250929050565b600067ffffffffffffffff8211156143605761435f613fdb565b5b61436982613913565b9050602081019050919050565b600061438961438484614345565b61403b565b9050828152602081018484840111156143a5576143a46141db565b5b6143b0848285614211565b509392505050565b600082601f8301126143cd576143cc613c6b565b5b81356143dd848260208601614376565b91505092915050565b60008060008060808587031215614400576143ff613808565b5b600061440e87828801613a55565b945050602061441f87828801613a55565b9350506040614430878288016139a0565b925050606085013567ffffffffffffffff8111156144515761445061380d565b5b61445d878288016143b8565b91505092959194509250565b60808201600082015161447f6000850182613d49565b5060208201516144926020850182613d6c565b5060408201516144a56040850182613d7b565b5060608201516144b86060850182613d99565b50505050565b60006080820190506144d36000830184614469565b92915050565b600080604083850312156144f0576144ef613808565b5b60006144fe858286016139a0565b925050602083013567ffffffffffffffff81111561451f5761451e61380d565b5b61452b858286016140eb565b9150509250929050565b6000806040838503121561454c5761454b613808565b5b600061455a85828601613a55565b925050602061456b85828601613a55565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145bc57607f821691505b6020821081036145cf576145ce614575565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061460f8261397f565b915061461a8361397f565b92508282026146288161397f565b9150828204841483151761463f5761463e6145d5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146808261397f565b915061468b8361397f565b92508261469b5761469a614646565b5b828204905092915050565b600081905092915050565b50565b60006146c16000836146a6565b91506146cc826146b1565b600082019050919050565b60006146e2826146b4565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006147226010836138d8565b915061472d826146ec565b602082019050919050565b6000602082019050818103600083015261475181614715565b9050919050565b60008160601b9050919050565b600061477082614758565b9050919050565b600061478282614765565b9050919050565b61479a61479582613a02565b614777565b82525050565b60006147ac8284614789565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006147f58261397f565b91506148008361397f565b9250828201905080821115614818576148176145d5565b5b92915050565b7f4e6f206d6f726520737570706c7920746f206265206d696e7465640000000000600082015250565b6000614854601b836138d8565b915061485f8261481e565b602082019050919050565b6000602082019050818103600083015261488381614847565b9050919050565b7f526573657276656420537570706c79204d696e74656400000000000000000000600082015250565b60006148c06016836138d8565b91506148cb8261488a565b602082019050919050565b600060208201905081810360008301526148ef816148b3565b9050919050565b60006149018261397f565b915061490c8361397f565b9250828203905081811115614924576149236145d5565b5b92915050565b7f5075626c6963204e6f7420416374697665205965740000000000000000000000600082015250565b60006149606015836138d8565b915061496b8261492a565b602082019050919050565b6000602082019050818103600083015261498f81614953565b9050919050565b7f536f6c64204f7574210000000000000000000000000000000000000000000000600082015250565b60006149cc6009836138d8565b91506149d782614996565b602082019050919050565b600060208201905081810360008301526149fb816149bf565b9050919050565b7f506c656173652073656e6420656e6f7567682045544800000000000000000000600082015250565b6000614a386016836138d8565b9150614a4382614a02565b602082019050919050565b60006020820190508181036000830152614a6781614a2b565b9050919050565b7f4d617820706572207472616e73616374696f6e20657863656564656400000000600082015250565b6000614aa4601c836138d8565b9150614aaf82614a6e565b602082019050919050565b60006020820190508181036000830152614ad381614a97565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564000000000000000000600082015250565b6000614b106017836138d8565b9150614b1b82614ada565b602082019050919050565b60006020820190508181036000830152614b3f81614b03565b9050919050565b7f4f6e6c792047756172616e74656564204672656520537570706c79204c656674600082015250565b6000614b7c6020836138d8565b9150614b8782614b46565b602082019050919050565b60006020820190508181036000830152614bab81614b6f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614bd7565b614c1e8683614bd7565b95508019841693508086168417925050509392505050565b6000614c51614c4c614c478461397f565b613bbd565b61397f565b9050919050565b6000819050919050565b614c6b83614c36565b614c7f614c7782614c58565b848454614be4565b825550505050565b600090565b614c94614c87565b614c9f818484614c62565b505050565b5b81811015614cc357614cb8600082614c8c565b600181019050614ca5565b5050565b601f821115614d0857614cd981614bb2565b614ce284614bc7565b81016020851015614cf1578190505b614d05614cfd85614bc7565b830182614ca4565b50505b505050565b600082821c905092915050565b6000614d2b60001984600802614d0d565b1980831691505092915050565b6000614d448383614d1a565b9150826002028217905092915050565b614d5d826138cd565b67ffffffffffffffff811115614d7657614d75613fdb565b5b614d8082546145a4565b614d8b828285614cc7565b600060209050601f831160018114614dbe5760008415614dac578287015190505b614db68582614d38565b865550614e1e565b601f198416614dcc86614bb2565b60005b82811015614df457848901518255600182019150602085019450602081019050614dcf565b86831015614e115784890151614e0d601f891682614d1a565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000614e3c826138cd565b614e468185614e26565b9350614e568185602086016138e9565b80840191505092915050565b6000614e6e8285614e31565b9150614e7a8284614e31565b91508190509392505050565b7f50726573616c65204e6f74204163746976652059657400000000000000000000600082015250565b6000614ebc6016836138d8565b9150614ec782614e86565b602082019050919050565b60006020820190508181036000830152614eeb81614eaf565b9050919050565b7f57616c6c6574206e6f742077686974656c697374656400000000000000000000600082015250565b6000614f286016836138d8565b9150614f3382614ef2565b602082019050919050565b60006020820190508181036000830152614f5781614f1b565b9050919050565b7f4d61782050726573616c6520416c6c6f636174696f6e20726561636865640000600082015250565b6000614f94601e836138d8565b9150614f9f82614f5e565b602082019050919050565b60006020820190508181036000830152614fc381614f87565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006150266026836138d8565b915061503182614fca565b604082019050919050565b6000602082019050818103600083015261505581615019565b9050919050565b60006040820190506150716000830185613a14565b61507e6020830184613a14565b9392505050565b600081519050615094816142d9565b92915050565b6000602082840312156150b0576150af613808565b5b60006150be84828501615085565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150fd6020836138d8565b9150615108826150c7565b602082019050919050565b6000602082019050818103600083015261512c816150f0565b9050919050565b600061513e8261397f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151705761516f6145d5565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60006151a28261517b565b6151ac8185615186565b93506151bc8185602086016138e9565b6151c581613913565b840191505092915050565b60006080820190506151e56000830187613a14565b6151f26020830186613a14565b6151ff6040830185613aaa565b81810360608301526152118184615197565b905095945050505050565b60008151905061522b8161383e565b92915050565b60006020828403121561524757615246613808565b5b60006152558482850161521c565b9150509291505056fea26469706673582212206388d7982754eb41a5e66c297b17a5b3e0828ee0376471d50df0a394475d988364736f6c63430008130033
Deployed Bytecode
0x60806040526004361061038c5760003560e01c80637bf65c12116101dc578063aa98e0c611610102578063cb17e215116100a0578063e985e9c51161006f578063e985e9c514610d33578063ee64aefb14610d70578063f2fde38b14610d9b578063f809efe814610dc45761038c565b8063cb17e21514610c98578063dad7b5c914610cc1578063e3e1e8ef14610cec578063e6ac8eb514610d085761038c565b8063b9411601116100dc578063b941160114610bc8578063c23dc68f14610bf3578063c50497ae14610c30578063c87b56dd14610c5b5761038c565b8063aa98e0c614610b56578063abccc31e14610b81578063b88d4fde14610bac5761038c565b806395d89b411161017a578063a0712d6811610149578063a0712d6814610abd578063a0bcfc7f14610ad9578063a22cb46514610b02578063a945bf8014610b2b5761038c565b806395d89b41146109ed57806397731e4e14610a1857806399a2557a14610a55578063a035b1fe14610a925761038c565b8063811d2437116101b6578063811d2437146109335780638462151c1461095c5780638c74bf0e146109995780638da5cb5b146109c25761038c565b80637bf65c12146108b65780637cb64759146108e15780637f8448a91461090a5761038c565b806344a0d68a116102c15780635db7480e1161025f5780636c0360eb1161022e5780636c0360eb1461080c57806370a0823114610837578063715018a614610874578063726797271461088b5761038c565b80635db7480e1461072c5780636352211e1461076957806368785e11146107a657806369296ca0146107cf5761038c565b806349912e8d1161029b57806349912e8d1461065e5780634a75d0ec1461069b57806350c14952146106c65780635bbb2177146106ef5761038c565b806344a0d68a146105df57806344d19d2b14610608578063453c2310146106335761038c565b80632a55205a1161032e5780633ccfd60b116103085780633ccfd60b1461056a5780633e11ab3f1461058157806341f434341461059857806342842e0e146105c35761038c565b80632a55205a146104d65780632d393fb6146105145780633432123d1461053f5761038c565b8063095ea7b31161036a578063095ea7b31461043657806318160ddd146104525780631da4f08b1461047d57806323b872dd146104ba5761038c565b806301ffc9a71461039157806306fdde03146103ce578063081812fc146103f9575b600080fd5b34801561039d57600080fd5b506103b860048036038101906103b3919061386a565b610ddb565b6040516103c591906138b2565b60405180910390f35b3480156103da57600080fd5b506103e3610dfd565b6040516103f0919061395d565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b91906139b5565b610e8f565b60405161042d9190613a23565b60405180910390f35b610450600480360381019061044b9190613a6a565b610f0e565b005b34801561045e57600080fd5b50610467610f27565b6040516104749190613ab9565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f9190613ad4565b610f3e565b6040516104b19190613ab9565b60405180910390f35b6104d460048036038101906104cf9190613b01565b610f56565b005b3480156104e257600080fd5b506104fd60048036038101906104f89190613b54565b610fa5565b60405161050b929190613b94565b60405180910390f35b34801561052057600080fd5b5061052961118f565b6040516105369190613ab9565b60405180910390f35b34801561054b57600080fd5b50610554611195565b60405161056191906138b2565b60405180910390f35b34801561057657600080fd5b5061057f6111a8565b005b34801561058d57600080fd5b5061059661125f565b005b3480156105a457600080fd5b506105ad611293565b6040516105ba9190613c1c565b60405180910390f35b6105dd60048036038101906105d89190613b01565b6112a5565b005b3480156105eb57600080fd5b50610606600480360381019061060191906139b5565b6112f4565b005b34801561061457600080fd5b5061061d611306565b60405161062a9190613ab9565b60405180910390f35b34801561063f57600080fd5b5061064861130c565b6040516106559190613ab9565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190613ad4565b611312565b6040516106929190613c50565b60405180910390f35b3480156106a757600080fd5b506106b0611342565b6040516106bd9190613ab9565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e891906139b5565b61134c565b005b3480156106fb57600080fd5b5061071660048036038101906107119190613cd0565b61135e565b6040516107239190613e80565b60405180910390f35b34801561073857600080fd5b50610753600480360381019061074e9190613ad4565b611421565b6040516107609190613ab9565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906139b5565b611439565b60405161079d9190613a23565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c891906139b5565b61144b565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613ad4565b61145d565b6040516108039190613ab9565b60405180910390f35b34801561081857600080fd5b50610821611475565b60405161082e919061395d565b60405180910390f35b34801561084357600080fd5b5061085e60048036038101906108599190613ad4565b611503565b60405161086b9190613ab9565b60405180910390f35b34801561088057600080fd5b506108896115bb565b005b34801561089757600080fd5b506108a06115cf565b6040516108ad9190613ab9565b60405180910390f35b3480156108c257600080fd5b506108cb6115d5565b6040516108d891906138b2565b60405180910390f35b3480156108ed57600080fd5b5061090860048036038101906109039190613ece565b6115e8565b005b34801561091657600080fd5b50610931600480360381019061092c91906139b5565b6115fa565b005b34801561093f57600080fd5b5061095a600480360381019061095591906139b5565b61160c565b005b34801561096857600080fd5b50610983600480360381019061097e9190613ad4565b61161e565b6040516109909190613fb9565b60405180910390f35b3480156109a557600080fd5b506109c060048036038101906109bb91906139b5565b611761565b005b3480156109ce57600080fd5b506109d761182a565b6040516109e49190613a23565b60405180910390f35b3480156109f957600080fd5b50610a02611854565b604051610a0f919061395d565b60405180910390f35b348015610a2457600080fd5b50610a3f6004803603810190610a3a9190614119565b6118e6565b604051610a4c91906138b2565b60405180910390f35b348015610a6157600080fd5b50610a7c6004803603810190610a779190614188565b6118fc565b604051610a899190613fb9565b60405180910390f35b348015610a9e57600080fd5b50610aa7611b08565b604051610ab49190613ab9565b60405180910390f35b610ad76004803603810190610ad291906139b5565b611b0e565b005b348015610ae557600080fd5b50610b006004803603810190610afb9190614290565b611dac565b005b348015610b0e57600080fd5b50610b296004803603810190610b249190614305565b611dc7565b005b348015610b3757600080fd5b50610b40611de0565b604051610b4d9190613ab9565b60405180910390f35b348015610b6257600080fd5b50610b6b611de6565b604051610b789190613c50565b60405180910390f35b348015610b8d57600080fd5b50610b96611dec565b604051610ba39190613ab9565b60405180910390f35b610bc66004803603810190610bc191906143e6565b611df2565b005b348015610bd457600080fd5b50610bdd611e43565b604051610bea9190613ab9565b60405180910390f35b348015610bff57600080fd5b50610c1a6004803603810190610c1591906139b5565b611e4d565b604051610c2791906144be565b60405180910390f35b348015610c3c57600080fd5b50610c45611eb7565b604051610c529190613ab9565b60405180910390f35b348015610c6757600080fd5b50610c826004803603810190610c7d91906139b5565b611ebd565b604051610c8f919061395d565b60405180910390f35b348015610ca457600080fd5b50610cbf6004803603810190610cba91906139b5565b611f5b565b005b348015610ccd57600080fd5b50610cd6611f6d565b604051610ce39190613ab9565b60405180910390f35b610d066004803603810190610d0191906144d9565b611f73565b005b348015610d1457600080fd5b50610d1d61240c565b604051610d2a9190613ab9565b60405180910390f35b348015610d3f57600080fd5b50610d5a6004803603810190610d559190614535565b612412565b604051610d6791906138b2565b60405180910390f35b348015610d7c57600080fd5b50610d856124a6565b604051610d929190613ab9565b60405180910390f35b348015610da757600080fd5b50610dc26004803603810190610dbd9190613ad4565b6124ac565b005b348015610dd057600080fd5b50610dd961252f565b005b6000610de682612563565b80610df65750610df5826125f5565b5b9050919050565b606060048054610e0c906145a4565b80601f0160208091040260200160405190810160405280929190818152602001828054610e38906145a4565b8015610e855780601f10610e5a57610100808354040283529160200191610e85565b820191906000526020600020905b815481529060010190602001808311610e6857829003601f168201915b5050505050905090565b6000610e9a8261266f565b610ed0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610f18816126ce565b610f2283836127cb565b505050565b6000610f3161290f565b6003546002540303905090565b601a6020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f9457610f93336126ce565b5b610f9f848484612914565b50505050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160361113a5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611144612c36565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866111709190614604565b61117a9190614675565b90508160000151819350935050509250929050565b60175481565b601660019054906101000a900460ff1681565b6111b0612c40565b60003373ffffffffffffffffffffffffffffffffffffffff16476040516111d6906146d7565b60006040518083038185875af1925050503d8060008114611213576040519150601f19603f3d011682016040523d82523d6000602084013e611218565b606091505b505090508061125c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125390614738565b60405180910390fd5b50565b611267612c40565b601660019054906101000a900460ff1615601660016101000a81548160ff021916908315150217905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112e3576112e2336126ce565b5b6112ee848484612cbe565b50505050565b6112fc612c40565b80600e8190555050565b600d5481565b60105481565b60008160405160200161132591906147a0565b604051602081830303815290604052805190602001209050919050565b6000600f54905090565b611354612c40565b8060148190555050565b6060600083839050905060008167ffffffffffffffff81111561138457611383613fdb565b5b6040519080825280602002602001820160405280156113bd57816020015b6113aa6137af565b8152602001906001900390816113a25790505b50905060005b828114611415576113ec8686838181106113e0576113df6147bb565b5b90506020020135611e4d565b8282815181106113ff576113fe6147bb565b5b60200260200101819052508060010190506113c3565b50809250505092915050565b60186020528060005260406000206000915090505481565b600061144482612cde565b9050919050565b611453612c40565b8060118190555050565b60196020528060005260406000206000915090505481565b60138054611482906145a4565b80601f01602080910402602001604051908101604052809291908181526020018280546114ae906145a4565b80156114fb5780601f106114d0576101008083540402835291602001916114fb565b820191906000526020600020905b8154815290600101906020018083116114de57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361156a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6115c3612c40565b6115cd6000612daa565b565b60115481565b601660009054906101000a900460ff1681565b6115f0612c40565b8060158190555050565b611602612c40565b8060128190555050565b611614612c40565b80600f8190555050565b6060600080600061162e85611503565b905060008167ffffffffffffffff81111561164c5761164b613fdb565b5b60405190808252806020026020018201604052801561167a5781602001602082028036833780820191505090505b5090506116856137af565b600061168f61290f565b90505b838614611753576116a281612e70565b9150816040015161174857600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116ed57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611747578083878060010198508151811061173a576117396147bb565b5b6020026020010181815250505b5b806001019050611692565b508195505050505050919050565b611769612c40565b6000600d5490506127108261177c610f27565b61178691906147ea565b11156117c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117be9061486a565b60405180910390fd5b8181101561180a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611801906148d6565b60405180910390fd5b818161181691906148f6565b600d819055506118263383612e9b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054611863906145a4565b80601f016020809104026020016040519081016040528092919081815260200182805461188f906145a4565b80156118dc5780601f106118b1576101008083540402835291602001916118dc565b820191906000526020600020905b8154815290600101906020018083116118bf57829003601f168201915b5050505050905090565b60006118f3828486612eb9565b90509392505050565b6060818310611937576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611942612ed0565b905061194c61290f565b85101561195e5761195b61290f565b94505b8084111561196a578093505b600061197587611503565b905084861015611998576000868603905081811015611992578091505b5061199d565b600090505b60008167ffffffffffffffff8111156119b9576119b8613fdb565b5b6040519080825280602002602001820160405280156119e75781602001602082028036833780820191505090505b509050600082036119fe5780945050505050611b01565b6000611a0988611e4d565b905060008160400151611a1e57816000015190505b60008990505b888114158015611a345750848714155b15611af357611a4281612e70565b92508260400151611ae857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a8d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ae75780848880600101995081518110611ada57611ad96147bb565b5b6020026020010181815250505b5b806001019050611a24565b508583528296505050505050505b9392505050565b600e5481565b601660019054906101000a900460ff16611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490614976565b60405180910390fd5b61271081611b69610f27565b611b7391906147ea565b1115611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab906149e2565b60405180910390fd5b600f5481611bc29190614604565b341015611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90614a4e565b60405180910390fd5b601454811115611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090614aba565b60405180910390fd5b60105481601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c9791906147ea565b1115611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614b26565b60405180910390fd5b600b54601754612710611ceb91906148f6565b611cf591906147ea565b81611cfe610f27565b611d0891906147ea565b1115611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4090614b92565b60405180910390fd5b80601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d9891906147ea565b92505081905550611da93382612e9b565b50565b611db4612c40565b8060139081611dc39190614d54565b5050565b81611dd1816126ce565b611ddb8383612eda565b505050565b600f5481565b60155481565b600c5481565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e3057611e2f336126ce565b5b611e3c85858585612fe5565b5050505050565b6000600e54905090565b611e556137af565b611e5d6137af565b611e6561290f565b831080611e795750611e75612ed0565b8310155b15611e875780915050611eb2565b611e9083612e70565b9050806040015115611ea55780915050611eb2565b611eae83613058565b9150505b919050565b61271081565b6060611ec88261266f565b611efe576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611f08613078565b90506000815103611f285760405180602001604052806000815250611f53565b80611f328461310a565b604051602001611f43929190614e62565b6040516020818303038152906040525b915050919050565b611f63612c40565b8060178190555050565b600b5481565b601660009054906101000a900460ff16611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990614ed2565b60405180910390fd5b611fd7611fce33611312565b601554836118e6565b612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d90614f3e565b60405180910390fd5b61271082612022610f27565b61202c91906147ea565b111561206d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612064906149e2565b60405180910390fd5b60125482601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120bb91906147ea565b11156120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614faa565b60405180910390fd5b600b5460175461271061210f91906148f6565b61211991906147ea565b82600c5461212791906147ea565b1115612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f90614b92565b60405180910390fd5b6000601154601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054109050801561233d57601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460115461220391906148f6565b831061233857600e54601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460115461225991906148f6565b6122639190614604565b600e54846122719190614604565b61227b91906148f6565b3410156122bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b490614a4e565b60405180910390fd5b601154601960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601154600b600082825461231791906147ea565b9250508190555082600c600082825461233091906147ea565b925050819055505b6123a7565b600e548361234b9190614604565b34101561238d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238490614a4e565b60405180910390fd5b82600c600082825461239f91906147ea565b925050819055505b82601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123f691906147ea565b925050819055506124073384612e9b565b505050565b60145481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60125481565b6124b4612c40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a9061503c565b60405180910390fd5b61252c81612daa565b50565b612537612c40565b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125be57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125ee5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061266857506126678261315a565b5b9050919050565b60008161267a61290f565b11158015612689575060025482105b80156126c7575060007c0100000000000000000000000000000000000000000000000000000000600660008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156127c8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161274592919061505c565b602060405180830381865afa158015612762573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612786919061509a565b6127c757806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127be9190613a23565b60405180910390fd5b5b50565b60006127d682611439565b90508073ffffffffffffffffffffffffffffffffffffffff166127f76131c4565b73ffffffffffffffffffffffffffffffffffffffff161461285a576128238161281e6131c4565b612412565b612859576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826008600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061291f82612cde565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612986576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080612992846131cc565b915091506129a881876129a36131c4565b6131f3565b6129f4576129bd866129b86131c4565b612412565b6129f3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a5a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a678686866001613237565b8015612a7257600082555b600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612b4085612b1c88888761323d565b7c020000000000000000000000000000000000000000000000000000000017613265565b600660008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612bc65760006001850190506000600660008381526020019081526020016000205403612bc4576002548114612bc3578360066000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c2e8686866001613290565b505050505050565b6000612710905090565b612c48613296565b73ffffffffffffffffffffffffffffffffffffffff16612c6661182a565b73ffffffffffffffffffffffffffffffffffffffff1614612cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb390615113565b60405180910390fd5b565b612cd983838360405180602001604052806000815250611df2565b505050565b60008082905080612ced61290f565b11612d7357600254811015612d725760006006600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612d70575b60008103612d66576006600083600190039350838152602001908152602001600020549050612d3c565b8092505050612da5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612e786137af565b612e94600660008481526020019081526020016000205461329e565b9050919050565b612eb5828260405180602001604052806000815250613354565b5050565b600082612ec685846133f2565b1490509392505050565b6000600254905090565b8060096000612ee76131c4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612f946131c4565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612fd991906138b2565b60405180910390a35050565b612ff0848484610f56565b60008373ffffffffffffffffffffffffffffffffffffffff163b146130525761301b84848484613448565b613051576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6130606137af565b61307161306c83612cde565b61329e565b9050919050565b606060138054613087906145a4565b80601f01602080910402602001604051908101604052809291908181526020018280546130b3906145a4565b80156131005780601f106130d557610100808354040283529160200191613100565b820191906000526020600020905b8154815290600101906020018083116130e357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561314557600184039350600a81066030018453600a8104905080613123575b50828103602084039350808452505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008060006008600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613254868684613598565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6132a66137af565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b61335e83836135a1565b60008373ffffffffffffffffffffffffffffffffffffffff163b146133ed5760006002549050600083820390505b61339f6000868380600101945086613448565b6133d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061338c5781600254146133ea57600080fd5b50505b505050565b60008082905060005b845181101561343d576134288286838151811061341b5761341a6147bb565b5b602002602001015161375d565b9150808061343590615133565b9150506133fb565b508091505092915050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261346e6131c4565b8786866040518563ffffffff1660e01b815260040161349094939291906151d0565b6020604051808303816000875af19250505080156134cc57506040513d601f19601f820116820180604052508101906134c99190615231565b60015b613545573d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b50600081510361353d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60006002549050600082036135e2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6135ef6000848385613237565b600160406001901b178202600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061366683613657600086600061323d565b61366085613788565b17613265565b6006600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461370757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506136cc565b5060008203613742576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060028190555050506137586000848385613290565b505050565b6000818310613775576137708284613798565b613780565b61377f8383613798565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61384781613812565b811461385257600080fd5b50565b6000813590506138648161383e565b92915050565b6000602082840312156138805761387f613808565b5b600061388e84828501613855565b91505092915050565b60008115159050919050565b6138ac81613897565b82525050565b60006020820190506138c760008301846138a3565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156139075780820151818401526020810190506138ec565b60008484015250505050565b6000601f19601f8301169050919050565b600061392f826138cd565b61393981856138d8565b93506139498185602086016138e9565b61395281613913565b840191505092915050565b600060208201905081810360008301526139778184613924565b905092915050565b6000819050919050565b6139928161397f565b811461399d57600080fd5b50565b6000813590506139af81613989565b92915050565b6000602082840312156139cb576139ca613808565b5b60006139d9848285016139a0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a0d826139e2565b9050919050565b613a1d81613a02565b82525050565b6000602082019050613a386000830184613a14565b92915050565b613a4781613a02565b8114613a5257600080fd5b50565b600081359050613a6481613a3e565b92915050565b60008060408385031215613a8157613a80613808565b5b6000613a8f85828601613a55565b9250506020613aa0858286016139a0565b9150509250929050565b613ab38161397f565b82525050565b6000602082019050613ace6000830184613aaa565b92915050565b600060208284031215613aea57613ae9613808565b5b6000613af884828501613a55565b91505092915050565b600080600060608486031215613b1a57613b19613808565b5b6000613b2886828701613a55565b9350506020613b3986828701613a55565b9250506040613b4a868287016139a0565b9150509250925092565b60008060408385031215613b6b57613b6a613808565b5b6000613b79858286016139a0565b9250506020613b8a858286016139a0565b9150509250929050565b6000604082019050613ba96000830185613a14565b613bb66020830184613aaa565b9392505050565b6000819050919050565b6000613be2613bdd613bd8846139e2565b613bbd565b6139e2565b9050919050565b6000613bf482613bc7565b9050919050565b6000613c0682613be9565b9050919050565b613c1681613bfb565b82525050565b6000602082019050613c316000830184613c0d565b92915050565b6000819050919050565b613c4a81613c37565b82525050565b6000602082019050613c656000830184613c41565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c9057613c8f613c6b565b5b8235905067ffffffffffffffff811115613cad57613cac613c70565b5b602083019150836020820283011115613cc957613cc8613c75565b5b9250929050565b60008060208385031215613ce757613ce6613808565b5b600083013567ffffffffffffffff811115613d0557613d0461380d565b5b613d1185828601613c7a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d5281613a02565b82525050565b600067ffffffffffffffff82169050919050565b613d7581613d58565b82525050565b613d8481613897565b82525050565b600062ffffff82169050919050565b613da281613d8a565b82525050565b608082016000820151613dbe6000850182613d49565b506020820151613dd16020850182613d6c565b506040820151613de46040850182613d7b565b506060820151613df76060850182613d99565b50505050565b6000613e098383613da8565b60808301905092915050565b6000602082019050919050565b6000613e2d82613d1d565b613e378185613d28565b9350613e4283613d39565b8060005b83811015613e73578151613e5a8882613dfd565b9750613e6583613e15565b925050600181019050613e46565b5085935050505092915050565b60006020820190508181036000830152613e9a8184613e22565b905092915050565b613eab81613c37565b8114613eb657600080fd5b50565b600081359050613ec881613ea2565b92915050565b600060208284031215613ee457613ee3613808565b5b6000613ef284828501613eb9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f308161397f565b82525050565b6000613f428383613f27565b60208301905092915050565b6000602082019050919050565b6000613f6682613efb565b613f708185613f06565b9350613f7b83613f17565b8060005b83811015613fac578151613f938882613f36565b9750613f9e83613f4e565b925050600181019050613f7f565b5085935050505092915050565b60006020820190508181036000830152613fd38184613f5b565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61401382613913565b810181811067ffffffffffffffff8211171561403257614031613fdb565b5b80604052505050565b60006140456137fe565b9050614051828261400a565b919050565b600067ffffffffffffffff82111561407157614070613fdb565b5b602082029050602081019050919050565b600061409561409084614056565b61403b565b905080838252602082019050602084028301858111156140b8576140b7613c75565b5b835b818110156140e157806140cd8882613eb9565b8452602084019350506020810190506140ba565b5050509392505050565b600082601f830112614100576140ff613c6b565b5b8135614110848260208601614082565b91505092915050565b60008060006060848603121561413257614131613808565b5b600061414086828701613eb9565b935050602061415186828701613eb9565b925050604084013567ffffffffffffffff8111156141725761417161380d565b5b61417e868287016140eb565b9150509250925092565b6000806000606084860312156141a1576141a0613808565b5b60006141af86828701613a55565b93505060206141c0868287016139a0565b92505060406141d1868287016139a0565b9150509250925092565b600080fd5b600067ffffffffffffffff8211156141fb576141fa613fdb565b5b61420482613913565b9050602081019050919050565b82818337600083830152505050565b600061423361422e846141e0565b61403b565b90508281526020810184848401111561424f5761424e6141db565b5b61425a848285614211565b509392505050565b600082601f83011261427757614276613c6b565b5b8135614287848260208601614220565b91505092915050565b6000602082840312156142a6576142a5613808565b5b600082013567ffffffffffffffff8111156142c4576142c361380d565b5b6142d084828501614262565b91505092915050565b6142e281613897565b81146142ed57600080fd5b50565b6000813590506142ff816142d9565b92915050565b6000806040838503121561431c5761431b613808565b5b600061432a85828601613a55565b925050602061433b858286016142f0565b9150509250929050565b600067ffffffffffffffff8211156143605761435f613fdb565b5b61436982613913565b9050602081019050919050565b600061438961438484614345565b61403b565b9050828152602081018484840111156143a5576143a46141db565b5b6143b0848285614211565b509392505050565b600082601f8301126143cd576143cc613c6b565b5b81356143dd848260208601614376565b91505092915050565b60008060008060808587031215614400576143ff613808565b5b600061440e87828801613a55565b945050602061441f87828801613a55565b9350506040614430878288016139a0565b925050606085013567ffffffffffffffff8111156144515761445061380d565b5b61445d878288016143b8565b91505092959194509250565b60808201600082015161447f6000850182613d49565b5060208201516144926020850182613d6c565b5060408201516144a56040850182613d7b565b5060608201516144b86060850182613d99565b50505050565b60006080820190506144d36000830184614469565b92915050565b600080604083850312156144f0576144ef613808565b5b60006144fe858286016139a0565b925050602083013567ffffffffffffffff81111561451f5761451e61380d565b5b61452b858286016140eb565b9150509250929050565b6000806040838503121561454c5761454b613808565b5b600061455a85828601613a55565b925050602061456b85828601613a55565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145bc57607f821691505b6020821081036145cf576145ce614575565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061460f8261397f565b915061461a8361397f565b92508282026146288161397f565b9150828204841483151761463f5761463e6145d5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006146808261397f565b915061468b8361397f565b92508261469b5761469a614646565b5b828204905092915050565b600081905092915050565b50565b60006146c16000836146a6565b91506146cc826146b1565b600082019050919050565b60006146e2826146b4565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006147226010836138d8565b915061472d826146ec565b602082019050919050565b6000602082019050818103600083015261475181614715565b9050919050565b60008160601b9050919050565b600061477082614758565b9050919050565b600061478282614765565b9050919050565b61479a61479582613a02565b614777565b82525050565b60006147ac8284614789565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006147f58261397f565b91506148008361397f565b9250828201905080821115614818576148176145d5565b5b92915050565b7f4e6f206d6f726520737570706c7920746f206265206d696e7465640000000000600082015250565b6000614854601b836138d8565b915061485f8261481e565b602082019050919050565b6000602082019050818103600083015261488381614847565b9050919050565b7f526573657276656420537570706c79204d696e74656400000000000000000000600082015250565b60006148c06016836138d8565b91506148cb8261488a565b602082019050919050565b600060208201905081810360008301526148ef816148b3565b9050919050565b60006149018261397f565b915061490c8361397f565b9250828203905081811115614924576149236145d5565b5b92915050565b7f5075626c6963204e6f7420416374697665205965740000000000000000000000600082015250565b60006149606015836138d8565b915061496b8261492a565b602082019050919050565b6000602082019050818103600083015261498f81614953565b9050919050565b7f536f6c64204f7574210000000000000000000000000000000000000000000000600082015250565b60006149cc6009836138d8565b91506149d782614996565b602082019050919050565b600060208201905081810360008301526149fb816149bf565b9050919050565b7f506c656173652073656e6420656e6f7567682045544800000000000000000000600082015250565b6000614a386016836138d8565b9150614a4382614a02565b602082019050919050565b60006020820190508181036000830152614a6781614a2b565b9050919050565b7f4d617820706572207472616e73616374696f6e20657863656564656400000000600082015250565b6000614aa4601c836138d8565b9150614aaf82614a6e565b602082019050919050565b60006020820190508181036000830152614ad381614a97565b9050919050565b7f4d6178207065722077616c6c6574206578636565646564000000000000000000600082015250565b6000614b106017836138d8565b9150614b1b82614ada565b602082019050919050565b60006020820190508181036000830152614b3f81614b03565b9050919050565b7f4f6e6c792047756172616e74656564204672656520537570706c79204c656674600082015250565b6000614b7c6020836138d8565b9150614b8782614b46565b602082019050919050565b60006020820190508181036000830152614bab81614b6f565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614c147fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614bd7565b614c1e8683614bd7565b95508019841693508086168417925050509392505050565b6000614c51614c4c614c478461397f565b613bbd565b61397f565b9050919050565b6000819050919050565b614c6b83614c36565b614c7f614c7782614c58565b848454614be4565b825550505050565b600090565b614c94614c87565b614c9f818484614c62565b505050565b5b81811015614cc357614cb8600082614c8c565b600181019050614ca5565b5050565b601f821115614d0857614cd981614bb2565b614ce284614bc7565b81016020851015614cf1578190505b614d05614cfd85614bc7565b830182614ca4565b50505b505050565b600082821c905092915050565b6000614d2b60001984600802614d0d565b1980831691505092915050565b6000614d448383614d1a565b9150826002028217905092915050565b614d5d826138cd565b67ffffffffffffffff811115614d7657614d75613fdb565b5b614d8082546145a4565b614d8b828285614cc7565b600060209050601f831160018114614dbe5760008415614dac578287015190505b614db68582614d38565b865550614e1e565b601f198416614dcc86614bb2565b60005b82811015614df457848901518255600182019150602085019450602081019050614dcf565b86831015614e115784890151614e0d601f891682614d1a565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b6000614e3c826138cd565b614e468185614e26565b9350614e568185602086016138e9565b80840191505092915050565b6000614e6e8285614e31565b9150614e7a8284614e31565b91508190509392505050565b7f50726573616c65204e6f74204163746976652059657400000000000000000000600082015250565b6000614ebc6016836138d8565b9150614ec782614e86565b602082019050919050565b60006020820190508181036000830152614eeb81614eaf565b9050919050565b7f57616c6c6574206e6f742077686974656c697374656400000000000000000000600082015250565b6000614f286016836138d8565b9150614f3382614ef2565b602082019050919050565b60006020820190508181036000830152614f5781614f1b565b9050919050565b7f4d61782050726573616c6520416c6c6f636174696f6e20726561636865640000600082015250565b6000614f94601e836138d8565b9150614f9f82614f5e565b602082019050919050565b60006020820190508181036000830152614fc381614f87565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006150266026836138d8565b915061503182614fca565b604082019050919050565b6000602082019050818103600083015261505581615019565b9050919050565b60006040820190506150716000830185613a14565b61507e6020830184613a14565b9392505050565b600081519050615094816142d9565b92915050565b6000602082840312156150b0576150af613808565b5b60006150be84828501615085565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150fd6020836138d8565b9150615108826150c7565b602082019050919050565b6000602082019050818103600083015261512c816150f0565b9050919050565b600061513e8261397f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151705761516f6145d5565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b60006151a28261517b565b6151ac8185615186565b93506151bc8185602086016138e9565b6151c581613913565b840191505092915050565b60006080820190506151e56000830187613a14565b6151f26020830186613a14565b6151ff6040830185613aaa565b81810360608301526152118184615197565b905095945050505050565b60008151905061522b8161383e565b92915050565b60006020828403121561524757615246613808565b5b60006152558482850161521c565b9150509291505056fea26469706673582212206388d7982754eb41a5e66c297b17a5b3e0828ee0376471d50df0a394475d988364736f6c63430008130033
Deployed Bytecode Sourcemap
90629:6087:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96494:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41466:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47957:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95676:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37217:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91422:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95860:184;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17361:438;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;91283:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91250:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92012:173;;;;;;;;;;;;;:::i;:::-;;91528:99;;;;;;;;;;;;;:::i;:::-;;87349:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96050:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92387:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90832:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90979:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95072:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92792:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91908:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75113:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91316:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42859:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91726:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91369:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91080:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38401:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12426:103;;;;;;;;;;;;;:::i;:::-;;91015:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91221:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92285:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91818:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92480:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78989:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92895:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11785:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41642:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95196:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76029:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90871:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94446:620;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92192:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95463:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90922:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91182:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90796:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96248:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92700:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74526:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90715:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41852:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92597:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;90758:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93265:1175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91106:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48906:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91048:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12684:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91633:87;;;;;;;;;;;;;:::i;:::-;;96494:219;96607:4;96627:38;96653:11;96627:25;:38::i;:::-;:80;;;;96669:38;96695:11;96669:25;:38::i;:::-;96627:80;96620:87;;96494:219;;;:::o;41466:100::-;41520:13;41553:5;41546:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41466:100;:::o;47957:218::-;48033:7;48058:16;48066:7;48058;:16::i;:::-;48053:64;;48083:34;;;;;;;;;;;;;;48053:64;48137:15;:24;48153:7;48137:24;;;;;;;;;;;:30;;;;;;;;;;;;48130:37;;47957:218;;;:::o;95676:178::-;95799:8;89131:30;89152:8;89131:20;:30::i;:::-;95816:32:::1;95830:8;95840:7;95816:13;:32::i;:::-;95676:178:::0;;;:::o;37217:323::-;37278:7;37506:15;:13;:15::i;:::-;37491:12;;37475:13;;:28;:46;37468:53;;37217:323;:::o;91422:48::-;;;;;;;;;;;;;;;;;:::o;95860:184::-;95988:4;88865:10;88857:18;;:4;:18;;;88853:83;;88892:32;88913:10;88892:20;:32::i;:::-;88853:83;96001:37:::1;96020:4;96026:2;96030:7;96001:18;:37::i;:::-;95860:184:::0;;;;:::o;17361:438::-;17456:7;17465;17485:26;17514:17;:26;17532:7;17514:26;;;;;;;;;;;17485:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17585:1;17557:30;;:7;:16;;;:30;;;17553:92;;17614:19;17604:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17553:92;17657:21;17721:17;:15;:17::i;:::-;17681:57;;17694:7;:23;;;17682:35;;:9;:35;;;;:::i;:::-;17681:57;;;;:::i;:::-;17657:81;;17759:7;:16;;;17777:13;17751:40;;;;;;17361:438;;;;;:::o;91283:26::-;;;;:::o;91250:28::-;;;;;;;;;;;;;:::o;92012:173::-;11671:13;:11;:13::i;:::-;92063:12:::1;92081:10;:15;;92104:21;92081:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92062:68;;;92149:7;92141:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;92051:134;92012:173::o:0;91528:99::-;11671:13;:11;:13::i;:::-;91605:16:::1;;;;;;;;;;;91604:17;91585:16;;:36;;;;;;;;;;;;;;;;;;91528:99::o:0;87349:143::-;86245:42;87349:143;:::o;96050:192::-;96182:4;88865:10;88857:18;;:4;:18;;;88853:83;;88892:32;88913:10;88892:20;:32::i;:::-;88853:83;96195:41:::1;96218:4;96224:2;96228:7;96195:22;:41::i;:::-;96050:192:::0;;;;:::o;92387:85::-;11671:13;:11;:13::i;:::-;92458:6:::1;92450:5;:14;;;;92387:85:::0;:::o;90832:34::-;;;;:::o;90979:31::-;;;;:::o;95072:118::-;95125:7;95175;95158:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;95148:36;;;;;;95141:43;;95072:118;;;:::o;92792:96::-;92842:7;92869:11;;92862:18;;92792:96;:::o;91908:98::-;11671:13;:11;:13::i;:::-;91995:5:::1;91977:15;:23;;;;91908:98:::0;:::o;75113:528::-;75257:23;75323:22;75348:8;;:15;;75323:40;;75378:34;75436:14;75415:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;75378:73;;75471:9;75466:125;75487:14;75482:1;:19;75466:125;;75543:32;75563:8;;75572:1;75563:11;;;;;;;:::i;:::-;;;;;;;;75543:19;:32::i;:::-;75527:10;75538:1;75527:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;75503:3;;;;;75466:125;;;;75612:10;75605:17;;;;75113:528;;;;:::o;91316:46::-;;;;;;;;;;;;;;;;;:::o;42859:152::-;42931:7;42974:27;42993:7;42974:18;:27::i;:::-;42951:52;;42859:152;;;:::o;91726:86::-;11671:13;:11;:13::i;:::-;91801:5:::1;91789:9;:17;;;;91726:86:::0;:::o;91369:46::-;;;;;;;;;;;;;;;;;:::o;91080:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38401:233::-;38473:7;38514:1;38497:19;;:5;:19;;;38493:60;;38525:28;;;;;;;;;;;;;;38493:60;32560:13;38571:18;:25;38590:5;38571:25;;;;;;;;;;;;;;;;:55;38564:62;;38401:233;;;:::o;12426:103::-;11671:13;:11;:13::i;:::-;12491:30:::1;12518:1;12491:18;:30::i;:::-;12426:103::o:0;91015:28::-;;;;:::o;91221:24::-;;;;;;;;;;;;;:::o;92285:95::-;11671:13;:11;:13::i;:::-;92370:4:::1;92348:19;:26;;;;92285:95:::0;:::o;91818:84::-;11671:13;:11;:13::i;:::-;91891:5:::1;91880:8;:16;;;;91818:84:::0;:::o;92480:109::-;11671:13;:11;:13::i;:::-;92569:12:::1;92555:11;:26;;;;92480:109:::0;:::o;78989:900::-;79067:16;79121:19;79155:25;79195:22;79220:16;79230:5;79220:9;:16::i;:::-;79195:41;;79251:25;79293:14;79279:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79251:57;;79323:31;;:::i;:::-;79374:9;79386:15;:13;:15::i;:::-;79374:27;;79369:472;79418:14;79403:11;:29;79369:472;;79470:15;79483:1;79470:12;:15::i;:::-;79458:27;;79508:9;:16;;;79549:8;79504:73;79625:1;79599:28;;:9;:14;;;:28;;;79595:111;;79672:9;:14;;;79652:34;;79595:111;79749:5;79728:26;;:17;:26;;;79724:102;;79805:1;79779:8;79788:13;;;;;;79779:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;79724:102;79369:472;79434:3;;;;;79369:472;;;;79862:8;79855:15;;;;;;;78989:900;;;:::o;92895:361::-;11671:13;:11;:13::i;:::-;92967:17:::1;92987:14;;92967:34;;90748:5;93038;93022:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:31;;93014:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;93117:5;93104:9;:18;;93096:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;93195:5;93183:9;:17;;;;:::i;:::-;93166:14;:34;;;;93211:28;93221:10;93233:5;93211:9;:28::i;:::-;92956:300;92895:361:::0;:::o;11785:87::-;11831:7;11858:6;;;;;;;;;;;11851:13;;11785:87;:::o;41642:104::-;41698:13;41731:7;41724:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41642:104;:::o;95196:153::-;95286:4;95306:37;95325:5;95332:4;95338;95306:18;:37::i;:::-;95299:44;;95196:153;;;;;:::o;76029:2513::-;76172:16;76239:4;76230:5;:13;76226:45;;76252:19;;;;;;;;;;;;;;76226:45;76286:19;76320:17;76340:14;:12;:14::i;:::-;76320:34;;76440:15;:13;:15::i;:::-;76432:5;:23;76428:87;;;76484:15;:13;:15::i;:::-;76476:23;;76428:87;76591:9;76584:4;:16;76580:73;;;76628:9;76621:16;;76580:73;76667:25;76695:16;76705:5;76695:9;:16::i;:::-;76667:44;;76889:4;76881:5;:12;76877:278;;;76914:19;76943:5;76936:4;:12;76914:34;;76985:17;76971:11;:31;76967:111;;;77047:11;77027:31;;76967:111;76895:198;76877:278;;;77138:1;77118:21;;76877:278;77169:25;77211:17;77197:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77169:60;;77269:1;77248:17;:22;77244:78;;77298:8;77291:15;;;;;;;;77244:78;77466:31;77500:26;77520:5;77500:19;:26::i;:::-;77466:60;;77541:25;77786:9;:16;;;77781:92;;77843:9;:14;;;77823:34;;77781:92;77892:9;77904:5;77892:17;;77887:478;77916:4;77911:1;:9;;:45;;;;;77939:17;77924:11;:32;;77911:45;77887:478;;;77994:15;78007:1;77994:12;:15::i;:::-;77982:27;;78032:9;:16;;;78073:8;78028:73;78149:1;78123:28;;:9;:14;;;:28;;;78119:111;;78196:9;:14;;;78176:34;;78119:111;78273:5;78252:26;;:17;:26;;;78248:102;;78329:1;78303:8;78312:13;;;;;;78303:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;78248:102;77887:478;77958:3;;;;;77887:478;;;;78467:11;78457:8;78450:29;78515:8;78508:15;;;;;;;;76029:2513;;;;;;:::o;90871:46::-;;;;:::o;94446:620::-;94507:16;;;;;;;;;;;94499:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;90748:5;94582;94566:13;:11;:13::i;:::-;:21;;;;:::i;:::-;94565:33;;94556:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;94649:11;;94641:5;:19;;;;:::i;:::-;94628:9;:32;;94620:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;94713:15;;94704:5;:24;;94694:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;94818:12;;94808:5;94780:13;:25;94794:10;94780:25;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;94779:51;;94769:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;94926:15;;94912:11;;90748:5;94903:20;;;;:::i;:::-;:38;;;;:::i;:::-;94892:5;94876:13;:11;:13::i;:::-;:21;;;;:::i;:::-;94875:67;;94866:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;95018:5;94989:13;:25;95003:10;94989:25;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;95032:28;95042:10;95054:5;95032:9;:28::i;:::-;94446:620;:::o;92192:86::-;11671:13;:11;:13::i;:::-;92268:4:::1;92258:7;:14;;;;;;:::i;:::-;;92192:86:::0;:::o;95463:207::-;95601:8;89131:30;89152:8;89131:20;:30::i;:::-;95621:43:::1;95645:8;95655;95621:23;:43::i;:::-;95463:207:::0;;;:::o;90922:52::-;;;;:::o;91182:34::-;;;;:::o;90796:31::-;;;;:::o;96248:240::-;96419:4;88865:10;88857:18;;:4;:18;;;88853:83;;88892:32;88913:10;88892:20;:32::i;:::-;88853:83;96435:47:::1;96458:4;96464:2;96468:7;96477:4;96435:22;:47::i;:::-;96248:240:::0;;;;;:::o;92700:84::-;92744:7;92771:5;;92764:12;;92700:84;:::o;74526:428::-;74610:21;;:::i;:::-;74644:31;;:::i;:::-;74700:15;:13;:15::i;:::-;74690:7;:25;:54;;;;74730:14;:12;:14::i;:::-;74719:7;:25;;74690:54;74686:103;;;74768:9;74761:16;;;;;74686:103;74811:21;74824:7;74811:12;:21::i;:::-;74799:33;;74847:9;:16;;;74843:65;;;74887:9;74880:16;;;;;74843:65;74925:21;74938:7;74925:12;:21::i;:::-;74918:28;;;74526:428;;;;:::o;90715:38::-;90748:5;90715:38;:::o;41852:318::-;41925:13;41956:16;41964:7;41956;:16::i;:::-;41951:59;;41981:29;;;;;;;;;;;;;;41951:59;42023:21;42047:10;:8;:10::i;:::-;42023:34;;42100:1;42081:7;42075:21;:26;:87;;;;;;;;;;;;;;;;;42128:7;42137:18;42147:7;42137:9;:18::i;:::-;42111:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42075:87;42068:94;;;41852:318;;;:::o;92597:96::-;11671:13;:11;:13::i;:::-;92680:5:::1;92666:11;:19;;;;92597:96:::0;:::o;90758:33::-;;;;:::o;93265:1175::-;93357:12;;;;;;;;;;;93349:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;93411:54;93419:17;93425:10;93419:5;:17::i;:::-;93438:19;;93459:5;93411:7;:54::i;:::-;93403:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;90748:5;93525;93509:13;:11;:13::i;:::-;:21;;;;:::i;:::-;93508:33;;93499:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;93605:8;;93596:5;93571:10;:22;93582:10;93571:22;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;:42;;93563:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;93720:15;;93706:11;;90748:5;93697:20;;;;:::i;:::-;:38;;;;:::i;:::-;93686:5;93670:13;;:21;;;;:::i;:::-;93669:67;;93660:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;93785:16;93831:9;;93805:11;:23;93817:10;93805:23;;;;;;;;;;;;;;;;:35;93785:56;;93853:11;93850:510;;;93906:11;:23;93918:10;93906:23;;;;;;;;;;;;;;;;93894:9;;:35;;;;:::i;:::-;93884:5;:46;93881:342;;94041:5;;94014:11;:23;94026:10;94014:23;;;;;;;;;;;;;;;;94002:9;;:35;;;;:::i;:::-;94001:45;;;;:::i;:::-;93991:5;;93983;:13;;;;:::i;:::-;93982:65;;;;:::i;:::-;93969:9;:78;;93961:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;94116:9;;94090:11;:23;94102:10;94090:23;;;;;;;;;;;;;;;:35;;;;94160:9;;94141:15;;:28;;;;;;;:::i;:::-;;;;;;;;94202:5;94185:13;;:22;;;;;;;:::i;:::-;;;;;;;;93881:342;93850:510;;;94287:5;;94279;:13;;;;:::i;:::-;94266:9;:26;;94258:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;94347:5;94330:13;;:22;;;;;;;:::i;:::-;;;;;;;;93850:510;94394:5;94368:10;:22;94379:10;94368:22;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;94406:28;94416:10;94428:5;94406:9;:28::i;:::-;93340:1100;93265:1175;;:::o;91106:35::-;;;;:::o;48906:164::-;49003:4;49027:18;:25;49046:5;49027:25;;;;;;;;;;;;;;;:35;49053:8;49027:35;;;;;;;;;;;;;;;;;;;;;;;;;49020:42;;48906:164;;;;:::o;91048:27::-;;;;:::o;12684:201::-;11671:13;:11;:13::i;:::-;12793:1:::1;12773:22;;:8;:22;;::::0;12765:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;12849:28;12868:8;12849:18;:28::i;:::-;12684:201:::0;:::o;91633:87::-;11671:13;:11;:13::i;:::-;91702:12:::1;;;;;;;;;;;91701:13;91686:12;;:28;;;;;;;;;;;;;;;;;;91633:87::o:0;40564:639::-;40649:4;40988:10;40973:25;;:11;:25;;;;:102;;;;41065:10;41050:25;;:11;:25;;;;40973:102;:179;;;;41142:10;41127:25;;:11;:25;;;;40973:179;40953:199;;40564:639;;;:::o;17091:215::-;17193:4;17232:26;17217:41;;;:11;:41;;;;:81;;;;17262:36;17286:11;17262:23;:36::i;:::-;17217:81;17210:88;;17091:215;;;:::o;49328:282::-;49393:4;49449:7;49430:15;:13;:15::i;:::-;:26;;:66;;;;;49483:13;;49473:7;:23;49430:66;:153;;;;;49582:1;33336:8;49534:17;:26;49552:7;49534:26;;;;;;;;;;;;:44;:49;49430:153;49410:173;;49328:282;;;:::o;89274:647::-;89513:1;86245:42;89465:45;;;:49;89461:453;;;86245:42;89764;;;89815:4;89822:8;89764:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;89759:144;;89878:8;89859:28;;;;;;;;;;;:::i;:::-;;;;;;;;89759:144;89461:453;89274:647;:::o;47390:408::-;47479:13;47495:16;47503:7;47495;:16::i;:::-;47479:32;;47551:5;47528:28;;:19;:17;:19::i;:::-;:28;;;47524:175;;47576:44;47593:5;47600:19;:17;:19::i;:::-;47576:16;:44::i;:::-;47571:128;;47648:35;;;;;;;;;;;;;;47571:128;47524:175;47744:2;47711:15;:24;47727:7;47711:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;47782:7;47778:2;47762:28;;47771:5;47762:28;;;;;;;;;;;;47468:330;47390:408;;:::o;36733:92::-;36789:7;36733:92;:::o;51596:2825::-;51738:27;51768;51787:7;51768:18;:27::i;:::-;51738:57;;51853:4;51812:45;;51828:19;51812:45;;;51808:86;;51866:28;;;;;;;;;;;;;;51808:86;51908:27;51937:23;51964:35;51991:7;51964:26;:35::i;:::-;51907:92;;;;52099:68;52124:15;52141:4;52147:19;:17;:19::i;:::-;52099:24;:68::i;:::-;52094:180;;52187:43;52204:4;52210:19;:17;:19::i;:::-;52187:16;:43::i;:::-;52182:92;;52239:35;;;;;;;;;;;;;;52182:92;52094:180;52305:1;52291:16;;:2;:16;;;52287:52;;52316:23;;;;;;;;;;;;;;52287:52;52352:43;52374:4;52380:2;52384:7;52393:1;52352:21;:43::i;:::-;52488:15;52485:160;;;52628:1;52607:19;52600:30;52485:160;53025:18;:24;53044:4;53025:24;;;;;;;;;;;;;;;;53023:26;;;;;;;;;;;;53094:18;:22;53113:2;53094:22;;;;;;;;;;;;;;;;53092:24;;;;;;;;;;;53416:146;53453:2;53502:45;53517:4;53523:2;53527:19;53502:14;:45::i;:::-;33616:8;53474:73;53416:18;:146::i;:::-;53387:17;:26;53405:7;53387:26;;;;;;;;;;;:175;;;;53733:1;33616:8;53682:19;:47;:52;53678:627;;53755:19;53787:1;53777:7;:11;53755:33;;53944:1;53910:17;:30;53928:11;53910:30;;;;;;;;;;;;:35;53906:384;;54048:13;;54033:11;:28;54029:242;;54228:19;54195:17;:30;54213:11;54195:30;;;;;;;;;;;:52;;;;54029:242;53906:384;53736:569;53678:627;54352:7;54348:2;54333:27;;54342:4;54333:27;;;;;;;;;;;;54371:42;54392:4;54398:2;54402:7;54411:1;54371:20;:42::i;:::-;51727:2694;;;51596:2825;;;:::o;18081:97::-;18139:6;18165:5;18158:12;;18081:97;:::o;11950:132::-;12025:12;:10;:12::i;:::-;12014:23;;:7;:5;:7::i;:::-;:23;;;12006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11950:132::o;54517:193::-;54663:39;54680:4;54686:2;54690:7;54663:39;;;;;;;;;;;;:16;:39::i;:::-;54517:193;;;:::o;44014:1275::-;44081:7;44101:12;44116:7;44101:22;;44184:4;44165:15;:13;:15::i;:::-;:23;44161:1061;;44218:13;;44211:4;:20;44207:1015;;;44256:14;44273:17;:23;44291:4;44273:23;;;;;;;;;;;;44256:40;;44390:1;33336:8;44362:6;:24;:29;44358:845;;45027:113;45044:1;45034:6;:11;45027:113;;45087:17;:25;45105:6;;;;;;;45087:25;;;;;;;;;;;;45078:34;;45027:113;;;45173:6;45166:13;;;;;;44358:845;44233:989;44207:1015;44161:1061;45250:31;;;;;;;;;;;;;;44014:1275;;;;:::o;13045:191::-;13119:16;13138:6;;;;;;;;;;;13119:25;;13164:8;13155:6;;:17;;;;;;;;;;;;;;;;;;13219:8;13188:40;;13209:8;13188:40;;;;;;;;;;;;13108:128;13045:191;:::o;43462:161::-;43530:21;;:::i;:::-;43571:44;43590:17;:24;43608:5;43590:24;;;;;;;;;;;;43571:18;:44::i;:::-;43564:51;;43462:161;;;:::o;65468:112::-;65545:27;65555:2;65559:8;65545:27;;;;;;;;;;;;:9;:27::i;:::-;65468:112;;:::o;1157:156::-;1248:4;1301;1272:25;1285:5;1292:4;1272:12;:25::i;:::-;:33;1265:40;;1157:156;;;;;:::o;36904:103::-;36959:7;36986:13;;36979:20;;36904:103;:::o;48515:234::-;48662:8;48610:18;:39;48629:19;:17;:19::i;:::-;48610:39;;;;;;;;;;;;;;;:49;48650:8;48610:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;48722:8;48686:55;;48701:19;:17;:19::i;:::-;48686:55;;;48732:8;48686:55;;;;;;:::i;:::-;;;;;;;;48515:234;;:::o;55308:407::-;55483:31;55496:4;55502:2;55506:7;55483:12;:31::i;:::-;55547:1;55529:2;:14;;;:19;55525:183;;55568:56;55599:4;55605:2;55609:7;55618:5;55568:30;:56::i;:::-;55563:145;;55652:40;;;;;;;;;;;;;;55563:145;55525:183;55308:407;;;;:::o;43200:166::-;43270:21;;:::i;:::-;43311:47;43330:27;43349:7;43330:18;:27::i;:::-;43311:18;:47::i;:::-;43304:54;;43200:166;;;:::o;95355:102::-;95415:13;95444:7;95437:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95355:102;:::o;71843:1745::-;71908:17;72342:4;72335;72329:11;72325:22;72434:1;72428:4;72421:15;72509:4;72506:1;72502:12;72495:19;;72591:1;72586:3;72579:14;72695:3;72934:5;72916:428;72942:1;72916:428;;;72982:1;72977:3;72973:11;72966:18;;73153:2;73147:4;73143:13;73139:2;73135:22;73130:3;73122:36;73247:2;73241:4;73237:13;73229:21;;73314:4;72916:428;73304:25;72916:428;72920:21;73383:3;73378;73374:13;73498:4;73493:3;73489:14;73482:21;;73563:6;73558:3;73551:19;71947:1634;;;71843:1745;;;:::o;15713:157::-;15798:4;15837:25;15822:40;;;:11;:40;;;;15815:47;;15713:157;;;:::o;71636:105::-;71696:7;71723:10;71716:17;;71636:105;:::o;50491:485::-;50593:27;50622:23;50663:38;50704:15;:24;50720:7;50704:24;;;;;;;;;;;50663:65;;50881:18;50858:41;;50938:19;50932:26;50913:45;;50843:126;50491:485;;;:::o;49719:659::-;49868:11;50033:16;50026:5;50022:28;50013:37;;50193:16;50182:9;50178:32;50165:45;;50343:15;50332:9;50329:30;50321:5;50310:9;50307:20;50304:56;50294:66;;49719:659;;;;;:::o;56377:159::-;;;;;:::o;70945:311::-;71080:7;71100:16;33740:3;71126:19;:41;;71100:68;;33740:3;71194:31;71205:4;71211:2;71215:9;71194:10;:31::i;:::-;71186:40;;:62;;71179:69;;;70945:311;;;;;:::o;45837:450::-;45917:14;46085:16;46078:5;46074:28;46065:37;;46262:5;46248:11;46223:23;46219:41;46216:52;46209:5;46206:63;46196:73;;45837:450;;;;:::o;57201:158::-;;;;;:::o;10494:98::-;10547:7;10574:10;10567:17;;10494:98;:::o;45388:366::-;45454:31;;:::i;:::-;45531:6;45498:9;:14;;:41;;;;;;;;;;;33219:3;45584:6;:33;;45550:9;:24;;:68;;;;;;;;;;;45676:1;33336:8;45648:6;:24;:29;;45629:9;:16;;:48;;;;;;;;;;;33740:3;45717:6;:28;;45688:9;:19;;:58;;;;;;;;;;;45388:366;;;:::o;64695:689::-;64826:19;64832:2;64836:8;64826:5;:19::i;:::-;64905:1;64887:2;:14;;;:19;64883:483;;64927:11;64941:13;;64927:27;;64973:13;64995:8;64989:3;:14;64973:30;;65022:233;65053:62;65092:1;65096:2;65100:7;;;;;;65109:5;65053:30;:62::i;:::-;65048:167;;65151:40;;;;;;;;;;;;;;65048:167;65250:3;65242:5;:11;65022:233;;65337:3;65320:13;;:20;65316:34;;65342:8;;;65316:34;64908:458;;64883:483;64695:689;;;:::o;1956:296::-;2039:7;2059:20;2082:4;2059:27;;2102:9;2097:118;2121:5;:12;2117:1;:16;2097:118;;;2170:33;2180:12;2194:5;2200:1;2194:8;;;;;;;;:::i;:::-;;;;;;;;2170:9;:33::i;:::-;2155:48;;2135:3;;;;;:::i;:::-;;;;2097:118;;;;2232:12;2225:19;;;1956:296;;;;:::o;57799:716::-;57962:4;58008:2;57983:45;;;58029:19;:17;:19::i;:::-;58050:4;58056:7;58065:5;57983:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57979:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58283:1;58266:6;:13;:18;58262:235;;58312:40;;;;;;;;;;;;;;58262:235;58455:6;58449:13;58440:6;58436:2;58432:15;58425:38;57979:529;58152:54;;;58142:64;;;:6;:64;;;;58135:71;;;57799:716;;;;;;:::o;70646:147::-;70783:6;70646:147;;;;;:::o;58977:2966::-;59050:20;59073:13;;59050:36;;59113:1;59101:8;:13;59097:44;;59123:18;;;;;;;;;;;;;;59097:44;59154:61;59184:1;59188:2;59192:12;59206:8;59154:21;:61::i;:::-;59698:1;32698:2;59668:1;:26;;59667:32;59655:8;:45;59629:18;:22;59648:2;59629:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;59977:139;60014:2;60068:33;60091:1;60095:2;60099:1;60068:14;:33::i;:::-;60035:30;60056:8;60035:20;:30::i;:::-;:66;59977:18;:139::i;:::-;59943:17;:31;59961:12;59943:31;;;;;;;;;;;:173;;;;60133:16;60164:11;60193:8;60178:12;:23;60164:37;;60714:16;60710:2;60706:25;60694:37;;61086:12;61046:8;61005:1;60943:25;60884:1;60823;60796:335;61457:1;61443:12;61439:20;61397:346;61498:3;61489:7;61486:16;61397:346;;61716:7;61706:8;61703:1;61676:25;61673:1;61670;61665:59;61551:1;61542:7;61538:15;61527:26;;61397:346;;;61401:77;61788:1;61776:8;:13;61772:45;;61798:19;;;;;;;;;;;;;;61772:45;61850:3;61834:13;:19;;;;59403:2462;;61875:60;61904:1;61908:2;61912:12;61926:8;61875:20;:60::i;:::-;59039:2904;58977:2966;;:::o;9394:149::-;9457:7;9488:1;9484;:5;:51;;9515:20;9530:1;9533;9515:14;:20::i;:::-;9484:51;;;9492:20;9507:1;9510;9492:14;:20::i;:::-;9484:51;9477:58;;9394:149;;;;:::o;46389:324::-;46459:14;46692:1;46682:8;46679:15;46653:24;46649:46;46639:56;;46389:324;;;:::o;9551:268::-;9619:13;9726:1;9720:4;9713:15;9755:1;9749:4;9742:15;9796:4;9790;9780:21;9771:30;;9551:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:332::-;6803:4;6841:2;6830:9;6826:18;6818:26;;6854:71;6922:1;6911:9;6907:17;6898:6;6854:71;:::i;:::-;6935:72;7003:2;6992:9;6988:18;6979:6;6935:72;:::i;:::-;6682:332;;;;;:::o;7020:60::-;7048:3;7069:5;7062:12;;7020:60;;;:::o;7086:142::-;7136:9;7169:53;7187:34;7196:24;7214:5;7196:24;:::i;:::-;7187:34;:::i;:::-;7169:53;:::i;:::-;7156:66;;7086:142;;;:::o;7234:126::-;7284:9;7317:37;7348:5;7317:37;:::i;:::-;7304:50;;7234:126;;;:::o;7366:158::-;7448:9;7481:37;7512:5;7481:37;:::i;:::-;7468:50;;7366:158;;;:::o;7530:195::-;7649:69;7712:5;7649:69;:::i;:::-;7644:3;7637:82;7530:195;;:::o;7731:286::-;7856:4;7894:2;7883:9;7879:18;7871:26;;7907:103;8007:1;7996:9;7992:17;7983:6;7907:103;:::i;:::-;7731:286;;;;:::o;8023:77::-;8060:7;8089:5;8078:16;;8023:77;;;:::o;8106:118::-;8193:24;8211:5;8193:24;:::i;:::-;8188:3;8181:37;8106:118;;:::o;8230:222::-;8323:4;8361:2;8350:9;8346:18;8338:26;;8374:71;8442:1;8431:9;8427:17;8418:6;8374:71;:::i;:::-;8230:222;;;;:::o;8458:117::-;8567:1;8564;8557:12;8581:117;8690:1;8687;8680:12;8704:117;8813:1;8810;8803:12;8844:568;8917:8;8927:6;8977:3;8970:4;8962:6;8958:17;8954:27;8944:122;;8985:79;;:::i;:::-;8944:122;9098:6;9085:20;9075:30;;9128:18;9120:6;9117:30;9114:117;;;9150:79;;:::i;:::-;9114:117;9264:4;9256:6;9252:17;9240:29;;9318:3;9310:4;9302:6;9298:17;9288:8;9284:32;9281:41;9278:128;;;9325:79;;:::i;:::-;9278:128;8844:568;;;;;:::o;9418:559::-;9504:6;9512;9561:2;9549:9;9540:7;9536:23;9532:32;9529:119;;;9567:79;;:::i;:::-;9529:119;9715:1;9704:9;9700:17;9687:31;9745:18;9737:6;9734:30;9731:117;;;9767:79;;:::i;:::-;9731:117;9880:80;9952:7;9943:6;9932:9;9928:22;9880:80;:::i;:::-;9862:98;;;;9658:312;9418:559;;;;;:::o;9983:145::-;10081:6;10115:5;10109:12;10099:22;;9983:145;;;:::o;10134:215::-;10264:11;10298:6;10293:3;10286:19;10338:4;10333:3;10329:14;10314:29;;10134:215;;;;:::o;10355:163::-;10453:4;10476:3;10468:11;;10506:4;10501:3;10497:14;10489:22;;10355:163;;;:::o;10524:108::-;10601:24;10619:5;10601:24;:::i;:::-;10596:3;10589:37;10524:108;;:::o;10638:101::-;10674:7;10714:18;10707:5;10703:30;10692:41;;10638:101;;;:::o;10745:105::-;10820:23;10837:5;10820:23;:::i;:::-;10815:3;10808:36;10745:105;;:::o;10856:99::-;10927:21;10942:5;10927:21;:::i;:::-;10922:3;10915:34;10856:99;;:::o;10961:91::-;10997:7;11037:8;11030:5;11026:20;11015:31;;10961:91;;;:::o;11058:105::-;11133:23;11150:5;11133:23;:::i;:::-;11128:3;11121:36;11058:105;;:::o;11241:864::-;11390:4;11385:3;11381:14;11477:4;11470:5;11466:16;11460:23;11496:63;11553:4;11548:3;11544:14;11530:12;11496:63;:::i;:::-;11405:164;11661:4;11654:5;11650:16;11644:23;11680:61;11735:4;11730:3;11726:14;11712:12;11680:61;:::i;:::-;11579:172;11835:4;11828:5;11824:16;11818:23;11854:57;11905:4;11900:3;11896:14;11882:12;11854:57;:::i;:::-;11761:160;12008:4;12001:5;11997:16;11991:23;12027:61;12082:4;12077:3;12073:14;12059:12;12027:61;:::i;:::-;11931:167;11359:746;11241:864;;:::o;12111:303::-;12242:10;12263:108;12367:3;12359:6;12263:108;:::i;:::-;12403:4;12398:3;12394:14;12380:28;;12111:303;;;;:::o;12420:144::-;12521:4;12553;12548:3;12544:14;12536:22;;12420:144;;;:::o;12646:980::-;12827:3;12856:85;12935:5;12856:85;:::i;:::-;12957:117;13067:6;13062:3;12957:117;:::i;:::-;12950:124;;13098:87;13179:5;13098:87;:::i;:::-;13208:7;13239:1;13224:377;13249:6;13246:1;13243:13;13224:377;;;13325:6;13319:13;13352:125;13473:3;13458:13;13352:125;:::i;:::-;13345:132;;13500:91;13584:6;13500:91;:::i;:::-;13490:101;;13284:317;13271:1;13268;13264:9;13259:14;;13224:377;;;13228:14;13617:3;13610:10;;12832:794;;;12646:980;;;;:::o;13632:497::-;13837:4;13875:2;13864:9;13860:18;13852:26;;13924:9;13918:4;13914:20;13910:1;13899:9;13895:17;13888:47;13952:170;14117:4;14108:6;13952:170;:::i;:::-;13944:178;;13632:497;;;;:::o;14135:122::-;14208:24;14226:5;14208:24;:::i;:::-;14201:5;14198:35;14188:63;;14247:1;14244;14237:12;14188:63;14135:122;:::o;14263:139::-;14309:5;14347:6;14334:20;14325:29;;14363:33;14390:5;14363:33;:::i;:::-;14263:139;;;;:::o;14408:329::-;14467:6;14516:2;14504:9;14495:7;14491:23;14487:32;14484:119;;;14522:79;;:::i;:::-;14484:119;14642:1;14667:53;14712:7;14703:6;14692:9;14688:22;14667:53;:::i;:::-;14657:63;;14613:117;14408:329;;;;:::o;14743:114::-;14810:6;14844:5;14838:12;14828:22;;14743:114;;;:::o;14863:184::-;14962:11;14996:6;14991:3;14984:19;15036:4;15031:3;15027:14;15012:29;;14863:184;;;;:::o;15053:132::-;15120:4;15143:3;15135:11;;15173:4;15168:3;15164:14;15156:22;;15053:132;;;:::o;15191:108::-;15268:24;15286:5;15268:24;:::i;:::-;15263:3;15256:37;15191:108;;:::o;15305:179::-;15374:10;15395:46;15437:3;15429:6;15395:46;:::i;:::-;15473:4;15468:3;15464:14;15450:28;;15305:179;;;;:::o;15490:113::-;15560:4;15592;15587:3;15583:14;15575:22;;15490:113;;;:::o;15639:732::-;15758:3;15787:54;15835:5;15787:54;:::i;:::-;15857:86;15936:6;15931:3;15857:86;:::i;:::-;15850:93;;15967:56;16017:5;15967:56;:::i;:::-;16046:7;16077:1;16062:284;16087:6;16084:1;16081:13;16062:284;;;16163:6;16157:13;16190:63;16249:3;16234:13;16190:63;:::i;:::-;16183:70;;16276:60;16329:6;16276:60;:::i;:::-;16266:70;;16122:224;16109:1;16106;16102:9;16097:14;;16062:284;;;16066:14;16362:3;16355:10;;15763:608;;;15639:732;;;;:::o;16377:373::-;16520:4;16558:2;16547:9;16543:18;16535:26;;16607:9;16601:4;16597:20;16593:1;16582:9;16578:17;16571:47;16635:108;16738:4;16729:6;16635:108;:::i;:::-;16627:116;;16377:373;;;;:::o;16756:180::-;16804:77;16801:1;16794:88;16901:4;16898:1;16891:15;16925:4;16922:1;16915:15;16942:281;17025:27;17047:4;17025:27;:::i;:::-;17017:6;17013:40;17155:6;17143:10;17140:22;17119:18;17107:10;17104:34;17101:62;17098:88;;;17166:18;;:::i;:::-;17098:88;17206:10;17202:2;17195:22;16985:238;16942:281;;:::o;17229:129::-;17263:6;17290:20;;:::i;:::-;17280:30;;17319:33;17347:4;17339:6;17319:33;:::i;:::-;17229:129;;;:::o;17364:311::-;17441:4;17531:18;17523:6;17520:30;17517:56;;;17553:18;;:::i;:::-;17517:56;17603:4;17595:6;17591:17;17583:25;;17663:4;17657;17653:15;17645:23;;17364:311;;;:::o;17698:710::-;17794:5;17819:81;17835:64;17892:6;17835:64;:::i;:::-;17819:81;:::i;:::-;17810:90;;17920:5;17949:6;17942:5;17935:21;17983:4;17976:5;17972:16;17965:23;;18036:4;18028:6;18024:17;18016:6;18012:30;18065:3;18057:6;18054:15;18051:122;;;18084:79;;:::i;:::-;18051:122;18199:6;18182:220;18216:6;18211:3;18208:15;18182:220;;;18291:3;18320:37;18353:3;18341:10;18320:37;:::i;:::-;18315:3;18308:50;18387:4;18382:3;18378:14;18371:21;;18258:144;18242:4;18237:3;18233:14;18226:21;;18182:220;;;18186:21;17800:608;;17698:710;;;;;:::o;18431:370::-;18502:5;18551:3;18544:4;18536:6;18532:17;18528:27;18518:122;;18559:79;;:::i;:::-;18518:122;18676:6;18663:20;18701:94;18791:3;18783:6;18776:4;18768:6;18764:17;18701:94;:::i;:::-;18692:103;;18508:293;18431:370;;;;:::o;18807:829::-;18909:6;18917;18925;18974:2;18962:9;18953:7;18949:23;18945:32;18942:119;;;18980:79;;:::i;:::-;18942:119;19100:1;19125:53;19170:7;19161:6;19150:9;19146:22;19125:53;:::i;:::-;19115:63;;19071:117;19227:2;19253:53;19298:7;19289:6;19278:9;19274:22;19253:53;:::i;:::-;19243:63;;19198:118;19383:2;19372:9;19368:18;19355:32;19414:18;19406:6;19403:30;19400:117;;;19436:79;;:::i;:::-;19400:117;19541:78;19611:7;19602:6;19591:9;19587:22;19541:78;:::i;:::-;19531:88;;19326:303;18807:829;;;;;:::o;19642:619::-;19719:6;19727;19735;19784:2;19772:9;19763:7;19759:23;19755:32;19752:119;;;19790:79;;:::i;:::-;19752:119;19910:1;19935:53;19980:7;19971:6;19960:9;19956:22;19935:53;:::i;:::-;19925:63;;19881:117;20037:2;20063:53;20108:7;20099:6;20088:9;20084:22;20063:53;:::i;:::-;20053:63;;20008:118;20165:2;20191:53;20236:7;20227:6;20216:9;20212:22;20191:53;:::i;:::-;20181:63;;20136:118;19642:619;;;;;:::o;20267:117::-;20376:1;20373;20366:12;20390:308;20452:4;20542:18;20534:6;20531:30;20528:56;;;20564:18;;:::i;:::-;20528:56;20602:29;20624:6;20602:29;:::i;:::-;20594:37;;20686:4;20680;20676:15;20668:23;;20390:308;;;:::o;20704:146::-;20801:6;20796:3;20791;20778:30;20842:1;20833:6;20828:3;20824:16;20817:27;20704:146;;;:::o;20856:425::-;20934:5;20959:66;20975:49;21017:6;20975:49;:::i;:::-;20959:66;:::i;:::-;20950:75;;21048:6;21041:5;21034:21;21086:4;21079:5;21075:16;21124:3;21115:6;21110:3;21106:16;21103:25;21100:112;;;21131:79;;:::i;:::-;21100:112;21221:54;21268:6;21263:3;21258;21221:54;:::i;:::-;20940:341;20856:425;;;;;:::o;21301:340::-;21357:5;21406:3;21399:4;21391:6;21387:17;21383:27;21373:122;;21414:79;;:::i;:::-;21373:122;21531:6;21518:20;21556:79;21631:3;21623:6;21616:4;21608:6;21604:17;21556:79;:::i;:::-;21547:88;;21363:278;21301:340;;;;:::o;21647:509::-;21716:6;21765:2;21753:9;21744:7;21740:23;21736:32;21733:119;;;21771:79;;:::i;:::-;21733:119;21919:1;21908:9;21904:17;21891:31;21949:18;21941:6;21938:30;21935:117;;;21971:79;;:::i;:::-;21935:117;22076:63;22131:7;22122:6;22111:9;22107:22;22076:63;:::i;:::-;22066:73;;21862:287;21647:509;;;;:::o;22162:116::-;22232:21;22247:5;22232:21;:::i;:::-;22225:5;22222:32;22212:60;;22268:1;22265;22258:12;22212:60;22162:116;:::o;22284:133::-;22327:5;22365:6;22352:20;22343:29;;22381:30;22405:5;22381:30;:::i;:::-;22284:133;;;;:::o;22423:468::-;22488:6;22496;22545:2;22533:9;22524:7;22520:23;22516:32;22513:119;;;22551:79;;:::i;:::-;22513:119;22671:1;22696:53;22741:7;22732:6;22721:9;22717:22;22696:53;:::i;:::-;22686:63;;22642:117;22798:2;22824:50;22866:7;22857:6;22846:9;22842:22;22824:50;:::i;:::-;22814:60;;22769:115;22423:468;;;;;:::o;22897:307::-;22958:4;23048:18;23040:6;23037:30;23034:56;;;23070:18;;:::i;:::-;23034:56;23108:29;23130:6;23108:29;:::i;:::-;23100:37;;23192:4;23186;23182:15;23174:23;;22897:307;;;:::o;23210:423::-;23287:5;23312:65;23328:48;23369:6;23328:48;:::i;:::-;23312:65;:::i;:::-;23303:74;;23400:6;23393:5;23386:21;23438:4;23431:5;23427:16;23476:3;23467:6;23462:3;23458:16;23455:25;23452:112;;;23483:79;;:::i;:::-;23452:112;23573:54;23620:6;23615:3;23610;23573:54;:::i;:::-;23293:340;23210:423;;;;;:::o;23652:338::-;23707:5;23756:3;23749:4;23741:6;23737:17;23733:27;23723:122;;23764:79;;:::i;:::-;23723:122;23881:6;23868:20;23906:78;23980:3;23972:6;23965:4;23957:6;23953:17;23906:78;:::i;:::-;23897:87;;23713:277;23652:338;;;;:::o;23996:943::-;24091:6;24099;24107;24115;24164:3;24152:9;24143:7;24139:23;24135:33;24132:120;;;24171:79;;:::i;:::-;24132:120;24291:1;24316:53;24361:7;24352:6;24341:9;24337:22;24316:53;:::i;:::-;24306:63;;24262:117;24418:2;24444:53;24489:7;24480:6;24469:9;24465:22;24444:53;:::i;:::-;24434:63;;24389:118;24546:2;24572:53;24617:7;24608:6;24597:9;24593:22;24572:53;:::i;:::-;24562:63;;24517:118;24702:2;24691:9;24687:18;24674:32;24733:18;24725:6;24722:30;24719:117;;;24755:79;;:::i;:::-;24719:117;24860:62;24914:7;24905:6;24894:9;24890:22;24860:62;:::i;:::-;24850:72;;24645:287;23996:943;;;;;;;:::o;25017:874::-;25176:4;25171:3;25167:14;25263:4;25256:5;25252:16;25246:23;25282:63;25339:4;25334:3;25330:14;25316:12;25282:63;:::i;:::-;25191:164;25447:4;25440:5;25436:16;25430:23;25466:61;25521:4;25516:3;25512:14;25498:12;25466:61;:::i;:::-;25365:172;25621:4;25614:5;25610:16;25604:23;25640:57;25691:4;25686:3;25682:14;25668:12;25640:57;:::i;:::-;25547:160;25794:4;25787:5;25783:16;25777:23;25813:61;25868:4;25863:3;25859:14;25845:12;25813:61;:::i;:::-;25717:167;25145:746;25017:874;;:::o;25897:347::-;26052:4;26090:3;26079:9;26075:19;26067:27;;26104:133;26234:1;26223:9;26219:17;26210:6;26104:133;:::i;:::-;25897:347;;;;:::o;26250:684::-;26343:6;26351;26400:2;26388:9;26379:7;26375:23;26371:32;26368:119;;;26406:79;;:::i;:::-;26368:119;26526:1;26551:53;26596:7;26587:6;26576:9;26572:22;26551:53;:::i;:::-;26541:63;;26497:117;26681:2;26670:9;26666:18;26653:32;26712:18;26704:6;26701:30;26698:117;;;26734:79;;:::i;:::-;26698:117;26839:78;26909:7;26900:6;26889:9;26885:22;26839:78;:::i;:::-;26829:88;;26624:303;26250:684;;;;;:::o;26940:474::-;27008:6;27016;27065:2;27053:9;27044:7;27040:23;27036:32;27033:119;;;27071:79;;:::i;:::-;27033:119;27191:1;27216:53;27261:7;27252:6;27241:9;27237:22;27216:53;:::i;:::-;27206:63;;27162:117;27318:2;27344:53;27389:7;27380:6;27369:9;27365:22;27344:53;:::i;:::-;27334:63;;27289:118;26940:474;;;;;:::o;27420:180::-;27468:77;27465:1;27458:88;27565:4;27562:1;27555:15;27589:4;27586:1;27579:15;27606:320;27650:6;27687:1;27681:4;27677:12;27667:22;;27734:1;27728:4;27724:12;27755:18;27745:81;;27811:4;27803:6;27799:17;27789:27;;27745:81;27873:2;27865:6;27862:14;27842:18;27839:38;27836:84;;27892:18;;:::i;:::-;27836:84;27657:269;27606:320;;;:::o;27932:180::-;27980:77;27977:1;27970:88;28077:4;28074:1;28067:15;28101:4;28098:1;28091:15;28118:410;28158:7;28181:20;28199:1;28181:20;:::i;:::-;28176:25;;28215:20;28233:1;28215:20;:::i;:::-;28210:25;;28270:1;28267;28263:9;28292:30;28310:11;28292:30;:::i;:::-;28281:41;;28471:1;28462:7;28458:15;28455:1;28452:22;28432:1;28425:9;28405:83;28382:139;;28501:18;;:::i;:::-;28382:139;28166:362;28118:410;;;;:::o;28534:180::-;28582:77;28579:1;28572:88;28679:4;28676:1;28669:15;28703:4;28700:1;28693:15;28720:185;28760:1;28777:20;28795:1;28777:20;:::i;:::-;28772:25;;28811:20;28829:1;28811:20;:::i;:::-;28806:25;;28850:1;28840:35;;28855:18;;:::i;:::-;28840:35;28897:1;28894;28890:9;28885:14;;28720:185;;;;:::o;28911:147::-;29012:11;29049:3;29034:18;;28911:147;;;;:::o;29064:114::-;;:::o;29184:398::-;29343:3;29364:83;29445:1;29440:3;29364:83;:::i;:::-;29357:90;;29456:93;29545:3;29456:93;:::i;:::-;29574:1;29569:3;29565:11;29558:18;;29184:398;;;:::o;29588:379::-;29772:3;29794:147;29937:3;29794:147;:::i;:::-;29787:154;;29958:3;29951:10;;29588:379;;;:::o;29973:166::-;30113:18;30109:1;30101:6;30097:14;30090:42;29973:166;:::o;30145:366::-;30287:3;30308:67;30372:2;30367:3;30308:67;:::i;:::-;30301:74;;30384:93;30473:3;30384:93;:::i;:::-;30502:2;30497:3;30493:12;30486:19;;30145:366;;;:::o;30517:419::-;30683:4;30721:2;30710:9;30706:18;30698:26;;30770:9;30764:4;30760:20;30756:1;30745:9;30741:17;30734:47;30798:131;30924:4;30798:131;:::i;:::-;30790:139;;30517:419;;;:::o;30942:94::-;30975:8;31023:5;31019:2;31015:14;30994:35;;30942:94;;;:::o;31042:::-;31081:7;31110:20;31124:5;31110:20;:::i;:::-;31099:31;;31042:94;;;:::o;31142:100::-;31181:7;31210:26;31230:5;31210:26;:::i;:::-;31199:37;;31142:100;;;:::o;31248:157::-;31353:45;31373:24;31391:5;31373:24;:::i;:::-;31353:45;:::i;:::-;31348:3;31341:58;31248:157;;:::o;31411:256::-;31523:3;31538:75;31609:3;31600:6;31538:75;:::i;:::-;31638:2;31633:3;31629:12;31622:19;;31658:3;31651:10;;31411:256;;;;:::o;31673:180::-;31721:77;31718:1;31711:88;31818:4;31815:1;31808:15;31842:4;31839:1;31832:15;31859:191;31899:3;31918:20;31936:1;31918:20;:::i;:::-;31913:25;;31952:20;31970:1;31952:20;:::i;:::-;31947:25;;31995:1;31992;31988:9;31981:16;;32016:3;32013:1;32010:10;32007:36;;;32023:18;;:::i;:::-;32007:36;31859:191;;;;:::o;32056:177::-;32196:29;32192:1;32184:6;32180:14;32173:53;32056:177;:::o;32239:366::-;32381:3;32402:67;32466:2;32461:3;32402:67;:::i;:::-;32395:74;;32478:93;32567:3;32478:93;:::i;:::-;32596:2;32591:3;32587:12;32580:19;;32239:366;;;:::o;32611:419::-;32777:4;32815:2;32804:9;32800:18;32792:26;;32864:9;32858:4;32854:20;32850:1;32839:9;32835:17;32828:47;32892:131;33018:4;32892:131;:::i;:::-;32884:139;;32611:419;;;:::o;33036:172::-;33176:24;33172:1;33164:6;33160:14;33153:48;33036:172;:::o;33214:366::-;33356:3;33377:67;33441:2;33436:3;33377:67;:::i;:::-;33370:74;;33453:93;33542:3;33453:93;:::i;:::-;33571:2;33566:3;33562:12;33555:19;;33214:366;;;:::o;33586:419::-;33752:4;33790:2;33779:9;33775:18;33767:26;;33839:9;33833:4;33829:20;33825:1;33814:9;33810:17;33803:47;33867:131;33993:4;33867:131;:::i;:::-;33859:139;;33586:419;;;:::o;34011:194::-;34051:4;34071:20;34089:1;34071:20;:::i;:::-;34066:25;;34105:20;34123:1;34105:20;:::i;:::-;34100:25;;34149:1;34146;34142:9;34134:17;;34173:1;34167:4;34164:11;34161:37;;;34178:18;;:::i;:::-;34161:37;34011:194;;;;:::o;34211:171::-;34351:23;34347:1;34339:6;34335:14;34328:47;34211:171;:::o;34388:366::-;34530:3;34551:67;34615:2;34610:3;34551:67;:::i;:::-;34544:74;;34627:93;34716:3;34627:93;:::i;:::-;34745:2;34740:3;34736:12;34729:19;;34388:366;;;:::o;34760:419::-;34926:4;34964:2;34953:9;34949:18;34941:26;;35013:9;35007:4;35003:20;34999:1;34988:9;34984:17;34977:47;35041:131;35167:4;35041:131;:::i;:::-;35033:139;;34760:419;;;:::o;35185:159::-;35325:11;35321:1;35313:6;35309:14;35302:35;35185:159;:::o;35350:365::-;35492:3;35513:66;35577:1;35572:3;35513:66;:::i;:::-;35506:73;;35588:93;35677:3;35588:93;:::i;:::-;35706:2;35701:3;35697:12;35690:19;;35350:365;;;:::o;35721:419::-;35887:4;35925:2;35914:9;35910:18;35902:26;;35974:9;35968:4;35964:20;35960:1;35949:9;35945:17;35938:47;36002:131;36128:4;36002:131;:::i;:::-;35994:139;;35721:419;;;:::o;36146:172::-;36286:24;36282:1;36274:6;36270:14;36263:48;36146:172;:::o;36324:366::-;36466:3;36487:67;36551:2;36546:3;36487:67;:::i;:::-;36480:74;;36563:93;36652:3;36563:93;:::i;:::-;36681:2;36676:3;36672:12;36665:19;;36324:366;;;:::o;36696:419::-;36862:4;36900:2;36889:9;36885:18;36877:26;;36949:9;36943:4;36939:20;36935:1;36924:9;36920:17;36913:47;36977:131;37103:4;36977:131;:::i;:::-;36969:139;;36696:419;;;:::o;37121:178::-;37261:30;37257:1;37249:6;37245:14;37238:54;37121:178;:::o;37305:366::-;37447:3;37468:67;37532:2;37527:3;37468:67;:::i;:::-;37461:74;;37544:93;37633:3;37544:93;:::i;:::-;37662:2;37657:3;37653:12;37646:19;;37305:366;;;:::o;37677:419::-;37843:4;37881:2;37870:9;37866:18;37858:26;;37930:9;37924:4;37920:20;37916:1;37905:9;37901:17;37894:47;37958:131;38084:4;37958:131;:::i;:::-;37950:139;;37677:419;;;:::o;38102:173::-;38242:25;38238:1;38230:6;38226:14;38219:49;38102:173;:::o;38281:366::-;38423:3;38444:67;38508:2;38503:3;38444:67;:::i;:::-;38437:74;;38520:93;38609:3;38520:93;:::i;:::-;38638:2;38633:3;38629:12;38622:19;;38281:366;;;:::o;38653:419::-;38819:4;38857:2;38846:9;38842:18;38834:26;;38906:9;38900:4;38896:20;38892:1;38881:9;38877:17;38870:47;38934:131;39060:4;38934:131;:::i;:::-;38926:139;;38653:419;;;:::o;39078:182::-;39218:34;39214:1;39206:6;39202:14;39195:58;39078:182;:::o;39266:366::-;39408:3;39429:67;39493:2;39488:3;39429:67;:::i;:::-;39422:74;;39505:93;39594:3;39505:93;:::i;:::-;39623:2;39618:3;39614:12;39607:19;;39266:366;;;:::o;39638:419::-;39804:4;39842:2;39831:9;39827:18;39819:26;;39891:9;39885:4;39881:20;39877:1;39866:9;39862:17;39855:47;39919:131;40045:4;39919:131;:::i;:::-;39911:139;;39638:419;;;:::o;40063:141::-;40112:4;40135:3;40127:11;;40158:3;40155:1;40148:14;40192:4;40189:1;40179:18;40171:26;;40063:141;;;:::o;40210:93::-;40247:6;40294:2;40289;40282:5;40278:14;40274:23;40264:33;;40210:93;;;:::o;40309:107::-;40353:8;40403:5;40397:4;40393:16;40372:37;;40309:107;;;;:::o;40422:393::-;40491:6;40541:1;40529:10;40525:18;40564:97;40594:66;40583:9;40564:97;:::i;:::-;40682:39;40712:8;40701:9;40682:39;:::i;:::-;40670:51;;40754:4;40750:9;40743:5;40739:21;40730:30;;40803:4;40793:8;40789:19;40782:5;40779:30;40769:40;;40498:317;;40422:393;;;;;:::o;40821:142::-;40871:9;40904:53;40922:34;40931:24;40949:5;40931:24;:::i;:::-;40922:34;:::i;:::-;40904:53;:::i;:::-;40891:66;;40821:142;;;:::o;40969:75::-;41012:3;41033:5;41026:12;;40969:75;;;:::o;41050:269::-;41160:39;41191:7;41160:39;:::i;:::-;41221:91;41270:41;41294:16;41270:41;:::i;:::-;41262:6;41255:4;41249:11;41221:91;:::i;:::-;41215:4;41208:105;41126:193;41050:269;;;:::o;41325:73::-;41370:3;41325:73;:::o;41404:189::-;41481:32;;:::i;:::-;41522:65;41580:6;41572;41566:4;41522:65;:::i;:::-;41457:136;41404:189;;:::o;41599:186::-;41659:120;41676:3;41669:5;41666:14;41659:120;;;41730:39;41767:1;41760:5;41730:39;:::i;:::-;41703:1;41696:5;41692:13;41683:22;;41659:120;;;41599:186;;:::o;41791:543::-;41892:2;41887:3;41884:11;41881:446;;;41926:38;41958:5;41926:38;:::i;:::-;42010:29;42028:10;42010:29;:::i;:::-;42000:8;41996:44;42193:2;42181:10;42178:18;42175:49;;;42214:8;42199:23;;42175:49;42237:80;42293:22;42311:3;42293:22;:::i;:::-;42283:8;42279:37;42266:11;42237:80;:::i;:::-;41896:431;;41881:446;41791:543;;;:::o;42340:117::-;42394:8;42444:5;42438:4;42434:16;42413:37;;42340:117;;;;:::o;42463:169::-;42507:6;42540:51;42588:1;42584:6;42576:5;42573:1;42569:13;42540:51;:::i;:::-;42536:56;42621:4;42615;42611:15;42601:25;;42514:118;42463:169;;;;:::o;42637:295::-;42713:4;42859:29;42884:3;42878:4;42859:29;:::i;:::-;42851:37;;42921:3;42918:1;42914:11;42908:4;42905:21;42897:29;;42637:295;;;;:::o;42937:1395::-;43054:37;43087:3;43054:37;:::i;:::-;43156:18;43148:6;43145:30;43142:56;;;43178:18;;:::i;:::-;43142:56;43222:38;43254:4;43248:11;43222:38;:::i;:::-;43307:67;43367:6;43359;43353:4;43307:67;:::i;:::-;43401:1;43425:4;43412:17;;43457:2;43449:6;43446:14;43474:1;43469:618;;;;44131:1;44148:6;44145:77;;;44197:9;44192:3;44188:19;44182:26;44173:35;;44145:77;44248:67;44308:6;44301:5;44248:67;:::i;:::-;44242:4;44235:81;44104:222;43439:887;;43469:618;43521:4;43517:9;43509:6;43505:22;43555:37;43587:4;43555:37;:::i;:::-;43614:1;43628:208;43642:7;43639:1;43636:14;43628:208;;;43721:9;43716:3;43712:19;43706:26;43698:6;43691:42;43772:1;43764:6;43760:14;43750:24;;43819:2;43808:9;43804:18;43791:31;;43665:4;43662:1;43658:12;43653:17;;43628:208;;;43864:6;43855:7;43852:19;43849:179;;;43922:9;43917:3;43913:19;43907:26;43965:48;44007:4;43999:6;43995:17;43984:9;43965:48;:::i;:::-;43957:6;43950:64;43872:156;43849:179;44074:1;44070;44062:6;44058:14;44054:22;44048:4;44041:36;43476:611;;;43439:887;;43029:1303;;;42937:1395;;:::o;44338:148::-;44440:11;44477:3;44462:18;;44338:148;;;;:::o;44492:390::-;44598:3;44626:39;44659:5;44626:39;:::i;:::-;44681:89;44763:6;44758:3;44681:89;:::i;:::-;44674:96;;44779:65;44837:6;44832:3;44825:4;44818:5;44814:16;44779:65;:::i;:::-;44869:6;44864:3;44860:16;44853:23;;44602:280;44492:390;;;;:::o;44888:435::-;45068:3;45090:95;45181:3;45172:6;45090:95;:::i;:::-;45083:102;;45202:95;45293:3;45284:6;45202:95;:::i;:::-;45195:102;;45314:3;45307:10;;44888:435;;;;;:::o;45329:172::-;45469:24;45465:1;45457:6;45453:14;45446:48;45329:172;:::o;45507:366::-;45649:3;45670:67;45734:2;45729:3;45670:67;:::i;:::-;45663:74;;45746:93;45835:3;45746:93;:::i;:::-;45864:2;45859:3;45855:12;45848:19;;45507:366;;;:::o;45879:419::-;46045:4;46083:2;46072:9;46068:18;46060:26;;46132:9;46126:4;46122:20;46118:1;46107:9;46103:17;46096:47;46160:131;46286:4;46160:131;:::i;:::-;46152:139;;45879:419;;;:::o;46304:172::-;46444:24;46440:1;46432:6;46428:14;46421:48;46304:172;:::o;46482:366::-;46624:3;46645:67;46709:2;46704:3;46645:67;:::i;:::-;46638:74;;46721:93;46810:3;46721:93;:::i;:::-;46839:2;46834:3;46830:12;46823:19;;46482:366;;;:::o;46854:419::-;47020:4;47058:2;47047:9;47043:18;47035:26;;47107:9;47101:4;47097:20;47093:1;47082:9;47078:17;47071:47;47135:131;47261:4;47135:131;:::i;:::-;47127:139;;46854:419;;;:::o;47279:180::-;47419:32;47415:1;47407:6;47403:14;47396:56;47279:180;:::o;47465:366::-;47607:3;47628:67;47692:2;47687:3;47628:67;:::i;:::-;47621:74;;47704:93;47793:3;47704:93;:::i;:::-;47822:2;47817:3;47813:12;47806:19;;47465:366;;;:::o;47837:419::-;48003:4;48041:2;48030:9;48026:18;48018:26;;48090:9;48084:4;48080:20;48076:1;48065:9;48061:17;48054:47;48118:131;48244:4;48118:131;:::i;:::-;48110:139;;47837:419;;;:::o;48262:225::-;48402:34;48398:1;48390:6;48386:14;48379:58;48471:8;48466:2;48458:6;48454:15;48447:33;48262:225;:::o;48493:366::-;48635:3;48656:67;48720:2;48715:3;48656:67;:::i;:::-;48649:74;;48732:93;48821:3;48732:93;:::i;:::-;48850:2;48845:3;48841:12;48834:19;;48493:366;;;:::o;48865:419::-;49031:4;49069:2;49058:9;49054:18;49046:26;;49118:9;49112:4;49108:20;49104:1;49093:9;49089:17;49082:47;49146:131;49272:4;49146:131;:::i;:::-;49138:139;;48865:419;;;:::o;49290:332::-;49411:4;49449:2;49438:9;49434:18;49426:26;;49462:71;49530:1;49519:9;49515:17;49506:6;49462:71;:::i;:::-;49543:72;49611:2;49600:9;49596:18;49587:6;49543:72;:::i;:::-;49290:332;;;;;:::o;49628:137::-;49682:5;49713:6;49707:13;49698:22;;49729:30;49753:5;49729:30;:::i;:::-;49628:137;;;;:::o;49771:345::-;49838:6;49887:2;49875:9;49866:7;49862:23;49858:32;49855:119;;;49893:79;;:::i;:::-;49855:119;50013:1;50038:61;50091:7;50082:6;50071:9;50067:22;50038:61;:::i;:::-;50028:71;;49984:125;49771:345;;;;:::o;50122:182::-;50262:34;50258:1;50250:6;50246:14;50239:58;50122:182;:::o;50310:366::-;50452:3;50473:67;50537:2;50532:3;50473:67;:::i;:::-;50466:74;;50549:93;50638:3;50549:93;:::i;:::-;50667:2;50662:3;50658:12;50651:19;;50310:366;;;:::o;50682:419::-;50848:4;50886:2;50875:9;50871:18;50863:26;;50935:9;50929:4;50925:20;50921:1;50910:9;50906:17;50899:47;50963:131;51089:4;50963:131;:::i;:::-;50955:139;;50682:419;;;:::o;51107:233::-;51146:3;51169:24;51187:5;51169:24;:::i;:::-;51160:33;;51215:66;51208:5;51205:77;51202:103;;51285:18;;:::i;:::-;51202:103;51332:1;51325:5;51321:13;51314:20;;51107:233;;;:::o;51346:98::-;51397:6;51431:5;51425:12;51415:22;;51346:98;;;:::o;51450:168::-;51533:11;51567:6;51562:3;51555:19;51607:4;51602:3;51598:14;51583:29;;51450:168;;;;:::o;51624:373::-;51710:3;51738:38;51770:5;51738:38;:::i;:::-;51792:70;51855:6;51850:3;51792:70;:::i;:::-;51785:77;;51871:65;51929:6;51924:3;51917:4;51910:5;51906:16;51871:65;:::i;:::-;51961:29;51983:6;51961:29;:::i;:::-;51956:3;51952:39;51945:46;;51714:283;51624:373;;;;:::o;52003:640::-;52198:4;52236:3;52225:9;52221:19;52213:27;;52250:71;52318:1;52307:9;52303:17;52294:6;52250:71;:::i;:::-;52331:72;52399:2;52388:9;52384:18;52375:6;52331:72;:::i;:::-;52413;52481:2;52470:9;52466:18;52457:6;52413:72;:::i;:::-;52532:9;52526:4;52522:20;52517:2;52506:9;52502:18;52495:48;52560:76;52631:4;52622:6;52560:76;:::i;:::-;52552:84;;52003:640;;;;;;;:::o;52649:141::-;52705:5;52736:6;52730:13;52721:22;;52752:32;52778:5;52752:32;:::i;:::-;52649:141;;;;:::o;52796:349::-;52865:6;52914:2;52902:9;52893:7;52889:23;52885:32;52882:119;;;52920:79;;:::i;:::-;52882:119;53040:1;53065:63;53120:7;53111:6;53100:9;53096:22;53065:63;:::i;:::-;53055:73;;53011:127;52796:349;;;;:::o
Swarm Source
ipfs://6388d7982754eb41a5e66c297b17a5b3e0828ee0376471d50df0a394475d9883
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.