ERC-721
Overview
Max Total Supply
1,111 LOADING
Holders
1,048
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
17 LOADINGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ItsLoading
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-20 */ // File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_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/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); } } // 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: contracts/4_Loading.sol pragma solidity ^0.8.0; contract ItsLoading is ERC721A, Ownable{ using StringsUpgradeable for uint256; uint256 public constant MAX_SUPPLY = 1111; uint256 public constant MAX_PUBLIC_MINT = 1; uint256 public constant MAX_WHITELIST_MINT = 1; string public baseTokenURI; bool public publicSale; bool public whiteListSale; bytes32 private merkleRoot; mapping(address => uint256) public totalPublicMint; mapping(address => uint256) public totalWhitelistMint; constructor() ERC721A("It's loading", "LOADING"){ } modifier callerIsUser() { require(tx.origin == msg.sender, "It's loading :: Cannot be called by a contract"); _; } function mint() external callerIsUser { require(publicSale, "It's loading :: Not Yet Active."); require((totalSupply() + 1) <= MAX_SUPPLY, "It's loading :: Beyond Max Supply"); require((totalPublicMint[msg.sender] + 1) <= MAX_PUBLIC_MINT, "It's loading :: Already minted maximum times!"); totalPublicMint[msg.sender] += 1; _safeMint(msg.sender, 1); } function whitelistMint(bytes32[] memory _merkleProof) external callerIsUser { require(whiteListSale, "It's loading :: Minting is on Pause"); require((totalSupply() + 1) <= MAX_SUPPLY, "It's loading :: Cannot mint beyond max supply"); require((totalWhitelistMint[msg.sender] + 1) <= MAX_WHITELIST_MINT, "It's loading :: Cannot mint beyond whitelist max mint!"); //create leaf node bytes32 sender = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, sender), "It's loading :: You are not on the whitelist"); totalWhitelistMint[msg.sender] += 1; _safeMint(msg.sender, 1); } /// @notice Set baseURI /// @param baseURI URI of the IPFS image server function setBaseURI(string memory baseURI) external onlyOwner { baseTokenURI = baseURI; } /// @notice Get uri of tokens /// @return string Uri function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } //return uri for certain token function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); uint256 trueId = tokenId + 1; return string(abi.encodePacked(_baseURI(), trueId.toString(), ".json")); } function setTokenUri(string memory _baseTokenUri) external onlyOwner{ baseTokenURI = _baseTokenUri; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{ merkleRoot = _merkleRoot; } function getMerkleRoot() external view returns (bytes32){ return merkleRoot; } function toggleWhiteListSale() external onlyOwner{ whiteListSale = !whiteListSale; } function togglePublicSale() external onlyOwner{ publicSale = !publicSale; } }
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":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"baseURI","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":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","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":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWhitelistMint","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":"whiteListSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600c81526020017f49742773206c6f6164696e6700000000000000000000000000000000000000008152506040518060400160405280600781526020017f4c4f4144494e4700000000000000000000000000000000000000000000000000815250816002908051906020019062000096929190620001c1565b508060039080519060200190620000af929190620001c1565b50620000c0620000ee60201b60201c565b6000819055505050620000e8620000dc620000f360201b60201c565b620000fb60201b60201c565b620002d6565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cf9062000271565b90600052602060002090601f016020900481019282620001f357600085556200023f565b82601f106200020e57805160ff19168380011785556200023f565b828001600101855582156200023f579182015b828111156200023e57825182559160200191906001019062000221565b5b5090506200024e919062000252565b5090565b5b808211156200026d57600081600090555060010162000253565b5090565b600060028204905060018216806200028a57607f821691505b60208210811415620002a157620002a0620002a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6134ea80620002e66000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610566578063d547cfb714610596578063e222c7f9146105b4578063e985e9c5146105be578063f2fde38b146105ee576101fb565b806395d89b41146104f2578063a22cb46514610510578063b88d4fde1461052c578063c08dfd3c14610548576101fb565b80637cb64759116100e95780637cb647591461049057806386a173ee146104ac5780638bb64a8c146104ca5780638da5cb5b146104d4576101fb565b80636352211e1461040857806365f130971461043857806370a0823114610456578063715018a614610486576101fb565b80631c16521c11610192578063372f657c11610161578063372f657c1461039657806342842e0e146103b257806349590657146103ce57806355f804b3146103ec576101fb565b80631c16521c1461030e57806323b872dd1461033e57806332cb6b0c1461035a57806333bc1c5c14610378576101fb565b8063081812fc116101ce578063081812fc1461029a578063095ea7b3146102ca5780631249c58b146102e657806318160ddd146102f0576101fb565b806301ffc9a7146102005780630345e3cb146102305780630675b7c61461026057806306fdde031461027c575b600080fd5b61021a6004803603810190610215919061267d565b61060a565b6040516102279190612a98565b60405180910390f35b61024a60048036038101906102459190612444565b61069c565b6040516102579190612c50565b60405180910390f35b61027a600480360381019061027591906126d7565b6106b4565b005b6102846106d6565b6040516102919190612ace565b60405180910390f35b6102b460048036038101906102af9190612720565b610768565b6040516102c19190612a31565b60405180910390f35b6102e460048036038101906102df91906125c7565b6107e7565b005b6102ee61092b565b005b6102f8610b32565b6040516103059190612c50565b60405180910390f35b61032860048036038101906103239190612444565b610b49565b6040516103359190612c50565b60405180910390f35b610358600480360381019061035391906124b1565b610b61565b005b610362610e86565b60405161036f9190612c50565b60405180910390f35b610380610e8c565b60405161038d9190612a98565b60405180910390f35b6103b060048036038101906103ab9190612607565b610e9f565b005b6103cc60048036038101906103c791906124b1565b61111f565b005b6103d661113f565b6040516103e39190612ab3565b60405180910390f35b610406600480360381019061040191906126d7565b611149565b005b610422600480360381019061041d9190612720565b61116b565b60405161042f9190612a31565b60405180910390f35b61044061117d565b60405161044d9190612c50565b60405180910390f35b610470600480360381019061046b9190612444565b611182565b60405161047d9190612c50565b60405180910390f35b61048e61123b565b005b6104aa60048036038101906104a59190612650565b61124f565b005b6104b4611261565b6040516104c19190612a98565b60405180910390f35b6104d2611274565b005b6104dc6112a8565b6040516104e99190612a31565b60405180910390f35b6104fa6112d2565b6040516105079190612ace565b60405180910390f35b61052a60048036038101906105259190612587565b611364565b005b61054660048036038101906105419190612504565b6114dc565b005b61055061154f565b60405161055d9190612c50565b60405180910390f35b610580600480360381019061057b9190612720565b611554565b60405161058d9190612ace565b60405180910390f35b61059e6115e8565b6040516105ab9190612ace565b60405180910390f35b6105bc611676565b005b6105d860048036038101906105d39190612471565b6116aa565b6040516105e59190612a98565b60405180910390f35b61060860048036038101906106039190612444565b61173e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106955750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d6020528060005260406000206000915090505481565b6106bc6117c2565b80600990805190602001906106d29291906121a5565b5050565b6060600280546106e590612edc565b80601f016020809104026020016040519081016040528092919081815260200182805461071190612edc565b801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b5050505050905090565b600061077382611840565b6107a9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f28261116b565b90508073ffffffffffffffffffffffffffffffffffffffff1661081361189f565b73ffffffffffffffffffffffffffffffffffffffff16146108765761083f8161083a61189f565b6116aa565b610875576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090612bb0565b60405180910390fd5b600a60009054906101000a900460ff166109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90612c30565b60405180910390fd5b61045760016109f5610b32565b6109ff9190612d61565b1115610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790612af0565b60405180910390fd5b600180600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8d9190612d61565b1115610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590612c10565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b1e9190612d61565b92505081905550610b303360016118a7565b565b6000610b3c6118c5565b6001546000540303905090565b600c6020528060005260406000206000915090505481565b6000610b6c826118ca565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bd3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bdf84611998565b91509150610bf58187610bf061189f565b6119bf565b610c4157610c0a86610c0561189f565b6116aa565b610c40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb58686866001611a03565b8015610cc057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d8e85610d6a888887611a09565b7c020000000000000000000000000000000000000000000000000000000017611a31565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e16576000600185019050600060046000838152602001908152602001600020541415610e14576000548114610e13578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e7e8686866001611a5c565b505050505050565b61045781565b600a60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612bb0565b60405180910390fd5b600a60019054906101000a900460ff16610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612b70565b60405180910390fd5b6104576001610f69610b32565b610f739190612d61565b1115610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90612b30565b60405180910390fd5b600180600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110019190612d61565b1115611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990612b50565b60405180910390fd5b60003360405160200161105591906129e7565b60405160208183030381529060405280519060200120905061107a82600b5483611a62565b6110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612b90565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111099190612d61565b9250508190555061111b3360016118a7565b5050565b61113a838383604051806020016040528060008152506114dc565b505050565b6000600b54905090565b6111516117c2565b80600990805190602001906111679291906121a5565b5050565b6000611176826118ca565b9050919050565b600181565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ea576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112436117c2565b61124d6000611a79565b565b6112576117c2565b80600b8190555050565b600a60019054906101000a900460ff1681565b61127c6117c2565b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112e190612edc565b80601f016020809104026020016040519081016040528092919081815260200182805461130d90612edc565b801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050905090565b61136c61189f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113d1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113de61189f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661148b61189f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114d09190612a98565b60405180910390a35050565b6114e7848484610b61565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115495761151284848484611b3f565b611548576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600181565b606061155f82611840565b61159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590612bf0565b60405180910390fd5b60006001836115ad9190612d61565b90506115b7611c9f565b6115c082611d31565b6040516020016115d1929190612a02565b604051602081830303815290604052915050919050565b600980546115f590612edc565b80601f016020809104026020016040519081016040528092919081815260200182805461162190612edc565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b505050505081565b61167e6117c2565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117466117c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90612b10565b60405180910390fd5b6117bf81611a79565b50565b6117ca611e92565b73ffffffffffffffffffffffffffffffffffffffff166117e86112a8565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590612bd0565b60405180910390fd5b565b60008161184b6118c5565b1115801561185a575060005482105b8015611898575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6118c1828260405180602001604052806000815250611e9a565b5050565b600090565b600080829050806118d96118c5565b11611961576000548110156119605760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561195e575b6000811415611954576004600083600190039350838152602001908152602001600020549050611929565b8092505050611993565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611a20868684611f37565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600082611a6f8584611f40565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b6561189f565b8786866040518563ffffffff1660e01b8152600401611b879493929190612a4c565b602060405180830381600087803b158015611ba157600080fd5b505af1925050508015611bd257506040513d601f19601f82011682018060405250810190611bcf91906126aa565b60015b611c4c573d8060008114611c02576040519150601f19603f3d011682016040523d82523d6000602084013e611c07565b606091505b50600081511415611c44576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611cae90612edc565b80601f0160208091040260200160405190810160405280929190818152602001828054611cda90612edc565b8015611d275780601f10611cfc57610100808354040283529160200191611d27565b820191906000526020600020905b815481529060010190602001808311611d0a57829003601f168201915b5050505050905090565b60606000821415611d79576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e8d565b600082905060005b60008214611dab578080611d9490612f3f565b915050600a82611da49190612db7565b9150611d81565b60008167ffffffffffffffff811115611dc757611dc6613099565b5b6040519080825280601f01601f191660200182016040528015611df95781602001600182028036833780820191505090505b5090505b60008514611e8657600182611e129190612de8565b9150600a85611e219190612fac565b6030611e2d9190612d61565b60f81b818381518110611e4357611e4261306a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e7f9190612db7565b9450611dfd565b8093505050505b919050565b600033905090565b611ea48383611f96565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f3257600080549050600083820390505b611ee46000868380600101945086611b3f565b611f1a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611ed1578160005414611f2f57600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015611f8b57611f7682868381518110611f6957611f6861306a565b5b6020026020010151612153565b91508080611f8390612f3f565b915050611f49565b508091505092915050565b6000805490506000821415611fd7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe46000848385611a03565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061205b8361204c6000866000611a09565b6120558561217e565b17611a31565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146120fc57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506120c1565b506000821415612138576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061214e6000848385611a5c565b505050565b600081831061216b57612166828461218e565b612176565b612175838361218e565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546121b190612edc565b90600052602060002090601f0160209004810192826121d3576000855561221a565b82601f106121ec57805160ff191683800117855561221a565b8280016001018555821561221a579182015b828111156122195782518255916020019190600101906121fe565b5b509050612227919061222b565b5090565b5b8082111561224457600081600090555060010161222c565b5090565b600061225b61225684612c90565b612c6b565b9050808382526020820190508285602086028201111561227e5761227d6130cd565b5b60005b858110156122ae57816122948882612394565b845260208401935060208301925050600181019050612281565b5050509392505050565b60006122cb6122c684612cbc565b612c6b565b9050828152602081018484840111156122e7576122e66130d2565b5b6122f2848285612e9a565b509392505050565b600061230d61230884612ced565b612c6b565b905082815260208101848484011115612329576123286130d2565b5b612334848285612e9a565b509392505050565b60008135905061234b81613441565b92915050565b600082601f830112612366576123656130c8565b5b8135612376848260208601612248565b91505092915050565b60008135905061238e81613458565b92915050565b6000813590506123a38161346f565b92915050565b6000813590506123b881613486565b92915050565b6000815190506123cd81613486565b92915050565b600082601f8301126123e8576123e76130c8565b5b81356123f88482602086016122b8565b91505092915050565b600082601f830112612416576124156130c8565b5b81356124268482602086016122fa565b91505092915050565b60008135905061243e8161349d565b92915050565b60006020828403121561245a576124596130dc565b5b60006124688482850161233c565b91505092915050565b60008060408385031215612488576124876130dc565b5b60006124968582860161233c565b92505060206124a78582860161233c565b9150509250929050565b6000806000606084860312156124ca576124c96130dc565b5b60006124d88682870161233c565b93505060206124e98682870161233c565b92505060406124fa8682870161242f565b9150509250925092565b6000806000806080858703121561251e5761251d6130dc565b5b600061252c8782880161233c565b945050602061253d8782880161233c565b935050604061254e8782880161242f565b925050606085013567ffffffffffffffff81111561256f5761256e6130d7565b5b61257b878288016123d3565b91505092959194509250565b6000806040838503121561259e5761259d6130dc565b5b60006125ac8582860161233c565b92505060206125bd8582860161237f565b9150509250929050565b600080604083850312156125de576125dd6130dc565b5b60006125ec8582860161233c565b92505060206125fd8582860161242f565b9150509250929050565b60006020828403121561261d5761261c6130dc565b5b600082013567ffffffffffffffff81111561263b5761263a6130d7565b5b61264784828501612351565b91505092915050565b600060208284031215612666576126656130dc565b5b600061267484828501612394565b91505092915050565b600060208284031215612693576126926130dc565b5b60006126a1848285016123a9565b91505092915050565b6000602082840312156126c0576126bf6130dc565b5b60006126ce848285016123be565b91505092915050565b6000602082840312156126ed576126ec6130dc565b5b600082013567ffffffffffffffff81111561270b5761270a6130d7565b5b61271784828501612401565b91505092915050565b600060208284031215612736576127356130dc565b5b60006127448482850161242f565b91505092915050565b61275681612e1c565b82525050565b61276d61276882612e1c565b612f88565b82525050565b61277c81612e2e565b82525050565b61278b81612e3a565b82525050565b600061279c82612d1e565b6127a68185612d34565b93506127b6818560208601612ea9565b6127bf816130e1565b840191505092915050565b60006127d582612d29565b6127df8185612d45565b93506127ef818560208601612ea9565b6127f8816130e1565b840191505092915050565b600061280e82612d29565b6128188185612d56565b9350612828818560208601612ea9565b80840191505092915050565b6000612841602183612d45565b915061284c826130ff565b604082019050919050565b6000612864602683612d45565b915061286f8261314e565b604082019050919050565b6000612887602d83612d45565b91506128928261319d565b604082019050919050565b60006128aa603683612d45565b91506128b5826131ec565b604082019050919050565b60006128cd602383612d45565b91506128d88261323b565b604082019050919050565b60006128f0602c83612d45565b91506128fb8261328a565b604082019050919050565b6000612913602e83612d45565b915061291e826132d9565b604082019050919050565b6000612936600583612d56565b915061294182613328565b600582019050919050565b6000612959602083612d45565b915061296482613351565b602082019050919050565b600061297c602f83612d45565b91506129878261337a565b604082019050919050565b600061299f602d83612d45565b91506129aa826133c9565b604082019050919050565b60006129c2601f83612d45565b91506129cd82613418565b602082019050919050565b6129e181612e90565b82525050565b60006129f3828461275c565b60148201915081905092915050565b6000612a0e8285612803565b9150612a1a8284612803565b9150612a2582612929565b91508190509392505050565b6000602082019050612a46600083018461274d565b92915050565b6000608082019050612a61600083018761274d565b612a6e602083018661274d565b612a7b60408301856129d8565b8181036060830152612a8d8184612791565b905095945050505050565b6000602082019050612aad6000830184612773565b92915050565b6000602082019050612ac86000830184612782565b92915050565b60006020820190508181036000830152612ae881846127ca565b905092915050565b60006020820190508181036000830152612b0981612834565b9050919050565b60006020820190508181036000830152612b2981612857565b9050919050565b60006020820190508181036000830152612b498161287a565b9050919050565b60006020820190508181036000830152612b698161289d565b9050919050565b60006020820190508181036000830152612b89816128c0565b9050919050565b60006020820190508181036000830152612ba9816128e3565b9050919050565b60006020820190508181036000830152612bc981612906565b9050919050565b60006020820190508181036000830152612be98161294c565b9050919050565b60006020820190508181036000830152612c098161296f565b9050919050565b60006020820190508181036000830152612c2981612992565b9050919050565b60006020820190508181036000830152612c49816129b5565b9050919050565b6000602082019050612c6560008301846129d8565b92915050565b6000612c75612c86565b9050612c818282612f0e565b919050565b6000604051905090565b600067ffffffffffffffff821115612cab57612caa613099565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612cd757612cd6613099565b5b612ce0826130e1565b9050602081019050919050565b600067ffffffffffffffff821115612d0857612d07613099565b5b612d11826130e1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d6c82612e90565b9150612d7783612e90565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dac57612dab612fdd565b5b828201905092915050565b6000612dc282612e90565b9150612dcd83612e90565b925082612ddd57612ddc61300c565b5b828204905092915050565b6000612df382612e90565b9150612dfe83612e90565b925082821015612e1157612e10612fdd565b5b828203905092915050565b6000612e2782612e70565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ec7578082015181840152602081019050612eac565b83811115612ed6576000848401525b50505050565b60006002820490506001821680612ef457607f821691505b60208210811415612f0857612f0761303b565b5b50919050565b612f17826130e1565b810181811067ffffffffffffffff82111715612f3657612f35613099565b5b80604052505050565b6000612f4a82612e90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f7d57612f7c612fdd565b5b600182019050919050565b6000612f9382612f9a565b9050919050565b6000612fa5826130f2565b9050919050565b6000612fb782612e90565b9150612fc283612e90565b925082612fd257612fd161300c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f49742773206c6f6164696e67203a3a204265796f6e64204d617820537570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a2043616e6e6f74206d696e74206265796f60008201527f6e64206d617820737570706c7900000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a2043616e6e6f74206d696e74206265796f60008201527f6e642077686974656c697374206d6178206d696e742100000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a204d696e74696e67206973206f6e20506160008201527f7573650000000000000000000000000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a20596f7520617265206e6f74206f6e207460008201527f68652077686974656c6973740000000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a2043616e6e6f742062652063616c6c656460008201527f206279206120636f6e7472616374000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a20416c7265616479206d696e746564206d60008201527f6178696d756d2074696d65732100000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a204e6f7420596574204163746976652e00600082015250565b61344a81612e1c565b811461345557600080fd5b50565b61346181612e2e565b811461346c57600080fd5b50565b61347881612e3a565b811461348357600080fd5b50565b61348f81612e44565b811461349a57600080fd5b50565b6134a681612e90565b81146134b157600080fd5b5056fea264697066735822122049c7d93f68f39c13c4dd7cf9c478e9d2f09916466206226489a0ae3c82b339ed64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636352211e1161011a57806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610566578063d547cfb714610596578063e222c7f9146105b4578063e985e9c5146105be578063f2fde38b146105ee576101fb565b806395d89b41146104f2578063a22cb46514610510578063b88d4fde1461052c578063c08dfd3c14610548576101fb565b80637cb64759116100e95780637cb647591461049057806386a173ee146104ac5780638bb64a8c146104ca5780638da5cb5b146104d4576101fb565b80636352211e1461040857806365f130971461043857806370a0823114610456578063715018a614610486576101fb565b80631c16521c11610192578063372f657c11610161578063372f657c1461039657806342842e0e146103b257806349590657146103ce57806355f804b3146103ec576101fb565b80631c16521c1461030e57806323b872dd1461033e57806332cb6b0c1461035a57806333bc1c5c14610378576101fb565b8063081812fc116101ce578063081812fc1461029a578063095ea7b3146102ca5780631249c58b146102e657806318160ddd146102f0576101fb565b806301ffc9a7146102005780630345e3cb146102305780630675b7c61461026057806306fdde031461027c575b600080fd5b61021a6004803603810190610215919061267d565b61060a565b6040516102279190612a98565b60405180910390f35b61024a60048036038101906102459190612444565b61069c565b6040516102579190612c50565b60405180910390f35b61027a600480360381019061027591906126d7565b6106b4565b005b6102846106d6565b6040516102919190612ace565b60405180910390f35b6102b460048036038101906102af9190612720565b610768565b6040516102c19190612a31565b60405180910390f35b6102e460048036038101906102df91906125c7565b6107e7565b005b6102ee61092b565b005b6102f8610b32565b6040516103059190612c50565b60405180910390f35b61032860048036038101906103239190612444565b610b49565b6040516103359190612c50565b60405180910390f35b610358600480360381019061035391906124b1565b610b61565b005b610362610e86565b60405161036f9190612c50565b60405180910390f35b610380610e8c565b60405161038d9190612a98565b60405180910390f35b6103b060048036038101906103ab9190612607565b610e9f565b005b6103cc60048036038101906103c791906124b1565b61111f565b005b6103d661113f565b6040516103e39190612ab3565b60405180910390f35b610406600480360381019061040191906126d7565b611149565b005b610422600480360381019061041d9190612720565b61116b565b60405161042f9190612a31565b60405180910390f35b61044061117d565b60405161044d9190612c50565b60405180910390f35b610470600480360381019061046b9190612444565b611182565b60405161047d9190612c50565b60405180910390f35b61048e61123b565b005b6104aa60048036038101906104a59190612650565b61124f565b005b6104b4611261565b6040516104c19190612a98565b60405180910390f35b6104d2611274565b005b6104dc6112a8565b6040516104e99190612a31565b60405180910390f35b6104fa6112d2565b6040516105079190612ace565b60405180910390f35b61052a60048036038101906105259190612587565b611364565b005b61054660048036038101906105419190612504565b6114dc565b005b61055061154f565b60405161055d9190612c50565b60405180910390f35b610580600480360381019061057b9190612720565b611554565b60405161058d9190612ace565b60405180910390f35b61059e6115e8565b6040516105ab9190612ace565b60405180910390f35b6105bc611676565b005b6105d860048036038101906105d39190612471565b6116aa565b6040516105e59190612a98565b60405180910390f35b61060860048036038101906106039190612444565b61173e565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061066557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106955750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600d6020528060005260406000206000915090505481565b6106bc6117c2565b80600990805190602001906106d29291906121a5565b5050565b6060600280546106e590612edc565b80601f016020809104026020016040519081016040528092919081815260200182805461071190612edc565b801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b5050505050905090565b600061077382611840565b6107a9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f28261116b565b90508073ffffffffffffffffffffffffffffffffffffffff1661081361189f565b73ffffffffffffffffffffffffffffffffffffffff16146108765761083f8161083a61189f565b6116aa565b610875576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090612bb0565b60405180910390fd5b600a60009054906101000a900460ff166109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90612c30565b60405180910390fd5b61045760016109f5610b32565b6109ff9190612d61565b1115610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790612af0565b60405180910390fd5b600180600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a8d9190612d61565b1115610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590612c10565b60405180910390fd5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b1e9190612d61565b92505081905550610b303360016118a7565b565b6000610b3c6118c5565b6001546000540303905090565b600c6020528060005260406000206000915090505481565b6000610b6c826118ca565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bd3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610bdf84611998565b91509150610bf58187610bf061189f565b6119bf565b610c4157610c0a86610c0561189f565b6116aa565b610c40576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cb58686866001611a03565b8015610cc057600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d8e85610d6a888887611a09565b7c020000000000000000000000000000000000000000000000000000000017611a31565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610e16576000600185019050600060046000838152602001908152602001600020541415610e14576000548114610e13578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610e7e8686866001611a5c565b505050505050565b61045781565b600a60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612bb0565b60405180910390fd5b600a60019054906101000a900460ff16610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5390612b70565b60405180910390fd5b6104576001610f69610b32565b610f739190612d61565b1115610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90612b30565b60405180910390fd5b600180600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110019190612d61565b1115611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990612b50565b60405180910390fd5b60003360405160200161105591906129e7565b60405160208183030381529060405280519060200120905061107a82600b5483611a62565b6110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090612b90565b60405180910390fd5b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111099190612d61565b9250508190555061111b3360016118a7565b5050565b61113a838383604051806020016040528060008152506114dc565b505050565b6000600b54905090565b6111516117c2565b80600990805190602001906111679291906121a5565b5050565b6000611176826118ca565b9050919050565b600181565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ea576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112436117c2565b61124d6000611a79565b565b6112576117c2565b80600b8190555050565b600a60019054906101000a900460ff1681565b61127c6117c2565b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112e190612edc565b80601f016020809104026020016040519081016040528092919081815260200182805461130d90612edc565b801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050905090565b61136c61189f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113d1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006113de61189f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661148b61189f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114d09190612a98565b60405180910390a35050565b6114e7848484610b61565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115495761151284848484611b3f565b611548576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600181565b606061155f82611840565b61159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590612bf0565b60405180910390fd5b60006001836115ad9190612d61565b90506115b7611c9f565b6115c082611d31565b6040516020016115d1929190612a02565b604051602081830303815290604052915050919050565b600980546115f590612edc565b80601f016020809104026020016040519081016040528092919081815260200182805461162190612edc565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b505050505081565b61167e6117c2565b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6117466117c2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90612b10565b60405180910390fd5b6117bf81611a79565b50565b6117ca611e92565b73ffffffffffffffffffffffffffffffffffffffff166117e86112a8565b73ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590612bd0565b60405180910390fd5b565b60008161184b6118c5565b1115801561185a575060005482105b8015611898575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6118c1828260405180602001604052806000815250611e9a565b5050565b600090565b600080829050806118d96118c5565b11611961576000548110156119605760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561195e575b6000811415611954576004600083600190039350838152602001908152602001600020549050611929565b8092505050611993565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611a20868684611f37565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600082611a6f8584611f40565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b6561189f565b8786866040518563ffffffff1660e01b8152600401611b879493929190612a4c565b602060405180830381600087803b158015611ba157600080fd5b505af1925050508015611bd257506040513d601f19601f82011682018060405250810190611bcf91906126aa565b60015b611c4c573d8060008114611c02576040519150601f19603f3d011682016040523d82523d6000602084013e611c07565b606091505b50600081511415611c44576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611cae90612edc565b80601f0160208091040260200160405190810160405280929190818152602001828054611cda90612edc565b8015611d275780601f10611cfc57610100808354040283529160200191611d27565b820191906000526020600020905b815481529060010190602001808311611d0a57829003601f168201915b5050505050905090565b60606000821415611d79576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e8d565b600082905060005b60008214611dab578080611d9490612f3f565b915050600a82611da49190612db7565b9150611d81565b60008167ffffffffffffffff811115611dc757611dc6613099565b5b6040519080825280601f01601f191660200182016040528015611df95781602001600182028036833780820191505090505b5090505b60008514611e8657600182611e129190612de8565b9150600a85611e219190612fac565b6030611e2d9190612d61565b60f81b818381518110611e4357611e4261306a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e7f9190612db7565b9450611dfd565b8093505050505b919050565b600033905090565b611ea48383611f96565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f3257600080549050600083820390505b611ee46000868380600101945086611b3f565b611f1a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611ed1578160005414611f2f57600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015611f8b57611f7682868381518110611f6957611f6861306a565b5b6020026020010151612153565b91508080611f8390612f3f565b915050611f49565b508091505092915050565b6000805490506000821415611fd7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fe46000848385611a03565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061205b8361204c6000866000611a09565b6120558561217e565b17611a31565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146120fc57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506120c1565b506000821415612138576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061214e6000848385611a5c565b505050565b600081831061216b57612166828461218e565b612176565b612175838361218e565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b8280546121b190612edc565b90600052602060002090601f0160209004810192826121d3576000855561221a565b82601f106121ec57805160ff191683800117855561221a565b8280016001018555821561221a579182015b828111156122195782518255916020019190600101906121fe565b5b509050612227919061222b565b5090565b5b8082111561224457600081600090555060010161222c565b5090565b600061225b61225684612c90565b612c6b565b9050808382526020820190508285602086028201111561227e5761227d6130cd565b5b60005b858110156122ae57816122948882612394565b845260208401935060208301925050600181019050612281565b5050509392505050565b60006122cb6122c684612cbc565b612c6b565b9050828152602081018484840111156122e7576122e66130d2565b5b6122f2848285612e9a565b509392505050565b600061230d61230884612ced565b612c6b565b905082815260208101848484011115612329576123286130d2565b5b612334848285612e9a565b509392505050565b60008135905061234b81613441565b92915050565b600082601f830112612366576123656130c8565b5b8135612376848260208601612248565b91505092915050565b60008135905061238e81613458565b92915050565b6000813590506123a38161346f565b92915050565b6000813590506123b881613486565b92915050565b6000815190506123cd81613486565b92915050565b600082601f8301126123e8576123e76130c8565b5b81356123f88482602086016122b8565b91505092915050565b600082601f830112612416576124156130c8565b5b81356124268482602086016122fa565b91505092915050565b60008135905061243e8161349d565b92915050565b60006020828403121561245a576124596130dc565b5b60006124688482850161233c565b91505092915050565b60008060408385031215612488576124876130dc565b5b60006124968582860161233c565b92505060206124a78582860161233c565b9150509250929050565b6000806000606084860312156124ca576124c96130dc565b5b60006124d88682870161233c565b93505060206124e98682870161233c565b92505060406124fa8682870161242f565b9150509250925092565b6000806000806080858703121561251e5761251d6130dc565b5b600061252c8782880161233c565b945050602061253d8782880161233c565b935050604061254e8782880161242f565b925050606085013567ffffffffffffffff81111561256f5761256e6130d7565b5b61257b878288016123d3565b91505092959194509250565b6000806040838503121561259e5761259d6130dc565b5b60006125ac8582860161233c565b92505060206125bd8582860161237f565b9150509250929050565b600080604083850312156125de576125dd6130dc565b5b60006125ec8582860161233c565b92505060206125fd8582860161242f565b9150509250929050565b60006020828403121561261d5761261c6130dc565b5b600082013567ffffffffffffffff81111561263b5761263a6130d7565b5b61264784828501612351565b91505092915050565b600060208284031215612666576126656130dc565b5b600061267484828501612394565b91505092915050565b600060208284031215612693576126926130dc565b5b60006126a1848285016123a9565b91505092915050565b6000602082840312156126c0576126bf6130dc565b5b60006126ce848285016123be565b91505092915050565b6000602082840312156126ed576126ec6130dc565b5b600082013567ffffffffffffffff81111561270b5761270a6130d7565b5b61271784828501612401565b91505092915050565b600060208284031215612736576127356130dc565b5b60006127448482850161242f565b91505092915050565b61275681612e1c565b82525050565b61276d61276882612e1c565b612f88565b82525050565b61277c81612e2e565b82525050565b61278b81612e3a565b82525050565b600061279c82612d1e565b6127a68185612d34565b93506127b6818560208601612ea9565b6127bf816130e1565b840191505092915050565b60006127d582612d29565b6127df8185612d45565b93506127ef818560208601612ea9565b6127f8816130e1565b840191505092915050565b600061280e82612d29565b6128188185612d56565b9350612828818560208601612ea9565b80840191505092915050565b6000612841602183612d45565b915061284c826130ff565b604082019050919050565b6000612864602683612d45565b915061286f8261314e565b604082019050919050565b6000612887602d83612d45565b91506128928261319d565b604082019050919050565b60006128aa603683612d45565b91506128b5826131ec565b604082019050919050565b60006128cd602383612d45565b91506128d88261323b565b604082019050919050565b60006128f0602c83612d45565b91506128fb8261328a565b604082019050919050565b6000612913602e83612d45565b915061291e826132d9565b604082019050919050565b6000612936600583612d56565b915061294182613328565b600582019050919050565b6000612959602083612d45565b915061296482613351565b602082019050919050565b600061297c602f83612d45565b91506129878261337a565b604082019050919050565b600061299f602d83612d45565b91506129aa826133c9565b604082019050919050565b60006129c2601f83612d45565b91506129cd82613418565b602082019050919050565b6129e181612e90565b82525050565b60006129f3828461275c565b60148201915081905092915050565b6000612a0e8285612803565b9150612a1a8284612803565b9150612a2582612929565b91508190509392505050565b6000602082019050612a46600083018461274d565b92915050565b6000608082019050612a61600083018761274d565b612a6e602083018661274d565b612a7b60408301856129d8565b8181036060830152612a8d8184612791565b905095945050505050565b6000602082019050612aad6000830184612773565b92915050565b6000602082019050612ac86000830184612782565b92915050565b60006020820190508181036000830152612ae881846127ca565b905092915050565b60006020820190508181036000830152612b0981612834565b9050919050565b60006020820190508181036000830152612b2981612857565b9050919050565b60006020820190508181036000830152612b498161287a565b9050919050565b60006020820190508181036000830152612b698161289d565b9050919050565b60006020820190508181036000830152612b89816128c0565b9050919050565b60006020820190508181036000830152612ba9816128e3565b9050919050565b60006020820190508181036000830152612bc981612906565b9050919050565b60006020820190508181036000830152612be98161294c565b9050919050565b60006020820190508181036000830152612c098161296f565b9050919050565b60006020820190508181036000830152612c2981612992565b9050919050565b60006020820190508181036000830152612c49816129b5565b9050919050565b6000602082019050612c6560008301846129d8565b92915050565b6000612c75612c86565b9050612c818282612f0e565b919050565b6000604051905090565b600067ffffffffffffffff821115612cab57612caa613099565b5b602082029050602081019050919050565b600067ffffffffffffffff821115612cd757612cd6613099565b5b612ce0826130e1565b9050602081019050919050565b600067ffffffffffffffff821115612d0857612d07613099565b5b612d11826130e1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d6c82612e90565b9150612d7783612e90565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dac57612dab612fdd565b5b828201905092915050565b6000612dc282612e90565b9150612dcd83612e90565b925082612ddd57612ddc61300c565b5b828204905092915050565b6000612df382612e90565b9150612dfe83612e90565b925082821015612e1157612e10612fdd565b5b828203905092915050565b6000612e2782612e70565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612ec7578082015181840152602081019050612eac565b83811115612ed6576000848401525b50505050565b60006002820490506001821680612ef457607f821691505b60208210811415612f0857612f0761303b565b5b50919050565b612f17826130e1565b810181811067ffffffffffffffff82111715612f3657612f35613099565b5b80604052505050565b6000612f4a82612e90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f7d57612f7c612fdd565b5b600182019050919050565b6000612f9382612f9a565b9050919050565b6000612fa5826130f2565b9050919050565b6000612fb782612e90565b9150612fc283612e90565b925082612fd257612fd161300c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f49742773206c6f6164696e67203a3a204265796f6e64204d617820537570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a2043616e6e6f74206d696e74206265796f60008201527f6e64206d617820737570706c7900000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a2043616e6e6f74206d696e74206265796f60008201527f6e642077686974656c697374206d6178206d696e742100000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a204d696e74696e67206973206f6e20506160008201527f7573650000000000000000000000000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a20596f7520617265206e6f74206f6e207460008201527f68652077686974656c6973740000000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a2043616e6e6f742062652063616c6c656460008201527f206279206120636f6e7472616374000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a20416c7265616479206d696e746564206d60008201527f6178696d756d2074696d65732100000000000000000000000000000000000000602082015250565b7f49742773206c6f6164696e67203a3a204e6f7420596574204163746976652e00600082015250565b61344a81612e1c565b811461345557600080fd5b50565b61346181612e2e565b811461346c57600080fd5b50565b61347881612e3a565b811461348357600080fd5b50565b61348f81612e44565b811461349a57600080fd5b50565b6134a681612e90565b81146134b157600080fd5b5056fea264697066735822122049c7d93f68f39c13c4dd7cf9c478e9d2f09916466206226489a0ae3c82b339ed64736f6c63430008070033
Deployed Bytecode Sourcemap
65748:3062:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33284:639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66182:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68276:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34186:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40669:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40110:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66455:402;;;:::i;:::-;;29937:323;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66125:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44376:2817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65839:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66027:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66865:695;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47289:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68512:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67647:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35579:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65887:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31121:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14032:103;;;:::i;:::-;;68399:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66056:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68612:98;;;:::i;:::-;;13384:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34362:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41227:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48072:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65937:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67960:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65992:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68718:89;;;:::i;:::-;;41692:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14290:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33284:639;33369:4;33708:10;33693:25;;:11;:25;;;;:102;;;;33785:10;33770:25;;:11;:25;;;;33693:102;:179;;;;33862:10;33847:25;;:11;:25;;;;33693:179;33673:199;;33284:639;;;:::o;66182:53::-;;;;;;;;;;;;;;;;;:::o;68276:115::-;13270:13;:11;:13::i;:::-;68370::::1;68355:12;:28;;;;;;;;;;;;:::i;:::-;;68276:115:::0;:::o;34186:100::-;34240:13;34273:5;34266:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34186:100;:::o;40669:218::-;40745:7;40770:16;40778:7;40770;:16::i;:::-;40765:64;;40795:34;;;;;;;;;;;;;;40765:64;40849:15;:24;40865:7;40849:24;;;;;;;;;;;:30;;;;;;;;;;;;40842:37;;40669:218;;;:::o;40110:400::-;40191:13;40207:16;40215:7;40207;:16::i;:::-;40191:32;;40263:5;40240:28;;:19;:17;:19::i;:::-;:28;;;40236:175;;40288:44;40305:5;40312:19;:17;:19::i;:::-;40288:16;:44::i;:::-;40283:128;;40360:35;;;;;;;;;;;;;;40283:128;40236:175;40456:2;40423:15;:24;40439:7;40423:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40494:7;40490:2;40474:28;;40483:5;40474:28;;;;;;;;;;;;40180:330;40110:400;;:::o;66455:402::-;66366:10;66353:23;;:9;:23;;;66345:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;66512:10:::1;;;;;;;;;;;66504:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;65876:4;66594:1;66578:13;:11;:13::i;:::-;:17;;;;:::i;:::-;66577:33;;66569:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;65929:1;66698::::0;66668:15:::1;:27;66684:10;66668:27;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;66667:52;;66659:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;66813:1;66782:15;:27;66798:10;66782:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;66825:24;66835:10;66847:1;66825:9;:24::i;:::-;66455:402::o:0;29937:323::-;29998:7;30226:15;:13;:15::i;:::-;30211:12;;30195:13;;:28;:46;30188:53;;29937:323;:::o;66125:50::-;;;;;;;;;;;;;;;;;:::o;44376:2817::-;44510:27;44540;44559:7;44540:18;:27::i;:::-;44510:57;;44625:4;44584:45;;44600:19;44584:45;;;44580:86;;44638:28;;;;;;;;;;;;;;44580:86;44680:27;44709:23;44736:35;44763:7;44736:26;:35::i;:::-;44679:92;;;;44871:68;44896:15;44913:4;44919:19;:17;:19::i;:::-;44871:24;:68::i;:::-;44866:180;;44959:43;44976:4;44982:19;:17;:19::i;:::-;44959:16;:43::i;:::-;44954:92;;45011:35;;;;;;;;;;;;;;44954:92;44866:180;45077:1;45063:16;;:2;:16;;;45059:52;;;45088:23;;;;;;;;;;;;;;45059:52;45124:43;45146:4;45152:2;45156:7;45165:1;45124:21;:43::i;:::-;45260:15;45257:160;;;45400:1;45379:19;45372:30;45257:160;45797:18;:24;45816:4;45797:24;;;;;;;;;;;;;;;;45795:26;;;;;;;;;;;;45866:18;:22;45885:2;45866:22;;;;;;;;;;;;;;;;45864:24;;;;;;;;;;;46188:146;46225:2;46274:45;46289:4;46295:2;46299:19;46274:14;:45::i;:::-;26336:8;46246:73;46188:18;:146::i;:::-;46159:17;:26;46177:7;46159:26;;;;;;;;;;;:175;;;;46505:1;26336:8;46454:19;:47;:52;46450:627;;;46527:19;46559:1;46549:7;:11;46527:33;;46716:1;46682:17;:30;46700:11;46682:30;;;;;;;;;;;;:35;46678:384;;;46820:13;;46805:11;:28;46801:242;;47000:19;46967:17;:30;46985:11;46967:30;;;;;;;;;;;:52;;;;46801:242;46678:384;46508:569;46450:627;47124:7;47120:2;47105:27;;47114:4;47105:27;;;;;;;;;;;;47143:42;47164:4;47170:2;47174:7;47183:1;47143:20;:42::i;:::-;44499:2694;;;44376:2817;;;:::o;65839:41::-;65876:4;65839:41;:::o;66027:22::-;;;;;;;;;;;;;:::o;66865:695::-;66366:10;66353:23;;:9;:23;;;66345:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;66960:13:::1;;;;;;;;;;;66952:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;65876:4;67049:1;67033:13;:11;:13::i;:::-;:17;;;;:::i;:::-;67032:33;;67024:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;65982:1;67168::::0;67135:18:::1;:30;67154:10;67135:30;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;67134:59;;67126:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;67293:14;67337:10;67320:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;67310:39;;;;;;67293:56;;67368:52;67387:12;67401:10;;67413:6;67368:18;:52::i;:::-;67360:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;67516:1;67482:18;:30;67501:10;67482:30;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;67528:24;67538:10;67550:1;67528:9;:24::i;:::-;66941:619;66865:695:::0;:::o;47289:185::-;47427:39;47444:4;47450:2;47454:7;47427:39;;;;;;;;;;;;:16;:39::i;:::-;47289:185;;;:::o;68512:92::-;68560:7;68586:10;;68579:17;;68512:92;:::o;67647:97::-;13270:13;:11;:13::i;:::-;67731:7:::1;67716:12;:22;;;;;;;;;;;;:::i;:::-;;67647:97:::0;:::o;35579:152::-;35651:7;35694:27;35713:7;35694:18;:27::i;:::-;35671:52;;35579:152;;;:::o;65887:43::-;65929:1;65887:43;:::o;31121:233::-;31193:7;31234:1;31217:19;;:5;:19;;;31213:60;;;31245:28;;;;;;;;;;;;;;31213:60;25280:13;31291:18;:25;31310:5;31291:25;;;;;;;;;;;;;;;;:55;31284:62;;31121:233;;;:::o;14032:103::-;13270:13;:11;:13::i;:::-;14097:30:::1;14124:1;14097:18;:30::i;:::-;14032:103::o:0;68399:105::-;13270:13;:11;:13::i;:::-;68485:11:::1;68472:10;:24;;;;68399:105:::0;:::o;66056:25::-;;;;;;;;;;;;;:::o;68612:98::-;13270:13;:11;:13::i;:::-;68689::::1;;;;;;;;;;;68688:14;68672:13;;:30;;;;;;;;;;;;;;;;;;68612:98::o:0;13384:87::-;13430:7;13457:6;;;;;;;;;;;13450:13;;13384:87;:::o;34362:104::-;34418:13;34451:7;34444:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34362:104;:::o;41227:308::-;41338:19;:17;:19::i;:::-;41326:31;;:8;:31;;;41322:61;;;41366:17;;;;;;;;;;;;;;41322:61;41448:8;41396:18;:39;41415:19;:17;:19::i;:::-;41396:39;;;;;;;;;;;;;;;:49;41436:8;41396:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41508:8;41472:55;;41487:19;:17;:19::i;:::-;41472:55;;;41518:8;41472:55;;;;;;:::i;:::-;;;;;;;;41227:308;;:::o;48072:399::-;48239:31;48252:4;48258:2;48262:7;48239:12;:31::i;:::-;48303:1;48285:2;:14;;;:19;48281:183;;48324:56;48355:4;48361:2;48365:7;48374:5;48324:30;:56::i;:::-;48319:145;;48408:40;;;;;;;;;;;;;;48319:145;48281:183;48072:399;;;;:::o;65937:46::-;65982:1;65937:46;:::o;67960:308::-;68033:13;68067:16;68075:7;68067;:16::i;:::-;68059:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;68148:14;68175:1;68165:7;:11;;;;:::i;:::-;68148:28;;68220:10;:8;:10::i;:::-;68232:17;:6;:15;:17::i;:::-;68203:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68189:71;;;67960:308;;;:::o;65992:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68718:89::-;13270:13;:11;:13::i;:::-;68789:10:::1;;;;;;;;;;;68788:11;68775:10;;:24;;;;;;;;;;;;;;;;;;68718:89::o:0;41692:164::-;41789:4;41813:18;:25;41832:5;41813:25;;;;;;;;;;;;;;;:35;41839:8;41813:35;;;;;;;;;;;;;;;;;;;;;;;;;41806:42;;41692:164;;;;:::o;14290:201::-;13270:13;:11;:13::i;:::-;14399:1:::1;14379:22;;:8;:22;;;;14371:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14455:28;14474:8;14455:18;:28::i;:::-;14290:201:::0;:::o;13549:132::-;13624:12;:10;:12::i;:::-;13613:23;;:7;:5;:7::i;:::-;:23;;;13605:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13549:132::o;42114:282::-;42179:4;42235:7;42216:15;:13;:15::i;:::-;:26;;:66;;;;;42269:13;;42259:7;:23;42216:66;:153;;;;;42368:1;26056:8;42320:17;:26;42338:7;42320:26;;;;;;;;;;;;:44;:49;42216:153;42196:173;;42114:282;;;:::o;63880:105::-;63940:7;63967:10;63960:17;;63880:105;:::o;57712:112::-;57789:27;57799:2;57803:8;57789:27;;;;;;;;;;;;:9;:27::i;:::-;57712:112;;:::o;29453:92::-;29509:7;29453:92;:::o;36734:1275::-;36801:7;36821:12;36836:7;36821:22;;36904:4;36885:15;:13;:15::i;:::-;:23;36881:1061;;36938:13;;36931:4;:20;36927:1015;;;36976:14;36993:17;:23;37011:4;36993:23;;;;;;;;;;;;36976:40;;37110:1;26056:8;37082:6;:24;:29;37078:845;;;37747:113;37764:1;37754:6;:11;37747:113;;;37807:17;:25;37825:6;;;;;;;37807:25;;;;;;;;;;;;37798:34;;37747:113;;;37893:6;37886:13;;;;;;37078:845;36953:989;36927:1015;36881:1061;37970:31;;;;;;;;;;;;;;36734:1275;;;;:::o;43277:479::-;43379:27;43408:23;43449:38;43490:15;:24;43506:7;43490:24;;;;;;;;;;;43449:65;;43661:18;43638:41;;43718:19;43712:26;43693:45;;43623:126;43277:479;;;:::o;42505:659::-;42654:11;42819:16;42812:5;42808:28;42799:37;;42979:16;42968:9;42964:32;42951:45;;43129:15;43118:9;43115:30;43107:5;43096:9;43093:20;43090:56;43080:66;;42505:659;;;;;:::o;49133:159::-;;;;;:::o;63189:311::-;63324:7;63344:16;26460:3;63370:19;:41;;63344:68;;26460:3;63438:31;63449:4;63455:2;63459:9;63438:10;:31::i;:::-;63430:40;;:62;;63423:69;;;63189:311;;;;;:::o;38557:450::-;38637:14;38805:16;38798:5;38794:28;38785:37;;38982:5;38968:11;38943:23;38939:41;38936:52;38929:5;38926:63;38916:73;;38557:450;;;;:::o;49957:158::-;;;;;:::o;3750:190::-;3875:4;3928;3899:25;3912:5;3919:4;3899:12;:25::i;:::-;:33;3892:40;;3750:190;;;;;:::o;14651:191::-;14725:16;14744:6;;;;;;;;;;;14725:25;;14770:8;14761:6;;:17;;;;;;;;;;;;;;;;;;14825:8;14794:40;;14815:8;14794:40;;;;;;;;;;;;14714:128;14651:191;:::o;50555:716::-;50718:4;50764:2;50739:45;;;50785:19;:17;:19::i;:::-;50806:4;50812:7;50821:5;50739:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50735:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51039:1;51022:6;:13;:18;51018:235;;;51068:40;;;;;;;;;;;;;;51018:235;51211:6;51205:13;51196:6;51192:2;51188:15;51181:38;50735:529;50908:54;;;50898:64;;;:6;:64;;;;50891:71;;;50555:716;;;;;;:::o;67809:107::-;67869:13;67898:12;67891:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67809:107;:::o;464:723::-;520:13;750:1;741:5;:10;737:53;;;768:10;;;;;;;;;;;;;;;;;;;;;737:53;800:12;815:5;800:20;;831:14;856:78;871:1;863:4;:9;856:78;;889:8;;;;;:::i;:::-;;;;920:2;912:10;;;;;:::i;:::-;;;856:78;;;944:19;976:6;966:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;944:39;;994:154;1010:1;1001:5;:10;994:154;;1038:1;1028:11;;;;;:::i;:::-;;;1105:2;1097:5;:10;;;;:::i;:::-;1084:2;:24;;;;:::i;:::-;1071:39;;1054:6;1061;1054:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1134:2;1125:11;;;;;:::i;:::-;;;994:154;;;1172:6;1158:21;;;;;464:723;;;;:::o;11935:98::-;11988:7;12015:10;12008:17;;11935:98;:::o;56939:689::-;57070:19;57076:2;57080:8;57070:5;:19::i;:::-;57149:1;57131:2;:14;;;:19;57127:483;;57171:11;57185:13;;57171:27;;57217:13;57239:8;57233:3;:14;57217:30;;57266:233;57297:62;57336:1;57340:2;57344:7;;;;;;57353:5;57297:30;:62::i;:::-;57292:167;;57395:40;;;;;;;;;;;;;;57292:167;57494:3;57486:5;:11;57266:233;;57581:3;57564:13;;:20;57560:34;;57586:8;;;57560:34;57152:458;;57127:483;56939:689;;;:::o;62890:147::-;63027:6;62890:147;;;;;:::o;4617:296::-;4700:7;4720:20;4743:4;4720:27;;4763:9;4758:118;4782:5;:12;4778:1;:16;4758:118;;;4831:33;4841:12;4855:5;4861:1;4855:8;;;;;;;;:::i;:::-;;;;;;;;4831:9;:33::i;:::-;4816:48;;4796:3;;;;;:::i;:::-;;;;4758:118;;;;4893:12;4886:19;;;4617:296;;;;:::o;51733:2454::-;51806:20;51829:13;;51806:36;;51869:1;51857:8;:13;51853:44;;;51879:18;;;;;;;;;;;;;;51853:44;51910:61;51940:1;51944:2;51948:12;51962:8;51910:21;:61::i;:::-;52454:1;25418:2;52424:1;:26;;52423:32;52411:8;:45;52385:18;:22;52404:2;52385:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;52733:139;52770:2;52824:33;52847:1;52851:2;52855:1;52824:14;:33::i;:::-;52791:30;52812:8;52791:20;:30::i;:::-;:66;52733:18;:139::i;:::-;52699:17;:31;52717:12;52699:31;;;;;;;;;;;:173;;;;52889:16;52920:11;52949:8;52934:12;:23;52920:37;;53204:16;53200:2;53196:25;53184:37;;53576:12;53536:8;53495:1;53433:25;53374:1;53313;53286:335;53701:1;53687:12;53683:20;53641:346;53742:3;53733:7;53730:16;53641:346;;53960:7;53950:8;53947:1;53920:25;53917:1;53914;53909:59;53795:1;53786:7;53782:15;53771:26;;53641:346;;;53645:77;54032:1;54020:8;:13;54016:45;;;54042:19;;;;;;;;;;;;;;54016:45;54094:3;54078:13;:19;;;;52159:1950;;54119:60;54148:1;54152:2;54156:12;54170:8;54119:20;:60::i;:::-;51795:2392;51733:2454;;:::o;10824:149::-;10887:7;10918:1;10914;:5;:51;;10945:20;10960:1;10963;10945:14;:20::i;:::-;10914:51;;;10922:20;10937:1;10940;10922:14;:20::i;:::-;10914:51;10907:58;;10824:149;;;;:::o;39109:324::-;39179:14;39412:1;39402:8;39399:15;39373:24;39369:46;39359:56;;39109:324;;;:::o;10981:268::-;11049:13;11156:1;11150:4;11143:15;11185:1;11179:4;11172:15;11226:4;11220;11210:21;11201:30;;10981:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:539::-;6987:6;7036:2;7024:9;7015:7;7011:23;7007:32;7004:119;;;7042:79;;:::i;:::-;7004:119;7190:1;7179:9;7175:17;7162:31;7220:18;7212:6;7209:30;7206:117;;;7242:79;;:::i;:::-;7206:117;7347:78;7417:7;7408:6;7397:9;7393:22;7347:78;:::i;:::-;7337:88;;7133:302;6903:539;;;;:::o;7448:329::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7653:117;7448:329;;;;:::o;7783:327::-;7841:6;7890:2;7878:9;7869:7;7865:23;7861:32;7858:119;;;7896:79;;:::i;:::-;7858:119;8016:1;8041:52;8085:7;8076:6;8065:9;8061:22;8041:52;:::i;:::-;8031:62;;7987:116;7783:327;;;;:::o;8116:349::-;8185:6;8234:2;8222:9;8213:7;8209:23;8205:32;8202:119;;;8240:79;;:::i;:::-;8202:119;8360:1;8385:63;8440:7;8431:6;8420:9;8416:22;8385:63;:::i;:::-;8375:73;;8331:127;8116:349;;;;:::o;8471:509::-;8540:6;8589:2;8577:9;8568:7;8564:23;8560:32;8557:119;;;8595:79;;:::i;:::-;8557:119;8743:1;8732:9;8728:17;8715:31;8773:18;8765:6;8762:30;8759:117;;;8795:79;;:::i;:::-;8759:117;8900:63;8955:7;8946:6;8935:9;8931:22;8900:63;:::i;:::-;8890:73;;8686:287;8471:509;;;;:::o;8986:329::-;9045:6;9094:2;9082:9;9073:7;9069:23;9065:32;9062:119;;;9100:79;;:::i;:::-;9062:119;9220:1;9245:53;9290:7;9281:6;9270:9;9266:22;9245:53;:::i;:::-;9235:63;;9191:117;8986:329;;;;:::o;9321:118::-;9408:24;9426:5;9408:24;:::i;:::-;9403:3;9396:37;9321:118;;:::o;9445:157::-;9550:45;9570:24;9588:5;9570:24;:::i;:::-;9550:45;:::i;:::-;9545:3;9538:58;9445:157;;:::o;9608:109::-;9689:21;9704:5;9689:21;:::i;:::-;9684:3;9677:34;9608:109;;:::o;9723:118::-;9810:24;9828:5;9810:24;:::i;:::-;9805:3;9798:37;9723:118;;:::o;9847:360::-;9933:3;9961:38;9993:5;9961:38;:::i;:::-;10015:70;10078:6;10073:3;10015:70;:::i;:::-;10008:77;;10094:52;10139:6;10134:3;10127:4;10120:5;10116:16;10094:52;:::i;:::-;10171:29;10193:6;10171:29;:::i;:::-;10166:3;10162:39;10155:46;;9937:270;9847:360;;;;:::o;10213:364::-;10301:3;10329:39;10362:5;10329:39;:::i;:::-;10384:71;10448:6;10443:3;10384:71;:::i;:::-;10377:78;;10464:52;10509:6;10504:3;10497:4;10490:5;10486:16;10464:52;:::i;:::-;10541:29;10563:6;10541:29;:::i;:::-;10536:3;10532:39;10525:46;;10305:272;10213:364;;;;:::o;10583:377::-;10689:3;10717:39;10750:5;10717:39;:::i;:::-;10772:89;10854:6;10849:3;10772:89;:::i;:::-;10765:96;;10870:52;10915:6;10910:3;10903:4;10896:5;10892:16;10870:52;:::i;:::-;10947:6;10942:3;10938:16;10931:23;;10693:267;10583:377;;;;:::o;10966:366::-;11108:3;11129:67;11193:2;11188:3;11129:67;:::i;:::-;11122:74;;11205:93;11294:3;11205:93;:::i;:::-;11323:2;11318:3;11314:12;11307:19;;10966:366;;;:::o;11338:::-;11480:3;11501:67;11565:2;11560:3;11501:67;:::i;:::-;11494:74;;11577:93;11666:3;11577:93;:::i;:::-;11695:2;11690:3;11686:12;11679:19;;11338:366;;;:::o;11710:::-;11852:3;11873:67;11937:2;11932:3;11873:67;:::i;:::-;11866:74;;11949:93;12038:3;11949:93;:::i;:::-;12067:2;12062:3;12058:12;12051:19;;11710:366;;;:::o;12082:::-;12224:3;12245:67;12309:2;12304:3;12245:67;:::i;:::-;12238:74;;12321:93;12410:3;12321:93;:::i;:::-;12439:2;12434:3;12430:12;12423:19;;12082:366;;;:::o;12454:::-;12596:3;12617:67;12681:2;12676:3;12617:67;:::i;:::-;12610:74;;12693:93;12782:3;12693:93;:::i;:::-;12811:2;12806:3;12802:12;12795:19;;12454:366;;;:::o;12826:::-;12968:3;12989:67;13053:2;13048:3;12989:67;:::i;:::-;12982:74;;13065:93;13154:3;13065:93;:::i;:::-;13183:2;13178:3;13174:12;13167:19;;12826:366;;;:::o;13198:::-;13340:3;13361:67;13425:2;13420:3;13361:67;:::i;:::-;13354:74;;13437:93;13526:3;13437:93;:::i;:::-;13555:2;13550:3;13546:12;13539:19;;13198:366;;;:::o;13570:400::-;13730:3;13751:84;13833:1;13828:3;13751:84;:::i;:::-;13744:91;;13844:93;13933:3;13844:93;:::i;:::-;13962:1;13957:3;13953:11;13946:18;;13570:400;;;:::o;13976:366::-;14118:3;14139:67;14203:2;14198:3;14139:67;:::i;:::-;14132:74;;14215:93;14304:3;14215:93;:::i;:::-;14333:2;14328:3;14324:12;14317:19;;13976:366;;;:::o;14348:::-;14490:3;14511:67;14575:2;14570:3;14511:67;:::i;:::-;14504:74;;14587:93;14676:3;14587:93;:::i;:::-;14705:2;14700:3;14696:12;14689:19;;14348:366;;;:::o;14720:::-;14862:3;14883:67;14947:2;14942:3;14883:67;:::i;:::-;14876:74;;14959:93;15048:3;14959:93;:::i;:::-;15077:2;15072:3;15068:12;15061:19;;14720:366;;;:::o;15092:::-;15234:3;15255:67;15319:2;15314:3;15255:67;:::i;:::-;15248:74;;15331:93;15420:3;15331:93;:::i;:::-;15449:2;15444:3;15440:12;15433:19;;15092:366;;;:::o;15464:118::-;15551:24;15569:5;15551:24;:::i;:::-;15546:3;15539:37;15464:118;;:::o;15588:256::-;15700:3;15715:75;15786:3;15777:6;15715:75;:::i;:::-;15815:2;15810:3;15806:12;15799:19;;15835:3;15828:10;;15588:256;;;;:::o;15850:701::-;16131:3;16153:95;16244:3;16235:6;16153:95;:::i;:::-;16146:102;;16265:95;16356:3;16347:6;16265:95;:::i;:::-;16258:102;;16377:148;16521:3;16377:148;:::i;:::-;16370:155;;16542:3;16535:10;;15850:701;;;;;:::o;16557:222::-;16650:4;16688:2;16677:9;16673:18;16665:26;;16701:71;16769:1;16758:9;16754:17;16745:6;16701:71;:::i;:::-;16557:222;;;;:::o;16785:640::-;16980:4;17018:3;17007:9;17003:19;16995:27;;17032:71;17100:1;17089:9;17085:17;17076:6;17032:71;:::i;:::-;17113:72;17181:2;17170:9;17166:18;17157:6;17113:72;:::i;:::-;17195;17263:2;17252:9;17248:18;17239:6;17195:72;:::i;:::-;17314:9;17308:4;17304:20;17299:2;17288:9;17284:18;17277:48;17342:76;17413:4;17404:6;17342:76;:::i;:::-;17334:84;;16785:640;;;;;;;:::o;17431:210::-;17518:4;17556:2;17545:9;17541:18;17533:26;;17569:65;17631:1;17620:9;17616:17;17607:6;17569:65;:::i;:::-;17431:210;;;;:::o;17647:222::-;17740:4;17778:2;17767:9;17763:18;17755:26;;17791:71;17859:1;17848:9;17844:17;17835:6;17791:71;:::i;:::-;17647:222;;;;:::o;17875:313::-;17988:4;18026:2;18015:9;18011:18;18003:26;;18075:9;18069:4;18065:20;18061:1;18050:9;18046:17;18039:47;18103:78;18176:4;18167:6;18103:78;:::i;:::-;18095:86;;17875:313;;;;:::o;18194:419::-;18360:4;18398:2;18387:9;18383:18;18375:26;;18447:9;18441:4;18437:20;18433:1;18422:9;18418:17;18411:47;18475:131;18601:4;18475:131;:::i;:::-;18467:139;;18194:419;;;:::o;18619:::-;18785:4;18823:2;18812:9;18808:18;18800:26;;18872:9;18866:4;18862:20;18858:1;18847:9;18843:17;18836:47;18900:131;19026:4;18900:131;:::i;:::-;18892:139;;18619:419;;;:::o;19044:::-;19210:4;19248:2;19237:9;19233:18;19225:26;;19297:9;19291:4;19287:20;19283:1;19272:9;19268:17;19261:47;19325:131;19451:4;19325:131;:::i;:::-;19317:139;;19044:419;;;:::o;19469:::-;19635:4;19673:2;19662:9;19658:18;19650:26;;19722:9;19716:4;19712:20;19708:1;19697:9;19693:17;19686:47;19750:131;19876:4;19750:131;:::i;:::-;19742:139;;19469:419;;;:::o;19894:::-;20060:4;20098:2;20087:9;20083:18;20075:26;;20147:9;20141:4;20137:20;20133:1;20122:9;20118:17;20111:47;20175:131;20301:4;20175:131;:::i;:::-;20167:139;;19894:419;;;:::o;20319:::-;20485:4;20523:2;20512:9;20508:18;20500:26;;20572:9;20566:4;20562:20;20558:1;20547:9;20543:17;20536:47;20600:131;20726:4;20600:131;:::i;:::-;20592:139;;20319:419;;;:::o;20744:::-;20910:4;20948:2;20937:9;20933:18;20925:26;;20997:9;20991:4;20987:20;20983:1;20972:9;20968:17;20961:47;21025:131;21151:4;21025:131;:::i;:::-;21017:139;;20744:419;;;:::o;21169:::-;21335:4;21373:2;21362:9;21358:18;21350:26;;21422:9;21416:4;21412:20;21408:1;21397:9;21393:17;21386:47;21450:131;21576:4;21450:131;:::i;:::-;21442:139;;21169:419;;;:::o;21594:::-;21760:4;21798:2;21787:9;21783:18;21775:26;;21847:9;21841:4;21837:20;21833:1;21822:9;21818:17;21811:47;21875:131;22001:4;21875:131;:::i;:::-;21867:139;;21594:419;;;:::o;22019:::-;22185:4;22223:2;22212:9;22208:18;22200:26;;22272:9;22266:4;22262:20;22258:1;22247:9;22243:17;22236:47;22300:131;22426:4;22300:131;:::i;:::-;22292:139;;22019:419;;;:::o;22444:::-;22610:4;22648:2;22637:9;22633:18;22625:26;;22697:9;22691:4;22687:20;22683:1;22672:9;22668:17;22661:47;22725:131;22851:4;22725:131;:::i;:::-;22717:139;;22444:419;;;:::o;22869:222::-;22962:4;23000:2;22989:9;22985:18;22977:26;;23013:71;23081:1;23070:9;23066:17;23057:6;23013:71;:::i;:::-;22869:222;;;;:::o;23097:129::-;23131:6;23158:20;;:::i;:::-;23148:30;;23187:33;23215:4;23207:6;23187:33;:::i;:::-;23097:129;;;:::o;23232:75::-;23265:6;23298:2;23292:9;23282:19;;23232:75;:::o;23313:311::-;23390:4;23480:18;23472:6;23469:30;23466:56;;;23502:18;;:::i;:::-;23466:56;23552:4;23544:6;23540:17;23532:25;;23612:4;23606;23602:15;23594:23;;23313:311;;;:::o;23630:307::-;23691:4;23781:18;23773:6;23770:30;23767:56;;;23803:18;;:::i;:::-;23767:56;23841:29;23863:6;23841:29;:::i;:::-;23833:37;;23925:4;23919;23915:15;23907:23;;23630:307;;;:::o;23943:308::-;24005:4;24095:18;24087:6;24084:30;24081:56;;;24117:18;;:::i;:::-;24081:56;24155:29;24177:6;24155:29;:::i;:::-;24147:37;;24239:4;24233;24229:15;24221:23;;23943:308;;;:::o;24257:98::-;24308:6;24342:5;24336:12;24326:22;;24257:98;;;:::o;24361:99::-;24413:6;24447:5;24441:12;24431:22;;24361:99;;;:::o;24466:168::-;24549:11;24583:6;24578:3;24571:19;24623:4;24618:3;24614:14;24599:29;;24466:168;;;;:::o;24640:169::-;24724:11;24758:6;24753:3;24746:19;24798:4;24793:3;24789:14;24774:29;;24640:169;;;;:::o;24815:148::-;24917:11;24954:3;24939:18;;24815:148;;;;:::o;24969:305::-;25009:3;25028:20;25046:1;25028:20;:::i;:::-;25023:25;;25062:20;25080:1;25062:20;:::i;:::-;25057:25;;25216:1;25148:66;25144:74;25141:1;25138:81;25135:107;;;25222:18;;:::i;:::-;25135:107;25266:1;25263;25259:9;25252:16;;24969:305;;;;:::o;25280:185::-;25320:1;25337:20;25355:1;25337:20;:::i;:::-;25332:25;;25371:20;25389:1;25371:20;:::i;:::-;25366:25;;25410:1;25400:35;;25415:18;;:::i;:::-;25400:35;25457:1;25454;25450:9;25445:14;;25280:185;;;;:::o;25471:191::-;25511:4;25531:20;25549:1;25531:20;:::i;:::-;25526:25;;25565:20;25583:1;25565:20;:::i;:::-;25560:25;;25604:1;25601;25598:8;25595:34;;;25609:18;;:::i;:::-;25595:34;25654:1;25651;25647:9;25639:17;;25471:191;;;;:::o;25668:96::-;25705:7;25734:24;25752:5;25734:24;:::i;:::-;25723:35;;25668:96;;;:::o;25770:90::-;25804:7;25847:5;25840:13;25833:21;25822:32;;25770:90;;;:::o;25866:77::-;25903:7;25932:5;25921:16;;25866:77;;;:::o;25949:149::-;25985:7;26025:66;26018:5;26014:78;26003:89;;25949:149;;;:::o;26104:126::-;26141:7;26181:42;26174:5;26170:54;26159:65;;26104:126;;;:::o;26236:77::-;26273:7;26302:5;26291:16;;26236:77;;;:::o;26319:154::-;26403:6;26398:3;26393;26380:30;26465:1;26456:6;26451:3;26447:16;26440:27;26319:154;;;:::o;26479:307::-;26547:1;26557:113;26571:6;26568:1;26565:13;26557:113;;;26656:1;26651:3;26647:11;26641:18;26637:1;26632:3;26628:11;26621:39;26593:2;26590:1;26586:10;26581:15;;26557:113;;;26688:6;26685:1;26682:13;26679:101;;;26768:1;26759:6;26754:3;26750:16;26743:27;26679:101;26528:258;26479:307;;;:::o;26792:320::-;26836:6;26873:1;26867:4;26863:12;26853:22;;26920:1;26914:4;26910:12;26941:18;26931:81;;26997:4;26989:6;26985:17;26975:27;;26931:81;27059:2;27051:6;27048:14;27028:18;27025:38;27022:84;;;27078:18;;:::i;:::-;27022:84;26843:269;26792:320;;;:::o;27118:281::-;27201:27;27223:4;27201:27;:::i;:::-;27193:6;27189:40;27331:6;27319:10;27316:22;27295:18;27283:10;27280:34;27277:62;27274:88;;;27342:18;;:::i;:::-;27274:88;27382:10;27378:2;27371:22;27161:238;27118:281;;:::o;27405:233::-;27444:3;27467:24;27485:5;27467:24;:::i;:::-;27458:33;;27513:66;27506:5;27503:77;27500:103;;;27583:18;;:::i;:::-;27500:103;27630:1;27623:5;27619:13;27612:20;;27405:233;;;:::o;27644:100::-;27683:7;27712:26;27732:5;27712:26;:::i;:::-;27701:37;;27644:100;;;:::o;27750:94::-;27789:7;27818:20;27832:5;27818:20;:::i;:::-;27807:31;;27750:94;;;:::o;27850:176::-;27882:1;27899:20;27917:1;27899:20;:::i;:::-;27894:25;;27933:20;27951:1;27933:20;:::i;:::-;27928:25;;27972:1;27962:35;;27977:18;;:::i;:::-;27962:35;28018:1;28015;28011:9;28006:14;;27850:176;;;;:::o;28032:180::-;28080:77;28077:1;28070:88;28177:4;28174:1;28167:15;28201:4;28198:1;28191:15;28218:180;28266:77;28263:1;28256:88;28363:4;28360:1;28353:15;28387:4;28384:1;28377:15;28404:180;28452:77;28449:1;28442:88;28549:4;28546:1;28539:15;28573:4;28570:1;28563:15;28590:180;28638:77;28635:1;28628:88;28735:4;28732:1;28725:15;28759:4;28756:1;28749:15;28776:180;28824:77;28821:1;28814:88;28921:4;28918:1;28911:15;28945:4;28942:1;28935:15;28962:117;29071:1;29068;29061:12;29085:117;29194:1;29191;29184:12;29208:117;29317:1;29314;29307:12;29331:117;29440:1;29437;29430:12;29454:117;29563:1;29560;29553:12;29577:102;29618:6;29669:2;29665:7;29660:2;29653:5;29649:14;29645:28;29635:38;;29577:102;;;:::o;29685:94::-;29718:8;29766:5;29762:2;29758:14;29737:35;;29685:94;;;:::o;29785:220::-;29925:34;29921:1;29913:6;29909:14;29902:58;29994:3;29989:2;29981:6;29977:15;29970:28;29785:220;:::o;30011:225::-;30151:34;30147:1;30139:6;30135:14;30128:58;30220:8;30215:2;30207:6;30203:15;30196:33;30011:225;:::o;30242:232::-;30382:34;30378:1;30370:6;30366:14;30359:58;30451:15;30446:2;30438:6;30434:15;30427:40;30242:232;:::o;30480:241::-;30620:34;30616:1;30608:6;30604:14;30597:58;30689:24;30684:2;30676:6;30672:15;30665:49;30480:241;:::o;30727:222::-;30867:34;30863:1;30855:6;30851:14;30844:58;30936:5;30931:2;30923:6;30919:15;30912:30;30727:222;:::o;30955:231::-;31095:34;31091:1;31083:6;31079:14;31072:58;31164:14;31159:2;31151:6;31147:15;31140:39;30955:231;:::o;31192:233::-;31332:34;31328:1;31320:6;31316:14;31309:58;31401:16;31396:2;31388:6;31384:15;31377:41;31192:233;:::o;31431:155::-;31571:7;31567:1;31559:6;31555:14;31548:31;31431:155;:::o;31592:182::-;31732:34;31728:1;31720:6;31716:14;31709:58;31592:182;:::o;31780:234::-;31920:34;31916:1;31908:6;31904:14;31897:58;31989:17;31984:2;31976:6;31972:15;31965:42;31780:234;:::o;32020:232::-;32160:34;32156:1;32148:6;32144:14;32137:58;32229:15;32224:2;32216:6;32212:15;32205:40;32020:232;:::o;32258:181::-;32398:33;32394:1;32386:6;32382:14;32375:57;32258:181;:::o;32445:122::-;32518:24;32536:5;32518:24;:::i;:::-;32511:5;32508:35;32498:63;;32557:1;32554;32547:12;32498:63;32445:122;:::o;32573:116::-;32643:21;32658:5;32643:21;:::i;:::-;32636:5;32633:32;32623:60;;32679:1;32676;32669:12;32623:60;32573:116;:::o;32695:122::-;32768:24;32786:5;32768:24;:::i;:::-;32761:5;32758:35;32748:63;;32807:1;32804;32797:12;32748:63;32695:122;:::o;32823:120::-;32895:23;32912:5;32895:23;:::i;:::-;32888:5;32885:34;32875:62;;32933:1;32930;32923:12;32875:62;32823:120;:::o;32949:122::-;33022:24;33040:5;33022:24;:::i;:::-;33015:5;33012:35;33002:63;;33061:1;33058;33051:12;33002:63;32949:122;:::o
Swarm Source
ipfs://49c7d93f68f39c13c4dd7cf9c478e9d2f09916466206226489a0ae3c82b339ed
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.