Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
501 FREEPICKPass
Holders
484
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FREEPICKPassLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FreePickerPass
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-20 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { 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/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // 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/NFTPickerPass.sol pragma solidity >= 0.0.5 < 0.8.16; contract FreePickerPass is ERC721A, Ownable { using Strings for uint256; uint256 MAX_SUPPLY = 3000; uint256 public constant MINT_PER_WALLET = 1; uint256 public PUBLIC_MINT_PRICE = 0.03 ether; string public tokenBaseUrl = "https://dweb.link/ipfs/bafybeigrf2i7dk5zb3szg5uo6rznqu5ksfm62fxjkbi3wxkeh2imierfsi/assets/"; string public tokenUrlSuffix = ".json"; constructor () ERC721A("FREEPickerPass", "FREEPICKPass") { } function _baseURI() internal view virtual override returns (string memory) { return tokenBaseUrl; } function _suffix() internal view virtual returns (string memory) { return tokenUrlSuffix; } function setMintPrice(uint256 _mintPrice) external onlyOwner { PUBLIC_MINT_PRICE = _mintPrice; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); string memory suffix = _suffix(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), suffix)) : ''; } function mint(uint256 numTokens) external payable onlyOrigin mintCompliance(numTokens) { if(500 > totalSupply()){ require(msg.value == 0,"Value supplied is incorrect"); }else{ require(msg.value == PUBLIC_MINT_PRICE, "Value supplied is incorrect"); } _safeMint(msg.sender, numTokens); } function setTokenBaseUrl(string memory _tokenBaseUrl) public onlyOwner { tokenBaseUrl = _tokenBaseUrl; } function setTokenSuffix(string memory _tokenUrlSuffix) public onlyOwner { tokenUrlSuffix = _tokenUrlSuffix; } function drain(address payable to) external onlyOwner { to.transfer(address(this).balance); } // - modifiers modifier onlyOrigin() { // disallow access from contracts require(msg.sender == tx.origin, "Come on!!!"); _; } modifier mintCompliance(uint256 _numTokens) { require(_numTokens > 0, "You must mint at least one token."); require(totalSupply() + _numTokens < MAX_SUPPLY, "Max supply exceeded!"); require(_numberMinted(msg.sender) + _numTokens < MINT_PER_WALLET + 1,"You are exceeding your minting limit"); _; } }
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":"MINT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_PRICE","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":[{"internalType":"address payable","name":"to","type":"address"}],"name":"drain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseUrl","type":"string"}],"name":"setTokenBaseUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenUrlSuffix","type":"string"}],"name":"setTokenSuffix","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":"tokenBaseUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenUrlSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610bb8600955666a94d74f430000600a556040518060800160405280605a815260200162002f9c605a9139600b90805190602001906200004692919062000252565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200009492919062000252565b50348015620000a257600080fd5b506040518060400160405280600e81526020017f465245455069636b6572506173730000000000000000000000000000000000008152506040518060400160405280600c81526020017f465245455049434b50617373000000000000000000000000000000000000000081525081600290805190602001906200012792919062000252565b5080600390805190602001906200014092919062000252565b50620001516200017f60201b60201c565b6000819055505050620001796200016d6200018460201b60201c565b6200018c60201b60201c565b62000367565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002609062000302565b90600052602060002090601f016020900481019282620002845760008555620002d0565b82601f106200029f57805160ff1916838001178555620002d0565b82800160010185558215620002d0579182015b82811115620002cf578251825591602001919060010190620002b2565b5b509050620002df9190620002e3565b5090565b5b80821115620002fe576000816000905550600101620002e4565b5090565b600060028204905060018216806200031b57607f821691505b6020821081141562000332576200033162000338565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612c2580620003776000396000f3fe6080604052600436106101815760003560e01c80636ea0061b116100d1578063a22cb4651161008a578063e985e9c511610064578063e985e9c514610561578063ece531321461059e578063f2fde38b146105c7578063f4a0a528146105f057610181565b8063a22cb465146104d2578063b88d4fde146104fb578063c87b56dd1461052457610181565b80636ea0061b146103e357806370a082311461040c578063715018a6146104495780638da5cb5b1461046057806395d89b411461048b578063a0712d68146104b657610181565b806318160ddd1161013e57806346419b161161011857806346419b16146103255780634fff968a146103505780636352211e1461037b5780636bde2627146103b857610181565b806318160ddd146102a857806323b872dd146102d357806342842e0e146102fc57610181565b806301ffc9a714610186578063041e4680146101c357806306fdde03146101ee578063081812fc14610219578063095ea7b3146102565780630ef6a94b1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612289565b610619565b6040516101ba91906125b6565b60405180910390f35b3480156101cf57600080fd5b506101d86106ab565b6040516101e591906125d1565b60405180910390f35b3480156101fa57600080fd5b50610203610739565b60405161021091906125d1565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b919061232c565b6107cb565b60405161024d919061254f565b60405180910390f35b34801561026257600080fd5b5061027d60048036038101906102789190612249565b61084a565b005b34801561028b57600080fd5b506102a660048036038101906102a191906122e3565b61098e565b005b3480156102b457600080fd5b506102bd6109b0565b6040516102ca91906126d3565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612133565b6109c7565b005b34801561030857600080fd5b50610323600480360381019061031e9190612133565b610cec565b005b34801561033157600080fd5b5061033a610d0c565b60405161034791906125d1565b60405180910390f35b34801561035c57600080fd5b50610365610d9a565b60405161037291906126d3565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d919061232c565b610d9f565b6040516103af919061254f565b60405180910390f35b3480156103c457600080fd5b506103cd610db1565b6040516103da91906126d3565b60405180910390f35b3480156103ef57600080fd5b5061040a600480360381019061040591906122e3565b610db7565b005b34801561041857600080fd5b50610433600480360381019061042e9190612099565b610dd9565b60405161044091906126d3565b60405180910390f35b34801561045557600080fd5b5061045e610e92565b005b34801561046c57600080fd5b50610475610ea6565b604051610482919061254f565b60405180910390f35b34801561049757600080fd5b506104a0610ed0565b6040516104ad91906125d1565b60405180910390f35b6104d060048036038101906104cb919061232c565b610f62565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612209565b611177565b005b34801561050757600080fd5b50610522600480360381019061051d9190612186565b6112ef565b005b34801561053057600080fd5b5061054b6004803603810190610546919061232c565b611362565b60405161055891906125d1565b60405180910390f35b34801561056d57600080fd5b50610588600480360381019061058391906120f3565b611410565b60405161059591906125b6565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906120c6565b6114a4565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190612099565b6114f6565b005b3480156105fc57600080fd5b506106176004803603810190610612919061232c565b61157a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b80546106b8906128d6565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906128d6565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b606060028054610748906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610774906128d6565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b60006107d68261158c565b61080c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085582610d9f565b90508073ffffffffffffffffffffffffffffffffffffffff166108766115eb565b73ffffffffffffffffffffffffffffffffffffffff16146108d9576108a28161089d6115eb565b611410565b6108d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6109966115f3565b80600c90805190602001906109ac929190611e98565b5050565b60006109ba611671565b6001546000540303905090565b60006109d282611676565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4584611744565b91509150610a5b8187610a566115eb565b61176b565b610aa757610a7086610a6b6115eb565b611410565b610aa6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b0e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1b86868660016117af565b8015610b2657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf485610bd08888876117b5565b7c0200000000000000000000000000000000000000000000000000000000176117dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c7c576000600185019050600060046000838152602001908152602001600020541415610c7a576000548114610c79578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce48686866001611808565b505050505050565b610d07838383604051806020016040528060008152506112ef565b505050565b600c8054610d19906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d45906128d6565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b505050505081565b600181565b6000610daa82611676565b9050919050565b600a5481565b610dbf6115f3565b80600b9080519060200190610dd5929190611e98565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e41576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e9a6115f3565b610ea4600061180e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610edf906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b906128d6565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790612673565b60405180910390fd5b8060008111611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90612693565b60405180910390fd5b600954816110206109b0565b61102a91906127b8565b1061106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190612653565b60405180910390fd5b60018061107791906127b8565b81611081336118d4565b61108b91906127b8565b106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906126b3565b60405180910390fd5b6110d36109b0565b6101f41115611124576000341461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690612633565b60405180910390fd5b611169565b600a543414611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612633565b60405180910390fd5b5b611173338361192b565b5050565b61117f6115eb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111f16115eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661129e6115eb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e391906125b6565b60405180910390a35050565b6112fa8484846109c7565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461135c5761132584848484611949565b61135b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061136d8261158c565b6113a3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113ad611aa9565b905060006113b9611b3b565b90506000825114156113da5760405180602001604052806000815250611407565b816113e485611bcd565b826040516020016113f79392919061251e565b6040516020818303038152906040525b92505050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114ac6115f3565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114f2573d6000803e3d6000fd5b5050565b6114fe6115f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906125f3565b60405180910390fd5b6115778161180e565b50565b6115826115f3565b80600a8190555050565b600081611597611671565b111580156115a6575060005482105b80156115e4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6115fb611c1d565b73ffffffffffffffffffffffffffffffffffffffff16611619610ea6565b73ffffffffffffffffffffffffffffffffffffffff161461166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690612613565b60405180910390fd5b565b600090565b60008082905080611685611671565b1161170d5760005481101561170c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561170a575b60008114156117005760046000836001900393508381526020019081526020016000205490506116d5565b809250505061173f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117cc868684611c25565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611945828260405180602001604052806000815250611c2e565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261196f6115eb565b8786866040518563ffffffff1660e01b8152600401611991949392919061256a565b602060405180830381600087803b1580156119ab57600080fd5b505af19250505080156119dc57506040513d601f19601f820116820180604052508101906119d991906122b6565b60015b611a56573d8060008114611a0c576040519150601f19603f3d011682016040523d82523d6000602084013e611a11565b606091505b50600081511415611a4e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611ab8906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae4906128d6565b8015611b315780601f10611b0657610100808354040283529160200191611b31565b820191906000526020600020905b815481529060010190602001808311611b1457829003601f168201915b5050505050905090565b6060600c8054611b4a906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b76906128d6565b8015611bc35780601f10611b9857610100808354040283529160200191611bc3565b820191906000526020600020905b815481529060010190602001808311611ba657829003601f168201915b5050505050905090565b606060806040510190508060405280825b600115611c0957600183039250600a81066030018353600a8104905080611c0457611c09565b611bde565b508181036020830392508083525050919050565b600033905090565b60009392505050565b611c388383611ccb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cc657600080549050600083820390505b611c786000868380600101945086611949565b611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611c65578160005414611cc357600080fd5b50505b505050565b6000805490506000821415611d0c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1960008483856117af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d9083611d8160008660006117b5565b611d8a85611e88565b176117dd565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e3157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611df6565b506000821415611e6d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e836000848385611808565b505050565b60006001821460e11b9050919050565b828054611ea4906128d6565b90600052602060002090601f016020900481019282611ec65760008555611f0d565b82601f10611edf57805160ff1916838001178555611f0d565b82800160010185558215611f0d579182015b82811115611f0c578251825591602001919060010190611ef1565b5b509050611f1a9190611f1e565b5090565b5b80821115611f37576000816000905550600101611f1f565b5090565b6000611f4e611f4984612713565b6126ee565b905082815260208101848484011115611f6a57611f696129cb565b5b611f75848285612894565b509392505050565b6000611f90611f8b84612744565b6126ee565b905082815260208101848484011115611fac57611fab6129cb565b5b611fb7848285612894565b509392505050565b600081359050611fce81612b7c565b92915050565b600081359050611fe381612b93565b92915050565b600081359050611ff881612baa565b92915050565b60008135905061200d81612bc1565b92915050565b60008151905061202281612bc1565b92915050565b600082601f83011261203d5761203c6129c6565b5b813561204d848260208601611f3b565b91505092915050565b600082601f83011261206b5761206a6129c6565b5b813561207b848260208601611f7d565b91505092915050565b60008135905061209381612bd8565b92915050565b6000602082840312156120af576120ae6129d5565b5b60006120bd84828501611fbf565b91505092915050565b6000602082840312156120dc576120db6129d5565b5b60006120ea84828501611fd4565b91505092915050565b6000806040838503121561210a576121096129d5565b5b600061211885828601611fbf565b925050602061212985828601611fbf565b9150509250929050565b60008060006060848603121561214c5761214b6129d5565b5b600061215a86828701611fbf565b935050602061216b86828701611fbf565b925050604061217c86828701612084565b9150509250925092565b600080600080608085870312156121a05761219f6129d5565b5b60006121ae87828801611fbf565b94505060206121bf87828801611fbf565b93505060406121d087828801612084565b925050606085013567ffffffffffffffff8111156121f1576121f06129d0565b5b6121fd87828801612028565b91505092959194509250565b600080604083850312156122205761221f6129d5565b5b600061222e85828601611fbf565b925050602061223f85828601611fe9565b9150509250929050565b600080604083850312156122605761225f6129d5565b5b600061226e85828601611fbf565b925050602061227f85828601612084565b9150509250929050565b60006020828403121561229f5761229e6129d5565b5b60006122ad84828501611ffe565b91505092915050565b6000602082840312156122cc576122cb6129d5565b5b60006122da84828501612013565b91505092915050565b6000602082840312156122f9576122f86129d5565b5b600082013567ffffffffffffffff811115612317576123166129d0565b5b61232384828501612056565b91505092915050565b600060208284031215612342576123416129d5565b5b600061235084828501612084565b91505092915050565b6123628161280e565b82525050565b61237181612832565b82525050565b600061238282612775565b61238c818561278b565b935061239c8185602086016128a3565b6123a5816129da565b840191505092915050565b60006123bb82612780565b6123c5818561279c565b93506123d58185602086016128a3565b6123de816129da565b840191505092915050565b60006123f482612780565b6123fe81856127ad565b935061240e8185602086016128a3565b80840191505092915050565b600061242760268361279c565b9150612432826129eb565b604082019050919050565b600061244a60208361279c565b915061245582612a3a565b602082019050919050565b600061246d601b8361279c565b915061247882612a63565b602082019050919050565b600061249060148361279c565b915061249b82612a8c565b602082019050919050565b60006124b3600a8361279c565b91506124be82612ab5565b602082019050919050565b60006124d660218361279c565b91506124e182612ade565b604082019050919050565b60006124f960248361279c565b915061250482612b2d565b604082019050919050565b6125188161288a565b82525050565b600061252a82866123e9565b915061253682856123e9565b915061254282846123e9565b9150819050949350505050565b60006020820190506125646000830184612359565b92915050565b600060808201905061257f6000830187612359565b61258c6020830186612359565b612599604083018561250f565b81810360608301526125ab8184612377565b905095945050505050565b60006020820190506125cb6000830184612368565b92915050565b600060208201905081810360008301526125eb81846123b0565b905092915050565b6000602082019050818103600083015261260c8161241a565b9050919050565b6000602082019050818103600083015261262c8161243d565b9050919050565b6000602082019050818103600083015261264c81612460565b9050919050565b6000602082019050818103600083015261266c81612483565b9050919050565b6000602082019050818103600083015261268c816124a6565b9050919050565b600060208201905081810360008301526126ac816124c9565b9050919050565b600060208201905081810360008301526126cc816124ec565b9050919050565b60006020820190506126e8600083018461250f565b92915050565b60006126f8612709565b90506127048282612908565b919050565b6000604051905090565b600067ffffffffffffffff82111561272e5761272d612997565b5b612737826129da565b9050602081019050919050565b600067ffffffffffffffff82111561275f5761275e612997565b5b612768826129da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006127c38261288a565b91506127ce8361288a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561280357612802612939565b5b828201905092915050565b60006128198261286a565b9050919050565b600061282b8261286a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156128c15780820151818401526020810190506128a6565b838111156128d0576000848401525b50505050565b600060028204905060018216806128ee57607f821691505b6020821081141561290257612901612968565b5b50919050565b612911826129da565b810181811067ffffffffffffffff821117156129305761292f612997565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f56616c756520737570706c69656420697320696e636f72726563740000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f436f6d65206f6e21212100000000000000000000000000000000000000000000600082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f752061726520657863656564696e6720796f7572206d696e74696e67206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b612b858161280e565b8114612b9057600080fd5b50565b612b9c81612820565b8114612ba757600080fd5b50565b612bb381612832565b8114612bbe57600080fd5b50565b612bca8161283e565b8114612bd557600080fd5b50565b612be18161288a565b8114612bec57600080fd5b5056fea26469706673582212201a314be9756ca04a415eeeb103ab88103ff75d9f0f45bab8e77a24932225a84464736f6c6343000807003368747470733a2f2f647765622e6c696e6b2f697066732f62616679626569677266326937646b357a6233737a6735756f36727a6e7175356b73666d363266786a6b62693377786b656832696d6965726673692f6173736574732f
Deployed Bytecode
0x6080604052600436106101815760003560e01c80636ea0061b116100d1578063a22cb4651161008a578063e985e9c511610064578063e985e9c514610561578063ece531321461059e578063f2fde38b146105c7578063f4a0a528146105f057610181565b8063a22cb465146104d2578063b88d4fde146104fb578063c87b56dd1461052457610181565b80636ea0061b146103e357806370a082311461040c578063715018a6146104495780638da5cb5b1461046057806395d89b411461048b578063a0712d68146104b657610181565b806318160ddd1161013e57806346419b161161011857806346419b16146103255780634fff968a146103505780636352211e1461037b5780636bde2627146103b857610181565b806318160ddd146102a857806323b872dd146102d357806342842e0e146102fc57610181565b806301ffc9a714610186578063041e4680146101c357806306fdde03146101ee578063081812fc14610219578063095ea7b3146102565780630ef6a94b1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612289565b610619565b6040516101ba91906125b6565b60405180910390f35b3480156101cf57600080fd5b506101d86106ab565b6040516101e591906125d1565b60405180910390f35b3480156101fa57600080fd5b50610203610739565b60405161021091906125d1565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b919061232c565b6107cb565b60405161024d919061254f565b60405180910390f35b34801561026257600080fd5b5061027d60048036038101906102789190612249565b61084a565b005b34801561028b57600080fd5b506102a660048036038101906102a191906122e3565b61098e565b005b3480156102b457600080fd5b506102bd6109b0565b6040516102ca91906126d3565b60405180910390f35b3480156102df57600080fd5b506102fa60048036038101906102f59190612133565b6109c7565b005b34801561030857600080fd5b50610323600480360381019061031e9190612133565b610cec565b005b34801561033157600080fd5b5061033a610d0c565b60405161034791906125d1565b60405180910390f35b34801561035c57600080fd5b50610365610d9a565b60405161037291906126d3565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d919061232c565b610d9f565b6040516103af919061254f565b60405180910390f35b3480156103c457600080fd5b506103cd610db1565b6040516103da91906126d3565b60405180910390f35b3480156103ef57600080fd5b5061040a600480360381019061040591906122e3565b610db7565b005b34801561041857600080fd5b50610433600480360381019061042e9190612099565b610dd9565b60405161044091906126d3565b60405180910390f35b34801561045557600080fd5b5061045e610e92565b005b34801561046c57600080fd5b50610475610ea6565b604051610482919061254f565b60405180910390f35b34801561049757600080fd5b506104a0610ed0565b6040516104ad91906125d1565b60405180910390f35b6104d060048036038101906104cb919061232c565b610f62565b005b3480156104de57600080fd5b506104f960048036038101906104f49190612209565b611177565b005b34801561050757600080fd5b50610522600480360381019061051d9190612186565b6112ef565b005b34801561053057600080fd5b5061054b6004803603810190610546919061232c565b611362565b60405161055891906125d1565b60405180910390f35b34801561056d57600080fd5b50610588600480360381019061058391906120f3565b611410565b60405161059591906125b6565b60405180910390f35b3480156105aa57600080fd5b506105c560048036038101906105c091906120c6565b6114a4565b005b3480156105d357600080fd5b506105ee60048036038101906105e99190612099565b6114f6565b005b3480156105fc57600080fd5b506106176004803603810190610612919061232c565b61157a565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061067457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106a45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b80546106b8906128d6565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906128d6565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081565b606060028054610748906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610774906128d6565b80156107c15780601f10610796576101008083540402835291602001916107c1565b820191906000526020600020905b8154815290600101906020018083116107a457829003601f168201915b5050505050905090565b60006107d68261158c565b61080c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085582610d9f565b90508073ffffffffffffffffffffffffffffffffffffffff166108766115eb565b73ffffffffffffffffffffffffffffffffffffffff16146108d9576108a28161089d6115eb565b611410565b6108d8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6109966115f3565b80600c90805190602001906109ac929190611e98565b5050565b60006109ba611671565b6001546000540303905090565b60006109d282611676565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a39576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610a4584611744565b91509150610a5b8187610a566115eb565b61176b565b610aa757610a7086610a6b6115eb565b611410565b610aa6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610b0e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b1b86868660016117af565b8015610b2657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610bf485610bd08888876117b5565b7c0200000000000000000000000000000000000000000000000000000000176117dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610c7c576000600185019050600060046000838152602001908152602001600020541415610c7a576000548114610c79578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ce48686866001611808565b505050505050565b610d07838383604051806020016040528060008152506112ef565b505050565b600c8054610d19906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610d45906128d6565b8015610d925780601f10610d6757610100808354040283529160200191610d92565b820191906000526020600020905b815481529060010190602001808311610d7557829003601f168201915b505050505081565b600181565b6000610daa82611676565b9050919050565b600a5481565b610dbf6115f3565b80600b9080519060200190610dd5929190611e98565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e41576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e9a6115f3565b610ea4600061180e565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610edf906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0b906128d6565b8015610f585780601f10610f2d57610100808354040283529160200191610f58565b820191906000526020600020905b815481529060010190602001808311610f3b57829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790612673565b60405180910390fd5b8060008111611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90612693565b60405180910390fd5b600954816110206109b0565b61102a91906127b8565b1061106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190612653565b60405180910390fd5b60018061107791906127b8565b81611081336118d4565b61108b91906127b8565b106110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906126b3565b60405180910390fd5b6110d36109b0565b6101f41115611124576000341461111f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111690612633565b60405180910390fd5b611169565b600a543414611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90612633565b60405180910390fd5b5b611173338361192b565b5050565b61117f6115eb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006111f16115eb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661129e6115eb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112e391906125b6565b60405180910390a35050565b6112fa8484846109c7565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461135c5761132584848484611949565b61135b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061136d8261158c565b6113a3576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113ad611aa9565b905060006113b9611b3b565b90506000825114156113da5760405180602001604052806000815250611407565b816113e485611bcd565b826040516020016113f79392919061251e565b6040516020818303038152906040525b92505050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114ac6115f3565b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114f2573d6000803e3d6000fd5b5050565b6114fe6115f3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561156e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611565906125f3565b60405180910390fd5b6115778161180e565b50565b6115826115f3565b80600a8190555050565b600081611597611671565b111580156115a6575060005482105b80156115e4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6115fb611c1d565b73ffffffffffffffffffffffffffffffffffffffff16611619610ea6565b73ffffffffffffffffffffffffffffffffffffffff161461166f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166690612613565b60405180910390fd5b565b600090565b60008082905080611685611671565b1161170d5760005481101561170c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561170a575b60008114156117005760046000836001900393508381526020019081526020016000205490506116d5565b809250505061173f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86117cc868684611c25565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b611945828260405180602001604052806000815250611c2e565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261196f6115eb565b8786866040518563ffffffff1660e01b8152600401611991949392919061256a565b602060405180830381600087803b1580156119ab57600080fd5b505af19250505080156119dc57506040513d601f19601f820116820180604052508101906119d991906122b6565b60015b611a56573d8060008114611a0c576040519150601f19603f3d011682016040523d82523d6000602084013e611a11565b606091505b50600081511415611a4e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611ab8906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae4906128d6565b8015611b315780601f10611b0657610100808354040283529160200191611b31565b820191906000526020600020905b815481529060010190602001808311611b1457829003601f168201915b5050505050905090565b6060600c8054611b4a906128d6565b80601f0160208091040260200160405190810160405280929190818152602001828054611b76906128d6565b8015611bc35780601f10611b9857610100808354040283529160200191611bc3565b820191906000526020600020905b815481529060010190602001808311611ba657829003601f168201915b5050505050905090565b606060806040510190508060405280825b600115611c0957600183039250600a81066030018353600a8104905080611c0457611c09565b611bde565b508181036020830392508083525050919050565b600033905090565b60009392505050565b611c388383611ccb565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cc657600080549050600083820390505b611c786000868380600101945086611949565b611cae576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611c65578160005414611cc357600080fd5b50505b505050565b6000805490506000821415611d0c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d1960008483856117af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611d9083611d8160008660006117b5565b611d8a85611e88565b176117dd565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611e3157808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611df6565b506000821415611e6d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611e836000848385611808565b505050565b60006001821460e11b9050919050565b828054611ea4906128d6565b90600052602060002090601f016020900481019282611ec65760008555611f0d565b82601f10611edf57805160ff1916838001178555611f0d565b82800160010185558215611f0d579182015b82811115611f0c578251825591602001919060010190611ef1565b5b509050611f1a9190611f1e565b5090565b5b80821115611f37576000816000905550600101611f1f565b5090565b6000611f4e611f4984612713565b6126ee565b905082815260208101848484011115611f6a57611f696129cb565b5b611f75848285612894565b509392505050565b6000611f90611f8b84612744565b6126ee565b905082815260208101848484011115611fac57611fab6129cb565b5b611fb7848285612894565b509392505050565b600081359050611fce81612b7c565b92915050565b600081359050611fe381612b93565b92915050565b600081359050611ff881612baa565b92915050565b60008135905061200d81612bc1565b92915050565b60008151905061202281612bc1565b92915050565b600082601f83011261203d5761203c6129c6565b5b813561204d848260208601611f3b565b91505092915050565b600082601f83011261206b5761206a6129c6565b5b813561207b848260208601611f7d565b91505092915050565b60008135905061209381612bd8565b92915050565b6000602082840312156120af576120ae6129d5565b5b60006120bd84828501611fbf565b91505092915050565b6000602082840312156120dc576120db6129d5565b5b60006120ea84828501611fd4565b91505092915050565b6000806040838503121561210a576121096129d5565b5b600061211885828601611fbf565b925050602061212985828601611fbf565b9150509250929050565b60008060006060848603121561214c5761214b6129d5565b5b600061215a86828701611fbf565b935050602061216b86828701611fbf565b925050604061217c86828701612084565b9150509250925092565b600080600080608085870312156121a05761219f6129d5565b5b60006121ae87828801611fbf565b94505060206121bf87828801611fbf565b93505060406121d087828801612084565b925050606085013567ffffffffffffffff8111156121f1576121f06129d0565b5b6121fd87828801612028565b91505092959194509250565b600080604083850312156122205761221f6129d5565b5b600061222e85828601611fbf565b925050602061223f85828601611fe9565b9150509250929050565b600080604083850312156122605761225f6129d5565b5b600061226e85828601611fbf565b925050602061227f85828601612084565b9150509250929050565b60006020828403121561229f5761229e6129d5565b5b60006122ad84828501611ffe565b91505092915050565b6000602082840312156122cc576122cb6129d5565b5b60006122da84828501612013565b91505092915050565b6000602082840312156122f9576122f86129d5565b5b600082013567ffffffffffffffff811115612317576123166129d0565b5b61232384828501612056565b91505092915050565b600060208284031215612342576123416129d5565b5b600061235084828501612084565b91505092915050565b6123628161280e565b82525050565b61237181612832565b82525050565b600061238282612775565b61238c818561278b565b935061239c8185602086016128a3565b6123a5816129da565b840191505092915050565b60006123bb82612780565b6123c5818561279c565b93506123d58185602086016128a3565b6123de816129da565b840191505092915050565b60006123f482612780565b6123fe81856127ad565b935061240e8185602086016128a3565b80840191505092915050565b600061242760268361279c565b9150612432826129eb565b604082019050919050565b600061244a60208361279c565b915061245582612a3a565b602082019050919050565b600061246d601b8361279c565b915061247882612a63565b602082019050919050565b600061249060148361279c565b915061249b82612a8c565b602082019050919050565b60006124b3600a8361279c565b91506124be82612ab5565b602082019050919050565b60006124d660218361279c565b91506124e182612ade565b604082019050919050565b60006124f960248361279c565b915061250482612b2d565b604082019050919050565b6125188161288a565b82525050565b600061252a82866123e9565b915061253682856123e9565b915061254282846123e9565b9150819050949350505050565b60006020820190506125646000830184612359565b92915050565b600060808201905061257f6000830187612359565b61258c6020830186612359565b612599604083018561250f565b81810360608301526125ab8184612377565b905095945050505050565b60006020820190506125cb6000830184612368565b92915050565b600060208201905081810360008301526125eb81846123b0565b905092915050565b6000602082019050818103600083015261260c8161241a565b9050919050565b6000602082019050818103600083015261262c8161243d565b9050919050565b6000602082019050818103600083015261264c81612460565b9050919050565b6000602082019050818103600083015261266c81612483565b9050919050565b6000602082019050818103600083015261268c816124a6565b9050919050565b600060208201905081810360008301526126ac816124c9565b9050919050565b600060208201905081810360008301526126cc816124ec565b9050919050565b60006020820190506126e8600083018461250f565b92915050565b60006126f8612709565b90506127048282612908565b919050565b6000604051905090565b600067ffffffffffffffff82111561272e5761272d612997565b5b612737826129da565b9050602081019050919050565b600067ffffffffffffffff82111561275f5761275e612997565b5b612768826129da565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006127c38261288a565b91506127ce8361288a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561280357612802612939565b5b828201905092915050565b60006128198261286a565b9050919050565b600061282b8261286a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156128c15780820151818401526020810190506128a6565b838111156128d0576000848401525b50505050565b600060028204905060018216806128ee57607f821691505b6020821081141561290257612901612968565b5b50919050565b612911826129da565b810181811067ffffffffffffffff821117156129305761292f612997565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f56616c756520737570706c69656420697320696e636f72726563740000000000600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f436f6d65206f6e21212100000000000000000000000000000000000000000000600082015250565b7f596f75206d757374206d696e74206174206c65617374206f6e6520746f6b656e60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f752061726520657863656564696e6720796f7572206d696e74696e67206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b612b858161280e565b8114612b9057600080fd5b50565b612b9c81612820565b8114612ba757600080fd5b50565b612bb381612832565b8114612bbe57600080fd5b50565b612bca8161283e565b8114612bd557600080fd5b50565b612be18161288a565b8114612bec57600080fd5b5056fea26469706673582212201a314be9756ca04a415eeeb103ab88103ff75d9f0f45bab8e77a24932225a84464736f6c63430008070033
Deployed Bytecode Sourcemap
66669:2472:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34190:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66894:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35092:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41575:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41016:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68379:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30843:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45282:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48195:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67022:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66786:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36485:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66836:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68253:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32027:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14938:103;;;;;;;;;;;;;:::i;:::-;;14290:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35268:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67893:352;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42133:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48978:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67498:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42598:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68514:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15196:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67376:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34190:639;34275:4;34614:10;34599:25;;:11;:25;;;;:102;;;;34691:10;34676:25;;:11;:25;;;;34599:102;:179;;;;34768:10;34753:25;;:11;:25;;;;34599:179;34579:199;;34190:639;;;:::o;66894:121::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35092:100::-;35146:13;35179:5;35172:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35092:100;:::o;41575:218::-;41651:7;41676:16;41684:7;41676;:16::i;:::-;41671:64;;41701:34;;;;;;;;;;;;;;41671:64;41755:15;:24;41771:7;41755:24;;;;;;;;;;;:30;;;;;;;;;;;;41748:37;;41575:218;;;:::o;41016:400::-;41097:13;41113:16;41121:7;41113;:16::i;:::-;41097:32;;41169:5;41146:28;;:19;:17;:19::i;:::-;:28;;;41142:175;;41194:44;41211:5;41218:19;:17;:19::i;:::-;41194:16;:44::i;:::-;41189:128;;41266:35;;;;;;;;;;;;;;41189:128;41142:175;41362:2;41329:15;:24;41345:7;41329:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41400:7;41396:2;41380:28;;41389:5;41380:28;;;;;;;;;;;;41086:330;41016:400;;:::o;68379:123::-;14176:13;:11;:13::i;:::-;68479:15:::1;68462:14;:32;;;;;;;;;;;;:::i;:::-;;68379:123:::0;:::o;30843:323::-;30904:7;31132:15;:13;:15::i;:::-;31117:12;;31101:13;;:28;:46;31094:53;;30843:323;:::o;45282:2817::-;45416:27;45446;45465:7;45446:18;:27::i;:::-;45416:57;;45531:4;45490:45;;45506:19;45490:45;;;45486:86;;45544:28;;;;;;;;;;;;;;45486:86;45586:27;45615:23;45642:35;45669:7;45642:26;:35::i;:::-;45585:92;;;;45777:68;45802:15;45819:4;45825:19;:17;:19::i;:::-;45777:24;:68::i;:::-;45772:180;;45865:43;45882:4;45888:19;:17;:19::i;:::-;45865:16;:43::i;:::-;45860:92;;45917:35;;;;;;;;;;;;;;45860:92;45772:180;45983:1;45969:16;;:2;:16;;;45965:52;;;45994:23;;;;;;;;;;;;;;45965:52;46030:43;46052:4;46058:2;46062:7;46071:1;46030:21;:43::i;:::-;46166:15;46163:160;;;46306:1;46285:19;46278:30;46163:160;46703:18;:24;46722:4;46703:24;;;;;;;;;;;;;;;;46701:26;;;;;;;;;;;;46772:18;:22;46791:2;46772:22;;;;;;;;;;;;;;;;46770:24;;;;;;;;;;;47094:146;47131:2;47180:45;47195:4;47201:2;47205:19;47180:14;:45::i;:::-;27242:8;47152:73;47094:18;:146::i;:::-;47065:17;:26;47083:7;47065:26;;;;;;;;;;;:175;;;;47411:1;27242:8;47360:19;:47;:52;47356:627;;;47433:19;47465:1;47455:7;:11;47433:33;;47622:1;47588:17;:30;47606:11;47588:30;;;;;;;;;;;;:35;47584:384;;;47726:13;;47711:11;:28;47707:242;;47906:19;47873:17;:30;47891:11;47873:30;;;;;;;;;;;:52;;;;47707:242;47584:384;47414:569;47356:627;48030:7;48026:2;48011:27;;48020:4;48011:27;;;;;;;;;;;;48049:42;48070:4;48076:2;48080:7;48089:1;48049:20;:42::i;:::-;45405:2694;;;45282:2817;;;:::o;48195:185::-;48333:39;48350:4;48356:2;48360:7;48333:39;;;;;;;;;;;;:16;:39::i;:::-;48195:185;;;:::o;67022:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66786:43::-;66828:1;66786:43;:::o;36485:152::-;36557:7;36600:27;36619:7;36600:18;:27::i;:::-;36577:52;;36485:152;;;:::o;66836:45::-;;;;:::o;68253:118::-;14176:13;:11;:13::i;:::-;68350::::1;68335:12;:28;;;;;;;;;;;;:::i;:::-;;68253:118:::0;:::o;32027:233::-;32099:7;32140:1;32123:19;;:5;:19;;;32119:60;;;32151:28;;;;;;;;;;;;;;32119:60;26186:13;32197:18;:25;32216:5;32197:25;;;;;;;;;;;;;;;;:55;32190:62;;32027:233;;;:::o;14938:103::-;14176:13;:11;:13::i;:::-;15003:30:::1;15030:1;15003:18;:30::i;:::-;14938:103::o:0;14290:87::-;14336:7;14363:6;;;;;;;;;;;14356:13;;14290:87;:::o;35268:104::-;35324:13;35357:7;35350:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35268:104;:::o;67893:352::-;68749:9;68735:23;;:10;:23;;;68727:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;67969:9:::1;68877:1;68864:10;:14;68856:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;68964:10;;68951;68935:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:39;68927:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;69077:1;66828::::0;69059:19:::1;;;;:::i;:::-;69046:10;69018:25;69032:10;69018:13;:25::i;:::-;:38;;;;:::i;:::-;:60;69010:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;68000:13:::2;:11;:13::i;:::-;67994:3;:19;67991:204;;;68050:1;68037:9;:14;68029:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;67991:204;;;68134:17;;68121:9;:30;68113:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;67991:204;68205:32;68215:10;68227:9;68205;:32::i;:::-;68784:1:::1;67893:352:::0;:::o;42133:308::-;42244:19;:17;:19::i;:::-;42232:31;;:8;:31;;;42228:61;;;42272:17;;;;;;;;;;;;;;42228:61;42354:8;42302:18;:39;42321:19;:17;:19::i;:::-;42302:39;;;;;;;;;;;;;;;:49;42342:8;42302:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;42414:8;42378:55;;42393:19;:17;:19::i;:::-;42378:55;;;42424:8;42378:55;;;;;;:::i;:::-;;;;;;;;42133:308;;:::o;48978:399::-;49145:31;49158:4;49164:2;49168:7;49145:12;:31::i;:::-;49209:1;49191:2;:14;;;:19;49187:183;;49230:56;49261:4;49267:2;49271:7;49280:5;49230:30;:56::i;:::-;49225:145;;49314:40;;;;;;;;;;;;;;49225:145;49187:183;48978:399;;;;:::o;67498:387::-;67571:13;67602:16;67610:7;67602;:16::i;:::-;67597:59;;67627:29;;;;;;;;;;;;;;67597:59;67677:21;67701:10;:8;:10::i;:::-;67677:34;;67722:20;67745:9;:7;:9::i;:::-;67722:32;;67807:1;67788:7;67782:21;:26;;:95;;;;;;;;;;;;;;;;;67835:7;67844:18;67854:7;67844:9;:18::i;:::-;67864:6;67818:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67782:95;67775:102;;;;67498:387;;;:::o;42598:164::-;42695:4;42719:18;:25;42738:5;42719:25;;;;;;;;;;;;;;;:35;42745:8;42719:35;;;;;;;;;;;;;;;;;;;;;;;;;42712:42;;42598:164;;;;:::o;68514:107::-;14176:13;:11;:13::i;:::-;68579:2:::1;:11;;:34;68591:21;68579:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;68514:107:::0;:::o;15196:201::-;14176:13;:11;:13::i;:::-;15305:1:::1;15285:22;;:8;:22;;;;15277:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15361:28;15380:8;15361:18;:28::i;:::-;15196:201:::0;:::o;67376:110::-;14176:13;:11;:13::i;:::-;67468:10:::1;67448:17;:30;;;;67376:110:::0;:::o;43020:282::-;43085:4;43141:7;43122:15;:13;:15::i;:::-;:26;;:66;;;;;43175:13;;43165:7;:23;43122:66;:153;;;;;43274:1;26962:8;43226:17;:26;43244:7;43226:26;;;;;;;;;;;;:44;:49;43122:153;43102:173;;43020:282;;;:::o;64786:105::-;64846:7;64873:10;64866:17;;64786:105;:::o;14455:132::-;14530:12;:10;:12::i;:::-;14519:23;;:7;:5;:7::i;:::-;:23;;;14511:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14455:132::o;30359:92::-;30415:7;30359:92;:::o;37640:1275::-;37707:7;37727:12;37742:7;37727:22;;37810:4;37791:15;:13;:15::i;:::-;:23;37787:1061;;37844:13;;37837:4;:20;37833:1015;;;37882:14;37899:17;:23;37917:4;37899:23;;;;;;;;;;;;37882:40;;38016:1;26962:8;37988:6;:24;:29;37984:845;;;38653:113;38670:1;38660:6;:11;38653:113;;;38713:17;:25;38731:6;;;;;;;38713:25;;;;;;;;;;;;38704:34;;38653:113;;;38799:6;38792:13;;;;;;37984:845;37859:989;37833:1015;37787:1061;38876:31;;;;;;;;;;;;;;37640:1275;;;;:::o;44183:479::-;44285:27;44314:23;44355:38;44396:15;:24;44412:7;44396:24;;;;;;;;;;;44355:65;;44567:18;44544:41;;44624:19;44618:26;44599:45;;44529:126;44183:479;;;:::o;43411:659::-;43560:11;43725:16;43718:5;43714:28;43705:37;;43885:16;43874:9;43870:32;43857:45;;44035:15;44024:9;44021:30;44013:5;44002:9;43999:20;43996:56;43986:66;;43411:659;;;;;:::o;50039:159::-;;;;;:::o;64095:311::-;64230:7;64250:16;27366:3;64276:19;:41;;64250:68;;27366:3;64344:31;64355:4;64361:2;64365:9;64344:10;:31::i;:::-;64336:40;;:62;;64329:69;;;64095:311;;;;;:::o;39463:450::-;39543:14;39711:16;39704:5;39700:28;39691:37;;39888:5;39874:11;39849:23;39845:41;39842:52;39835:5;39832:63;39822:73;;39463:450;;;;:::o;50863:158::-;;;;;:::o;15557:191::-;15631:16;15650:6;;;;;;;;;;;15631:25;;15676:8;15667:6;;:17;;;;;;;;;;;;;;;;;;15731:8;15700:40;;15721:8;15700:40;;;;;;;;;;;;15620:128;15557:191;:::o;32342:178::-;32403:7;26186:13;26324:2;32431:18;:25;32450:5;32431:25;;;;;;;;;;;;;;;;:50;;32430:82;32423:89;;32342:178;;;:::o;58618:112::-;58695:27;58705:2;58709:8;58695:27;;;;;;;;;;;;:9;:27::i;:::-;58618:112;;:::o;51461:716::-;51624:4;51670:2;51645:45;;;51691:19;:17;:19::i;:::-;51712:4;51718:7;51727:5;51645:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51641:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51945:1;51928:6;:13;:18;51924:235;;;51974:40;;;;;;;;;;;;;;51924:235;52117:6;52111:13;52102:6;52098:2;52094:15;52087:38;51641:529;51814:54;;;51804:64;;;:6;:64;;;;51797:71;;;51461:716;;;;;;:::o;67142:113::-;67202:13;67235:12;67228:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67142:113;:::o;67263:105::-;67313:13;67346:14;67339:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67263:105;:::o;64993:1581::-;65058:17;65483:4;65476;65470:11;65466:22;65459:29;;65575:3;65569:4;65562:17;65681:3;65920:5;65902:428;65928:1;65902:428;;;65968:1;65963:3;65959:11;65952:18;;66139:2;66133:4;66129:13;66125:2;66121:22;66116:3;66108:36;66233:2;66227:4;66223:13;66215:21;;66300:4;66290:25;;66308:5;;66290:25;65902:428;;;65906:21;66369:3;66364;66360:13;66484:4;66479:3;66475:14;66468:21;;66549:6;66544:3;66537:19;65097:1470;;64993:1581;;;:::o;12841:98::-;12894:7;12921:10;12914:17;;12841:98;:::o;63796:147::-;63933:6;63796:147;;;;;:::o;57845:689::-;57976:19;57982:2;57986:8;57976:5;:19::i;:::-;58055:1;58037:2;:14;;;:19;58033:483;;58077:11;58091:13;;58077:27;;58123:13;58145:8;58139:3;:14;58123:30;;58172:233;58203:62;58242:1;58246:2;58250:7;;;;;;58259:5;58203:30;:62::i;:::-;58198:167;;58301:40;;;;;;;;;;;;;;58198:167;58400:3;58392:5;:11;58172:233;;58487:3;58470:13;;:20;58466:34;;58492:8;;;58466:34;58058:458;;58033:483;57845:689;;;:::o;52639:2454::-;52712:20;52735:13;;52712:36;;52775:1;52763:8;:13;52759:44;;;52785:18;;;;;;;;;;;;;;52759:44;52816:61;52846:1;52850:2;52854:12;52868:8;52816:21;:61::i;:::-;53360:1;26324:2;53330:1;:26;;53329:32;53317:8;:45;53291:18;:22;53310:2;53291:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;53639:139;53676:2;53730:33;53753:1;53757:2;53761:1;53730:14;:33::i;:::-;53697:30;53718:8;53697:20;:30::i;:::-;:66;53639:18;:139::i;:::-;53605:17;:31;53623:12;53605:31;;;;;;;;;;;:173;;;;53795:16;53826:11;53855:8;53840:12;:23;53826:37;;54110:16;54106:2;54102:25;54090:37;;54482:12;54442:8;54401:1;54339:25;54280:1;54219;54192:335;54607:1;54593:12;54589:20;54547:346;54648:3;54639:7;54636:16;54547:346;;54866:7;54856:8;54853:1;54826:25;54823:1;54820;54815:59;54701:1;54692:7;54688:15;54677:26;;54547:346;;;54551:77;54938:1;54926:8;:13;54922:45;;;54948:19;;;;;;;;;;;;;;54922:45;55000:3;54984:13;:19;;;;53065:1950;;55025:60;55054:1;55058:2;55062:12;55076:8;55025:20;:60::i;:::-;52701:2392;52639:2454;;:::o;40015:324::-;40085:14;40318:1;40308:8;40305:15;40279:24;40275:46;40265:56;;40015:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;986:155;;;;:::o;1147:133::-;1190:5;1228:6;1215:20;1206:29;;1244:30;1268:5;1244:30;:::i;:::-;1147:133;;;;:::o;1286:137::-;1331:5;1369:6;1356:20;1347:29;;1385:32;1411:5;1385:32;:::i;:::-;1286:137;;;;:::o;1429:141::-;1485:5;1516:6;1510:13;1501:22;;1532:32;1558:5;1532:32;:::i;:::-;1429:141;;;;:::o;1589:338::-;1644:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:122;;1701:79;;:::i;:::-;1660:122;1818:6;1805:20;1843:78;1917:3;1909:6;1902:4;1894:6;1890:17;1843:78;:::i;:::-;1834:87;;1650:277;1589:338;;;;:::o;1947:340::-;2003:5;2052:3;2045:4;2037:6;2033:17;2029:27;2019:122;;2060:79;;:::i;:::-;2019:122;2177:6;2164:20;2202:79;2277:3;2269:6;2262:4;2254:6;2250:17;2202:79;:::i;:::-;2193:88;;2009:278;1947:340;;;;:::o;2293:139::-;2339:5;2377:6;2364:20;2355:29;;2393:33;2420:5;2393:33;:::i;:::-;2293:139;;;;:::o;2438:329::-;2497:6;2546:2;2534:9;2525:7;2521:23;2517:32;2514:119;;;2552:79;;:::i;:::-;2514:119;2672:1;2697:53;2742:7;2733:6;2722:9;2718:22;2697:53;:::i;:::-;2687:63;;2643:117;2438:329;;;;:::o;2773:345::-;2840:6;2889:2;2877:9;2868:7;2864:23;2860:32;2857:119;;;2895:79;;:::i;:::-;2857:119;3015:1;3040:61;3093:7;3084:6;3073:9;3069:22;3040:61;:::i;:::-;3030:71;;2986:125;2773:345;;;;:::o;3124:474::-;3192:6;3200;3249:2;3237:9;3228:7;3224:23;3220:32;3217:119;;;3255:79;;:::i;:::-;3217:119;3375:1;3400:53;3445:7;3436:6;3425:9;3421:22;3400:53;:::i;:::-;3390:63;;3346:117;3502:2;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3473:118;3124:474;;;;;:::o;3604:619::-;3681:6;3689;3697;3746:2;3734:9;3725:7;3721:23;3717:32;3714:119;;;3752:79;;:::i;:::-;3714:119;3872:1;3897:53;3942:7;3933:6;3922:9;3918:22;3897:53;:::i;:::-;3887:63;;3843:117;3999:2;4025:53;4070:7;4061:6;4050:9;4046:22;4025:53;:::i;:::-;4015:63;;3970:118;4127:2;4153:53;4198:7;4189:6;4178:9;4174:22;4153:53;:::i;:::-;4143:63;;4098:118;3604:619;;;;;:::o;4229:943::-;4324:6;4332;4340;4348;4397:3;4385:9;4376:7;4372:23;4368:33;4365:120;;;4404:79;;:::i;:::-;4365:120;4524:1;4549:53;4594:7;4585:6;4574:9;4570:22;4549:53;:::i;:::-;4539:63;;4495:117;4651:2;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4622:118;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4935:2;4924:9;4920:18;4907:32;4966:18;4958:6;4955:30;4952:117;;;4988:79;;:::i;:::-;4952:117;5093:62;5147:7;5138:6;5127:9;5123:22;5093:62;:::i;:::-;5083:72;;4878:287;4229:943;;;;;;;:::o;5178:468::-;5243:6;5251;5300:2;5288:9;5279:7;5275:23;5271:32;5268:119;;;5306:79;;:::i;:::-;5268:119;5426:1;5451:53;5496:7;5487:6;5476:9;5472:22;5451:53;:::i;:::-;5441:63;;5397:117;5553:2;5579:50;5621:7;5612:6;5601:9;5597:22;5579:50;:::i;:::-;5569:60;;5524:115;5178:468;;;;;:::o;5652:474::-;5720:6;5728;5777:2;5765:9;5756:7;5752:23;5748:32;5745:119;;;5783:79;;:::i;:::-;5745:119;5903:1;5928:53;5973:7;5964:6;5953:9;5949:22;5928:53;:::i;:::-;5918:63;;5874:117;6030:2;6056:53;6101:7;6092:6;6081:9;6077:22;6056:53;:::i;:::-;6046:63;;6001:118;5652:474;;;;;:::o;6132:327::-;6190:6;6239:2;6227:9;6218:7;6214:23;6210:32;6207:119;;;6245:79;;:::i;:::-;6207:119;6365:1;6390:52;6434:7;6425:6;6414:9;6410:22;6390:52;:::i;:::-;6380:62;;6336:116;6132:327;;;;:::o;6465:349::-;6534:6;6583:2;6571:9;6562:7;6558:23;6554:32;6551:119;;;6589:79;;:::i;:::-;6551:119;6709:1;6734:63;6789:7;6780:6;6769:9;6765:22;6734:63;:::i;:::-;6724:73;;6680:127;6465:349;;;;:::o;6820:509::-;6889:6;6938:2;6926:9;6917:7;6913:23;6909:32;6906:119;;;6944:79;;:::i;:::-;6906:119;7092:1;7081:9;7077:17;7064:31;7122:18;7114:6;7111:30;7108:117;;;7144:79;;:::i;:::-;7108:117;7249:63;7304:7;7295:6;7284:9;7280:22;7249:63;:::i;:::-;7239:73;;7035:287;6820:509;;;;:::o;7335:329::-;7394:6;7443:2;7431:9;7422:7;7418:23;7414:32;7411:119;;;7449:79;;:::i;:::-;7411:119;7569:1;7594:53;7639:7;7630:6;7619:9;7615:22;7594:53;:::i;:::-;7584:63;;7540:117;7335:329;;;;:::o;7670:118::-;7757:24;7775:5;7757:24;:::i;:::-;7752:3;7745:37;7670:118;;:::o;7794:109::-;7875:21;7890:5;7875:21;:::i;:::-;7870:3;7863:34;7794:109;;:::o;7909:360::-;7995:3;8023:38;8055:5;8023:38;:::i;:::-;8077:70;8140:6;8135:3;8077:70;:::i;:::-;8070:77;;8156:52;8201:6;8196:3;8189:4;8182:5;8178:16;8156:52;:::i;:::-;8233:29;8255:6;8233:29;:::i;:::-;8228:3;8224:39;8217:46;;7999:270;7909:360;;;;:::o;8275:364::-;8363:3;8391:39;8424:5;8391:39;:::i;:::-;8446:71;8510:6;8505:3;8446:71;:::i;:::-;8439:78;;8526:52;8571:6;8566:3;8559:4;8552:5;8548:16;8526:52;:::i;:::-;8603:29;8625:6;8603:29;:::i;:::-;8598:3;8594:39;8587:46;;8367:272;8275:364;;;;:::o;8645:377::-;8751:3;8779:39;8812:5;8779:39;:::i;:::-;8834:89;8916:6;8911:3;8834:89;:::i;:::-;8827:96;;8932:52;8977:6;8972:3;8965:4;8958:5;8954:16;8932:52;:::i;:::-;9009:6;9004:3;9000:16;8993:23;;8755:267;8645:377;;;;:::o;9028:366::-;9170:3;9191:67;9255:2;9250:3;9191:67;:::i;:::-;9184:74;;9267:93;9356:3;9267:93;:::i;:::-;9385:2;9380:3;9376:12;9369:19;;9028:366;;;:::o;9400:::-;9542:3;9563:67;9627:2;9622:3;9563:67;:::i;:::-;9556:74;;9639:93;9728:3;9639:93;:::i;:::-;9757:2;9752:3;9748:12;9741:19;;9400:366;;;:::o;9772:::-;9914:3;9935:67;9999:2;9994:3;9935:67;:::i;:::-;9928:74;;10011:93;10100:3;10011:93;:::i;:::-;10129:2;10124:3;10120:12;10113:19;;9772:366;;;:::o;10144:::-;10286:3;10307:67;10371:2;10366:3;10307:67;:::i;:::-;10300:74;;10383:93;10472:3;10383:93;:::i;:::-;10501:2;10496:3;10492:12;10485:19;;10144:366;;;:::o;10516:::-;10658:3;10679:67;10743:2;10738:3;10679:67;:::i;:::-;10672:74;;10755:93;10844:3;10755:93;:::i;:::-;10873:2;10868:3;10864:12;10857:19;;10516:366;;;:::o;10888:::-;11030:3;11051:67;11115:2;11110:3;11051:67;:::i;:::-;11044:74;;11127:93;11216:3;11127:93;:::i;:::-;11245:2;11240:3;11236:12;11229:19;;10888:366;;;:::o;11260:::-;11402:3;11423:67;11487:2;11482:3;11423:67;:::i;:::-;11416:74;;11499:93;11588:3;11499:93;:::i;:::-;11617:2;11612:3;11608:12;11601:19;;11260:366;;;:::o;11632:118::-;11719:24;11737:5;11719:24;:::i;:::-;11714:3;11707:37;11632:118;;:::o;11756:595::-;11984:3;12006:95;12097:3;12088:6;12006:95;:::i;:::-;11999:102;;12118:95;12209:3;12200:6;12118:95;:::i;:::-;12111:102;;12230:95;12321:3;12312:6;12230:95;:::i;:::-;12223:102;;12342:3;12335:10;;11756:595;;;;;;:::o;12357:222::-;12450:4;12488:2;12477:9;12473:18;12465:26;;12501:71;12569:1;12558:9;12554:17;12545:6;12501:71;:::i;:::-;12357:222;;;;:::o;12585:640::-;12780:4;12818:3;12807:9;12803:19;12795:27;;12832:71;12900:1;12889:9;12885:17;12876:6;12832:71;:::i;:::-;12913:72;12981:2;12970:9;12966:18;12957:6;12913:72;:::i;:::-;12995;13063:2;13052:9;13048:18;13039:6;12995:72;:::i;:::-;13114:9;13108:4;13104:20;13099:2;13088:9;13084:18;13077:48;13142:76;13213:4;13204:6;13142:76;:::i;:::-;13134:84;;12585:640;;;;;;;:::o;13231:210::-;13318:4;13356:2;13345:9;13341:18;13333:26;;13369:65;13431:1;13420:9;13416:17;13407:6;13369:65;:::i;:::-;13231:210;;;;:::o;13447:313::-;13560:4;13598:2;13587:9;13583:18;13575:26;;13647:9;13641:4;13637:20;13633:1;13622:9;13618:17;13611:47;13675:78;13748:4;13739:6;13675:78;:::i;:::-;13667:86;;13447:313;;;;:::o;13766:419::-;13932:4;13970:2;13959:9;13955:18;13947:26;;14019:9;14013:4;14009:20;14005:1;13994:9;13990:17;13983:47;14047:131;14173:4;14047:131;:::i;:::-;14039:139;;13766:419;;;:::o;14191:::-;14357:4;14395:2;14384:9;14380:18;14372:26;;14444:9;14438:4;14434:20;14430:1;14419:9;14415:17;14408:47;14472:131;14598:4;14472:131;:::i;:::-;14464:139;;14191:419;;;:::o;14616:::-;14782:4;14820:2;14809:9;14805:18;14797:26;;14869:9;14863:4;14859:20;14855:1;14844:9;14840:17;14833:47;14897:131;15023:4;14897:131;:::i;:::-;14889:139;;14616:419;;;:::o;15041:::-;15207:4;15245:2;15234:9;15230:18;15222:26;;15294:9;15288:4;15284:20;15280:1;15269:9;15265:17;15258:47;15322:131;15448:4;15322:131;:::i;:::-;15314:139;;15041:419;;;:::o;15466:::-;15632:4;15670:2;15659:9;15655:18;15647:26;;15719:9;15713:4;15709:20;15705:1;15694:9;15690:17;15683:47;15747:131;15873:4;15747:131;:::i;:::-;15739:139;;15466:419;;;:::o;15891:::-;16057:4;16095:2;16084:9;16080:18;16072:26;;16144:9;16138:4;16134:20;16130:1;16119:9;16115:17;16108:47;16172:131;16298:4;16172:131;:::i;:::-;16164:139;;15891:419;;;:::o;16316:::-;16482:4;16520:2;16509:9;16505:18;16497:26;;16569:9;16563:4;16559:20;16555:1;16544:9;16540:17;16533:47;16597:131;16723:4;16597:131;:::i;:::-;16589:139;;16316:419;;;:::o;16741:222::-;16834:4;16872:2;16861:9;16857:18;16849:26;;16885:71;16953:1;16942:9;16938:17;16929:6;16885:71;:::i;:::-;16741:222;;;;:::o;16969:129::-;17003:6;17030:20;;:::i;:::-;17020:30;;17059:33;17087:4;17079:6;17059:33;:::i;:::-;16969:129;;;:::o;17104:75::-;17137:6;17170:2;17164:9;17154:19;;17104:75;:::o;17185:307::-;17246:4;17336:18;17328:6;17325:30;17322:56;;;17358:18;;:::i;:::-;17322:56;17396:29;17418:6;17396:29;:::i;:::-;17388:37;;17480:4;17474;17470:15;17462:23;;17185:307;;;:::o;17498:308::-;17560:4;17650:18;17642:6;17639:30;17636:56;;;17672:18;;:::i;:::-;17636:56;17710:29;17732:6;17710:29;:::i;:::-;17702:37;;17794:4;17788;17784:15;17776:23;;17498:308;;;:::o;17812:98::-;17863:6;17897:5;17891:12;17881:22;;17812:98;;;:::o;17916:99::-;17968:6;18002:5;17996:12;17986:22;;17916:99;;;:::o;18021:168::-;18104:11;18138:6;18133:3;18126:19;18178:4;18173:3;18169:14;18154:29;;18021:168;;;;:::o;18195:169::-;18279:11;18313:6;18308:3;18301:19;18353:4;18348:3;18344:14;18329:29;;18195:169;;;;:::o;18370:148::-;18472:11;18509:3;18494:18;;18370:148;;;;:::o;18524:305::-;18564:3;18583:20;18601:1;18583:20;:::i;:::-;18578:25;;18617:20;18635:1;18617:20;:::i;:::-;18612:25;;18771:1;18703:66;18699:74;18696:1;18693:81;18690:107;;;18777:18;;:::i;:::-;18690:107;18821:1;18818;18814:9;18807:16;;18524:305;;;;:::o;18835:96::-;18872:7;18901:24;18919:5;18901:24;:::i;:::-;18890:35;;18835:96;;;:::o;18937:104::-;18982:7;19011:24;19029:5;19011:24;:::i;:::-;19000:35;;18937:104;;;:::o;19047:90::-;19081:7;19124:5;19117:13;19110:21;19099:32;;19047:90;;;:::o;19143:149::-;19179:7;19219:66;19212:5;19208:78;19197:89;;19143:149;;;:::o;19298:126::-;19335:7;19375:42;19368:5;19364:54;19353:65;;19298:126;;;:::o;19430:77::-;19467:7;19496:5;19485:16;;19430:77;;;:::o;19513:154::-;19597:6;19592:3;19587;19574:30;19659:1;19650:6;19645:3;19641:16;19634:27;19513:154;;;:::o;19673:307::-;19741:1;19751:113;19765:6;19762:1;19759:13;19751:113;;;19850:1;19845:3;19841:11;19835:18;19831:1;19826:3;19822:11;19815:39;19787:2;19784:1;19780:10;19775:15;;19751:113;;;19882:6;19879:1;19876:13;19873:101;;;19962:1;19953:6;19948:3;19944:16;19937:27;19873:101;19722:258;19673:307;;;:::o;19986:320::-;20030:6;20067:1;20061:4;20057:12;20047:22;;20114:1;20108:4;20104:12;20135:18;20125:81;;20191:4;20183:6;20179:17;20169:27;;20125:81;20253:2;20245:6;20242:14;20222:18;20219:38;20216:84;;;20272:18;;:::i;:::-;20216:84;20037:269;19986:320;;;:::o;20312:281::-;20395:27;20417:4;20395:27;:::i;:::-;20387:6;20383:40;20525:6;20513:10;20510:22;20489:18;20477:10;20474:34;20471:62;20468:88;;;20536:18;;:::i;:::-;20468:88;20576:10;20572:2;20565:22;20355:238;20312:281;;:::o;20599:180::-;20647:77;20644:1;20637:88;20744:4;20741:1;20734:15;20768:4;20765:1;20758:15;20785:180;20833:77;20830:1;20823:88;20930:4;20927:1;20920:15;20954:4;20951:1;20944:15;20971:180;21019:77;21016:1;21009:88;21116:4;21113:1;21106:15;21140:4;21137:1;21130:15;21157:117;21266:1;21263;21256:12;21280:117;21389:1;21386;21379:12;21403:117;21512:1;21509;21502:12;21526:117;21635:1;21632;21625:12;21649:102;21690:6;21741:2;21737:7;21732:2;21725:5;21721:14;21717:28;21707:38;;21649:102;;;:::o;21757:225::-;21897:34;21893:1;21885:6;21881:14;21874:58;21966:8;21961:2;21953:6;21949:15;21942:33;21757:225;:::o;21988:182::-;22128:34;22124:1;22116:6;22112:14;22105:58;21988:182;:::o;22176:177::-;22316:29;22312:1;22304:6;22300:14;22293:53;22176:177;:::o;22359:170::-;22499:22;22495:1;22487:6;22483:14;22476:46;22359:170;:::o;22535:160::-;22675:12;22671:1;22663:6;22659:14;22652:36;22535:160;:::o;22701:220::-;22841:34;22837:1;22829:6;22825:14;22818:58;22910:3;22905:2;22897:6;22893:15;22886:28;22701:220;:::o;22927:223::-;23067:34;23063:1;23055:6;23051:14;23044:58;23136:6;23131:2;23123:6;23119:15;23112:31;22927:223;:::o;23156:122::-;23229:24;23247:5;23229:24;:::i;:::-;23222:5;23219:35;23209:63;;23268:1;23265;23258:12;23209:63;23156:122;:::o;23284:138::-;23365:32;23391:5;23365:32;:::i;:::-;23358:5;23355:43;23345:71;;23412:1;23409;23402:12;23345:71;23284:138;:::o;23428:116::-;23498:21;23513:5;23498:21;:::i;:::-;23491:5;23488:32;23478:60;;23534:1;23531;23524:12;23478:60;23428:116;:::o;23550:120::-;23622:23;23639:5;23622:23;:::i;:::-;23615:5;23612:34;23602:62;;23660:1;23657;23650:12;23602:62;23550:120;:::o;23676:122::-;23749:24;23767:5;23749:24;:::i;:::-;23742:5;23739:35;23729:63;;23788:1;23785;23778:12;23729:63;23676:122;:::o
Swarm Source
ipfs://1a314be9756ca04a415eeeb103ab88103ff75d9f0f45bab8e77a24932225a844
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.