Feature Tip: Add private address tag to any address under My Name Tag !
Overview
TokenID
5937
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EyeStar
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "@openzeppelin/[email protected]/utils/Strings.sol"; import "@openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/[email protected]/access/Ownable.sol"; contract EyeStar is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public constant NFT_MAX = 7210; uint256 public NORMAL_MINT = 5; uint256 public leftAmountMinted = 1; uint256 public rightAmountMinted = 7210; mapping(address => uint256) public purchases; bool public sellLive; bool public boxLive; bool public locked; string private _tokenBaseURI = "https://eyestars.io/metadata/"; string private _tokenBoxURI = "https://gateway.pinata.cloud/ipfs/QmVmmbLya3cgUvvWywxnMJs1nJoEwvDzS6JfBb4eNEQ7JV"; constructor() ERC721("eyeStar", "EYESTAR") { _mintToken(msg.sender); } modifier notLocked() { require(!locked, "Contract metadata methods are locked"); _; } function lockMetadata() external onlyOwner { locked = true; } function setTokenBaseURI(string calldata URI) external onlyOwner notLocked { _tokenBaseURI = URI; } function setTokenBoxURI(string calldata URI) external onlyOwner notLocked { _tokenBoxURI = URI; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "NULL_ADDRESS"); if(!boxLive){ return _tokenBoxURI; } return string( abi.encodePacked(_tokenBaseURI, tokenId.toString(), ".json") ); } function setMintNum(uint256 amount) external onlyOwner { NORMAL_MINT = amount; } function toggleSellLive() external onlyOwner { sellLive = !sellLive; } function toggleboxLive() external onlyOwner { boxLive = !boxLive; } function gmint(address[] calldata _recipients) external onlyOwner { uint256 recipients = _recipients.length; require( recipients + totalSupply() <= NFT_MAX, "EXCEED_ALLOC" ); for (uint256 i = 0; i < recipients; i++) { _mintToken(_recipients[i]); } } function mint( uint256 quantity ) external payable { uint256 newTotel = totalSupply() + quantity; require(sellLive, "SALE_CLOSED"); require(totalSupply() < NFT_MAX, "OUT_OF_STOCK"); require(newTotel <= NFT_MAX,"OUT_OF_STOCK"); require(purchases[msg.sender] + quantity <= NORMAL_MINT, "EXCEED_ALLOC"); uint256 price; if(newTotel>721 && newTotel<=1500){ price = 20000000000000000; //0.02 }else if(newTotel>1500 && newTotel<=3000){ price = 40000000000000000; //0.04 }else if(newTotel>3000){ price = 72100000000000000; //0.0721 } require(quantity * price <= msg.value, "INSUFFICIENT_ETH"); for (uint256 i = 0; i < quantity; i++) { _mintToken(msg.sender); purchases[msg.sender]++; } } function _mintToken(address sender) private { if(totalSupply() % 2 == 0){ _safeMint(sender,leftAmountMinted); leftAmountMinted = leftAmountMinted +1; } else { _safeMint(sender,rightAmountMinted); rightAmountMinted = rightAmountMinted-1; } } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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 tokenId); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // 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; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @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 virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @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 virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @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 { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * 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 ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a 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 _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * 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, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"NFT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NORMAL_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boxLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"}],"name":"gmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftAmountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rightAmountMinted","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":"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":[],"name":"sellLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"amount","type":"uint256"}],"name":"setMintNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setTokenBoxURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSellLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleboxLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6005600b556001600c55611c2a600d5560c0604052601d60808190527f68747470733a2f2f65796573746172732e696f2f6d657461646174612f00000060a090815262000050916010919062000878565b506040518060800160405280605081526020016200318b605091398051620000819160119160209091019062000878565b503480156200008f57600080fd5b506040518060400160405280600781526020016632bcb2a9ba30b960c91b8152506040518060400160405280600781526020016622aca2a9aa20a960c91b8152508160009080519060200190620000e892919062000878565b508051620000fe90600190602084019062000878565b5050506200011b620001156200012c60201b60201c565b62000130565b620001263362000182565b62000aa3565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60026200018e60085490565b6200019a919062000a3e565b620001c957620001b381600c54620001f460201b60201c565b600c54620001c3906001620009cc565b600c5550565b620001dd81600d54620001f460201b60201c565b6001600d54620001ee9190620009e7565b600d5550565b620002168282604051806020016040528060008152506200021a60201b60201c565b5050565b62000226838362000296565b620002356000848484620003ec565b620002915760405162461bcd60e51b815260206004820152603260248201526000805160206200316b83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620002ee5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000288565b6000818152600260205260409020546001600160a01b031615620003555760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000288565b620003636000838362000555565b6001600160a01b03821660009081526003602052604081208054600192906200038e908490620009cc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200040d846001600160a01b03166200063160201b620013a71760201c565b156200054957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200044790339089908890889060040162000951565b602060405180830381600087803b1580156200046257600080fd5b505af192505050801562000495575060408051601f3d908101601f1916820190925262000492918101906200091e565b60015b6200052e573d808015620004c6576040519150601f19603f3d011682016040523d82523d6000602084013e620004cb565b606091505b508051620005265760405162461bcd60e51b815260206004820152603260248201526000805160206200316b83398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840162000288565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506200054d565b5060015b949350505050565b6200056d8383836200029160201b6200091e1760201c565b6001600160a01b038316620005cb57620005c581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b620005f1565b816001600160a01b0316836001600160a01b031614620005f157620005f1838262000637565b6001600160a01b0382166200060b576200029181620006e4565b826001600160a01b0316826001600160a01b03161462000291576200029182826200079e565b3b151590565b600060016200065184620007ef60201b62000baf1760201c565b6200065d9190620009e7565b600083815260076020526040902054909150808214620006b1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090620006f890600190620009e7565b6000838152600960205260408120546008805493945090928490811062000723576200072362000a8d565b90600052602060002001549050806008838154811062000747576200074762000a8d565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000782576200078262000a77565b6001900381819060005260206000200160009055905550505050565b6000620007b683620007ef60201b62000baf1760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b0382166200085c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840162000288565b506001600160a01b031660009081526003602052604090205490565b828054620008869062000a01565b90600052602060002090601f016020900481019282620008aa5760008555620008f5565b82601f10620008c557805160ff1916838001178555620008f5565b82800160010185558215620008f5579182015b82811115620008f5578251825591602001919060010190620008d8565b506200090392915062000907565b5090565b5b8082111562000903576000815560010162000908565b6000602082840312156200093157600080fd5b81516001600160e01b0319811681146200094a57600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620009a05785810182015185820160a00152810162000982565b82811115620009b357600060a084870101525b5050601f01601f19169190910160a00195945050505050565b60008219821115620009e257620009e262000a61565b500190565b600082821015620009fc57620009fc62000a61565b500390565b600181811c9082168062000a1657607f821691505b6020821081141562000a3857634e487b7160e01b600052602260045260246000fd5b50919050565b60008262000a5c57634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6126b88062000ab36000396000f3fe60806040526004361061021a5760003560e01c8063842a77d311610123578063a98689f8116100ab578063cf3090121161006f578063cf309012146105f7578063d529698b14610617578063e985e9c514610637578063f2fde38b14610680578063f5b46543146106a057600080fd5b8063a98689f814610562578063b88d4fde14610581578063c0614325146105a1578063c30e7684146105c1578063c87b56dd146105d757600080fd5b80638ef79e91116100f25780638ef79e91146104e557806395d89b4114610505578063989bdbb61461051a578063a0712d681461052f578063a22cb4651461054257600080fd5b8063842a77d31461044d5780638462151c1461047a5780638c85dcae146104a75780638da5cb5b146104c757600080fd5b80633ccfd60b116101a65780635f6e37b5116101755780635f6e37b5146103ce5780636352211e146103e357806370a0823114610403578063715018a61461042357806375a98bc71461043857600080fd5b80633ccfd60b1461035f578063402436691461037457806342842e0e1461038e5780634f6ccce7146103ae57600080fd5b8063095ea7b3116101ed578063095ea7b3146102d257806318160ddd146102f457806323b872dd146103095780632f745c5914610329578063362ce0991461034957600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc146102765780630890c145146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046121a6565b6106b6565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106e1565b60405161024b91906123dd565b34801561028257600080fd5b50610296610291366004612240565b610773565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102c4600d5481565b60405190815260200161024b565b3480156102de57600080fd5b506102f26102ed366004612107565b61080d565b005b34801561030057600080fd5b506008546102c4565b34801561031557600080fd5b506102f2610324366004611fb3565b610923565b34801561033557600080fd5b506102c4610344366004612107565b610954565b34801561035557600080fd5b506102c4600b5481565b34801561036b57600080fd5b506102f26109ea565b34801561038057600080fd5b50600f5461023f9060ff1681565b34801561039a57600080fd5b506102f26103a9366004611fb3565b610a43565b3480156103ba57600080fd5b506102c46103c9366004612240565b610a5e565b3480156103da57600080fd5b506102f2610af1565b3480156103ef57600080fd5b506102966103fe366004612240565b610b38565b34801561040f57600080fd5b506102c461041e366004611f5e565b610baf565b34801561042f57600080fd5b506102f2610c36565b34801561044457600080fd5b506102f2610c6c565b34801561045957600080fd5b506102c4610468366004611f5e565b600e6020526000908152604090205481565b34801561048657600080fd5b5061049a610495366004611f5e565b610caa565b60405161024b9190612399565b3480156104b357600080fd5b506102f26104c23660046121e0565b610d69565b3480156104d357600080fd5b50600a546001600160a01b0316610296565b3480156104f157600080fd5b506102f26105003660046121e0565b610dc8565b34801561051157600080fd5b50610269610e27565b34801561052657600080fd5b506102f2610e36565b6102f261053d366004612240565b610e73565b34801561054e57600080fd5b506102f261055d3660046120cb565b6110ac565b34801561056e57600080fd5b50600f5461023f90610100900460ff1681565b34801561058d57600080fd5b506102f261059c366004611fef565b6110bb565b3480156105ad57600080fd5b506102f26105bc366004612240565b6110ed565b3480156105cd57600080fd5b506102c4611c2a81565b3480156105e357600080fd5b506102696105f2366004612240565b61111c565b34801561060357600080fd5b50600f5461023f9062010000900460ff1681565b34801561062357600080fd5b506102f2610632366004612131565b611245565b34801561064357600080fd5b5061023f610652366004611f80565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068c57600080fd5b506102f261069b366004611f5e565b61130f565b3480156106ac57600080fd5b506102c4600c5481565b60006001600160e01b0319821663780e9d6360e01b14806106db57506106db826113ad565b92915050565b6060600080546106f09061259a565b80601f016020809104026020016040519081016040528092919081815260200182805461071c9061259a565b80156107695780601f1061073e57610100808354040283529160200191610769565b820191906000526020600020905b81548152906001019060200180831161074c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107f15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061081882610b38565b9050806001600160a01b0316836001600160a01b031614156108865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107e8565b336001600160a01b03821614806108a257506108a28133610652565b6109145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107e8565b61091e83836113fd565b505050565b61092d338261146b565b6109495760405162461bcd60e51b81526004016107e8906124bb565b61091e838383611562565b600061095f83610baf565b82106109c15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107e8565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a145760405162461bcd60e51b81526004016107e890612442565b60405133904780156108fc02916000818181858888f19350505050158015610a40573d6000803e3d6000fd5b50565b61091e838383604051806020016040528060008152506110bb565b6000610a6960085490565b8210610acc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107e8565b60088281548110610adf57610adf612640565b90600052602060002001549050919050565b600a546001600160a01b03163314610b1b5760405162461bcd60e51b81526004016107e890612442565b600f805461ff001981166101009182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806106db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107e8565b60006001600160a01b038216610c1a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107e8565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610c605760405162461bcd60e51b81526004016107e890612442565b610c6a600061170d565b565b600a546001600160a01b03163314610c965760405162461bcd60e51b81526004016107e890612442565b600f805460ff19811660ff90911615179055565b60606000610cb783610baf565b905080610cd85760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610cf357610cf3612656565b604051908082528060200260200182016040528015610d1c578160200160208202803683370190505b50905060005b82811015610cd057610d348582610954565b828281518110610d4657610d46612640565b602090810291909101015280610d5b816125cf565b915050610d22565b50919050565b600a546001600160a01b03163314610d935760405162461bcd60e51b81526004016107e890612442565b600f5462010000900460ff1615610dbc5760405162461bcd60e51b81526004016107e890612477565b61091e60118383611ea9565b600a546001600160a01b03163314610df25760405162461bcd60e51b81526004016107e890612442565b600f5462010000900460ff1615610e1b5760405162461bcd60e51b81526004016107e890612477565b61091e60108383611ea9565b6060600180546106f09061259a565b600a546001600160a01b03163314610e605760405162461bcd60e51b81526004016107e890612442565b600f805462ff0000191662010000179055565b600081610e7f60085490565b610e89919061250c565b600f5490915060ff16610ecc5760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b60448201526064016107e8565b611c2a610ed860085490565b10610f145760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b60448201526064016107e8565b611c2a811115610f555760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b60448201526064016107e8565b600b54336000908152600e6020526040902054610f7390849061250c565b1115610fb05760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b60448201526064016107e8565b60006102d182118015610fc557506105dc8211155b15610fd8575066470de4df820000611013565b6105dc82118015610feb5750610bb88211155b15610ffe5750668e1bc9bf040000611013565b610bb882111561101357506701002691684e40005b3461101e8285612538565b111561105f5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016107e8565b60005b838110156110a6576110733361175f565b336000908152600e6020526040812080549161108e836125cf565b9190505550808061109e906125cf565b915050611062565b50505050565b6110b73383836117b9565b5050565b6110c5338361146b565b6110e15760405162461bcd60e51b81526004016107e8906124bb565b6110a684848484611888565b600a546001600160a01b031633146111175760405162461bcd60e51b81526004016107e890612442565b600b55565b6000818152600260205260409020546060906001600160a01b03166111725760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b60448201526064016107e8565b600f54610100900460ff16611213576011805461118e9061259a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ba9061259a565b80156112075780601f106111dc57610100808354040283529160200191611207565b820191906000526020600020905b8154815290600101906020018083116111ea57829003601f168201915b50505050509050919050565b601061121e836118bb565b60405160200161122f9291906122a1565b6040516020818303038152906040529050919050565b600a546001600160a01b0316331461126f5760405162461bcd60e51b81526004016107e890612442565b80611c2a61127c60085490565b611286908361250c565b11156112c35760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b60448201526064016107e8565b60005b818110156110a6576112fd8484838181106112e3576112e3612640565b90506020020160208101906112f89190611f5e565b61175f565b80611307816125cf565b9150506112c6565b600a546001600160a01b031633146113395760405162461bcd60e51b81526004016107e890612442565b6001600160a01b03811661139e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e8565b610a408161170d565b3b151590565b60006001600160e01b031982166380ac58cd60e01b14806113de57506001600160e01b03198216635b5e139f60e01b145b806106db57506301ffc9a760e01b6001600160e01b03198316146106db565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061143282610b38565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114e45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107e8565b60006114ef83610b38565b9050806001600160a01b0316846001600160a01b0316148061152a5750836001600160a01b031661151f84610773565b6001600160a01b0316145b8061155a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661157582610b38565b6001600160a01b0316146115dd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107e8565b6001600160a01b03821661163f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e8565b61164a8383836119b9565b6116556000826113fd565b6001600160a01b038316600090815260036020526040812080546001929061167e908490612557565b90915550506001600160a01b03821660009081526003602052604081208054600192906116ac90849061250c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600261176a60085490565b61177491906125ea565b6117985761178481600c54611a71565b600c5461179290600161250c565b600c5550565b6117a481600d54611a71565b6001600d546117b39190612557565b600d5550565b816001600160a01b0316836001600160a01b0316141561181b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107e8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611893848484611562565b61189f84848484611a8b565b6110a65760405162461bcd60e51b81526004016107e8906123f0565b6060816118df5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561190957806118f3816125cf565b91506119029050600a83612524565b91506118e3565b60008167ffffffffffffffff81111561192457611924612656565b6040519080825280601f01601f19166020018201604052801561194e576020820181803683370190505b5090505b841561155a57611963600183612557565b9150611970600a866125ea565b61197b90603061250c565b60f81b81838151811061199057611990612640565b60200101906001600160f81b031916908160001a9053506119b2600a86612524565b9450611952565b6001600160a01b038316611a1457611a0f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a37565b816001600160a01b0316836001600160a01b031614611a3757611a378382611b98565b6001600160a01b038216611a4e5761091e81611c35565b826001600160a01b0316826001600160a01b03161461091e5761091e8282611ce4565b6110b7828260405180602001604052806000815250611d28565b60006001600160a01b0384163b15611b8d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611acf90339089908890889060040161235c565b602060405180830381600087803b158015611ae957600080fd5b505af1925050508015611b19575060408051601f3d908101601f19168201909252611b16918101906121c3565b60015b611b73573d808015611b47576040519150601f19603f3d011682016040523d82523d6000602084013e611b4c565b606091505b508051611b6b5760405162461bcd60e51b81526004016107e8906123f0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061155a565b506001949350505050565b60006001611ba584610baf565b611baf9190612557565b600083815260076020526040902054909150808214611c02576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c4790600190612557565b60008381526009602052604081205460088054939450909284908110611c6f57611c6f612640565b906000526020600020015490508060088381548110611c9057611c90612640565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611cc857611cc861262a565b6001900381819060005260206000200160009055905550505050565b6000611cef83610baf565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611d328383611d5b565b611d3f6000848484611a8b565b61091e5760405162461bcd60e51b81526004016107e8906123f0565b6001600160a01b038216611db15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e8565b6000818152600260205260409020546001600160a01b031615611e165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e8565b611e22600083836119b9565b6001600160a01b0382166000908152600360205260408120805460019290611e4b90849061250c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611eb59061259a565b90600052602060002090601f016020900481019282611ed75760008555611f1d565b82601f10611ef05782800160ff19823516178555611f1d565b82800160010185558215611f1d579182015b82811115611f1d578235825591602001919060010190611f02565b50611f29929150611f2d565b5090565b5b80821115611f295760008155600101611f2e565b80356001600160a01b0381168114611f5957600080fd5b919050565b600060208284031215611f7057600080fd5b611f7982611f42565b9392505050565b60008060408385031215611f9357600080fd5b611f9c83611f42565b9150611faa60208401611f42565b90509250929050565b600080600060608486031215611fc857600080fd5b611fd184611f42565b9250611fdf60208501611f42565b9150604084013590509250925092565b6000806000806080858703121561200557600080fd5b61200e85611f42565b935061201c60208601611f42565b925060408501359150606085013567ffffffffffffffff8082111561204057600080fd5b818701915087601f83011261205457600080fd5b81358181111561206657612066612656565b604051601f8201601f19908116603f0116810190838211818310171561208e5761208e612656565b816040528281528a60208487010111156120a757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120de57600080fd5b6120e783611f42565b9150602083013580151581146120fc57600080fd5b809150509250929050565b6000806040838503121561211a57600080fd5b61212383611f42565b946020939093013593505050565b6000806020838503121561214457600080fd5b823567ffffffffffffffff8082111561215c57600080fd5b818501915085601f83011261217057600080fd5b81358181111561217f57600080fd5b8660208260051b850101111561219457600080fd5b60209290920196919550909350505050565b6000602082840312156121b857600080fd5b8135611f798161266c565b6000602082840312156121d557600080fd5b8151611f798161266c565b600080602083850312156121f357600080fd5b823567ffffffffffffffff8082111561220b57600080fd5b818501915085601f83011261221f57600080fd5b81358181111561222e57600080fd5b86602082850101111561219457600080fd5b60006020828403121561225257600080fd5b5035919050565b6000815180845261227181602086016020860161256e565b601f01601f19169290920160200192915050565b6000815161229781856020860161256e565b9290920192915050565b600080845481600182811c9150808316806122bd57607f831692505b60208084108214156122dd57634e487b7160e01b86526022600452602486fd5b8180156122f157600181146123025761232f565b60ff1986168952848901965061232f565b60008b81526020902060005b868110156123275781548b82015290850190830161230e565b505084890196505b5050505050506123536123428286612285565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061238f90830184612259565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123d1578351835292840192918401916001016123b5565b50909695505050505050565b602081526000611f796020830184612259565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60408201526318dad95960e21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561251f5761251f6125fe565b500190565b60008261253357612533612614565b500490565b6000816000190483118215151615612552576125526125fe565b500290565b600082821015612569576125696125fe565b500390565b60005b83811015612589578181015183820152602001612571565b838111156110a65750506000910152565b600181811c908216806125ae57607f821691505b60208210811415610d6357634e487b7160e01b600052602260045260246000fd5b60006000198214156125e3576125e36125fe565b5060010190565b6000826125f9576125f9612614565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a4057600080fdfea2646970667358221220e6a6b60d10836b48c93242c5e8d5d7829a7f3bc88cc5c0f02f4fd410100c734f64736f6c634300080700334552433732313a207472616e7366657220746f206e6f6e20455243373231526568747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d566d6d624c7961336367557676577977786e4d4a73316e4a6f457776447a53364a66426234654e4551374a56
Deployed Bytecode
0x60806040526004361061021a5760003560e01c8063842a77d311610123578063a98689f8116100ab578063cf3090121161006f578063cf309012146105f7578063d529698b14610617578063e985e9c514610637578063f2fde38b14610680578063f5b46543146106a057600080fd5b8063a98689f814610562578063b88d4fde14610581578063c0614325146105a1578063c30e7684146105c1578063c87b56dd146105d757600080fd5b80638ef79e91116100f25780638ef79e91146104e557806395d89b4114610505578063989bdbb61461051a578063a0712d681461052f578063a22cb4651461054257600080fd5b8063842a77d31461044d5780638462151c1461047a5780638c85dcae146104a75780638da5cb5b146104c757600080fd5b80633ccfd60b116101a65780635f6e37b5116101755780635f6e37b5146103ce5780636352211e146103e357806370a0823114610403578063715018a61461042357806375a98bc71461043857600080fd5b80633ccfd60b1461035f578063402436691461037457806342842e0e1461038e5780634f6ccce7146103ae57600080fd5b8063095ea7b3116101ed578063095ea7b3146102d257806318160ddd146102f457806323b872dd146103095780632f745c5914610329578063362ce0991461034957600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc146102765780630890c145146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046121a6565b6106b6565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106e1565b60405161024b91906123dd565b34801561028257600080fd5b50610296610291366004612240565b610773565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102c4600d5481565b60405190815260200161024b565b3480156102de57600080fd5b506102f26102ed366004612107565b61080d565b005b34801561030057600080fd5b506008546102c4565b34801561031557600080fd5b506102f2610324366004611fb3565b610923565b34801561033557600080fd5b506102c4610344366004612107565b610954565b34801561035557600080fd5b506102c4600b5481565b34801561036b57600080fd5b506102f26109ea565b34801561038057600080fd5b50600f5461023f9060ff1681565b34801561039a57600080fd5b506102f26103a9366004611fb3565b610a43565b3480156103ba57600080fd5b506102c46103c9366004612240565b610a5e565b3480156103da57600080fd5b506102f2610af1565b3480156103ef57600080fd5b506102966103fe366004612240565b610b38565b34801561040f57600080fd5b506102c461041e366004611f5e565b610baf565b34801561042f57600080fd5b506102f2610c36565b34801561044457600080fd5b506102f2610c6c565b34801561045957600080fd5b506102c4610468366004611f5e565b600e6020526000908152604090205481565b34801561048657600080fd5b5061049a610495366004611f5e565b610caa565b60405161024b9190612399565b3480156104b357600080fd5b506102f26104c23660046121e0565b610d69565b3480156104d357600080fd5b50600a546001600160a01b0316610296565b3480156104f157600080fd5b506102f26105003660046121e0565b610dc8565b34801561051157600080fd5b50610269610e27565b34801561052657600080fd5b506102f2610e36565b6102f261053d366004612240565b610e73565b34801561054e57600080fd5b506102f261055d3660046120cb565b6110ac565b34801561056e57600080fd5b50600f5461023f90610100900460ff1681565b34801561058d57600080fd5b506102f261059c366004611fef565b6110bb565b3480156105ad57600080fd5b506102f26105bc366004612240565b6110ed565b3480156105cd57600080fd5b506102c4611c2a81565b3480156105e357600080fd5b506102696105f2366004612240565b61111c565b34801561060357600080fd5b50600f5461023f9062010000900460ff1681565b34801561062357600080fd5b506102f2610632366004612131565b611245565b34801561064357600080fd5b5061023f610652366004611f80565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561068c57600080fd5b506102f261069b366004611f5e565b61130f565b3480156106ac57600080fd5b506102c4600c5481565b60006001600160e01b0319821663780e9d6360e01b14806106db57506106db826113ad565b92915050565b6060600080546106f09061259a565b80601f016020809104026020016040519081016040528092919081815260200182805461071c9061259a565b80156107695780601f1061073e57610100808354040283529160200191610769565b820191906000526020600020905b81548152906001019060200180831161074c57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107f15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061081882610b38565b9050806001600160a01b0316836001600160a01b031614156108865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107e8565b336001600160a01b03821614806108a257506108a28133610652565b6109145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107e8565b61091e83836113fd565b505050565b61092d338261146b565b6109495760405162461bcd60e51b81526004016107e8906124bb565b61091e838383611562565b600061095f83610baf565b82106109c15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107e8565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a145760405162461bcd60e51b81526004016107e890612442565b60405133904780156108fc02916000818181858888f19350505050158015610a40573d6000803e3d6000fd5b50565b61091e838383604051806020016040528060008152506110bb565b6000610a6960085490565b8210610acc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107e8565b60088281548110610adf57610adf612640565b90600052602060002001549050919050565b600a546001600160a01b03163314610b1b5760405162461bcd60e51b81526004016107e890612442565b600f805461ff001981166101009182900460ff1615909102179055565b6000818152600260205260408120546001600160a01b0316806106db5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107e8565b60006001600160a01b038216610c1a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107e8565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610c605760405162461bcd60e51b81526004016107e890612442565b610c6a600061170d565b565b600a546001600160a01b03163314610c965760405162461bcd60e51b81526004016107e890612442565b600f805460ff19811660ff90911615179055565b60606000610cb783610baf565b905080610cd85760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610cf357610cf3612656565b604051908082528060200260200182016040528015610d1c578160200160208202803683370190505b50905060005b82811015610cd057610d348582610954565b828281518110610d4657610d46612640565b602090810291909101015280610d5b816125cf565b915050610d22565b50919050565b600a546001600160a01b03163314610d935760405162461bcd60e51b81526004016107e890612442565b600f5462010000900460ff1615610dbc5760405162461bcd60e51b81526004016107e890612477565b61091e60118383611ea9565b600a546001600160a01b03163314610df25760405162461bcd60e51b81526004016107e890612442565b600f5462010000900460ff1615610e1b5760405162461bcd60e51b81526004016107e890612477565b61091e60108383611ea9565b6060600180546106f09061259a565b600a546001600160a01b03163314610e605760405162461bcd60e51b81526004016107e890612442565b600f805462ff0000191662010000179055565b600081610e7f60085490565b610e89919061250c565b600f5490915060ff16610ecc5760405162461bcd60e51b815260206004820152600b60248201526a14d0531157d0d313d4d15160aa1b60448201526064016107e8565b611c2a610ed860085490565b10610f145760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b60448201526064016107e8565b611c2a811115610f555760405162461bcd60e51b815260206004820152600c60248201526b4f55545f4f465f53544f434b60a01b60448201526064016107e8565b600b54336000908152600e6020526040902054610f7390849061250c565b1115610fb05760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b60448201526064016107e8565b60006102d182118015610fc557506105dc8211155b15610fd8575066470de4df820000611013565b6105dc82118015610feb5750610bb88211155b15610ffe5750668e1bc9bf040000611013565b610bb882111561101357506701002691684e40005b3461101e8285612538565b111561105f5760405162461bcd60e51b815260206004820152601060248201526f0929ca6aa8c8c9286928a9ca8be8aa8960831b60448201526064016107e8565b60005b838110156110a6576110733361175f565b336000908152600e6020526040812080549161108e836125cf565b9190505550808061109e906125cf565b915050611062565b50505050565b6110b73383836117b9565b5050565b6110c5338361146b565b6110e15760405162461bcd60e51b81526004016107e8906124bb565b6110a684848484611888565b600a546001600160a01b031633146111175760405162461bcd60e51b81526004016107e890612442565b600b55565b6000818152600260205260409020546060906001600160a01b03166111725760405162461bcd60e51b815260206004820152600c60248201526b4e554c4c5f4144445245535360a01b60448201526064016107e8565b600f54610100900460ff16611213576011805461118e9061259a565b80601f01602080910402602001604051908101604052809291908181526020018280546111ba9061259a565b80156112075780601f106111dc57610100808354040283529160200191611207565b820191906000526020600020905b8154815290600101906020018083116111ea57829003601f168201915b50505050509050919050565b601061121e836118bb565b60405160200161122f9291906122a1565b6040516020818303038152906040529050919050565b600a546001600160a01b0316331461126f5760405162461bcd60e51b81526004016107e890612442565b80611c2a61127c60085490565b611286908361250c565b11156112c35760405162461bcd60e51b815260206004820152600c60248201526b4558434545445f414c4c4f4360a01b60448201526064016107e8565b60005b818110156110a6576112fd8484838181106112e3576112e3612640565b90506020020160208101906112f89190611f5e565b61175f565b80611307816125cf565b9150506112c6565b600a546001600160a01b031633146113395760405162461bcd60e51b81526004016107e890612442565b6001600160a01b03811661139e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107e8565b610a408161170d565b3b151590565b60006001600160e01b031982166380ac58cd60e01b14806113de57506001600160e01b03198216635b5e139f60e01b145b806106db57506301ffc9a760e01b6001600160e01b03198316146106db565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061143282610b38565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166114e45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107e8565b60006114ef83610b38565b9050806001600160a01b0316846001600160a01b0316148061152a5750836001600160a01b031661151f84610773565b6001600160a01b0316145b8061155a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661157582610b38565b6001600160a01b0316146115dd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107e8565b6001600160a01b03821661163f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107e8565b61164a8383836119b9565b6116556000826113fd565b6001600160a01b038316600090815260036020526040812080546001929061167e908490612557565b90915550506001600160a01b03821660009081526003602052604081208054600192906116ac90849061250c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600261176a60085490565b61177491906125ea565b6117985761178481600c54611a71565b600c5461179290600161250c565b600c5550565b6117a481600d54611a71565b6001600d546117b39190612557565b600d5550565b816001600160a01b0316836001600160a01b0316141561181b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107e8565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611893848484611562565b61189f84848484611a8b565b6110a65760405162461bcd60e51b81526004016107e8906123f0565b6060816118df5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561190957806118f3816125cf565b91506119029050600a83612524565b91506118e3565b60008167ffffffffffffffff81111561192457611924612656565b6040519080825280601f01601f19166020018201604052801561194e576020820181803683370190505b5090505b841561155a57611963600183612557565b9150611970600a866125ea565b61197b90603061250c565b60f81b81838151811061199057611990612640565b60200101906001600160f81b031916908160001a9053506119b2600a86612524565b9450611952565b6001600160a01b038316611a1457611a0f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611a37565b816001600160a01b0316836001600160a01b031614611a3757611a378382611b98565b6001600160a01b038216611a4e5761091e81611c35565b826001600160a01b0316826001600160a01b03161461091e5761091e8282611ce4565b6110b7828260405180602001604052806000815250611d28565b60006001600160a01b0384163b15611b8d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611acf90339089908890889060040161235c565b602060405180830381600087803b158015611ae957600080fd5b505af1925050508015611b19575060408051601f3d908101601f19168201909252611b16918101906121c3565b60015b611b73573d808015611b47576040519150601f19603f3d011682016040523d82523d6000602084013e611b4c565b606091505b508051611b6b5760405162461bcd60e51b81526004016107e8906123f0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061155a565b506001949350505050565b60006001611ba584610baf565b611baf9190612557565b600083815260076020526040902054909150808214611c02576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611c4790600190612557565b60008381526009602052604081205460088054939450909284908110611c6f57611c6f612640565b906000526020600020015490508060088381548110611c9057611c90612640565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611cc857611cc861262a565b6001900381819060005260206000200160009055905550505050565b6000611cef83610baf565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611d328383611d5b565b611d3f6000848484611a8b565b61091e5760405162461bcd60e51b81526004016107e8906123f0565b6001600160a01b038216611db15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107e8565b6000818152600260205260409020546001600160a01b031615611e165760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107e8565b611e22600083836119b9565b6001600160a01b0382166000908152600360205260408120805460019290611e4b90849061250c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611eb59061259a565b90600052602060002090601f016020900481019282611ed75760008555611f1d565b82601f10611ef05782800160ff19823516178555611f1d565b82800160010185558215611f1d579182015b82811115611f1d578235825591602001919060010190611f02565b50611f29929150611f2d565b5090565b5b80821115611f295760008155600101611f2e565b80356001600160a01b0381168114611f5957600080fd5b919050565b600060208284031215611f7057600080fd5b611f7982611f42565b9392505050565b60008060408385031215611f9357600080fd5b611f9c83611f42565b9150611faa60208401611f42565b90509250929050565b600080600060608486031215611fc857600080fd5b611fd184611f42565b9250611fdf60208501611f42565b9150604084013590509250925092565b6000806000806080858703121561200557600080fd5b61200e85611f42565b935061201c60208601611f42565b925060408501359150606085013567ffffffffffffffff8082111561204057600080fd5b818701915087601f83011261205457600080fd5b81358181111561206657612066612656565b604051601f8201601f19908116603f0116810190838211818310171561208e5761208e612656565b816040528281528a60208487010111156120a757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156120de57600080fd5b6120e783611f42565b9150602083013580151581146120fc57600080fd5b809150509250929050565b6000806040838503121561211a57600080fd5b61212383611f42565b946020939093013593505050565b6000806020838503121561214457600080fd5b823567ffffffffffffffff8082111561215c57600080fd5b818501915085601f83011261217057600080fd5b81358181111561217f57600080fd5b8660208260051b850101111561219457600080fd5b60209290920196919550909350505050565b6000602082840312156121b857600080fd5b8135611f798161266c565b6000602082840312156121d557600080fd5b8151611f798161266c565b600080602083850312156121f357600080fd5b823567ffffffffffffffff8082111561220b57600080fd5b818501915085601f83011261221f57600080fd5b81358181111561222e57600080fd5b86602082850101111561219457600080fd5b60006020828403121561225257600080fd5b5035919050565b6000815180845261227181602086016020860161256e565b601f01601f19169290920160200192915050565b6000815161229781856020860161256e565b9290920192915050565b600080845481600182811c9150808316806122bd57607f831692505b60208084108214156122dd57634e487b7160e01b86526022600452602486fd5b8180156122f157600181146123025761232f565b60ff1986168952848901965061232f565b60008b81526020902060005b868110156123275781548b82015290850190830161230e565b505084890196505b5050505050506123536123428286612285565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061238f90830184612259565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123d1578351835292840192918401916001016123b5565b50909695505050505050565b602081526000611f796020830184612259565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60408201526318dad95960e21b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561251f5761251f6125fe565b500190565b60008261253357612533612614565b500490565b6000816000190483118215151615612552576125526125fe565b500290565b600082821015612569576125696125fe565b500390565b60005b83811015612589578181015183820152602001612571565b838111156110a65750506000910152565b600181811c908216806125ae57607f821691505b60208210811415610d6357634e487b7160e01b600052602260045260246000fd5b60006000198214156125e3576125e36125fe565b5060010190565b6000826125f9576125f9612614565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610a4057600080fdfea2646970667358221220e6a6b60d10836b48c93242c5e8d5d7829a7f3bc88cc5c0f02f4fd410100c734f64736f6c63430008070033
Deployed Bytecode Sourcemap
260:3928:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;990:222:4;;;;;;;;;;-1:-1:-1;990:222:4;;;;;:::i;:::-;;:::i;:::-;;;8020:14:13;;8013:22;7995:41;;7983:2;7968:18;990:222:4;;;;;;;;2473:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3984:217::-;;;;;;;;;;-1:-1:-1;3984:217:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6681:32:13;;;6663:51;;6651:2;6636:18;3984:217:1;6517:203:13;466:39:12;;;;;;;;;;;;;;;;;;;17321:25:13;;;17309:2;17294:18;466:39:12;17175:177:13;3522:401:1;;;;;;;;;;-1:-1:-1;3522:401:1;;;;;:::i;:::-;;:::i;:::-;;1615:111:4;;;;;;;;;;-1:-1:-1;1702:10:4;:17;1615:111;;4711:330:1;;;;;;;;;;-1:-1:-1;4711:330:1;;;;;:::i;:::-;;:::i;1291:253:4:-;;;;;;;;;;-1:-1:-1;1291:253:4;;;;;:::i;:::-;;:::i;389:30:12:-;;;;;;;;;;;;;;;;4078:107;;;;;;;;;;;;;:::i;567:20::-;;;;;;;;;;-1:-1:-1;567:20:12;;;;;;;;5107:179:1;;;;;;;;;;-1:-1:-1;5107:179:1;;;;;:::i;:::-;;:::i;1798:230:4:-;;;;;;;;;;-1:-1:-1;1798:230:4;;;;;:::i;:::-;;:::i;1924:79:12:-;;;;;;;;;;;;;:::i;2176:235:1:-;;;;;;;;;;-1:-1:-1;2176:235:1;;;;;:::i;:::-;;:::i;1914:205::-;;;;;;;;;;-1:-1:-1;1914:205:1;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;1836:82:12:-;;;;;;;;;;;;;:::i;516:44::-;;;;;;;;;;-1:-1:-1;516:44:12;;;;;:::i;:::-;;;;;;;;;;;;;;3550:518;;;;;;;;;;-1:-1:-1;3550:518:12;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1233:109::-;;;;;;;;;;-1:-1:-1;1233:109:12;;;;;:::i;:::-;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1108:6:0;;-1:-1:-1;;;;;1108:6:0;1036:85;;1116:111:12;;;;;;;;;;-1:-1:-1;1116:111:12;;;;;:::i;:::-;;:::i;2635:102:1:-;;;;;;;;;;;;;:::i;1037:73:12:-;;;;;;;;;;;;;:::i;2345:881::-;;;;;;:::i;:::-;;:::i;4268:153:1:-;;;;;;;;;;-1:-1:-1;4268:153:1;;;;;:::i;:::-;;:::i;593:19:12:-;;;;;;;;;;-1:-1:-1;593:19:12;;;;;;;;;;;5352:320:1;;;;;;;;;;-1:-1:-1;5352:320:1;;;;;:::i;:::-;;:::i;1737:92:12:-;;;;;;;;;;-1:-1:-1;1737:92:12;;;;;:::i;:::-;;:::i;344:39::-;;;;;;;;;;;;379:4;344:39;;1348:382;;;;;;;;;;-1:-1:-1;1348:382:12;;;;;:::i;:::-;;:::i;619:18::-;;;;;;;;;;-1:-1:-1;619:18:12;;;;;;;;;;;2009:330;;;;;;;;;;-1:-1:-1;2009:330:12;;;;;:::i;:::-;;:::i;4487:162:1:-;;;;;;;;;;-1:-1:-1;4487:162:1;;;;;:::i;:::-;-1:-1:-1;;;;;4607:25:1;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4487:162;1918:198:0;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;425:35:12:-;;;;;;;;;;;;;;;;990:222:4;1092:4;-1:-1:-1;;;;;;1115:50:4;;-1:-1:-1;;;1115:50:4;;:90;;;1169:36;1193:11;1169:23;:36::i;:::-;1108:97;990:222;-1:-1:-1;;990:222:4:o;2473:98:1:-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;3984:217::-;4060:7;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:1;4079:73;;;;-1:-1:-1;;;4079:73:1;;13869:2:13;4079:73:1;;;13851:21:13;13908:2;13888:18;;;13881:30;13947:34;13927:18;;;13920:62;-1:-1:-1;;;13998:18:13;;;13991:42;14050:19;;4079:73:1;;;;;;;;;-1:-1:-1;4170:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;4170:24:1;;3984:217::o;3522:401::-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;-1:-1:-1;;;;;3659:11:1;:2;-1:-1:-1;;;;;3659:11:1;;;3651:57;;;;-1:-1:-1;;;3651:57:1;;15458:2:13;3651:57:1;;;15440:21:13;15497:2;15477:18;;;15470:30;15536:34;15516:18;;;15509:62;-1:-1:-1;;;15587:18:13;;;15580:31;15628:19;;3651:57:1;15256:397:13;3651:57:1;719:10:8;-1:-1:-1;;;;;3740:21:1;;;;:62;;-1:-1:-1;3765:37:1;3782:5;719:10:8;4487:162:1;:::i;3765:37::-;3719:165;;;;-1:-1:-1;;;3719:165:1;;12262:2:13;3719:165:1;;;12244:21:13;12301:2;12281:18;;;12274:30;12340:34;12320:18;;;12313:62;12411:26;12391:18;;;12384:54;12455:19;;3719:165:1;12060:420:13;3719:165:1;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3592:331;3522:401;;:::o;4711:330::-;4900:41;719:10:8;4933:7:1;4900:18;:41::i;:::-;4892:103;;;;-1:-1:-1;;;4892:103:1;;;;;;;:::i;:::-;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;1291:253:4:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:4;;8814:2:13;1407:87:4;;;8796:21:13;8853:2;8833:18;;;8826:30;8892:34;8872:18;;;8865:62;-1:-1:-1;;;8943:18:13;;;8936:41;8994:19;;1407:87:4;8612:407:13;1407:87:4;-1:-1:-1;;;;;;1511:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;4078:107:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;4127:51:12::1;::::0;4135:10:::1;::::0;4156:21:::1;4127:51:::0;::::1;;;::::0;::::1;::::0;;;4156:21;4135:10;4127:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;4078:107::o:0;5107:179:1:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;1798:230:4:-;1873:7;1908:30;1702:10;:17;;1615:111;1908:30;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:4;;16278:2:13;1892:95:4;;;16260:21:13;16317:2;16297:18;;;16290:30;16356:34;16336:18;;;16329:62;-1:-1:-1;;;16407:18:13;;;16400:42;16459:19;;1892:95:4;16076:408:13;1892:95:4;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;1997:24;;1798:230;;;:::o;1924:79:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1989:7:12::1;::::0;;-1:-1:-1;;1978:18:12;::::1;1989:7;::::0;;;::::1;;;1988:8;1978:18:::0;;::::1;;::::0;;1924:79::o;2176:235:1:-;2248:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:1;2317:19;2309:73;;;;-1:-1:-1;;;2309:73:1;;13098:2:13;2309:73:1;;;13080:21:13;13137:2;13117:18;;;13110:30;13176:34;13156:18;;;13149:62;-1:-1:-1;;;13227:18:13;;;13220:39;13276:19;;2309:73:1;12896:405:13;1914:205:1;1986:7;-1:-1:-1;;;;;2013:19:1;;2005:74;;;;-1:-1:-1;;;2005:74:1;;12687:2:13;2005:74:1;;;12669:21:13;12726:2;12706:18;;;12699:30;12765:34;12745:18;;;12738:62;-1:-1:-1;;;12816:18:13;;;12809:40;12866:19;;2005:74:1;12485:406:13;2005:74:1;-1:-1:-1;;;;;;2096:16:1;;;;;:9;:16;;;;;;;1914:205::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;1836:82:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1903:8:12::1;::::0;;-1:-1:-1;;1891:20:12;::::1;1903:8;::::0;;::::1;1902:9;1891:20;::::0;;1836:82::o;3550:518::-;3636:16;3668:18;3689:17;3699:6;3689:9;:17::i;:::-;3668:38;-1:-1:-1;3720:15:12;3716:346;;3758:16;;;3772:1;3758:16;;;;;;;;;;;-1:-1:-1;3751:23:12;3550:518;-1:-1:-1;;;3550:518:12:o;3716:346::-;3805:23;3845:10;3831:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3831:25:12;;3805:51;;3870:13;3897:128;3921:10;3913:5;:18;3897:128;;;3976:34;3996:6;4004:5;3976:19;:34::i;:::-;3960:6;3967:5;3960:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;3933:7;;;;:::i;:::-;;;;3897:128;;3716:346;3658:410;3550:518;;;:::o;1233:109::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;966:6:12::1;::::0;;;::::1;;;965:7;957:56;;;;-1:-1:-1::0;;;957:56:12::1;;;;;;;:::i;:::-;1317:18:::2;:12;1332:3:::0;;1317:18:::2;:::i;1116:111::-:0;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;966:6:12::1;::::0;;;::::1;;;965:7;957:56;;;;-1:-1:-1::0;;;957:56:12::1;;;;;;;:::i;:::-;1201:19:::2;:13;1217:3:::0;;1201:19:::2;:::i;2635:102:1:-:0;2691:13;2723:7;2716:14;;;;;:::i;1037:73:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1090:6:12::1;:13:::0;;-1:-1:-1;;1090:13:12::1;::::0;::::1;::::0;;1037:73::o;2345:881::-;2420:16;2456:8;2440:13;1702:10:4;:17;;1615:111;2440:13:12;:24;;;;:::i;:::-;2483:8;;2420:44;;-1:-1:-1;2483:8:12;;2475:32;;;;-1:-1:-1;;;2475:32:12;;11509:2:13;2475:32:12;;;11491:21:13;11548:2;11528:18;;;11521:30;-1:-1:-1;;;11567:18:13;;;11560:41;11618:18;;2475:32:12;11307:335:13;2475:32:12;379:4;2525:13;1702:10:4;:17;;1615:111;2525:13:12;:23;2517:48;;;;-1:-1:-1;;;2517:48:12;;11168:2:13;2517:48:12;;;11150:21:13;11207:2;11187:18;;;11180:30;-1:-1:-1;;;11226:18:13;;;11219:42;11278:18;;2517:48:12;10966:336:13;2517:48:12;379:4;2583:8;:19;;2575:43;;;;-1:-1:-1;;;2575:43:12;;11168:2:13;2575:43:12;;;11150:21:13;11207:2;11187:18;;;11180:30;-1:-1:-1;;;11226:18:13;;;11219:42;11278:18;;2575:43:12;10966:336:13;2575:43:12;2672:11;;2646:10;2636:21;;;;:9;:21;;;;;;:32;;2660:8;;2636:32;:::i;:::-;:47;;2628:72;;;;-1:-1:-1;;;2628:72:12;;16691:2:13;2628:72:12;;;16673:21:13;16730:2;16710:18;;;16703:30;-1:-1:-1;;;16749:18:13;;;16742:42;16801:18;;2628:72:12;16489:336:13;2628:72:12;2711:13;2746:3;2737:8;:12;:30;;;;;2763:4;2753:8;:14;;2737:30;2734:284;;;-1:-1:-1;2795:17:12;2734:284;;;2847:4;2838:8;:13;:31;;;;;2865:4;2855:8;:14;;2838:31;2835:183;;;-1:-1:-1;2897:17:12;2835:183;;;2949:4;2940:8;:13;2937:81;;;-1:-1:-1;2981:17:12;2937:81;3055:9;3035:16;3046:5;3035:8;:16;:::i;:::-;:29;;3027:58;;;;-1:-1:-1;;;3027:58:12;;17032:2:13;3027:58:12;;;17014:21:13;17071:2;17051:18;;;17044:30;-1:-1:-1;;;17090:18:13;;;17083:46;17146:18;;3027:58:12;16830:340:13;3027:58:12;3101:9;3096:123;3120:8;3116:1;:12;3096:123;;;3149:22;3160:10;3149;:22::i;:::-;3195:10;3185:21;;;;:9;:21;;;;;:23;;;;;;:::i;:::-;;;;;;3130:3;;;;;:::i;:::-;;;;3096:123;;;;2409:817;;2345:881;:::o;4268:153:1:-;4362:52;719:10:8;4395:8:1;4405;4362:18;:52::i;:::-;4268:153;;:::o;5352:320::-;5521:41;719:10:8;5554:7:1;5521:18;:41::i;:::-;5513:103;;;;-1:-1:-1;;;5513:103:1;;;;;;;:::i;:::-;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;1737:92:12:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1802:11:12::1;:20:::0;1737:92::o;1348:382::-;7209:4:1;7232:16;;;:7;:16;;;;;;1453:13:12;;-1:-1:-1;;;;;7232:16:1;1482:41:12;;;;-1:-1:-1;;;1482:41:12;;8473:2:13;1482:41:12;;;8455:21:13;8512:2;8492:18;;;8485:30;-1:-1:-1;;;8531:18:13;;;8524:42;8583:18;;1482:41:12;8271:336:13;1482:41:12;1538:7;;;;;;;1534:56;;1567:12;1560:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1348:382;;;:::o;1534:56::-;1666:13;1681:18;:7;:16;:18::i;:::-;1649:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1606:117;;1348:382;;;:::o;2009:330::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2106:11:12;379:4:::1;2168:13;1702:10:4::0;:17;;1615:111;2168:13:12::1;2155:26;::::0;:10;:26:::1;:::i;:::-;:37;;2134:96;;;::::0;-1:-1:-1;;;2134:96:12;;16691:2:13;2134:96:12::1;::::0;::::1;16673:21:13::0;16730:2;16710:18;;;16703:30;-1:-1:-1;;;16749:18:13;;;16742:42;16801:18;;2134:96:12::1;16489:336:13::0;2134:96:12::1;2246:9;2241:92;2265:10;2261:1;:14;2241:92;;;2296:26;2307:11;;2319:1;2307:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2296:10;:26::i;:::-;2277:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2241:92;;1918:198:0::0;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;9645:2:13;1998:73:0::1;::::0;::::1;9627:21:13::0;9684:2;9664:18;;;9657:30;9723:34;9703:18;;;9696:62;-1:-1:-1;;;9774:18:13;;;9767:36;9820:19;;1998:73:0::1;9443:402:13::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;771:377:7:-:0;1087:20;1133:8;;;771:377::o;1555:300:1:-;1657:4;-1:-1:-1;;;;;;1692:40:1;;-1:-1:-1;;;1692:40:1;;:104;;-1:-1:-1;;;;;;;1748:48:1;;-1:-1:-1;;;1748:48:1;1692:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:10;;;1812:36:1;829:155:10;10995:171:1;11069:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11069:29:1;-1:-1:-1;;;;;11069:29:1;;;;;;;;:24;;11122:23;11069:24;11122:14;:23::i;:::-;-1:-1:-1;;;;;11113:46:1;;;;;;;;;;;10995:171;;:::o;7427:344::-;7520:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:1;7536:73;;;;-1:-1:-1;;;7536:73:1;;11849:2:13;7536:73:1;;;11831:21:13;11888:2;11868:18;;;11861:30;11927:34;11907:18;;;11900:62;-1:-1:-1;;;11978:18:13;;;11971:42;12030:19;;7536:73:1;11647:408:13;7536:73:1;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;-1:-1:-1;;;;;7676:16:1;:7;-1:-1:-1;;;;;7676:16:1;;:51;;;;7720:7;-1:-1:-1;;;;;7696:31:1;:20;7708:7;7696:11;:20::i;:::-;-1:-1:-1;;;;;7696:31:1;;7676:51;:87;;;-1:-1:-1;;;;;;4607:25:1;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7731:32;7668:96;7427:344;-1:-1:-1;;;;7427:344:1:o;10324:560::-;10478:4;-1:-1:-1;;;;;10451:31:1;:23;10466:7;10451:14;:23::i;:::-;-1:-1:-1;;;;;10451:31:1;;10443:85;;;;-1:-1:-1;;;10443:85:1;;14643:2:13;10443:85:1;;;14625:21:13;14682:2;14662:18;;;14655:30;14721:34;14701:18;;;14694:62;-1:-1:-1;;;14772:18:13;;;14765:39;14821:19;;10443:85:1;14441:405:13;10443:85:1;-1:-1:-1;;;;;10546:16:1;;10538:65;;;;-1:-1:-1;;;10538:65:1;;10409:2:13;10538:65:1;;;10391:21:13;10448:2;10428:18;;;10421:30;10487:34;10467:18;;;10460:62;-1:-1:-1;;;10538:18:13;;;10531:34;10582:19;;10538:65:1;10207:400:13;10538:65:1;10614:39;10635:4;10641:2;10645:7;10614:20;:39::i;:::-;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;-1:-1:-1;;;;;10755:15:1;;;;;;:9;:15;;;;;:20;;10774:1;;10755:15;:20;;10774:1;;10755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10785:13:1;;;;;;:9;:13;;;;;:18;;10802:1;;10785:13;:18;;10802:1;;10785:18;:::i;:::-;;;;-1:-1:-1;;10813:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10813:21:1;-1:-1:-1;;;;;10813:21:1;;;;;;;;;10850:27;;10813:16;;10850:27;;;;;;;10324:560;;;:::o;2270:187:0:-;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;3232:312:12:-;3304:1;3288:13;1702:10:4;:17;;1615:111;3288:13:12;:17;;;;:::i;:::-;3285:253;;3325:34;3335:6;3342:16;;3325:9;:34::i;:::-;3392:16;;:19;;3410:1;3392:19;:::i;:::-;3373:16;:38;4127:51:::1;4078:107::o:0;3285:253::-;3441:35;3451:6;3458:17;;3441:9;:35::i;:::-;3528:1;3510:17;;:19;;;;:::i;:::-;3490:17;:39;3232:312;:::o;11301:307:1:-;11451:8;-1:-1:-1;;;;;11442:17:1;:5;-1:-1:-1;;;;;11442:17:1;;;11434:55;;;;-1:-1:-1;;;11434:55:1;;10814:2:13;11434:55:1;;;10796:21:13;10853:2;10833:18;;;10826:30;10892:27;10872:18;;;10865:55;10937:18;;11434:55:1;10612:349:13;11434:55:1;-1:-1:-1;;;;;11499:25:1;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11499:46:1;;;;;;;;;;11560:41;;7995::13;;;11560::1;;7968:18:13;11560:41:1;;;;;;;11301:307;;;:::o;6534:::-;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;-1:-1:-1;;;6723:111:1;;;;;;;:::i;328:703:9:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:9;;;;;;;;;;;;-1:-1:-1;;;627:10:9;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:9;;-1:-1:-1;773:2:9;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:9;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:9;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:9;;;;;;;;-1:-1:-1;972:11:9;981:2;972:11;;:::i;:::-;;;844:150;;2624:572:4;-1:-1:-1;;;;;2823:18:4;;2819:183;;2857:40;2889:7;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161;2857:40;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:4;:4;-1:-1:-1;;;;;2918:10:4;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:4;;3011:179;;3047:45;3084:7;3047:36;:45::i;3011:179::-;3119:4;-1:-1:-1;;;;;3113:10:4;:2;-1:-1:-1;;;;;3113:10:4;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;8101:108:1:-;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;12161:778::-;12311:4;-1:-1:-1;;;;;12331:13:1;;1087:20:7;1133:8;12327:606:1;;12366:72;;-1:-1:-1;;;12366:72:1;;-1:-1:-1;;;;;12366:36:1;;;;;:72;;719:10:8;;12417:4:1;;12423:7;;12432:5;;12366:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:72:1;;;;;;;;-1:-1:-1;;12366:72:1;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12605:13:1;;12601:266;;12647:60;;-1:-1:-1;;;12647:60:1;;;;;;;:::i;12601:266::-;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;-1:-1:-1;;;;;;12488:51:1;-1:-1:-1;;;12488:51:1;;-1:-1:-1;12481:58:1;;12327:606;-1:-1:-1;12918:4:1;12161:778;;;;;;:::o;4680:970:4:-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:4;;;5150:323;;-1:-1:-1;;;;;5220:18:4;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:4;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:4;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:4;;6187:46;;6632:26;;;;;;:::i;:::-;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:4:o;8430:311:1:-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;-1:-1:-1;;;8583:151:1;;;;;;;:::i;9063:372::-;-1:-1:-1;;;;;9142:16:1;;9134:61;;;;-1:-1:-1;;;9134:61:1;;13508:2:13;9134:61:1;;;13490:21:13;;;13527:18;;;13520:30;13586:34;13566:18;;;13559:62;13638:18;;9134:61:1;13306:356:13;9134:61:1;7209:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:1;:30;9205:58;;;;-1:-1:-1;;;9205:58:1;;10052:2:13;9205:58:1;;;10034:21:13;10091:2;10071:18;;;10064:30;10130;10110:18;;;10103:58;10178:18;;9205:58:1;9850:352:13;9205:58:1;9274:45;9303:1;9307:2;9311:7;9274:20;:45::i;:::-;-1:-1:-1;;;;;9330:13:1;;;;;;:9;:13;;;;;:18;;9347:1;;9330:13;:18;;9347:1;;9330:18;:::i;:::-;;;;-1:-1:-1;;9358:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9358:21:1;-1:-1:-1;;;;;9358:21:1;;;;;;;;9395:33;;9358:16;;;9395:33;;9358:16;;9395:33;9063:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:13;82:20;;-1:-1:-1;;;;;131:31:13;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:13:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:13;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:13:o;2735:615::-;2821:6;2829;2882:2;2870:9;2861:7;2857:23;2853:32;2850:52;;;2898:1;2895;2888:12;2850:52;2938:9;2925:23;2967:18;3008:2;3000:6;2997:14;2994:34;;;3024:1;3021;3014:12;2994:34;3062:6;3051:9;3047:22;3037:32;;3107:7;3100:4;3096:2;3092:13;3088:27;3078:55;;3129:1;3126;3119:12;3078:55;3169:2;3156:16;3195:2;3187:6;3184:14;3181:34;;;3211:1;3208;3201:12;3181:34;3264:7;3259:2;3249:6;3246:1;3242:14;3238:2;3234:23;3230:32;3227:45;3224:65;;;3285:1;3282;3275:12;3224:65;3316:2;3308:11;;;;;3338:6;;-1:-1:-1;2735:615:13;;-1:-1:-1;;;;2735:615:13:o;3355:245::-;3413:6;3466:2;3454:9;3445:7;3441:23;3437:32;3434:52;;;3482:1;3479;3472:12;3434:52;3521:9;3508:23;3540:30;3564:5;3540:30;:::i;3605:249::-;3674:6;3727:2;3715:9;3706:7;3702:23;3698:32;3695:52;;;3743:1;3740;3733:12;3695:52;3775:9;3769:16;3794:30;3818:5;3794:30;:::i;3859:592::-;3930:6;3938;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;4047:9;4034:23;4076:18;4117:2;4109:6;4106:14;4103:34;;;4133:1;4130;4123:12;4103:34;4171:6;4160:9;4156:22;4146:32;;4216:7;4209:4;4205:2;4201:13;4197:27;4187:55;;4238:1;4235;4228:12;4187:55;4278:2;4265:16;4304:2;4296:6;4293:14;4290:34;;;4320:1;4317;4310:12;4290:34;4365:7;4360:2;4351:6;4347:2;4343:15;4339:24;4336:37;4333:57;;;4386:1;4383;4376:12;4456:180;4515:6;4568:2;4556:9;4547:7;4543:23;4539:32;4536:52;;;4584:1;4581;4574:12;4536:52;-1:-1:-1;4607:23:13;;4456:180;-1:-1:-1;4456:180:13:o;4641:257::-;4682:3;4720:5;4714:12;4747:6;4742:3;4735:19;4763:63;4819:6;4812:4;4807:3;4803:14;4796:4;4789:5;4785:16;4763:63;:::i;:::-;4880:2;4859:15;-1:-1:-1;;4855:29:13;4846:39;;;;4887:4;4842:50;;4641:257;-1:-1:-1;;4641:257:13:o;4903:185::-;4945:3;4983:5;4977:12;4998:52;5043:6;5038:3;5031:4;5024:5;5020:16;4998:52;:::i;:::-;5066:16;;;;;4903:185;-1:-1:-1;;4903:185:13:o;5211:1301::-;5488:3;5517:1;5550:6;5544:13;5580:3;5602:1;5630:9;5626:2;5622:18;5612:28;;5690:2;5679:9;5675:18;5712;5702:61;;5756:4;5748:6;5744:17;5734:27;;5702:61;5782:2;5830;5822:6;5819:14;5799:18;5796:38;5793:165;;;-1:-1:-1;;;5857:33:13;;5913:4;5910:1;5903:15;5943:4;5864:3;5931:17;5793:165;5974:18;6001:104;;;;6119:1;6114:320;;;;5967:467;;6001:104;-1:-1:-1;;6034:24:13;;6022:37;;6079:16;;;;-1:-1:-1;6001:104:13;;6114:320;17430:1;17423:14;;;17467:4;17454:18;;6209:1;6223:165;6237:6;6234:1;6231:13;6223:165;;;6315:14;;6302:11;;;6295:35;6358:16;;;;6252:10;;6223:165;;;6227:3;;6417:6;6412:3;6408:16;6401:23;;5967:467;;;;;;;6450:56;6475:30;6501:3;6493:6;6475:30;:::i;:::-;-1:-1:-1;;;5153:20:13;;5198:1;5189:11;;5093:113;6450:56;6443:63;5211:1301;-1:-1:-1;;;;;5211:1301:13:o;6725:488::-;-1:-1:-1;;;;;6994:15:13;;;6976:34;;7046:15;;7041:2;7026:18;;7019:43;7093:2;7078:18;;7071:34;;;7141:3;7136:2;7121:18;;7114:31;;;6919:4;;7162:45;;7187:19;;7179:6;7162:45;:::i;:::-;7154:53;6725:488;-1:-1:-1;;;;;;6725:488:13:o;7218:632::-;7389:2;7441:21;;;7511:13;;7414:18;;;7533:22;;;7360:4;;7389:2;7612:15;;;;7586:2;7571:18;;;7360:4;7655:169;7669:6;7666:1;7663:13;7655:169;;;7730:13;;7718:26;;7799:15;;;;7764:12;;;;7691:1;7684:9;7655:169;;;-1:-1:-1;7841:3:13;;7218:632;-1:-1:-1;;;;;;7218:632:13:o;8047:219::-;8196:2;8185:9;8178:21;8159:4;8216:44;8256:2;8245:9;8241:18;8233:6;8216:44;:::i;9024:414::-;9226:2;9208:21;;;9265:2;9245:18;;;9238:30;9304:34;9299:2;9284:18;;9277:62;-1:-1:-1;;;9370:2:13;9355:18;;9348:48;9428:3;9413:19;;9024:414::o;14080:356::-;14282:2;14264:21;;;14301:18;;;14294:30;14360:34;14355:2;14340:18;;14333:62;14427:2;14412:18;;14080:356::o;14851:400::-;15053:2;15035:21;;;15092:2;15072:18;;;15065:30;15131:34;15126:2;15111:18;;15104:62;-1:-1:-1;;;15197:2:13;15182:18;;15175:34;15241:3;15226:19;;14851:400::o;15658:413::-;15860:2;15842:21;;;15899:2;15879:18;;;15872:30;15938:34;15933:2;15918:18;;15911:62;-1:-1:-1;;;16004:2:13;15989:18;;15982:47;16061:3;16046:19;;15658:413::o;17483:128::-;17523:3;17554:1;17550:6;17547:1;17544:13;17541:39;;;17560:18;;:::i;:::-;-1:-1:-1;17596:9:13;;17483:128::o;17616:120::-;17656:1;17682;17672:35;;17687:18;;:::i;:::-;-1:-1:-1;17721:9:13;;17616:120::o;17741:168::-;17781:7;17847:1;17843;17839:6;17835:14;17832:1;17829:21;17824:1;17817:9;17810:17;17806:45;17803:71;;;17854:18;;:::i;:::-;-1:-1:-1;17894:9:13;;17741:168::o;17914:125::-;17954:4;17982:1;17979;17976:8;17973:34;;;17987:18;;:::i;:::-;-1:-1:-1;18024:9:13;;17914:125::o;18044:258::-;18116:1;18126:113;18140:6;18137:1;18134:13;18126:113;;;18216:11;;;18210:18;18197:11;;;18190:39;18162:2;18155:10;18126:113;;;18257:6;18254:1;18251:13;18248:48;;;-1:-1:-1;;18292:1:13;18274:16;;18267:27;18044:258::o;18307:380::-;18386:1;18382:12;;;;18429;;;18450:61;;18504:4;18496:6;18492:17;18482:27;;18450:61;18557:2;18549:6;18546:14;18526:18;18523:38;18520:161;;;18603:10;18598:3;18594:20;18591:1;18584:31;18638:4;18635:1;18628:15;18666:4;18663:1;18656:15;18692:135;18731:3;-1:-1:-1;;18752:17:13;;18749:43;;;18772:18;;:::i;:::-;-1:-1:-1;18819:1:13;18808:13;;18692:135::o;18832:112::-;18864:1;18890;18880:35;;18895:18;;:::i;:::-;-1:-1:-1;18929:9:13;;18832:112::o;18949:127::-;19010:10;19005:3;19001:20;18998:1;18991:31;19041:4;19038:1;19031:15;19065:4;19062:1;19055:15;19081:127;19142:10;19137:3;19133:20;19130:1;19123:31;19173:4;19170:1;19163:15;19197:4;19194:1;19187:15;19213:127;19274:10;19269:3;19265:20;19262:1;19255:31;19305:4;19302:1;19295:15;19329:4;19326:1;19319:15;19345:127;19406:10;19401:3;19397:20;19394:1;19387:31;19437:4;19434:1;19427:15;19461:4;19458:1;19451:15;19477:127;19538:10;19533:3;19529:20;19526:1;19519:31;19569:4;19566:1;19559:15;19593:4;19590:1;19583:15;19609:131;-1:-1:-1;;;;;;19683:32:13;;19673:43;;19663:71;;19730:1;19727;19720:12
Swarm Source
ipfs://e6a6b60d10836b48c93242c5e8d5d7829a7f3bc88cc5c0f02f4fd410100c734f
Loading...
Loading
Loading...
Loading
[ 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.