ERC-721
Overview
Max Total Supply
169 WSC
Holders
41
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 WSCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Token
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-13 */ // SPDX-License-Identifier: MIT pragma solidity >=0.8.7 <0.9.0; //import "../../utils/Strings.sol"; /** * @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); } } //import "../../utils/Context.sol"; /** * @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; } } //import "@openzeppelin/contracts/access/Ownable.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); } } //import "../../utils/introspection/IERC165.sol"; /** * @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); } //import "./IERC721.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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } //import "./IERC721Receiver.sol"; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } //import "./extensions/IERC721Metadata.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); } //import "../../utils/Address.sol"; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } //import "../../utils/introspection/ERC165.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; } } /** * @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 overridden 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } //import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } //import "./Common/IWhiteList.sol"; //-------------------------------------------- // WHITELIST intterface //-------------------------------------------- interface IWhiteList { //-------------------- // function //-------------------- function check( address target ) external view returns (bool); } //-------------------------------------------------------- // Token: WONDER SECRET CLUB //-------------------------------------------------------- contract Token is Ownable, ERC721, ReentrancyGuard { //-------------------------------------------------------- // constant //-------------------------------------------------------- string constant private TOKEN_NAME = "WONDER SECRET CLUB"; string constant private TOKEN_SYMBOL = "WSC"; //----------------------------------------- // mainnet //----------------------------------------- address constant private OWNER_ADDRESS = 0x8ee348062160811cba1c1A51E66c6A73214655F8; uint256 constant private MAX_TOKEN = 5555; uint256 constant private RESERVED_TOKEN = 120; // WONDERLIST SALE uint256 constant private WONDERLIST_SALE_PRICE = 59000000000000000; // 0.059 ETH uint256 constant private WONDERLIST_SALE_QUANTITY = 2; // WONDERKIDS SALE uint256 constant private WONDERKIDS_SALE_PRICE = 59000000000000000; // 0.059 ETH uint256 constant private WONDERKIDS_SALE_QUANTITY = 1; // PUBLIC SALE uint256 constant private PUBLIC_SALE_PRICE = 69000000000000000; // 0.069 ETH uint256 constant private PUBLIC_SALE_QUANTITY = 1; // FINAL SALE uint256 constant private FINAL_SALE_PRICE = 69000000000000000; // 0.069 ETH uint256 constant private FINAL_SALE_QUANTITY = 2; // enum uint256 constant private INFO_SALE_SUSPENDED = 0; uint256 constant private INFO_SALE_START = 1; uint256 constant private INFO_SALE_END = 2; uint256 constant private INFO_SALE_PRICE = 3; uint256 constant private INFO_SALE_WHITELISTED = 4; uint256 constant private INFO_SALE_MAX_MINT = 5; uint256 constant private INFO_SALE_USER_MINTED = 6; uint256 constant private INFO_MAX = 7; uint256 constant private USER_INFO_SALE = INFO_MAX; uint256 constant private USER_INFO_SUPPLY = INFO_MAX + 1; uint256 constant private USER_INFO_TOTAL = INFO_MAX + 2; uint256 constant private USER_INFO_MAX = INFO_MAX + 3; //-------------------------------------------------------- // storage //-------------------------------------------------------- address private _manager; string private _baseUriForHidden; string private _baseUriForRevealed; uint256 _totalSupply; // WONDERLIST SALE bool private _WONDERLIST_SALE_isSuspended; uint256 private _WONDERLIST_SALE_start; uint256 private _WONDERLIST_SALE_end; IWhiteList[] private _WONDERLIST_SALE_arrWhiteList; mapping( address => uint256 ) private _WONDERLIST_SALE_mapMinted; // WONDERKIDS SALE bool private _WONDERKIDS_SALE_isSuspended; uint256 private _WONDERKIDS_SALE_start; uint256 private _WONDERKIDS_SALE_end; IWhiteList[] private _WONDERKIDS_SALE_arrWhiteList; mapping( address => uint256 ) private _WONDERKIDS_SALE_mapMinted; // PUBLIC SALE bool private _PUBLIC_SALE_isSuspended; uint256 private _PUBLIC_SALE_start; uint256 private _PUBLIC_SALE_end; IWhiteList[] private _PUBLIC_SALE_arrWhiteList; mapping( address => uint256 ) private _PUBLIC_SALE_mapMinted; // FINAL SALE bool private _FINAL_SALE_isSuspended; uint256 private _FINAL_SALE_start; uint256 private _FINAL_SALE_end; mapping( address => uint256 ) private _FINAL_SALE_mapMinted; //-------------------------------------------------------- // [modifier] onlyOwnerOrManager //-------------------------------------------------------- modifier onlyOwnerOrManager() { require( msg.sender == owner() || msg.sender == manager(), "caller is not the owner neither manager" ); _; } //-------------------------------------------------------- // constructor //-------------------------------------------------------- constructor() Ownable() ERC721( TOKEN_NAME, TOKEN_SYMBOL ) { transferOwnership( OWNER_ADDRESS ); _manager = msg.sender; //----------------------- // mainnet //----------------------- _baseUriForHidden = "ipfs://QmZkJocmGRFCef9t2q2MGUQ4Z7kNH9KPASwEeD2kx11URw/"; //======================= // WONDERLIST SALE //======================= _WONDERLIST_SALE_start = 1655110800; // 2022-06-13 09:00:00(UTC) _WONDERLIST_SALE_end = 1655132400; // 2022-06-13 15:00:00(UTC) _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(0x6452EBc37A790d8A5614bB3E30cf544eB5555796) ); //+++++++++++++++++++++++ // WONDER KIDS SALE //+++++++++++++++++++++++ _WONDERKIDS_SALE_start = 1655110800; // 2022-06-13 09:00:00(UTC) _WONDERKIDS_SALE_end = 1655132400; // 2022-06-13 15:00:00(UTC) _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x582b680e1b1c8aCAA9442E80b12CD0efAf1f3bd1) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x632ae52C10159fDb8f191F778f1aE9cA2ABFEeb3) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x7e72b15Cd97F08F7aE7a32C06Cca732eeb08C98c) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x06Dccb6EE7a900759CE426ef713120508f9C5036) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0xe1bAD705EC6710800B3fe507c66a20cbd895Fe8E) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x6B9cC7A4c3e7A4eB56f29D3B3556FeB9318D1446) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x174fF1E0136a1bd578D8e27f6C430963b342F59F) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0xD94e994c032fa5132f070D899703c19E686cFE3a) ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(0x9be8f83f81291aacdB12f37a80A464d7Bfe4B8A1) ); //*********************** // PUBLIC SALE //*********************** _PUBLIC_SALE_start = 1655132400; // 2022-06-13 15:00:00(UTC) _PUBLIC_SALE_end = 1655154000; // 2022-06-13 21:00:00(UTC) _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x2821Dbf2685fCda10C64907637aF56c7f92C4dd6) ); _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x55E25eb0DbB1AA8a9b47e44fD27438B827D4A986) ); _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x62a2CC3889d65666A669533fE8f92a323FE2c9A8) ); _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x904f99D3646660096752e0Bc2fd5458962788F7B) ); _PUBLIC_SALE_arrWhiteList.push( IWhiteList(0x8336f23513c25c52775DB44624BA5B731C8BAE18) ); //~~~~~~~~~~~~~~~~~~~~~~~ // FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~ _FINAL_SALE_start = 1655154000; // 2022-06-13 21:00:00 _FINAL_SALE_end = 0; // no period } //-------------------------------------------------------- // [public] manager //-------------------------------------------------------- function manager() public view returns (address) { return( _manager ); } //-------------------------------------------------------- // [external/onlyOwner] setManager //-------------------------------------------------------- function setManager( address target ) external onlyOwner { _manager = target; } //-------------------------------------------------------- // [external] baseUriForHidden //-------------------------------------------------------- function baseUriForHidden() external view returns (string memory) { return( _baseUriForHidden ); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] setBaseUriForHidden //-------------------------------------------------------- function setBaseUriForHidden( string calldata uri ) external onlyOwnerOrManager { _baseUriForHidden = uri; } //-------------------------------------------------------- // [external] baseUriForRevealed //-------------------------------------------------------- function baseUriForRevealed() external view returns (string memory) { return( _baseUriForRevealed ); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] setBaseUriForRevealed //-------------------------------------------------------- function setBaseUriForRevealed( string calldata uri ) external onlyOwnerOrManager { _baseUriForRevealed = uri; } //-------------------------------------------------------- // [external] totalSupply //-------------------------------------------------------- function totalSupply() external view returns (uint256) { return( _totalSupply ); } //-------------------------------------------------------- // [public/override] tokenURI //-------------------------------------------------------- function tokenURI( uint256 tokenId ) public view override returns (string memory) { require( _exists( tokenId ), "nonexistent token" ); if( bytes(_baseUriForRevealed).length > 0 ){ return( string( abi.encodePacked( _baseUriForRevealed, Strings.toString( tokenId ) ) ) ); } return( string( abi.encodePacked( _baseUriForHidden, Strings.toString( tokenId ) ) ) ); } //======================================================== // [public] getInfo - WONDERLIST SALE //======================================================== function WONDERLIST_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _WONDERLIST_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _WONDERLIST_SALE_start; arrRet[INFO_SALE_END] = _WONDERLIST_SALE_end; arrRet[INFO_SALE_PRICE] = WONDERLIST_SALE_PRICE; if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target) ){ arrRet[INFO_SALE_WHITELISTED] = 1; } arrRet[INFO_SALE_MAX_MINT] = WONDERLIST_SALE_QUANTITY; arrRet[INFO_SALE_USER_MINTED] = _WONDERLIST_SALE_mapMinted[target]; return( arrRet ); } //======================================================== // [external/onlyOwnerOrManager] write - WONDERLIST SALE //======================================================== // isSuspended function WONDERLIST_SALE_suspend( bool flag ) external onlyOwnerOrManager { _WONDERLIST_SALE_isSuspended = flag; } // start-end function WONDERLIST_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{ _WONDERLIST_SALE_start = start; _WONDERLIST_SALE_end = end; } // whitelist function WONDERLIST_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager { delete _WONDERLIST_SALE_arrWhiteList; for( uint256 i=0; i<lists.length; i++ ){ require( lists[i] != address(0), "WONDERLIST SALE: invalid list" ); _WONDERLIST_SALE_arrWhiteList.push( IWhiteList(lists[i]) ); } } //======================================================== // [external/payable] mint - WONDERLIST SALE //======================================================== function WONDERLIST_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = WONDERLIST_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERLIST SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "WONDERLIST SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "WONDERLIST SALE: finished" ); require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERLIST SALE: not whitelisted" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERLIST SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _WONDERLIST_SALE_mapMinted[msg.sender] += num; } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // [public] getInfo - WONDERKIDS SALE //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function WONDERKIDS_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _WONDERKIDS_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _WONDERKIDS_SALE_start; arrRet[INFO_SALE_END] = _WONDERKIDS_SALE_end; arrRet[INFO_SALE_PRICE] = WONDERKIDS_SALE_PRICE; if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target) ){ arrRet[INFO_SALE_WHITELISTED] = 1; } arrRet[INFO_SALE_MAX_MINT] = WONDERKIDS_SALE_QUANTITY; arrRet[INFO_SALE_USER_MINTED] = _WONDERKIDS_SALE_mapMinted[target]; return( arrRet ); } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // [external/onlyOwnerOrManager] write - WONDERKIDS SALE //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // isSuspended function WONDERKIDS_SALE_suspend( bool flag ) external onlyOwnerOrManager { _WONDERKIDS_SALE_isSuspended = flag; } // start-end function WONDERKIDS_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{ _WONDERKIDS_SALE_start = start; _WONDERKIDS_SALE_end = end; } // whitelist function WONDERKIDS_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager { delete _WONDERKIDS_SALE_arrWhiteList; for( uint256 i=0; i<lists.length; i++ ){ require( lists[i] != address(0), "WONDERKIDS SALE: invalid list" ); _WONDERKIDS_SALE_arrWhiteList.push( IWhiteList(lists[i]) ); } } //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // [external/payable] mint - WONDERKIDS SALE //++++++++++++++++++++++++++++++++++++++++++++++++++++++++ function WONDERKIDS_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = WONDERKIDS_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "WONDERKIDS SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "WONDERKIDS SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "WONDERKIDS SALE: finished" ); require( arrInfo[INFO_SALE_WHITELISTED] == 1, "WONDERKIDS SALE: not whitelisted" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "WONDERKIDS SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _WONDERKIDS_SALE_mapMinted[msg.sender] += num; } //******************************************************** // [public] getInfo - PUBLIC SALE //******************************************************** function PUBLIC_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _PUBLIC_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _PUBLIC_SALE_start; arrRet[INFO_SALE_END] = _PUBLIC_SALE_end; arrRet[INFO_SALE_PRICE] = PUBLIC_SALE_PRICE; if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target) ){ arrRet[INFO_SALE_WHITELISTED] = 1; } arrRet[INFO_SALE_MAX_MINT] = PUBLIC_SALE_QUANTITY; arrRet[INFO_SALE_USER_MINTED] = _PUBLIC_SALE_mapMinted[target]; return( arrRet ); } //******************************************************** // [external/onlyOwnerOrManager] write - PUBLIC SALE //******************************************************** // isSuspended function PUBLIC_SALE_suspend( bool flag ) external onlyOwnerOrManager { _PUBLIC_SALE_isSuspended = flag; } // start-end function PUBLIC_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{ _PUBLIC_SALE_start = start; _PUBLIC_SALE_end = end; } // whitelist function PUBLIC_SALE_setWhiteList( address[] calldata lists ) external onlyOwnerOrManager { delete _PUBLIC_SALE_arrWhiteList; for( uint256 i=0; i<lists.length; i++ ){ require( lists[i] != address(0), "PUBLIC SALE: invalid list" ); _PUBLIC_SALE_arrWhiteList.push( IWhiteList(lists[i]) ); } } //******************************************************** // [external/payable] mint - PUBLIC SALE //******************************************************** function PUBLIC_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = PUBLIC_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "PUBLIC SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "PUBLIC SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "PUBLIC SALE: finished" ); require( arrInfo[INFO_SALE_WHITELISTED] == 1, "PUBLIC SALE: not whitelisted" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "PUBLIC SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _PUBLIC_SALE_mapMinted[msg.sender] += num; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [public] getInfo - FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function FINAL_SALE_getInfo( address target ) public view returns (uint256[INFO_MAX] memory) { uint256[INFO_MAX] memory arrRet; if( _FINAL_SALE_isSuspended ){ arrRet[INFO_SALE_SUSPENDED] = 1; } arrRet[INFO_SALE_START] = _FINAL_SALE_start; arrRet[INFO_SALE_END] = _FINAL_SALE_end; arrRet[INFO_SALE_PRICE] = FINAL_SALE_PRICE; arrRet[INFO_SALE_WHITELISTED] = 1; arrRet[INFO_SALE_MAX_MINT] = FINAL_SALE_QUANTITY; arrRet[INFO_SALE_USER_MINTED] = _FINAL_SALE_mapMinted[target]; return( arrRet ); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [external/onlyOwnerOrManager] write - FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // isSuspended function FINAL_SALE_suspend( bool flag ) external onlyOwnerOrManager { _FINAL_SALE_isSuspended = flag; } // start-end function FINAL_SALE_setStartEnd( uint256 start, uint256 end ) external onlyOwnerOrManager{ _FINAL_SALE_start = start; _FINAL_SALE_end = end; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [external/payable] mint - FINAL SALE //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function FINAL_SALE_mint( uint256 num ) external payable nonReentrant { uint256[INFO_MAX] memory arrInfo = FINAL_SALE_getInfo( msg.sender ); require( arrInfo[INFO_SALE_SUSPENDED] == 0, "FINAL SALE: suspended" ); require( arrInfo[INFO_SALE_START] == 0 || arrInfo[INFO_SALE_START] <= block.timestamp, "FINAL SALE: not opend" ); require( arrInfo[INFO_SALE_END] == 0 || arrInfo[INFO_SALE_END] > block.timestamp, "FINAL SALE: finished" ); require( arrInfo[INFO_SALE_MAX_MINT] >= (arrInfo[INFO_SALE_USER_MINTED]+num), "FINAL SALE: reached the limit" ); _checkPayment( msg.sender, arrInfo[INFO_SALE_PRICE]*num, msg.value ); _mintTokens( msg.sender, num ); _FINAL_SALE_mapMinted[msg.sender] += num; } //-------------------------------------------------------- // [internal] _checkWhitelist //-------------------------------------------------------- function _checkWhitelist( IWhiteList[] storage lists, address target ) internal view returns (bool) { for( uint256 i=0; i<lists.length; i++ ){ if( lists[i].check(target) ){ return( true); } } return( false ); } //-------------------------------------------------------- // [internal] _checkPayment //-------------------------------------------------------- function _checkPayment( address msgSender, uint256 price, uint256 payment ) internal { require( price <= payment, "insufficient value" ); // refund if overpaymented if( price < payment ){ uint256 change = payment - price; address payable target = payable( msgSender ); target.transfer( change ); } } //-------------------------------------------------------- // [internal] _mintTokens //-------------------------------------------------------- function _mintTokens( address to, uint256 num ) internal { require( to != address(0), "invalid to" ); require( _totalSupply >= RESERVED_TOKEN, "reservation not finished" ); require( (_totalSupply+num) <= MAX_TOKEN, "exceeded the supply range" ); for( uint256 i=0; i<num; i++ ){ _mint( to, _totalSupply+(i+1) ); } _totalSupply += num; } //-------------------------------------------------------- // [external/onlyOwnerOrManager] reserveTokens //-------------------------------------------------------- function reserveTokens( uint256 num ) external onlyOwnerOrManager { require( (_totalSupply+num) <= RESERVED_TOKEN, "exceeded the reservation range" ); for( uint256 i=0; i<num; i++ ){ _mint( owner(), _totalSupply+(i+1) ); } _totalSupply += num; } //-------------------------------------------------------- // [external] getUserInfo //-------------------------------------------------------- function getUserInfo( address target ) external view returns (uint256[USER_INFO_MAX] memory){ uint256[USER_INFO_MAX] memory userInfo; uint256[INFO_MAX] memory info; // WONDERLIST if( _checkWhitelist( _WONDERLIST_SALE_arrWhiteList, target ) && (_WONDERLIST_SALE_end == 0 || _WONDERLIST_SALE_end > block.timestamp) ){ userInfo[USER_INFO_SALE] = 1; info = WONDERLIST_SALE_getInfo( target ); } // WONDERKIDS else if( _checkWhitelist( _WONDERKIDS_SALE_arrWhiteList, target ) && (_WONDERKIDS_SALE_end == 0 || _WONDERKIDS_SALE_end > block.timestamp) ){ userInfo[USER_INFO_SALE] = 2; info = WONDERKIDS_SALE_getInfo( target ); } // PUBLIC else if( _checkWhitelist( _PUBLIC_SALE_arrWhiteList, target ) && (_PUBLIC_SALE_end == 0 || _PUBLIC_SALE_end > block.timestamp) ){ userInfo[USER_INFO_SALE] = 3; info = PUBLIC_SALE_getInfo( target ); } // FINAL else{ userInfo[USER_INFO_SALE] = 4; info = FINAL_SALE_getInfo( target ); } for( uint256 i=0; i<INFO_MAX; i++ ){ userInfo[i] = info[i]; } userInfo[USER_INFO_SUPPLY] = _totalSupply; userInfo[USER_INFO_TOTAL] = MAX_TOKEN; return( userInfo ); } //-------------------------------------------------------- // [external] checkBalance //-------------------------------------------------------- function checkBalance() external view returns (uint256) { return( address(this).balance ); } //-------------------------------------------------------- // [external/onlyOwnerOrManager] withdraw //-------------------------------------------------------- function withdraw( uint256 amount ) external onlyOwnerOrManager nonReentrant { require( amount <= address(this).balance, "insufficient balance" ); address payable target = payable( owner() ); target.transfer( amount ); } }
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":[{"internalType":"address","name":"target","type":"address"}],"name":"FINAL_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"FINAL_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"FINAL_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"FINAL_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"PUBLIC_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"PUBLIC_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"PUBLIC_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"PUBLIC_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"PUBLIC_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERKIDS_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERKIDS_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERKIDS_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERKIDS_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERKIDS_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"WONDERLIST_SALE_getInfo","outputs":[{"internalType":"uint256[7]","name":"","type":"uint256[7]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"WONDERLIST_SALE_mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"WONDERLIST_SALE_setStartEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lists","type":"address[]"}],"name":"WONDERLIST_SALE_setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"WONDERLIST_SALE_suspend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForHidden","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUriForRevealed","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[10]","name":"","type":"uint256[10]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForHidden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseUriForRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051806040016040528060128152602001712ba7a72222a91029a2a1a922aa1021a62aa160711b8152506040518060400160405280600381526020016257534360e81b815250620000736200006d620003f260201b60201c565b620003f6565b8151620000889060019060208501906200051b565b5080516200009e9060029060208401906200051b565b5050600160075550620000c5738ee348062160811cba1c1a51e66c6a73214655f862000446565b600880546001600160a01b031916331790556040805160608101909152603680825262003c466020830139805162000106916009916020909101906200051b565b506362a6fc90600d8190556362a750f0600e819055600f805460018181019092557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319908116736452ebc37a790d8a5614bb3e30cf544eb55557961790915560129390935560138290556014805480830182557fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9081018054861673582b680e1b1c8acaa9442e80b12cd0efaf1f3bd11790558154808401835581018054861673632ae52c10159fdb8f191f778f1ae9ca2abfeeb317905581548084018355810180548616737e72b15cd97f08f7ae7a32c06cca732eeb08c98c179055815480840183558101805486167306dccb6ee7a900759ce426ef713120508f9c50361790558154808401835581018054861673e1bad705ec6710800b3fe507c66a20cbd895fe8e17905581548084018355810180548616736b9cc7a4c3e7a4eb56f29d3b3556feb9318d14461790558154808401835581018054861673174ff1e0136a1bd578d8e27f6c430963b342f59f1790558154808401835581018054861673d94e994c032fa5132f070d899703c19e686cfe3a17905581548084019092550180548416739be8f83f81291aacdb12f37a80a464d7bfe4b8a11790556017919091556362a7a550601881905560198054808401825560008281527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c969591820180548716732821dbf2685fcda10c64907637af56c7f92c4dd6179055825480860184558201805487167355e25eb0dbb1aa8a9b47e44fd27438b827d4a986179055825480860184558201805487167362a2cc3889d65666a669533fe8f92a323fe2c9a81790558254808601845582018054871673904f99d3646660096752e0bc2fd5458962788f7b1790558254948501909255929092018054909316738336f23513c25c52775db44624ba5b731c8bae1817909255601c91909155601d55620005fe565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166200050d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016200049d565b6200051881620003f6565b50565b8280546200052990620005c1565b90600052602060002090601f0160209004810192826200054d576000855562000598565b82601f106200056857805160ff191683800117855562000598565b8280016001018555821562000598579182015b82811115620005985782518255916020019190600101906200057b565b50620005a6929150620005aa565b5090565b5b80821115620005a65760008155600101620005ab565b600181811c90821680620005d657607f821691505b60208210811415620005f857634e487b7160e01b600052602260045260246000fd5b50919050565b613638806200060e6000396000f3fe60806040526004361061027d5760003560e01c80636386c1c71161014f578063c0ca970f116100c1578063e22572661161007a578063e22572661461075b578063e3c61b021461077b578063e985e9c51461079b578063f2fde38b146107bb578063f34e1ea1146107db578063ff4b629e146107fb57600080fd5b8063c0ca970f146106a8578063c71daccb146106c8578063c87b56dd146106db578063d031370b146106fb578063d0ebdbe71461071b578063de3bc79f1461073b57600080fd5b806395d89b411161011357806395d89b411461060b578063a04e5f7f14610620578063a22cb46514610635578063a3df2a0114610655578063ac1349a114610668578063b88d4fde1461068857600080fd5b80636386c1c71461056b57806370a0823114610598578063715018a6146105b8578063808312bc146105cd5780638da5cb5b146105ed57600080fd5b80632e431810116101f35780634a213d2a116101ac5780634a213d2a146104c3578063502ece24146104e357806352c0295f146105035780635d8ceea9146105185780635e59da6b146105385780636352211e1461054b57600080fd5b80632e4318101461041257806336e517dd146104255780633abe69b2146104525780633b3538421461047257806342842e0e14610485578063481c6a75146104a557600080fd5b8063138cfadc11610245578063138cfadc1461035357806318160ddd146103735780631c58eec51461039257806323b872dd146103b2578063279b8b5a146103d25780632e1a7d4d146103f257600080fd5b806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b3146103115780630ff4231014610333575b600080fd5b34801561028e57600080fd5b506102a261029d3660046130ca565b61081b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc61086d565b6040516102ae9190613325565b3480156102e557600080fd5b506102f96102f4366004613164565b6108ff565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061033161032c366004612ff1565b610999565b005b34801561033f57600080fd5b5061033161034e36600461301b565b610aaf565b34801561035f57600080fd5b5061033161036e36600461317d565b610bf2565b34801561037f57600080fd5b50600b545b6040519081526020016102ae565b34801561039e57600080fd5b506103316103ad36600461317d565b610c3c565b3480156103be57600080fd5b506103316103cd366004612ea2565b610c86565b3480156103de57600080fd5b506103316103ed36600461301b565b610cb7565b3480156103fe57600080fd5b5061033161040d366004613164565b610dfa565b610331610420366004613164565b610eee565b34801561043157600080fd5b50610445610440366004612e4d565b61114b565b6040516102ae91906132fd565b34801561045e57600080fd5b5061044561046d366004612e4d565b6111c4565b610331610480366004613164565b611241565b34801561049157600080fd5b506103316104a0366004612ea2565b611407565b3480156104b157600080fd5b506008546001600160a01b03166102f9565b3480156104cf57600080fd5b506103316104de36600461317d565b611422565b3480156104ef57600080fd5b506103316104fe36600461317d565b61146c565b34801561050f57600080fd5b506102cc6114b6565b34801561052457600080fd5b50610331610533366004613104565b6114c5565b610331610546366004613164565b611510565b34801561055757600080fd5b506102f9610566366004613164565b61172d565b34801561057757600080fd5b5061058b610586366004612e4d565b6117a4565b6040516102ae91906132cb565b3480156105a457600080fd5b506103846105b3366004612e4d565b611919565b3480156105c457600080fd5b506103316119a0565b3480156105d957600080fd5b506103316105e8366004613090565b6119d6565b3480156105f957600080fd5b506000546001600160a01b03166102f9565b34801561061757600080fd5b506102cc611a28565b34801561062c57600080fd5b506102cc611a37565b34801561064157600080fd5b50610331610650366004612fba565b611a46565b610331610663366004613164565b611a55565b34801561067457600080fd5b50610331610683366004613104565b611c93565b34801561069457600080fd5b506103316106a3366004612ede565b611cde565b3480156106b457600080fd5b506103316106c336600461301b565b611d16565b3480156106d457600080fd5b5047610384565b3480156106e757600080fd5b506102cc6106f6366004613164565b611e59565b34801561070757600080fd5b50610331610716366004613164565b611f08565b34801561072757600080fd5b50610331610736366004612e4d565b61200f565b34801561074757600080fd5b50610331610756366004613090565b61205b565b34801561076757600080fd5b50610445610776366004612e4d565b6120ad565b34801561078757600080fd5b50610331610796366004613090565b61212a565b3480156107a757600080fd5b506102a26107b6366004612e6f565b61217c565b3480156107c757600080fd5b506103316107d6366004612e4d565b6121aa565b3480156107e757600080fd5b506103316107f6366004613090565b612245565b34801561080757600080fd5b50610445610816366004612e4d565b612297565b60006001600160e01b031982166380ac58cd60e01b148061084c57506001600160e01b03198216635b5e139f60e01b145b8061086757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461087c9061351c565b80601f01602080910402602001604051908101604052809291908181526020018280546108a89061351c565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661097d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109a48261172d565b9050806001600160a01b0316836001600160a01b03161415610a125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610974565b336001600160a01b0382161480610a2e5750610a2e813361217c565b610aa05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610974565b610aaa8383612314565b505050565b6000546001600160a01b0316331480610ad257506008546001600160a01b031633145b610aee5760405162461bcd60e51b815260040161097490613410565b610afa600f6000612d3d565b60005b81811015610aaa576000838383818110610b1957610b196135b2565b9050602002016020810190610b2e9190612e4d565b6001600160a01b03161415610b855760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610974565b600f838383818110610b9957610b996135b2565b9050602002016020810190610bae9190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610bea81613557565b915050610afd565b6000546001600160a01b0316331480610c1557506008546001600160a01b031633145b610c315760405162461bcd60e51b815260040161097490613410565b601c91909155601d55565b6000546001600160a01b0316331480610c5f57506008546001600160a01b031633145b610c7b5760405162461bcd60e51b815260040161097490613410565b601791909155601855565b610c903382612382565b610cac5760405162461bcd60e51b8152600401610974906133bf565b610aaa838383612459565b6000546001600160a01b0316331480610cda57506008546001600160a01b031633145b610cf65760405162461bcd60e51b815260040161097490613410565b610d0260146000612d3d565b60005b81811015610aaa576000838383818110610d2157610d216135b2565b9050602002016020810190610d369190612e4d565b6001600160a01b03161415610d8d5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610974565b6014838383818110610da157610da16135b2565b9050602002016020810190610db69190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610df281613557565b915050610d05565b6000546001600160a01b0316331480610e1d57506008546001600160a01b031633145b610e395760405162461bcd60e51b815260040161097490613410565b60026007541415610e5c5760405162461bcd60e51b815260040161097490613457565b600260075547811115610ea85760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610974565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610ee4573d6000803e3d6000fd5b5050600160075550565b60026007541415610f115760405162461bcd60e51b815260040161097490613457565b60026007556000610f21336111c4565b805190915015610f735760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580610f88575060208101514210155b610fd45760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580610fe85750604081015142105b6110345760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610974565b60808101516001146110885760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c081015161109890839061348e565b60a082015110156110f65760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b61111433838360035b602002015161110e91906134ba565b346125f5565b61111e3383612691565b336000908152601060205260408120805484929061113d90849061348e565b909155505060016007555050565b611153612d5b565b61115b612d5b565b601b5460ff161561116b57600181525b601c54602080830191909152601d5460408084019190915266f5232269808000606084015260016080840152600260a08401526001600160a01b0385166000908152601e9092529020548160065b602002015292915050565b6111cc612d5b565b6111d4612d5b565b600c5460ff16156111e457600181525b600d546020820152600e54604082015266d19c2ff9bf8000606082015261120c600f846127ce565b1561121957600160808201525b600260a08201526001600160a01b0383166000908152601060205260409020548160066111b9565b600260075414156112645760405162461bcd60e51b815260040161097490613457565b600260075560006112743361114b565b8051909150156112be5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610974565b602081015115806112d3575060208101514210155b6113175760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610974565b6040810151158061132b5750604081015142105b61136e5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610974565b60c081015161137e90839061348e565b60a082015110156113d15760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610974565b6113de33838360036110ff565b6113e83383612691565b336000908152601e60205260408120805484929061113d90849061348e565b610aaa83838360405180602001604052806000815250611cde565b6000546001600160a01b031633148061144557506008546001600160a01b031633145b6114615760405162461bcd60e51b815260040161097490613410565b600d91909155600e55565b6000546001600160a01b031633148061148f57506008546001600160a01b031633145b6114ab5760405162461bcd60e51b815260040161097490613410565b601291909155601355565b60606009805461087c9061351c565b6000546001600160a01b03163314806114e857506008546001600160a01b031633145b6115045760405162461bcd60e51b815260040161097490613410565b610aaa600a8383612d79565b600260075414156115335760405162461bcd60e51b815260040161097490613457565b6002600755600061154333612297565b80519091501561158e5760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610974565b602081015115806115a3575060208101514210155b6115e85760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610974565b604081015115806115fc5750604081015142105b6116405760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610974565b60808101516001146116945760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610974565b60c08101516116a490839061348e565b60a082015110156116f75760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610974565b61170433838360036110ff565b61170e3383612691565b336000908152601a60205260408120805484929061113d90849061348e565b6000818152600360205260408120546001600160a01b0316806108675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610974565b6117ac612dfd565b6117b4612dfd565b6117bc612d5b565b6117c7600f856127ce565b80156117de5750600e5415806117de575042600e54115b156117fa57600160e08301526117f3846111c4565b905061187b565b6118056014856127ce565b801561181c5750601354158061181c575042601354115b1561183157600260e08301526117f3846120ad565b61183c6019856127ce565b801561185357506018541580611853575042601854115b1561186857600360e08301526117f384612297565b600460e08301526118788461114b565b90505b60005b60078110156118c757818160078110611899576118996135b2565b60200201518382600a81106118b0576118b06135b2565b6020020152806118bf81613557565b91505061187e565b50600b54826118d86007600161348e565b600a81106118e8576118e86135b2565b60200201526115b3826118fd6007600261348e565b600a811061190d5761190d6135b2565b60200201525092915050565b60006001600160a01b0382166119845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610974565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146119ca5760405162461bcd60e51b81526004016109749061338a565b6119d4600061289e565b565b6000546001600160a01b03163314806119f957506008546001600160a01b031633145b611a155760405162461bcd60e51b815260040161097490613410565b601b805460ff1916911515919091179055565b60606002805461087c9061351c565b6060600a805461087c9061351c565b611a513383836128ee565b5050565b60026007541415611a785760405162461bcd60e51b815260040161097490613457565b60026007556000611a88336120ad565b805190915015611ada5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580611aef575060208101514210155b611b3b5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580611b4f5750604081015142105b611b9b5760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610974565b6080810151600114611bef5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c0810151611bff90839061348e565b60a08201511015611c5d5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b611c6a33838360036110ff565b611c743383612691565b336000908152601560205260408120805484929061113d90849061348e565b6000546001600160a01b0316331480611cb657506008546001600160a01b031633145b611cd25760405162461bcd60e51b815260040161097490613410565b610aaa60098383612d79565b611ce83383612382565b611d045760405162461bcd60e51b8152600401610974906133bf565b611d10848484846129bd565b50505050565b6000546001600160a01b0316331480611d3957506008546001600160a01b031633145b611d555760405162461bcd60e51b815260040161097490613410565b611d6160196000612d3d565b60005b81811015610aaa576000838383818110611d8057611d806135b2565b9050602002016020810190611d959190612e4d565b6001600160a01b03161415611dec5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610974565b6019838383818110611e0057611e006135b2565b9050602002016020810190611e159190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580611e5181613557565b915050611d64565b6000818152600360205260409020546060906001600160a01b0316611eb45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610974565b6000600a8054611ec39061351c565b90501115611efd57600a611ed6836129f0565b604051602001611ee79291906131e7565b6040516020818303038152906040529050919050565b6009611ed6836129f0565b6000546001600160a01b0316331480611f2b57506008546001600160a01b031633145b611f475760405162461bcd60e51b815260040161097490613410565b607881600b54611f57919061348e565b1115611fa55760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610974565b60005b81811015611ff457611fe2611fc56000546001600160a01b031690565b611fd083600161348e565b600b54611fdd919061348e565b612aee565b80611fec81613557565b915050611fa8565b5080600b6000828254612007919061348e565b909155505050565b6000546001600160a01b031633146120395760405162461bcd60e51b81526004016109749061338a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061207e57506008546001600160a01b031633145b61209a5760405162461bcd60e51b815260040161097490613410565b600c805460ff1916911515919091179055565b6120b5612d5b565b6120bd612d5b565b60115460ff16156120cd57600181525b6012546020820152601354604082015266d19c2ff9bf800060608201526120f56014846127ce565b1561210257600160808201525b600160a08201526001600160a01b0383166000908152601560205260409020548160066111b9565b6000546001600160a01b031633148061214d57506008546001600160a01b031633145b6121695760405162461bcd60e51b815260040161097490613410565b6011805460ff1916911515919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121d45760405162461bcd60e51b81526004016109749061338a565b6001600160a01b0381166122395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610974565b6122428161289e565b50565b6000546001600160a01b031633148061226857506008546001600160a01b031633145b6122845760405162461bcd60e51b815260040161097490613410565b6016805460ff1916911515919091179055565b61229f612d5b565b6122a7612d5b565b60165460ff16156122b757600181525b6017546020820152601854604082015266f523226980800060608201526122df6019846127ce565b156122ec57600160808201525b600160a08201526001600160a01b0383166000908152601a60205260409020548160066111b9565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123498261172d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166123fb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610974565b60006124068361172d565b9050806001600160a01b0316846001600160a01b0316148061242d575061242d818561217c565b806124515750836001600160a01b0316612446846108ff565b6001600160a01b0316145b949350505050565b826001600160a01b031661246c8261172d565b6001600160a01b0316146124d05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610974565b6001600160a01b0382166125325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610974565b61253d600082612314565b6001600160a01b03831660009081526004602052604081208054600192906125669084906134d9565b90915550506001600160a01b038216600090815260046020526040812080546001929061259490849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8082111561263a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610974565b80821015610aaa57600061264e83836134d9565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612689573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166126d45760405162461bcd60e51b815260206004820152600a602482015269696e76616c696420746f60b01b6044820152606401610974565b6078600b5410156127275760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610974565b6115b381600b54612738919061348e565b11156127865760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610974565b60005b818110156127b2576127a083611fd083600161348e565b806127aa81613557565b915050612789565b5080600b60008282546127c5919061348e565b90915550505050565b6000805b8354811015612894578381815481106127ed576127ed6135b2565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561283b57600080fd5b505afa15801561284f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287391906130ad565b15612882576001915050610867565b8061288c81613557565b9150506127d2565b5060009392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156129505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610974565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129c8848484612459565b6129d484848484612c30565b611d105760405162461bcd60e51b815260040161097490613338565b606081612a145750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a3e5780612a2881613557565b9150612a379050600a836134a6565b9150612a18565b60008167ffffffffffffffff811115612a5957612a596135c8565b6040519080825280601f01601f191660200182016040528015612a83576020820181803683370190505b5090505b841561245157612a986001836134d9565b9150612aa5600a86613572565b612ab090603061348e565b60f81b818381518110612ac557612ac56135b2565b60200101906001600160f81b031916908160001a905350612ae7600a866134a6565b9450612a87565b6001600160a01b038216612b445760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610974565b6000818152600360205260409020546001600160a01b031615612ba95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610974565b6001600160a01b0382166000908152600460205260408120805460019290612bd290849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612d3257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c7490339089908890889060040161328e565b602060405180830381600087803b158015612c8e57600080fd5b505af1925050508015612cbe575060408051601f3d908101601f19168201909252612cbb918101906130e7565b60015b612d18573d808015612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b508051612d105760405162461bcd60e51b815260040161097490613338565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612451565b506001949350505050565b50805460008255906000526020600020908101906122429190612e1c565b6040518060e001604052806007906020820280368337509192915050565b828054612d859061351c565b90600052602060002090601f016020900481019282612da75760008555612ded565b82601f10612dc05782800160ff19823516178555612ded565b82800160010185558215612ded579182015b82811115612ded578235825591602001919060010190612dd2565b50612df9929150612e1c565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115612df95760008155600101612e1d565b80356001600160a01b0381168114612e4857600080fd5b919050565b600060208284031215612e5f57600080fd5b612e6882612e31565b9392505050565b60008060408385031215612e8257600080fd5b612e8b83612e31565b9150612e9960208401612e31565b90509250929050565b600080600060608486031215612eb757600080fd5b612ec084612e31565b9250612ece60208501612e31565b9150604084013590509250925092565b60008060008060808587031215612ef457600080fd5b612efd85612e31565b9350612f0b60208601612e31565b925060408501359150606085013567ffffffffffffffff80821115612f2f57600080fd5b818701915087601f830112612f4357600080fd5b813581811115612f5557612f556135c8565b604051601f8201601f19908116603f01168101908382118183101715612f7d57612f7d6135c8565b816040528281528a6020848701011115612f9657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612fcd57600080fd5b612fd683612e31565b91506020830135612fe6816135de565b809150509250929050565b6000806040838503121561300457600080fd5b61300d83612e31565b946020939093013593505050565b6000806020838503121561302e57600080fd5b823567ffffffffffffffff8082111561304657600080fd5b818501915085601f83011261305a57600080fd5b81358181111561306957600080fd5b8660208260051b850101111561307e57600080fd5b60209290920196919550909350505050565b6000602082840312156130a257600080fd5b8135612e68816135de565b6000602082840312156130bf57600080fd5b8151612e68816135de565b6000602082840312156130dc57600080fd5b8135612e68816135ec565b6000602082840312156130f957600080fd5b8151612e68816135ec565b6000806020838503121561311757600080fd5b823567ffffffffffffffff8082111561312f57600080fd5b818501915085601f83011261314357600080fd5b81358181111561315257600080fd5b86602082850101111561307e57600080fd5b60006020828403121561317657600080fd5b5035919050565b6000806040838503121561319057600080fd5b50508035926020909101359150565b600081518084526131b78160208601602086016134f0565b601f01601f19169290920160200192915050565b600081516131dd8185602086016134f0565b9290920192915050565b600080845481600182811c91508083168061320357607f831692505b602080841082141561322357634e487b7160e01b86526022600452602486fd5b818015613237576001811461324857613275565b60ff19861689528489019650613275565b60008b81526020902060005b8681101561326d5781548b820152908501908301613254565b505084890196505b50505050505061328581856131cb565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132c19083018461319f565b9695505050505050565b6101408101818360005b600a8110156132f45781518352602092830192909101906001016132d5565b50505092915050565b60e08101818360005b60078110156132f4578151835260209283019290910190600101613306565b602081526000612e68602083018461319f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156134a1576134a1613586565b500190565b6000826134b5576134b561359c565b500490565b60008160001904831182151516156134d4576134d4613586565b500290565b6000828210156134eb576134eb613586565b500390565b60005b8381101561350b5781810151838201526020016134f3565b83811115611d105750506000910152565b600181811c9082168061353057607f821691505b6020821081141561355157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561356b5761356b613586565b5060010190565b6000826135815761358161359c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461224257600080fd5b6001600160e01b03198116811461224257600080fdfea2646970667358221220a29e41f7c5e30596474dfcc55fd6fe1914ef83da1c44c7ef38aa0b966530843f64736f6c63430008070033697066733a2f2f516d5a6b4a6f636d47524643656639743271324d475551345a376b4e48394b50415377456544326b7831315552772f
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80636386c1c71161014f578063c0ca970f116100c1578063e22572661161007a578063e22572661461075b578063e3c61b021461077b578063e985e9c51461079b578063f2fde38b146107bb578063f34e1ea1146107db578063ff4b629e146107fb57600080fd5b8063c0ca970f146106a8578063c71daccb146106c8578063c87b56dd146106db578063d031370b146106fb578063d0ebdbe71461071b578063de3bc79f1461073b57600080fd5b806395d89b411161011357806395d89b411461060b578063a04e5f7f14610620578063a22cb46514610635578063a3df2a0114610655578063ac1349a114610668578063b88d4fde1461068857600080fd5b80636386c1c71461056b57806370a0823114610598578063715018a6146105b8578063808312bc146105cd5780638da5cb5b146105ed57600080fd5b80632e431810116101f35780634a213d2a116101ac5780634a213d2a146104c3578063502ece24146104e357806352c0295f146105035780635d8ceea9146105185780635e59da6b146105385780636352211e1461054b57600080fd5b80632e4318101461041257806336e517dd146104255780633abe69b2146104525780633b3538421461047257806342842e0e14610485578063481c6a75146104a557600080fd5b8063138cfadc11610245578063138cfadc1461035357806318160ddd146103735780631c58eec51461039257806323b872dd146103b2578063279b8b5a146103d25780632e1a7d4d146103f257600080fd5b806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b3146103115780630ff4231014610333575b600080fd5b34801561028e57600080fd5b506102a261029d3660046130ca565b61081b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc61086d565b6040516102ae9190613325565b3480156102e557600080fd5b506102f96102f4366004613164565b6108ff565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061033161032c366004612ff1565b610999565b005b34801561033f57600080fd5b5061033161034e36600461301b565b610aaf565b34801561035f57600080fd5b5061033161036e36600461317d565b610bf2565b34801561037f57600080fd5b50600b545b6040519081526020016102ae565b34801561039e57600080fd5b506103316103ad36600461317d565b610c3c565b3480156103be57600080fd5b506103316103cd366004612ea2565b610c86565b3480156103de57600080fd5b506103316103ed36600461301b565b610cb7565b3480156103fe57600080fd5b5061033161040d366004613164565b610dfa565b610331610420366004613164565b610eee565b34801561043157600080fd5b50610445610440366004612e4d565b61114b565b6040516102ae91906132fd565b34801561045e57600080fd5b5061044561046d366004612e4d565b6111c4565b610331610480366004613164565b611241565b34801561049157600080fd5b506103316104a0366004612ea2565b611407565b3480156104b157600080fd5b506008546001600160a01b03166102f9565b3480156104cf57600080fd5b506103316104de36600461317d565b611422565b3480156104ef57600080fd5b506103316104fe36600461317d565b61146c565b34801561050f57600080fd5b506102cc6114b6565b34801561052457600080fd5b50610331610533366004613104565b6114c5565b610331610546366004613164565b611510565b34801561055757600080fd5b506102f9610566366004613164565b61172d565b34801561057757600080fd5b5061058b610586366004612e4d565b6117a4565b6040516102ae91906132cb565b3480156105a457600080fd5b506103846105b3366004612e4d565b611919565b3480156105c457600080fd5b506103316119a0565b3480156105d957600080fd5b506103316105e8366004613090565b6119d6565b3480156105f957600080fd5b506000546001600160a01b03166102f9565b34801561061757600080fd5b506102cc611a28565b34801561062c57600080fd5b506102cc611a37565b34801561064157600080fd5b50610331610650366004612fba565b611a46565b610331610663366004613164565b611a55565b34801561067457600080fd5b50610331610683366004613104565b611c93565b34801561069457600080fd5b506103316106a3366004612ede565b611cde565b3480156106b457600080fd5b506103316106c336600461301b565b611d16565b3480156106d457600080fd5b5047610384565b3480156106e757600080fd5b506102cc6106f6366004613164565b611e59565b34801561070757600080fd5b50610331610716366004613164565b611f08565b34801561072757600080fd5b50610331610736366004612e4d565b61200f565b34801561074757600080fd5b50610331610756366004613090565b61205b565b34801561076757600080fd5b50610445610776366004612e4d565b6120ad565b34801561078757600080fd5b50610331610796366004613090565b61212a565b3480156107a757600080fd5b506102a26107b6366004612e6f565b61217c565b3480156107c757600080fd5b506103316107d6366004612e4d565b6121aa565b3480156107e757600080fd5b506103316107f6366004613090565b612245565b34801561080757600080fd5b50610445610816366004612e4d565b612297565b60006001600160e01b031982166380ac58cd60e01b148061084c57506001600160e01b03198216635b5e139f60e01b145b8061086757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606001805461087c9061351c565b80601f01602080910402602001604051908101604052809291908181526020018280546108a89061351c565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661097d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006109a48261172d565b9050806001600160a01b0316836001600160a01b03161415610a125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610974565b336001600160a01b0382161480610a2e5750610a2e813361217c565b610aa05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610974565b610aaa8383612314565b505050565b6000546001600160a01b0316331480610ad257506008546001600160a01b031633145b610aee5760405162461bcd60e51b815260040161097490613410565b610afa600f6000612d3d565b60005b81811015610aaa576000838383818110610b1957610b196135b2565b9050602002016020810190610b2e9190612e4d565b6001600160a01b03161415610b855760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524c4953542053414c453a20696e76616c6964206c6973740000006044820152606401610974565b600f838383818110610b9957610b996135b2565b9050602002016020810190610bae9190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610bea81613557565b915050610afd565b6000546001600160a01b0316331480610c1557506008546001600160a01b031633145b610c315760405162461bcd60e51b815260040161097490613410565b601c91909155601d55565b6000546001600160a01b0316331480610c5f57506008546001600160a01b031633145b610c7b5760405162461bcd60e51b815260040161097490613410565b601791909155601855565b610c903382612382565b610cac5760405162461bcd60e51b8152600401610974906133bf565b610aaa838383612459565b6000546001600160a01b0316331480610cda57506008546001600160a01b031633145b610cf65760405162461bcd60e51b815260040161097490613410565b610d0260146000612d3d565b60005b81811015610aaa576000838383818110610d2157610d216135b2565b9050602002016020810190610d369190612e4d565b6001600160a01b03161415610d8d5760405162461bcd60e51b815260206004820152601d60248201527f574f4e4445524b4944532053414c453a20696e76616c6964206c6973740000006044820152606401610974565b6014838383818110610da157610da16135b2565b9050602002016020810190610db69190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580610df281613557565b915050610d05565b6000546001600160a01b0316331480610e1d57506008546001600160a01b031633145b610e395760405162461bcd60e51b815260040161097490613410565b60026007541415610e5c5760405162461bcd60e51b815260040161097490613457565b600260075547811115610ea85760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b6044820152606401610974565b600080546040516001600160a01b039091169182916108fc85150291859190818181858888f19350505050158015610ee4573d6000803e3d6000fd5b5050600160075550565b60026007541415610f115760405162461bcd60e51b815260040161097490613457565b60026007556000610f21336111c4565b805190915015610f735760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580610f88575060208101514210155b610fd45760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524c4953542053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580610fe85750604081015142105b6110345760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524c4953542053414c453a2066696e6973686564000000000000006044820152606401610974565b60808101516001146110885760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524c4953542053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c081015161109890839061348e565b60a082015110156110f65760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524c4953542053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b61111433838360035b602002015161110e91906134ba565b346125f5565b61111e3383612691565b336000908152601060205260408120805484929061113d90849061348e565b909155505060016007555050565b611153612d5b565b61115b612d5b565b601b5460ff161561116b57600181525b601c54602080830191909152601d5460408084019190915266f5232269808000606084015260016080840152600260a08401526001600160a01b0385166000908152601e9092529020548160065b602002015292915050565b6111cc612d5b565b6111d4612d5b565b600c5460ff16156111e457600181525b600d546020820152600e54604082015266d19c2ff9bf8000606082015261120c600f846127ce565b1561121957600160808201525b600260a08201526001600160a01b0383166000908152601060205260409020548160066111b9565b600260075414156112645760405162461bcd60e51b815260040161097490613457565b600260075560006112743361114b565b8051909150156112be5760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881cdd5cdc195b991959605a1b6044820152606401610974565b602081015115806112d3575060208101514210155b6113175760405162461bcd60e51b815260206004820152601560248201527411925390530814d053114e881b9bdd081bdc195b99605a1b6044820152606401610974565b6040810151158061132b5750604081015142105b61136e5760405162461bcd60e51b815260206004820152601460248201527311925390530814d053114e88199a5b9a5cda195960621b6044820152606401610974565b60c081015161137e90839061348e565b60a082015110156113d15760405162461bcd60e51b815260206004820152601d60248201527f46494e414c2053414c453a207265616368656420746865206c696d69740000006044820152606401610974565b6113de33838360036110ff565b6113e83383612691565b336000908152601e60205260408120805484929061113d90849061348e565b610aaa83838360405180602001604052806000815250611cde565b6000546001600160a01b031633148061144557506008546001600160a01b031633145b6114615760405162461bcd60e51b815260040161097490613410565b600d91909155600e55565b6000546001600160a01b031633148061148f57506008546001600160a01b031633145b6114ab5760405162461bcd60e51b815260040161097490613410565b601291909155601355565b60606009805461087c9061351c565b6000546001600160a01b03163314806114e857506008546001600160a01b031633145b6115045760405162461bcd60e51b815260040161097490613410565b610aaa600a8383612d79565b600260075414156115335760405162461bcd60e51b815260040161097490613457565b6002600755600061154333612297565b80519091501561158e5760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881cdd5cdc195b99195960521b6044820152606401610974565b602081015115806115a3575060208101514210155b6115e85760405162461bcd60e51b8152602060048201526016602482015275141550931250c814d053114e881b9bdd081bdc195b9960521b6044820152606401610974565b604081015115806115fc5750604081015142105b6116405760405162461bcd60e51b8152602060048201526015602482015274141550931250c814d053114e88199a5b9a5cda1959605a1b6044820152606401610974565b60808101516001146116945760405162461bcd60e51b815260206004820152601c60248201527f5055424c49432053414c453a206e6f742077686974656c6973746564000000006044820152606401610974565b60c08101516116a490839061348e565b60a082015110156116f75760405162461bcd60e51b815260206004820152601e60248201527f5055424c49432053414c453a207265616368656420746865206c696d697400006044820152606401610974565b61170433838360036110ff565b61170e3383612691565b336000908152601a60205260408120805484929061113d90849061348e565b6000818152600360205260408120546001600160a01b0316806108675760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610974565b6117ac612dfd565b6117b4612dfd565b6117bc612d5b565b6117c7600f856127ce565b80156117de5750600e5415806117de575042600e54115b156117fa57600160e08301526117f3846111c4565b905061187b565b6118056014856127ce565b801561181c5750601354158061181c575042601354115b1561183157600260e08301526117f3846120ad565b61183c6019856127ce565b801561185357506018541580611853575042601854115b1561186857600360e08301526117f384612297565b600460e08301526118788461114b565b90505b60005b60078110156118c757818160078110611899576118996135b2565b60200201518382600a81106118b0576118b06135b2565b6020020152806118bf81613557565b91505061187e565b50600b54826118d86007600161348e565b600a81106118e8576118e86135b2565b60200201526115b3826118fd6007600261348e565b600a811061190d5761190d6135b2565b60200201525092915050565b60006001600160a01b0382166119845760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610974565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146119ca5760405162461bcd60e51b81526004016109749061338a565b6119d4600061289e565b565b6000546001600160a01b03163314806119f957506008546001600160a01b031633145b611a155760405162461bcd60e51b815260040161097490613410565b601b805460ff1916911515919091179055565b60606002805461087c9061351c565b6060600a805461087c9061351c565b611a513383836128ee565b5050565b60026007541415611a785760405162461bcd60e51b815260040161097490613457565b60026007556000611a88336120ad565b805190915015611ada5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a2073757370656e6465640000000000006044820152606401610974565b60208101511580611aef575060208101514210155b611b3b5760405162461bcd60e51b815260206004820152601a60248201527f574f4e4445524b4944532053414c453a206e6f74206f70656e640000000000006044820152606401610974565b60408101511580611b4f5750604081015142105b611b9b5760405162461bcd60e51b815260206004820152601960248201527f574f4e4445524b4944532053414c453a2066696e6973686564000000000000006044820152606401610974565b6080810151600114611bef5760405162461bcd60e51b815260206004820181905260248201527f574f4e4445524b4944532053414c453a206e6f742077686974656c69737465646044820152606401610974565b60c0810151611bff90839061348e565b60a08201511015611c5d5760405162461bcd60e51b815260206004820152602260248201527f574f4e4445524b4944532053414c453a207265616368656420746865206c696d6044820152611a5d60f21b6064820152608401610974565b611c6a33838360036110ff565b611c743383612691565b336000908152601560205260408120805484929061113d90849061348e565b6000546001600160a01b0316331480611cb657506008546001600160a01b031633145b611cd25760405162461bcd60e51b815260040161097490613410565b610aaa60098383612d79565b611ce83383612382565b611d045760405162461bcd60e51b8152600401610974906133bf565b611d10848484846129bd565b50505050565b6000546001600160a01b0316331480611d3957506008546001600160a01b031633145b611d555760405162461bcd60e51b815260040161097490613410565b611d6160196000612d3d565b60005b81811015610aaa576000838383818110611d8057611d806135b2565b9050602002016020810190611d959190612e4d565b6001600160a01b03161415611dec5760405162461bcd60e51b815260206004820152601960248201527f5055424c49432053414c453a20696e76616c6964206c697374000000000000006044820152606401610974565b6019838383818110611e0057611e006135b2565b9050602002016020810190611e159190612e4d565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b0390921691909117905580611e5181613557565b915050611d64565b6000818152600360205260409020546060906001600160a01b0316611eb45760405162461bcd60e51b81526020600482015260116024820152703737b732bc34b9ba32b73a103a37b5b2b760791b6044820152606401610974565b6000600a8054611ec39061351c565b90501115611efd57600a611ed6836129f0565b604051602001611ee79291906131e7565b6040516020818303038152906040529050919050565b6009611ed6836129f0565b6000546001600160a01b0316331480611f2b57506008546001600160a01b031633145b611f475760405162461bcd60e51b815260040161097490613410565b607881600b54611f57919061348e565b1115611fa55760405162461bcd60e51b815260206004820152601e60248201527f657863656564656420746865207265736572766174696f6e2072616e676500006044820152606401610974565b60005b81811015611ff457611fe2611fc56000546001600160a01b031690565b611fd083600161348e565b600b54611fdd919061348e565b612aee565b80611fec81613557565b915050611fa8565b5080600b6000828254612007919061348e565b909155505050565b6000546001600160a01b031633146120395760405162461bcd60e51b81526004016109749061338a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633148061207e57506008546001600160a01b031633145b61209a5760405162461bcd60e51b815260040161097490613410565b600c805460ff1916911515919091179055565b6120b5612d5b565b6120bd612d5b565b60115460ff16156120cd57600181525b6012546020820152601354604082015266d19c2ff9bf800060608201526120f56014846127ce565b1561210257600160808201525b600160a08201526001600160a01b0383166000908152601560205260409020548160066111b9565b6000546001600160a01b031633148061214d57506008546001600160a01b031633145b6121695760405162461bcd60e51b815260040161097490613410565b6011805460ff1916911515919091179055565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146121d45760405162461bcd60e51b81526004016109749061338a565b6001600160a01b0381166122395760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610974565b6122428161289e565b50565b6000546001600160a01b031633148061226857506008546001600160a01b031633145b6122845760405162461bcd60e51b815260040161097490613410565b6016805460ff1916911515919091179055565b61229f612d5b565b6122a7612d5b565b60165460ff16156122b757600181525b6017546020820152601854604082015266f523226980800060608201526122df6019846127ce565b156122ec57600160808201525b600160a08201526001600160a01b0383166000908152601a60205260409020548160066111b9565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123498261172d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166123fb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610974565b60006124068361172d565b9050806001600160a01b0316846001600160a01b0316148061242d575061242d818561217c565b806124515750836001600160a01b0316612446846108ff565b6001600160a01b0316145b949350505050565b826001600160a01b031661246c8261172d565b6001600160a01b0316146124d05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610974565b6001600160a01b0382166125325760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610974565b61253d600082612314565b6001600160a01b03831660009081526004602052604081208054600192906125669084906134d9565b90915550506001600160a01b038216600090815260046020526040812080546001929061259490849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b8082111561263a5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742076616c756560701b6044820152606401610974565b80821015610aaa57600061264e83836134d9565b60405190915084906001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612689573d6000803e3d6000fd5b505050505050565b6001600160a01b0382166126d45760405162461bcd60e51b815260206004820152600a602482015269696e76616c696420746f60b01b6044820152606401610974565b6078600b5410156127275760405162461bcd60e51b815260206004820152601860248201527f7265736572766174696f6e206e6f742066696e697368656400000000000000006044820152606401610974565b6115b381600b54612738919061348e565b11156127865760405162461bcd60e51b815260206004820152601960248201527f65786365656465642074686520737570706c792072616e6765000000000000006044820152606401610974565b60005b818110156127b2576127a083611fd083600161348e565b806127aa81613557565b915050612789565b5080600b60008282546127c5919061348e565b90915550505050565b6000805b8354811015612894578381815481106127ed576127ed6135b2565b600091825260209091200154604051631846d2f560e31b81526001600160a01b0385811660048301529091169063c23697a89060240160206040518083038186803b15801561283b57600080fd5b505afa15801561284f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287391906130ad565b15612882576001915050610867565b8061288c81613557565b9150506127d2565b5060009392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156129505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610974565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6129c8848484612459565b6129d484848484612c30565b611d105760405162461bcd60e51b815260040161097490613338565b606081612a145750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612a3e5780612a2881613557565b9150612a379050600a836134a6565b9150612a18565b60008167ffffffffffffffff811115612a5957612a596135c8565b6040519080825280601f01601f191660200182016040528015612a83576020820181803683370190505b5090505b841561245157612a986001836134d9565b9150612aa5600a86613572565b612ab090603061348e565b60f81b818381518110612ac557612ac56135b2565b60200101906001600160f81b031916908160001a905350612ae7600a866134a6565b9450612a87565b6001600160a01b038216612b445760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610974565b6000818152600360205260409020546001600160a01b031615612ba95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610974565b6001600160a01b0382166000908152600460205260408120805460019290612bd290849061348e565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b15612d3257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c7490339089908890889060040161328e565b602060405180830381600087803b158015612c8e57600080fd5b505af1925050508015612cbe575060408051601f3d908101601f19168201909252612cbb918101906130e7565b60015b612d18573d808015612cec576040519150601f19603f3d011682016040523d82523d6000602084013e612cf1565b606091505b508051612d105760405162461bcd60e51b815260040161097490613338565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612451565b506001949350505050565b50805460008255906000526020600020908101906122429190612e1c565b6040518060e001604052806007906020820280368337509192915050565b828054612d859061351c565b90600052602060002090601f016020900481019282612da75760008555612ded565b82601f10612dc05782800160ff19823516178555612ded565b82800160010185558215612ded579182015b82811115612ded578235825591602001919060010190612dd2565b50612df9929150612e1c565b5090565b604051806101400160405280600a906020820280368337509192915050565b5b80821115612df95760008155600101612e1d565b80356001600160a01b0381168114612e4857600080fd5b919050565b600060208284031215612e5f57600080fd5b612e6882612e31565b9392505050565b60008060408385031215612e8257600080fd5b612e8b83612e31565b9150612e9960208401612e31565b90509250929050565b600080600060608486031215612eb757600080fd5b612ec084612e31565b9250612ece60208501612e31565b9150604084013590509250925092565b60008060008060808587031215612ef457600080fd5b612efd85612e31565b9350612f0b60208601612e31565b925060408501359150606085013567ffffffffffffffff80821115612f2f57600080fd5b818701915087601f830112612f4357600080fd5b813581811115612f5557612f556135c8565b604051601f8201601f19908116603f01168101908382118183101715612f7d57612f7d6135c8565b816040528281528a6020848701011115612f9657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215612fcd57600080fd5b612fd683612e31565b91506020830135612fe6816135de565b809150509250929050565b6000806040838503121561300457600080fd5b61300d83612e31565b946020939093013593505050565b6000806020838503121561302e57600080fd5b823567ffffffffffffffff8082111561304657600080fd5b818501915085601f83011261305a57600080fd5b81358181111561306957600080fd5b8660208260051b850101111561307e57600080fd5b60209290920196919550909350505050565b6000602082840312156130a257600080fd5b8135612e68816135de565b6000602082840312156130bf57600080fd5b8151612e68816135de565b6000602082840312156130dc57600080fd5b8135612e68816135ec565b6000602082840312156130f957600080fd5b8151612e68816135ec565b6000806020838503121561311757600080fd5b823567ffffffffffffffff8082111561312f57600080fd5b818501915085601f83011261314357600080fd5b81358181111561315257600080fd5b86602082850101111561307e57600080fd5b60006020828403121561317657600080fd5b5035919050565b6000806040838503121561319057600080fd5b50508035926020909101359150565b600081518084526131b78160208601602086016134f0565b601f01601f19169290920160200192915050565b600081516131dd8185602086016134f0565b9290920192915050565b600080845481600182811c91508083168061320357607f831692505b602080841082141561322357634e487b7160e01b86526022600452602486fd5b818015613237576001811461324857613275565b60ff19861689528489019650613275565b60008b81526020902060005b8681101561326d5781548b820152908501908301613254565b505084890196505b50505050505061328581856131cb565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906132c19083018461319f565b9695505050505050565b6101408101818360005b600a8110156132f45781518352602092830192909101906001016132d5565b50505092915050565b60e08101818360005b60078110156132f4578151835260209283019290910190600101613306565b602081526000612e68602083018461319f565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526027908201527f63616c6c6572206973206e6f7420746865206f776e6572206e6569746865722060408201526636b0b730b3b2b960c91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156134a1576134a1613586565b500190565b6000826134b5576134b561359c565b500490565b60008160001904831182151516156134d4576134d4613586565b500290565b6000828210156134eb576134eb613586565b500390565b60005b8381101561350b5781810151838201526020016134f3565b83811115611d105750506000910152565b600181811c9082168061353057607f821691505b6020821081141561355157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561356b5761356b613586565b5060010190565b6000826135815761358161359c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461224257600080fd5b6001600160e01b03198116811461224257600080fdfea2646970667358221220a29e41f7c5e30596474dfcc55fd6fe1914ef83da1c44c7ef38aa0b966530843f64736f6c63430008070033
Deployed Bytecode Sourcemap
39234:24375:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22973:305;;;;;;;;;;-1:-1:-1;22973:305:0;;;;;:::i;:::-;;:::i;:::-;;;8857:14:1;;8850:22;8832:41;;8820:2;8805:18;22973:305:0;;;;;;;;23918:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25478:221::-;;;;;;;;;;-1:-1:-1;25478:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7153:32:1;;;7135:51;;7123:2;7108:18;25478:221:0;6989:203:1;25001:411:0;;;;;;;;;;-1:-1:-1;25001:411:0;;;;;:::i;:::-;;:::i;:::-;;49900:367;;;;;;;;;;-1:-1:-1;49900:367:0;;;;;:::i;:::-;;:::i;58144:165::-;;;;;;;;;;-1:-1:-1;58144:165:0;;;;;:::i;:::-;;:::i;47763:96::-;;;;;;;;;;-1:-1:-1;47837:12:0;;47763:96;;;26332:25:1;;;26320:2;26305:18;47763:96:0;26186:177:1;55434:168:0;;;;;;;;;;-1:-1:-1;55434:168:0;;;;;:::i;:::-;;:::i;26228:339::-;;;;;;;;;;-1:-1:-1;26228:339:0;;;;;:::i;:::-;;:::i;52794:367::-;;;;;;;;;;-1:-1:-1;52794:367:0;;;;;:::i;:::-;;:::i;63350:254::-;;;;;;;;;;-1:-1:-1;63350:254:0;;;;;:::i;:::-;;:::i;50453:903::-;;;;;;:::i;:::-;;:::i;57206:581::-;;;;;;;;;;-1:-1:-1;57206:581:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48641:681::-;;;;;;;;;;-1:-1:-1;48641:681:0;;;;;:::i;:::-;;:::i;58490:775::-;;;;;;:::i;:::-;;:::i;26638:185::-;;;;;;;;;;-1:-1:-1;26638:185:0;;;;;:::i;:::-;;:::i;46029:86::-;;;;;;;;;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;46029:86;;49694:180;;;;;;;;;;-1:-1:-1;49694:180:0;;;;;:::i;:::-;;:::i;52588:::-;;;;;;;;;;-1:-1:-1;52588:180:0;;;;;:::i;:::-;;:::i;46556:112::-;;;;;;;;;;;;;:::i;47470:126::-;;;;;;;;;;-1:-1:-1;47470:126:0;;;;;:::i;:::-;;:::i;56161:871::-;;;;;;:::i;:::-;;:::i;23612:239::-;;;;;;;;;;-1:-1:-1;23612:239:0;;;;;:::i;:::-;;:::i;61513:1380::-;;;;;;;;;;-1:-1:-1;61513:1380:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23342:208::-;;;;;;;;;;-1:-1:-1;23342:208:0;;;;;:::i;:::-;;:::i;4513:103::-;;;;;;;;;;;;;:::i;58000:118::-;;;;;;;;;;-1:-1:-1;58000:118:0;;;;;:::i;:::-;;:::i;3862:87::-;;;;;;;;;;-1:-1:-1;3908:7:0;3935:6;-1:-1:-1;;;;;3935:6:0;3862:87;;24087:104;;;;;;;;;;;;;:::i;47158:116::-;;;;;;;;;;;;;:::i;25771:155::-;;;;;;;;;;-1:-1:-1;25771:155:0;;;;;:::i;:::-;;:::i;53347:903::-;;;;;;:::i;:::-;;:::i;46862:122::-;;;;;;;;;;-1:-1:-1;46862:122:0;;;;;:::i;:::-;;:::i;26894:328::-;;;;;;;;;;-1:-1:-1;26894:328:0;;;;;:::i;:::-;;:::i;55628:351::-;;;;;;;;;;-1:-1:-1;55628:351:0;;;;;:::i;:::-;;:::i;63061:106::-;;;;;;;;;;-1:-1:-1;63136:21:0;63061:106;;48030:432;;;;;;;;;;-1:-1:-1;48030:432:0;;;;;:::i;:::-;;:::i;61045:301::-;;;;;;;;;;-1:-1:-1;61045:301:0;;;;;:::i;:::-;;:::i;46291:93::-;;;;;;;;;;-1:-1:-1;46291:93:0;;;;;:::i;:::-;;:::i;49540:128::-;;;;;;;;;;-1:-1:-1;49540:128:0;;;;;:::i;:::-;;:::i;51535:681::-;;;;;;;;;;-1:-1:-1;51535:681:0;;;;;:::i;:::-;;:::i;52434:128::-;;;;;;;;;;-1:-1:-1;52434:128:0;;;;;:::i;:::-;;:::i;25997:164::-;;;;;;;;;;-1:-1:-1;25997:164:0;;;;;:::i;:::-;;:::i;4771:201::-;;;;;;;;;;-1:-1:-1;4771:201:0;;;;;:::i;:::-;;:::i;55288:120::-;;;;;;;;;;-1:-1:-1;55288:120:0;;;;;:::i;:::-;;:::i;54425:649::-;;;;;;;;;;-1:-1:-1;54425:649:0;;;;;:::i;:::-;;:::i;22973:305::-;23075:4;-1:-1:-1;;;;;;23112:40:0;;-1:-1:-1;;;23112:40:0;;:105;;-1:-1:-1;;;;;;;23169:48:0;;-1:-1:-1;;;23169:48:0;23112:105;:158;;;-1:-1:-1;;;;;;;;;;21689:40:0;;;23234:36;23092:178;22973:305;-1:-1:-1;;22973:305:0:o;23918:100::-;23972:13;24005:5;23998:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23918:100;:::o;25478:221::-;25554:7;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;25574:73;;;;-1:-1:-1;;;25574:73:0;;19082:2:1;25574:73:0;;;19064:21:1;19121:2;19101:18;;;19094:30;19160:34;19140:18;;;19133:62;-1:-1:-1;;;19211:18:1;;;19204:42;19263:19;;25574:73:0;;;;;;;;;-1:-1:-1;25667:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25667:24:0;;25478:221::o;25001:411::-;25082:13;25098:23;25113:7;25098:14;:23::i;:::-;25082:39;;25146:5;-1:-1:-1;;;;;25140:11:0;:2;-1:-1:-1;;;;;25140:11:0;;;25132:57;;;;-1:-1:-1;;;25132:57:0;;21971:2:1;25132:57:0;;;21953:21:1;22010:2;21990:18;;;21983:30;22049:34;22029:18;;;22022:62;-1:-1:-1;;;22100:18:1;;;22093:31;22141:19;;25132:57:0;21769:397:1;25132:57:0;2751:10;-1:-1:-1;;;;;25224:21:0;;;;:62;;-1:-1:-1;25249:37:0;25266:5;2751:10;25997:164;:::i;25249:37::-;25202:168;;;;-1:-1:-1;;;25202:168:0;;16050:2:1;25202:168:0;;;16032:21:1;16089:2;16069:18;;;16062:30;16128:34;16108:18;;;16101:62;16199:26;16179:18;;;16172:54;16243:19;;25202:168:0;15848:420:1;25202:168:0;25383:21;25392:2;25396:7;25383:8;:21::i;:::-;25071:341;25001:411;;:::o;49900:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;50005:36:::1;50012:29;;50005:36;:::i;:::-;50059:9;50054:206;50072:14:::0;;::::1;50054:206;;;50137:1;50117:5:::0;;50123:1;50117:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50117:22:0::1;;;50108:67;;;::::0;-1:-1:-1;;;50108:67:0;;25670:2:1;50108:67:0::1;::::0;::::1;25652:21:1::0;25709:2;25689:18;;;25682:30;25748:31;25728:18;;;25721:59;25797:18;;50108:67:0::1;25468:353:1::0;50108:67:0::1;50190:29;50237:5;;50243:1;50237:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50190:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;50190:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;50190:58:0::1;-1:-1:-1::0;;;;;50190:58:0;;::::1;::::0;;;::::1;::::0;;50088:3;::::1;::::0;::::1;:::i;:::-;;;;50054:206;;58144:165:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;58244:17:::1;:25:::0;;;;58280:15:::1;:21:::0;58144:165::o;55434:168::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;55535:18:::1;:26:::0;;;;55572:16:::1;:22:::0;55434:168::o;26228:339::-;26423:41;2751:10;26456:7;26423:18;:41::i;:::-;26415:103;;;;-1:-1:-1;;;26415:103:0;;;;;;;:::i;:::-;26531:28;26541:4;26547:2;26551:7;26531:9;:28::i;52794:367::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;52899:36:::1;52906:29;;52899:36;:::i;:::-;52953:9;52948:206;52966:14:::0;;::::1;52948:206;;;53031:1;53011:5:::0;;53017:1;53011:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53011:22:0::1;;;53002:67;;;::::0;-1:-1:-1;;;53002:67:0;;20551:2:1;53002:67:0::1;::::0;::::1;20533:21:1::0;20590:2;20570:18;;;20563:30;20629:31;20609:18;;;20602:59;20678:18;;53002:67:0::1;20349:353:1::0;53002:67:0::1;53084:29;53131:5;;53137:1;53131:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;53084:58:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;53084:58:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;53084:58:0::1;-1:-1:-1::0;;;;;53084:58:0;;::::1;::::0;;;::::1;::::0;;52982:3;::::1;::::0;::::1;:::i;:::-;;;;52948:206;;63350:254:::0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;37807:1:::1;38405:7;;:19;;38397:63;;;;-1:-1:-1::0;;;38397:63:0::1;;;;;;;:::i;:::-;37807:1;38538:7;:18:::0;63457:21:::2;63447:31:::0;::::2;;63438:66;;;::::0;-1:-1:-1;;;63438:66:0;;20202:2:1;63438:66:0::2;::::0;::::2;20184:21:1::0;20241:2;20221:18;;;20214:30;-1:-1:-1;;;20260:18:1;;;20253:50;20320:18;;63438:66:0::2;20000:344:1::0;63438:66:0::2;63517:22;3935:6:::0;;63571:25:::2;::::0;-1:-1:-1;;;;;3935:6:0;;;;;;63571:25:::2;::::0;::::2;;::::0;;;;;63517:22;63571:25;;3935:6;63571:25;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;37763:1:0::1;38717:7;:22:::0;-1:-1:-1;63350:254:0:o;50453:903::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;50539:32:::1;50574:37;50599:10;50574:23;:37::i;:::-;50633:28:::0;;50539:72;;-1:-1:-1;50633:33:0;50624:74:::1;;;::::0;-1:-1:-1;;;50624:74:0;;10376:2:1;50624:74:0::1;::::0;::::1;10358:21:1::0;10415:2;10395:18;;;10388:30;10454:28;10434:18;;;10427:56;10500:18;;50624:74:0::1;10174:350:1::0;50624:74:0::1;50718:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;50751:24:0::1;::::0;::::1;::::0;50779:15:::1;-1:-1:-1::0;50751:43:0::1;50718:76;50709:117;;;::::0;-1:-1:-1;;;50709:117:0;;22373:2:1;50709:117:0::1;::::0;::::1;22355:21:1::0;22412:2;22392:18;;;22385:30;22451:28;22431:18;;;22424:56;22497:18;;50709:117:0::1;22171:350:1::0;50709:117:0::1;50846:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;50877:22:0;;::::1;::::0;50902:15:::1;-1:-1:-1::0;50846:71:0::1;50837:111;;;::::0;-1:-1:-1;;;50837:111:0;;12681:2:1;50837:111:0::1;::::0;::::1;12663:21:1::0;12720:2;12700:18;;;12693:30;12759:27;12739:18;;;12732:55;12804:18;;50837:111:0::1;12479:349:1::0;50837:111:0::1;50968:30:::0;;::::1;::::0;51002:1:::1;50968:35;50959:82;;;::::0;-1:-1:-1;;;50959:82:0;;11963:2:1;50959:82:0::1;::::0;::::1;11945:21:1::0;;;11982:18;;;11975:30;12041:34;12021:18;;;12014:62;12093:18;;50959:82:0::1;11761:356:1::0;50959:82:0::1;51093:30:::0;;::::1;::::0;:34:::1;::::0;51124:3;;51093:34:::1;:::i;:::-;51061:27:::0;;::::1;::::0;:67:::1;;51052:116;;;::::0;-1:-1:-1;;;51052:116:0;;14492:2:1;51052:116:0::1;::::0;::::1;14474:21:1::0;14531:2;14511:18;;;14504:30;14570:34;14550:18;;;14543:62;-1:-1:-1;;;14621:18:1;;;14614:32;14663:19;;51052:116:0::1;14290:398:1::0;51052:116:0::1;51181:68;51196:10;51233:3:::0;51208:7;40745:1:::1;51208:24;;;;;:28;;;;:::i;:::-;51238:9;51181:13;:68::i;:::-;51262:30;51275:10;51287:3;51262:11;:30::i;:::-;51330:10;51303:38;::::0;;;:26:::1;:38;::::0;;;;:45;;51345:3;;51303:38;:45:::1;::::0;51345:3;;51303:45:::1;:::i;:::-;::::0;;;-1:-1:-1;;37763:1:0;38717:7;:22;-1:-1:-1;;50453:903:0:o;57206:581::-;57273:24;;:::i;:::-;57310:31;;:::i;:::-;57358:23;;;;57354:65;;;57415:1;57385:31;;57354:65;57455:17;;57429:23;;;;:43;;;;57507:15;;57483:21;;;;:39;;;;40434:17;57533:23;;;:42;40645:1;57586:29;;;:33;40694:1;57630:26;;;:48;-1:-1:-1;;;;;57721:29:0;;-1:-1:-1;57721:29:0;;;:21;:29;;;;;;57429:6;40913:1;57689:29;;;;:61;57771:6;57206:581;-1:-1:-1;;57206:581:0:o;48641:681::-;48713:24;;:::i;:::-;48750:31;;:::i;:::-;48798:28;;;;48794:70;;;48860:1;48830:31;;48794:70;48900:22;;48874:23;;;:48;48957:20;;48933:21;;;:44;39933:17;48988:23;;;:47;49050:55;49067:29;49098:6;49050:15;:55::i;:::-;49046:99;;;49141:1;49109:29;;;:33;49046:99;40023:1;49155:26;;;:53;-1:-1:-1;;;;;49251:34:0;;;;;;:26;49155;49251:34;;;;;49155:6;40913:1;49219:29;;58490:775;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;58571:32:::1;58606;58626:10;58606:18;:32::i;:::-;58660:28:::0;;58571:67;;-1:-1:-1;58660:33:0;58651:69:::1;;;::::0;-1:-1:-1;;;58651:69:0;;22728:2:1;58651:69:0::1;::::0;::::1;22710:21:1::0;22767:2;22747:18;;;22740:30;-1:-1:-1;;;22786:18:1;;;22779:51;22847:18;;58651:69:0::1;22526:345:1::0;58651:69:0::1;58740:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;58773:24:0::1;::::0;::::1;::::0;58801:15:::1;-1:-1:-1::0;58773:43:0::1;58740:76;58731:112;;;::::0;-1:-1:-1;;;58731:112:0;;21264:2:1;58731:112:0::1;::::0;::::1;21246:21:1::0;21303:2;21283:18;;;21276:30;-1:-1:-1;;;21322:18:1;;;21315:51;21383:18;;58731:112:0::1;21062:345:1::0;58731:112:0::1;58863:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;58894:22:0;;::::1;::::0;58919:15:::1;-1:-1:-1::0;58863:71:0::1;58854:106;;;::::0;-1:-1:-1;;;58854:106:0;;24259:2:1;58854:106:0::1;::::0;::::1;24241:21:1::0;24298:2;24278:18;;;24271:30;-1:-1:-1;;;24317:18:1;;;24310:50;24377:18;;58854:106:0::1;24057:344:1::0;58854:106:0::1;59012:30:::0;;::::1;::::0;:34:::1;::::0;59043:3;;59012:34:::1;:::i;:::-;58980:27:::0;;::::1;::::0;:67:::1;;58971:111;;;::::0;-1:-1:-1;;;58971:111:0;;18363:2:1;58971:111:0::1;::::0;::::1;18345:21:1::0;18402:2;18382:18;;;18375:30;18441:31;18421:18;;;18414:59;18490:18;;58971:111:0::1;18161:353:1::0;58971:111:0::1;59095:68;59110:10;59147:3:::0;59122:7;40745:1:::1;59122:24;::::0;59095:68:::1;59176:30;59189:10;59201:3;59176:11;:30::i;:::-;59239:10;59217:33;::::0;;;:21:::1;:33;::::0;;;;:40;;59254:3;;59217:33;:40:::1;::::0;59254:3;;59217:40:::1;:::i;26638:185::-:0;26776:39;26793:4;26799:2;26803:7;26776:39;;;;;;;;;;;;:16;:39::i;49694:180::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;49799:22:::1;:30:::0;;;;49840:20:::1;:26:::0;49694:180::o;52588:::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;52693:22:::1;:30:::0;;;;52734:20:::1;:26:::0;52588:180::o;46556:112::-;46607:13;46641:17;46633:27;;;;;:::i;47470:126::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;47563:25:::1;:19;47585:3:::0;;47563:25:::1;:::i;56161:871::-:0;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;56243:32:::1;56278:33;56299:10;56278:19;:33::i;:::-;56333:28:::0;;56243:68;;-1:-1:-1;56333:33:0;56324:70:::1;;;::::0;-1:-1:-1;;;56324:70:0;;14141:2:1;56324:70:0::1;::::0;::::1;14123:21:1::0;14180:2;14160:18;;;14153:30;-1:-1:-1;;;14199:18:1;;;14192:52;14261:18;;56324:70:0::1;13939:346:1::0;56324:70:0::1;56414:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;56447:24:0::1;::::0;::::1;::::0;56475:15:::1;-1:-1:-1::0;56447:43:0::1;56414:76;56405:113;;;::::0;-1:-1:-1;;;56405:113:0;;9664:2:1;56405:113:0::1;::::0;::::1;9646:21:1::0;9703:2;9683:18;;;9676:30;-1:-1:-1;;;9722:18:1;;;9715:52;9784:18;;56405:113:0::1;9462:346:1::0;56405:113:0::1;56538:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;56569:22:0;;::::1;::::0;56594:15:::1;-1:-1:-1::0;56538:71:0::1;56529:107;;;::::0;-1:-1:-1;;;56529:107:0;;25320:2:1;56529:107:0::1;::::0;::::1;25302:21:1::0;25359:2;25339:18;;;25332:30;-1:-1:-1;;;25378:18:1;;;25371:51;25439:18;;56529:107:0::1;25118:345:1::0;56529:107:0::1;56656:30:::0;;::::1;::::0;56690:1:::1;56656:35;56647:78;;;::::0;-1:-1:-1;;;56647:78:0;;21614:2:1;56647:78:0::1;::::0;::::1;21596:21:1::0;21653:2;21633:18;;;21626:30;21692;21672:18;;;21665:58;21740:18;;56647:78:0::1;21412:352:1::0;56647:78:0::1;56777:30:::0;;::::1;::::0;:34:::1;::::0;56808:3;;56777:34:::1;:::i;:::-;56745:27:::0;;::::1;::::0;:67:::1;;56736:112;;;::::0;-1:-1:-1;;;56736:112:0;;24608:2:1;56736:112:0::1;::::0;::::1;24590:21:1::0;24647:2;24627:18;;;24620:30;24686:32;24666:18;;;24659:60;24736:18;;56736:112:0::1;24406:354:1::0;56736:112:0::1;56861:68;56876:10;56913:3:::0;56888:7;40745:1:::1;56888:24;::::0;56861:68:::1;56942:30;56955:10;56967:3;56942:11;:30::i;:::-;57006:10;56983:34;::::0;;;:22:::1;:34;::::0;;;;:41;;57021:3;;56983:34;:41:::1;::::0;57021:3;;56983:41:::1;:::i;23612:239::-:0;23684:7;23720:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23720:16:0;23755:19;23747:73;;;;-1:-1:-1;;;23747:73:0;;17953:2:1;23747:73:0;;;17935:21:1;17992:2;17972:18;;;17965:30;18031:34;18011:18;;;18004:62;-1:-1:-1;;;18082:18:1;;;18075:39;18131:19;;23747:73:0;17751:405:1;61513:1380:0;61575:29;;:::i;:::-;61616:38;;:::i;:::-;61665:29;;:::i;:::-;61734:56;61751:29;61782:6;61734:15;:56::i;:::-;:129;;;;-1:-1:-1;61795:20:0;;:25;;:67;;;61847:15;61824:20;;:38;61795:67;61730:928;;;61907:1;61880:24;;;:28;61930:33;61955:6;61930:23;:33::i;:::-;61923:40;;61730:928;;;62017:56;62034:29;62065:6;62017:15;:56::i;:::-;:129;;;;-1:-1:-1;62078:20:0;;:25;;:67;;;62130:15;62107:20;;:38;62078:67;62013:645;;;62190:1;62163:24;;;:28;62213:33;62238:6;62213:23;:33::i;62013:645::-;62296:52;62313:25;62340:6;62296:15;:52::i;:::-;:117;;;;-1:-1:-1;62353:16:0;;:21;;:59;;;62397:15;62378:16;;:34;62353:59;62292:366;;;62457:1;62430:24;;;:28;62480:29;62501:6;62480:19;:29::i;62292:366::-;62595:1;62568:24;;;:28;62618;62638:6;62618:18;:28::i;:::-;62611:35;;62292:366;62675:9;62670:83;40957:1;62688;:10;62670:83;;;62734:4;62739:1;62734:7;;;;;;;:::i;:::-;;;;;62720:8;62729:1;62720:11;;;;;;;:::i;:::-;;;;:21;62700:3;;;;:::i;:::-;;;;62670:83;;;-1:-1:-1;62794:12:0;;62765:8;41066:12;40957:1;41077;41066:12;:::i;:::-;62765:26;;;;;;;:::i;:::-;;;;:41;39795:4;62817:8;41128:12;40957:1;41139;41128:12;:::i;:::-;62817:25;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;62875:8:0;61513:1380;-1:-1:-1;;61513:1380:0:o;23342:208::-;23414:7;-1:-1:-1;;;;;23442:19:0;;23434:74;;;;-1:-1:-1;;;23434:74:0;;17542:2:1;23434:74:0;;;17524:21:1;17581:2;17561:18;;;17554:30;17620:34;17600:18;;;17593:62;-1:-1:-1;;;17671:18:1;;;17664:40;17721:19;;23434:74:0;17340:406:1;23434:74:0;-1:-1:-1;;;;;;23526:16:0;;;;;:9;:16;;;;;;;23342:208::o;4513:103::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;4578:30:::1;4605:1;4578:18;:30::i;:::-;4513:103::o:0;58000:118::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;58080:23:::1;:30:::0;;-1:-1:-1;;58080:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58000:118::o;24087:104::-;24143:13;24176:7;24169:14;;;;;:::i;47158:116::-;47211:13;47245:19;47237:29;;;;;:::i;25771:155::-;25866:52;2751:10;25899:8;25909;25866:18;:52::i;:::-;25771:155;;:::o;53347:903::-;37807:1;38405:7;;:19;;38397:63;;;;-1:-1:-1;;;38397:63:0;;;;;;;:::i;:::-;37807:1;38538:7;:18;53433:32:::1;53468:37;53493:10;53468:23;:37::i;:::-;53527:28:::0;;53433:72;;-1:-1:-1;53527:33:0;53518:74:::1;;;::::0;-1:-1:-1;;;53518:74:0;;23078:2:1;53518:74:0::1;::::0;::::1;23060:21:1::0;23117:2;23097:18;;;23090:30;23156:28;23136:18;;;23129:56;23202:18;;53518:74:0::1;22876:350:1::0;53518:74:0::1;53612:24;::::0;::::1;::::0;:29;;:76:::1;;-1:-1:-1::0;53645:24:0::1;::::0;::::1;::::0;53673:15:::1;-1:-1:-1::0;53645:43:0::1;53612:76;53603:117;;;::::0;-1:-1:-1;;;53603:117:0;;20909:2:1;53603:117:0::1;::::0;::::1;20891:21:1::0;20948:2;20928:18;;;20921:30;20987:28;20967:18;;;20960:56;21033:18;;53603:117:0::1;20707:350:1::0;53603:117:0::1;53740:22:::0;;::::1;::::0;:27;;:71:::1;;-1:-1:-1::0;53771:22:0;;::::1;::::0;53796:15:::1;-1:-1:-1::0;53740:71:0::1;53731:111;;;::::0;-1:-1:-1;;;53731:111:0;;17188:2:1;53731:111:0::1;::::0;::::1;17170:21:1::0;17227:2;17207:18;;;17200:30;17266:27;17246:18;;;17239:55;17311:18;;53731:111:0::1;16986:349:1::0;53731:111:0::1;53862:30:::0;;::::1;::::0;53896:1:::1;53862:35;53853:82;;;::::0;-1:-1:-1;;;53853:82:0;;10015:2:1;53853:82:0::1;::::0;::::1;9997:21:1::0;;;10034:18;;;10027:30;10093:34;10073:18;;;10066:62;10145:18;;53853:82:0::1;9813:356:1::0;53853:82:0::1;53987:30:::0;;::::1;::::0;:34:::1;::::0;54018:3;;53987:34:::1;:::i;:::-;53955:27:::0;;::::1;::::0;:67:::1;;53946:116;;;::::0;-1:-1:-1;;;53946:116:0;;15647:2:1;53946:116:0::1;::::0;::::1;15629:21:1::0;15686:2;15666:18;;;15659:30;15725:34;15705:18;;;15698:62;-1:-1:-1;;;15776:18:1;;;15769:32;15818:19;;53946:116:0::1;15445:398:1::0;53946:116:0::1;54075:68;54090:10;54127:3:::0;54102:7;40745:1:::1;54102:24;::::0;54075:68:::1;54156:30;54169:10;54181:3;54156:11;:30::i;:::-;54224:10;54197:38;::::0;;;:26:::1;:38;::::0;;;;:45;;54239:3;;54197:38;:45:::1;::::0;54239:3;;54197:45:::1;:::i;46862:122::-:0;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;46953:23:::1;:17;46973:3:::0;;46953:23:::1;:::i;26894:328::-:0;27069:41;2751:10;27102:7;27069:18;:41::i;:::-;27061:103;;;;-1:-1:-1;;;27061:103:0;;;;;;;:::i;:::-;27175:39;27189:4;27195:2;27199:7;27208:5;27175:13;:39::i;:::-;26894:328;;;;:::o;55628:351::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;55729:32:::1;55736:25;;55729:32;:::i;:::-;55779:9;55774:198;55792:14:::0;;::::1;55774:198;;;55857:1;55837:5:::0;;55843:1;55837:8;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55837:22:0::1;;;55828:63;;;::::0;-1:-1:-1;;;55828:63:0;;16475:2:1;55828:63:0::1;::::0;::::1;16457:21:1::0;16514:2;16494:18;;;16487:30;16553:27;16533:18;;;16526:55;16598:18;;55828:63:0::1;16273:349:1::0;55828:63:0::1;55906:25;55949:5;;55955:1;55949:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;55906:54:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;55906:54:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;55906:54:0::1;-1:-1:-1::0;;;;;55906:54:0;;::::1;::::0;;;::::1;::::0;;55808:3;::::1;::::0;::::1;:::i;:::-;;;;55774:198;;48030:432:::0;28797:4;28821:16;;;:7;:16;;;;;;48097:13;;-1:-1:-1;;;;;28821:16:0;48123:50;;;;-1:-1:-1;;;48123:50:0;;19495:2:1;48123:50:0;;;19477:21:1;19534:2;19514:18;;;19507:30;-1:-1:-1;;;19553:18:1;;;19546:47;19610:18;;48123:50:0;19293:341:1;48123:50:0;48226:1;48196:19;48190:33;;;;;:::i;:::-;;;:37;48186:170;;;48278:19;48299:27;48317:7;48299:16;:27::i;:::-;48260:68;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48244:88;;48030:432;;;:::o;48186:170::-;48402:17;48421:27;48439:7;48421:16;:27::i;61045:301::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;39848:3:::1;61145;61132:12;;:16;;;;:::i;:::-;61131:36;;61122:81;;;::::0;-1:-1:-1;;;61122:81:0;;16829:2:1;61122:81:0::1;::::0;::::1;16811:21:1::0;16868:2;16848:18;;;16841:30;16907:32;16887:18;;;16880:60;16957:18;;61122:81:0::1;16627:354:1::0;61122:81:0::1;61221:9;61216:93;61236:3;61234:1;:5;61216:93;;;61261:36;61268:7;3908::::0;3935:6;-1:-1:-1;;;;;3935:6:0;;3862:87;61268:7:::1;61291:3;:1:::0;61293::::1;61291:3;:::i;:::-;61277:12;;:18;;;;:::i;:::-;61261:5;:36::i;:::-;61241:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61216:93;;;;61335:3;61319:12;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;61045:301:0:o;46291:93::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;46359:8:::1;:17:::0;;-1:-1:-1;;;;;;46359:17:0::1;-1:-1:-1::0;;;;;46359:17:0;;;::::1;::::0;;;::::1;::::0;;46291:93::o;49540:128::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;49625:28:::1;:35:::0;;-1:-1:-1;;49625:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49540:128::o;51535:681::-;51607:24;;:::i;:::-;51644:31;;:::i;:::-;51692:28;;;;51688:70;;;51754:1;51724:31;;51688:70;51794:22;;51768:23;;;:48;51851:20;;51827:21;;;:44;40106:17;51882:23;;;:47;51944:55;51961:29;51992:6;51944:15;:55::i;:::-;51940:99;;;52035:1;52003:29;;;:33;51940:99;40196:1;52049:26;;;:53;-1:-1:-1;;;;;52145:34:0;;;;;;:26;52049;52145:34;;;;;52049:6;40913:1;52113:29;;52434:128;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;52519:28:::1;:35:::0;;-1:-1:-1;;52519:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52434:128::o;25997:164::-;-1:-1:-1;;;;;26118:25:0;;;26094:4;26118:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25997:164::o;4771:201::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;2751:10;4082:23;4074:68;;;;-1:-1:-1;;;4074:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4860:22:0;::::1;4852:73;;;::::0;-1:-1:-1;;;4852:73:0;;11150:2:1;4852:73:0::1;::::0;::::1;11132:21:1::0;11189:2;11169:18;;;11162:30;11228:34;11208:18;;;11201:62;-1:-1:-1;;;11279:18:1;;;11272:36;11325:19;;4852:73:0::1;10948:402:1::0;4852:73:0::1;4936:28;4955:8;4936:18;:28::i;:::-;4771:201:::0;:::o;55288:120::-;3908:7;3935:6;-1:-1:-1;;;;;3935:6:0;42763:10;:21;;:48;;-1:-1:-1;46097:8:0;;-1:-1:-1;;;;;46097:8:0;42788:10;:23;42763:48;42754:102;;;;-1:-1:-1;;;42754:102:0;;;;;;;:::i;:::-;55369:24:::1;:31:::0;;-1:-1:-1;;55369:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55288:120::o;54425:649::-;54493:24;;:::i;:::-;54530:31;;:::i;:::-;54578:24;;;;54574:66;;;54636:1;54606:31;;54574:66;54676:18;;54650:23;;;:44;54729:16;;54705:21;;;:40;40271:17;54756:23;;;:43;54814:51;54831:25;54858:6;54814:15;:51::i;:::-;54810:95;;;54901:1;54869:29;;;:33;54810:95;40361:1;54915:26;;;:49;-1:-1:-1;;;;;55007:30:0;;;;;;:22;54915:26;55007:30;;;;;54915:6;40913:1;54975:29;;32878:174;32953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32953:29:0;-1:-1:-1;;;;;32953:29:0;;;;;;;;:24;;33007:23;32953:24;33007:14;:23::i;:::-;-1:-1:-1;;;;;32998:46:0;;;;;;;;;;;32878:174;;:::o;29026:348::-;29119:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;29136:73;;;;-1:-1:-1;;;29136:73:0;;15234:2:1;29136:73:0;;;15216:21:1;15273:2;15253:18;;;15246:30;15312:34;15292:18;;;15285:62;-1:-1:-1;;;15363:18:1;;;15356:42;15415:19;;29136:73:0;15032:408:1;29136:73:0;29220:13;29236:23;29251:7;29236:14;:23::i;:::-;29220:39;;29289:5;-1:-1:-1;;;;;29278:16:0;:7;-1:-1:-1;;;;;29278:16:0;;:52;;;;29298:32;29315:5;29322:7;29298:16;:32::i;:::-;29278:87;;;;29358:7;-1:-1:-1;;;;;29334:31:0;:20;29346:7;29334:11;:20::i;:::-;-1:-1:-1;;;;;29334:31:0;;29278:87;29270:96;29026:348;-1:-1:-1;;;;29026:348:0:o;32135:625::-;32294:4;-1:-1:-1;;;;;32267:31:0;:23;32282:7;32267:14;:23::i;:::-;-1:-1:-1;;;;;32267:31:0;;32259:81;;;;-1:-1:-1;;;32259:81:0;;11557:2:1;32259:81:0;;;11539:21:1;11596:2;11576:18;;;11569:30;11635:34;11615:18;;;11608:62;-1:-1:-1;;;11686:18:1;;;11679:35;11731:19;;32259:81:0;11355:401:1;32259:81:0;-1:-1:-1;;;;;32359:16:0;;32351:65;;;;-1:-1:-1;;;32351:65:0;;13382:2:1;32351:65:0;;;13364:21:1;13421:2;13401:18;;;13394:30;13460:34;13440:18;;;13433:62;-1:-1:-1;;;13511:18:1;;;13504:34;13555:19;;32351:65:0;13180:400:1;32351:65:0;32533:29;32550:1;32554:7;32533:8;:29::i;:::-;-1:-1:-1;;;;;32575:15:0;;;;;;:9;:15;;;;;:20;;32594:1;;32575:15;:20;;32594:1;;32575:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32606:13:0;;;;;;:9;:13;;;;;:18;;32623:1;;32606:13;:18;;32623:1;;32606:18;:::i;:::-;;;;-1:-1:-1;;32635:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32635:21:0;-1:-1:-1;;;;;32635:21:0;;;;;;;;;32674:27;;32635:16;;32674:27;;;;;;;25071:341;25001:411;;:::o;59900:381::-;60014:7;60005:5;:16;;59996:49;;;;-1:-1:-1;;;59996:49:0;;13035:2:1;59996:49:0;;;13017:21:1;13074:2;13054:18;;;13047:30;-1:-1:-1;;;13093:18:1;;;13086:48;13151:18;;59996:49:0;12833:342:1;59996:49:0;60106:7;60098:5;:15;60094:180;;;60130:14;60147:15;60157:5;60147:7;:15;:::i;:::-;60237:25;;60130:32;;-1:-1:-1;60211:9:0;;-1:-1:-1;;;;;60237:15:0;;;:25;;;;;60130:32;;60177:22;60237:25;60177:22;60237:25;60130:32;60237:15;:25;;;;;;;;;;;;;;;;;;;;;60115:159;;59900:381;;;:::o;60448:409::-;-1:-1:-1;;;;;60525:16:0;;60516:41;;;;-1:-1:-1;;;60516:41:0;;14895:2:1;60516:41:0;;;14877:21:1;14934:2;14914:18;;;14907:30;-1:-1:-1;;;14953:18:1;;;14946:40;15003:18;;60516:41:0;14693:334:1;60516:41:0;39848:3;60577:12;;:30;;60568:69;;;;-1:-1:-1;;;60568:69:0;;24967:2:1;60568:69:0;;;24949:21:1;25006:2;24986:18;;;24979:30;25045:26;25025:18;;;25018:54;25089:18;;60568:69:0;24765:348:1;60568:69:0;39795:4;60671:3;60658:12;;:16;;;;:::i;:::-;60657:31;;60648:71;;;;-1:-1:-1;;;60648:71:0;;9310:2:1;60648:71:0;;;9292:21:1;9349:2;9329:18;;;9322:30;9388:27;9368:18;;;9361:55;9433:18;;60648:71:0;9108:349:1;60648:71:0;60737:9;60732:88;60752:3;60750:1;:5;60732:88;;;60777:31;60784:2;60802:3;:1;60804;60802:3;:::i;60777:31::-;60757:3;;;;:::i;:::-;;;;60732:88;;;;60846:3;60830:12;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;60448:409:0:o;59436:295::-;59530:4;;59547:141;59567:12;;59565:14;;59547:141;;;59605:5;59611:1;59605:8;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;-1:-1:-1;;;59605:22:0;;-1:-1:-1;;;;;7153:32:1;;;59605:22:0;;;7135:51:1;59605:8:0;;;;:14;;7108:18:1;;59605:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59601:76;;;59656:4;59648:13;;;;;59601:76;59581:3;;;;:::i;:::-;;;;59547:141;;;-1:-1:-1;59708:5:0;;59436:295;-1:-1:-1;;;59436:295:0:o;5132:191::-;5206:16;5225:6;;-1:-1:-1;;;;;5242:17:0;;;-1:-1:-1;;;;;;5242:17:0;;;;;;5275:40;;5225:6;;;;;;;5275:40;;5206:16;5275:40;5195:128;5132:191;:::o;33194:315::-;33349:8;-1:-1:-1;;;;;33340:17:0;:5;-1:-1:-1;;;;;33340:17:0;;;33332:55;;;;-1:-1:-1;;;33332:55:0;;13787:2:1;33332:55:0;;;13769:21:1;13826:2;13806:18;;;13799:30;13865:27;13845:18;;;13838:55;13910:18;;33332:55:0;13585:349:1;33332:55:0;-1:-1:-1;;;;;33398:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33398:46:0;;;;;;;;;;33460:41;;8832::1;;;33460::0;;8805:18:1;33460:41:0;;;;;;;33194:315;;;:::o;28104:::-;28261:28;28271:4;28277:2;28281:7;28261:9;:28::i;:::-;28308:48;28331:4;28337:2;28341:7;28350:5;28308:22;:48::i;:::-;28300:111;;;;-1:-1:-1;;;28300:111:0;;;;;;;:::i;335:723::-;391:13;612:10;608:53;;-1:-1:-1;;639:10:0;;;;;;;;;;;;-1:-1:-1;;;639:10:0;;;;;335:723::o;608:53::-;686:5;671:12;727:78;734:9;;727:78;;760:8;;;;:::i;:::-;;-1:-1:-1;783:10:0;;-1:-1:-1;791:2:0;783:10;;:::i;:::-;;;727:78;;;815:19;847:6;837:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;837:17:0;;815:39;;865:154;872:10;;865:154;;899:11;909:1;899:11;;:::i;:::-;;-1:-1:-1;968:10:0;976:2;968:5;:10;:::i;:::-;955:24;;:2;:24;:::i;:::-;942:39;;925:6;932;925:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;925:56:0;;;;;;;;-1:-1:-1;996:11:0;1005:2;996:11;;:::i;:::-;;;865:154;;30710:439;-1:-1:-1;;;;;30790:16:0;;30782:61;;;;-1:-1:-1;;;30782:61:0;;18721:2:1;30782:61:0;;;18703:21:1;;;18740:18;;;18733:30;18799:34;18779:18;;;18772:62;18851:18;;30782:61:0;18519:356:1;30782:61:0;28797:4;28821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28821:16:0;:30;30854:58;;;;-1:-1:-1;;;30854:58:0;;12324:2:1;30854:58:0;;;12306:21:1;12363:2;12343:18;;;12336:30;12402;12382:18;;;12375:58;12450:18;;30854:58:0;12122:352:1;30854:58:0;-1:-1:-1;;;;;30983:13:0;;;;;;:9;:13;;;;;:18;;31000:1;;30983:13;:18;;31000:1;;30983:18;:::i;:::-;;;;-1:-1:-1;;31012:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31012:21:0;-1:-1:-1;;;;;31012:21:0;;;;;;;;31051:33;;31012:16;;;31051:33;;31012:16;;31051:33;25771:155;;:::o;34074:799::-;34229:4;-1:-1:-1;;;;;34250:13:0;;13853:19;:23;34246:620;;34286:72;;-1:-1:-1;;;34286:72:0;;-1:-1:-1;;;;;34286:36:0;;;;;:72;;2751:10;;34337:4;;34343:7;;34352:5;;34286:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34286:72:0;;;;;;;;-1:-1:-1;;34286:72:0;;;;;;;;;;;;:::i;:::-;;;34282:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34528:13:0;;34524:272;;34571:60;;-1:-1:-1;;;34571:60:0;;;;;;;:::i;34524:272::-;34746:6;34740:13;34731:6;34727:2;34723:15;34716:38;34282:529;-1:-1:-1;;;;;;34409:51:0;-1:-1:-1;;;34409:51:0;;-1:-1:-1;34402:58:0;;34246:620;-1:-1:-1;34850:4:0;34074:799;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;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:1: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:1;;;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:315::-;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;2381:28;2403:5;2381:28;:::i;:::-;2428:5;2418:15;;;2124:315;;;;;:::o;2444:254::-;2512:6;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2612:29;2631:9;2612:29;:::i;:::-;2602:39;2688:2;2673:18;;;;2660:32;;-1:-1:-1;;;2444:254:1:o;2703:615::-;2789:6;2797;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;2906:9;2893:23;2935:18;2976:2;2968:6;2965:14;2962:34;;;2992:1;2989;2982:12;2962:34;3030:6;3019:9;3015:22;3005:32;;3075:7;3068:4;3064:2;3060:13;3056:27;3046:55;;3097:1;3094;3087:12;3046:55;3137:2;3124:16;3163:2;3155:6;3152:14;3149:34;;;3179:1;3176;3169:12;3149:34;3232:7;3227:2;3217:6;3214:1;3210:14;3206:2;3202:23;3198:32;3195:45;3192:65;;;3253:1;3250;3243:12;3192:65;3284:2;3276:11;;;;;3306:6;;-1:-1:-1;2703:615:1;;-1:-1:-1;;;;2703:615:1:o;3323:241::-;3379:6;3432:2;3420:9;3411:7;3407:23;3403:32;3400:52;;;3448:1;3445;3438:12;3400:52;3487:9;3474:23;3506:28;3528:5;3506:28;:::i;3569:245::-;3636:6;3689:2;3677:9;3668:7;3664:23;3660:32;3657:52;;;3705:1;3702;3695:12;3657:52;3737:9;3731:16;3756:28;3778:5;3756:28;:::i;3819:245::-;3877:6;3930:2;3918:9;3909:7;3905:23;3901:32;3898:52;;;3946:1;3943;3936:12;3898:52;3985:9;3972:23;4004:30;4028:5;4004:30;:::i;4069:249::-;4138:6;4191:2;4179:9;4170:7;4166:23;4162:32;4159:52;;;4207:1;4204;4197:12;4159:52;4239:9;4233:16;4258:30;4282:5;4258:30;:::i;4323:592::-;4394:6;4402;4455:2;4443:9;4434:7;4430:23;4426:32;4423:52;;;4471:1;4468;4461:12;4423:52;4511:9;4498:23;4540:18;4581:2;4573:6;4570:14;4567:34;;;4597:1;4594;4587:12;4567:34;4635:6;4624:9;4620:22;4610:32;;4680:7;4673:4;4669:2;4665:13;4661:27;4651:55;;4702:1;4699;4692:12;4651:55;4742:2;4729:16;4768:2;4760:6;4757:14;4754:34;;;4784:1;4781;4774:12;4754:34;4829:7;4824:2;4815:6;4811:2;4807:15;4803:24;4800:37;4797:57;;;4850:1;4847;4840:12;4920:180;4979:6;5032:2;5020:9;5011:7;5007:23;5003:32;5000:52;;;5048:1;5045;5038:12;5000:52;-1:-1:-1;5071:23:1;;4920:180;-1:-1:-1;4920:180:1:o;5105:248::-;5173:6;5181;5234:2;5222:9;5213:7;5209:23;5205:32;5202:52;;;5250:1;5247;5240:12;5202:52;-1:-1:-1;;5273:23:1;;;5343:2;5328:18;;;5315:32;;-1:-1:-1;5105:248:1:o;5358:257::-;5399:3;5437:5;5431:12;5464:6;5459:3;5452:19;5480:63;5536:6;5529:4;5524:3;5520:14;5513:4;5506:5;5502:16;5480:63;:::i;:::-;5597:2;5576:15;-1:-1:-1;;5572:29:1;5563:39;;;;5604:4;5559:50;;5358:257;-1:-1:-1;;5358:257:1:o;5620:185::-;5662:3;5700:5;5694:12;5715:52;5760:6;5755:3;5748:4;5741:5;5737:16;5715:52;:::i;:::-;5783:16;;;;;5620:185;-1:-1:-1;;5620:185:1:o;5810:1174::-;5986:3;6015:1;6048:6;6042:13;6078:3;6100:1;6128:9;6124:2;6120:18;6110:28;;6188:2;6177:9;6173:18;6210;6200:61;;6254:4;6246:6;6242:17;6232:27;;6200:61;6280:2;6328;6320:6;6317:14;6297:18;6294:38;6291:165;;;-1:-1:-1;;;6355:33:1;;6411:4;6408:1;6401:15;6441:4;6362:3;6429:17;6291:165;6472:18;6499:104;;;;6617:1;6612:320;;;;6465:467;;6499:104;-1:-1:-1;;6532:24:1;;6520:37;;6577:16;;;;-1:-1:-1;6499:104:1;;6612:320;26441:1;26434:14;;;26478:4;26465:18;;6707:1;6721:165;6735:6;6732:1;6729:13;6721:165;;;6813:14;;6800:11;;;6793:35;6856:16;;;;6750:10;;6721:165;;;6725:3;;6915:6;6910:3;6906:16;6899:23;;6465:467;;;;;;;6948:30;6974:3;6966:6;6948:30;:::i;:::-;6941:37;5810:1174;-1:-1:-1;;;;;5810:1174:1:o;7197:488::-;-1:-1:-1;;;;;7466:15:1;;;7448:34;;7518:15;;7513:2;7498:18;;7491:43;7565:2;7550:18;;7543:34;;;7613:3;7608:2;7593:18;;7586:31;;;7391:4;;7634:45;;7659:19;;7651:6;7634:45;:::i;:::-;7626:53;7197:488;-1:-1:-1;;;;;;7197:488:1:o;7690:497::-;7872:3;7857:19;;7861:9;7953:6;7830:4;7987:194;8001:4;7998:1;7995:11;7987:194;;;8060:13;;8048:26;;8097:4;8121:12;;;;8156:15;;;;8021:1;8014:9;7987:194;;;7991:3;;;7690:497;;;;:::o;8192:495::-;8372:3;8357:19;;8361:9;8453:6;8330:4;8487:194;8501:4;8498:1;8495:11;8487:194;;;8560:13;;8548:26;;8597:4;8621:12;;;;8656:15;;;;8521:1;8514:9;8487:194;;8884:219;9033:2;9022:9;9015:21;8996:4;9053:44;9093:2;9082:9;9078:18;9070:6;9053:44;:::i;10529:414::-;10731:2;10713:21;;;10770:2;10750:18;;;10743:30;10809:34;10804:2;10789:18;;10782:62;-1:-1:-1;;;10875:2:1;10860:18;;10853:48;10933:3;10918:19;;10529:414::o;19639:356::-;19841:2;19823:21;;;19860:18;;;19853:30;19919:34;19914:2;19899:18;;19892:62;19986:2;19971:18;;19639:356::o;23231:413::-;23433:2;23415:21;;;23472:2;23452:18;;;23445:30;23511:34;23506:2;23491:18;;23484:62;-1:-1:-1;;;23577:2:1;23562:18;;23555:47;23634:3;23619:19;;23231:413::o;23649:403::-;23851:2;23833:21;;;23890:2;23870:18;;;23863:30;23929:34;23924:2;23909:18;;23902:62;-1:-1:-1;;;23995:2:1;23980:18;;23973:37;24042:3;24027:19;;23649:403::o;25826:355::-;26028:2;26010:21;;;26067:2;26047:18;;;26040:30;26106:33;26101:2;26086:18;;26079:61;26172:2;26157:18;;25826:355::o;26494:128::-;26534:3;26565:1;26561:6;26558:1;26555:13;26552:39;;;26571:18;;:::i;:::-;-1:-1:-1;26607:9:1;;26494:128::o;26627:120::-;26667:1;26693;26683:35;;26698:18;;:::i;:::-;-1:-1:-1;26732:9:1;;26627:120::o;26752:168::-;26792:7;26858:1;26854;26850:6;26846:14;26843:1;26840:21;26835:1;26828:9;26821:17;26817:45;26814:71;;;26865:18;;:::i;:::-;-1:-1:-1;26905:9:1;;26752:168::o;26925:125::-;26965:4;26993:1;26990;26987:8;26984:34;;;26998:18;;:::i;:::-;-1:-1:-1;27035:9:1;;26925:125::o;27055:258::-;27127:1;27137:113;27151:6;27148:1;27145:13;27137:113;;;27227:11;;;27221:18;27208:11;;;27201:39;27173:2;27166:10;27137:113;;;27268:6;27265:1;27262:13;27259:48;;;-1:-1:-1;;27303:1:1;27285:16;;27278:27;27055:258::o;27318:380::-;27397:1;27393:12;;;;27440;;;27461:61;;27515:4;27507:6;27503:17;27493:27;;27461:61;27568:2;27560:6;27557:14;27537:18;27534:38;27531:161;;;27614:10;27609:3;27605:20;27602:1;27595:31;27649:4;27646:1;27639:15;27677:4;27674:1;27667:15;27531:161;;27318:380;;;:::o;27703:135::-;27742:3;-1:-1:-1;;27763:17:1;;27760:43;;;27783:18;;:::i;:::-;-1:-1:-1;27830:1:1;27819:13;;27703:135::o;27843:112::-;27875:1;27901;27891:35;;27906:18;;:::i;:::-;-1:-1:-1;27940:9:1;;27843:112::o;27960:127::-;28021:10;28016:3;28012:20;28009:1;28002:31;28052:4;28049:1;28042:15;28076:4;28073:1;28066:15;28092:127;28153:10;28148:3;28144:20;28141:1;28134:31;28184:4;28181:1;28174:15;28208:4;28205:1;28198:15;28224:127;28285:10;28280:3;28276:20;28273:1;28266:31;28316:4;28313:1;28306:15;28340:4;28337:1;28330:15;28356:127;28417:10;28412:3;28408:20;28405:1;28398:31;28448:4;28445:1;28438:15;28472:4;28469:1;28462:15;28488:118;28574:5;28567:13;28560:21;28553:5;28550:32;28540:60;;28596:1;28593;28586:12;28611:131;-1:-1:-1;;;;;;28685:32:1;;28675:43;;28665:71;;28732:1;28729;28722:12
Swarm Source
ipfs://a29e41f7c5e30596474dfcc55fd6fe1914ef83da1c44c7ef38aa0b966530843f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.