ERC-721
Overview
Max Total Supply
5,000 TGN
Holders
2,177
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TGNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheGodlyNFT
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-29 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/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/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.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/IERC721ABurnable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721ABurnable. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: erc721a/contracts/extensions/ERC721ABurnable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721ABurnable. * * @dev ERC721A token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } // File: contracts/mintingGodly.sol pragma solidity ^0.8.10; contract TheGodlyNFT is ERC721A, ERC721ABurnable, ERC721AQueryable, Ownable { string private _baseTokenURI; using Strings for uint256; uint256 public maxSupply = 6969; uint256 public maxWLSupply = 5000; uint256 public freeSupply = 1000; uint256 public mintPerTrx = 3; uint256 public mintPerAcc = 3; uint256 public freePerAcc = 1; uint256 public pubPrice = 0.015 ether; uint256 public wlPrice = 0.0099 ether; bytes32 public merkleRoot; bool public pubStat; bool public wlStat; constructor() ERC721A("TheGodlyNFT", "TGN") {} function publicMint(uint256 _quantity) external payable { require(pubStat, "Public mint is not active"); require(_quantity > 0, "Incorrect Quantity"); require(_quantity <= mintPerTrx, "Over amount per trx"); require(_numberMinted(msg.sender) + _quantity <= mintPerAcc,"No more tokens for you"); require(_totalMinted() + _quantity <= maxSupply, "Reached max supply"); require(msg.value >= pubPrice * _quantity, "Need more tokens"); _safeMint(msg.sender, _quantity); } function whitelistMint(bytes32[] calldata _merkleProof, uint256 _quantity) external payable { uint nftPrice = wlPrice; require(wlStat, "Whitelist mint is not active"); require(_quantity > 0, "Incorrect Quantity"); require(_quantity <= mintPerTrx, "Over amount per trx"); require(_numberMinted(msg.sender) + _quantity <= mintPerAcc,"No more tokens for you"); require(_totalMinted() + _quantity <= maxWLSupply, "Reached max WL supply"); require(checkProof(_merkleProof), "Invalid proof"); if(_totalMinted() + _quantity <= freeSupply && _numberMinted(msg.sender) + _quantity <= freePerAcc){ nftPrice = 0; } require(msg.value >= nftPrice * _quantity, "Need more tokens"); _safeMint(msg.sender, _quantity); } function setMaxSupply(uint256 _maxSupply) public onlyOwner{ maxSupply = _maxSupply; } function setMaxWLSupply(uint256 _maxWLSupply) public onlyOwner{ maxWLSupply = _maxWLSupply; } function setFreeSupply(uint256 _freeSupply) public onlyOwner{ freeSupply = _freeSupply; } function setMintPerTrx(uint256 _mintPerTrx) public onlyOwner{ mintPerTrx = _mintPerTrx; } function setMintPerAcc(uint256 _mintPerAcc) public onlyOwner{ mintPerAcc = _mintPerAcc; } function setFreePerAcc(uint256 _freePerAcc) public onlyOwner{ freePerAcc = _freePerAcc; } function setPubPrice(uint256 _pubPrice) public onlyOwner{ pubPrice = _pubPrice; } function setWlPrice(uint256 _wlPrice) public onlyOwner{ wlPrice = _wlPrice; } function setPubStat() public onlyOwner { pubStat = !pubStat; } function setWlStat() public onlyOwner { wlStat = !wlStat; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function teamMint( uint256 quantity) public payable onlyOwner { require(_totalMinted() + quantity <= maxSupply); _safeMint(msg.sender, quantity); } function teamDrop( address to, uint256 airSupply) public payable onlyOwner { require(_totalMinted() + airSupply <= maxSupply); _safeMint(to, airSupply); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) public onlyOwner { _baseTokenURI = baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json")) : ""; } function checkProof(bytes32[] calldata _merkleProof) public view returns (bool){ bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Incorrect proof"); return true; } function totalMinted() public view returns(uint256){ return _totalMinted(); } function withdraw() public onlyOwner { payable(msg.sender).transfer(payable(address(this)).balance); } function withdrawAmount(uint256 _amount) public onlyOwner{ (bool success, ) = payable(msg.sender).call{value: _amount}(""); require(success); } function burnToCrisp(uint256 tokenId) public onlyOwner { require(_exists(tokenId), "Token does not exist"); _burn(tokenId); } function checkBurn() public view returns(uint256){ return _totalBurned(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnToCrisp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freePerAcc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPerAcc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPerTrx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubStat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freePerAcc","type":"uint256"}],"name":"setFreePerAcc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeSupply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWLSupply","type":"uint256"}],"name":"setMaxWLSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPerAcc","type":"uint256"}],"name":"setMintPerAcc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPerTrx","type":"uint256"}],"name":"setMintPerTrx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pubPrice","type":"uint256"}],"name":"setPubPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPubStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlPrice","type":"uint256"}],"name":"setWlPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWlStat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"airSupply","type":"uint256"}],"name":"teamDrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlStat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052611b39600a55611388600b556103e8600c556003600d556003600e556001600f5566354a6ba7a1800060105566232bff5f46c0006011553480156200004857600080fd5b506040518060400160405280600b81526020017f546865476f646c794e46540000000000000000000000000000000000000000008152506040518060400160405280600381526020017f54474e00000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000cd929190620001f8565b508060039080519060200190620000e6929190620001f8565b50620000f76200012560201b60201c565b60008190555050506200011f620001136200012a60201b60201c565b6200013260201b60201c565b6200030d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020690620002d7565b90600052602060002090601f0160209004810192826200022a576000855562000276565b82601f106200024557805160ff191683800117855562000276565b8280016001018555821562000276579182015b828111156200027557825182559160200191906001019062000258565b5b50905062000285919062000289565b5090565b5b80821115620002a45760008160009055506001016200028a565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f057607f821691505b60208210811415620003075762000306620002a8565b5b50919050565b614a34806200031d6000396000f3fe6080604052600436106103505760003560e01c80636352211e116101c6578063ae3a1f98116100f7578063c7f8d01a11610095578063dcd5994e1161006f578063dcd5994e14610bba578063e985e9c514610be3578063f2fde38b14610c20578063f676308a14610c4957610350565b8063c7f8d01a14610b27578063c87b56dd14610b52578063d5abeb0114610b8f57610350565b8063bddb7be7116100d1578063bddb7be714610a7d578063bf62113b14610aa8578063c23dc68f14610ad3578063c6b3e75414610b1057610350565b8063ae3a1f9814610a1a578063aff3a96614610a36578063b88d4fde14610a6157610350565b80638dd07d0f1161016457806399a2557a1161013e57806399a2557a1461095e578063a22cb4651461099b578063a2309ff8146109c4578063a254fe02146109ef57610350565b80638dd07d0f146108e157806391ae81101461090a57806395d89b411461093357610350565b8063715018a6116101a0578063715018a6146108395780637cb64759146108505780638462151c146108795780638da5cb5b146108b657610350565b80636352211e146107965780636f8b44b0146107d357806370a08231146107fc57610350565b806323b872dd116102a05780633ccfd60b1161023e578063480da21211610218578063480da212146106dc578063515dc3271461070557806355f804b3146107305780635bbb21771461075957610350565b80633ccfd60b1461068057806342842e0e1461069757806342966c68146106b357610350565b80632db115441161027a5780632db11544146105f45780632eb4a7ab146106105780632fbba1151461063b5780633202c12c1461065757610350565b806323b872dd1461059157806324a6ab0c146105ad5780632904e6d9146105d857610350565b806314f0703d1161030d57806318160ddd116102e757806318160ddd146104fb57806319575e6f146105265780631c9033c214610551578063214939e61461057a57610350565b806314f0703d1461046a57806316ddcd191461049357806317abc702146104d057610350565b806301ffc9a7146103555780630562b9f71461039257806306fdde03146103bb578063081812fc146103e6578063095ea7b3146104235780630b17087e1461043f575b600080fd5b34801561036157600080fd5b5061037c600480360381019061037791906133ab565b610c72565b60405161038991906133f3565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190613444565b610d04565b005b3480156103c757600080fd5b506103d0610d86565b6040516103dd919061350a565b60405180910390f35b3480156103f257600080fd5b5061040d60048036038101906104089190613444565b610e18565b60405161041a919061356d565b60405180910390f35b61043d600480360381019061043891906135b4565b610e97565b005b34801561044b57600080fd5b50610454610fdb565b60405161046191906133f3565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613444565b610fee565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190613659565b611000565b6040516104c791906133f3565b60405180910390f35b3480156104dc57600080fd5b506104e56110c4565b6040516104f291906136b5565b60405180910390f35b34801561050757600080fd5b506105106110ca565b60405161051d91906136b5565b60405180910390f35b34801561053257600080fd5b5061053b6110e1565b60405161054891906133f3565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190613444565b6110f4565b005b34801561058657600080fd5b5061058f611106565b005b6105ab60048036038101906105a691906136d0565b61113a565b005b3480156105b957600080fd5b506105c261145f565b6040516105cf91906136b5565b60405180910390f35b6105f260048036038101906105ed9190613723565b611465565b005b61060e60048036038101906106099190613444565b6116dc565b005b34801561061c57600080fd5b506106256118bf565b604051610632919061379c565b60405180910390f35b61065560048036038101906106509190613444565b6118c5565b005b34801561066357600080fd5b5061067e60048036038101906106799190613444565b6118fb565b005b34801561068c57600080fd5b5061069561190d565b005b6106b160048036038101906106ac91906136d0565b611975565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190613444565b611995565b005b3480156106e857600080fd5b5061070360048036038101906106fe9190613444565b6119a3565b005b34801561071157600080fd5b5061071a6119b5565b60405161072791906136b5565b60405180910390f35b34801561073c57600080fd5b506107576004803603810190610752919061380d565b6119bb565b005b34801561076557600080fd5b50610780600480360381019061077b91906138b0565b6119d9565b60405161078d9190613a60565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613444565b611a9c565b6040516107ca919061356d565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190613444565b611aae565b005b34801561080857600080fd5b50610823600480360381019061081e9190613a82565b611ac0565b60405161083091906136b5565b60405180910390f35b34801561084557600080fd5b5061084e611b79565b005b34801561085c57600080fd5b5061087760048036038101906108729190613adb565b611b8d565b005b34801561088557600080fd5b506108a0600480360381019061089b9190613a82565b611b9f565b6040516108ad9190613bc6565b60405180910390f35b3480156108c257600080fd5b506108cb611ce9565b6040516108d8919061356d565b60405180910390f35b3480156108ed57600080fd5b5061090860048036038101906109039190613444565b611d13565b005b34801561091657600080fd5b50610931600480360381019061092c9190613444565b611d25565b005b34801561093f57600080fd5b50610948611d81565b604051610955919061350a565b60405180910390f35b34801561096a57600080fd5b5061098560048036038101906109809190613be8565b611e13565b6040516109929190613bc6565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd9190613c67565b612027565b005b3480156109d057600080fd5b506109d9612132565b6040516109e691906136b5565b60405180910390f35b3480156109fb57600080fd5b50610a04612141565b604051610a1191906136b5565b60405180910390f35b610a346004803603810190610a2f91906135b4565b612147565b005b348015610a4257600080fd5b50610a4b61217e565b604051610a5891906136b5565b60405180910390f35b610a7b6004803603810190610a769190613dd7565b61218d565b005b348015610a8957600080fd5b50610a92612200565b604051610a9f91906136b5565b60405180910390f35b348015610ab457600080fd5b50610abd612206565b604051610aca91906136b5565b60405180910390f35b348015610adf57600080fd5b50610afa6004803603810190610af59190613444565b61220c565b604051610b079190613eaf565b60405180910390f35b348015610b1c57600080fd5b50610b25612276565b005b348015610b3357600080fd5b50610b3c6122aa565b604051610b4991906136b5565b60405180910390f35b348015610b5e57600080fd5b50610b796004803603810190610b749190613444565b6122b0565b604051610b86919061350a565b60405180910390f35b348015610b9b57600080fd5b50610ba4612357565b604051610bb191906136b5565b60405180910390f35b348015610bc657600080fd5b50610be16004803603810190610bdc9190613444565b61235d565b005b348015610bef57600080fd5b50610c0a6004803603810190610c059190613eca565b61236f565b604051610c1791906133f3565b60405180910390f35b348015610c2c57600080fd5b50610c476004803603810190610c429190613a82565b612403565b005b348015610c5557600080fd5b50610c706004803603810190610c6b9190613444565b612487565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ccd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cfd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610d0c612499565b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610d3290613f3b565b60006040518083038185875af1925050503d8060008114610d6f576040519150601f19603f3d011682016040523d82523d6000602084013e610d74565b606091505b5050905080610d8257600080fd5b5050565b606060028054610d9590613f7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc190613f7f565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b5050505050905090565b6000610e2382612517565b610e59576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ea282611a9c565b90508073ffffffffffffffffffffffffffffffffffffffff16610ec3612576565b73ffffffffffffffffffffffffffffffffffffffff1614610f2657610eef81610eea612576565b61236f565b610f25576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601360009054906101000a900460ff1681565b610ff6612499565b80600e8190555050565b600080336040516020016110149190613ff9565b60405160208183030381529060405280519060200120905061107a848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506012548361257e565b6110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090614060565b60405180910390fd5b600191505092915050565b600e5481565b60006110d4612595565b6001546000540303905090565b601360019054906101000a900460ff1681565b6110fc612499565b80600f8190555050565b61110e612499565b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b60006111458261259a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111ac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111b884612668565b915091506111ce81876111c9612576565b61268f565b61121a576111e3866111de612576565b61236f565b611219576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611281576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61128e86868660016126d3565b801561129957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611367856113438888876126d9565b7c020000000000000000000000000000000000000000000000000000000017612701565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156113ef5760006001850190506000600460008381526020019081526020016000205414156113ed5760005481146113ec578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611457868686600161272c565b505050505050565b600c5481565b60006011549050601360019054906101000a900460ff166114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b2906140cc565b60405180910390fd5b600082116114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590614138565b60405180910390fd5b600d54821115611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a906141a4565b60405180910390fd5b600e548261155033612732565b61155a91906141f3565b111561159b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159290614295565b60405180910390fd5b600b54826115a7612789565b6115b191906141f3565b11156115f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e990614301565b60405180910390fd5b6115fc8484611000565b61163b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116329061436d565b60405180910390fd5b600c5482611647612789565b61165191906141f3565b111580156116745750600f548261166733612732565b61167191906141f3565b11155b1561167e57600090505b818161168a919061438d565b3410156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390614433565b60405180910390fd5b6116d6338361279c565b50505050565b601360009054906101000a900460ff1661172b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117229061449f565b60405180910390fd5b6000811161176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590614138565b60405180910390fd5b600d548111156117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa906141a4565b60405180910390fd5b600e54816117c033612732565b6117ca91906141f3565b111561180b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180290614295565b60405180910390fd5b600a5481611817612789565b61182191906141f3565b1115611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118599061450b565b60405180910390fd5b80601054611870919061438d565b3410156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a990614433565b60405180910390fd5b6118bc338261279c565b50565b60125481565b6118cd612499565b600a54816118d9612789565b6118e391906141f3565b11156118ee57600080fd5b6118f8338261279c565b50565b611903612499565b80600d8190555050565b611915612499565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611972573d6000803e3d6000fd5b50565b6119908383836040518060200160405280600081525061218d565b505050565b6119a08160016127ba565b50565b6119ab612499565b80600b8190555050565b600b5481565b6119c3612499565b8181600991906119d492919061324d565b505050565b6060600083839050905060008167ffffffffffffffff8111156119ff576119fe613cac565b5b604051908082528060200260200182016040528015611a3857816020015b611a256132d3565b815260200190600190039081611a1d5790505b50905060005b828114611a9057611a67868683818110611a5b57611a5a61452b565b5b9050602002013561220c565b828281518110611a7a57611a7961452b565b5b6020026020010181905250806001019050611a3e565b50809250505092915050565b6000611aa78261259a565b9050919050565b611ab6612499565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b28576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b81612499565b611b8b6000612a0e565b565b611b95612499565b8060128190555050565b60606000806000611baf85611ac0565b905060008167ffffffffffffffff811115611bcd57611bcc613cac565b5b604051908082528060200260200182016040528015611bfb5781602001602082028036833780820191505090505b509050611c066132d3565b6000611c10612595565b90505b838614611cdb57611c2381612ad4565b9150816040015115611c3457611cd0565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c7457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ccf5780838780600101985081518110611cc257611cc161452b565b5b6020026020010181815250505b5b806001019050611c13565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d1b612499565b8060118190555050565b611d2d612499565b611d3681612517565b611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c906145a6565b60405180910390fd5b611d7e81612aff565b50565b606060038054611d9090613f7f565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbc90613f7f565b8015611e095780601f10611dde57610100808354040283529160200191611e09565b820191906000526020600020905b815481529060010190602001808311611dec57829003601f168201915b5050505050905090565b6060818310611e4e576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611e59612b0d565b9050611e63612595565b851015611e7557611e72612595565b94505b80841115611e81578093505b6000611e8c87611ac0565b905084861015611eaf576000868603905081811015611ea9578091505b50611eb4565b600090505b60008167ffffffffffffffff811115611ed057611ecf613cac565b5b604051908082528060200260200182016040528015611efe5781602001602082028036833780820191505090505b5090506000821415611f165780945050505050612020565b6000611f218861220c565b905060008160400151611f3657816000015190505b60008990505b888114158015611f4c5750848714155b1561201257611f5a81612ad4565b9250826040015115611f6b57612007565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611fab57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120065780848880600101995081518110611ff957611ff861452b565b5b6020026020010181815250505b5b806001019050611f3c565b508583528296505050505050505b9392505050565b8060076000612034612576565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120e1612576565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161212691906133f3565b60405180910390a35050565b600061213c612789565b905090565b600f5481565b61214f612499565b600a548161215b612789565b61216591906141f3565b111561217057600080fd5b61217a828261279c565b5050565b6000612188612b16565b905090565b61219884848461113a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121fa576121c384848484612b20565b6121f9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b600d5481565b6122146132d3565b61221c6132d3565b612224612595565b8310806122385750612234612b0d565b8310155b156122465780915050612271565b61224f83612ad4565b90508060400151156122645780915050612271565b61226d83612c71565b9150505b919050565b61227e612499565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60115481565b60606122bb82612517565b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614638565b60405180910390fd5b6000612304612c91565b90506000815111612324576040518060200160405280600081525061234f565b8061232e84612d23565b60405160200161233f9291906146e0565b6040516020818303038152906040525b915050919050565b600a5481565b612365612499565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61240b612499565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290614781565b60405180910390fd5b61248481612a0e565b50565b61248f612499565b80600c8190555050565b6124a1612e84565b73ffffffffffffffffffffffffffffffffffffffff166124bf611ce9565b73ffffffffffffffffffffffffffffffffffffffff1614612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c906147ed565b60405180910390fd5b565b600081612522612595565b11158015612531575060005482105b801561256f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008261258b8584612e8c565b1490509392505050565b600090565b600080829050806125a9612595565b11612631576000548110156126305760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561262e575b60008114156126245760046000836001900393508381526020019081526020016000205490506125f9565b8092505050612663565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86126f0868684612ee2565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000612793612595565b60005403905090565b6127b6828260405180602001604052806000815250612eeb565b5050565b60006127c58361259a565b905060008190506000806127d886612668565b915091508415612841576127f481846127ef612576565b61268f565b6128405761280983612804612576565b61236f565b61283f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61284f8360008860016126d3565b801561285a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612902836128bf856000886126d9565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612701565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516141561298a576000600187019050600060046000838152602001908152602001600020541415612988576000548114612987578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129f483600088600161272c565b600160008154809291906001019190505550505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612adc6132d3565b612af86004600084815260200190815260200160002054612f88565b9050919050565b612b0a8160006127ba565b50565b60008054905090565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b46612576565b8786866040518563ffffffff1660e01b8152600401612b689493929190614862565b6020604051808303816000875af1925050508015612ba457506040513d601f19601f82011682018060405250810190612ba191906148c3565b60015b612c1e573d8060008114612bd4576040519150601f19603f3d011682016040523d82523d6000602084013e612bd9565b606091505b50600081511415612c16576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612c796132d3565b612c8a612c858361259a565b612f88565b9050919050565b606060098054612ca090613f7f565b80601f0160208091040260200160405190810160405280929190818152602001828054612ccc90613f7f565b8015612d195780601f10612cee57610100808354040283529160200191612d19565b820191906000526020600020905b815481529060010190602001808311612cfc57829003601f168201915b5050505050905090565b60606000821415612d6b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e7f565b600082905060005b60008214612d9d578080612d86906148f0565b915050600a82612d969190614968565b9150612d73565b60008167ffffffffffffffff811115612db957612db8613cac565b5b6040519080825280601f01601f191660200182016040528015612deb5781602001600182028036833780820191505090505b5090505b60008514612e7857600182612e049190614999565b9150600a85612e1391906149cd565b6030612e1f91906141f3565b60f81b818381518110612e3557612e3461452b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e719190614968565b9450612def565b8093505050505b919050565b600033905090565b60008082905060005b8451811015612ed757612ec282868381518110612eb557612eb461452b565b5b602002602001015161303e565b91508080612ecf906148f0565b915050612e95565b508091505092915050565b60009392505050565b612ef58383613069565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f8357600080549050600083820390505b612f356000868380600101945086612b20565b612f6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f22578160005414612f8057600080fd5b50505b505050565b612f906132d3565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000818310613056576130518284613226565b613061565b6130608383613226565b5b905092915050565b60008054905060008214156130aa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130b760008483856126d3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061312e8361311f60008660006126d9565b6131288561323d565b17612701565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146131cf57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613194565b50600082141561320b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613221600084838561272c565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461325990613f7f565b90600052602060002090601f01602090048101928261327b57600085556132c2565b82601f1061329457803560ff19168380011785556132c2565b828001600101855582156132c2579182015b828111156132c15782358255916020019190600101906132a6565b5b5090506132cf9190613322565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b8082111561333b576000816000905550600101613323565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61338881613353565b811461339357600080fd5b50565b6000813590506133a58161337f565b92915050565b6000602082840312156133c1576133c0613349565b5b60006133cf84828501613396565b91505092915050565b60008115159050919050565b6133ed816133d8565b82525050565b600060208201905061340860008301846133e4565b92915050565b6000819050919050565b6134218161340e565b811461342c57600080fd5b50565b60008135905061343e81613418565b92915050565b60006020828403121561345a57613459613349565b5b60006134688482850161342f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134ab578082015181840152602081019050613490565b838111156134ba576000848401525b50505050565b6000601f19601f8301169050919050565b60006134dc82613471565b6134e6818561347c565b93506134f681856020860161348d565b6134ff816134c0565b840191505092915050565b6000602082019050818103600083015261352481846134d1565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135578261352c565b9050919050565b6135678161354c565b82525050565b6000602082019050613582600083018461355e565b92915050565b6135918161354c565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b600080604083850312156135cb576135ca613349565b5b60006135d98582860161359f565b92505060206135ea8582860161342f565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613619576136186135f4565b5b8235905067ffffffffffffffff811115613636576136356135f9565b5b602083019150836020820283011115613652576136516135fe565b5b9250929050565b600080602083850312156136705761366f613349565b5b600083013567ffffffffffffffff81111561368e5761368d61334e565b5b61369a85828601613603565b92509250509250929050565b6136af8161340e565b82525050565b60006020820190506136ca60008301846136a6565b92915050565b6000806000606084860312156136e9576136e8613349565b5b60006136f78682870161359f565b93505060206137088682870161359f565b92505060406137198682870161342f565b9150509250925092565b60008060006040848603121561373c5761373b613349565b5b600084013567ffffffffffffffff81111561375a5761375961334e565b5b61376686828701613603565b935093505060206137798682870161342f565b9150509250925092565b6000819050919050565b61379681613783565b82525050565b60006020820190506137b1600083018461378d565b92915050565b60008083601f8401126137cd576137cc6135f4565b5b8235905067ffffffffffffffff8111156137ea576137e96135f9565b5b602083019150836001820283011115613806576138056135fe565b5b9250929050565b6000806020838503121561382457613823613349565b5b600083013567ffffffffffffffff8111156138425761384161334e565b5b61384e858286016137b7565b92509250509250929050565b60008083601f8401126138705761386f6135f4565b5b8235905067ffffffffffffffff81111561388d5761388c6135f9565b5b6020830191508360208202830111156138a9576138a86135fe565b5b9250929050565b600080602083850312156138c7576138c6613349565b5b600083013567ffffffffffffffff8111156138e5576138e461334e565b5b6138f18582860161385a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6139328161354c565b82525050565b600067ffffffffffffffff82169050919050565b61395581613938565b82525050565b613964816133d8565b82525050565b600062ffffff82169050919050565b6139828161396a565b82525050565b60808201600082015161399e6000850182613929565b5060208201516139b1602085018261394c565b5060408201516139c4604085018261395b565b5060608201516139d76060850182613979565b50505050565b60006139e98383613988565b60808301905092915050565b6000602082019050919050565b6000613a0d826138fd565b613a178185613908565b9350613a2283613919565b8060005b83811015613a53578151613a3a88826139dd565b9750613a45836139f5565b925050600181019050613a26565b5085935050505092915050565b60006020820190508181036000830152613a7a8184613a02565b905092915050565b600060208284031215613a9857613a97613349565b5b6000613aa68482850161359f565b91505092915050565b613ab881613783565b8114613ac357600080fd5b50565b600081359050613ad581613aaf565b92915050565b600060208284031215613af157613af0613349565b5b6000613aff84828501613ac6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b3d8161340e565b82525050565b6000613b4f8383613b34565b60208301905092915050565b6000602082019050919050565b6000613b7382613b08565b613b7d8185613b13565b9350613b8883613b24565b8060005b83811015613bb9578151613ba08882613b43565b9750613bab83613b5b565b925050600181019050613b8c565b5085935050505092915050565b60006020820190508181036000830152613be08184613b68565b905092915050565b600080600060608486031215613c0157613c00613349565b5b6000613c0f8682870161359f565b9350506020613c208682870161342f565b9250506040613c318682870161342f565b9150509250925092565b613c44816133d8565b8114613c4f57600080fd5b50565b600081359050613c6181613c3b565b92915050565b60008060408385031215613c7e57613c7d613349565b5b6000613c8c8582860161359f565b9250506020613c9d85828601613c52565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ce4826134c0565b810181811067ffffffffffffffff82111715613d0357613d02613cac565b5b80604052505050565b6000613d1661333f565b9050613d228282613cdb565b919050565b600067ffffffffffffffff821115613d4257613d41613cac565b5b613d4b826134c0565b9050602081019050919050565b82818337600083830152505050565b6000613d7a613d7584613d27565b613d0c565b905082815260208101848484011115613d9657613d95613ca7565b5b613da1848285613d58565b509392505050565b600082601f830112613dbe57613dbd6135f4565b5b8135613dce848260208601613d67565b91505092915050565b60008060008060808587031215613df157613df0613349565b5b6000613dff8782880161359f565b9450506020613e108782880161359f565b9350506040613e218782880161342f565b925050606085013567ffffffffffffffff811115613e4257613e4161334e565b5b613e4e87828801613da9565b91505092959194509250565b608082016000820151613e706000850182613929565b506020820151613e83602085018261394c565b506040820151613e96604085018261395b565b506060820151613ea96060850182613979565b50505050565b6000608082019050613ec46000830184613e5a565b92915050565b60008060408385031215613ee157613ee0613349565b5b6000613eef8582860161359f565b9250506020613f008582860161359f565b9150509250929050565b600081905092915050565b50565b6000613f25600083613f0a565b9150613f3082613f15565b600082019050919050565b6000613f4682613f18565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f9757607f821691505b60208210811415613fab57613faa613f50565b5b50919050565b60008160601b9050919050565b6000613fc982613fb1565b9050919050565b6000613fdb82613fbe565b9050919050565b613ff3613fee8261354c565b613fd0565b82525050565b60006140058284613fe2565b60148201915081905092915050565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b600061404a600f8361347c565b915061405582614014565b602082019050919050565b600060208201905081810360008301526140798161403d565b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b60006140b6601c8361347c565b91506140c182614080565b602082019050919050565b600060208201905081810360008301526140e5816140a9565b9050919050565b7f496e636f7272656374205175616e746974790000000000000000000000000000600082015250565b600061412260128361347c565b915061412d826140ec565b602082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f4f76657220616d6f756e74207065722074727800000000000000000000000000600082015250565b600061418e60138361347c565b915061419982614158565b602082019050919050565b600060208201905081810360008301526141bd81614181565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141fe8261340e565b91506142098361340e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561423e5761423d6141c4565b5b828201905092915050565b7f4e6f206d6f726520746f6b656e7320666f7220796f7500000000000000000000600082015250565b600061427f60168361347c565b915061428a82614249565b602082019050919050565b600060208201905081810360008301526142ae81614272565b9050919050565b7f52656163686564206d617820574c20737570706c790000000000000000000000600082015250565b60006142eb60158361347c565b91506142f6826142b5565b602082019050919050565b6000602082019050818103600083015261431a816142de565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614357600d8361347c565b915061436282614321565b602082019050919050565b600060208201905081810360008301526143868161434a565b9050919050565b60006143988261340e565b91506143a38361340e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143dc576143db6141c4565b5b828202905092915050565b7f4e656564206d6f726520746f6b656e7300000000000000000000000000000000600082015250565b600061441d60108361347c565b9150614428826143e7565b602082019050919050565b6000602082019050818103600083015261444c81614410565b9050919050565b7f5075626c6963206d696e74206973206e6f742061637469766500000000000000600082015250565b600061448960198361347c565b915061449482614453565b602082019050919050565b600060208201905081810360008301526144b88161447c565b9050919050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006144f560128361347c565b9150614500826144bf565b602082019050919050565b60006020820190508181036000830152614524816144e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061459060148361347c565b915061459b8261455a565b602082019050919050565b600060208201905081810360008301526145bf81614583565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614622602f8361347c565b915061462d826145c6565b604082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b600081905092915050565b600061466e82613471565b6146788185614658565b935061468881856020860161348d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006146ca600583614658565b91506146d582614694565b600582019050919050565b60006146ec8285614663565b91506146f88284614663565b9150614703826146bd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061476b60268361347c565b91506147768261470f565b604082019050919050565b6000602082019050818103600083015261479a8161475e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147d760208361347c565b91506147e2826147a1565b602082019050919050565b60006020820190508181036000830152614806816147ca565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148348261480d565b61483e8185614818565b935061484e81856020860161348d565b614857816134c0565b840191505092915050565b6000608082019050614877600083018761355e565b614884602083018661355e565b61489160408301856136a6565b81810360608301526148a38184614829565b905095945050505050565b6000815190506148bd8161337f565b92915050565b6000602082840312156148d9576148d8613349565b5b60006148e7848285016148ae565b91505092915050565b60006148fb8261340e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561492e5761492d6141c4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149738261340e565b915061497e8361340e565b92508261498e5761498d614939565b5b828204905092915050565b60006149a48261340e565b91506149af8361340e565b9250828210156149c2576149c16141c4565b5b828203905092915050565b60006149d88261340e565b91506149e38361340e565b9250826149f3576149f2614939565b5b82820690509291505056fea2646970667358221220f28525f547bdd74d67b22e07d76224d2a5a556ea3239748a7b2c0f5ce4cdd00d64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106103505760003560e01c80636352211e116101c6578063ae3a1f98116100f7578063c7f8d01a11610095578063dcd5994e1161006f578063dcd5994e14610bba578063e985e9c514610be3578063f2fde38b14610c20578063f676308a14610c4957610350565b8063c7f8d01a14610b27578063c87b56dd14610b52578063d5abeb0114610b8f57610350565b8063bddb7be7116100d1578063bddb7be714610a7d578063bf62113b14610aa8578063c23dc68f14610ad3578063c6b3e75414610b1057610350565b8063ae3a1f9814610a1a578063aff3a96614610a36578063b88d4fde14610a6157610350565b80638dd07d0f1161016457806399a2557a1161013e57806399a2557a1461095e578063a22cb4651461099b578063a2309ff8146109c4578063a254fe02146109ef57610350565b80638dd07d0f146108e157806391ae81101461090a57806395d89b411461093357610350565b8063715018a6116101a0578063715018a6146108395780637cb64759146108505780638462151c146108795780638da5cb5b146108b657610350565b80636352211e146107965780636f8b44b0146107d357806370a08231146107fc57610350565b806323b872dd116102a05780633ccfd60b1161023e578063480da21211610218578063480da212146106dc578063515dc3271461070557806355f804b3146107305780635bbb21771461075957610350565b80633ccfd60b1461068057806342842e0e1461069757806342966c68146106b357610350565b80632db115441161027a5780632db11544146105f45780632eb4a7ab146106105780632fbba1151461063b5780633202c12c1461065757610350565b806323b872dd1461059157806324a6ab0c146105ad5780632904e6d9146105d857610350565b806314f0703d1161030d57806318160ddd116102e757806318160ddd146104fb57806319575e6f146105265780631c9033c214610551578063214939e61461057a57610350565b806314f0703d1461046a57806316ddcd191461049357806317abc702146104d057610350565b806301ffc9a7146103555780630562b9f71461039257806306fdde03146103bb578063081812fc146103e6578063095ea7b3146104235780630b17087e1461043f575b600080fd5b34801561036157600080fd5b5061037c600480360381019061037791906133ab565b610c72565b60405161038991906133f3565b60405180910390f35b34801561039e57600080fd5b506103b960048036038101906103b49190613444565b610d04565b005b3480156103c757600080fd5b506103d0610d86565b6040516103dd919061350a565b60405180910390f35b3480156103f257600080fd5b5061040d60048036038101906104089190613444565b610e18565b60405161041a919061356d565b60405180910390f35b61043d600480360381019061043891906135b4565b610e97565b005b34801561044b57600080fd5b50610454610fdb565b60405161046191906133f3565b60405180910390f35b34801561047657600080fd5b50610491600480360381019061048c9190613444565b610fee565b005b34801561049f57600080fd5b506104ba60048036038101906104b59190613659565b611000565b6040516104c791906133f3565b60405180910390f35b3480156104dc57600080fd5b506104e56110c4565b6040516104f291906136b5565b60405180910390f35b34801561050757600080fd5b506105106110ca565b60405161051d91906136b5565b60405180910390f35b34801561053257600080fd5b5061053b6110e1565b60405161054891906133f3565b60405180910390f35b34801561055d57600080fd5b5061057860048036038101906105739190613444565b6110f4565b005b34801561058657600080fd5b5061058f611106565b005b6105ab60048036038101906105a691906136d0565b61113a565b005b3480156105b957600080fd5b506105c261145f565b6040516105cf91906136b5565b60405180910390f35b6105f260048036038101906105ed9190613723565b611465565b005b61060e60048036038101906106099190613444565b6116dc565b005b34801561061c57600080fd5b506106256118bf565b604051610632919061379c565b60405180910390f35b61065560048036038101906106509190613444565b6118c5565b005b34801561066357600080fd5b5061067e60048036038101906106799190613444565b6118fb565b005b34801561068c57600080fd5b5061069561190d565b005b6106b160048036038101906106ac91906136d0565b611975565b005b3480156106bf57600080fd5b506106da60048036038101906106d59190613444565b611995565b005b3480156106e857600080fd5b5061070360048036038101906106fe9190613444565b6119a3565b005b34801561071157600080fd5b5061071a6119b5565b60405161072791906136b5565b60405180910390f35b34801561073c57600080fd5b506107576004803603810190610752919061380d565b6119bb565b005b34801561076557600080fd5b50610780600480360381019061077b91906138b0565b6119d9565b60405161078d9190613a60565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613444565b611a9c565b6040516107ca919061356d565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190613444565b611aae565b005b34801561080857600080fd5b50610823600480360381019061081e9190613a82565b611ac0565b60405161083091906136b5565b60405180910390f35b34801561084557600080fd5b5061084e611b79565b005b34801561085c57600080fd5b5061087760048036038101906108729190613adb565b611b8d565b005b34801561088557600080fd5b506108a0600480360381019061089b9190613a82565b611b9f565b6040516108ad9190613bc6565b60405180910390f35b3480156108c257600080fd5b506108cb611ce9565b6040516108d8919061356d565b60405180910390f35b3480156108ed57600080fd5b5061090860048036038101906109039190613444565b611d13565b005b34801561091657600080fd5b50610931600480360381019061092c9190613444565b611d25565b005b34801561093f57600080fd5b50610948611d81565b604051610955919061350a565b60405180910390f35b34801561096a57600080fd5b5061098560048036038101906109809190613be8565b611e13565b6040516109929190613bc6565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd9190613c67565b612027565b005b3480156109d057600080fd5b506109d9612132565b6040516109e691906136b5565b60405180910390f35b3480156109fb57600080fd5b50610a04612141565b604051610a1191906136b5565b60405180910390f35b610a346004803603810190610a2f91906135b4565b612147565b005b348015610a4257600080fd5b50610a4b61217e565b604051610a5891906136b5565b60405180910390f35b610a7b6004803603810190610a769190613dd7565b61218d565b005b348015610a8957600080fd5b50610a92612200565b604051610a9f91906136b5565b60405180910390f35b348015610ab457600080fd5b50610abd612206565b604051610aca91906136b5565b60405180910390f35b348015610adf57600080fd5b50610afa6004803603810190610af59190613444565b61220c565b604051610b079190613eaf565b60405180910390f35b348015610b1c57600080fd5b50610b25612276565b005b348015610b3357600080fd5b50610b3c6122aa565b604051610b4991906136b5565b60405180910390f35b348015610b5e57600080fd5b50610b796004803603810190610b749190613444565b6122b0565b604051610b86919061350a565b60405180910390f35b348015610b9b57600080fd5b50610ba4612357565b604051610bb191906136b5565b60405180910390f35b348015610bc657600080fd5b50610be16004803603810190610bdc9190613444565b61235d565b005b348015610bef57600080fd5b50610c0a6004803603810190610c059190613eca565b61236f565b604051610c1791906133f3565b60405180910390f35b348015610c2c57600080fd5b50610c476004803603810190610c429190613a82565b612403565b005b348015610c5557600080fd5b50610c706004803603810190610c6b9190613444565b612487565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ccd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cfd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610d0c612499565b60003373ffffffffffffffffffffffffffffffffffffffff1682604051610d3290613f3b565b60006040518083038185875af1925050503d8060008114610d6f576040519150601f19603f3d011682016040523d82523d6000602084013e610d74565b606091505b5050905080610d8257600080fd5b5050565b606060028054610d9590613f7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc190613f7f565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b5050505050905090565b6000610e2382612517565b610e59576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ea282611a9c565b90508073ffffffffffffffffffffffffffffffffffffffff16610ec3612576565b73ffffffffffffffffffffffffffffffffffffffff1614610f2657610eef81610eea612576565b61236f565b610f25576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601360009054906101000a900460ff1681565b610ff6612499565b80600e8190555050565b600080336040516020016110149190613ff9565b60405160208183030381529060405280519060200120905061107a848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506012548361257e565b6110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b090614060565b60405180910390fd5b600191505092915050565b600e5481565b60006110d4612595565b6001546000540303905090565b601360019054906101000a900460ff1681565b6110fc612499565b80600f8190555050565b61110e612499565b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b60006111458261259a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111ac576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806111b884612668565b915091506111ce81876111c9612576565b61268f565b61121a576111e3866111de612576565b61236f565b611219576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611281576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61128e86868660016126d3565b801561129957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611367856113438888876126d9565b7c020000000000000000000000000000000000000000000000000000000017612701565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156113ef5760006001850190506000600460008381526020019081526020016000205414156113ed5760005481146113ec578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611457868686600161272c565b505050505050565b600c5481565b60006011549050601360019054906101000a900460ff166114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b2906140cc565b60405180910390fd5b600082116114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f590614138565b60405180910390fd5b600d54821115611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a906141a4565b60405180910390fd5b600e548261155033612732565b61155a91906141f3565b111561159b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159290614295565b60405180910390fd5b600b54826115a7612789565b6115b191906141f3565b11156115f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e990614301565b60405180910390fd5b6115fc8484611000565b61163b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116329061436d565b60405180910390fd5b600c5482611647612789565b61165191906141f3565b111580156116745750600f548261166733612732565b61167191906141f3565b11155b1561167e57600090505b818161168a919061438d565b3410156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c390614433565b60405180910390fd5b6116d6338361279c565b50505050565b601360009054906101000a900460ff1661172b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117229061449f565b60405180910390fd5b6000811161176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590614138565b60405180910390fd5b600d548111156117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa906141a4565b60405180910390fd5b600e54816117c033612732565b6117ca91906141f3565b111561180b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180290614295565b60405180910390fd5b600a5481611817612789565b61182191906141f3565b1115611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118599061450b565b60405180910390fd5b80601054611870919061438d565b3410156118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a990614433565b60405180910390fd5b6118bc338261279c565b50565b60125481565b6118cd612499565b600a54816118d9612789565b6118e391906141f3565b11156118ee57600080fd5b6118f8338261279c565b50565b611903612499565b80600d8190555050565b611915612499565b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611972573d6000803e3d6000fd5b50565b6119908383836040518060200160405280600081525061218d565b505050565b6119a08160016127ba565b50565b6119ab612499565b80600b8190555050565b600b5481565b6119c3612499565b8181600991906119d492919061324d565b505050565b6060600083839050905060008167ffffffffffffffff8111156119ff576119fe613cac565b5b604051908082528060200260200182016040528015611a3857816020015b611a256132d3565b815260200190600190039081611a1d5790505b50905060005b828114611a9057611a67868683818110611a5b57611a5a61452b565b5b9050602002013561220c565b828281518110611a7a57611a7961452b565b5b6020026020010181905250806001019050611a3e565b50809250505092915050565b6000611aa78261259a565b9050919050565b611ab6612499565b80600a8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b28576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b81612499565b611b8b6000612a0e565b565b611b95612499565b8060128190555050565b60606000806000611baf85611ac0565b905060008167ffffffffffffffff811115611bcd57611bcc613cac565b5b604051908082528060200260200182016040528015611bfb5781602001602082028036833780820191505090505b509050611c066132d3565b6000611c10612595565b90505b838614611cdb57611c2381612ad4565b9150816040015115611c3457611cd0565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611c7457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611ccf5780838780600101985081518110611cc257611cc161452b565b5b6020026020010181815250505b5b806001019050611c13565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d1b612499565b8060118190555050565b611d2d612499565b611d3681612517565b611d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6c906145a6565b60405180910390fd5b611d7e81612aff565b50565b606060038054611d9090613f7f565b80601f0160208091040260200160405190810160405280929190818152602001828054611dbc90613f7f565b8015611e095780601f10611dde57610100808354040283529160200191611e09565b820191906000526020600020905b815481529060010190602001808311611dec57829003601f168201915b5050505050905090565b6060818310611e4e576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611e59612b0d565b9050611e63612595565b851015611e7557611e72612595565b94505b80841115611e81578093505b6000611e8c87611ac0565b905084861015611eaf576000868603905081811015611ea9578091505b50611eb4565b600090505b60008167ffffffffffffffff811115611ed057611ecf613cac565b5b604051908082528060200260200182016040528015611efe5781602001602082028036833780820191505090505b5090506000821415611f165780945050505050612020565b6000611f218861220c565b905060008160400151611f3657816000015190505b60008990505b888114158015611f4c5750848714155b1561201257611f5a81612ad4565b9250826040015115611f6b57612007565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611fab57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120065780848880600101995081518110611ff957611ff861452b565b5b6020026020010181815250505b5b806001019050611f3c565b508583528296505050505050505b9392505050565b8060076000612034612576565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120e1612576565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161212691906133f3565b60405180910390a35050565b600061213c612789565b905090565b600f5481565b61214f612499565b600a548161215b612789565b61216591906141f3565b111561217057600080fd5b61217a828261279c565b5050565b6000612188612b16565b905090565b61219884848461113a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121fa576121c384848484612b20565b6121f9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b600d5481565b6122146132d3565b61221c6132d3565b612224612595565b8310806122385750612234612b0d565b8310155b156122465780915050612271565b61224f83612ad4565b90508060400151156122645780915050612271565b61226d83612c71565b9150505b919050565b61227e612499565b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b60115481565b60606122bb82612517565b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190614638565b60405180910390fd5b6000612304612c91565b90506000815111612324576040518060200160405280600081525061234f565b8061232e84612d23565b60405160200161233f9291906146e0565b6040516020818303038152906040525b915050919050565b600a5481565b612365612499565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61240b612499565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290614781565b60405180910390fd5b61248481612a0e565b50565b61248f612499565b80600c8190555050565b6124a1612e84565b73ffffffffffffffffffffffffffffffffffffffff166124bf611ce9565b73ffffffffffffffffffffffffffffffffffffffff1614612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c906147ed565b60405180910390fd5b565b600081612522612595565b11158015612531575060005482105b801561256f575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008261258b8584612e8c565b1490509392505050565b600090565b600080829050806125a9612595565b11612631576000548110156126305760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561262e575b60008114156126245760046000836001900393508381526020019081526020016000205490506125f9565b8092505050612663565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86126f0868684612ee2565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000612793612595565b60005403905090565b6127b6828260405180602001604052806000815250612eeb565b5050565b60006127c58361259a565b905060008190506000806127d886612668565b915091508415612841576127f481846127ef612576565b61268f565b6128405761280983612804612576565b61236f565b61283f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61284f8360008860016126d3565b801561285a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612902836128bf856000886126d9565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612701565b600460008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516141561298a576000600187019050600060046000838152602001908152602001600020541415612988576000548114612987578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129f483600088600161272c565b600160008154809291906001019190505550505050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612adc6132d3565b612af86004600084815260200190815260200160002054612f88565b9050919050565b612b0a8160006127ba565b50565b60008054905090565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b46612576565b8786866040518563ffffffff1660e01b8152600401612b689493929190614862565b6020604051808303816000875af1925050508015612ba457506040513d601f19601f82011682018060405250810190612ba191906148c3565b60015b612c1e573d8060008114612bd4576040519150601f19603f3d011682016040523d82523d6000602084013e612bd9565b606091505b50600081511415612c16576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612c796132d3565b612c8a612c858361259a565b612f88565b9050919050565b606060098054612ca090613f7f565b80601f0160208091040260200160405190810160405280929190818152602001828054612ccc90613f7f565b8015612d195780601f10612cee57610100808354040283529160200191612d19565b820191906000526020600020905b815481529060010190602001808311612cfc57829003601f168201915b5050505050905090565b60606000821415612d6b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e7f565b600082905060005b60008214612d9d578080612d86906148f0565b915050600a82612d969190614968565b9150612d73565b60008167ffffffffffffffff811115612db957612db8613cac565b5b6040519080825280601f01601f191660200182016040528015612deb5781602001600182028036833780820191505090505b5090505b60008514612e7857600182612e049190614999565b9150600a85612e1391906149cd565b6030612e1f91906141f3565b60f81b818381518110612e3557612e3461452b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e719190614968565b9450612def565b8093505050505b919050565b600033905090565b60008082905060005b8451811015612ed757612ec282868381518110612eb557612eb461452b565b5b602002602001015161303e565b91508080612ecf906148f0565b915050612e95565b508091505092915050565b60009392505050565b612ef58383613069565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f8357600080549050600083820390505b612f356000868380600101945086612b20565b612f6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f22578160005414612f8057600080fd5b50505b505050565b612f906132d3565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b6000818310613056576130518284613226565b613061565b6130608383613226565b5b905092915050565b60008054905060008214156130aa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130b760008483856126d3565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061312e8361311f60008660006126d9565b6131288561323d565b17612701565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146131cf57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613194565b50600082141561320b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613221600084838561272c565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b82805461325990613f7f565b90600052602060002090601f01602090048101928261327b57600085556132c2565b82601f1061329457803560ff19168380011785556132c2565b828001600101855582156132c2579182015b828111156132c15782358255916020019190600101906132a6565b5b5090506132cf9190613322565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b8082111561333b576000816000905550600101613323565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61338881613353565b811461339357600080fd5b50565b6000813590506133a58161337f565b92915050565b6000602082840312156133c1576133c0613349565b5b60006133cf84828501613396565b91505092915050565b60008115159050919050565b6133ed816133d8565b82525050565b600060208201905061340860008301846133e4565b92915050565b6000819050919050565b6134218161340e565b811461342c57600080fd5b50565b60008135905061343e81613418565b92915050565b60006020828403121561345a57613459613349565b5b60006134688482850161342f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156134ab578082015181840152602081019050613490565b838111156134ba576000848401525b50505050565b6000601f19601f8301169050919050565b60006134dc82613471565b6134e6818561347c565b93506134f681856020860161348d565b6134ff816134c0565b840191505092915050565b6000602082019050818103600083015261352481846134d1565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135578261352c565b9050919050565b6135678161354c565b82525050565b6000602082019050613582600083018461355e565b92915050565b6135918161354c565b811461359c57600080fd5b50565b6000813590506135ae81613588565b92915050565b600080604083850312156135cb576135ca613349565b5b60006135d98582860161359f565b92505060206135ea8582860161342f565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112613619576136186135f4565b5b8235905067ffffffffffffffff811115613636576136356135f9565b5b602083019150836020820283011115613652576136516135fe565b5b9250929050565b600080602083850312156136705761366f613349565b5b600083013567ffffffffffffffff81111561368e5761368d61334e565b5b61369a85828601613603565b92509250509250929050565b6136af8161340e565b82525050565b60006020820190506136ca60008301846136a6565b92915050565b6000806000606084860312156136e9576136e8613349565b5b60006136f78682870161359f565b93505060206137088682870161359f565b92505060406137198682870161342f565b9150509250925092565b60008060006040848603121561373c5761373b613349565b5b600084013567ffffffffffffffff81111561375a5761375961334e565b5b61376686828701613603565b935093505060206137798682870161342f565b9150509250925092565b6000819050919050565b61379681613783565b82525050565b60006020820190506137b1600083018461378d565b92915050565b60008083601f8401126137cd576137cc6135f4565b5b8235905067ffffffffffffffff8111156137ea576137e96135f9565b5b602083019150836001820283011115613806576138056135fe565b5b9250929050565b6000806020838503121561382457613823613349565b5b600083013567ffffffffffffffff8111156138425761384161334e565b5b61384e858286016137b7565b92509250509250929050565b60008083601f8401126138705761386f6135f4565b5b8235905067ffffffffffffffff81111561388d5761388c6135f9565b5b6020830191508360208202830111156138a9576138a86135fe565b5b9250929050565b600080602083850312156138c7576138c6613349565b5b600083013567ffffffffffffffff8111156138e5576138e461334e565b5b6138f18582860161385a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6139328161354c565b82525050565b600067ffffffffffffffff82169050919050565b61395581613938565b82525050565b613964816133d8565b82525050565b600062ffffff82169050919050565b6139828161396a565b82525050565b60808201600082015161399e6000850182613929565b5060208201516139b1602085018261394c565b5060408201516139c4604085018261395b565b5060608201516139d76060850182613979565b50505050565b60006139e98383613988565b60808301905092915050565b6000602082019050919050565b6000613a0d826138fd565b613a178185613908565b9350613a2283613919565b8060005b83811015613a53578151613a3a88826139dd565b9750613a45836139f5565b925050600181019050613a26565b5085935050505092915050565b60006020820190508181036000830152613a7a8184613a02565b905092915050565b600060208284031215613a9857613a97613349565b5b6000613aa68482850161359f565b91505092915050565b613ab881613783565b8114613ac357600080fd5b50565b600081359050613ad581613aaf565b92915050565b600060208284031215613af157613af0613349565b5b6000613aff84828501613ac6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b3d8161340e565b82525050565b6000613b4f8383613b34565b60208301905092915050565b6000602082019050919050565b6000613b7382613b08565b613b7d8185613b13565b9350613b8883613b24565b8060005b83811015613bb9578151613ba08882613b43565b9750613bab83613b5b565b925050600181019050613b8c565b5085935050505092915050565b60006020820190508181036000830152613be08184613b68565b905092915050565b600080600060608486031215613c0157613c00613349565b5b6000613c0f8682870161359f565b9350506020613c208682870161342f565b9250506040613c318682870161342f565b9150509250925092565b613c44816133d8565b8114613c4f57600080fd5b50565b600081359050613c6181613c3b565b92915050565b60008060408385031215613c7e57613c7d613349565b5b6000613c8c8582860161359f565b9250506020613c9d85828601613c52565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ce4826134c0565b810181811067ffffffffffffffff82111715613d0357613d02613cac565b5b80604052505050565b6000613d1661333f565b9050613d228282613cdb565b919050565b600067ffffffffffffffff821115613d4257613d41613cac565b5b613d4b826134c0565b9050602081019050919050565b82818337600083830152505050565b6000613d7a613d7584613d27565b613d0c565b905082815260208101848484011115613d9657613d95613ca7565b5b613da1848285613d58565b509392505050565b600082601f830112613dbe57613dbd6135f4565b5b8135613dce848260208601613d67565b91505092915050565b60008060008060808587031215613df157613df0613349565b5b6000613dff8782880161359f565b9450506020613e108782880161359f565b9350506040613e218782880161342f565b925050606085013567ffffffffffffffff811115613e4257613e4161334e565b5b613e4e87828801613da9565b91505092959194509250565b608082016000820151613e706000850182613929565b506020820151613e83602085018261394c565b506040820151613e96604085018261395b565b506060820151613ea96060850182613979565b50505050565b6000608082019050613ec46000830184613e5a565b92915050565b60008060408385031215613ee157613ee0613349565b5b6000613eef8582860161359f565b9250506020613f008582860161359f565b9150509250929050565b600081905092915050565b50565b6000613f25600083613f0a565b9150613f3082613f15565b600082019050919050565b6000613f4682613f18565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613f9757607f821691505b60208210811415613fab57613faa613f50565b5b50919050565b60008160601b9050919050565b6000613fc982613fb1565b9050919050565b6000613fdb82613fbe565b9050919050565b613ff3613fee8261354c565b613fd0565b82525050565b60006140058284613fe2565b60148201915081905092915050565b7f496e636f72726563742070726f6f660000000000000000000000000000000000600082015250565b600061404a600f8361347c565b915061405582614014565b602082019050919050565b600060208201905081810360008301526140798161403d565b9050919050565b7f57686974656c697374206d696e74206973206e6f742061637469766500000000600082015250565b60006140b6601c8361347c565b91506140c182614080565b602082019050919050565b600060208201905081810360008301526140e5816140a9565b9050919050565b7f496e636f7272656374205175616e746974790000000000000000000000000000600082015250565b600061412260128361347c565b915061412d826140ec565b602082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f4f76657220616d6f756e74207065722074727800000000000000000000000000600082015250565b600061418e60138361347c565b915061419982614158565b602082019050919050565b600060208201905081810360008301526141bd81614181565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006141fe8261340e565b91506142098361340e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561423e5761423d6141c4565b5b828201905092915050565b7f4e6f206d6f726520746f6b656e7320666f7220796f7500000000000000000000600082015250565b600061427f60168361347c565b915061428a82614249565b602082019050919050565b600060208201905081810360008301526142ae81614272565b9050919050565b7f52656163686564206d617820574c20737570706c790000000000000000000000600082015250565b60006142eb60158361347c565b91506142f6826142b5565b602082019050919050565b6000602082019050818103600083015261431a816142de565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614357600d8361347c565b915061436282614321565b602082019050919050565b600060208201905081810360008301526143868161434a565b9050919050565b60006143988261340e565b91506143a38361340e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143dc576143db6141c4565b5b828202905092915050565b7f4e656564206d6f726520746f6b656e7300000000000000000000000000000000600082015250565b600061441d60108361347c565b9150614428826143e7565b602082019050919050565b6000602082019050818103600083015261444c81614410565b9050919050565b7f5075626c6963206d696e74206973206e6f742061637469766500000000000000600082015250565b600061448960198361347c565b915061449482614453565b602082019050919050565b600060208201905081810360008301526144b88161447c565b9050919050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006144f560128361347c565b9150614500826144bf565b602082019050919050565b60006020820190508181036000830152614524816144e8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b600061459060148361347c565b915061459b8261455a565b602082019050919050565b600060208201905081810360008301526145bf81614583565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614622602f8361347c565b915061462d826145c6565b604082019050919050565b6000602082019050818103600083015261465181614615565b9050919050565b600081905092915050565b600061466e82613471565b6146788185614658565b935061468881856020860161348d565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006146ca600583614658565b91506146d582614694565b600582019050919050565b60006146ec8285614663565b91506146f88284614663565b9150614703826146bd565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061476b60268361347c565b91506147768261470f565b604082019050919050565b6000602082019050818103600083015261479a8161475e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147d760208361347c565b91506147e2826147a1565b602082019050919050565b60006020820190508181036000830152614806816147ca565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006148348261480d565b61483e8185614818565b935061484e81856020860161348d565b614857816134c0565b840191505092915050565b6000608082019050614877600083018761355e565b614884602083018661355e565b61489160408301856136a6565b81810360608301526148a38184614829565b905095945050505050565b6000815190506148bd8161337f565b92915050565b6000602082840312156148d9576148d8613349565b5b60006148e7848285016148ae565b91505092915050565b60006148fb8261340e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561492e5761492d6141c4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149738261340e565b915061497e8361340e565b92508261498e5761498d614939565b5b828204905092915050565b60006149a48261340e565b91506149af8361340e565b9250828210156149c2576149c16141c4565b5b828203905092915050565b60006149d88261340e565b91506149e38361340e565b9250826149f3576149f2614939565b5b82820690509291505056fea2646970667358221220f28525f547bdd74d67b22e07d76224d2a5a556ea3239748a7b2c0f5ce4cdd00d64736f6c634300080a0033
Deployed Bytecode Sourcemap
76378:5069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36208:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81027:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37110:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43601:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43034:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76901:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78820:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80533:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76699:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32861:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76929:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78929:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79319:72;;;;;;;;;;;;;:::i;:::-;;47240:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76620:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77552:824;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77010:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76867:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79513:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78711:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80902:117;;;;;;;;;;;;;:::i;:::-;;50161:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76194:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78489:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76578:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79998:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70907:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38503:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78384:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34045:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13998:103;;;;;;;;;;;;;:::i;:::-;;79399:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74783:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13350:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79139:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81201:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37286:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71823:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44159:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80805:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76737:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79691:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81357:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50952:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76775:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76661:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70320:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79236:75;;;;;;;;;;;;;:::i;:::-;;76821:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80108:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76538:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79038:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44550:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14256:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78602:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36208:639;36293:4;36632:10;36617:25;;:11;:25;;;;:102;;;;36709:10;36694:25;;:11;:25;;;;36617:102;:179;;;;36786:10;36771:25;;:11;:25;;;;36617:179;36597:199;;36208:639;;;:::o;81027:165::-;13236:13;:11;:13::i;:::-;81095:12:::1;81121:10;81113:24;;81145:7;81113:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81094:63;;;81176:7;81168:16;;;::::0;::::1;;81084:108;81027:165:::0;:::o;37110:100::-;37164:13;37197:5;37190:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37110:100;:::o;43601:218::-;43677:7;43702:16;43710:7;43702;:16::i;:::-;43697:64;;43727:34;;;;;;;;;;;;;;43697:64;43781:15;:24;43797:7;43781:24;;;;;;;;;;;:30;;;;;;;;;;;;43774:37;;43601:218;;;:::o;43034:408::-;43123:13;43139:16;43147:7;43139;:16::i;:::-;43123:32;;43195:5;43172:28;;:19;:17;:19::i;:::-;:28;;;43168:175;;43220:44;43237:5;43244:19;:17;:19::i;:::-;43220:16;:44::i;:::-;43215:128;;43292:35;;;;;;;;;;;;;;43215:128;43168:175;43388:2;43355:15;:24;43371:7;43355:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43426:7;43422:2;43406:28;;43415:5;43406:28;;;;;;;;;;;;43112:330;43034:408;;:::o;76901:19::-;;;;;;;;;;;;;:::o;78820:101::-;13236:13;:11;:13::i;:::-;78902:11:::1;78889:10;:24;;;;78820:101:::0;:::o;80533:264::-;80607:4;80623:12;80665:10;80648:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;80638:39;;;;;;80623:54;;80696:50;80715:12;;80696:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80729:10;;80741:4;80696:18;:50::i;:::-;80688:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;80784:4;80777:11;;;80533:264;;;;:::o;76699:29::-;;;;:::o;32861:323::-;32922:7;33150:15;:13;:15::i;:::-;33135:12;;33119:13;;:28;:46;33112:53;;32861:323;:::o;76929:18::-;;;;;;;;;;;;;:::o;78929:101::-;13236:13;:11;:13::i;:::-;79011:11:::1;78998:10;:24;;;;78929:101:::0;:::o;79319:72::-;13236:13;:11;:13::i;:::-;79376:6:::1;;;;;;;;;;;79375:7;79366:6;;:16;;;;;;;;;;;;;;;;;;79319:72::o:0;47240:2825::-;47382:27;47412;47431:7;47412:18;:27::i;:::-;47382:57;;47497:4;47456:45;;47472:19;47456:45;;;47452:86;;47510:28;;;;;;;;;;;;;;47452:86;47552:27;47581:23;47608:35;47635:7;47608:26;:35::i;:::-;47551:92;;;;47743:68;47768:15;47785:4;47791:19;:17;:19::i;:::-;47743:24;:68::i;:::-;47738:180;;47831:43;47848:4;47854:19;:17;:19::i;:::-;47831:16;:43::i;:::-;47826:92;;47883:35;;;;;;;;;;;;;;47826:92;47738:180;47949:1;47935:16;;:2;:16;;;47931:52;;;47960:23;;;;;;;;;;;;;;47931:52;47996:43;48018:4;48024:2;48028:7;48037:1;47996:21;:43::i;:::-;48132:15;48129:160;;;48272:1;48251:19;48244:30;48129:160;48669:18;:24;48688:4;48669:24;;;;;;;;;;;;;;;;48667:26;;;;;;;;;;;;48738:18;:22;48757:2;48738:22;;;;;;;;;;;;;;;;48736:24;;;;;;;;;;;49060:146;49097:2;49146:45;49161:4;49167:2;49171:19;49146:14;:45::i;:::-;29260:8;49118:73;49060:18;:146::i;:::-;49031:17;:26;49049:7;49031:26;;;;;;;;;;;:175;;;;49377:1;29260:8;49326:19;:47;:52;49322:627;;;49399:19;49431:1;49421:7;:11;49399:33;;49588:1;49554:17;:30;49572:11;49554:30;;;;;;;;;;;;:35;49550:384;;;49692:13;;49677:11;:28;49673:242;;49872:19;49839:17;:30;49857:11;49839:30;;;;;;;;;;;:52;;;;49673:242;49550:384;49380:569;49322:627;49996:7;49992:2;49977:27;;49986:4;49977:27;;;;;;;;;;;;50015:42;50036:4;50042:2;50046:7;50055:1;50015:20;:42::i;:::-;47371:2694;;;47240:2825;;;:::o;76620:32::-;;;;:::o;77552:824::-;77655:13;77671:7;;77655:23;;77697:6;;;;;;;;;;;77689:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;77767:1;77755:9;:13;77747:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;77823:10;;77810:9;:23;;77802:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;77917:10;;77904:9;77876:25;77890:10;77876:13;:25::i;:::-;:37;;;;:::i;:::-;:51;;77868:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;78002:11;;77989:9;77972:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:41;;77964:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;78058:24;78069:12;;78058:10;:24::i;:::-;78050:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;78145:10;;78132:9;78115:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:40;;:95;;;;;78200:10;;78187:9;78159:25;78173:10;78159:13;:25::i;:::-;:37;;;;:::i;:::-;:51;;78115:95;78112:136;;;78235:1;78224:12;;78112:136;78290:9;78279:8;:20;;;;:::i;:::-;78266:9;:33;;78258:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;78336:32;78346:10;78358:9;78336;:32::i;:::-;77644:732;77552:824;;;:::o;77010:534::-;77085:7;;;;;;;;;;;77077:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;77153:1;77141:9;:13;77133:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;77209:10;;77196:9;:23;;77188:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;77303:10;;77290:9;77262:25;77276:10;77262:13;:25::i;:::-;:37;;;;:::i;:::-;:51;;77254:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;77388:9;;77375;77358:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:39;;77350:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;77463:9;77452:8;;:20;;;;:::i;:::-;77439:9;:33;;77431:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;77504:32;77514:10;77526:9;77504;:32::i;:::-;77010:534;:::o;76867:25::-;;;;:::o;79513:170::-;13236:13;:11;:13::i;:::-;79623:9:::1;;79611:8;79594:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:38;;79586:47;;;::::0;::::1;;79644:31;79654:10;79666:8;79644:9;:31::i;:::-;79513:170:::0;:::o;78711:101::-;13236:13;:11;:13::i;:::-;78793:11:::1;78780:10;:24;;;;78711:101:::0;:::o;80902:117::-;13236:13;:11;:13::i;:::-;80956:10:::1;80948:28;;:60;80993:4;80977:30;;;80948:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;80902:117::o:0;50161:193::-;50307:39;50324:4;50330:2;50334:7;50307:39;;;;;;;;;;;;:16;:39::i;:::-;50161:193;;;:::o;76194:94::-;76260:20;76266:7;76275:4;76260:5;:20::i;:::-;76194:94;:::o;78489:105::-;13236:13;:11;:13::i;:::-;78574:12:::1;78560:11;:26;;;;78489:105:::0;:::o;76578:33::-;;;;:::o;79998:102::-;13236:13;:11;:13::i;:::-;80085:7:::1;;80069:13;:23;;;;;;;:::i;:::-;;79998:102:::0;;:::o;70907:528::-;71051:23;71117:22;71142:8;;:15;;71117:40;;71172:34;71230:14;71209:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;71172:73;;71265:9;71260:125;71281:14;71276:1;:19;71260:125;;71337:32;71357:8;;71366:1;71357:11;;;;;;;:::i;:::-;;;;;;;;71337:19;:32::i;:::-;71321:10;71332:1;71321:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;71297:3;;;;;71260:125;;;;71406:10;71399:17;;;;70907:528;;;;:::o;38503:152::-;38575:7;38618:27;38637:7;38618:18;:27::i;:::-;38595:52;;38503:152;;;:::o;78384:97::-;13236:13;:11;:13::i;:::-;78463:10:::1;78451:9;:22;;;;78384:97:::0;:::o;34045:233::-;34117:7;34158:1;34141:19;;:5;:19;;;34137:60;;;34169:28;;;;;;;;;;;;;;34137:60;28204:13;34215:18;:25;34234:5;34215:25;;;;;;;;;;;;;;;;:55;34208:62;;34045:233;;;:::o;13998:103::-;13236:13;:11;:13::i;:::-;14063:30:::1;14090:1;14063:18;:30::i;:::-;13998:103::o:0;79399:106::-;13236:13;:11;:13::i;:::-;79486:11:::1;79473:10;:24;;;;79399:106:::0;:::o;74783:900::-;74861:16;74915:19;74949:25;74989:22;75014:16;75024:5;75014:9;:16::i;:::-;74989:41;;75045:25;75087:14;75073:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75045:57;;75117:31;;:::i;:::-;75168:9;75180:15;:13;:15::i;:::-;75168:27;;75163:472;75212:14;75197:11;:29;75163:472;;75264:15;75277:1;75264:12;:15::i;:::-;75252:27;;75302:9;:16;;;75298:73;;;75343:8;;75298:73;75419:1;75393:28;;:9;:14;;;:28;;;75389:111;;75466:9;:14;;;75446:34;;75389:111;75543:5;75522:26;;:17;:26;;;75518:102;;;75599:1;75573:8;75582:13;;;;;;75573:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;75518:102;75163:472;75228:3;;;;;75163:472;;;;75656:8;75649:15;;;;;;;74783:900;;;:::o;13350:87::-;13396:7;13423:6;;;;;;;;;;;13416:13;;13350:87;:::o;79139:89::-;13236:13;:11;:13::i;:::-;79212:8:::1;79202:7;:18;;;;79139:89:::0;:::o;81201:148::-;13236:13;:11;:13::i;:::-;81275:16:::1;81283:7;81275;:16::i;:::-;81267:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;81327:14;81333:7;81327:5;:14::i;:::-;81201:148:::0;:::o;37286:104::-;37342:13;37375:7;37368:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37286:104;:::o;71823:2513::-;71966:16;72033:4;72024:5;:13;72020:45;;72046:19;;;;;;;;;;;;;;72020:45;72080:19;72114:17;72134:14;:12;:14::i;:::-;72114:34;;72234:15;:13;:15::i;:::-;72226:5;:23;72222:87;;;72278:15;:13;:15::i;:::-;72270:23;;72222:87;72385:9;72378:4;:16;72374:73;;;72422:9;72415:16;;72374:73;72461:25;72489:16;72499:5;72489:9;:16::i;:::-;72461:44;;72683:4;72675:5;:12;72671:278;;;72708:19;72737:5;72730:4;:12;72708:34;;72779:17;72765:11;:31;72761:111;;;72841:11;72821:31;;72761:111;72689:198;72671:278;;;72932:1;72912:21;;72671:278;72963:25;73005:17;72991:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72963:60;;73063:1;73042:17;:22;73038:78;;;73092:8;73085:15;;;;;;;;73038:78;73260:31;73294:26;73314:5;73294:19;:26::i;:::-;73260:60;;73335:25;73580:9;:16;;;73575:92;;73637:9;:14;;;73617:34;;73575:92;73686:9;73698:5;73686:17;;73681:478;73710:4;73705:1;:9;;:45;;;;;73733:17;73718:11;:32;;73705:45;73681:478;;;73788:15;73801:1;73788:12;:15::i;:::-;73776:27;;73826:9;:16;;;73822:73;;;73867:8;;73822:73;73943:1;73917:28;;:9;:14;;;:28;;;73913:111;;73990:9;:14;;;73970:34;;73913:111;74067:5;74046:26;;:17;:26;;;74042:102;;;74123:1;74097:8;74106:13;;;;;;74097:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;74042:102;73681:478;73752:3;;;;;73681:478;;;;74261:11;74251:8;74244:29;74309:8;74302:15;;;;;;;;71823:2513;;;;;;:::o;44159:234::-;44306:8;44254:18;:39;44273:19;:17;:19::i;:::-;44254:39;;;;;;;;;;;;;;;:49;44294:8;44254:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;44366:8;44330:55;;44345:19;:17;:19::i;:::-;44330:55;;;44376:8;44330:55;;;;;;:::i;:::-;;;;;;;;44159:234;;:::o;80805:89::-;80848:7;80872:14;:12;:14::i;:::-;80865:21;;80805:89;:::o;76737:29::-;;;;:::o;79691:175::-;13236:13;:11;:13::i;:::-;79813:9:::1;;79800;79783:14;:12;:14::i;:::-;:26;;;;:::i;:::-;:39;;79775:48;;;::::0;::::1;;79834:24;79844:2;79848:9;79834;:24::i;:::-;79691:175:::0;;:::o;81357:87::-;81398:7;81422:14;:12;:14::i;:::-;81415:21;;81357:87;:::o;50952:407::-;51127:31;51140:4;51146:2;51150:7;51127:12;:31::i;:::-;51191:1;51173:2;:14;;;:19;51169:183;;51212:56;51243:4;51249:2;51253:7;51262:5;51212:30;:56::i;:::-;51207:145;;51296:40;;;;;;;;;;;;;;51207:145;51169:183;50952:407;;;;:::o;76775:37::-;;;;:::o;76661:29::-;;;;:::o;70320:428::-;70404:21;;:::i;:::-;70438:31;;:::i;:::-;70494:15;:13;:15::i;:::-;70484:7;:25;:54;;;;70524:14;:12;:14::i;:::-;70513:7;:25;;70484:54;70480:103;;;70562:9;70555:16;;;;;70480:103;70605:21;70618:7;70605:12;:21::i;:::-;70593:33;;70641:9;:16;;;70637:65;;;70681:9;70674:16;;;;;70637:65;70719:21;70732:7;70719:12;:21::i;:::-;70712:28;;;70320:428;;;;:::o;79236:75::-;13236:13;:11;:13::i;:::-;79295:7:::1;;;;;;;;;;;79294:8;79284:7;;:18;;;;;;;;;;;;;;;;;;79236:75::o:0;76821:37::-;;;;:::o;80108:417::-;80216:13;80253:16;80261:7;80253;:16::i;:::-;80245:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;80329:28;80360:10;:8;:10::i;:::-;80329:41;;80417:1;80392:14;80386:28;:32;:131;;;;;;;;;;;;;;;;;80456:14;80472:18;:7;:16;:18::i;:::-;80439:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80386:131;80379:138;;;80108:417;;;:::o;76538:31::-;;;;:::o;79038:93::-;13236:13;:11;:13::i;:::-;79114:9:::1;79103:8;:20;;;;79038:93:::0;:::o;44550:164::-;44647:4;44671:18;:25;44690:5;44671:25;;;;;;;;;;;;;;;:35;44697:8;44671:35;;;;;;;;;;;;;;;;;;;;;;;;;44664:42;;44550:164;;;;:::o;14256:201::-;13236:13;:11;:13::i;:::-;14365:1:::1;14345:22;;:8;:22;;;;14337:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14421:28;14440:8;14421:18;:28::i;:::-;14256:201:::0;:::o;78602:101::-;13236:13;:11;:13::i;:::-;78684:11:::1;78671:10;:24;;;;78602:101:::0;:::o;13515:132::-;13590:12;:10;:12::i;:::-;13579:23;;:7;:5;:7::i;:::-;:23;;;13571:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13515:132::o;44972:282::-;45037:4;45093:7;45074:15;:13;:15::i;:::-;:26;;:66;;;;;45127:13;;45117:7;:23;45074:66;:153;;;;;45226:1;28980:8;45178:17;:26;45196:7;45178:26;;;;;;;;;;;;:44;:49;45074:153;45054:173;;44972:282;;;:::o;67280:105::-;67340:7;67367:10;67360:17;;67280:105;:::o;1219:190::-;1344:4;1397;1368:25;1381:5;1388:4;1368:12;:25::i;:::-;:33;1361:40;;1219:190;;;;;:::o;32377:92::-;32433:7;32377:92;:::o;39658:1275::-;39725:7;39745:12;39760:7;39745:22;;39828:4;39809:15;:13;:15::i;:::-;:23;39805:1061;;39862:13;;39855:4;:20;39851:1015;;;39900:14;39917:17;:23;39935:4;39917:23;;;;;;;;;;;;39900:40;;40034:1;28980:8;40006:6;:24;:29;40002:845;;;40671:113;40688:1;40678:6;:11;40671:113;;;40731:17;:25;40749:6;;;;;;;40731:25;;;;;;;;;;;;40722:34;;40671:113;;;40817:6;40810:13;;;;;;40002:845;39877:989;39851:1015;39805:1061;40894:31;;;;;;;;;;;;;;39658:1275;;;;:::o;46135:485::-;46237:27;46266:23;46307:38;46348:15;:24;46364:7;46348:24;;;;;;;;;;;46307:65;;46525:18;46502:41;;46582:19;46576:26;46557:45;;46487:126;46135:485;;;:::o;45363:659::-;45512:11;45677:16;45670:5;45666:28;45657:37;;45837:16;45826:9;45822:32;45809:45;;45987:15;45976:9;45973:30;45965:5;45954:9;45951:20;45948:56;45938:66;;45363:659;;;;;:::o;52021:159::-;;;;;:::o;66589:311::-;66724:7;66744:16;29384:3;66770:19;:41;;66744:68;;29384:3;66838:31;66849:4;66855:2;66859:9;66838:10;:31::i;:::-;66830:40;;:62;;66823:69;;;66589:311;;;;;:::o;41481:450::-;41561:14;41729:16;41722:5;41718:28;41709:37;;41906:5;41892:11;41867:23;41863:41;41860:52;41853:5;41850:63;41840:73;;41481:450;;;;:::o;52845:158::-;;;;;:::o;34360:178::-;34421:7;28204:13;28342:2;34449:18;:25;34468:5;34449:25;;;;;;;;;;;;;;;;:50;;34448:82;34441:89;;34360:178;;;:::o;33282:296::-;33337:7;33544:15;:13;:15::i;:::-;33528:13;;:31;33521:38;;33282:296;:::o;61112:112::-;61189:27;61199:2;61203:8;61189:27;;;;;;;;;;;;:9;:27::i;:::-;61112:112;;:::o;61809:3081::-;61889:27;61919;61938:7;61919:18;:27::i;:::-;61889:57;;61959:12;61990:19;61959:52;;62025:27;62054:23;62081:35;62108:7;62081:26;:35::i;:::-;62024:92;;;;62133:13;62129:316;;;62254:68;62279:15;62296:4;62302:19;:17;:19::i;:::-;62254:24;:68::i;:::-;62249:184;;62346:43;62363:4;62369:19;:17;:19::i;:::-;62346:16;:43::i;:::-;62341:92;;62398:35;;;;;;;;;;;;;;62341:92;62249:184;62129:316;62457:51;62479:4;62493:1;62497:7;62506:1;62457:21;:51::i;:::-;62601:15;62598:160;;;62741:1;62720:19;62713:30;62598:160;63419:1;28469:3;63389:1;:26;;63388:32;63360:18;:24;63379:4;63360:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;63687:176;63724:4;63795:53;63810:4;63824:1;63828:19;63795:14;:53::i;:::-;29260:8;28980;63748:43;63747:101;63687:18;:176::i;:::-;63658:17;:26;63676:7;63658:26;;;;;;;;;;;:205;;;;64034:1;29260:8;63983:19;:47;:52;63979:627;;;64056:19;64088:1;64078:7;:11;64056:33;;64245:1;64211:17;:30;64229:11;64211:30;;;;;;;;;;;;:35;64207:384;;;64349:13;;64334:11;:28;64330:242;;64529:19;64496:17;:30;64514:11;64496:30;;;;;;;;;;;:52;;;;64330:242;64207:384;64037:569;63979:627;64661:7;64657:1;64634:35;;64643:4;64634:35;;;;;;;;;;;;64680:50;64701:4;64715:1;64719:7;64728:1;64680:20;:50::i;:::-;64857:12;;:14;;;;;;;;;;;;;61878:3012;;;;61809:3081;;:::o;14617:191::-;14691:16;14710:6;;;;;;;;;;;14691:25;;14736:8;14727:6;;:17;;;;;;;;;;;;;;;;;;14791:8;14760:40;;14781:8;14760:40;;;;;;;;;;;;14680:128;14617:191;:::o;39106:161::-;39174:21;;:::i;:::-;39215:44;39234:17;:24;39252:5;39234:24;;;;;;;;;;;;39215:18;:44::i;:::-;39208:51;;39106:161;;;:::o;61491:89::-;61551:21;61557:7;61566:5;61551;:21::i;:::-;61491:89;:::o;32548:103::-;32603:7;32630:13;;32623:20;;32548:103;:::o;33660:102::-;33715:7;33742:12;;33735:19;;33660:102;:::o;53443:716::-;53606:4;53652:2;53627:45;;;53673:19;:17;:19::i;:::-;53694:4;53700:7;53709:5;53627:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53623:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53927:1;53910:6;:13;:18;53906:235;;;53956:40;;;;;;;;;;;;;;53906:235;54099:6;54093:13;54084:6;54080:2;54076:15;54069:38;53623:529;53796:54;;;53786:64;;;:6;:64;;;;53779:71;;;53443:716;;;;;;:::o;38844:166::-;38914:21;;:::i;:::-;38955:47;38974:27;38993:7;38974:18;:27::i;:::-;38955:18;:47::i;:::-;38948:54;;38844:166;;;:::o;79874:112::-;79934:13;79965;79958:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79874:112;:::o;9155:723::-;9211:13;9441:1;9432:5;:10;9428:53;;;9459:10;;;;;;;;;;;;;;;;;;;;;9428:53;9491:12;9506:5;9491:20;;9522:14;9547:78;9562:1;9554:4;:9;9547:78;;9580:8;;;;;:::i;:::-;;;;9611:2;9603:10;;;;;:::i;:::-;;;9547:78;;;9635:19;9667:6;9657:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9635:39;;9685:154;9701:1;9692:5;:10;9685:154;;9729:1;9719:11;;;;;:::i;:::-;;;9796:2;9788:5;:10;;;;:::i;:::-;9775:2;:24;;;;:::i;:::-;9762:39;;9745:6;9752;9745:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9825:2;9816:11;;;;;:::i;:::-;;;9685:154;;;9863:6;9849:21;;;;;9155:723;;;;:::o;11901:98::-;11954:7;11981:10;11974:17;;11901:98;:::o;2086:296::-;2169:7;2189:20;2212:4;2189:27;;2232:9;2227:118;2251:5;:12;2247:1;:16;2227:118;;;2300:33;2310:12;2324:5;2330:1;2324:8;;;;;;;;:::i;:::-;;;;;;;;2300:9;:33::i;:::-;2285:48;;2265:3;;;;;:::i;:::-;;;;2227:118;;;;2362:12;2355:19;;;2086:296;;;;:::o;66290:147::-;66427:6;66290:147;;;;;:::o;60339:689::-;60470:19;60476:2;60480:8;60470:5;:19::i;:::-;60549:1;60531:2;:14;;;:19;60527:483;;60571:11;60585:13;;60571:27;;60617:13;60639:8;60633:3;:14;60617:30;;60666:233;60697:62;60736:1;60740:2;60744:7;;;;;;60753:5;60697:30;:62::i;:::-;60692:167;;60795:40;;;;;;;;;;;;;;60692:167;60894:3;60886:5;:11;60666:233;;60981:3;60964:13;;:20;60960:34;;60986:8;;;60960:34;60552:458;;60527:483;60339:689;;;:::o;41032:366::-;41098:31;;:::i;:::-;41175:6;41142:9;:14;;:41;;;;;;;;;;;28863:3;41228:6;:33;;41194:9;:24;;:68;;;;;;;;;;;41320:1;28980:8;41292:6;:24;:29;;41273:9;:16;;:48;;;;;;;;;;;29384:3;41361:6;:28;;41332:9;:19;;:58;;;;;;;;;;;41032:366;;;:::o;8293:149::-;8356:7;8387:1;8383;:5;:51;;8414:20;8429:1;8432;8414:14;:20::i;:::-;8383:51;;;8391:20;8406:1;8409;8391:14;:20::i;:::-;8383:51;8376:58;;8293:149;;;;:::o;54621:2966::-;54694:20;54717:13;;54694:36;;54757:1;54745:8;:13;54741:44;;;54767:18;;;;;;;;;;;;;;54741:44;54798:61;54828:1;54832:2;54836:12;54850:8;54798:21;:61::i;:::-;55342:1;28342:2;55312:1;:26;;55311:32;55299:8;:45;55273:18;:22;55292:2;55273:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;55621:139;55658:2;55712:33;55735:1;55739:2;55743:1;55712:14;:33::i;:::-;55679:30;55700:8;55679:20;:30::i;:::-;:66;55621:18;:139::i;:::-;55587:17;:31;55605:12;55587:31;;;;;;;;;;;:173;;;;55777:16;55808:11;55837:8;55822:12;:23;55808:37;;56358:16;56354:2;56350:25;56338:37;;56730:12;56690:8;56649:1;56587:25;56528:1;56467;56440:335;57101:1;57087:12;57083:20;57041:346;57142:3;57133:7;57130:16;57041:346;;57360:7;57350:8;57347:1;57320:25;57317:1;57314;57309:59;57195:1;57186:7;57182:15;57171:26;;57041:346;;;57045:77;57432:1;57420:8;:13;57416:45;;;57442:19;;;;;;;;;;;;;;57416:45;57494:3;57478:13;:19;;;;55047:2462;;57519:60;57548:1;57552:2;57556:12;57570:8;57519:20;:60::i;:::-;54683:2904;54621:2966;;:::o;8450:268::-;8518:13;8625:1;8619:4;8612:15;8654:1;8648:4;8641:15;8695:4;8689;8679:21;8670:30;;8450:268;;;;:::o;42033:324::-;42103:14;42336:1;42326:8;42323:15;42297:24;42293:46;42283:56;;42033:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:99::-;2261:6;2295:5;2289:12;2279:22;;2209:99;;;:::o;2314:169::-;2398:11;2432:6;2427:3;2420:19;2472:4;2467:3;2463:14;2448:29;;2314:169;;;;:::o;2489:307::-;2557:1;2567:113;2581:6;2578:1;2575:13;2567:113;;;2666:1;2661:3;2657:11;2651:18;2647:1;2642:3;2638:11;2631:39;2603:2;2600:1;2596:10;2591:15;;2567:113;;;2698:6;2695:1;2692:13;2689:101;;;2778:1;2769:6;2764:3;2760:16;2753:27;2689:101;2538:258;2489:307;;;:::o;2802:102::-;2843:6;2894:2;2890:7;2885:2;2878:5;2874:14;2870:28;2860:38;;2802:102;;;:::o;2910:364::-;2998:3;3026:39;3059:5;3026:39;:::i;:::-;3081:71;3145:6;3140:3;3081:71;:::i;:::-;3074:78;;3161:52;3206:6;3201:3;3194:4;3187:5;3183:16;3161:52;:::i;:::-;3238:29;3260:6;3238:29;:::i;:::-;3233:3;3229:39;3222:46;;3002:272;2910:364;;;;:::o;3280:313::-;3393:4;3431:2;3420:9;3416:18;3408:26;;3480:9;3474:4;3470:20;3466:1;3455:9;3451:17;3444:47;3508:78;3581:4;3572:6;3508:78;:::i;:::-;3500:86;;3280:313;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:117::-;5047:1;5044;5037:12;5061:117;5170:1;5167;5160:12;5184:117;5293:1;5290;5283:12;5324:568;5397:8;5407:6;5457:3;5450:4;5442:6;5438:17;5434:27;5424:122;;5465:79;;:::i;:::-;5424:122;5578:6;5565:20;5555:30;;5608:18;5600:6;5597:30;5594:117;;;5630:79;;:::i;:::-;5594:117;5744:4;5736:6;5732:17;5720:29;;5798:3;5790:4;5782:6;5778:17;5768:8;5764:32;5761:41;5758:128;;;5805:79;;:::i;:::-;5758:128;5324:568;;;;;:::o;5898:559::-;5984:6;5992;6041:2;6029:9;6020:7;6016:23;6012:32;6009:119;;;6047:79;;:::i;:::-;6009:119;6195:1;6184:9;6180:17;6167:31;6225:18;6217:6;6214:30;6211:117;;;6247:79;;:::i;:::-;6211:117;6360:80;6432:7;6423:6;6412:9;6408:22;6360:80;:::i;:::-;6342:98;;;;6138:312;5898:559;;;;;:::o;6463:118::-;6550:24;6568:5;6550:24;:::i;:::-;6545:3;6538:37;6463:118;;:::o;6587:222::-;6680:4;6718:2;6707:9;6703:18;6695:26;;6731:71;6799:1;6788:9;6784:17;6775:6;6731:71;:::i;:::-;6587:222;;;;:::o;6815:619::-;6892:6;6900;6908;6957:2;6945:9;6936:7;6932:23;6928:32;6925:119;;;6963:79;;:::i;:::-;6925:119;7083:1;7108:53;7153:7;7144:6;7133:9;7129:22;7108:53;:::i;:::-;7098:63;;7054:117;7210:2;7236:53;7281:7;7272:6;7261:9;7257:22;7236:53;:::i;:::-;7226:63;;7181:118;7338:2;7364:53;7409:7;7400:6;7389:9;7385:22;7364:53;:::i;:::-;7354:63;;7309:118;6815:619;;;;;:::o;7440:704::-;7535:6;7543;7551;7600:2;7588:9;7579:7;7575:23;7571:32;7568:119;;;7606:79;;:::i;:::-;7568:119;7754:1;7743:9;7739:17;7726:31;7784:18;7776:6;7773:30;7770:117;;;7806:79;;:::i;:::-;7770:117;7919:80;7991:7;7982:6;7971:9;7967:22;7919:80;:::i;:::-;7901:98;;;;7697:312;8048:2;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;:::i;:::-;8064:63;;8019:118;7440:704;;;;;:::o;8150:77::-;8187:7;8216:5;8205:16;;8150:77;;;:::o;8233:118::-;8320:24;8338:5;8320:24;:::i;:::-;8315:3;8308:37;8233:118;;:::o;8357:222::-;8450:4;8488:2;8477:9;8473:18;8465:26;;8501:71;8569:1;8558:9;8554:17;8545:6;8501:71;:::i;:::-;8357:222;;;;:::o;8599:553::-;8657:8;8667:6;8717:3;8710:4;8702:6;8698:17;8694:27;8684:122;;8725:79;;:::i;:::-;8684:122;8838:6;8825:20;8815:30;;8868:18;8860:6;8857:30;8854:117;;;8890:79;;:::i;:::-;8854:117;9004:4;8996:6;8992:17;8980:29;;9058:3;9050:4;9042:6;9038:17;9028:8;9024:32;9021:41;9018:128;;;9065:79;;:::i;:::-;9018:128;8599:553;;;;;:::o;9158:529::-;9229:6;9237;9286:2;9274:9;9265:7;9261:23;9257:32;9254:119;;;9292:79;;:::i;:::-;9254:119;9440:1;9429:9;9425:17;9412:31;9470:18;9462:6;9459:30;9456:117;;;9492:79;;:::i;:::-;9456:117;9605:65;9662:7;9653:6;9642:9;9638:22;9605:65;:::i;:::-;9587:83;;;;9383:297;9158:529;;;;;:::o;9710:568::-;9783:8;9793:6;9843:3;9836:4;9828:6;9824:17;9820:27;9810:122;;9851:79;;:::i;:::-;9810:122;9964:6;9951:20;9941:30;;9994:18;9986:6;9983:30;9980:117;;;10016:79;;:::i;:::-;9980:117;10130:4;10122:6;10118:17;10106:29;;10184:3;10176:4;10168:6;10164:17;10154:8;10150:32;10147:41;10144:128;;;10191:79;;:::i;:::-;10144:128;9710:568;;;;;:::o;10284:559::-;10370:6;10378;10427:2;10415:9;10406:7;10402:23;10398:32;10395:119;;;10433:79;;:::i;:::-;10395:119;10581:1;10570:9;10566:17;10553:31;10611:18;10603:6;10600:30;10597:117;;;10633:79;;:::i;:::-;10597:117;10746:80;10818:7;10809:6;10798:9;10794:22;10746:80;:::i;:::-;10728:98;;;;10524:312;10284:559;;;;;:::o;10849:145::-;10947:6;10981:5;10975:12;10965:22;;10849:145;;;:::o;11000:215::-;11130:11;11164:6;11159:3;11152:19;11204:4;11199:3;11195:14;11180:29;;11000:215;;;;:::o;11221:163::-;11319:4;11342:3;11334:11;;11372:4;11367:3;11363:14;11355:22;;11221:163;;;:::o;11390:108::-;11467:24;11485:5;11467:24;:::i;:::-;11462:3;11455:37;11390:108;;:::o;11504:101::-;11540:7;11580:18;11573:5;11569:30;11558:41;;11504:101;;;:::o;11611:105::-;11686:23;11703:5;11686:23;:::i;:::-;11681:3;11674:36;11611:105;;:::o;11722:99::-;11793:21;11808:5;11793:21;:::i;:::-;11788:3;11781:34;11722:99;;:::o;11827:91::-;11863:7;11903:8;11896:5;11892:20;11881:31;;11827:91;;;:::o;11924:105::-;11999:23;12016:5;11999:23;:::i;:::-;11994:3;11987:36;11924:105;;:::o;12107:864::-;12256:4;12251:3;12247:14;12343:4;12336:5;12332:16;12326:23;12362:63;12419:4;12414:3;12410:14;12396:12;12362:63;:::i;:::-;12271:164;12527:4;12520:5;12516:16;12510:23;12546:61;12601:4;12596:3;12592:14;12578:12;12546:61;:::i;:::-;12445:172;12701:4;12694:5;12690:16;12684:23;12720:57;12771:4;12766:3;12762:14;12748:12;12720:57;:::i;:::-;12627:160;12874:4;12867:5;12863:16;12857:23;12893:61;12948:4;12943:3;12939:14;12925:12;12893:61;:::i;:::-;12797:167;12225:746;12107:864;;:::o;12977:303::-;13108:10;13129:108;13233:3;13225:6;13129:108;:::i;:::-;13269:4;13264:3;13260:14;13246:28;;12977:303;;;;:::o;13286:144::-;13387:4;13419;13414:3;13410:14;13402:22;;13286:144;;;:::o;13512:980::-;13693:3;13722:85;13801:5;13722:85;:::i;:::-;13823:117;13933:6;13928:3;13823:117;:::i;:::-;13816:124;;13964:87;14045:5;13964:87;:::i;:::-;14074:7;14105:1;14090:377;14115:6;14112:1;14109:13;14090:377;;;14191:6;14185:13;14218:125;14339:3;14324:13;14218:125;:::i;:::-;14211:132;;14366:91;14450:6;14366:91;:::i;:::-;14356:101;;14150:317;14137:1;14134;14130:9;14125:14;;14090:377;;;14094:14;14483:3;14476:10;;13698:794;;;13512:980;;;;:::o;14498:497::-;14703:4;14741:2;14730:9;14726:18;14718:26;;14790:9;14784:4;14780:20;14776:1;14765:9;14761:17;14754:47;14818:170;14983:4;14974:6;14818:170;:::i;:::-;14810:178;;14498:497;;;;:::o;15001:329::-;15060:6;15109:2;15097:9;15088:7;15084:23;15080:32;15077:119;;;15115:79;;:::i;:::-;15077:119;15235:1;15260:53;15305:7;15296:6;15285:9;15281:22;15260:53;:::i;:::-;15250:63;;15206:117;15001:329;;;;:::o;15336:122::-;15409:24;15427:5;15409:24;:::i;:::-;15402:5;15399:35;15389:63;;15448:1;15445;15438:12;15389:63;15336:122;:::o;15464:139::-;15510:5;15548:6;15535:20;15526:29;;15564:33;15591:5;15564:33;:::i;:::-;15464:139;;;;:::o;15609:329::-;15668:6;15717:2;15705:9;15696:7;15692:23;15688:32;15685:119;;;15723:79;;:::i;:::-;15685:119;15843:1;15868:53;15913:7;15904:6;15893:9;15889:22;15868:53;:::i;:::-;15858:63;;15814:117;15609:329;;;;:::o;15944:114::-;16011:6;16045:5;16039:12;16029:22;;15944:114;;;:::o;16064:184::-;16163:11;16197:6;16192:3;16185:19;16237:4;16232:3;16228:14;16213:29;;16064:184;;;;:::o;16254:132::-;16321:4;16344:3;16336:11;;16374:4;16369:3;16365:14;16357:22;;16254:132;;;:::o;16392:108::-;16469:24;16487:5;16469:24;:::i;:::-;16464:3;16457:37;16392:108;;:::o;16506:179::-;16575:10;16596:46;16638:3;16630:6;16596:46;:::i;:::-;16674:4;16669:3;16665:14;16651:28;;16506:179;;;;:::o;16691:113::-;16761:4;16793;16788:3;16784:14;16776:22;;16691:113;;;:::o;16840:732::-;16959:3;16988:54;17036:5;16988:54;:::i;:::-;17058:86;17137:6;17132:3;17058:86;:::i;:::-;17051:93;;17168:56;17218:5;17168:56;:::i;:::-;17247:7;17278:1;17263:284;17288:6;17285:1;17282:13;17263:284;;;17364:6;17358:13;17391:63;17450:3;17435:13;17391:63;:::i;:::-;17384:70;;17477:60;17530:6;17477:60;:::i;:::-;17467:70;;17323:224;17310:1;17307;17303:9;17298:14;;17263:284;;;17267:14;17563:3;17556:10;;16964:608;;;16840:732;;;;:::o;17578:373::-;17721:4;17759:2;17748:9;17744:18;17736:26;;17808:9;17802:4;17798:20;17794:1;17783:9;17779:17;17772:47;17836:108;17939:4;17930:6;17836:108;:::i;:::-;17828:116;;17578:373;;;;:::o;17957:619::-;18034:6;18042;18050;18099:2;18087:9;18078:7;18074:23;18070:32;18067:119;;;18105:79;;:::i;:::-;18067:119;18225:1;18250:53;18295:7;18286:6;18275:9;18271:22;18250:53;:::i;:::-;18240:63;;18196:117;18352:2;18378:53;18423:7;18414:6;18403:9;18399:22;18378:53;:::i;:::-;18368:63;;18323:118;18480:2;18506:53;18551:7;18542:6;18531:9;18527:22;18506:53;:::i;:::-;18496:63;;18451:118;17957:619;;;;;:::o;18582:116::-;18652:21;18667:5;18652:21;:::i;:::-;18645:5;18642:32;18632:60;;18688:1;18685;18678:12;18632:60;18582:116;:::o;18704:133::-;18747:5;18785:6;18772:20;18763:29;;18801:30;18825:5;18801:30;:::i;:::-;18704:133;;;;:::o;18843:468::-;18908:6;18916;18965:2;18953:9;18944:7;18940:23;18936:32;18933:119;;;18971:79;;:::i;:::-;18933:119;19091:1;19116:53;19161:7;19152:6;19141:9;19137:22;19116:53;:::i;:::-;19106:63;;19062:117;19218:2;19244:50;19286:7;19277:6;19266:9;19262:22;19244:50;:::i;:::-;19234:60;;19189:115;18843:468;;;;;:::o;19317:117::-;19426:1;19423;19416:12;19440:180;19488:77;19485:1;19478:88;19585:4;19582:1;19575:15;19609:4;19606:1;19599:15;19626:281;19709:27;19731:4;19709:27;:::i;:::-;19701:6;19697:40;19839:6;19827:10;19824:22;19803:18;19791:10;19788:34;19785:62;19782:88;;;19850:18;;:::i;:::-;19782:88;19890:10;19886:2;19879:22;19669:238;19626:281;;:::o;19913:129::-;19947:6;19974:20;;:::i;:::-;19964:30;;20003:33;20031:4;20023:6;20003:33;:::i;:::-;19913:129;;;:::o;20048:307::-;20109:4;20199:18;20191:6;20188:30;20185:56;;;20221:18;;:::i;:::-;20185:56;20259:29;20281:6;20259:29;:::i;:::-;20251:37;;20343:4;20337;20333:15;20325:23;;20048:307;;;:::o;20361:154::-;20445:6;20440:3;20435;20422:30;20507:1;20498:6;20493:3;20489:16;20482:27;20361:154;;;:::o;20521:410::-;20598:5;20623:65;20639:48;20680:6;20639:48;:::i;:::-;20623:65;:::i;:::-;20614:74;;20711:6;20704:5;20697:21;20749:4;20742:5;20738:16;20787:3;20778:6;20773:3;20769:16;20766:25;20763:112;;;20794:79;;:::i;:::-;20763:112;20884:41;20918:6;20913:3;20908;20884:41;:::i;:::-;20604:327;20521:410;;;;;:::o;20950:338::-;21005:5;21054:3;21047:4;21039:6;21035:17;21031:27;21021:122;;21062:79;;:::i;:::-;21021:122;21179:6;21166:20;21204:78;21278:3;21270:6;21263:4;21255:6;21251:17;21204:78;:::i;:::-;21195:87;;21011:277;20950:338;;;;:::o;21294:943::-;21389:6;21397;21405;21413;21462:3;21450:9;21441:7;21437:23;21433:33;21430:120;;;21469:79;;:::i;:::-;21430:120;21589:1;21614:53;21659:7;21650:6;21639:9;21635:22;21614:53;:::i;:::-;21604:63;;21560:117;21716:2;21742:53;21787:7;21778:6;21767:9;21763:22;21742:53;:::i;:::-;21732:63;;21687:118;21844:2;21870:53;21915:7;21906:6;21895:9;21891:22;21870:53;:::i;:::-;21860:63;;21815:118;22000:2;21989:9;21985:18;21972:32;22031:18;22023:6;22020:30;22017:117;;;22053:79;;:::i;:::-;22017:117;22158:62;22212:7;22203:6;22192:9;22188:22;22158:62;:::i;:::-;22148:72;;21943:287;21294:943;;;;;;;:::o;22315:874::-;22474:4;22469:3;22465:14;22561:4;22554:5;22550:16;22544:23;22580:63;22637:4;22632:3;22628:14;22614:12;22580:63;:::i;:::-;22489:164;22745:4;22738:5;22734:16;22728:23;22764:61;22819:4;22814:3;22810:14;22796:12;22764:61;:::i;:::-;22663:172;22919:4;22912:5;22908:16;22902:23;22938:57;22989:4;22984:3;22980:14;22966:12;22938:57;:::i;:::-;22845:160;23092:4;23085:5;23081:16;23075:23;23111:61;23166:4;23161:3;23157:14;23143:12;23111:61;:::i;:::-;23015:167;22443:746;22315:874;;:::o;23195:347::-;23350:4;23388:3;23377:9;23373:19;23365:27;;23402:133;23532:1;23521:9;23517:17;23508:6;23402:133;:::i;:::-;23195:347;;;;:::o;23548:474::-;23616:6;23624;23673:2;23661:9;23652:7;23648:23;23644:32;23641:119;;;23679:79;;:::i;:::-;23641:119;23799:1;23824:53;23869:7;23860:6;23849:9;23845:22;23824:53;:::i;:::-;23814:63;;23770:117;23926:2;23952:53;23997:7;23988:6;23977:9;23973:22;23952:53;:::i;:::-;23942:63;;23897:118;23548:474;;;;;:::o;24028:147::-;24129:11;24166:3;24151:18;;24028:147;;;;:::o;24181:114::-;;:::o;24301:398::-;24460:3;24481:83;24562:1;24557:3;24481:83;:::i;:::-;24474:90;;24573:93;24662:3;24573:93;:::i;:::-;24691:1;24686:3;24682:11;24675:18;;24301:398;;;:::o;24705:379::-;24889:3;24911:147;25054:3;24911:147;:::i;:::-;24904:154;;25075:3;25068:10;;24705:379;;;:::o;25090:180::-;25138:77;25135:1;25128:88;25235:4;25232:1;25225:15;25259:4;25256:1;25249:15;25276:320;25320:6;25357:1;25351:4;25347:12;25337:22;;25404:1;25398:4;25394:12;25425:18;25415:81;;25481:4;25473:6;25469:17;25459:27;;25415:81;25543:2;25535:6;25532:14;25512:18;25509:38;25506:84;;;25562:18;;:::i;:::-;25506:84;25327:269;25276:320;;;:::o;25602:94::-;25635:8;25683:5;25679:2;25675:14;25654:35;;25602:94;;;:::o;25702:::-;25741:7;25770:20;25784:5;25770:20;:::i;:::-;25759:31;;25702:94;;;:::o;25802:100::-;25841:7;25870:26;25890:5;25870:26;:::i;:::-;25859:37;;25802:100;;;:::o;25908:157::-;26013:45;26033:24;26051:5;26033:24;:::i;:::-;26013:45;:::i;:::-;26008:3;26001:58;25908:157;;:::o;26071:256::-;26183:3;26198:75;26269:3;26260:6;26198:75;:::i;:::-;26298:2;26293:3;26289:12;26282:19;;26318:3;26311:10;;26071:256;;;;:::o;26333:165::-;26473:17;26469:1;26461:6;26457:14;26450:41;26333:165;:::o;26504:366::-;26646:3;26667:67;26731:2;26726:3;26667:67;:::i;:::-;26660:74;;26743:93;26832:3;26743:93;:::i;:::-;26861:2;26856:3;26852:12;26845:19;;26504:366;;;:::o;26876:419::-;27042:4;27080:2;27069:9;27065:18;27057:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27157:131;27283:4;27157:131;:::i;:::-;27149:139;;26876:419;;;:::o;27301:178::-;27441:30;27437:1;27429:6;27425:14;27418:54;27301:178;:::o;27485:366::-;27627:3;27648:67;27712:2;27707:3;27648:67;:::i;:::-;27641:74;;27724:93;27813:3;27724:93;:::i;:::-;27842:2;27837:3;27833:12;27826:19;;27485:366;;;:::o;27857:419::-;28023:4;28061:2;28050:9;28046:18;28038:26;;28110:9;28104:4;28100:20;28096:1;28085:9;28081:17;28074:47;28138:131;28264:4;28138:131;:::i;:::-;28130:139;;27857:419;;;:::o;28282:168::-;28422:20;28418:1;28410:6;28406:14;28399:44;28282:168;:::o;28456:366::-;28598:3;28619:67;28683:2;28678:3;28619:67;:::i;:::-;28612:74;;28695:93;28784:3;28695:93;:::i;:::-;28813:2;28808:3;28804:12;28797:19;;28456:366;;;:::o;28828:419::-;28994:4;29032:2;29021:9;29017:18;29009:26;;29081:9;29075:4;29071:20;29067:1;29056:9;29052:17;29045:47;29109:131;29235:4;29109:131;:::i;:::-;29101:139;;28828:419;;;:::o;29253:169::-;29393:21;29389:1;29381:6;29377:14;29370:45;29253:169;:::o;29428:366::-;29570:3;29591:67;29655:2;29650:3;29591:67;:::i;:::-;29584:74;;29667:93;29756:3;29667:93;:::i;:::-;29785:2;29780:3;29776:12;29769:19;;29428:366;;;:::o;29800:419::-;29966:4;30004:2;29993:9;29989:18;29981:26;;30053:9;30047:4;30043:20;30039:1;30028:9;30024:17;30017:47;30081:131;30207:4;30081:131;:::i;:::-;30073:139;;29800:419;;;:::o;30225:180::-;30273:77;30270:1;30263:88;30370:4;30367:1;30360:15;30394:4;30391:1;30384:15;30411:305;30451:3;30470:20;30488:1;30470:20;:::i;:::-;30465:25;;30504:20;30522:1;30504:20;:::i;:::-;30499:25;;30658:1;30590:66;30586:74;30583:1;30580:81;30577:107;;;30664:18;;:::i;:::-;30577:107;30708:1;30705;30701:9;30694:16;;30411:305;;;;:::o;30722:172::-;30862:24;30858:1;30850:6;30846:14;30839:48;30722:172;:::o;30900:366::-;31042:3;31063:67;31127:2;31122:3;31063:67;:::i;:::-;31056:74;;31139:93;31228:3;31139:93;:::i;:::-;31257:2;31252:3;31248:12;31241:19;;30900:366;;;:::o;31272:419::-;31438:4;31476:2;31465:9;31461:18;31453:26;;31525:9;31519:4;31515:20;31511:1;31500:9;31496:17;31489:47;31553:131;31679:4;31553:131;:::i;:::-;31545:139;;31272:419;;;:::o;31697:171::-;31837:23;31833:1;31825:6;31821:14;31814:47;31697:171;:::o;31874:366::-;32016:3;32037:67;32101:2;32096:3;32037:67;:::i;:::-;32030:74;;32113:93;32202:3;32113:93;:::i;:::-;32231:2;32226:3;32222:12;32215:19;;31874:366;;;:::o;32246:419::-;32412:4;32450:2;32439:9;32435:18;32427:26;;32499:9;32493:4;32489:20;32485:1;32474:9;32470:17;32463:47;32527:131;32653:4;32527:131;:::i;:::-;32519:139;;32246:419;;;:::o;32671:163::-;32811:15;32807:1;32799:6;32795:14;32788:39;32671:163;:::o;32840:366::-;32982:3;33003:67;33067:2;33062:3;33003:67;:::i;:::-;32996:74;;33079:93;33168:3;33079:93;:::i;:::-;33197:2;33192:3;33188:12;33181:19;;32840:366;;;:::o;33212:419::-;33378:4;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33212:419;;;:::o;33637:348::-;33677:7;33700:20;33718:1;33700:20;:::i;:::-;33695:25;;33734:20;33752:1;33734:20;:::i;:::-;33729:25;;33922:1;33854:66;33850:74;33847:1;33844:81;33839:1;33832:9;33825:17;33821:105;33818:131;;;33929:18;;:::i;:::-;33818:131;33977:1;33974;33970:9;33959:20;;33637:348;;;;:::o;33991:166::-;34131:18;34127:1;34119:6;34115:14;34108:42;33991:166;:::o;34163:366::-;34305:3;34326:67;34390:2;34385:3;34326:67;:::i;:::-;34319:74;;34402:93;34491:3;34402:93;:::i;:::-;34520:2;34515:3;34511:12;34504:19;;34163:366;;;:::o;34535:419::-;34701:4;34739:2;34728:9;34724:18;34716:26;;34788:9;34782:4;34778:20;34774:1;34763:9;34759:17;34752:47;34816:131;34942:4;34816:131;:::i;:::-;34808:139;;34535:419;;;:::o;34960:175::-;35100:27;35096:1;35088:6;35084:14;35077:51;34960:175;:::o;35141:366::-;35283:3;35304:67;35368:2;35363:3;35304:67;:::i;:::-;35297:74;;35380:93;35469:3;35380:93;:::i;:::-;35498:2;35493:3;35489:12;35482:19;;35141:366;;;:::o;35513:419::-;35679:4;35717:2;35706:9;35702:18;35694:26;;35766:9;35760:4;35756:20;35752:1;35741:9;35737:17;35730:47;35794:131;35920:4;35794:131;:::i;:::-;35786:139;;35513:419;;;:::o;35938:168::-;36078:20;36074:1;36066:6;36062:14;36055:44;35938:168;:::o;36112:366::-;36254:3;36275:67;36339:2;36334:3;36275:67;:::i;:::-;36268:74;;36351:93;36440:3;36351:93;:::i;:::-;36469:2;36464:3;36460:12;36453:19;;36112:366;;;:::o;36484:419::-;36650:4;36688:2;36677:9;36673:18;36665:26;;36737:9;36731:4;36727:20;36723:1;36712:9;36708:17;36701:47;36765:131;36891:4;36765:131;:::i;:::-;36757:139;;36484:419;;;:::o;36909:180::-;36957:77;36954:1;36947:88;37054:4;37051:1;37044:15;37078:4;37075:1;37068:15;37095:170;37235:22;37231:1;37223:6;37219:14;37212:46;37095:170;:::o;37271:366::-;37413:3;37434:67;37498:2;37493:3;37434:67;:::i;:::-;37427:74;;37510:93;37599:3;37510:93;:::i;:::-;37628:2;37623:3;37619:12;37612:19;;37271:366;;;:::o;37643:419::-;37809:4;37847:2;37836:9;37832:18;37824:26;;37896:9;37890:4;37886:20;37882:1;37871:9;37867:17;37860:47;37924:131;38050:4;37924:131;:::i;:::-;37916:139;;37643:419;;;:::o;38068:234::-;38208:34;38204:1;38196:6;38192:14;38185:58;38277:17;38272:2;38264:6;38260:15;38253:42;38068:234;:::o;38308:366::-;38450:3;38471:67;38535:2;38530:3;38471:67;:::i;:::-;38464:74;;38547:93;38636:3;38547:93;:::i;:::-;38665:2;38660:3;38656:12;38649:19;;38308:366;;;:::o;38680:419::-;38846:4;38884:2;38873:9;38869:18;38861:26;;38933:9;38927:4;38923:20;38919:1;38908:9;38904:17;38897:47;38961:131;39087:4;38961:131;:::i;:::-;38953:139;;38680:419;;;:::o;39105:148::-;39207:11;39244:3;39229:18;;39105:148;;;;:::o;39259:377::-;39365:3;39393:39;39426:5;39393:39;:::i;:::-;39448:89;39530:6;39525:3;39448:89;:::i;:::-;39441:96;;39546:52;39591:6;39586:3;39579:4;39572:5;39568:16;39546:52;:::i;:::-;39623:6;39618:3;39614:16;39607:23;;39369:267;39259:377;;;;:::o;39642:155::-;39782:7;39778:1;39770:6;39766:14;39759:31;39642:155;:::o;39803:400::-;39963:3;39984:84;40066:1;40061:3;39984:84;:::i;:::-;39977:91;;40077:93;40166:3;40077:93;:::i;:::-;40195:1;40190:3;40186:11;40179:18;;39803:400;;;:::o;40209:701::-;40490:3;40512:95;40603:3;40594:6;40512:95;:::i;:::-;40505:102;;40624:95;40715:3;40706:6;40624:95;:::i;:::-;40617:102;;40736:148;40880:3;40736:148;:::i;:::-;40729:155;;40901:3;40894:10;;40209:701;;;;;:::o;40916:225::-;41056:34;41052:1;41044:6;41040:14;41033:58;41125:8;41120:2;41112:6;41108:15;41101:33;40916:225;:::o;41147:366::-;41289:3;41310:67;41374:2;41369:3;41310:67;:::i;:::-;41303:74;;41386:93;41475:3;41386:93;:::i;:::-;41504:2;41499:3;41495:12;41488:19;;41147:366;;;:::o;41519:419::-;41685:4;41723:2;41712:9;41708:18;41700:26;;41772:9;41766:4;41762:20;41758:1;41747:9;41743:17;41736:47;41800:131;41926:4;41800:131;:::i;:::-;41792:139;;41519:419;;;:::o;41944:182::-;42084:34;42080:1;42072:6;42068:14;42061:58;41944:182;:::o;42132:366::-;42274:3;42295:67;42359:2;42354:3;42295:67;:::i;:::-;42288:74;;42371:93;42460:3;42371:93;:::i;:::-;42489:2;42484:3;42480:12;42473:19;;42132:366;;;:::o;42504:419::-;42670:4;42708:2;42697:9;42693:18;42685:26;;42757:9;42751:4;42747:20;42743:1;42732:9;42728:17;42721:47;42785:131;42911:4;42785:131;:::i;:::-;42777:139;;42504:419;;;:::o;42929:98::-;42980:6;43014:5;43008:12;42998:22;;42929:98;;;:::o;43033:168::-;43116:11;43150:6;43145:3;43138:19;43190:4;43185:3;43181:14;43166:29;;43033:168;;;;:::o;43207:360::-;43293:3;43321:38;43353:5;43321:38;:::i;:::-;43375:70;43438:6;43433:3;43375:70;:::i;:::-;43368:77;;43454:52;43499:6;43494:3;43487:4;43480:5;43476:16;43454:52;:::i;:::-;43531:29;43553:6;43531:29;:::i;:::-;43526:3;43522:39;43515:46;;43297:270;43207:360;;;;:::o;43573:640::-;43768:4;43806:3;43795:9;43791:19;43783:27;;43820:71;43888:1;43877:9;43873:17;43864:6;43820:71;:::i;:::-;43901:72;43969:2;43958:9;43954:18;43945:6;43901:72;:::i;:::-;43983;44051:2;44040:9;44036:18;44027:6;43983:72;:::i;:::-;44102:9;44096:4;44092:20;44087:2;44076:9;44072:18;44065:48;44130:76;44201:4;44192:6;44130:76;:::i;:::-;44122:84;;43573:640;;;;;;;:::o;44219:141::-;44275:5;44306:6;44300:13;44291:22;;44322:32;44348:5;44322:32;:::i;:::-;44219:141;;;;:::o;44366:349::-;44435:6;44484:2;44472:9;44463:7;44459:23;44455:32;44452:119;;;44490:79;;:::i;:::-;44452:119;44610:1;44635:63;44690:7;44681:6;44670:9;44666:22;44635:63;:::i;:::-;44625:73;;44581:127;44366:349;;;;:::o;44721:233::-;44760:3;44783:24;44801:5;44783:24;:::i;:::-;44774:33;;44829:66;44822:5;44819:77;44816:103;;;44899:18;;:::i;:::-;44816:103;44946:1;44939:5;44935:13;44928:20;;44721:233;;;:::o;44960:180::-;45008:77;45005:1;44998:88;45105:4;45102:1;45095:15;45129:4;45126:1;45119:15;45146:185;45186:1;45203:20;45221:1;45203:20;:::i;:::-;45198:25;;45237:20;45255:1;45237:20;:::i;:::-;45232:25;;45276:1;45266:35;;45281:18;;:::i;:::-;45266:35;45323:1;45320;45316:9;45311:14;;45146:185;;;;:::o;45337:191::-;45377:4;45397:20;45415:1;45397:20;:::i;:::-;45392:25;;45431:20;45449:1;45431:20;:::i;:::-;45426:25;;45470:1;45467;45464:8;45461:34;;;45475:18;;:::i;:::-;45461:34;45520:1;45517;45513:9;45505:17;;45337:191;;;;:::o;45534:176::-;45566:1;45583:20;45601:1;45583:20;:::i;:::-;45578:25;;45617:20;45635:1;45617:20;:::i;:::-;45612:25;;45656:1;45646:35;;45661:18;;:::i;:::-;45646:35;45702:1;45699;45695:9;45690:14;;45534:176;;;;:::o
Swarm Source
ipfs://f28525f547bdd74d67b22e07d76224d2a5a556ea3239748a7b2c0f5ce4cdd00d
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.