ERC-721
Overview
Max Total Supply
1,000 NAMES
Holders
168
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 NAMESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NAMES
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-30 */ // SPDX-License-Identifier: MIT and GPL-3.0 // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @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`. * * 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 calldata data ) external; /** * @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 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 ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // 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/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _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 ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary 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 { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ 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, tokenId.toString(), ".json")) : ''; } /** * @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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @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. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // 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 { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @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 {} } // File contracts/mocks/StartTokenIdHelper.sol // Creators: Chiru Labs pragma solidity ^0.8.4; /** * This Helper is used to return a dynmamic value in the overriden _startTokenId() function. * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId` * to be returned by the overriden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks. */ contract StartTokenIdHelper { uint256 public immutable startTokenId; constructor(uint256 startTokenId_) { startTokenId = startTokenId_; } } // File @openzeppelin/contracts/access/[email protected] // 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 @openzeppelin/contracts/utils/cryptography/[email protected] // 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) } } } pragma solidity >=0.8.0 <0.9.0; contract NAMES is ERC721A, Ownable { using Strings for uint256; uint256 constant MAX_SUPPLY = 1000; uint256 constant publicMintPrice = 0 ether; uint256 public MAX_PER_ADDRESS = 5; mapping(address => bool) public whitelist; enum Status { NOT_LIVE, ALLOWLIST, PUBLIC, ENDED, REVEALED } /// Minting Variables string public _preRevealURI = "ipfs://QmeKEvNuCvHcpzNe8uXLmA5V77WnYmmCUCFwf3GFBgkz2d"; string public baseURI; Status public state; constructor() ERC721A("NAMES", "NAMES") { } function setAllowList(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = true; } } function resetAllowList(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = false; } } function addWhitelist(address _newEntry) external onlyOwner { require(!whitelist[_newEntry], "Already in whitelist"); whitelist[_newEntry] = true; } function removeWhitelist(address _newEntry) external onlyOwner { require(whitelist[_newEntry], "Previous not in whitelist"); whitelist[_newEntry] = false; } function isAllowlist(address _address) external view returns (bool _allowlisted) { return whitelist[_address]; } function getPrice() external pure returns (uint256 _price) { return publicMintPrice; } function maxSupply() external pure returns (uint256 _supply) { return MAX_SUPPLY; } function setMaxMint(uint256 mintAmount) external onlyOwner { MAX_PER_ADDRESS = mintAmount; } function publicMint(uint256 _quantity) external payable { require(state == Status.PUBLIC || state == Status.ALLOWLIST, "Mint Not Active"); if(state == Status.ALLOWLIST){ require(whitelist[msg.sender], "Not in whitelist"); } require(totalSupply() + _quantity <= MAX_SUPPLY, "Mint Supply Exceeded"); require(_numberMinted(msg.sender) + _quantity <= MAX_PER_ADDRESS, "Exceeds Max Per Wallet"); _safeMint(msg.sender, _quantity); } function airdrop(address _address, uint256 _quantity) external onlyOwner { require(state == Status.ENDED, "Must Not Be Live"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Mint Supply Exceeded"); _safeMint(_address, _quantity); } function setState(Status _state) external onlyOwner { state = _state; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (state != Status.REVEALED) { return _preRevealURI; } return super.tokenURI(tokenId); } function setURI(string calldata _newURI) external onlyOwner { baseURI = _newURI; } function setPrerevealURI(string calldata _newURI) external onlyOwner { _preRevealURI = _newURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function withdrawMoney() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Withdraw failed."); } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_preRevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isAllowlist","outputs":[{"internalType":"bool","name":"_allowlisted","type":"bool"}],"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":"_supply","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newEntry","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"resetAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setPrerevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum NAMES.Status","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum NAMES.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260056009556040518060600160405280603581526020016200424a60359139600b90805190602001906200003a929190620001fc565b503480156200004857600080fd5b506040518060400160405280600581526020017f4e414d45530000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e414d45530000000000000000000000000000000000000000000000000000008152508160029080519060200190620000cd929190620001fc565b508060039080519060200190620000e6929190620001fc565b50620000f76200012560201b60201c565b60008190555050506200011f620001136200012e60201b60201c565b6200013660201b60201c565b62000311565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020a90620002ac565b90600052602060002090601f0160209004810192826200022e57600085556200027a565b82601f106200024957805160ff19168380011785556200027a565b828001600101855582156200027a579182015b82811115620002795782518255916020019190600101906200025c565b5b5090506200028991906200028d565b5090565b5b80821115620002a85760008160009055506001016200028e565b5090565b60006002820490506001821680620002c557607f821691505b60208210811415620002dc57620002db620002e2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613f2980620003216000396000f3fe60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610764578063d5abeb01146107a1578063e985e9c5146107cc578063f2fde38b14610809578063f80f5dd5146108325761020f565b8063a22cb465146106d0578063ac446002146106f9578063b88d4fde14610710578063c19d93fb146107395761020f565b80638ba4cc3c116100e75780638ba4cc3c146105e95780638da5cb5b1461061257806395d89b411461063d57806398d5fdca146106685780639b19251a146106935761020f565b806370a0823114610543578063715018a61461058057806378c8cda7146105975780637f41bf43146105c05761020f565b806323b872dd1161019b57806356de96db1161016a57806356de96db1461044c5780636352211e146104755780636447c35d146104b25780636c0360eb146104db5780636c350ba6146105065761020f565b806323b872dd146103b55780632db11544146103de57806342842e0e146103fa578063547520fe146104235761020f565b8063078eef28116101e2578063078eef28146102d0578063081812fc146102f9578063095ea7b3146103365780630aaef2851461035f57806318160ddd1461038a5761020f565b806301ffc9a7146102145780630293741b1461025157806302fe53051461027c57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613245565b61085b565b6040516102489190613674565b60405180910390f35b34801561025d57600080fd5b5061026661093d565b60405161027391906136aa565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906132cc565b6109cb565b005b3480156102b157600080fd5b506102ba6109e9565b6040516102c791906136aa565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906132cc565b610a7b565b005b34801561030557600080fd5b50610320600480360381019061031b9190613319565b610a99565b60405161032d919061360d565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906131b8565b610b15565b005b34801561036b57600080fd5b50610374610c20565b604051610381919061380c565b60405180910390f35b34801561039657600080fd5b5061039f610c26565b6040516103ac919061380c565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906130a2565b610c3d565b005b6103f860048036038101906103f39190613319565b610c4d565b005b34801561040657600080fd5b50610421600480360381019061041c91906130a2565b610e86565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613319565b610ea6565b005b34801561045857600080fd5b50610473600480360381019061046e919061329f565b610eb8565b005b34801561048157600080fd5b5061049c60048036038101906104979190613319565b610eed565b6040516104a9919061360d565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906131f8565b610f03565b005b3480156104e757600080fd5b506104f0610fb0565b6040516104fd91906136aa565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613035565b61103e565b60405161053a9190613674565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613035565b611094565b604051610577919061380c565b60405180910390f35b34801561058c57600080fd5b50610595611164565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613035565b611178565b005b3480156105cc57600080fd5b506105e760048036038101906105e291906131f8565b611267565b005b3480156105f557600080fd5b50610610600480360381019061060b91906131b8565b611314565b005b34801561061e57600080fd5b506106276113f7565b604051610634919061360d565b60405180910390f35b34801561064957600080fd5b50610652611421565b60405161065f91906136aa565b60405180910390f35b34801561067457600080fd5b5061067d6114b3565b60405161068a919061380c565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190613035565b6114b8565b6040516106c79190613674565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190613178565b6114d8565b005b34801561070557600080fd5b5061070e611650565b005b34801561071c57600080fd5b50610737600480360381019061073291906130f5565b611707565b005b34801561074557600080fd5b5061074e611783565b60405161075b919061368f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613319565b611796565b60405161079891906136aa565b60405180910390f35b3480156107ad57600080fd5b506107b6611875565b6040516107c3919061380c565b60405180910390f35b3480156107d857600080fd5b506107f360048036038101906107ee9190613062565b61187f565b6040516108009190613674565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613035565b611913565b005b34801561083e57600080fd5b5061085960048036038101906108549190613035565b611997565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610936575061093582611a87565b5b9050919050565b600b805461094a90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461097690613a61565b80156109c35780601f10610998576101008083540402835291602001916109c3565b820191906000526020600020905b8154815290600101906020018083116109a657829003601f168201915b505050505081565b6109d3611af1565b8181600c91906109e4929190612db5565b505050565b6060600280546109f890613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2490613a61565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050905090565b610a83611af1565b8181600b9190610a94929190612db5565b505050565b6000610aa482611b6f565b610ada576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2082610eed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b88576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba7611bbd565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bd95750610bd781610bd2611bbd565b61187f565b155b15610c10576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1b838383611bc5565b505050565b60095481565b6000610c30611c77565b6001546000540303905090565b610c48838383611c80565b505050565b60026004811115610c6157610c60613b9c565b5b600d60009054906101000a900460ff166004811115610c8357610c82613b9c565b5b1480610cc2575060016004811115610c9e57610c9d613b9c565b5b600d60009054906101000a900460ff166004811115610cc057610cbf613b9c565b5b145b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906136cc565b60405180910390fd5b60016004811115610d1557610d14613b9c565b5b600d60009054906101000a900460ff166004811115610d3757610d36613b9c565b5b1415610dca57600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061378c565b60405180910390fd5b5b6103e881610dd6610c26565b610de091906138cb565b1115610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189061372c565b60405180910390fd5b60095481610e2e33612171565b610e3891906138cb565b1115610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70906137ec565b60405180910390fd5b610e833382612241565b50565b610ea183838360405180602001604052806000815250611707565b505050565b610eae611af1565b8060098190555050565b610ec0611af1565b80600d60006101000a81548160ff02191690836004811115610ee557610ee4613b9c565b5b021790555050565b6000610ef88261225f565b600001519050919050565b610f0b611af1565b60005b82829050811015610fab576001600a6000858585818110610f3257610f31613bfa565b5b9050602002016020810190610f479190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fa390613ac4565b915050610f0e565b505050565b600c8054610fbd90613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe990613a61565b80156110365780601f1061100b57610100808354040283529160200191611036565b820191906000526020600020905b81548152906001019060200180831161101957829003601f168201915b505050505081565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61116c611af1565b61117660006124ee565b565b611180611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661120c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112039061370c565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61126f611af1565b60005b8282905081101561130f576000600a600085858581811061129657611295613bfa565b5b90506020020160208101906112ab9190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061130790613ac4565b915050611272565b505050565b61131c611af1565b600360048111156113305761132f613b9c565b5b600d60009054906101000a900460ff16600481111561135257611351613b9c565b5b14611392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611389906137cc565b60405180910390fd5b6103e88161139e610c26565b6113a891906138cb565b11156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e09061372c565b60405180910390fd5b6113f38282612241565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461143090613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461145c90613a61565b80156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b5050505050905090565b600090565b600a6020528060005260406000206000915054906101000a900460ff1681565b6114e0611bbd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611552611bbd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ff611bbd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116449190613674565b60405180910390a35050565b611658611af1565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161167e906135f8565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b5050905080611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb9061376c565b60405180910390fd5b50565b611712848484611c80565b6117318373ffffffffffffffffffffffffffffffffffffffff166125b4565b80156117465750611744848484846125d7565b155b1561177d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600d60009054906101000a900460ff1681565b60606004808111156117ab576117aa613b9c565b5b600d60009054906101000a900460ff1660048111156117cd576117cc613b9c565b5b1461186457600b80546117df90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90613a61565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b50505050509050611870565b61186d82612737565b90505b919050565b60006103e8905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191b611af1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611982906136ec565b60405180910390fd5b611994816124ee565b50565b61199f611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061374c565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611af9611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611b176113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906137ac565b60405180910390fd5b565b600081611b7a611c77565b11158015611b89575060005482105b8015611bb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c8b8261225f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cb2611bbd565b73ffffffffffffffffffffffffffffffffffffffff161480611ce55750611ce48260000151611cdf611bbd565b61187f565b5b80611d2a5750611cf3611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611d1284610a99565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d63576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e33576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e4085858560016127d6565b611e506000848460000151611bc5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612101576000548110156121005782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216a85858560016127dc565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d9576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61225b8282604051806020016040528060008152506127e2565b5050565b612267612e3b565b600082905080612275611c77565b11158015612284575060005481105b156124b7576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124b557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123995780925050506124e9565b5b6001156124b457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124af5780925050506124e9565b61239a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fd611bbd565b8786866040518563ffffffff1660e01b815260040161261f9493929190613628565b602060405180830381600087803b15801561263957600080fd5b505af192505050801561266a57506040513d601f19601f820116820180604052508101906126679190613272565b60015b6126e4573d806000811461269a576040519150601f19603f3d011682016040523d82523d6000602084013e61269f565b606091505b506000815114156126dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061274282611b6f565b612778576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127826127f4565b90506000815114156127a357604051806020016040528060008152506127ce565b806127ad84612886565b6040516020016127be9291906135c9565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6127ef83838360016129e7565b505050565b6060600c805461280390613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461282f90613a61565b801561287c5780601f106128515761010080835404028352916020019161287c565b820191906000526020600020905b81548152906001019060200180831161285f57829003601f168201915b5050505050905090565b606060008214156128ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e2565b600082905060005b600082146129005780806128e990613ac4565b915050600a826128f99190613921565b91506128d6565b60008167ffffffffffffffff81111561291c5761291b613c29565b5b6040519080825280601f01601f19166020018201604052801561294e5781602001600182028036833780820191505090505b5090505b600085146129db576001826129679190613952565b9150600a856129769190613b0d565b603061298291906138cb565b60f81b81838151811061299857612997613bfa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d49190613921565b9450612952565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a54576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612a8f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a9c60008683876127d6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c665750612c658773ffffffffffffffffffffffffffffffffffffffff166125b4565b5b15612d2c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cdb60008884806001019550886125d7565b612d11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c6c578260005414612d2757600080fd5b612d98565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d2d575b816000819055505050612dae60008683876127dc565b5050505050565b828054612dc190613a61565b90600052602060002090601f016020900481019282612de35760008555612e2a565b82601f10612dfc57803560ff1916838001178555612e2a565b82800160010185558215612e2a579182015b82811115612e29578235825591602001919060010190612e0e565b5b509050612e379190612e7e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e97576000816000905550600101612e7f565b5090565b6000612eae612ea98461384c565b613827565b905082815260208101848484011115612eca57612ec9613c67565b5b612ed5848285613a1f565b509392505050565b600081359050612eec81613e87565b92915050565b60008083601f840112612f0857612f07613c5d565b5b8235905067ffffffffffffffff811115612f2557612f24613c58565b5b602083019150836020820283011115612f4157612f40613c62565b5b9250929050565b600081359050612f5781613e9e565b92915050565b600081359050612f6c81613eb5565b92915050565b600081519050612f8181613eb5565b92915050565b600082601f830112612f9c57612f9b613c5d565b5b8135612fac848260208601612e9b565b91505092915050565b600081359050612fc481613ecc565b92915050565b60008083601f840112612fe057612fdf613c5d565b5b8235905067ffffffffffffffff811115612ffd57612ffc613c58565b5b60208301915083600182028301111561301957613018613c62565b5b9250929050565b60008135905061302f81613edc565b92915050565b60006020828403121561304b5761304a613c71565b5b600061305984828501612edd565b91505092915050565b6000806040838503121561307957613078613c71565b5b600061308785828601612edd565b925050602061309885828601612edd565b9150509250929050565b6000806000606084860312156130bb576130ba613c71565b5b60006130c986828701612edd565b93505060206130da86828701612edd565b92505060406130eb86828701613020565b9150509250925092565b6000806000806080858703121561310f5761310e613c71565b5b600061311d87828801612edd565b945050602061312e87828801612edd565b935050604061313f87828801613020565b925050606085013567ffffffffffffffff8111156131605761315f613c6c565b5b61316c87828801612f87565b91505092959194509250565b6000806040838503121561318f5761318e613c71565b5b600061319d85828601612edd565b92505060206131ae85828601612f48565b9150509250929050565b600080604083850312156131cf576131ce613c71565b5b60006131dd85828601612edd565b92505060206131ee85828601613020565b9150509250929050565b6000806020838503121561320f5761320e613c71565b5b600083013567ffffffffffffffff81111561322d5761322c613c6c565b5b61323985828601612ef2565b92509250509250929050565b60006020828403121561325b5761325a613c71565b5b600061326984828501612f5d565b91505092915050565b60006020828403121561328857613287613c71565b5b600061329684828501612f72565b91505092915050565b6000602082840312156132b5576132b4613c71565b5b60006132c384828501612fb5565b91505092915050565b600080602083850312156132e3576132e2613c71565b5b600083013567ffffffffffffffff81111561330157613300613c6c565b5b61330d85828601612fca565b92509250509250929050565b60006020828403121561332f5761332e613c71565b5b600061333d84828501613020565b91505092915050565b61334f81613986565b82525050565b61335e81613998565b82525050565b600061336f8261387d565b6133798185613893565b9350613389818560208601613a2e565b61339281613c76565b840191505092915050565b6133a681613a0d565b82525050565b60006133b782613888565b6133c181856138af565b93506133d1818560208601613a2e565b6133da81613c76565b840191505092915050565b60006133f082613888565b6133fa81856138c0565b935061340a818560208601613a2e565b80840191505092915050565b6000613423600f836138af565b915061342e82613c87565b602082019050919050565b60006134466026836138af565b915061345182613cb0565b604082019050919050565b60006134696019836138af565b915061347482613cff565b602082019050919050565b600061348c6014836138af565b915061349782613d28565b602082019050919050565b60006134af6014836138af565b91506134ba82613d51565b602082019050919050565b60006134d26010836138af565b91506134dd82613d7a565b602082019050919050565b60006134f56010836138af565b915061350082613da3565b602082019050919050565b60006135186005836138c0565b915061352382613dcc565b600582019050919050565b600061353b6020836138af565b915061354682613df5565b602082019050919050565b600061355e6010836138af565b915061356982613e1e565b602082019050919050565b60006135816000836138a4565b915061358c82613e47565b600082019050919050565b60006135a46016836138af565b91506135af82613e4a565b602082019050919050565b6135c381613a03565b82525050565b60006135d582856133e5565b91506135e182846133e5565b91506135ec8261350b565b91508190509392505050565b600061360382613574565b9150819050919050565b60006020820190506136226000830184613346565b92915050565b600060808201905061363d6000830187613346565b61364a6020830186613346565b61365760408301856135ba565b81810360608301526136698184613364565b905095945050505050565b60006020820190506136896000830184613355565b92915050565b60006020820190506136a4600083018461339d565b92915050565b600060208201905081810360008301526136c481846133ac565b905092915050565b600060208201905081810360008301526136e581613416565b9050919050565b6000602082019050818103600083015261370581613439565b9050919050565b600060208201905081810360008301526137258161345c565b9050919050565b600060208201905081810360008301526137458161347f565b9050919050565b60006020820190508181036000830152613765816134a2565b9050919050565b60006020820190508181036000830152613785816134c5565b9050919050565b600060208201905081810360008301526137a5816134e8565b9050919050565b600060208201905081810360008301526137c58161352e565b9050919050565b600060208201905081810360008301526137e581613551565b9050919050565b6000602082019050818103600083015261380581613597565b9050919050565b600060208201905061382160008301846135ba565b92915050565b6000613831613842565b905061383d8282613a93565b919050565b6000604051905090565b600067ffffffffffffffff82111561386757613866613c29565b5b61387082613c76565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138d682613a03565b91506138e183613a03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561391657613915613b3e565b5b828201905092915050565b600061392c82613a03565b915061393783613a03565b92508261394757613946613b6d565b5b828204905092915050565b600061395d82613a03565b915061396883613a03565b92508282101561397b5761397a613b3e565b5b828203905092915050565b6000613991826139e3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506139de82613e73565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a18826139d0565b9050919050565b82818337600083830152505050565b60005b83811015613a4c578082015181840152602081019050613a31565b83811115613a5b576000848401525b50505050565b60006002820490506001821680613a7957607f821691505b60208210811415613a8d57613a8c613bcb565b5b50919050565b613a9c82613c76565b810181811067ffffffffffffffff82111715613abb57613aba613c29565b5b80604052505050565b6000613acf82613a03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0257613b01613b3e565b5b600182019050919050565b6000613b1882613a03565b9150613b2383613a03565b925082613b3357613b32613b6d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74204e6f74204163746976650000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50726576696f7573206e6f7420696e2077686974656c69737400000000000000600082015250565b7f4d696e7420537570706c79204578636565646564000000000000000000000000600082015250565b7f416c726561647920696e2077686974656c697374000000000000000000000000600082015250565b7f5769746864726177206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d757374204e6f74204265204c69766500000000000000000000000000000000600082015250565b50565b7f45786365656473204d6178205065722057616c6c657400000000000000000000600082015250565b60058110613e8457613e83613b9c565b5b50565b613e9081613986565b8114613e9b57600080fd5b50565b613ea781613998565b8114613eb257600080fd5b50565b613ebe816139a4565b8114613ec957600080fd5b50565b60058110613ed957600080fd5b50565b613ee581613a03565b8114613ef057600080fd5b5056fea26469706673582212201fe368dcce0f4a37f499fd0d6f01568c08b479d0bab4a1376fc86cb8bcf8ba1e64736f6c63430008070033697066733a2f2f516d654b45764e7543764863707a4e653875584c6d4135563737576e596d6d43554346776633474642676b7a3264
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806370a0823111610118578063a22cb465116100a0578063c87b56dd1161006f578063c87b56dd14610764578063d5abeb01146107a1578063e985e9c5146107cc578063f2fde38b14610809578063f80f5dd5146108325761020f565b8063a22cb465146106d0578063ac446002146106f9578063b88d4fde14610710578063c19d93fb146107395761020f565b80638ba4cc3c116100e75780638ba4cc3c146105e95780638da5cb5b1461061257806395d89b411461063d57806398d5fdca146106685780639b19251a146106935761020f565b806370a0823114610543578063715018a61461058057806378c8cda7146105975780637f41bf43146105c05761020f565b806323b872dd1161019b57806356de96db1161016a57806356de96db1461044c5780636352211e146104755780636447c35d146104b25780636c0360eb146104db5780636c350ba6146105065761020f565b806323b872dd146103b55780632db11544146103de57806342842e0e146103fa578063547520fe146104235761020f565b8063078eef28116101e2578063078eef28146102d0578063081812fc146102f9578063095ea7b3146103365780630aaef2851461035f57806318160ddd1461038a5761020f565b806301ffc9a7146102145780630293741b1461025157806302fe53051461027c57806306fdde03146102a5575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613245565b61085b565b6040516102489190613674565b60405180910390f35b34801561025d57600080fd5b5061026661093d565b60405161027391906136aa565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906132cc565b6109cb565b005b3480156102b157600080fd5b506102ba6109e9565b6040516102c791906136aa565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906132cc565b610a7b565b005b34801561030557600080fd5b50610320600480360381019061031b9190613319565b610a99565b60405161032d919061360d565b60405180910390f35b34801561034257600080fd5b5061035d600480360381019061035891906131b8565b610b15565b005b34801561036b57600080fd5b50610374610c20565b604051610381919061380c565b60405180910390f35b34801561039657600080fd5b5061039f610c26565b6040516103ac919061380c565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d791906130a2565b610c3d565b005b6103f860048036038101906103f39190613319565b610c4d565b005b34801561040657600080fd5b50610421600480360381019061041c91906130a2565b610e86565b005b34801561042f57600080fd5b5061044a60048036038101906104459190613319565b610ea6565b005b34801561045857600080fd5b50610473600480360381019061046e919061329f565b610eb8565b005b34801561048157600080fd5b5061049c60048036038101906104979190613319565b610eed565b6040516104a9919061360d565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906131f8565b610f03565b005b3480156104e757600080fd5b506104f0610fb0565b6040516104fd91906136aa565b60405180910390f35b34801561051257600080fd5b5061052d60048036038101906105289190613035565b61103e565b60405161053a9190613674565b60405180910390f35b34801561054f57600080fd5b5061056a60048036038101906105659190613035565b611094565b604051610577919061380c565b60405180910390f35b34801561058c57600080fd5b50610595611164565b005b3480156105a357600080fd5b506105be60048036038101906105b99190613035565b611178565b005b3480156105cc57600080fd5b506105e760048036038101906105e291906131f8565b611267565b005b3480156105f557600080fd5b50610610600480360381019061060b91906131b8565b611314565b005b34801561061e57600080fd5b506106276113f7565b604051610634919061360d565b60405180910390f35b34801561064957600080fd5b50610652611421565b60405161065f91906136aa565b60405180910390f35b34801561067457600080fd5b5061067d6114b3565b60405161068a919061380c565b60405180910390f35b34801561069f57600080fd5b506106ba60048036038101906106b59190613035565b6114b8565b6040516106c79190613674565b60405180910390f35b3480156106dc57600080fd5b506106f760048036038101906106f29190613178565b6114d8565b005b34801561070557600080fd5b5061070e611650565b005b34801561071c57600080fd5b50610737600480360381019061073291906130f5565b611707565b005b34801561074557600080fd5b5061074e611783565b60405161075b919061368f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613319565b611796565b60405161079891906136aa565b60405180910390f35b3480156107ad57600080fd5b506107b6611875565b6040516107c3919061380c565b60405180910390f35b3480156107d857600080fd5b506107f360048036038101906107ee9190613062565b61187f565b6040516108009190613674565b60405180910390f35b34801561081557600080fd5b50610830600480360381019061082b9190613035565b611913565b005b34801561083e57600080fd5b5061085960048036038101906108549190613035565b611997565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610936575061093582611a87565b5b9050919050565b600b805461094a90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461097690613a61565b80156109c35780601f10610998576101008083540402835291602001916109c3565b820191906000526020600020905b8154815290600101906020018083116109a657829003601f168201915b505050505081565b6109d3611af1565b8181600c91906109e4929190612db5565b505050565b6060600280546109f890613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2490613a61565b8015610a715780601f10610a4657610100808354040283529160200191610a71565b820191906000526020600020905b815481529060010190602001808311610a5457829003601f168201915b5050505050905090565b610a83611af1565b8181600b9190610a94929190612db5565b505050565b6000610aa482611b6f565b610ada576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2082610eed565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b88576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ba7611bbd565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bd95750610bd781610bd2611bbd565b61187f565b155b15610c10576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1b838383611bc5565b505050565b60095481565b6000610c30611c77565b6001546000540303905090565b610c48838383611c80565b505050565b60026004811115610c6157610c60613b9c565b5b600d60009054906101000a900460ff166004811115610c8357610c82613b9c565b5b1480610cc2575060016004811115610c9e57610c9d613b9c565b5b600d60009054906101000a900460ff166004811115610cc057610cbf613b9c565b5b145b610d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf8906136cc565b60405180910390fd5b60016004811115610d1557610d14613b9c565b5b600d60009054906101000a900460ff166004811115610d3757610d36613b9c565b5b1415610dca57600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc09061378c565b60405180910390fd5b5b6103e881610dd6610c26565b610de091906138cb565b1115610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e189061372c565b60405180910390fd5b60095481610e2e33612171565b610e3891906138cb565b1115610e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e70906137ec565b60405180910390fd5b610e833382612241565b50565b610ea183838360405180602001604052806000815250611707565b505050565b610eae611af1565b8060098190555050565b610ec0611af1565b80600d60006101000a81548160ff02191690836004811115610ee557610ee4613b9c565b5b021790555050565b6000610ef88261225f565b600001519050919050565b610f0b611af1565b60005b82829050811015610fab576001600a6000858585818110610f3257610f31613bfa565b5b9050602002016020810190610f479190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610fa390613ac4565b915050610f0e565b505050565b600c8054610fbd90613a61565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe990613a61565b80156110365780601f1061100b57610100808354040283529160200191611036565b820191906000526020600020905b81548152906001019060200180831161101957829003601f168201915b505050505081565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61116c611af1565b61117660006124ee565b565b611180611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661120c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112039061370c565b60405180910390fd5b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61126f611af1565b60005b8282905081101561130f576000600a600085858581811061129657611295613bfa565b5b90506020020160208101906112ab9190613035565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061130790613ac4565b915050611272565b505050565b61131c611af1565b600360048111156113305761132f613b9c565b5b600d60009054906101000a900460ff16600481111561135257611351613b9c565b5b14611392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611389906137cc565b60405180910390fd5b6103e88161139e610c26565b6113a891906138cb565b11156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e09061372c565b60405180910390fd5b6113f38282612241565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461143090613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461145c90613a61565b80156114a95780601f1061147e576101008083540402835291602001916114a9565b820191906000526020600020905b81548152906001019060200180831161148c57829003601f168201915b5050505050905090565b600090565b600a6020528060005260406000206000915054906101000a900460ff1681565b6114e0611bbd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611545576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611552611bbd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115ff611bbd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116449190613674565b60405180910390a35050565b611658611af1565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161167e906135f8565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b5050905080611704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fb9061376c565b60405180910390fd5b50565b611712848484611c80565b6117318373ffffffffffffffffffffffffffffffffffffffff166125b4565b80156117465750611744848484846125d7565b155b1561177d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600d60009054906101000a900460ff1681565b60606004808111156117ab576117aa613b9c565b5b600d60009054906101000a900460ff1660048111156117cd576117cc613b9c565b5b1461186457600b80546117df90613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461180b90613a61565b80156118585780601f1061182d57610100808354040283529160200191611858565b820191906000526020600020905b81548152906001019060200180831161183b57829003601f168201915b50505050509050611870565b61186d82612737565b90505b919050565b60006103e8905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191b611af1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561198b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611982906136ec565b60405180910390fd5b611994816124ee565b50565b61199f611af1565b600a60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061374c565b60405180910390fd5b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611af9611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611b176113f7565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906137ac565b60405180910390fd5b565b600081611b7a611c77565b11158015611b89575060005482105b8015611bb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b6000611c8b8261225f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cb2611bbd565b73ffffffffffffffffffffffffffffffffffffffff161480611ce55750611ce48260000151611cdf611bbd565b61187f565b5b80611d2a5750611cf3611bbd565b73ffffffffffffffffffffffffffffffffffffffff16611d1284610a99565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611d63576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611dcc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e33576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e4085858560016127d6565b611e506000848460000151611bc5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612101576000548110156121005782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216a85858560016127dc565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121d9576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61225b8282604051806020016040528060008152506127e2565b5050565b612267612e3b565b600082905080612275611c77565b11158015612284575060005481105b156124b7576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516124b557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123995780925050506124e9565b5b6001156124b457818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124af5780925050506124e9565b61239a565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125fd611bbd565b8786866040518563ffffffff1660e01b815260040161261f9493929190613628565b602060405180830381600087803b15801561263957600080fd5b505af192505050801561266a57506040513d601f19601f820116820180604052508101906126679190613272565b60015b6126e4573d806000811461269a576040519150601f19603f3d011682016040523d82523d6000602084013e61269f565b606091505b506000815114156126dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061274282611b6f565b612778576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006127826127f4565b90506000815114156127a357604051806020016040528060008152506127ce565b806127ad84612886565b6040516020016127be9291906135c9565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6127ef83838360016129e7565b505050565b6060600c805461280390613a61565b80601f016020809104026020016040519081016040528092919081815260200182805461282f90613a61565b801561287c5780601f106128515761010080835404028352916020019161287c565b820191906000526020600020905b81548152906001019060200180831161285f57829003601f168201915b5050505050905090565b606060008214156128ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129e2565b600082905060005b600082146129005780806128e990613ac4565b915050600a826128f99190613921565b91506128d6565b60008167ffffffffffffffff81111561291c5761291b613c29565b5b6040519080825280601f01601f19166020018201604052801561294e5781602001600182028036833780820191505090505b5090505b600085146129db576001826129679190613952565b9150600a856129769190613b0d565b603061298291906138cb565b60f81b81838151811061299857612997613bfa565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129d49190613921565b9450612952565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a54576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612a8f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a9c60008683876127d6565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c665750612c658773ffffffffffffffffffffffffffffffffffffffff166125b4565b5b15612d2c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cdb60008884806001019550886125d7565b612d11576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c6c578260005414612d2757600080fd5b612d98565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d2d575b816000819055505050612dae60008683876127dc565b5050505050565b828054612dc190613a61565b90600052602060002090601f016020900481019282612de35760008555612e2a565b82601f10612dfc57803560ff1916838001178555612e2a565b82800160010185558215612e2a579182015b82811115612e29578235825591602001919060010190612e0e565b5b509050612e379190612e7e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612e97576000816000905550600101612e7f565b5090565b6000612eae612ea98461384c565b613827565b905082815260208101848484011115612eca57612ec9613c67565b5b612ed5848285613a1f565b509392505050565b600081359050612eec81613e87565b92915050565b60008083601f840112612f0857612f07613c5d565b5b8235905067ffffffffffffffff811115612f2557612f24613c58565b5b602083019150836020820283011115612f4157612f40613c62565b5b9250929050565b600081359050612f5781613e9e565b92915050565b600081359050612f6c81613eb5565b92915050565b600081519050612f8181613eb5565b92915050565b600082601f830112612f9c57612f9b613c5d565b5b8135612fac848260208601612e9b565b91505092915050565b600081359050612fc481613ecc565b92915050565b60008083601f840112612fe057612fdf613c5d565b5b8235905067ffffffffffffffff811115612ffd57612ffc613c58565b5b60208301915083600182028301111561301957613018613c62565b5b9250929050565b60008135905061302f81613edc565b92915050565b60006020828403121561304b5761304a613c71565b5b600061305984828501612edd565b91505092915050565b6000806040838503121561307957613078613c71565b5b600061308785828601612edd565b925050602061309885828601612edd565b9150509250929050565b6000806000606084860312156130bb576130ba613c71565b5b60006130c986828701612edd565b93505060206130da86828701612edd565b92505060406130eb86828701613020565b9150509250925092565b6000806000806080858703121561310f5761310e613c71565b5b600061311d87828801612edd565b945050602061312e87828801612edd565b935050604061313f87828801613020565b925050606085013567ffffffffffffffff8111156131605761315f613c6c565b5b61316c87828801612f87565b91505092959194509250565b6000806040838503121561318f5761318e613c71565b5b600061319d85828601612edd565b92505060206131ae85828601612f48565b9150509250929050565b600080604083850312156131cf576131ce613c71565b5b60006131dd85828601612edd565b92505060206131ee85828601613020565b9150509250929050565b6000806020838503121561320f5761320e613c71565b5b600083013567ffffffffffffffff81111561322d5761322c613c6c565b5b61323985828601612ef2565b92509250509250929050565b60006020828403121561325b5761325a613c71565b5b600061326984828501612f5d565b91505092915050565b60006020828403121561328857613287613c71565b5b600061329684828501612f72565b91505092915050565b6000602082840312156132b5576132b4613c71565b5b60006132c384828501612fb5565b91505092915050565b600080602083850312156132e3576132e2613c71565b5b600083013567ffffffffffffffff81111561330157613300613c6c565b5b61330d85828601612fca565b92509250509250929050565b60006020828403121561332f5761332e613c71565b5b600061333d84828501613020565b91505092915050565b61334f81613986565b82525050565b61335e81613998565b82525050565b600061336f8261387d565b6133798185613893565b9350613389818560208601613a2e565b61339281613c76565b840191505092915050565b6133a681613a0d565b82525050565b60006133b782613888565b6133c181856138af565b93506133d1818560208601613a2e565b6133da81613c76565b840191505092915050565b60006133f082613888565b6133fa81856138c0565b935061340a818560208601613a2e565b80840191505092915050565b6000613423600f836138af565b915061342e82613c87565b602082019050919050565b60006134466026836138af565b915061345182613cb0565b604082019050919050565b60006134696019836138af565b915061347482613cff565b602082019050919050565b600061348c6014836138af565b915061349782613d28565b602082019050919050565b60006134af6014836138af565b91506134ba82613d51565b602082019050919050565b60006134d26010836138af565b91506134dd82613d7a565b602082019050919050565b60006134f56010836138af565b915061350082613da3565b602082019050919050565b60006135186005836138c0565b915061352382613dcc565b600582019050919050565b600061353b6020836138af565b915061354682613df5565b602082019050919050565b600061355e6010836138af565b915061356982613e1e565b602082019050919050565b60006135816000836138a4565b915061358c82613e47565b600082019050919050565b60006135a46016836138af565b91506135af82613e4a565b602082019050919050565b6135c381613a03565b82525050565b60006135d582856133e5565b91506135e182846133e5565b91506135ec8261350b565b91508190509392505050565b600061360382613574565b9150819050919050565b60006020820190506136226000830184613346565b92915050565b600060808201905061363d6000830187613346565b61364a6020830186613346565b61365760408301856135ba565b81810360608301526136698184613364565b905095945050505050565b60006020820190506136896000830184613355565b92915050565b60006020820190506136a4600083018461339d565b92915050565b600060208201905081810360008301526136c481846133ac565b905092915050565b600060208201905081810360008301526136e581613416565b9050919050565b6000602082019050818103600083015261370581613439565b9050919050565b600060208201905081810360008301526137258161345c565b9050919050565b600060208201905081810360008301526137458161347f565b9050919050565b60006020820190508181036000830152613765816134a2565b9050919050565b60006020820190508181036000830152613785816134c5565b9050919050565b600060208201905081810360008301526137a5816134e8565b9050919050565b600060208201905081810360008301526137c58161352e565b9050919050565b600060208201905081810360008301526137e581613551565b9050919050565b6000602082019050818103600083015261380581613597565b9050919050565b600060208201905061382160008301846135ba565b92915050565b6000613831613842565b905061383d8282613a93565b919050565b6000604051905090565b600067ffffffffffffffff82111561386757613866613c29565b5b61387082613c76565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006138d682613a03565b91506138e183613a03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561391657613915613b3e565b5b828201905092915050565b600061392c82613a03565b915061393783613a03565b92508261394757613946613b6d565b5b828204905092915050565b600061395d82613a03565b915061396883613a03565b92508282101561397b5761397a613b3e565b5b828203905092915050565b6000613991826139e3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506139de82613e73565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613a18826139d0565b9050919050565b82818337600083830152505050565b60005b83811015613a4c578082015181840152602081019050613a31565b83811115613a5b576000848401525b50505050565b60006002820490506001821680613a7957607f821691505b60208210811415613a8d57613a8c613bcb565b5b50919050565b613a9c82613c76565b810181811067ffffffffffffffff82111715613abb57613aba613c29565b5b80604052505050565b6000613acf82613a03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b0257613b01613b3e565b5b600182019050919050565b6000613b1882613a03565b9150613b2383613a03565b925082613b3357613b32613b6d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e74204e6f74204163746976650000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f50726576696f7573206e6f7420696e2077686974656c69737400000000000000600082015250565b7f4d696e7420537570706c79204578636565646564000000000000000000000000600082015250565b7f416c726561647920696e2077686974656c697374000000000000000000000000600082015250565b7f5769746864726177206661696c65642e00000000000000000000000000000000600082015250565b7f4e6f7420696e2077686974656c69737400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d757374204e6f74204265204c69766500000000000000000000000000000000600082015250565b50565b7f45786365656473204d6178205065722057616c6c657400000000000000000000600082015250565b60058110613e8457613e83613b9c565b5b50565b613e9081613986565b8114613e9b57600080fd5b50565b613ea781613998565b8114613eb257600080fd5b50565b613ebe816139a4565b8114613ec957600080fd5b50565b60058110613ed957600080fd5b50565b613ee581613a03565b8114613ef057600080fd5b5056fea26469706673582212201fe368dcce0f4a37f499fd0d6f01568c08b479d0bab4a1376fc86cb8bcf8ba1e64736f6c63430008070033
Deployed Bytecode Sourcemap
55349:3465:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25815:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55753:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58300:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29202:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58404:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30714:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30277:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55515:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25064:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31571:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57195:498;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31812:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57081:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57977:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29011:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55957:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55845:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56734:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26184:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45762:103;;;;;;;;;;;;;:::i;:::-;;56547:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56158:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57701:268;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45114:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29371:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56868:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55558:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30990:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58631:178;;;;;;;;;;;;;:::i;:::-;;32068:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55873:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58070:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56976:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31340:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46020:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56366:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25815:305;25917:4;25969:25;25954:40;;;:11;:40;;;;:105;;;;26026:33;26011:48;;;:11;:48;;;;25954:105;:158;;;;26076:36;26100:11;26076:23;:36::i;:::-;25954:158;25934:178;;25815:305;;;:::o;55753:85::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58300:96::-;45000:13;:11;:13::i;:::-;58381:7:::1;;58371;:17;;;;;;;:::i;:::-;;58300:96:::0;;:::o;29202:100::-;29256:13;29289:5;29282:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29202:100;:::o;58404:111::-;45000:13;:11;:13::i;:::-;58500:7:::1;;58484:13;:23;;;;;;;:::i;:::-;;58404:111:::0;;:::o;30714:204::-;30782:7;30807:16;30815:7;30807;:16::i;:::-;30802:64;;30832:34;;;;;;;;;;;;;;30802:64;30886:15;:24;30902:7;30886:24;;;;;;;;;;;;;;;;;;;;;30879:31;;30714:204;;;:::o;30277:371::-;30350:13;30366:24;30382:7;30366:15;:24::i;:::-;30350:40;;30411:5;30405:11;;:2;:11;;;30401:48;;;30425:24;;;;;;;;;;;;;;30401:48;30482:5;30466:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;30492:37;30509:5;30516:12;:10;:12::i;:::-;30492:16;:37::i;:::-;30491:38;30466:63;30462:138;;;30553:35;;;;;;;;;;;;;;30462:138;30612:28;30621:2;30625:7;30634:5;30612:8;:28::i;:::-;30339:309;30277:371;;:::o;55515:34::-;;;;:::o;25064:303::-;25108:7;25333:15;:13;:15::i;:::-;25318:12;;25302:13;;:28;:46;25295:53;;25064:303;:::o;31571:170::-;31705:28;31715:4;31721:2;31725:7;31705:9;:28::i;:::-;31571:170;;;:::o;57195:498::-;57279:13;57270:22;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:22;;;;;;;;:::i;:::-;;;:51;;;;57305:16;57296:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;57270:51;57262:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57364:16;57355:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;57352:106;;;57404:9;:21;57414:10;57404:21;;;;;;;;;;;;;;;;;;;;;;;;;57396:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57352:106;55455:4;57492:9;57476:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;57468:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57600:15;;57587:9;57559:25;57573:10;57559:13;:25::i;:::-;:37;;;;:::i;:::-;:56;;57551:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57653:32;57663:10;57675:9;57653;:32::i;:::-;57195:498;:::o;31812:185::-;31950:39;31967:4;31973:2;31977:7;31950:39;;;;;;;;;;;;:16;:39::i;:::-;31812:185;;;:::o;57081:106::-;45000:13;:11;:13::i;:::-;57169:10:::1;57151:15;:28;;;;57081:106:::0;:::o;57977:85::-;45000:13;:11;:13::i;:::-;58048:6:::1;58040:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;57977:85:::0;:::o;29011:124::-;29075:7;29102:20;29114:7;29102:11;:20::i;:::-;:25;;;29095:32;;29011:124;;;:::o;55957:193::-;45000:13;:11;:13::i;:::-;56044:9:::1;56039:104;56063:9;;:16;;56059:1;:20;56039:104;;;56127:4;56101:9;:23;56111:9;;56121:1;56111:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56101:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;56081:3;;;;;:::i;:::-;;;;56039:104;;;;55957:193:::0;;:::o;55845:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56734:126::-;56796:17;56833:9;:19;56843:8;56833:19;;;;;;;;;;;;;;;;;;;;;;;;;56826:26;;56734:126;;;:::o;26184:206::-;26248:7;26289:1;26272:19;;:5;:19;;;26268:60;;;26300:28;;;;;;;;;;;;;;26268:60;26354:12;:19;26367:5;26354:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26346:36;;26339:43;;26184:206;;;:::o;45762:103::-;45000:13;:11;:13::i;:::-;45827:30:::1;45854:1;45827:18;:30::i;:::-;45762:103::o:0;56547:179::-;45000:13;:11;:13::i;:::-;56629:9:::1;:20;56639:9;56629:20;;;;;;;;;;;;;;;;;;;;;;;;;56621:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56713:5;56690:9;:20;56700:9;56690:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;56547:179:::0;:::o;56158:196::-;45000:13;:11;:13::i;:::-;56247:9:::1;56242:105;56266:9;;:16;;56262:1;:20;56242:105;;;56330:5;56304:9;:23;56314:9;;56324:1;56314:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56304:23;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;56284:3;;;;;:::i;:::-;;;;56242:105;;;;56158:196:::0;;:::o;57701:268::-;45000:13;:11;:13::i;:::-;57802:12:::1;57793:21;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:21;;;;;;;;:::i;:::-;;;57785:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55455:4;57870:9;57854:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;57846:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57931:30;57941:8;57951:9;57931;:30::i;:::-;57701:268:::0;;:::o;45114:87::-;45160:7;45187:6;;;;;;;;;;;45180:13;;45114:87;:::o;29371:104::-;29427:13;29460:7;29453:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29371:104;:::o;56868:100::-;56911:14;56868:100;:::o;55558:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;30990:279::-;31093:12;:10;:12::i;:::-;31081:24;;:8;:24;;;31077:54;;;31114:17;;;;;;;;;;;;;;31077:54;31189:8;31144:18;:32;31163:12;:10;:12::i;:::-;31144:32;;;;;;;;;;;;;;;:42;31177:8;31144:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31242:8;31213:48;;31228:12;:10;:12::i;:::-;31213:48;;;31252:8;31213:48;;;;;;:::i;:::-;;;;;;;;30990:279;;:::o;58631:178::-;45000:13;:11;:13::i;:::-;58687:12:::1;58705:10;:15;;58728:21;58705:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58686:68;;;58773:7;58765:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;58675:134;58631:178::o:0;32068:369::-;32235:28;32245:4;32251:2;32255:7;32235:9;:28::i;:::-;32278:15;:2;:13;;;:15::i;:::-;:76;;;;;32298:56;32329:4;32335:2;32339:7;32348:5;32298:30;:56::i;:::-;32297:57;32278:76;32274:156;;;32378:40;;;;;;;;;;;;;;32274:156;32068:369;;;;:::o;55873:19::-;;;;;;;;;;;;;:::o;58070:218::-;58135:13;58174:15;58165:24;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;;58161:77;;58213:13;58206:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58161:77;58257:23;58272:7;58257:14;:23::i;:::-;58250:30;;58070:218;;;;:::o;56976:97::-;57020:15;55455:4;57048:17;;56976:97;:::o;31340:164::-;31437:4;31461:18;:25;31480:5;31461:25;;;;;;;;;;;;;;;:35;31487:8;31461:35;;;;;;;;;;;;;;;;;;;;;;;;;31454:42;;31340:164;;;;:::o;46020:201::-;45000:13;:11;:13::i;:::-;46129:1:::1;46109:22;;:8;:22;;;;46101:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46185:28;46204:8;46185:18;:28::i;:::-;46020:201:::0;:::o;56366:171::-;45000:13;:11;:13::i;:::-;56446:9:::1;:20;56456:9;56446:20;;;;;;;;;;;;;;;;;;;;;;;;;56445:21;56437:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56525:4;56502:9;:20;56512:9;56502:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;56366:171:::0;:::o;21186:157::-;21271:4;21310:25;21295:40;;;:11;:40;;;;21288:47;;21186:157;;;:::o;45279:132::-;45354:12;:10;:12::i;:::-;45343:23;;:7;:5;:7::i;:::-;:23;;;45335:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45279:132::o;32692:187::-;32749:4;32792:7;32773:15;:13;:15::i;:::-;:26;;:53;;;;;32813:13;;32803:7;:23;32773:53;:98;;;;;32844:11;:20;32856:7;32844:20;;;;;;;;;;;:27;;;;;;;;;;;;32843:28;32773:98;32766:105;;32692:187;;;:::o;20107:98::-;20160:7;20187:10;20180:17;;20107:98;:::o;40303:196::-;40445:2;40418:15;:24;40434:7;40418:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40483:7;40479:2;40463:28;;40472:5;40463:28;;;;;;;;;;;;40303:196;;;:::o;24788:92::-;24844:7;24871:1;24864:8;;24788:92;:::o;35805:2112::-;35920:35;35958:20;35970:7;35958:11;:20::i;:::-;35920:58;;35991:22;36033:13;:18;;;36017:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;36068:50;36085:13;:18;;;36105:12;:10;:12::i;:::-;36068:16;:50::i;:::-;36017:101;:154;;;;36159:12;:10;:12::i;:::-;36135:36;;:20;36147:7;36135:11;:20::i;:::-;:36;;;36017:154;35991:181;;36190:17;36185:66;;36216:35;;;;;;;;;;;;;;36185:66;36288:4;36266:26;;:13;:18;;;:26;;;36262:67;;36301:28;;;;;;;;;;;;;;36262:67;36358:1;36344:16;;:2;:16;;;36340:52;;;36369:23;;;;;;;;;;;;;;36340:52;36405:43;36427:4;36433:2;36437:7;36446:1;36405:21;:43::i;:::-;36513:49;36530:1;36534:7;36543:13;:18;;;36513:8;:49::i;:::-;36888:1;36858:12;:18;36871:4;36858:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36932:1;36904:12;:16;36917:2;36904:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36978:2;36950:11;:20;36962:7;36950:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;37040:15;36995:11;:20;37007:7;36995:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;37308:19;37340:1;37330:7;:11;37308:33;;37401:1;37360:43;;:11;:24;37372:11;37360:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;37356:445;;;37585:13;;37571:11;:27;37567:219;;;37655:13;:18;;;37623:11;:24;37635:11;37623:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37738:13;:28;;;37696:11;:24;37708:11;37696:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37567:219;37356:445;36833:979;37848:7;37844:2;37829:27;;37838:4;37829:27;;;;;;;;;;;;37867:42;37888:4;37894:2;37898:7;37907:1;37867:20;:42::i;:::-;35909:2008;;35805:2112;;;:::o;26472:207::-;26533:7;26574:1;26557:19;;:5;:19;;;26553:59;;;26585:27;;;;;;;;;;;;;;26553:59;26638:12;:19;26651:5;26638:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;26630:41;;26623:48;;26472:207;;;:::o;32887:104::-;32956:27;32966:2;32970:8;32956:27;;;;;;;;;;;;:9;:27::i;:::-;32887:104;;:::o;27841:1108::-;27902:21;;:::i;:::-;27936:12;27951:7;27936:22;;28019:4;28000:15;:13;:15::i;:::-;:23;;:47;;;;;28034:13;;28027:4;:20;28000:47;27996:886;;;28068:31;28102:11;:17;28114:4;28102:17;;;;;;;;;;;28068:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28143:9;:16;;;28138:729;;28214:1;28188:28;;:9;:14;;;:28;;;28184:101;;28252:9;28245:16;;;;;;28184:101;28587:261;28594:4;28587:261;;;28627:6;;;;;;;;28672:11;:17;28684:4;28672:17;;;;;;;;;;;28660:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28746:1;28720:28;;:9;:14;;;:28;;;28716:109;;28788:9;28781:16;;;;;;28716:109;28587:261;;;28138:729;28049:833;27996:886;28910:31;;;;;;;;;;;;;;27841:1108;;;;:::o;46381:191::-;46455:16;46474:6;;;;;;;;;;;46455:25;;46500:8;46491:6;;:17;;;;;;;;;;;;;;;;;;46555:8;46524:40;;46545:8;46524:40;;;;;;;;;;;;46444:128;46381:191;:::o;12104:326::-;12164:4;12421:1;12399:7;:19;;;:23;12392:30;;12104:326;;;:::o;40991:667::-;41154:4;41191:2;41175:36;;;41212:12;:10;:12::i;:::-;41226:4;41232:7;41241:5;41175:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41171:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41426:1;41409:6;:13;:18;41405:235;;;41455:40;;;;;;;;;;;;;;41405:235;41598:6;41592:13;41583:6;41579:2;41575:15;41568:38;41171:480;41304:45;;;41294:55;;;:6;:55;;;;41287:62;;;40991:667;;;;;;:::o;29546:327::-;29619:13;29650:16;29658:7;29650;:16::i;:::-;29645:59;;29675:29;;;;;;;;;;;;;;29645:59;29717:21;29741:10;:8;:10::i;:::-;29717:34;;29794:1;29775:7;29769:21;:26;;:96;;;;;;;;;;;;;;;;;29822:7;29831:18;:7;:16;:18::i;:::-;29805:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29769:96;29762:103;;;29546:327;;;:::o;42306:159::-;;;;;:::o;43124:158::-;;;;;:::o;33354:163::-;33477:32;33483:2;33487:8;33497:5;33504:4;33477:5;:32::i;:::-;33354:163;;;:::o;58523:100::-;58575:13;58608:7;58601:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58523:100;:::o;356:723::-;412:13;642:1;633:5;:10;629:53;;;660:10;;;;;;;;;;;;;;;;;;;;;629:53;692:12;707:5;692:20;;723:14;748:78;763:1;755:4;:9;748:78;;781:8;;;;;:::i;:::-;;;;812:2;804:10;;;;;:::i;:::-;;;748:78;;;836:19;868:6;858:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;836:39;;886:154;902:1;893:5;:10;886:154;;930:1;920:11;;;;;:::i;:::-;;;997:2;989:5;:10;;;;:::i;:::-;976:2;:24;;;;:::i;:::-;963:39;;946:6;953;946:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1026:2;1017:11;;;;;:::i;:::-;;;886:154;;;1064:6;1050:21;;;;;356:723;;;;:::o;33776:1775::-;33915:20;33938:13;;33915:36;;33980:1;33966:16;;:2;:16;;;33962:48;;;33991:19;;;;;;;;;;;;;;33962:48;34037:1;34025:8;:13;34021:44;;;34047:18;;;;;;;;;;;;;;34021:44;34078:61;34108:1;34112:2;34116:12;34130:8;34078:21;:61::i;:::-;34451:8;34416:12;:16;34429:2;34416:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34515:8;34475:12;:16;34488:2;34475:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34574:2;34541:11;:25;34553:12;34541:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34641:15;34591:11;:25;34603:12;34591:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34674:20;34697:12;34674:35;;34724:11;34753:8;34738:12;:23;34724:37;;34782:4;:23;;;;;34790:15;:2;:13;;;:15::i;:::-;34782:23;34778:641;;;34826:314;34882:12;34878:2;34857:38;;34874:1;34857:38;;;;;;;;;;;;34923:69;34962:1;34966:2;34970:14;;;;;;34986:5;34923:30;:69::i;:::-;34918:174;;35028:40;;;;;;;;;;;;;;34918:174;35135:3;35119:12;:19;;34826:314;;35221:12;35204:13;;:29;35200:43;;35235:8;;;35200:43;34778:641;;;35284:120;35340:14;;;;;;35336:2;35315:40;;35332:1;35315:40;;;;;;;;;;;;35399:3;35383:12;:19;;35284:120;;34778:641;35449:12;35433:13;:28;;;;34391:1082;;35483:60;35512:1;35516:2;35520:12;35534:8;35483:20;:60::i;:::-;33904:1647;33776:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:137::-;1343:5;1381:6;1368:20;1359:29;;1397:32;1423:5;1397:32;:::i;:::-;1298:137;;;;:::o;1441:141::-;1497:5;1528:6;1522:13;1513:22;;1544:32;1570:5;1544:32;:::i;:::-;1441:141;;;;:::o;1601:338::-;1656:5;1705:3;1698:4;1690:6;1686:17;1682:27;1672:122;;1713:79;;:::i;:::-;1672:122;1830:6;1817:20;1855:78;1929:3;1921:6;1914:4;1906:6;1902:17;1855:78;:::i;:::-;1846:87;;1662:277;1601:338;;;;:::o;1945:161::-;2002:5;2040:6;2027:20;2018:29;;2056:44;2094:5;2056:44;:::i;:::-;1945:161;;;;:::o;2126:553::-;2184:8;2194:6;2244:3;2237:4;2229:6;2225:17;2221:27;2211:122;;2252:79;;:::i;:::-;2211:122;2365:6;2352:20;2342:30;;2395:18;2387:6;2384:30;2381:117;;;2417:79;;:::i;:::-;2381:117;2531:4;2523:6;2519:17;2507:29;;2585:3;2577:4;2569:6;2565:17;2555:8;2551:32;2548:41;2545:128;;;2592:79;;:::i;:::-;2545:128;2126:553;;;;;:::o;2685:139::-;2731:5;2769:6;2756:20;2747:29;;2785:33;2812:5;2785:33;:::i;:::-;2685:139;;;;:::o;2830:329::-;2889:6;2938:2;2926:9;2917:7;2913:23;2909:32;2906:119;;;2944:79;;:::i;:::-;2906:119;3064:1;3089:53;3134:7;3125:6;3114:9;3110:22;3089:53;:::i;:::-;3079:63;;3035:117;2830:329;;;;:::o;3165:474::-;3233:6;3241;3290:2;3278:9;3269:7;3265:23;3261:32;3258:119;;;3296:79;;:::i;:::-;3258:119;3416:1;3441:53;3486:7;3477:6;3466:9;3462:22;3441:53;:::i;:::-;3431:63;;3387:117;3543:2;3569:53;3614:7;3605:6;3594:9;3590:22;3569:53;:::i;:::-;3559:63;;3514:118;3165:474;;;;;:::o;3645:619::-;3722:6;3730;3738;3787:2;3775:9;3766:7;3762:23;3758:32;3755:119;;;3793:79;;:::i;:::-;3755:119;3913:1;3938:53;3983:7;3974:6;3963:9;3959:22;3938:53;:::i;:::-;3928:63;;3884:117;4040:2;4066:53;4111:7;4102:6;4091:9;4087:22;4066:53;:::i;:::-;4056:63;;4011:118;4168:2;4194:53;4239:7;4230:6;4219:9;4215:22;4194:53;:::i;:::-;4184:63;;4139:118;3645:619;;;;;:::o;4270:943::-;4365:6;4373;4381;4389;4438:3;4426:9;4417:7;4413:23;4409:33;4406:120;;;4445:79;;:::i;:::-;4406:120;4565:1;4590:53;4635:7;4626:6;4615:9;4611:22;4590:53;:::i;:::-;4580:63;;4536:117;4692:2;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4663:118;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4976:2;4965:9;4961:18;4948:32;5007:18;4999:6;4996:30;4993:117;;;5029:79;;:::i;:::-;4993:117;5134:62;5188:7;5179:6;5168:9;5164:22;5134:62;:::i;:::-;5124:72;;4919:287;4270:943;;;;;;;:::o;5219:468::-;5284:6;5292;5341:2;5329:9;5320:7;5316:23;5312:32;5309:119;;;5347:79;;:::i;:::-;5309:119;5467:1;5492:53;5537:7;5528:6;5517:9;5513:22;5492:53;:::i;:::-;5482:63;;5438:117;5594:2;5620:50;5662:7;5653:6;5642:9;5638:22;5620:50;:::i;:::-;5610:60;;5565:115;5219:468;;;;;:::o;5693:474::-;5761:6;5769;5818:2;5806:9;5797:7;5793:23;5789:32;5786:119;;;5824:79;;:::i;:::-;5786:119;5944:1;5969:53;6014:7;6005:6;5994:9;5990:22;5969:53;:::i;:::-;5959:63;;5915:117;6071:2;6097:53;6142:7;6133:6;6122:9;6118:22;6097:53;:::i;:::-;6087:63;;6042:118;5693:474;;;;;:::o;6173:559::-;6259:6;6267;6316:2;6304:9;6295:7;6291:23;6287:32;6284:119;;;6322:79;;:::i;:::-;6284:119;6470:1;6459:9;6455:17;6442:31;6500:18;6492:6;6489:30;6486:117;;;6522:79;;:::i;:::-;6486:117;6635:80;6707:7;6698:6;6687:9;6683:22;6635:80;:::i;:::-;6617:98;;;;6413:312;6173:559;;;;;:::o;6738:327::-;6796:6;6845:2;6833:9;6824:7;6820:23;6816:32;6813:119;;;6851:79;;:::i;:::-;6813:119;6971:1;6996:52;7040:7;7031:6;7020:9;7016:22;6996:52;:::i;:::-;6986:62;;6942:116;6738:327;;;;:::o;7071:349::-;7140:6;7189:2;7177:9;7168:7;7164:23;7160:32;7157:119;;;7195:79;;:::i;:::-;7157:119;7315:1;7340:63;7395:7;7386:6;7375:9;7371:22;7340:63;:::i;:::-;7330:73;;7286:127;7071:349;;;;:::o;7426:351::-;7496:6;7545:2;7533:9;7524:7;7520:23;7516:32;7513:119;;;7551:79;;:::i;:::-;7513:119;7671:1;7696:64;7752:7;7743:6;7732:9;7728:22;7696:64;:::i;:::-;7686:74;;7642:128;7426:351;;;;:::o;7783:529::-;7854:6;7862;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8230:65;8287:7;8278:6;8267:9;8263:22;8230:65;:::i;:::-;8212:83;;;;8008:297;7783:529;;;;;:::o;8318:329::-;8377:6;8426:2;8414:9;8405:7;8401:23;8397:32;8394:119;;;8432:79;;:::i;:::-;8394:119;8552:1;8577:53;8622:7;8613:6;8602:9;8598:22;8577:53;:::i;:::-;8567:63;;8523:117;8318:329;;;;:::o;8653:118::-;8740:24;8758:5;8740:24;:::i;:::-;8735:3;8728:37;8653:118;;:::o;8777:109::-;8858:21;8873:5;8858:21;:::i;:::-;8853:3;8846:34;8777:109;;:::o;8892:360::-;8978:3;9006:38;9038:5;9006:38;:::i;:::-;9060:70;9123:6;9118:3;9060:70;:::i;:::-;9053:77;;9139:52;9184:6;9179:3;9172:4;9165:5;9161:16;9139:52;:::i;:::-;9216:29;9238:6;9216:29;:::i;:::-;9211:3;9207:39;9200:46;;8982:270;8892:360;;;;:::o;9258:149::-;9354:46;9394:5;9354:46;:::i;:::-;9349:3;9342:59;9258:149;;:::o;9413:364::-;9501:3;9529:39;9562:5;9529:39;:::i;:::-;9584:71;9648:6;9643:3;9584:71;:::i;:::-;9577:78;;9664:52;9709:6;9704:3;9697:4;9690:5;9686:16;9664:52;:::i;:::-;9741:29;9763:6;9741:29;:::i;:::-;9736:3;9732:39;9725:46;;9505:272;9413:364;;;;:::o;9783:377::-;9889:3;9917:39;9950:5;9917:39;:::i;:::-;9972:89;10054:6;10049:3;9972:89;:::i;:::-;9965:96;;10070:52;10115:6;10110:3;10103:4;10096:5;10092:16;10070:52;:::i;:::-;10147:6;10142:3;10138:16;10131:23;;9893:267;9783:377;;;;:::o;10166:366::-;10308:3;10329:67;10393:2;10388:3;10329:67;:::i;:::-;10322:74;;10405:93;10494:3;10405:93;:::i;:::-;10523:2;10518:3;10514:12;10507:19;;10166:366;;;:::o;10538:::-;10680:3;10701:67;10765:2;10760:3;10701:67;:::i;:::-;10694:74;;10777:93;10866:3;10777:93;:::i;:::-;10895:2;10890:3;10886:12;10879:19;;10538:366;;;:::o;10910:::-;11052:3;11073:67;11137:2;11132:3;11073:67;:::i;:::-;11066:74;;11149:93;11238:3;11149:93;:::i;:::-;11267:2;11262:3;11258:12;11251:19;;10910:366;;;:::o;11282:::-;11424:3;11445:67;11509:2;11504:3;11445:67;:::i;:::-;11438:74;;11521:93;11610:3;11521:93;:::i;:::-;11639:2;11634:3;11630:12;11623:19;;11282:366;;;:::o;11654:::-;11796:3;11817:67;11881:2;11876:3;11817:67;:::i;:::-;11810:74;;11893:93;11982:3;11893:93;:::i;:::-;12011:2;12006:3;12002:12;11995:19;;11654:366;;;:::o;12026:::-;12168:3;12189:67;12253:2;12248:3;12189:67;:::i;:::-;12182:74;;12265:93;12354:3;12265:93;:::i;:::-;12383:2;12378:3;12374:12;12367:19;;12026:366;;;:::o;12398:::-;12540:3;12561:67;12625:2;12620:3;12561:67;:::i;:::-;12554:74;;12637:93;12726:3;12637:93;:::i;:::-;12755:2;12750:3;12746:12;12739:19;;12398:366;;;:::o;12770:400::-;12930:3;12951:84;13033:1;13028:3;12951:84;:::i;:::-;12944:91;;13044:93;13133:3;13044:93;:::i;:::-;13162:1;13157:3;13153:11;13146:18;;12770:400;;;:::o;13176:366::-;13318:3;13339:67;13403:2;13398:3;13339:67;:::i;:::-;13332:74;;13415:93;13504:3;13415:93;:::i;:::-;13533:2;13528:3;13524:12;13517:19;;13176:366;;;:::o;13548:::-;13690:3;13711:67;13775:2;13770:3;13711:67;:::i;:::-;13704:74;;13787:93;13876:3;13787:93;:::i;:::-;13905:2;13900:3;13896:12;13889:19;;13548:366;;;:::o;13920:398::-;14079:3;14100:83;14181:1;14176:3;14100:83;:::i;:::-;14093:90;;14192:93;14281:3;14192:93;:::i;:::-;14310:1;14305:3;14301:11;14294:18;;13920:398;;;:::o;14324:366::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:118::-;14783:24;14801:5;14783:24;:::i;:::-;14778:3;14771:37;14696:118;;:::o;14820:701::-;15101:3;15123:95;15214:3;15205:6;15123:95;:::i;:::-;15116:102;;15235:95;15326:3;15317:6;15235:95;:::i;:::-;15228:102;;15347:148;15491:3;15347:148;:::i;:::-;15340:155;;15512:3;15505:10;;14820:701;;;;;:::o;15527:379::-;15711:3;15733:147;15876:3;15733:147;:::i;:::-;15726:154;;15897:3;15890:10;;15527:379;;;:::o;15912:222::-;16005:4;16043:2;16032:9;16028:18;16020:26;;16056:71;16124:1;16113:9;16109:17;16100:6;16056:71;:::i;:::-;15912:222;;;;:::o;16140:640::-;16335:4;16373:3;16362:9;16358:19;16350:27;;16387:71;16455:1;16444:9;16440:17;16431:6;16387:71;:::i;:::-;16468:72;16536:2;16525:9;16521:18;16512:6;16468:72;:::i;:::-;16550;16618:2;16607:9;16603:18;16594:6;16550:72;:::i;:::-;16669:9;16663:4;16659:20;16654:2;16643:9;16639:18;16632:48;16697:76;16768:4;16759:6;16697:76;:::i;:::-;16689:84;;16140:640;;;;;;;:::o;16786:210::-;16873:4;16911:2;16900:9;16896:18;16888:26;;16924:65;16986:1;16975:9;16971:17;16962:6;16924:65;:::i;:::-;16786:210;;;;:::o;17002:240::-;17104:4;17142:2;17131:9;17127:18;17119:26;;17155:80;17232:1;17221:9;17217:17;17208:6;17155:80;:::i;:::-;17002:240;;;;:::o;17248:313::-;17361:4;17399:2;17388:9;17384:18;17376:26;;17448:9;17442:4;17438:20;17434:1;17423:9;17419:17;17412:47;17476:78;17549:4;17540:6;17476:78;:::i;:::-;17468:86;;17248:313;;;;:::o;17567:419::-;17733:4;17771:2;17760:9;17756:18;17748:26;;17820:9;17814:4;17810:20;17806:1;17795:9;17791:17;17784:47;17848:131;17974:4;17848:131;:::i;:::-;17840:139;;17567:419;;;:::o;17992:::-;18158:4;18196:2;18185:9;18181:18;18173:26;;18245:9;18239:4;18235:20;18231:1;18220:9;18216:17;18209:47;18273:131;18399:4;18273:131;:::i;:::-;18265:139;;17992:419;;;:::o;18417:::-;18583:4;18621:2;18610:9;18606:18;18598:26;;18670:9;18664:4;18660:20;18656:1;18645:9;18641:17;18634:47;18698:131;18824:4;18698:131;:::i;:::-;18690:139;;18417:419;;;:::o;18842:::-;19008:4;19046:2;19035:9;19031:18;19023:26;;19095:9;19089:4;19085:20;19081:1;19070:9;19066:17;19059:47;19123:131;19249:4;19123:131;:::i;:::-;19115:139;;18842:419;;;:::o;19267:::-;19433:4;19471:2;19460:9;19456:18;19448:26;;19520:9;19514:4;19510:20;19506:1;19495:9;19491:17;19484:47;19548:131;19674:4;19548:131;:::i;:::-;19540:139;;19267:419;;;:::o;19692:::-;19858:4;19896:2;19885:9;19881:18;19873:26;;19945:9;19939:4;19935:20;19931:1;19920:9;19916:17;19909:47;19973:131;20099:4;19973:131;:::i;:::-;19965:139;;19692:419;;;:::o;20117:::-;20283:4;20321:2;20310:9;20306:18;20298:26;;20370:9;20364:4;20360:20;20356:1;20345:9;20341:17;20334:47;20398:131;20524:4;20398:131;:::i;:::-;20390:139;;20117:419;;;:::o;20542:::-;20708:4;20746:2;20735:9;20731:18;20723:26;;20795:9;20789:4;20785:20;20781:1;20770:9;20766:17;20759:47;20823:131;20949:4;20823:131;:::i;:::-;20815:139;;20542:419;;;:::o;20967:::-;21133:4;21171:2;21160:9;21156:18;21148:26;;21220:9;21214:4;21210:20;21206:1;21195:9;21191:17;21184:47;21248:131;21374:4;21248:131;:::i;:::-;21240:139;;20967:419;;;:::o;21392:::-;21558:4;21596:2;21585:9;21581:18;21573:26;;21645:9;21639:4;21635:20;21631:1;21620:9;21616:17;21609:47;21673:131;21799:4;21673:131;:::i;:::-;21665:139;;21392:419;;;:::o;21817:222::-;21910:4;21948:2;21937:9;21933:18;21925:26;;21961:71;22029:1;22018:9;22014:17;22005:6;21961:71;:::i;:::-;21817:222;;;;:::o;22045:129::-;22079:6;22106:20;;:::i;:::-;22096:30;;22135:33;22163:4;22155:6;22135:33;:::i;:::-;22045:129;;;:::o;22180:75::-;22213:6;22246:2;22240:9;22230:19;;22180:75;:::o;22261:307::-;22322:4;22412:18;22404:6;22401:30;22398:56;;;22434:18;;:::i;:::-;22398:56;22472:29;22494:6;22472:29;:::i;:::-;22464:37;;22556:4;22550;22546:15;22538:23;;22261:307;;;:::o;22574:98::-;22625:6;22659:5;22653:12;22643:22;;22574:98;;;:::o;22678:99::-;22730:6;22764:5;22758:12;22748:22;;22678:99;;;:::o;22783:168::-;22866:11;22900:6;22895:3;22888:19;22940:4;22935:3;22931:14;22916:29;;22783:168;;;;:::o;22957:147::-;23058:11;23095:3;23080:18;;22957:147;;;;:::o;23110:169::-;23194:11;23228:6;23223:3;23216:19;23268:4;23263:3;23259:14;23244:29;;23110:169;;;;:::o;23285:148::-;23387:11;23424:3;23409:18;;23285:148;;;;:::o;23439:305::-;23479:3;23498:20;23516:1;23498:20;:::i;:::-;23493:25;;23532:20;23550:1;23532:20;:::i;:::-;23527:25;;23686:1;23618:66;23614:74;23611:1;23608:81;23605:107;;;23692:18;;:::i;:::-;23605:107;23736:1;23733;23729:9;23722:16;;23439:305;;;;:::o;23750:185::-;23790:1;23807:20;23825:1;23807:20;:::i;:::-;23802:25;;23841:20;23859:1;23841:20;:::i;:::-;23836:25;;23880:1;23870:35;;23885:18;;:::i;:::-;23870:35;23927:1;23924;23920:9;23915:14;;23750:185;;;;:::o;23941:191::-;23981:4;24001:20;24019:1;24001:20;:::i;:::-;23996:25;;24035:20;24053:1;24035:20;:::i;:::-;24030:25;;24074:1;24071;24068:8;24065:34;;;24079:18;;:::i;:::-;24065:34;24124:1;24121;24117:9;24109:17;;23941:191;;;;:::o;24138:96::-;24175:7;24204:24;24222:5;24204:24;:::i;:::-;24193:35;;24138:96;;;:::o;24240:90::-;24274:7;24317:5;24310:13;24303:21;24292:32;;24240:90;;;:::o;24336:149::-;24372:7;24412:66;24405:5;24401:78;24390:89;;24336:149;;;:::o;24491:133::-;24539:7;24568:5;24557:16;;24574:44;24612:5;24574:44;:::i;:::-;24491:133;;;:::o;24630:126::-;24667:7;24707:42;24700:5;24696:54;24685:65;;24630:126;;;:::o;24762:77::-;24799:7;24828:5;24817:16;;24762:77;;;:::o;24845:133::-;24904:9;24937:35;24966:5;24937:35;:::i;:::-;24924:48;;24845:133;;;:::o;24984:154::-;25068:6;25063:3;25058;25045:30;25130:1;25121:6;25116:3;25112:16;25105:27;24984:154;;;:::o;25144:307::-;25212:1;25222:113;25236:6;25233:1;25230:13;25222:113;;;25321:1;25316:3;25312:11;25306:18;25302:1;25297:3;25293:11;25286:39;25258:2;25255:1;25251:10;25246:15;;25222:113;;;25353:6;25350:1;25347:13;25344:101;;;25433:1;25424:6;25419:3;25415:16;25408:27;25344:101;25193:258;25144:307;;;:::o;25457:320::-;25501:6;25538:1;25532:4;25528:12;25518:22;;25585:1;25579:4;25575:12;25606:18;25596:81;;25662:4;25654:6;25650:17;25640:27;;25596:81;25724:2;25716:6;25713:14;25693:18;25690:38;25687:84;;;25743:18;;:::i;:::-;25687:84;25508:269;25457:320;;;:::o;25783:281::-;25866:27;25888:4;25866:27;:::i;:::-;25858:6;25854:40;25996:6;25984:10;25981:22;25960:18;25948:10;25945:34;25942:62;25939:88;;;26007:18;;:::i;:::-;25939:88;26047:10;26043:2;26036:22;25826:238;25783:281;;:::o;26070:233::-;26109:3;26132:24;26150:5;26132:24;:::i;:::-;26123:33;;26178:66;26171:5;26168:77;26165:103;;;26248:18;;:::i;:::-;26165:103;26295:1;26288:5;26284:13;26277:20;;26070:233;;;:::o;26309:176::-;26341:1;26358:20;26376:1;26358:20;:::i;:::-;26353:25;;26392:20;26410:1;26392:20;:::i;:::-;26387:25;;26431:1;26421:35;;26436:18;;:::i;:::-;26421:35;26477:1;26474;26470:9;26465:14;;26309:176;;;;:::o;26491:180::-;26539:77;26536:1;26529:88;26636:4;26633:1;26626:15;26660:4;26657:1;26650:15;26677:180;26725:77;26722:1;26715:88;26822:4;26819:1;26812:15;26846:4;26843:1;26836:15;26863:180;26911:77;26908:1;26901:88;27008:4;27005:1;26998:15;27032:4;27029:1;27022:15;27049:180;27097:77;27094:1;27087:88;27194:4;27191:1;27184:15;27218:4;27215:1;27208:15;27235:180;27283:77;27280:1;27273:88;27380:4;27377:1;27370:15;27404:4;27401:1;27394:15;27421:180;27469:77;27466:1;27459:88;27566:4;27563:1;27556:15;27590:4;27587:1;27580:15;27607:117;27716:1;27713;27706:12;27730:117;27839:1;27836;27829:12;27853:117;27962:1;27959;27952:12;27976:117;28085:1;28082;28075:12;28099:117;28208:1;28205;28198:12;28222:117;28331:1;28328;28321:12;28345:102;28386:6;28437:2;28433:7;28428:2;28421:5;28417:14;28413:28;28403:38;;28345:102;;;:::o;28453:165::-;28593:17;28589:1;28581:6;28577:14;28570:41;28453:165;:::o;28624:225::-;28764:34;28760:1;28752:6;28748:14;28741:58;28833:8;28828:2;28820:6;28816:15;28809:33;28624:225;:::o;28855:175::-;28995:27;28991:1;28983:6;28979:14;28972:51;28855:175;:::o;29036:170::-;29176:22;29172:1;29164:6;29160:14;29153:46;29036:170;:::o;29212:::-;29352:22;29348:1;29340:6;29336:14;29329:46;29212:170;:::o;29388:166::-;29528:18;29524:1;29516:6;29512:14;29505:42;29388:166;:::o;29560:::-;29700:18;29696:1;29688:6;29684:14;29677:42;29560:166;:::o;29732:155::-;29872:7;29868:1;29860:6;29856:14;29849:31;29732:155;:::o;29893:182::-;30033:34;30029:1;30021:6;30017:14;30010:58;29893:182;:::o;30081:166::-;30221:18;30217:1;30209:6;30205:14;30198:42;30081:166;:::o;30253:114::-;;:::o;30373:172::-;30513:24;30509:1;30501:6;30497:14;30490:48;30373:172;:::o;30551:116::-;30635:1;30628:5;30625:12;30615:46;;30641:18;;:::i;:::-;30615:46;30551:116;:::o;30673:122::-;30746:24;30764:5;30746:24;:::i;:::-;30739:5;30736:35;30726:63;;30785:1;30782;30775:12;30726:63;30673:122;:::o;30801:116::-;30871:21;30886:5;30871:21;:::i;:::-;30864:5;30861:32;30851:60;;30907:1;30904;30897:12;30851:60;30801:116;:::o;30923:120::-;30995:23;31012:5;30995:23;:::i;:::-;30988:5;30985:34;30975:62;;31033:1;31030;31023:12;30975:62;30923:120;:::o;31049:110::-;31133:1;31126:5;31123:12;31113:40;;31149:1;31146;31139:12;31113:40;31049:110;:::o;31165:122::-;31238:24;31256:5;31238:24;:::i;:::-;31231:5;31228:35;31218:63;;31277:1;31274;31267:12;31218:63;31165:122;:::o
Swarm Source
ipfs://1fe368dcce0f4a37f499fd0d6f01568c08b479d0bab4a1376fc86cb8bcf8ba1e
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.