Overview
ETH Balance
0.13 ETH
Eth Value
$495.28 (@ $3,809.87/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 136 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20646228 | 102 days ago | IN | 0 ETH | 0.0000721 | ||||
Safe Transfer Fr... | 18390358 | 418 days ago | IN | 0 ETH | 0.00053081 | ||||
Safe Transfer Fr... | 18389251 | 418 days ago | IN | 0 ETH | 0.00051955 | ||||
Public Mint | 16984784 | 616 days ago | IN | 0 ETH | 0.00380317 | ||||
Public Mint | 16945782 | 621 days ago | IN | 0 ETH | 0.00220911 | ||||
Safe Transfer Fr... | 16585579 | 672 days ago | IN | 0 ETH | 0.0035273 | ||||
Set Approval For... | 16543568 | 678 days ago | IN | 0 ETH | 0.00179059 | ||||
Safe Transfer Fr... | 16486061 | 686 days ago | IN | 0 ETH | 0.00125191 | ||||
Set Approval For... | 16486047 | 686 days ago | IN | 0 ETH | 0.00145072 | ||||
Safe Transfer Fr... | 16486034 | 686 days ago | IN | 0 ETH | 0.00149959 | ||||
Public Mint | 16480720 | 687 days ago | IN | 0 ETH | 0.00149781 | ||||
Public Mint | 16431236 | 693 days ago | IN | 0 ETH | 0.00189807 | ||||
Set Approval For... | 16428589 | 694 days ago | IN | 0 ETH | 0.00142372 | ||||
Public Mint | 16408264 | 697 days ago | IN | 0.005 ETH | 0.00209258 | ||||
Set Approval For... | 16375028 | 701 days ago | IN | 0 ETH | 0.0008614 | ||||
Public Mint | 16366588 | 702 days ago | IN | 0 ETH | 0.0012421 | ||||
Public Mint | 16363036 | 703 days ago | IN | 0.005 ETH | 0.00144717 | ||||
Public Mint | 16359653 | 703 days ago | IN | 0 ETH | 0.00123733 | ||||
Set Approval For... | 16355566 | 704 days ago | IN | 0 ETH | 0.00138509 | ||||
Public Mint | 16353249 | 704 days ago | IN | 0 ETH | 0.00119934 | ||||
Public Mint | 16349933 | 705 days ago | IN | 0 ETH | 0.00207162 | ||||
Set Approval For... | 16349063 | 705 days ago | IN | 0 ETH | 0.00156888 | ||||
Public Mint | 16347470 | 705 days ago | IN | 0 ETH | 0.00151032 | ||||
Public Mint | 16347083 | 705 days ago | IN | 0 ETH | 0.00156104 | ||||
Public Mint | 16346897 | 705 days ago | IN | 0 ETH | 0.00135485 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ToyApeKennelClub
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-05 */ // SPDX-License-Identifier: MIT // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/529cceeda9f5f8e28812c20042cc57626f784718/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/529cceeda9f5f8e28812c20042cc57626f784718/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @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. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); 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)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // 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) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } // File: https://github.com/ProjectOpenSea/operator-filter-registry/blob/529cceeda9f5f8e28812c20042cc57626f784718/src/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: contracts/ToyApeKennelClub.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @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; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. 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 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 { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _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]`. 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 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 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 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. 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`. ) 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 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 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 for 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) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild 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 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 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 for 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) { 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) } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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); } } pragma solidity ^0.8.9; enum ContractStatus { disable, whitelist, open } contract ToyApeKennelClub is DefaultOperatorFilterer, Ownable, ERC721A, ERC2981, ReentrancyGuard { bytes32 public rootHash = 0x15fe95d79678244fdf487ef03caada0a0273930894ececd9f9ffa666bb74710f; ContractStatus public CONTRACT_STATUS = ContractStatus.disable; uint96 public immutable ROYALTY_FEE_NUMERATOR = 750; uint256 public immutable MAX_FREE_PER_WALLET = 1; uint256 public immutable MAX_TX_PER_WALLET = 2; uint256 public immutable PRICE = 0.005 ether; uint256 public immutable TOTAL_SUPPLY = 1000; uint256 public immutable WHITELIST_TOTAL_SUPPLY = 1000; string public uriSuffix = '.json'; string internal baseURI = ""; modifier isEthAvailable(uint256 quantity) { require(msg.value >= getSalePrice(msg.sender, quantity), "Insufficient funds"); _; } modifier isMaxTxReached(uint256 quantity) { require(_numberMinted(msg.sender) + quantity <= MAX_TX_PER_WALLET, "Exceeded tx limit"); _; } modifier isSupplyUnavailable(uint256 quantity) { require(totalSupply() + quantity <= TOTAL_SUPPLY, "Max supply reached"); _; } modifier isUser() { require(tx.origin == msg.sender, "Invalid User"); _; } constructor() ERC721A("Toy Ape Kennel Club", "TAKC") { _setDefaultRoyalty(owner(), ROYALTY_FEE_NUMERATOR); } function getTotalSupplyLeft() public view returns (uint256) { return TOTAL_SUPPLY - totalSupply(); } function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { rootHash = _merkleRoot; } function isWhitelisted(bytes32[] memory merkleProof) public view returns (bool) { bytes memory encodedUserAddress = abi.encodePacked(msg.sender); bytes32 leaf = keccak256(encodedUserAddress); bool isProofValid = MerkleProof.verify(merkleProof, rootHash, leaf); return isProofValid; } function internalMint(address buyerAddress, uint256 quantity) external onlyOwner nonReentrant isUser isSupplyUnavailable(quantity) { _mint(buyerAddress, quantity); } function whitelistMint(uint256 quantity, bytes32[] memory merkleProof) public payable virtual nonReentrant isUser isSupplyUnavailable(quantity) isMaxTxReached(quantity) isEthAvailable(quantity) { require(CONTRACT_STATUS == ContractStatus.whitelist,"Not in whitelist mint stage"); require(totalSupply() + quantity <= WHITELIST_TOTAL_SUPPLY, "Max whitelist mint supply reached"); require(isWhitelisted(merkleProof), "Invalid Proof"); _mint(msg.sender, quantity); } function publicMint(uint256 quantity) public payable virtual nonReentrant isUser isSupplyUnavailable(quantity) isMaxTxReached(quantity) isEthAvailable(quantity) { require( CONTRACT_STATUS == ContractStatus.open, "Not in whitelist mint stage" ); _mint(msg.sender, quantity); } function getTotalMinted(address addr) public view returns (uint256) { return _numberMinted(addr); } function setBaseURI(string memory newURI) external virtual onlyOwner { baseURI = newURI; } function setStatus(ContractStatus status) external onlyOwner { CONTRACT_STATUS = status; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(_tokenId), uriSuffix)) : ''; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return ERC721A.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId) || super.supportsInterface(interfaceId); } function getSalePrice(address sender, uint256 quantity) private view returns (uint256) { bool isAlreadyMinted = _numberMinted(sender) > 0; return isAlreadyMinted ? PRICE * (quantity) : PRICE * (quantity - MAX_FREE_PER_WALLET); } function withdraw(uint256 balance)external onlyOwner nonReentrant isUser { (bool success, ) = msg.sender.call{value: balance}(""); require(success, "Transfer failed."); } function withdrawAll() external onlyOwner nonReentrant isUser { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
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":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","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":"CONTRACT_STATUS","outputs":[{"internalType":"enum ContractStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TX_PER_WALLET","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":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE_NUMERATOR","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","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":"addr","type":"address"}],"name":"getTotalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupplyLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyerAddress","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"internalMint","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"nonpayable","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":"nonpayable","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ContractStatus","name":"status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101406040527f15fe95d79678244fdf487ef03caada0a0273930894ececd9f9ffa666bb74710f60001b600c556000600d60006101000a81548160ff02191690836002811115620000555762000054620006d9565b5b02179055506102ee6bffffffffffffffffffffffff166080906bffffffffffffffffffffffff16815250600160a090815250600260c0908152506611c37937e0800060e0908152506103e8610100908152506103e8610120908152506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e9081620000f7919062000982565b5060405180602001604052806000815250600f908162000118919062000982565b503480156200012657600080fd5b506040518060400160405280601381526020017f546f7920417065204b656e6e656c20436c7562000000000000000000000000008152506040518060400160405280600481526020017f54414b4300000000000000000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200039f57801562000265576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200022b92919062000aae565b600060405180830381600087803b1580156200024657600080fd5b505af11580156200025b573d6000803e3d6000fd5b505050506200039e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200031f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002e592919062000aae565b600060405180830381600087803b1580156200030057600080fd5b505af115801562000315573d6000803e3d6000fd5b505050506200039d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000368919062000adb565b600060405180830381600087803b1580156200038357600080fd5b505af115801562000398573d6000803e3d6000fd5b505050505b5b5b5050620003c1620003b56200042e60201b60201c565b6200043660201b60201c565b8160039081620003d2919062000982565b508060049081620003e4919062000982565b50620003f5620004fa60201b60201c565b60018190555050506001600b8190555062000428620004196200050360201b60201c565b6080516200052c60201b60201c565b62000c13565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200053c620006cf60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200059d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005949062000b7f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200060f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006069062000bf1565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600960008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200078a57607f821691505b602082108103620007a0576200079f62000742565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200080a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007cb565b620008168683620007cb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620008636200085d62000857846200082e565b62000838565b6200082e565b9050919050565b6000819050919050565b6200087f8362000842565b620008976200088e826200086a565b848454620007d8565b825550505050565b600090565b620008ae6200089f565b620008bb81848462000874565b505050565b5b81811015620008e357620008d7600082620008a4565b600181019050620008c1565b5050565b601f8211156200093257620008fc81620007a6565b6200090784620007bb565b8101602085101562000917578190505b6200092f6200092685620007bb565b830182620008c0565b50505b505050565b600082821c905092915050565b6000620009576000198460080262000937565b1980831691505092915050565b600062000972838362000944565b9150826002028217905092915050565b6200098d8262000708565b67ffffffffffffffff811115620009a957620009a862000713565b5b620009b5825462000771565b620009c2828285620008e7565b600060209050601f831160018114620009fa5760008415620009e5578287015190505b620009f1858262000964565b86555062000a61565b601f19841662000a0a86620007a6565b60005b8281101562000a345784890151825560018201915060208501945060208101905062000a0d565b8683101562000a54578489015162000a50601f89168262000944565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a968262000a69565b9050919050565b62000aa88162000a89565b82525050565b600060408201905062000ac5600083018562000a9d565b62000ad4602083018462000a9d565b9392505050565b600060208201905062000af2600083018462000a9d565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000b67602a8362000af8565b915062000b748262000b09565b604082019050919050565b6000602082019050818103600083015262000b9a8162000b58565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000bd960198362000af8565b915062000be68262000ba1565b602082019050919050565b6000602082019050818103600083015262000c0c8162000bca565b9050919050565b60805160a05160c05160e0516101005161012051614c4262000ca960003960008181611ff901526120cf015260008181610fb8015281816113f20152818161196401528181611e4a01526120fd015260008181611917015281816128d8015261290901526000818161102e01528181611a1a0152611ec0015260008181611a3e01526128ac0152600061166e0152614c426000f3fe6080604052600436106102305760003560e01c806370a082311161012e5780639a9c1bb1116100ab578063d2cab0561161006f578063d2cab05614610831578063d64150d21461084d578063defcbacb14610878578063e985e9c5146108a3578063f2fde38b146108e057610230565b80639a9c1bb11461073a578063a22cb46514610777578063b88d4fde146107a0578063bf7b779c146107c9578063c87b56dd146107f457610230565b80638da5cb5b116100f25780638da5cb5b14610663578063902d55a51461068e57806395d89b41146106b9578063975e840e146106e457806398710d1e1461070f57610230565b806370a08231146105a4578063715018a6146105e15780637cb64759146105f8578063853828b6146106215780638d859f3e1461063857610230565b80632db11544116101bc57806342842e0e1161018057806342842e0e146104bf5780635503a0e8146104e857806355850fe61461051357806355f804b31461053e5780636352211e1461056757610230565b80632db11544146103fd5780632e1a7d4d146104195780632e49d78b1461044257806335001a1a1461046b57806341f434341461049457610230565b8063095ea7b311610203578063095ea7b31461031757806318160ddd146103405780631d80009a1461036b57806323b872dd146103965780632a55205a146103bf57610230565b806301ffc9a714610235578063069824fb1461027257806306fdde03146102af578063081812fc146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906134b3565b610909565b60405161026991906134fb565b60405180910390f35b34801561027e57600080fd5b50610299600480360381019061029491906136a5565b61093b565b6040516102a691906134fb565b60405180910390f35b3480156102bb57600080fd5b506102c4610988565b6040516102d1919061376d565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906137c5565b610a1a565b60405161030e9190613833565b60405180910390f35b34801561032357600080fd5b5061033e6004803603810190610339919061387a565b610a99565b005b34801561034c57600080fd5b50610355610ba3565b60405161036291906138c9565b60405180910390f35b34801561037757600080fd5b50610380610bba565b60405161038d91906138f3565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b8919061390e565b610bc0565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190613961565b610d10565b6040516103f49291906139a1565b60405180910390f35b610417600480360381019061041291906137c5565b610efa565b005b34801561042557600080fd5b50610440600480360381019061043b91906137c5565b61117c565b005b34801561044e57600080fd5b50610469600480360381019061046491906139ef565b6112f7565b005b34801561047757600080fd5b50610492600480360381019061048d919061387a565b61132c565b005b3480156104a057600080fd5b506104a961147c565b6040516104b69190613a7b565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e1919061390e565b61148e565b005b3480156104f457600080fd5b506104fd6115de565b60405161050a919061376d565b60405180910390f35b34801561051f57600080fd5b5061052861166c565b6040516105359190613abd565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613b8d565b611690565b005b34801561057357600080fd5b5061058e600480360381019061058991906137c5565b6116ab565b60405161059b9190613833565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613bd6565b6116bd565b6040516105d891906138c9565b60405180910390f35b3480156105ed57600080fd5b506105f6611775565b005b34801561060457600080fd5b5061061f600480360381019061061a9190613c03565b611789565b005b34801561062d57600080fd5b5061063661179b565b005b34801561064457600080fd5b5061064d611915565b60405161065a91906138c9565b60405180910390f35b34801561066f57600080fd5b50610678611939565b6040516106859190613833565b60405180910390f35b34801561069a57600080fd5b506106a3611962565b6040516106b091906138c9565b60405180910390f35b3480156106c557600080fd5b506106ce611986565b6040516106db919061376d565b60405180910390f35b3480156106f057600080fd5b506106f9611a18565b60405161070691906138c9565b60405180910390f35b34801561071b57600080fd5b50610724611a3c565b60405161073191906138c9565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613bd6565b611a60565b60405161076e91906138c9565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190613c5c565b611a72565b005b3480156107ac57600080fd5b506107c760048036038101906107c29190613d3d565b611b7c565b005b3480156107d557600080fd5b506107de611ccf565b6040516107eb9190613e37565b60405180910390f35b34801561080057600080fd5b5061081b600480360381019061081691906137c5565b611ce2565b604051610828919061376d565b60405180910390f35b61084b60048036038101906108469190613e52565b611d8c565b005b34801561085957600080fd5b506108626120cd565b60405161086f91906138c9565b60405180910390f35b34801561088457600080fd5b5061088d6120f1565b60405161089a91906138c9565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613eae565b61212b565b6040516108d791906134fb565b60405180910390f35b3480156108ec57600080fd5b5061090760048036038101906109029190613bd6565b6121bf565b005b600061091482612242565b806109245750610923826122d4565b5b806109345750610933826122d4565b5b9050919050565b6000803360405160200161094f9190613f36565b6040516020818303038152906040529050600081805190602001209050600061097b85600c548461234e565b9050809350505050919050565b60606003805461099790613f80565b80601f01602080910402602001604051908101604052809291908181526020018280546109c390613f80565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2582612365565b610a5b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b94576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b11929190613fb1565b602060405180830381865afa158015610b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b529190613fef565b610b9357806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b8a9190613833565b60405180910390fd5b5b610b9e83836123c4565b505050565b6000610bad612508565b6002546001540303905090565b600c5481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cfe573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c3257610c2d848484612511565b610d0a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c7b929190613fb1565b602060405180830381865afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190613fef565b610cfd57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cf49190613833565b60405180910390fd5b5b610d09848484612511565b5b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ea55760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eaf612833565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610edb919061404b565b610ee591906140bc565b90508160000151819350935050509250929050565b6002600b5403610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906141a5565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000000000000000081610fe0610ba3565b610fea91906141c5565b111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290614245565b60405180910390fd5b817f0000000000000000000000000000000000000000000000000000000000000000816110573361283d565b61106191906141c5565b11156110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906142b1565b60405180910390fd5b826110ad3382612894565b3410156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e69061431d565b60405180910390fd5b60028081111561110257611101613dc0565b5b600d60009054906101000a900460ff16600281111561112457611123613dc0565b5b14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614389565b60405180910390fd5b61116e338561293c565b5050506001600b8190555050565b611184612af8565b6002600b54036111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461123f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611236906141a5565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051611265906143da565b60006040518083038185875af1925050503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50509050806112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e29061443b565b60405180910390fd5b506001600b8190555050565b6112ff612af8565b80600d60006101000a81548160ff0219169083600281111561132457611323613dc0565b5b021790555050565b611334612af8565b6002600b5403611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e6906141a5565b60405180910390fd5b807f00000000000000000000000000000000000000000000000000000000000000008161141a610ba3565b61142491906141c5565b1115611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c90614245565b60405180910390fd5b61146f838361293c565b506001600b819055505050565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115cc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611500576114fb848484612b76565b6115d8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611549929190613fb1565b602060405180830381865afa158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190613fef565b6115cb57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115c29190613833565b60405180910390fd5b5b6115d7848484612b76565b5b50505050565b600e80546115eb90613f80565b80601f016020809104026020016040519081016040528092919081815260200182805461161790613f80565b80156116645780601f1061163957610100808354040283529160200191611664565b820191906000526020600020905b81548152906001019060200180831161164757829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b611698612af8565b80600f90816116a791906145fd565b5050565b60006116b682612b96565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611724576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61177d612af8565b6117876000612c62565b565b611791612af8565b80600c8190555050565b6117a3612af8565b6002600b54036117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611855906141a5565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611884906143da565b60006040518083038185875af1925050503d80600081146118c1576040519150601f19603f3d011682016040523d82523d6000602084013e6118c6565b606091505b505090508061190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119019061443b565b60405180910390fd5b506001600b81905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606004805461199590613f80565b80601f01602080910402602001604051908101604052809291908181526020018280546119c190613f80565b8015611a0e5780601f106119e357610100808354040283529160200191611a0e565b820191906000526020600020905b8154815290600101906020018083116119f157829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611a6b8261283d565b9050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611b6d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611aea929190613fb1565b602060405180830381865afa158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190613fef565b611b6c57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b639190613833565b60405180910390fd5b5b611b778383612d26565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cbb573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bef57611bea85858585612e9d565b611cc8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c38929190613fb1565b602060405180830381865afa158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c799190613fef565b611cba57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611cb19190613833565b60405180910390fd5b5b611cc785858585612e9d565b5b5050505050565b600d60009054906101000a900460ff1681565b6060611ced82612365565b611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614741565b60405180910390fd5b6000611d36612f10565b90506000815111611d565760405180602001604052806000815250611d84565b80611d6084612fa2565b600e604051602001611d7493929190614820565b6040516020818303038152906040525b915050919050565b6002600b5403611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc890614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e906141a5565b60405180910390fd5b817f000000000000000000000000000000000000000000000000000000000000000081611e72610ba3565b611e7c91906141c5565b1115611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb490614245565b60405180910390fd5b827f000000000000000000000000000000000000000000000000000000000000000081611ee93361283d565b611ef391906141c5565b1115611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906142b1565b60405180910390fd5b83611f3f3382612894565b341015611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f789061431d565b60405180910390fd5b60016002811115611f9557611f94613dc0565b5b600d60009054906101000a900460ff166002811115611fb757611fb6613dc0565b5b14611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90614389565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000085612021610ba3565b61202b91906141c5565b111561206c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612063906148c3565b60405180910390fd5b6120758461093b565b6120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061492f565b60405180910390fd5b6120be338661293c565b5050506001600b819055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006120fb610ba3565b7f0000000000000000000000000000000000000000000000000000000000000000612126919061494f565b905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121c7612af8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d906149f5565b60405180910390fd5b61223f81612c62565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061229d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122cd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612347575061234682613102565b5b9050919050565b60008261235b858461316c565b1490509392505050565b600081612370612508565b1115801561237f575060015482105b80156123bd575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60006123cf826116ab565b90508073ffffffffffffffffffffffffffffffffffffffff166123f06131c2565b73ffffffffffffffffffffffffffffffffffffffff16146124535761241c816124176131c2565b61212b565b612452576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061251c82612b96565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612583576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061258f846131ca565b915091506125a581876125a06131c2565b6131f1565b6125f1576125ba866125b56131c2565b61212b565b6125f0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612657576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126648686866001613235565b801561266f57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061273d8561271988888761323b565b7c020000000000000000000000000000000000000000000000000000000017613263565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036127c357600060018501905060006005600083815260200190815260200160002054036127c15760015481146127c0578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461282b868686600161328e565b505050505050565b6000612710905090565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060006128a28561283d565b11905080612906577f0000000000000000000000000000000000000000000000000000000000000000836128d6919061494f565b7f0000000000000000000000000000000000000000000000000000000000000000612901919061404b565b612933565b827f0000000000000000000000000000000000000000000000000000000000000000612932919061404b565b5b91505092915050565b600060015490506000820361297d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61298a6000848385613235565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a01836129f2600086600061323b565b6129fb85613294565b17613263565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612aa257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612a67565b5060008203612add576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612af3600084838561328e565b505050565b612b006132a4565b73ffffffffffffffffffffffffffffffffffffffff16612b1e611939565b73ffffffffffffffffffffffffffffffffffffffff1614612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614a61565b60405180910390fd5b565b612b9183838360405180602001604052806000815250611b7c565b505050565b60008082905080612ba5612508565b11612c2b57600154811015612c2a5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612c28575b60008103612c1e576005600083600190039350838152602001908152602001600020549050612bf4565b8092505050612c5d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d2e6131c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d92576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000612d9f6131c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612e4c6131c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e9191906134fb565b60405180910390a35050565b612ea8848484610bc0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f0a57612ed3848484846132ac565b612f09576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600f8054612f1f90613f80565b80601f0160208091040260200160405190810160405280929190818152602001828054612f4b90613f80565b8015612f985780601f10612f6d57610100808354040283529160200191612f98565b820191906000526020600020905b815481529060010190602001808311612f7b57829003601f168201915b5050505050905090565b606060008203612fe9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130fd565b600082905060005b6000821461301b57808061300490614a81565b915050600a8261301491906140bc565b9150612ff1565b60008167ffffffffffffffff8111156130375761303661352c565b5b6040519080825280601f01601f1916602001820160405280156130695781602001600182028036833780820191505090505b5090505b600085146130f657600182613082919061494f565b9150600a856130919190614ac9565b603061309d91906141c5565b60f81b8183815181106130b3576130b2614afa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130ef91906140bc565b945061306d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b84518110156131b7576131a28286838151811061319557613194614afa565b5b60200260200101516133fc565b915080806131af90614a81565b915050613175565b508091505092915050565b600033905090565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613252868684613427565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132d26131c2565b8786866040518563ffffffff1660e01b81526004016132f49493929190614b7e565b6020604051808303816000875af192505050801561333057506040513d601f19601f8201168201806040525081019061332d9190614bdf565b60015b6133a9573d8060008114613360576040519150601f19603f3d011682016040523d82523d6000602084013e613365565b606091505b5060008151036133a1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008183106134145761340f8284613430565b61341f565b61341e8383613430565b5b905092915050565b60009392505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134908161345b565b811461349b57600080fd5b50565b6000813590506134ad81613487565b92915050565b6000602082840312156134c9576134c8613451565b5b60006134d78482850161349e565b91505092915050565b60008115159050919050565b6134f5816134e0565b82525050565b600060208201905061351060008301846134ec565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135648261351b565b810181811067ffffffffffffffff821117156135835761358261352c565b5b80604052505050565b6000613596613447565b90506135a2828261355b565b919050565b600067ffffffffffffffff8211156135c2576135c161352c565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6135eb816135d8565b81146135f657600080fd5b50565b600081359050613608816135e2565b92915050565b600061362161361c846135a7565b61358c565b90508083825260208201905060208402830185811115613644576136436135d3565b5b835b8181101561366d578061365988826135f9565b845260208401935050602081019050613646565b5050509392505050565b600082601f83011261368c5761368b613516565b5b813561369c84826020860161360e565b91505092915050565b6000602082840312156136bb576136ba613451565b5b600082013567ffffffffffffffff8111156136d9576136d8613456565b5b6136e584828501613677565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561372857808201518184015260208101905061370d565b60008484015250505050565b600061373f826136ee565b61374981856136f9565b935061375981856020860161370a565b6137628161351b565b840191505092915050565b600060208201905081810360008301526137878184613734565b905092915050565b6000819050919050565b6137a28161378f565b81146137ad57600080fd5b50565b6000813590506137bf81613799565b92915050565b6000602082840312156137db576137da613451565b5b60006137e9848285016137b0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061381d826137f2565b9050919050565b61382d81613812565b82525050565b60006020820190506138486000830184613824565b92915050565b61385781613812565b811461386257600080fd5b50565b6000813590506138748161384e565b92915050565b6000806040838503121561389157613890613451565b5b600061389f85828601613865565b92505060206138b0858286016137b0565b9150509250929050565b6138c38161378f565b82525050565b60006020820190506138de60008301846138ba565b92915050565b6138ed816135d8565b82525050565b600060208201905061390860008301846138e4565b92915050565b60008060006060848603121561392757613926613451565b5b600061393586828701613865565b935050602061394686828701613865565b9250506040613957868287016137b0565b9150509250925092565b6000806040838503121561397857613977613451565b5b6000613986858286016137b0565b9250506020613997858286016137b0565b9150509250929050565b60006040820190506139b66000830185613824565b6139c360208301846138ba565b9392505050565b600381106139d757600080fd5b50565b6000813590506139e9816139ca565b92915050565b600060208284031215613a0557613a04613451565b5b6000613a13848285016139da565b91505092915050565b6000819050919050565b6000613a41613a3c613a37846137f2565b613a1c565b6137f2565b9050919050565b6000613a5382613a26565b9050919050565b6000613a6582613a48565b9050919050565b613a7581613a5a565b82525050565b6000602082019050613a906000830184613a6c565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ab781613a96565b82525050565b6000602082019050613ad26000830184613aae565b92915050565b600080fd5b600067ffffffffffffffff821115613af857613af761352c565b5b613b018261351b565b9050602081019050919050565b82818337600083830152505050565b6000613b30613b2b84613add565b61358c565b905082815260208101848484011115613b4c57613b4b613ad8565b5b613b57848285613b0e565b509392505050565b600082601f830112613b7457613b73613516565b5b8135613b84848260208601613b1d565b91505092915050565b600060208284031215613ba357613ba2613451565b5b600082013567ffffffffffffffff811115613bc157613bc0613456565b5b613bcd84828501613b5f565b91505092915050565b600060208284031215613bec57613beb613451565b5b6000613bfa84828501613865565b91505092915050565b600060208284031215613c1957613c18613451565b5b6000613c27848285016135f9565b91505092915050565b613c39816134e0565b8114613c4457600080fd5b50565b600081359050613c5681613c30565b92915050565b60008060408385031215613c7357613c72613451565b5b6000613c8185828601613865565b9250506020613c9285828601613c47565b9150509250929050565b600067ffffffffffffffff821115613cb757613cb661352c565b5b613cc08261351b565b9050602081019050919050565b6000613ce0613cdb84613c9c565b61358c565b905082815260208101848484011115613cfc57613cfb613ad8565b5b613d07848285613b0e565b509392505050565b600082601f830112613d2457613d23613516565b5b8135613d34848260208601613ccd565b91505092915050565b60008060008060808587031215613d5757613d56613451565b5b6000613d6587828801613865565b9450506020613d7687828801613865565b9350506040613d87878288016137b0565b925050606085013567ffffffffffffffff811115613da857613da7613456565b5b613db487828801613d0f565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613e0057613dff613dc0565b5b50565b6000819050613e1182613def565b919050565b6000613e2182613e03565b9050919050565b613e3181613e16565b82525050565b6000602082019050613e4c6000830184613e28565b92915050565b60008060408385031215613e6957613e68613451565b5b6000613e77858286016137b0565b925050602083013567ffffffffffffffff811115613e9857613e97613456565b5b613ea485828601613677565b9150509250929050565b60008060408385031215613ec557613ec4613451565b5b6000613ed385828601613865565b9250506020613ee485828601613865565b9150509250929050565b60008160601b9050919050565b6000613f0682613eee565b9050919050565b6000613f1882613efb565b9050919050565b613f30613f2b82613812565b613f0d565b82525050565b6000613f428284613f1f565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f9857607f821691505b602082108103613fab57613faa613f51565b5b50919050565b6000604082019050613fc66000830185613824565b613fd36020830184613824565b9392505050565b600081519050613fe981613c30565b92915050565b60006020828403121561400557614004613451565b5b600061401384828501613fda565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140568261378f565b91506140618361378f565b925082820261406f8161378f565b915082820484148315176140865761408561401c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140c78261378f565b91506140d28361378f565b9250826140e2576140e161408d565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614123601f836136f9565b915061412e826140ed565b602082019050919050565b6000602082019050818103600083015261415281614116565b9050919050565b7f496e76616c696420557365720000000000000000000000000000000000000000600082015250565b600061418f600c836136f9565b915061419a82614159565b602082019050919050565b600060208201905081810360008301526141be81614182565b9050919050565b60006141d08261378f565b91506141db8361378f565b92508282019050808211156141f3576141f261401c565b5b92915050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b600061422f6012836136f9565b915061423a826141f9565b602082019050919050565b6000602082019050818103600083015261425e81614222565b9050919050565b7f4578636565646564207478206c696d6974000000000000000000000000000000600082015250565b600061429b6011836136f9565b91506142a682614265565b602082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006143076012836136f9565b9150614312826142d1565b602082019050919050565b60006020820190508181036000830152614336816142fa565b9050919050565b7f4e6f7420696e2077686974656c697374206d696e742073746167650000000000600082015250565b6000614373601b836136f9565b915061437e8261433d565b602082019050919050565b600060208201905081810360008301526143a281614366565b9050919050565b600081905092915050565b50565b60006143c46000836143a9565b91506143cf826143b4565b600082019050919050565b60006143e5826143b7565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006144256010836136f9565b9150614430826143ef565b602082019050919050565b6000602082019050818103600083015261445481614418565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144bd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614480565b6144c78683614480565b95508019841693508086168417925050509392505050565b60006144fa6144f56144f08461378f565b613a1c565b61378f565b9050919050565b6000819050919050565b614514836144df565b61452861452082614501565b84845461448d565b825550505050565b600090565b61453d614530565b61454881848461450b565b505050565b5b8181101561456c57614561600082614535565b60018101905061454e565b5050565b601f8211156145b1576145828161445b565b61458b84614470565b8101602085101561459a578190505b6145ae6145a685614470565b83018261454d565b50505b505050565b600082821c905092915050565b60006145d4600019846008026145b6565b1980831691505092915050565b60006145ed83836145c3565b9150826002028217905092915050565b614606826136ee565b67ffffffffffffffff81111561461f5761461e61352c565b5b6146298254613f80565b614634828285614570565b600060209050601f8311600181146146675760008415614655578287015190505b61465f85826145e1565b8655506146c7565b601f1984166146758661445b565b60005b8281101561469d57848901518255600182019150602085019450602081019050614678565b868310156146ba57848901516146b6601f8916826145c3565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061472b602f836136f9565b9150614736826146cf565b604082019050919050565b6000602082019050818103600083015261475a8161471e565b9050919050565b600081905092915050565b6000614777826136ee565b6147818185614761565b935061479181856020860161370a565b80840191505092915050565b600081546147aa81613f80565b6147b48186614761565b945060018216600081146147cf57600181146147e457614817565b60ff1983168652811515820286019350614817565b6147ed8561445b565b60005b8381101561480f578154818901526001820191506020810190506147f0565b838801955050505b50505092915050565b600061482c828661476c565b9150614838828561476c565b9150614844828461479d565b9150819050949350505050565b7f4d61782077686974656c697374206d696e7420737570706c792072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ad6021836136f9565b91506148b882614851565b604082019050919050565b600060208201905081810360008301526148dc816148a0565b9050919050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b6000614919600d836136f9565b9150614924826148e3565b602082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600061495a8261378f565b91506149658361378f565b925082820390508181111561497d5761497c61401c565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149df6026836136f9565b91506149ea82614983565b604082019050919050565b60006020820190508181036000830152614a0e816149d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a4b6020836136f9565b9150614a5682614a15565b602082019050919050565b60006020820190508181036000830152614a7a81614a3e565b9050919050565b6000614a8c8261378f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614abe57614abd61401c565b5b600182019050919050565b6000614ad48261378f565b9150614adf8361378f565b925082614aef57614aee61408d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614b5082614b29565b614b5a8185614b34565b9350614b6a81856020860161370a565b614b738161351b565b840191505092915050565b6000608082019050614b936000830187613824565b614ba06020830186613824565b614bad60408301856138ba565b8181036060830152614bbf8184614b45565b905095945050505050565b600081519050614bd981613487565b92915050565b600060208284031215614bf557614bf4613451565b5b6000614c0384828501614bca565b9150509291505056fea264697066735822122028bbc891c6bdb4a53848d637e4200731edb9fe37c6be32e10045f9dbfa35821964736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102305760003560e01c806370a082311161012e5780639a9c1bb1116100ab578063d2cab0561161006f578063d2cab05614610831578063d64150d21461084d578063defcbacb14610878578063e985e9c5146108a3578063f2fde38b146108e057610230565b80639a9c1bb11461073a578063a22cb46514610777578063b88d4fde146107a0578063bf7b779c146107c9578063c87b56dd146107f457610230565b80638da5cb5b116100f25780638da5cb5b14610663578063902d55a51461068e57806395d89b41146106b9578063975e840e146106e457806398710d1e1461070f57610230565b806370a08231146105a4578063715018a6146105e15780637cb64759146105f8578063853828b6146106215780638d859f3e1461063857610230565b80632db11544116101bc57806342842e0e1161018057806342842e0e146104bf5780635503a0e8146104e857806355850fe61461051357806355f804b31461053e5780636352211e1461056757610230565b80632db11544146103fd5780632e1a7d4d146104195780632e49d78b1461044257806335001a1a1461046b57806341f434341461049457610230565b8063095ea7b311610203578063095ea7b31461031757806318160ddd146103405780631d80009a1461036b57806323b872dd146103965780632a55205a146103bf57610230565b806301ffc9a714610235578063069824fb1461027257806306fdde03146102af578063081812fc146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906134b3565b610909565b60405161026991906134fb565b60405180910390f35b34801561027e57600080fd5b50610299600480360381019061029491906136a5565b61093b565b6040516102a691906134fb565b60405180910390f35b3480156102bb57600080fd5b506102c4610988565b6040516102d1919061376d565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906137c5565b610a1a565b60405161030e9190613833565b60405180910390f35b34801561032357600080fd5b5061033e6004803603810190610339919061387a565b610a99565b005b34801561034c57600080fd5b50610355610ba3565b60405161036291906138c9565b60405180910390f35b34801561037757600080fd5b50610380610bba565b60405161038d91906138f3565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b8919061390e565b610bc0565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190613961565b610d10565b6040516103f49291906139a1565b60405180910390f35b610417600480360381019061041291906137c5565b610efa565b005b34801561042557600080fd5b50610440600480360381019061043b91906137c5565b61117c565b005b34801561044e57600080fd5b50610469600480360381019061046491906139ef565b6112f7565b005b34801561047757600080fd5b50610492600480360381019061048d919061387a565b61132c565b005b3480156104a057600080fd5b506104a961147c565b6040516104b69190613a7b565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e1919061390e565b61148e565b005b3480156104f457600080fd5b506104fd6115de565b60405161050a919061376d565b60405180910390f35b34801561051f57600080fd5b5061052861166c565b6040516105359190613abd565b60405180910390f35b34801561054a57600080fd5b5061056560048036038101906105609190613b8d565b611690565b005b34801561057357600080fd5b5061058e600480360381019061058991906137c5565b6116ab565b60405161059b9190613833565b60405180910390f35b3480156105b057600080fd5b506105cb60048036038101906105c69190613bd6565b6116bd565b6040516105d891906138c9565b60405180910390f35b3480156105ed57600080fd5b506105f6611775565b005b34801561060457600080fd5b5061061f600480360381019061061a9190613c03565b611789565b005b34801561062d57600080fd5b5061063661179b565b005b34801561064457600080fd5b5061064d611915565b60405161065a91906138c9565b60405180910390f35b34801561066f57600080fd5b50610678611939565b6040516106859190613833565b60405180910390f35b34801561069a57600080fd5b506106a3611962565b6040516106b091906138c9565b60405180910390f35b3480156106c557600080fd5b506106ce611986565b6040516106db919061376d565b60405180910390f35b3480156106f057600080fd5b506106f9611a18565b60405161070691906138c9565b60405180910390f35b34801561071b57600080fd5b50610724611a3c565b60405161073191906138c9565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c9190613bd6565b611a60565b60405161076e91906138c9565b60405180910390f35b34801561078357600080fd5b5061079e60048036038101906107999190613c5c565b611a72565b005b3480156107ac57600080fd5b506107c760048036038101906107c29190613d3d565b611b7c565b005b3480156107d557600080fd5b506107de611ccf565b6040516107eb9190613e37565b60405180910390f35b34801561080057600080fd5b5061081b600480360381019061081691906137c5565b611ce2565b604051610828919061376d565b60405180910390f35b61084b60048036038101906108469190613e52565b611d8c565b005b34801561085957600080fd5b506108626120cd565b60405161086f91906138c9565b60405180910390f35b34801561088457600080fd5b5061088d6120f1565b60405161089a91906138c9565b60405180910390f35b3480156108af57600080fd5b506108ca60048036038101906108c59190613eae565b61212b565b6040516108d791906134fb565b60405180910390f35b3480156108ec57600080fd5b5061090760048036038101906109029190613bd6565b6121bf565b005b600061091482612242565b806109245750610923826122d4565b5b806109345750610933826122d4565b5b9050919050565b6000803360405160200161094f9190613f36565b6040516020818303038152906040529050600081805190602001209050600061097b85600c548461234e565b9050809350505050919050565b60606003805461099790613f80565b80601f01602080910402602001604051908101604052809291908181526020018280546109c390613f80565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2582612365565b610a5b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b94576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b11929190613fb1565b602060405180830381865afa158015610b2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b529190613fef565b610b9357806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b8a9190613833565b60405180910390fd5b5b610b9e83836123c4565b505050565b6000610bad612508565b6002546001540303905090565b600c5481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610cfe573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c3257610c2d848484612511565b610d0a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c7b929190613fb1565b602060405180830381865afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190613fef565b610cfd57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610cf49190613833565b60405180910390fd5b5b610d09848484612511565b5b50505050565b6000806000600a60008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ea55760096040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610eaf612833565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610edb919061404b565b610ee591906140bc565b90508160000151819350935050509250929050565b6002600b5403610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906141a5565b60405180910390fd5b807f00000000000000000000000000000000000000000000000000000000000003e881610fe0610ba3565b610fea91906141c5565b111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290614245565b60405180910390fd5b817f0000000000000000000000000000000000000000000000000000000000000002816110573361283d565b61106191906141c5565b11156110a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611099906142b1565b60405180910390fd5b826110ad3382612894565b3410156110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e69061431d565b60405180910390fd5b60028081111561110257611101613dc0565b5b600d60009054906101000a900460ff16600281111561112457611123613dc0565b5b14611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614389565b60405180910390fd5b61116e338561293c565b5050506001600b8190555050565b611184612af8565b6002600b54036111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461123f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611236906141a5565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1682604051611265906143da565b60006040518083038185875af1925050503d80600081146112a2576040519150601f19603f3d011682016040523d82523d6000602084013e6112a7565b606091505b50509050806112eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e29061443b565b60405180910390fd5b506001600b8190555050565b6112ff612af8565b80600d60006101000a81548160ff0219169083600281111561132457611323613dc0565b5b021790555050565b611334612af8565b6002600b5403611379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137090614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e6906141a5565b60405180910390fd5b807f00000000000000000000000000000000000000000000000000000000000003e88161141a610ba3565b61142491906141c5565b1115611465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145c90614245565b60405180910390fd5b61146f838361293c565b506001600b819055505050565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115cc573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611500576114fb848484612b76565b6115d8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611549929190613fb1565b602060405180830381865afa158015611566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158a9190613fef565b6115cb57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115c29190613833565b60405180910390fd5b5b6115d7848484612b76565b5b50505050565b600e80546115eb90613f80565b80601f016020809104026020016040519081016040528092919081815260200182805461161790613f80565b80156116645780601f1061163957610100808354040283529160200191611664565b820191906000526020600020905b81548152906001019060200180831161164757829003601f168201915b505050505081565b7f00000000000000000000000000000000000000000000000000000000000002ee81565b611698612af8565b80600f90816116a791906145fd565b5050565b60006116b682612b96565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611724576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61177d612af8565b6117876000612c62565b565b611791612af8565b80600c8190555050565b6117a3612af8565b6002600b54036117e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117df90614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461185e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611855906141a5565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611884906143da565b60006040518083038185875af1925050503d80600081146118c1576040519150601f19603f3d011682016040523d82523d6000602084013e6118c6565b606091505b505090508061190a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119019061443b565b60405180910390fd5b506001600b81905550565b7f0000000000000000000000000000000000000000000000000011c37937e0800081565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f00000000000000000000000000000000000000000000000000000000000003e881565b60606004805461199590613f80565b80601f01602080910402602001604051908101604052809291908181526020018280546119c190613f80565b8015611a0e5780601f106119e357610100808354040283529160200191611a0e565b820191906000526020600020905b8154815290600101906020018083116119f157829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000281565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000611a6b8261283d565b9050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611b6d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611aea929190613fb1565b602060405180830381865afa158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190613fef565b611b6c57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b639190613833565b60405180910390fd5b5b611b778383612d26565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611cbb573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bef57611bea85858585612e9d565b611cc8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611c38929190613fb1565b602060405180830381865afa158015611c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c799190613fef565b611cba57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611cb19190613833565b60405180910390fd5b5b611cc785858585612e9d565b5b5050505050565b600d60009054906101000a900460ff1681565b6060611ced82612365565b611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614741565b60405180910390fd5b6000611d36612f10565b90506000815111611d565760405180602001604052806000815250611d84565b80611d6084612fa2565b600e604051602001611d7493929190614820565b6040516020818303038152906040525b915050919050565b6002600b5403611dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc890614139565b60405180910390fd5b6002600b819055503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611e47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3e906141a5565b60405180910390fd5b817f00000000000000000000000000000000000000000000000000000000000003e881611e72610ba3565b611e7c91906141c5565b1115611ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb490614245565b60405180910390fd5b827f000000000000000000000000000000000000000000000000000000000000000281611ee93361283d565b611ef391906141c5565b1115611f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2b906142b1565b60405180910390fd5b83611f3f3382612894565b341015611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f789061431d565b60405180910390fd5b60016002811115611f9557611f94613dc0565b5b600d60009054906101000a900460ff166002811115611fb757611fb6613dc0565b5b14611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90614389565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e885612021610ba3565b61202b91906141c5565b111561206c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612063906148c3565b60405180910390fd5b6120758461093b565b6120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061492f565b60405180910390fd5b6120be338661293c565b5050506001600b819055505050565b7f00000000000000000000000000000000000000000000000000000000000003e881565b60006120fb610ba3565b7f00000000000000000000000000000000000000000000000000000000000003e8612126919061494f565b905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121c7612af8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d906149f5565b60405180910390fd5b61223f81612c62565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061229d57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806122cd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612347575061234682613102565b5b9050919050565b60008261235b858461316c565b1490509392505050565b600081612370612508565b1115801561237f575060015482105b80156123bd575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b60006123cf826116ab565b90508073ffffffffffffffffffffffffffffffffffffffff166123f06131c2565b73ffffffffffffffffffffffffffffffffffffffff16146124535761241c816124176131c2565b61212b565b612452576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061251c82612b96565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612583576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061258f846131ca565b915091506125a581876125a06131c2565b6131f1565b6125f1576125ba866125b56131c2565b61212b565b6125f0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612657576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126648686866001613235565b801561266f57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061273d8561271988888761323b565b7c020000000000000000000000000000000000000000000000000000000017613263565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036127c357600060018501905060006005600083815260200190815260200160002054036127c15760015481146127c0578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461282b868686600161328e565b505050505050565b6000612710905090565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060006128a28561283d565b11905080612906577f0000000000000000000000000000000000000000000000000000000000000001836128d6919061494f565b7f0000000000000000000000000000000000000000000000000011c37937e08000612901919061404b565b612933565b827f0000000000000000000000000000000000000000000000000011c37937e08000612932919061404b565b5b91505092915050565b600060015490506000820361297d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61298a6000848385613235565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612a01836129f2600086600061323b565b6129fb85613294565b17613263565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612aa257808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612a67565b5060008203612add576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612af3600084838561328e565b505050565b612b006132a4565b73ffffffffffffffffffffffffffffffffffffffff16612b1e611939565b73ffffffffffffffffffffffffffffffffffffffff1614612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614a61565b60405180910390fd5b565b612b9183838360405180602001604052806000815250611b7c565b505050565b60008082905080612ba5612508565b11612c2b57600154811015612c2a5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612c28575b60008103612c1e576005600083600190039350838152602001908152602001600020549050612bf4565b8092505050612c5d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d2e6131c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d92576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000612d9f6131c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612e4c6131c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e9191906134fb565b60405180910390a35050565b612ea8848484610bc0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f0a57612ed3848484846132ac565b612f09576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600f8054612f1f90613f80565b80601f0160208091040260200160405190810160405280929190818152602001828054612f4b90613f80565b8015612f985780601f10612f6d57610100808354040283529160200191612f98565b820191906000526020600020905b815481529060010190602001808311612f7b57829003601f168201915b5050505050905090565b606060008203612fe9576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130fd565b600082905060005b6000821461301b57808061300490614a81565b915050600a8261301491906140bc565b9150612ff1565b60008167ffffffffffffffff8111156130375761303661352c565b5b6040519080825280601f01601f1916602001820160405280156130695781602001600182028036833780820191505090505b5090505b600085146130f657600182613082919061494f565b9150600a856130919190614ac9565b603061309d91906141c5565b60f81b8183815181106130b3576130b2614afa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130ef91906140bc565b945061306d565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b84518110156131b7576131a28286838151811061319557613194614afa565b5b60200260200101516133fc565b915080806131af90614a81565b915050613175565b508091505092915050565b600033905090565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613252868684613427565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026132d26131c2565b8786866040518563ffffffff1660e01b81526004016132f49493929190614b7e565b6020604051808303816000875af192505050801561333057506040513d601f19601f8201168201806040525081019061332d9190614bdf565b60015b6133a9573d8060008114613360576040519150601f19603f3d011682016040523d82523d6000602084013e613365565b606091505b5060008151036133a1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008183106134145761340f8284613430565b61341f565b61341e8383613430565b5b905092915050565b60009392505050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134908161345b565b811461349b57600080fd5b50565b6000813590506134ad81613487565b92915050565b6000602082840312156134c9576134c8613451565b5b60006134d78482850161349e565b91505092915050565b60008115159050919050565b6134f5816134e0565b82525050565b600060208201905061351060008301846134ec565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135648261351b565b810181811067ffffffffffffffff821117156135835761358261352c565b5b80604052505050565b6000613596613447565b90506135a2828261355b565b919050565b600067ffffffffffffffff8211156135c2576135c161352c565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b6135eb816135d8565b81146135f657600080fd5b50565b600081359050613608816135e2565b92915050565b600061362161361c846135a7565b61358c565b90508083825260208201905060208402830185811115613644576136436135d3565b5b835b8181101561366d578061365988826135f9565b845260208401935050602081019050613646565b5050509392505050565b600082601f83011261368c5761368b613516565b5b813561369c84826020860161360e565b91505092915050565b6000602082840312156136bb576136ba613451565b5b600082013567ffffffffffffffff8111156136d9576136d8613456565b5b6136e584828501613677565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561372857808201518184015260208101905061370d565b60008484015250505050565b600061373f826136ee565b61374981856136f9565b935061375981856020860161370a565b6137628161351b565b840191505092915050565b600060208201905081810360008301526137878184613734565b905092915050565b6000819050919050565b6137a28161378f565b81146137ad57600080fd5b50565b6000813590506137bf81613799565b92915050565b6000602082840312156137db576137da613451565b5b60006137e9848285016137b0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061381d826137f2565b9050919050565b61382d81613812565b82525050565b60006020820190506138486000830184613824565b92915050565b61385781613812565b811461386257600080fd5b50565b6000813590506138748161384e565b92915050565b6000806040838503121561389157613890613451565b5b600061389f85828601613865565b92505060206138b0858286016137b0565b9150509250929050565b6138c38161378f565b82525050565b60006020820190506138de60008301846138ba565b92915050565b6138ed816135d8565b82525050565b600060208201905061390860008301846138e4565b92915050565b60008060006060848603121561392757613926613451565b5b600061393586828701613865565b935050602061394686828701613865565b9250506040613957868287016137b0565b9150509250925092565b6000806040838503121561397857613977613451565b5b6000613986858286016137b0565b9250506020613997858286016137b0565b9150509250929050565b60006040820190506139b66000830185613824565b6139c360208301846138ba565b9392505050565b600381106139d757600080fd5b50565b6000813590506139e9816139ca565b92915050565b600060208284031215613a0557613a04613451565b5b6000613a13848285016139da565b91505092915050565b6000819050919050565b6000613a41613a3c613a37846137f2565b613a1c565b6137f2565b9050919050565b6000613a5382613a26565b9050919050565b6000613a6582613a48565b9050919050565b613a7581613a5a565b82525050565b6000602082019050613a906000830184613a6c565b92915050565b60006bffffffffffffffffffffffff82169050919050565b613ab781613a96565b82525050565b6000602082019050613ad26000830184613aae565b92915050565b600080fd5b600067ffffffffffffffff821115613af857613af761352c565b5b613b018261351b565b9050602081019050919050565b82818337600083830152505050565b6000613b30613b2b84613add565b61358c565b905082815260208101848484011115613b4c57613b4b613ad8565b5b613b57848285613b0e565b509392505050565b600082601f830112613b7457613b73613516565b5b8135613b84848260208601613b1d565b91505092915050565b600060208284031215613ba357613ba2613451565b5b600082013567ffffffffffffffff811115613bc157613bc0613456565b5b613bcd84828501613b5f565b91505092915050565b600060208284031215613bec57613beb613451565b5b6000613bfa84828501613865565b91505092915050565b600060208284031215613c1957613c18613451565b5b6000613c27848285016135f9565b91505092915050565b613c39816134e0565b8114613c4457600080fd5b50565b600081359050613c5681613c30565b92915050565b60008060408385031215613c7357613c72613451565b5b6000613c8185828601613865565b9250506020613c9285828601613c47565b9150509250929050565b600067ffffffffffffffff821115613cb757613cb661352c565b5b613cc08261351b565b9050602081019050919050565b6000613ce0613cdb84613c9c565b61358c565b905082815260208101848484011115613cfc57613cfb613ad8565b5b613d07848285613b0e565b509392505050565b600082601f830112613d2457613d23613516565b5b8135613d34848260208601613ccd565b91505092915050565b60008060008060808587031215613d5757613d56613451565b5b6000613d6587828801613865565b9450506020613d7687828801613865565b9350506040613d87878288016137b0565b925050606085013567ffffffffffffffff811115613da857613da7613456565b5b613db487828801613d0f565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613e0057613dff613dc0565b5b50565b6000819050613e1182613def565b919050565b6000613e2182613e03565b9050919050565b613e3181613e16565b82525050565b6000602082019050613e4c6000830184613e28565b92915050565b60008060408385031215613e6957613e68613451565b5b6000613e77858286016137b0565b925050602083013567ffffffffffffffff811115613e9857613e97613456565b5b613ea485828601613677565b9150509250929050565b60008060408385031215613ec557613ec4613451565b5b6000613ed385828601613865565b9250506020613ee485828601613865565b9150509250929050565b60008160601b9050919050565b6000613f0682613eee565b9050919050565b6000613f1882613efb565b9050919050565b613f30613f2b82613812565b613f0d565b82525050565b6000613f428284613f1f565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f9857607f821691505b602082108103613fab57613faa613f51565b5b50919050565b6000604082019050613fc66000830185613824565b613fd36020830184613824565b9392505050565b600081519050613fe981613c30565b92915050565b60006020828403121561400557614004613451565b5b600061401384828501613fda565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006140568261378f565b91506140618361378f565b925082820261406f8161378f565b915082820484148315176140865761408561401c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006140c78261378f565b91506140d28361378f565b9250826140e2576140e161408d565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614123601f836136f9565b915061412e826140ed565b602082019050919050565b6000602082019050818103600083015261415281614116565b9050919050565b7f496e76616c696420557365720000000000000000000000000000000000000000600082015250565b600061418f600c836136f9565b915061419a82614159565b602082019050919050565b600060208201905081810360008301526141be81614182565b9050919050565b60006141d08261378f565b91506141db8361378f565b92508282019050808211156141f3576141f261401c565b5b92915050565b7f4d617820737570706c7920726561636865640000000000000000000000000000600082015250565b600061422f6012836136f9565b915061423a826141f9565b602082019050919050565b6000602082019050818103600083015261425e81614222565b9050919050565b7f4578636565646564207478206c696d6974000000000000000000000000000000600082015250565b600061429b6011836136f9565b91506142a682614265565b602082019050919050565b600060208201905081810360008301526142ca8161428e565b9050919050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b60006143076012836136f9565b9150614312826142d1565b602082019050919050565b60006020820190508181036000830152614336816142fa565b9050919050565b7f4e6f7420696e2077686974656c697374206d696e742073746167650000000000600082015250565b6000614373601b836136f9565b915061437e8261433d565b602082019050919050565b600060208201905081810360008301526143a281614366565b9050919050565b600081905092915050565b50565b60006143c46000836143a9565b91506143cf826143b4565b600082019050919050565b60006143e5826143b7565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006144256010836136f9565b9150614430826143ef565b602082019050919050565b6000602082019050818103600083015261445481614418565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144bd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614480565b6144c78683614480565b95508019841693508086168417925050509392505050565b60006144fa6144f56144f08461378f565b613a1c565b61378f565b9050919050565b6000819050919050565b614514836144df565b61452861452082614501565b84845461448d565b825550505050565b600090565b61453d614530565b61454881848461450b565b505050565b5b8181101561456c57614561600082614535565b60018101905061454e565b5050565b601f8211156145b1576145828161445b565b61458b84614470565b8101602085101561459a578190505b6145ae6145a685614470565b83018261454d565b50505b505050565b600082821c905092915050565b60006145d4600019846008026145b6565b1980831691505092915050565b60006145ed83836145c3565b9150826002028217905092915050565b614606826136ee565b67ffffffffffffffff81111561461f5761461e61352c565b5b6146298254613f80565b614634828285614570565b600060209050601f8311600181146146675760008415614655578287015190505b61465f85826145e1565b8655506146c7565b601f1984166146758661445b565b60005b8281101561469d57848901518255600182019150602085019450602081019050614678565b868310156146ba57848901516146b6601f8916826145c3565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061472b602f836136f9565b9150614736826146cf565b604082019050919050565b6000602082019050818103600083015261475a8161471e565b9050919050565b600081905092915050565b6000614777826136ee565b6147818185614761565b935061479181856020860161370a565b80840191505092915050565b600081546147aa81613f80565b6147b48186614761565b945060018216600081146147cf57600181146147e457614817565b60ff1983168652811515820286019350614817565b6147ed8561445b565b60005b8381101561480f578154818901526001820191506020810190506147f0565b838801955050505b50505092915050565b600061482c828661476c565b9150614838828561476c565b9150614844828461479d565b9150819050949350505050565b7f4d61782077686974656c697374206d696e7420737570706c792072656163686560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006148ad6021836136f9565b91506148b882614851565b604082019050919050565b600060208201905081810360008301526148dc816148a0565b9050919050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b6000614919600d836136f9565b9150614924826148e3565b602082019050919050565b600060208201905081810360008301526149488161490c565b9050919050565b600061495a8261378f565b91506149658361378f565b925082820390508181111561497d5761497c61401c565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149df6026836136f9565b91506149ea82614983565b604082019050919050565b60006020820190508181036000830152614a0e816149d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614a4b6020836136f9565b9150614a5682614a15565b602082019050919050565b60006020820190508181036000830152614a7a81614a3e565b9050919050565b6000614a8c8261378f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614abe57614abd61401c565b5b600182019050919050565b6000614ad48261378f565b9150614adf8361378f565b925082614aef57614aee61408d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614b5082614b29565b614b5a8185614b34565b9350614b6a81856020860161370a565b614b738161351b565b840191505092915050565b6000608082019050614b936000830187613824565b614ba06020830186613824565b614bad60408301856138ba565b8181036060830152614bbf8184614b45565b905095945050505050565b600081519050614bd981613487565b92915050565b600060208284031215614bf557614bf4613451565b5b6000614c0384828501614bca565b9150509291505056fea264697066735822122028bbc891c6bdb4a53848d637e4200731edb9fe37c6be32e10045f9dbfa35821964736f6c63430008110033
Deployed Bytecode Sourcemap
81022:6303:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85294:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82785:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27334:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33817:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86579:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23085:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81127:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86744:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74807:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;83978:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85986:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84663:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83151:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3122:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86915:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81639:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81308:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84551:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28727:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24269:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80080:103;;;;;;;;;;;;;:::i;:::-;;82675:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86189:198;;;;;;;;;;;;;:::i;:::-;;81476:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79432:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81527:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27510:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81423:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81368:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84398:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86395:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87094:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81237:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84884:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83388:582;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81578:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82437:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34840:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80338:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85294:344;85442:4;85484:38;85510:11;85484:25;:38::i;:::-;:93;;;;85539:38;85565:11;85539:25;:38::i;:::-;85484:93;:146;;;;85594:36;85618:11;85594:23;:36::i;:::-;85484:146;85464:166;;85294:344;;;:::o;82785:358::-;82886:4;82908:31;82959:10;82942:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;82908:62;;82981:12;83006:18;82996:29;;;;;;82981:44;;83036:17;83056:47;83075:11;83088:8;;83098:4;83056:18;:47::i;:::-;83036:67;;83123:12;83116:19;;;;;82785:358;;;:::o;27334:100::-;27388:13;27421:5;27414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27334:100;:::o;33817:218::-;33893:7;33918:16;33926:7;33918;:16::i;:::-;33913:64;;33943:34;;;;;;;;;;;;;;33913:64;33997:15;:24;34013:7;33997:24;;;;;;;;;;;:30;;;;;;;;;;;;33990:37;;33817:218;;;:::o;86579:157::-;86675:8;5164:1;3222:42;5116:45;;;:49;5112:225;;;3222:42;5187;;;5238:4;5245:8;5187:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5182:144;;5301:8;5282:28;;;;;;;;;;;:::i;:::-;;;;;;;;5182:144;5112:225;86696:32:::1;86710:8;86720:7;86696:13;:32::i;:::-;86579:157:::0;;;:::o;23085:323::-;23146:7;23374:15;:13;:15::i;:::-;23359:12;;23343:13;;:28;:46;23336:53;;23085:323;:::o;81127:101::-;;;;:::o;86744:163::-;86845:4;4418:1;3222:42;4370:45;;;:49;4366:539;;;4659:10;4651:18;;:4;:18;;;4647:85;;86862:37:::1;86881:4;86887:2;86891:7;86862:18;:37::i;:::-;4710:7:::0;;4647:85;3222:42;4751;;;4802:4;4809:10;4751:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4746:148;;4867:10;4848:30;;;;;;;;;;;:::i;:::-;;;;;;;;4746:148;4366:539;86862:37:::1;86881:4;86887:2;86891:7;86862:18;:37::i;:::-;86744:163:::0;;;;;:::o;74807:442::-;74904:7;74913;74933:26;74962:17;:27;74980:8;74962:27;;;;;;;;;;;74933:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75034:1;75006:30;;:7;:16;;;:30;;;75002:92;;75063:19;75053:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75002:92;75106:21;75171:17;:15;:17::i;:::-;75130:58;;75144:7;:23;;;75131:36;;:10;:36;;;;:::i;:::-;75130:58;;;;:::i;:::-;75106:82;;75209:7;:16;;;75227:13;75201:40;;;;;;74807:442;;;;;:::o;83978:412::-;69360:1;69958:7;;:19;69950:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;69360:1;70091:7;:18;;;;82252:10:::1;82239:23;;:9;:23;;;82231:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;84133:8:::2;82139:12;82127:8;82111:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;82103:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;84167:8:::3;81978:17;81966:8;81938:25;81952:10;81938:13;:25::i;:::-;:36;;;;:::i;:::-;:57;;81930:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;84201:8:::4;81792:34;81805:10;81817:8;81792:12;:34::i;:::-;81779:9;:47;;81771:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;84268:19:::5;84249:38:::0;::::5;;;;;;;:::i;:::-;;:15;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;84227:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;84355:27;84361:10;84373:8;84355:5;:27::i;:::-;82028:1:::4;82185::::3;82290::::2;69316::::0;70270:7;:22;;;;83978:412;:::o;85986:195::-;79318:13;:11;:13::i;:::-;69360:1:::1;69958:7;;:19:::0;69950:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69360:1;70091:7;:18;;;;82252:10:::2;82239:23;;:9;:23;;;82231:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;86071:12:::3;86089:10;:15;;86112:7;86089:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86070:54;;;86145:7;86137:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;86059:122;69316:1:::1;70270:7;:22;;;;85986:195:::0;:::o;84663:104::-;79318:13;:11;:13::i;:::-;84753:6:::1;84735:15;;:24;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;84663:104:::0;:::o;83151:229::-;79318:13;:11;:13::i;:::-;69360:1:::1;69958:7;;:19:::0;69950:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69360:1;70091:7;:18;;;;82252:10:::2;82239:23;;:9;:23;;;82231:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;83317:8:::3;82139:12;82127:8;82111:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;82103:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;83343:29:::4;83349:12;83363:8;83343:5;:29::i;:::-;82290:1:::3;69316::::1;70270:7;:22;;;;83151:229:::0;;:::o;3122:143::-;3222:42;3122:143;:::o;86915:171::-;87020:4;4418:1;3222:42;4370:45;;;:49;4366:539;;;4659:10;4651:18;;:4;:18;;;4647:85;;87037:41:::1;87060:4;87066:2;87070:7;87037:22;:41::i;:::-;4710:7:::0;;4647:85;3222:42;4751;;;4802:4;4809:10;4751:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4746:148;;4867:10;4848:30;;;;;;;;;;;:::i;:::-;;;;;;;;4746:148;4366:539;87037:41:::1;87060:4;87066:2;87070:7;87037:22;:41::i;:::-;86915:171:::0;;;;;:::o;81639:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;81308:51::-;;;:::o;84551:104::-;79318:13;:11;:13::i;:::-;84641:6:::1;84631:7;:16;;;;;;:::i;:::-;;84551:104:::0;:::o;28727:152::-;28799:7;28842:27;28861:7;28842:18;:27::i;:::-;28819:52;;28727:152;;;:::o;24269:233::-;24341:7;24382:1;24365:19;;:5;:19;;;24361:60;;24393:28;;;;;;;;;;;;;;24361:60;18428:13;24439:18;:25;24458:5;24439:25;;;;;;;;;;;;;;;;:55;24432:62;;24269:233;;;:::o;80080:103::-;79318:13;:11;:13::i;:::-;80145:30:::1;80172:1;80145:18;:30::i;:::-;80080:103::o:0;82675:102::-;79318:13;:11;:13::i;:::-;82758:11:::1;82747:8;:22;;;;82675:102:::0;:::o;86189:198::-;79318:13;:11;:13::i;:::-;69360:1:::1;69958:7;;:19:::0;69950:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;69360:1;70091:7;:18;;;;82252:10:::2;82239:23;;:9;:23;;;82231:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;86263:12:::3;86281:10;:15;;86304:21;86281:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86262:68;;;86351:7;86343:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;86251:136;69316:1:::1;70270:7;:22;;;;86189:198::o:0;81476:44::-;;;:::o;79432:87::-;79478:7;79505:6;;;;;;;;;;;79498:13;;79432:87;:::o;81527:44::-;;;:::o;27510:104::-;27566:13;27599:7;27592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27510:104;:::o;81423:46::-;;;:::o;81368:48::-;;;:::o;84398:145::-;84484:7;84516:19;84530:4;84516:13;:19::i;:::-;84509:26;;84398:145;;;:::o;86395:176::-;86499:8;5164:1;3222:42;5116:45;;;:49;5112:225;;;3222:42;5187;;;5238:4;5245:8;5187:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5182:144;;5301:8;5282:28;;;;;;;;;;;:::i;:::-;;;;;;;;5182:144;5112:225;86520:43:::1;86544:8;86554;86520:23;:43::i;:::-;86395:176:::0;;;:::o;87094:228::-;87245:4;4418:1;3222:42;4370:45;;;:49;4366:539;;;4659:10;4651:18;;:4;:18;;;4647:85;;87267:47:::1;87290:4;87296:2;87300:7;87309:4;87267:22;:47::i;:::-;4710:7:::0;;4647:85;3222:42;4751;;;4802:4;4809:10;4751:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4746:148;;4867:10;4848:30;;;;;;;;;;;:::i;:::-;;;;;;;;4746:148;4366:539;87267:47:::1;87290:4;87296:2;87300:7;87309:4;87267:22;:47::i;:::-;87094:228:::0;;;;;;:::o;81237:62::-;;;;;;;;;;;;;:::o;84884:402::-;84958:13;84992:17;85000:8;84992:7;:17::i;:::-;84984:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;85074:28;85105:10;:8;:10::i;:::-;85074:41;;85164:1;85139:14;85133:28;:32;:145;;;;;;;;;;;;;;;;;85205:14;85221:26;85238:8;85221:16;:26::i;:::-;85249:9;85188:71;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85133:145;85126:152;;;84884:402;;;:::o;83388:582::-;69360:1;69958:7;;:19;69950:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;69360:1;70091:7;:18;;;;82252:10:::1;82239:23;;:9;:23;;;82231:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;83576:8:::2;82139:12;82127:8;82111:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;82103:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;83610:8:::3;81978:17;81966:8;81938:25;81952:10;81938:13;:25::i;:::-;:36;;;;:::i;:::-;:57;;81930:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;83644:8:::4;81792:34;81805:10;81817:8;81792:12;:34::i;:::-;81779:9;:47;;81771:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;83697:24:::5;83678:43;;;;;;;;:::i;:::-;;:15;;;;;;;;;;;:43;;;;;;;;:::i;:::-;;;83670:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;83799:22;83787:8;83771:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:50;;83763:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;83878:26;83892:11;83878:13;:26::i;:::-;83870:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;83935:27;83941:10;83953:8;83935:5;:27::i;:::-;82028:1:::4;82185::::3;82290::::2;69316::::0;70270:7;:22;;;;83388:582;;:::o;81578:54::-;;;:::o;82437:114::-;82488:7;82530:13;:11;:13::i;:::-;82515:12;:28;;;;:::i;:::-;82508:35;;82437:114;:::o;34840:164::-;34937:4;34961:18;:25;34980:5;34961:25;;;;;;;;;;;;;;;:35;34987:8;34961:35;;;;;;;;;;;;;;;;;;;;;;;;;34954:42;;34840:164;;;;:::o;80338:201::-;79318:13;:11;:13::i;:::-;80447:1:::1;80427:22;;:8;:22;;::::0;80419:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;80503:28;80522:8;80503:18;:28::i;:::-;80338:201:::0;:::o;26432:639::-;26517:4;26856:10;26841:25;;:11;:25;;;;:102;;;;26933:10;26918:25;;:11;:25;;;;26841:102;:179;;;;27010:10;26995:25;;:11;:25;;;;26841:179;26821:199;;26432:639;;;:::o;74537:215::-;74639:4;74678:26;74663:41;;;:11;:41;;;;:81;;;;74708:36;74732:11;74708:23;:36::i;:::-;74663:81;74656:88;;74537:215;;;:::o;60042:190::-;60167:4;60220;60191:25;60204:5;60211:4;60191:12;:25::i;:::-;:33;60184:40;;60042:190;;;;;:::o;35262:282::-;35327:4;35383:7;35364:15;:13;:15::i;:::-;:26;;:66;;;;;35417:13;;35407:7;:23;35364:66;:153;;;;;35516:1;19204:8;35468:17;:26;35486:7;35468:26;;;;;;;;;;;;:44;:49;35364:153;35344:173;;35262:282;;;:::o;33258:400::-;33339:13;33355:16;33363:7;33355;:16::i;:::-;33339:32;;33411:5;33388:28;;:19;:17;:19::i;:::-;:28;;;33384:175;;33436:44;33453:5;33460:19;:17;:19::i;:::-;33436:16;:44::i;:::-;33431:128;;33508:35;;;;;;;;;;;;;;33431:128;33384:175;33604:2;33571:15;:24;33587:7;33571:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33642:7;33638:2;33622:28;;33631:5;33622:28;;;;;;;;;;;;33328:330;33258:400;;:::o;84775:101::-;84840:7;84867:1;84860:8;;84775:101;:::o;37524:2817::-;37658:27;37688;37707:7;37688:18;:27::i;:::-;37658:57;;37773:4;37732:45;;37748:19;37732:45;;;37728:86;;37786:28;;;;;;;;;;;;;;37728:86;37828:27;37857:23;37884:35;37911:7;37884:26;:35::i;:::-;37827:92;;;;38019:68;38044:15;38061:4;38067:19;:17;:19::i;:::-;38019:24;:68::i;:::-;38014:180;;38107:43;38124:4;38130:19;:17;:19::i;:::-;38107:16;:43::i;:::-;38102:92;;38159:35;;;;;;;;;;;;;;38102:92;38014:180;38225:1;38211:16;;:2;:16;;;38207:52;;38236:23;;;;;;;;;;;;;;38207:52;38272:43;38294:4;38300:2;38304:7;38313:1;38272:21;:43::i;:::-;38408:15;38405:160;;;38548:1;38527:19;38520:30;38405:160;38945:18;:24;38964:4;38945:24;;;;;;;;;;;;;;;;38943:26;;;;;;;;;;;;39014:18;:22;39033:2;39014:22;;;;;;;;;;;;;;;;39012:24;;;;;;;;;;;39336:146;39373:2;39422:45;39437:4;39443:2;39447:19;39422:14;:45::i;:::-;19484:8;39394:73;39336:18;:146::i;:::-;39307:17;:26;39325:7;39307:26;;;;;;;;;;;:175;;;;39653:1;19484:8;39602:19;:47;:52;39598:627;;39675:19;39707:1;39697:7;:11;39675:33;;39864:1;39830:17;:30;39848:11;39830:30;;;;;;;;;;;;:35;39826:384;;39968:13;;39953:11;:28;39949:242;;40148:19;40115:17;:30;40133:11;40115:30;;;;;;;;;;;:52;;;;39949:242;39826:384;39656:569;39598:627;40272:7;40268:2;40253:27;;40262:4;40253:27;;;;;;;;;;;;40291:42;40312:4;40318:2;40322:7;40331:1;40291:20;:42::i;:::-;37647:2694;;;37524:2817;;;:::o;75531:97::-;75589:6;75615:5;75608:12;;75531:97;:::o;24584:178::-;24645:7;18428:13;18566:2;24673:18;:25;24692:5;24673:25;;;;;;;;;;;;;;;;:50;;24672:82;24665:89;;24584:178;;;:::o;85646:332::-;85751:7;85776:20;85823:1;85799:21;85813:6;85799:13;:21::i;:::-;:25;85776:48;;85857:15;:113;;85950:19;85939:8;:30;;;;:::i;:::-;85930:5;:40;;;;:::i;:::-;85857:113;;;85901:8;85892:5;:18;;;;:::i;:::-;85857:113;85837:133;;;85646:332;;;;:::o;44881:2454::-;44954:20;44977:13;;44954:36;;45017:1;45005:8;:13;45001:44;;45027:18;;;;;;;;;;;;;;45001:44;45058:61;45088:1;45092:2;45096:12;45110:8;45058:21;:61::i;:::-;45602:1;18566:2;45572:1;:26;;45571:32;45559:8;:45;45533:18;:22;45552:2;45533:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;45881:139;45918:2;45972:33;45995:1;45999:2;46003:1;45972:14;:33::i;:::-;45939:30;45960:8;45939:20;:30::i;:::-;:66;45881:18;:139::i;:::-;45847:17;:31;45865:12;45847:31;;;;;;;;;;;:173;;;;46037:16;46068:11;46097:8;46082:12;:23;46068:37;;46352:16;46348:2;46344:25;46332:37;;46724:12;46684:8;46643:1;46581:25;46522:1;46461;46434:335;46849:1;46835:12;46831:20;46789:346;46890:3;46881:7;46878:16;46789:346;;47108:7;47098:8;47095:1;47068:25;47065:1;47062;47057:59;46943:1;46934:7;46930:15;46919:26;;46789:346;;;46793:77;47180:1;47168:8;:13;47164:45;;47190:19;;;;;;;;;;;;;;47164:45;47242:3;47226:13;:19;;;;45307:1950;;47267:60;47296:1;47300:2;47304:12;47318:8;47267:20;:60::i;:::-;44943:2392;44881:2454;;:::o;79597:132::-;79672:12;:10;:12::i;:::-;79661:23;;:7;:5;:7::i;:::-;:23;;;79653:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79597:132::o;40437:185::-;40575:39;40592:4;40598:2;40602:7;40575:39;;;;;;;;;;;;:16;:39::i;:::-;40437:185;;;:::o;29882:1275::-;29949:7;29969:12;29984:7;29969:22;;30052:4;30033:15;:13;:15::i;:::-;:23;30029:1061;;30086:13;;30079:4;:20;30075:1015;;;30124:14;30141:17;:23;30159:4;30141:23;;;;;;;;;;;;30124:40;;30258:1;19204:8;30230:6;:24;:29;30226:845;;30895:113;30912:1;30902:6;:11;30895:113;;30955:17;:25;30973:6;;;;;;;30955:25;;;;;;;;;;;;30946:34;;30895:113;;;31041:6;31034:13;;;;;;30226:845;30101:989;30075:1015;30029:1061;31118:31;;;;;;;;;;;;;;29882:1275;;;;:::o;80699:191::-;80773:16;80792:6;;;;;;;;;;;80773:25;;80818:8;80809:6;;:17;;;;;;;;;;;;;;;;;;80873:8;80842:40;;80863:8;80842:40;;;;;;;;;;;;80762:128;80699:191;:::o;34375:308::-;34486:19;:17;:19::i;:::-;34474:31;;:8;:31;;;34470:61;;34514:17;;;;;;;;;;;;;;34470:61;34596:8;34544:18;:39;34563:19;:17;:19::i;:::-;34544:39;;;;;;;;;;;;;;;:49;34584:8;34544:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;34656:8;34620:55;;34635:19;:17;:19::i;:::-;34620:55;;;34666:8;34620:55;;;;;;:::i;:::-;;;;;;;;34375:308;;:::o;41220:399::-;41387:31;41400:4;41406:2;41410:7;41387:12;:31::i;:::-;41451:1;41433:2;:14;;;:19;41429:183;;41472:56;41503:4;41509:2;41513:7;41522:5;41472:30;:56::i;:::-;41467:145;;41556:40;;;;;;;;;;;;;;41467:145;41429:183;41220:399;;;;:::o;82559:108::-;82619:13;82652:7;82645:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82559:108;:::o;6238:723::-;6294:13;6524:1;6515:5;:10;6511:53;;6542:10;;;;;;;;;;;;;;;;;;;;;6511:53;6574:12;6589:5;6574:20;;6605:14;6630:78;6645:1;6637:4;:9;6630:78;;6663:8;;;;;:::i;:::-;;;;6694:2;6686:10;;;;;:::i;:::-;;;6630:78;;;6718:19;6750:6;6740:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6718:39;;6768:154;6784:1;6775:5;:10;6768:154;;6812:1;6802:11;;;;;:::i;:::-;;;6879:2;6871:5;:10;;;;:::i;:::-;6858:2;:24;;;;:::i;:::-;6845:39;;6828:6;6835;6828:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6908:2;6899:11;;;;;:::i;:::-;;;6768:154;;;6946:6;6932:21;;;;;6238:723;;;;:::o;72089:157::-;72174:4;72213:25;72198:40;;;:11;:40;;;;72191:47;;72089:157;;;:::o;60909:296::-;60992:7;61012:20;61035:4;61012:27;;61055:9;61050:118;61074:5;:12;61070:1;:16;61050:118;;;61123:33;61133:12;61147:5;61153:1;61147:8;;;;;;;;:::i;:::-;;;;;;;;61123:9;:33::i;:::-;61108:48;;61088:3;;;;;:::i;:::-;;;;61050:118;;;;61185:12;61178:19;;;60909:296;;;;:::o;57028:105::-;57088:7;57115:10;57108:17;;57028:105;:::o;36425:479::-;36527:27;36556:23;36597:38;36638:15;:24;36654:7;36638:24;;;;;;;;;;;36597:65;;36809:18;36786:41;;36866:19;36860:26;36841:45;;36771:126;36425:479;;;:::o;35653:659::-;35802:11;35967:16;35960:5;35956:28;35947:37;;36127:16;36116:9;36112:32;36099:45;;36277:15;36266:9;36263:30;36255:5;36244:9;36241:20;36238:56;36228:66;;35653:659;;;;;:::o;42281:159::-;;;;;:::o;56337:311::-;56472:7;56492:16;19608:3;56518:19;:41;;56492:68;;19608:3;56586:31;56597:4;56603:2;56607:9;56586:10;:31::i;:::-;56578:40;;:62;;56571:69;;;56337:311;;;;;:::o;31705:450::-;31785:14;31953:16;31946:5;31942:28;31933:37;;32130:5;32116:11;32091:23;32087:41;32084:52;32077:5;32074:63;32064:73;;31705:450;;;;:::o;43105:158::-;;;;;:::o;32257:324::-;32327:14;32560:1;32550:8;32547:15;32521:24;32517:46;32507:56;;32257:324;;;:::o;77983:98::-;78036:7;78063:10;78056:17;;77983:98;:::o;43703:716::-;43866:4;43912:2;43887:45;;;43933:19;:17;:19::i;:::-;43954:4;43960:7;43969:5;43887:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43883:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44187:1;44170:6;:13;:18;44166:235;;44216:40;;;;;;;;;;;;;;44166:235;44359:6;44353:13;44344:6;44340:2;44336:15;44329:38;43883:529;44056:54;;;44046:64;;;:6;:64;;;;44039:71;;;43703:716;;;;;;:::o;67116:149::-;67179:7;67210:1;67206;:5;:51;;67237:20;67252:1;67255;67237:14;:20::i;:::-;67206:51;;;67214:20;67229:1;67232;67214:14;:20::i;:::-;67206:51;67199:58;;67116:149;;;;:::o;56038:147::-;56175:6;56038:147;;;;;:::o;67273:268::-;67341:13;67448:1;67442:4;67435:15;67477:1;67471:4;67464:15;67518:4;67512;67502:21;67493:30;;67273:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:102;1682:6;1733:2;1729:7;1724:2;1717:5;1713:14;1709:28;1699:38;;1641:102;;;:::o;1749:180::-;1797:77;1794:1;1787:88;1894:4;1891:1;1884:15;1918:4;1915:1;1908:15;1935:281;2018:27;2040:4;2018:27;:::i;:::-;2010:6;2006:40;2148:6;2136:10;2133:22;2112:18;2100:10;2097:34;2094:62;2091:88;;;2159:18;;:::i;:::-;2091:88;2199:10;2195:2;2188:22;1978:238;1935:281;;:::o;2222:129::-;2256:6;2283:20;;:::i;:::-;2273:30;;2312:33;2340:4;2332:6;2312:33;:::i;:::-;2222:129;;;:::o;2357:311::-;2434:4;2524:18;2516:6;2513:30;2510:56;;;2546:18;;:::i;:::-;2510:56;2596:4;2588:6;2584:17;2576:25;;2656:4;2650;2646:15;2638:23;;2357:311;;;:::o;2674:117::-;2783:1;2780;2773:12;2797:77;2834:7;2863:5;2852:16;;2797:77;;;:::o;2880:122::-;2953:24;2971:5;2953:24;:::i;:::-;2946:5;2943:35;2933:63;;2992:1;2989;2982:12;2933:63;2880:122;:::o;3008:139::-;3054:5;3092:6;3079:20;3070:29;;3108:33;3135:5;3108:33;:::i;:::-;3008:139;;;;:::o;3170:710::-;3266:5;3291:81;3307:64;3364:6;3307:64;:::i;:::-;3291:81;:::i;:::-;3282:90;;3392:5;3421:6;3414:5;3407:21;3455:4;3448:5;3444:16;3437:23;;3508:4;3500:6;3496:17;3488:6;3484:30;3537:3;3529:6;3526:15;3523:122;;;3556:79;;:::i;:::-;3523:122;3671:6;3654:220;3688:6;3683:3;3680:15;3654:220;;;3763:3;3792:37;3825:3;3813:10;3792:37;:::i;:::-;3787:3;3780:50;3859:4;3854:3;3850:14;3843:21;;3730:144;3714:4;3709:3;3705:14;3698:21;;3654:220;;;3658:21;3272:608;;3170:710;;;;;:::o;3903:370::-;3974:5;4023:3;4016:4;4008:6;4004:17;4000:27;3990:122;;4031:79;;:::i;:::-;3990:122;4148:6;4135:20;4173:94;4263:3;4255:6;4248:4;4240:6;4236:17;4173:94;:::i;:::-;4164:103;;3980:293;3903:370;;;;:::o;4279:539::-;4363:6;4412:2;4400:9;4391:7;4387:23;4383:32;4380:119;;;4418:79;;:::i;:::-;4380:119;4566:1;4555:9;4551:17;4538:31;4596:18;4588:6;4585:30;4582:117;;;4618:79;;:::i;:::-;4582:117;4723:78;4793:7;4784:6;4773:9;4769:22;4723:78;:::i;:::-;4713:88;;4509:302;4279:539;;;;:::o;4824:99::-;4876:6;4910:5;4904:12;4894:22;;4824:99;;;:::o;4929:169::-;5013:11;5047:6;5042:3;5035:19;5087:4;5082:3;5078:14;5063:29;;4929:169;;;;:::o;5104:246::-;5185:1;5195:113;5209:6;5206:1;5203:13;5195:113;;;5294:1;5289:3;5285:11;5279:18;5275:1;5270:3;5266:11;5259:39;5231:2;5228:1;5224:10;5219:15;;5195:113;;;5342:1;5333:6;5328:3;5324:16;5317:27;5166:184;5104:246;;;:::o;5356:377::-;5444:3;5472:39;5505:5;5472:39;:::i;:::-;5527:71;5591:6;5586:3;5527:71;:::i;:::-;5520:78;;5607:65;5665:6;5660:3;5653:4;5646:5;5642:16;5607:65;:::i;:::-;5697:29;5719:6;5697:29;:::i;:::-;5692:3;5688:39;5681:46;;5448:285;5356:377;;;;:::o;5739:313::-;5852:4;5890:2;5879:9;5875:18;5867:26;;5939:9;5933:4;5929:20;5925:1;5914:9;5910:17;5903:47;5967:78;6040:4;6031:6;5967:78;:::i;:::-;5959:86;;5739:313;;;;:::o;6058:77::-;6095:7;6124:5;6113:16;;6058:77;;;:::o;6141:122::-;6214:24;6232:5;6214:24;:::i;:::-;6207:5;6204:35;6194:63;;6253:1;6250;6243:12;6194:63;6141:122;:::o;6269:139::-;6315:5;6353:6;6340:20;6331:29;;6369:33;6396:5;6369:33;:::i;:::-;6269:139;;;;:::o;6414:329::-;6473:6;6522:2;6510:9;6501:7;6497:23;6493:32;6490:119;;;6528:79;;:::i;:::-;6490:119;6648:1;6673:53;6718:7;6709:6;6698:9;6694:22;6673:53;:::i;:::-;6663:63;;6619:117;6414:329;;;;:::o;6749:126::-;6786:7;6826:42;6819:5;6815:54;6804:65;;6749:126;;;:::o;6881:96::-;6918:7;6947:24;6965:5;6947:24;:::i;:::-;6936:35;;6881:96;;;:::o;6983:118::-;7070:24;7088:5;7070:24;:::i;:::-;7065:3;7058:37;6983:118;;:::o;7107:222::-;7200:4;7238:2;7227:9;7223:18;7215:26;;7251:71;7319:1;7308:9;7304:17;7295:6;7251:71;:::i;:::-;7107:222;;;;:::o;7335:122::-;7408:24;7426:5;7408:24;:::i;:::-;7401:5;7398:35;7388:63;;7447:1;7444;7437:12;7388:63;7335:122;:::o;7463:139::-;7509:5;7547:6;7534:20;7525:29;;7563:33;7590:5;7563:33;:::i;:::-;7463:139;;;;:::o;7608:474::-;7676:6;7684;7733:2;7721:9;7712:7;7708:23;7704:32;7701:119;;;7739:79;;:::i;:::-;7701:119;7859:1;7884:53;7929:7;7920:6;7909:9;7905:22;7884:53;:::i;:::-;7874:63;;7830:117;7986:2;8012:53;8057:7;8048:6;8037:9;8033:22;8012:53;:::i;:::-;8002:63;;7957:118;7608:474;;;;;:::o;8088:118::-;8175:24;8193:5;8175:24;:::i;:::-;8170:3;8163:37;8088:118;;:::o;8212:222::-;8305:4;8343:2;8332:9;8328:18;8320:26;;8356:71;8424:1;8413:9;8409:17;8400:6;8356:71;:::i;:::-;8212:222;;;;:::o;8440:118::-;8527:24;8545:5;8527:24;:::i;:::-;8522:3;8515:37;8440:118;;:::o;8564:222::-;8657:4;8695:2;8684:9;8680:18;8672:26;;8708:71;8776:1;8765:9;8761:17;8752:6;8708:71;:::i;:::-;8564:222;;;;:::o;8792:619::-;8869:6;8877;8885;8934:2;8922:9;8913:7;8909:23;8905:32;8902:119;;;8940:79;;:::i;:::-;8902:119;9060:1;9085:53;9130:7;9121:6;9110:9;9106:22;9085:53;:::i;:::-;9075:63;;9031:117;9187:2;9213:53;9258:7;9249:6;9238:9;9234:22;9213:53;:::i;:::-;9203:63;;9158:118;9315:2;9341:53;9386:7;9377:6;9366:9;9362:22;9341:53;:::i;:::-;9331:63;;9286:118;8792:619;;;;;:::o;9417:474::-;9485:6;9493;9542:2;9530:9;9521:7;9517:23;9513:32;9510:119;;;9548:79;;:::i;:::-;9510:119;9668:1;9693:53;9738:7;9729:6;9718:9;9714:22;9693:53;:::i;:::-;9683:63;;9639:117;9795:2;9821:53;9866:7;9857:6;9846:9;9842:22;9821:53;:::i;:::-;9811:63;;9766:118;9417:474;;;;;:::o;9897:332::-;10018:4;10056:2;10045:9;10041:18;10033:26;;10069:71;10137:1;10126:9;10122:17;10113:6;10069:71;:::i;:::-;10150:72;10218:2;10207:9;10203:18;10194:6;10150:72;:::i;:::-;9897:332;;;;;:::o;10235:118::-;10327:1;10320:5;10317:12;10307:40;;10343:1;10340;10333:12;10307:40;10235:118;:::o;10359:177::-;10424:5;10462:6;10449:20;10440:29;;10478:52;10524:5;10478:52;:::i;:::-;10359:177;;;;:::o;10542:367::-;10620:6;10669:2;10657:9;10648:7;10644:23;10640:32;10637:119;;;10675:79;;:::i;:::-;10637:119;10795:1;10820:72;10884:7;10875:6;10864:9;10860:22;10820:72;:::i;:::-;10810:82;;10766:136;10542:367;;;;:::o;10915:60::-;10943:3;10964:5;10957:12;;10915:60;;;:::o;10981:142::-;11031:9;11064:53;11082:34;11091:24;11109:5;11091:24;:::i;:::-;11082:34;:::i;:::-;11064:53;:::i;:::-;11051:66;;10981:142;;;:::o;11129:126::-;11179:9;11212:37;11243:5;11212:37;:::i;:::-;11199:50;;11129:126;;;:::o;11261:157::-;11342:9;11375:37;11406:5;11375:37;:::i;:::-;11362:50;;11261:157;;;:::o;11424:193::-;11542:68;11604:5;11542:68;:::i;:::-;11537:3;11530:81;11424:193;;:::o;11623:284::-;11747:4;11785:2;11774:9;11770:18;11762:26;;11798:102;11897:1;11886:9;11882:17;11873:6;11798:102;:::i;:::-;11623:284;;;;:::o;11913:109::-;11949:7;11989:26;11982:5;11978:38;11967:49;;11913:109;;;:::o;12028:115::-;12113:23;12130:5;12113:23;:::i;:::-;12108:3;12101:36;12028:115;;:::o;12149:218::-;12240:4;12278:2;12267:9;12263:18;12255:26;;12291:69;12357:1;12346:9;12342:17;12333:6;12291:69;:::i;:::-;12149:218;;;;:::o;12373:117::-;12482:1;12479;12472:12;12496:308;12558:4;12648:18;12640:6;12637:30;12634:56;;;12670:18;;:::i;:::-;12634:56;12708:29;12730:6;12708:29;:::i;:::-;12700:37;;12792:4;12786;12782:15;12774:23;;12496:308;;;:::o;12810:146::-;12907:6;12902:3;12897;12884:30;12948:1;12939:6;12934:3;12930:16;12923:27;12810:146;;;:::o;12962:425::-;13040:5;13065:66;13081:49;13123:6;13081:49;:::i;:::-;13065:66;:::i;:::-;13056:75;;13154:6;13147:5;13140:21;13192:4;13185:5;13181:16;13230:3;13221:6;13216:3;13212:16;13209:25;13206:112;;;13237:79;;:::i;:::-;13206:112;13327:54;13374:6;13369:3;13364;13327:54;:::i;:::-;13046:341;12962:425;;;;;:::o;13407:340::-;13463:5;13512:3;13505:4;13497:6;13493:17;13489:27;13479:122;;13520:79;;:::i;:::-;13479:122;13637:6;13624:20;13662:79;13737:3;13729:6;13722:4;13714:6;13710:17;13662:79;:::i;:::-;13653:88;;13469:278;13407:340;;;;:::o;13753:509::-;13822:6;13871:2;13859:9;13850:7;13846:23;13842:32;13839:119;;;13877:79;;:::i;:::-;13839:119;14025:1;14014:9;14010:17;13997:31;14055:18;14047:6;14044:30;14041:117;;;14077:79;;:::i;:::-;14041:117;14182:63;14237:7;14228:6;14217:9;14213:22;14182:63;:::i;:::-;14172:73;;13968:287;13753:509;;;;:::o;14268:329::-;14327:6;14376:2;14364:9;14355:7;14351:23;14347:32;14344:119;;;14382:79;;:::i;:::-;14344:119;14502:1;14527:53;14572:7;14563:6;14552:9;14548:22;14527:53;:::i;:::-;14517:63;;14473:117;14268:329;;;;:::o;14603:::-;14662:6;14711:2;14699:9;14690:7;14686:23;14682:32;14679:119;;;14717:79;;:::i;:::-;14679:119;14837:1;14862:53;14907:7;14898:6;14887:9;14883:22;14862:53;:::i;:::-;14852:63;;14808:117;14603:329;;;;:::o;14938:116::-;15008:21;15023:5;15008:21;:::i;:::-;15001:5;14998:32;14988:60;;15044:1;15041;15034:12;14988:60;14938:116;:::o;15060:133::-;15103:5;15141:6;15128:20;15119:29;;15157:30;15181:5;15157:30;:::i;:::-;15060:133;;;;:::o;15199:468::-;15264:6;15272;15321:2;15309:9;15300:7;15296:23;15292:32;15289:119;;;15327:79;;:::i;:::-;15289:119;15447:1;15472:53;15517:7;15508:6;15497:9;15493:22;15472:53;:::i;:::-;15462:63;;15418:117;15574:2;15600:50;15642:7;15633:6;15622:9;15618:22;15600:50;:::i;:::-;15590:60;;15545:115;15199:468;;;;;:::o;15673:307::-;15734:4;15824:18;15816:6;15813:30;15810:56;;;15846:18;;:::i;:::-;15810:56;15884:29;15906:6;15884:29;:::i;:::-;15876:37;;15968:4;15962;15958:15;15950:23;;15673:307;;;:::o;15986:423::-;16063:5;16088:65;16104:48;16145:6;16104:48;:::i;:::-;16088:65;:::i;:::-;16079:74;;16176:6;16169:5;16162:21;16214:4;16207:5;16203:16;16252:3;16243:6;16238:3;16234:16;16231:25;16228:112;;;16259:79;;:::i;:::-;16228:112;16349:54;16396:6;16391:3;16386;16349:54;:::i;:::-;16069:340;15986:423;;;;;:::o;16428:338::-;16483:5;16532:3;16525:4;16517:6;16513:17;16509:27;16499:122;;16540:79;;:::i;:::-;16499:122;16657:6;16644:20;16682:78;16756:3;16748:6;16741:4;16733:6;16729:17;16682:78;:::i;:::-;16673:87;;16489:277;16428:338;;;;:::o;16772:943::-;16867:6;16875;16883;16891;16940:3;16928:9;16919:7;16915:23;16911:33;16908:120;;;16947:79;;:::i;:::-;16908:120;17067:1;17092:53;17137:7;17128:6;17117:9;17113:22;17092:53;:::i;:::-;17082:63;;17038:117;17194:2;17220:53;17265:7;17256:6;17245:9;17241:22;17220:53;:::i;:::-;17210:63;;17165:118;17322:2;17348:53;17393:7;17384:6;17373:9;17369:22;17348:53;:::i;:::-;17338:63;;17293:118;17478:2;17467:9;17463:18;17450:32;17509:18;17501:6;17498:30;17495:117;;;17531:79;;:::i;:::-;17495:117;17636:62;17690:7;17681:6;17670:9;17666:22;17636:62;:::i;:::-;17626:72;;17421:287;16772:943;;;;;;;:::o;17721:180::-;17769:77;17766:1;17759:88;17866:4;17863:1;17856:15;17890:4;17887:1;17880:15;17907:124;17999:1;17992:5;17989:12;17979:46;;18005:18;;:::i;:::-;17979:46;17907:124;:::o;18037:149::-;18093:7;18122:5;18111:16;;18128:52;18174:5;18128:52;:::i;:::-;18037:149;;;:::o;18192:::-;18259:9;18292:43;18329:5;18292:43;:::i;:::-;18279:56;;18192:149;;;:::o;18347:165::-;18451:54;18499:5;18451:54;:::i;:::-;18446:3;18439:67;18347:165;;:::o;18518:256::-;18628:4;18666:2;18655:9;18651:18;18643:26;;18679:88;18764:1;18753:9;18749:17;18740:6;18679:88;:::i;:::-;18518:256;;;;:::o;18780:684::-;18873:6;18881;18930:2;18918:9;18909:7;18905:23;18901:32;18898:119;;;18936:79;;:::i;:::-;18898:119;19056:1;19081:53;19126:7;19117:6;19106:9;19102:22;19081:53;:::i;:::-;19071:63;;19027:117;19211:2;19200:9;19196:18;19183:32;19242:18;19234:6;19231:30;19228:117;;;19264:79;;:::i;:::-;19228:117;19369:78;19439:7;19430:6;19419:9;19415:22;19369:78;:::i;:::-;19359:88;;19154:303;18780:684;;;;;:::o;19470:474::-;19538:6;19546;19595:2;19583:9;19574:7;19570:23;19566:32;19563:119;;;19601:79;;:::i;:::-;19563:119;19721:1;19746:53;19791:7;19782:6;19771:9;19767:22;19746:53;:::i;:::-;19736:63;;19692:117;19848:2;19874:53;19919:7;19910:6;19899:9;19895:22;19874:53;:::i;:::-;19864:63;;19819:118;19470:474;;;;;:::o;19950:94::-;19983:8;20031:5;20027:2;20023:14;20002:35;;19950:94;;;:::o;20050:::-;20089:7;20118:20;20132:5;20118:20;:::i;:::-;20107:31;;20050:94;;;:::o;20150:100::-;20189:7;20218:26;20238:5;20218:26;:::i;:::-;20207:37;;20150:100;;;:::o;20256:157::-;20361:45;20381:24;20399:5;20381:24;:::i;:::-;20361:45;:::i;:::-;20356:3;20349:58;20256:157;;:::o;20419:256::-;20531:3;20546:75;20617:3;20608:6;20546:75;:::i;:::-;20646:2;20641:3;20637:12;20630:19;;20666:3;20659:10;;20419:256;;;;:::o;20681:180::-;20729:77;20726:1;20719:88;20826:4;20823:1;20816:15;20850:4;20847:1;20840:15;20867:320;20911:6;20948:1;20942:4;20938:12;20928:22;;20995:1;20989:4;20985:12;21016:18;21006:81;;21072:4;21064:6;21060:17;21050:27;;21006:81;21134:2;21126:6;21123:14;21103:18;21100:38;21097:84;;21153:18;;:::i;:::-;21097:84;20918:269;20867:320;;;:::o;21193:332::-;21314:4;21352:2;21341:9;21337:18;21329:26;;21365:71;21433:1;21422:9;21418:17;21409:6;21365:71;:::i;:::-;21446:72;21514:2;21503:9;21499:18;21490:6;21446:72;:::i;:::-;21193:332;;;;;:::o;21531:137::-;21585:5;21616:6;21610:13;21601:22;;21632:30;21656:5;21632:30;:::i;:::-;21531:137;;;;:::o;21674:345::-;21741:6;21790:2;21778:9;21769:7;21765:23;21761:32;21758:119;;;21796:79;;:::i;:::-;21758:119;21916:1;21941:61;21994:7;21985:6;21974:9;21970:22;21941:61;:::i;:::-;21931:71;;21887:125;21674:345;;;;:::o;22025:180::-;22073:77;22070:1;22063:88;22170:4;22167:1;22160:15;22194:4;22191:1;22184:15;22211:410;22251:7;22274:20;22292:1;22274:20;:::i;:::-;22269:25;;22308:20;22326:1;22308:20;:::i;:::-;22303:25;;22363:1;22360;22356:9;22385:30;22403:11;22385:30;:::i;:::-;22374:41;;22564:1;22555:7;22551:15;22548:1;22545:22;22525:1;22518:9;22498:83;22475:139;;22594:18;;:::i;:::-;22475:139;22259:362;22211:410;;;;:::o;22627:180::-;22675:77;22672:1;22665:88;22772:4;22769:1;22762:15;22796:4;22793:1;22786:15;22813:185;22853:1;22870:20;22888:1;22870:20;:::i;:::-;22865:25;;22904:20;22922:1;22904:20;:::i;:::-;22899:25;;22943:1;22933:35;;22948:18;;:::i;:::-;22933:35;22990:1;22987;22983:9;22978:14;;22813:185;;;;:::o;23004:181::-;23144:33;23140:1;23132:6;23128:14;23121:57;23004:181;:::o;23191:366::-;23333:3;23354:67;23418:2;23413:3;23354:67;:::i;:::-;23347:74;;23430:93;23519:3;23430:93;:::i;:::-;23548:2;23543:3;23539:12;23532:19;;23191:366;;;:::o;23563:419::-;23729:4;23767:2;23756:9;23752:18;23744:26;;23816:9;23810:4;23806:20;23802:1;23791:9;23787:17;23780:47;23844:131;23970:4;23844:131;:::i;:::-;23836:139;;23563:419;;;:::o;23988:162::-;24128:14;24124:1;24116:6;24112:14;24105:38;23988:162;:::o;24156:366::-;24298:3;24319:67;24383:2;24378:3;24319:67;:::i;:::-;24312:74;;24395:93;24484:3;24395:93;:::i;:::-;24513:2;24508:3;24504:12;24497:19;;24156:366;;;:::o;24528:419::-;24694:4;24732:2;24721:9;24717:18;24709:26;;24781:9;24775:4;24771:20;24767:1;24756:9;24752:17;24745:47;24809:131;24935:4;24809:131;:::i;:::-;24801:139;;24528:419;;;:::o;24953:191::-;24993:3;25012:20;25030:1;25012:20;:::i;:::-;25007:25;;25046:20;25064:1;25046:20;:::i;:::-;25041:25;;25089:1;25086;25082:9;25075:16;;25110:3;25107:1;25104:10;25101:36;;;25117:18;;:::i;:::-;25101:36;24953:191;;;;:::o;25150:168::-;25290:20;25286:1;25278:6;25274:14;25267:44;25150:168;:::o;25324:366::-;25466:3;25487:67;25551:2;25546:3;25487:67;:::i;:::-;25480:74;;25563:93;25652:3;25563:93;:::i;:::-;25681:2;25676:3;25672:12;25665:19;;25324:366;;;:::o;25696:419::-;25862:4;25900:2;25889:9;25885:18;25877:26;;25949:9;25943:4;25939:20;25935:1;25924:9;25920:17;25913:47;25977:131;26103:4;25977:131;:::i;:::-;25969:139;;25696:419;;;:::o;26121:167::-;26261:19;26257:1;26249:6;26245:14;26238:43;26121:167;:::o;26294:366::-;26436:3;26457:67;26521:2;26516:3;26457:67;:::i;:::-;26450:74;;26533:93;26622:3;26533:93;:::i;:::-;26651:2;26646:3;26642:12;26635:19;;26294:366;;;:::o;26666:419::-;26832:4;26870:2;26859:9;26855:18;26847:26;;26919:9;26913:4;26909:20;26905:1;26894:9;26890:17;26883:47;26947:131;27073:4;26947:131;:::i;:::-;26939:139;;26666:419;;;:::o;27091:168::-;27231:20;27227:1;27219:6;27215:14;27208:44;27091:168;:::o;27265:366::-;27407:3;27428:67;27492:2;27487:3;27428:67;:::i;:::-;27421:74;;27504:93;27593:3;27504:93;:::i;:::-;27622:2;27617:3;27613:12;27606:19;;27265:366;;;:::o;27637:419::-;27803:4;27841:2;27830:9;27826:18;27818:26;;27890:9;27884:4;27880:20;27876:1;27865:9;27861:17;27854:47;27918:131;28044:4;27918:131;:::i;:::-;27910:139;;27637:419;;;:::o;28062:177::-;28202:29;28198:1;28190:6;28186:14;28179:53;28062:177;:::o;28245:366::-;28387:3;28408:67;28472:2;28467:3;28408:67;:::i;:::-;28401:74;;28484:93;28573:3;28484:93;:::i;:::-;28602:2;28597:3;28593:12;28586:19;;28245:366;;;:::o;28617:419::-;28783:4;28821:2;28810:9;28806:18;28798:26;;28870:9;28864:4;28860:20;28856:1;28845:9;28841:17;28834:47;28898:131;29024:4;28898:131;:::i;:::-;28890:139;;28617:419;;;:::o;29042:147::-;29143:11;29180:3;29165:18;;29042:147;;;;:::o;29195:114::-;;:::o;29315:398::-;29474:3;29495:83;29576:1;29571:3;29495:83;:::i;:::-;29488:90;;29587:93;29676:3;29587:93;:::i;:::-;29705:1;29700:3;29696:11;29689:18;;29315:398;;;:::o;29719:379::-;29903:3;29925:147;30068:3;29925:147;:::i;:::-;29918:154;;30089:3;30082:10;;29719:379;;;:::o;30104:166::-;30244:18;30240:1;30232:6;30228:14;30221:42;30104:166;:::o;30276:366::-;30418:3;30439:67;30503:2;30498:3;30439:67;:::i;:::-;30432:74;;30515:93;30604:3;30515:93;:::i;:::-;30633:2;30628:3;30624:12;30617:19;;30276:366;;;:::o;30648:419::-;30814:4;30852:2;30841:9;30837:18;30829:26;;30901:9;30895:4;30891:20;30887:1;30876:9;30872:17;30865:47;30929:131;31055:4;30929:131;:::i;:::-;30921:139;;30648:419;;;:::o;31073:141::-;31122:4;31145:3;31137:11;;31168:3;31165:1;31158:14;31202:4;31199:1;31189:18;31181:26;;31073:141;;;:::o;31220:93::-;31257:6;31304:2;31299;31292:5;31288:14;31284:23;31274:33;;31220:93;;;:::o;31319:107::-;31363:8;31413:5;31407:4;31403:16;31382:37;;31319:107;;;;:::o;31432:393::-;31501:6;31551:1;31539:10;31535:18;31574:97;31604:66;31593:9;31574:97;:::i;:::-;31692:39;31722:8;31711:9;31692:39;:::i;:::-;31680:51;;31764:4;31760:9;31753:5;31749:21;31740:30;;31813:4;31803:8;31799:19;31792:5;31789:30;31779:40;;31508:317;;31432:393;;;;;:::o;31831:142::-;31881:9;31914:53;31932:34;31941:24;31959:5;31941:24;:::i;:::-;31932:34;:::i;:::-;31914:53;:::i;:::-;31901:66;;31831:142;;;:::o;31979:75::-;32022:3;32043:5;32036:12;;31979:75;;;:::o;32060:269::-;32170:39;32201:7;32170:39;:::i;:::-;32231:91;32280:41;32304:16;32280:41;:::i;:::-;32272:6;32265:4;32259:11;32231:91;:::i;:::-;32225:4;32218:105;32136:193;32060:269;;;:::o;32335:73::-;32380:3;32335:73;:::o;32414:189::-;32491:32;;:::i;:::-;32532:65;32590:6;32582;32576:4;32532:65;:::i;:::-;32467:136;32414:189;;:::o;32609:186::-;32669:120;32686:3;32679:5;32676:14;32669:120;;;32740:39;32777:1;32770:5;32740:39;:::i;:::-;32713:1;32706:5;32702:13;32693:22;;32669:120;;;32609:186;;:::o;32801:543::-;32902:2;32897:3;32894:11;32891:446;;;32936:38;32968:5;32936:38;:::i;:::-;33020:29;33038:10;33020:29;:::i;:::-;33010:8;33006:44;33203:2;33191:10;33188:18;33185:49;;;33224:8;33209:23;;33185:49;33247:80;33303:22;33321:3;33303:22;:::i;:::-;33293:8;33289:37;33276:11;33247:80;:::i;:::-;32906:431;;32891:446;32801:543;;;:::o;33350:117::-;33404:8;33454:5;33448:4;33444:16;33423:37;;33350:117;;;;:::o;33473:169::-;33517:6;33550:51;33598:1;33594:6;33586:5;33583:1;33579:13;33550:51;:::i;:::-;33546:56;33631:4;33625;33621:15;33611:25;;33524:118;33473:169;;;;:::o;33647:295::-;33723:4;33869:29;33894:3;33888:4;33869:29;:::i;:::-;33861:37;;33931:3;33928:1;33924:11;33918:4;33915:21;33907:29;;33647:295;;;;:::o;33947:1395::-;34064:37;34097:3;34064:37;:::i;:::-;34166:18;34158:6;34155:30;34152:56;;;34188:18;;:::i;:::-;34152:56;34232:38;34264:4;34258:11;34232:38;:::i;:::-;34317:67;34377:6;34369;34363:4;34317:67;:::i;:::-;34411:1;34435:4;34422:17;;34467:2;34459:6;34456:14;34484:1;34479:618;;;;35141:1;35158:6;35155:77;;;35207:9;35202:3;35198:19;35192:26;35183:35;;35155:77;35258:67;35318:6;35311:5;35258:67;:::i;:::-;35252:4;35245:81;35114:222;34449:887;;34479:618;34531:4;34527:9;34519:6;34515:22;34565:37;34597:4;34565:37;:::i;:::-;34624:1;34638:208;34652:7;34649:1;34646:14;34638:208;;;34731:9;34726:3;34722:19;34716:26;34708:6;34701:42;34782:1;34774:6;34770:14;34760:24;;34829:2;34818:9;34814:18;34801:31;;34675:4;34672:1;34668:12;34663:17;;34638:208;;;34874:6;34865:7;34862:19;34859:179;;;34932:9;34927:3;34923:19;34917:26;34975:48;35017:4;35009:6;35005:17;34994:9;34975:48;:::i;:::-;34967:6;34960:64;34882:156;34859:179;35084:1;35080;35072:6;35068:14;35064:22;35058:4;35051:36;34486:611;;;34449:887;;34039:1303;;;33947:1395;;:::o;35348:234::-;35488:34;35484:1;35476:6;35472:14;35465:58;35557:17;35552:2;35544:6;35540:15;35533:42;35348:234;:::o;35588:366::-;35730:3;35751:67;35815:2;35810:3;35751:67;:::i;:::-;35744:74;;35827:93;35916:3;35827:93;:::i;:::-;35945:2;35940:3;35936:12;35929:19;;35588:366;;;:::o;35960:419::-;36126:4;36164:2;36153:9;36149:18;36141:26;;36213:9;36207:4;36203:20;36199:1;36188:9;36184:17;36177:47;36241:131;36367:4;36241:131;:::i;:::-;36233:139;;35960:419;;;:::o;36385:148::-;36487:11;36524:3;36509:18;;36385:148;;;;:::o;36539:390::-;36645:3;36673:39;36706:5;36673:39;:::i;:::-;36728:89;36810:6;36805:3;36728:89;:::i;:::-;36721:96;;36826:65;36884:6;36879:3;36872:4;36865:5;36861:16;36826:65;:::i;:::-;36916:6;36911:3;36907:16;36900:23;;36649:280;36539:390;;;;:::o;36959:874::-;37062:3;37099:5;37093:12;37128:36;37154:9;37128:36;:::i;:::-;37180:89;37262:6;37257:3;37180:89;:::i;:::-;37173:96;;37300:1;37289:9;37285:17;37316:1;37311:166;;;;37491:1;37486:341;;;;37278:549;;37311:166;37395:4;37391:9;37380;37376:25;37371:3;37364:38;37457:6;37450:14;37443:22;37435:6;37431:35;37426:3;37422:45;37415:52;;37311:166;;37486:341;37553:38;37585:5;37553:38;:::i;:::-;37613:1;37627:154;37641:6;37638:1;37635:13;37627:154;;;37715:7;37709:14;37705:1;37700:3;37696:11;37689:35;37765:1;37756:7;37752:15;37741:26;;37663:4;37660:1;37656:12;37651:17;;37627:154;;;37810:6;37805:3;37801:16;37794:23;;37493:334;;37278:549;;37066:767;;36959:874;;;;:::o;37839:589::-;38064:3;38086:95;38177:3;38168:6;38086:95;:::i;:::-;38079:102;;38198:95;38289:3;38280:6;38198:95;:::i;:::-;38191:102;;38310:92;38398:3;38389:6;38310:92;:::i;:::-;38303:99;;38419:3;38412:10;;37839:589;;;;;;:::o;38434:220::-;38574:34;38570:1;38562:6;38558:14;38551:58;38643:3;38638:2;38630:6;38626:15;38619:28;38434:220;:::o;38660:366::-;38802:3;38823:67;38887:2;38882:3;38823:67;:::i;:::-;38816:74;;38899:93;38988:3;38899:93;:::i;:::-;39017:2;39012:3;39008:12;39001:19;;38660:366;;;:::o;39032:419::-;39198:4;39236:2;39225:9;39221:18;39213:26;;39285:9;39279:4;39275:20;39271:1;39260:9;39256:17;39249:47;39313:131;39439:4;39313:131;:::i;:::-;39305:139;;39032:419;;;:::o;39457:163::-;39597:15;39593:1;39585:6;39581:14;39574:39;39457:163;:::o;39626:366::-;39768:3;39789:67;39853:2;39848:3;39789:67;:::i;:::-;39782:74;;39865:93;39954:3;39865:93;:::i;:::-;39983:2;39978:3;39974:12;39967:19;;39626:366;;;:::o;39998:419::-;40164:4;40202:2;40191:9;40187:18;40179:26;;40251:9;40245:4;40241:20;40237:1;40226:9;40222:17;40215:47;40279:131;40405:4;40279:131;:::i;:::-;40271:139;;39998:419;;;:::o;40423:194::-;40463:4;40483:20;40501:1;40483:20;:::i;:::-;40478:25;;40517:20;40535:1;40517:20;:::i;:::-;40512:25;;40561:1;40558;40554:9;40546:17;;40585:1;40579:4;40576:11;40573:37;;;40590:18;;:::i;:::-;40573:37;40423:194;;;;:::o;40623:225::-;40763:34;40759:1;40751:6;40747:14;40740:58;40832:8;40827:2;40819:6;40815:15;40808:33;40623:225;:::o;40854:366::-;40996:3;41017:67;41081:2;41076:3;41017:67;:::i;:::-;41010:74;;41093:93;41182:3;41093:93;:::i;:::-;41211:2;41206:3;41202:12;41195:19;;40854:366;;;:::o;41226:419::-;41392:4;41430:2;41419:9;41415:18;41407:26;;41479:9;41473:4;41469:20;41465:1;41454:9;41450:17;41443:47;41507:131;41633:4;41507:131;:::i;:::-;41499:139;;41226:419;;;:::o;41651:182::-;41791:34;41787:1;41779:6;41775:14;41768:58;41651:182;:::o;41839:366::-;41981:3;42002:67;42066:2;42061:3;42002:67;:::i;:::-;41995:74;;42078:93;42167:3;42078:93;:::i;:::-;42196:2;42191:3;42187:12;42180:19;;41839:366;;;:::o;42211:419::-;42377:4;42415:2;42404:9;42400:18;42392:26;;42464:9;42458:4;42454:20;42450:1;42439:9;42435:17;42428:47;42492:131;42618:4;42492:131;:::i;:::-;42484:139;;42211:419;;;:::o;42636:233::-;42675:3;42698:24;42716:5;42698:24;:::i;:::-;42689:33;;42744:66;42737:5;42734:77;42731:103;;42814:18;;:::i;:::-;42731:103;42861:1;42854:5;42850:13;42843:20;;42636:233;;;:::o;42875:176::-;42907:1;42924:20;42942:1;42924:20;:::i;:::-;42919:25;;42958:20;42976:1;42958:20;:::i;:::-;42953:25;;42997:1;42987:35;;43002:18;;:::i;:::-;42987:35;43043:1;43040;43036:9;43031:14;;42875:176;;;;:::o;43057:180::-;43105:77;43102:1;43095:88;43202:4;43199:1;43192:15;43226:4;43223:1;43216:15;43243:98;43294:6;43328:5;43322:12;43312:22;;43243:98;;;:::o;43347:168::-;43430:11;43464:6;43459:3;43452:19;43504:4;43499:3;43495:14;43480:29;;43347:168;;;;:::o;43521:373::-;43607:3;43635:38;43667:5;43635:38;:::i;:::-;43689:70;43752:6;43747:3;43689:70;:::i;:::-;43682:77;;43768:65;43826:6;43821:3;43814:4;43807:5;43803:16;43768:65;:::i;:::-;43858:29;43880:6;43858:29;:::i;:::-;43853:3;43849:39;43842:46;;43611:283;43521:373;;;;:::o;43900:640::-;44095:4;44133:3;44122:9;44118:19;44110:27;;44147:71;44215:1;44204:9;44200:17;44191:6;44147:71;:::i;:::-;44228:72;44296:2;44285:9;44281:18;44272:6;44228:72;:::i;:::-;44310;44378:2;44367:9;44363:18;44354:6;44310:72;:::i;:::-;44429:9;44423:4;44419:20;44414:2;44403:9;44399:18;44392:48;44457:76;44528:4;44519:6;44457:76;:::i;:::-;44449:84;;43900:640;;;;;;;:::o;44546:141::-;44602:5;44633:6;44627:13;44618:22;;44649:32;44675:5;44649:32;:::i;:::-;44546:141;;;;:::o;44693:349::-;44762:6;44811:2;44799:9;44790:7;44786:23;44782:32;44779:119;;;44817:79;;:::i;:::-;44779:119;44937:1;44962:63;45017:7;45008:6;44997:9;44993:22;44962:63;:::i;:::-;44952:73;;44908:127;44693:349;;;;:::o
Swarm Source
ipfs://28bbc891c6bdb4a53848d637e4200731edb9fe37c6be32e10045f9dbfa358219
Loading...
Loading
Loading...
Loading
OVERVIEW
1,000 Toy Ape Kennel Club being assembled on the Ethereum blockchain. This is a derivative project of Bored Ape Kennel Club. It has no association with Bored Ape Kennel Club, BAYC or Yuga Labs.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,811.92 | 0.13 | $495.55 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.