Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
380 SEAL
Holders
131
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 SEALLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Seal
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-31 */ // SPDX-License-Identifier: MIT // import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; // import "@openzeppelin/contracts/access/Ownable.sol"; // import "@openzeppelin/contracts/utils/Strings.sol"; // import "@openzeppelin/contracts/utils/Counters.sol"; // import "@openzeppelin/contracts/utils/math/SafeMath.sol"; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/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); } // File: @openzeppelin/contracts/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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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); } } } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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(to).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 {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_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 { _setOwner(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" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } contract Seal is ERC721Enumerable, Ownable { uint256 currentPrice = 20000000000000000; uint256 public maxSupply = 10000; uint256 public saleStartTime = 1630434600; address add_M = 0xEC227D85Fdcaa67f0e9E4D7F0b9498b06d0f7ac4; address add_J = 0x57ccEFe8fDD9F2B17B9dD148061ae9a5f3a7e767; address add_S = 0x6F87eA1456aDfBf1a849581a3AEED53407E89223; address dev = 0x958FF6378B0808EE1D8Ec6F02Ddc465eD349917e; string baseURI = "https://sealclubnft.com/api/metadata.php?token="; bool paused = false; struct _token { uint256 tokenId; string tokenURI; } using Strings for uint256; constructor() ERC721("Seals", "SEAL") {} function mintSeals(uint256 requestedSealCount) public payable { uint256 supply = totalSupply(); require(block.timestamp >= saleStartTime, "Sale has not started"); require(requestedSealCount <= 15, "Can only mint 15 seals!"); require( supply + requestedSealCount <= maxSupply, "Maximum seals already minted!" ); require(paused == false, "We are put on pause for the time being!"); require(msg.value >= (currentPrice * requestedSealCount)); for (uint256 i = 1; i <= requestedSealCount; i++) { _mint(msg.sender, supply + i); } return; } function ownerMintSeals(uint256 sealCount) public { require(msg.sender == owner(), "Only owner may mint free seals"); uint256 supply = totalSupply(); require( supply + sealCount <= maxSupply, "Maximum seals already minted!" ); for (uint256 i = 1; i <= sealCount; i++) { _mint(msg.sender, supply + i); } return; } function getOwner() public view returns (address) { return owner(); } function getBalanceOfContract() external view returns (uint256) { return address(this).balance; } function changeSaleStartTime(uint256 newSaleStartTime) external returns (uint256) { require( msg.sender == owner(), "Only owner can change sale start time." ); saleStartTime = newSaleStartTime; return (saleStartTime); } function updateCurrentPrice(uint256 newCurrentPrice) public returns (uint256) { require(msg.sender == owner(), "Only owner can change current price."); currentPrice = newCurrentPrice; return currentPrice; } function getCurrentPrice() public view returns (uint256) { return currentPrice; } function getBaseURI() public view returns (string memory) { return baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent seal" ); return string(abi.encodePacked(baseURI, tokenId.toString())); } function pause(bool _paused) external onlyOwner { require(msg.sender == owner(), "Only owner can pause!"); paused = _paused; } function withdraw() public { require( msg.sender == add_M || msg.sender == add_J || msg.sender == add_S || msg.sender == dev, "Only seal team can withdraw funds" ); require(address(this).balance > 0, "Balance must be greater than 0"); uint256 tenthOfBalance = (address(this).balance * 1) / 10; uint256 remainingBalance = address(this).balance - tenthOfBalance; uint256 third = (remainingBalance * 3) / 10; uint256 rem = (remainingBalance * 4) / 10; require(payable(add_M).send(third)); require(payable(add_J).send(third)); require(payable(add_S).send(rem)); require(payable(dev).send(tenthOfBalance)); } }
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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSaleStartTime","type":"uint256"}],"name":"changeSaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalanceOfContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestedSealCount","type":"uint256"}],"name":"mintSeals","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sealCount","type":"uint256"}],"name":"ownerMintSeals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"newCurrentPrice","type":"uint256"}],"name":"updateCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
66470de4df820000600b55612710600c5563612e7528600d55600e80546001600160a01b031990811673ec227d85fdcaa67f0e9e4d7f0b9498b06d0f7ac417909155600f805482167357ccefe8fdd9f2b17b9dd148061ae9a5f3a7e767179055601080548216736f87ea1456adfbf1a849581a3aeed53407e892231790556011805490911673958ff6378b0808ee1d8ec6f02ddc465ed349917e17905560e0604052602f6080818152906200275560a0398051620000c691601291602090910190620001b7565b506013805460ff19169055348015620000de57600080fd5b5060408051808201825260058152645365616c7360d81b60208083019182528351808501909452600484526314d1505360e21b9084015281519192916200012891600091620001b7565b5080516200013e906001906020840190620001b7565b5050506200015b620001556200016160201b60201c565b62000165565b6200029a565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001c5906200025d565b90600052602060002090601f016020900481019282620001e9576000855562000234565b82601f106200020457805160ff191683800117855562000234565b8280016001018555821562000234579182015b828111156200023457825182559160200191906001019062000217565b506200024292915062000246565b5090565b5b8082111562000242576000815560010162000247565b6002810460018216806200027257607f821691505b602082108114156200029457634e487b7160e01b600052602260045260246000fd5b50919050565b6124ab80620002aa6000396000f3fe6080604052600436106101d85760003560e01c80636352211e1161010257806395d89b4111610095578063d5abeb0111610064578063d5abeb0114610501578063e985e9c514610516578063eb91d37e14610536578063f2fde38b1461054b576101d8565b806395d89b411461048c578063a22cb465146104a1578063b88d4fde146104c1578063c87b56dd146104e1576101d8565b8063715018a6116100d1578063715018a61461042d5780637fc6686e14610442578063893d20e8146104625780638da5cb5b14610477576101d8565b80636352211e146103c557806368405a44146103e557806370a08231146103f8578063714c539814610418576101d8565b80631cbaee2d1161017a5780633ccfd60b116101495780633ccfd60b14610350578063409249e71461036557806342842e0e146103855780634f6ccce7146103a5576101d8565b80631cbaee2d146102e657806322968885146102fb57806323b872dd146103105780632f745c5914610330576101d8565b8063081812fc116101b6578063081812fc14610257578063095ea7b3146102845780630e90c00a146102a457806318160ddd146102d1576101d8565b806301ffc9a7146101dd57806302329a291461021357806306fdde0314610235575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611a1c565b61056b565b60405161020a9190611bab565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004611a02565b610598565b005b34801561024157600080fd5b5061024a61062b565b60405161020a9190611bb6565b34801561026357600080fd5b50610277610272366004611a54565b6106bd565b60405161020a9190611b5a565b34801561029057600080fd5b5061023361029f3660046119d9565b610700565b3480156102b057600080fd5b506102c46102bf366004611a54565b610798565b60405161020a9190612310565b3480156102dd57600080fd5b506102c46107db565b3480156102f257600080fd5b506102c46107e1565b34801561030757600080fd5b506102c46107e7565b34801561031c57600080fd5b5061023361032b3660046118a9565b6107eb565b34801561033c57600080fd5b506102c461034b3660046119d9565b610823565b34801561035c57600080fd5b50610233610875565b34801561037157600080fd5b50610233610380366004611a54565b610a2a565b34801561039157600080fd5b506102336103a03660046118a9565b610acc565b3480156103b157600080fd5b506102c46103c0366004611a54565b610ae7565b3480156103d157600080fd5b506102776103e0366004611a54565b610b42565b6102336103f3366004611a54565b610b77565b34801561040457600080fd5b506102c4610413366004611856565b610c58565b34801561042457600080fd5b5061024a610c9c565b34801561043957600080fd5b50610233610cab565b34801561044e57600080fd5b506102c461045d366004611a54565b610cf6565b34801561046e57600080fd5b50610277610d39565b34801561048357600080fd5b50610277610d48565b34801561049857600080fd5b5061024a610d57565b3480156104ad57600080fd5b506102336104bc3660046119b0565b610d66565b3480156104cd57600080fd5b506102336104dc3660046118e4565b610e34565b3480156104ed57600080fd5b5061024a6104fc366004611a54565b610e6d565b34801561050d57600080fd5b506102c4610ec6565b34801561052257600080fd5b506101fd610531366004611877565b610ecc565b34801561054257600080fd5b506102c4610efa565b34801561055757600080fd5b50610233610566366004611856565b610f00565b60006001600160e01b0319821663780e9d6360e01b1480610590575061059082610f6e565b90505b919050565b6105a0610fae565b6001600160a01b03166105b1610d48565b6001600160a01b0316146105e05760405162461bcd60e51b81526004016105d7906120e1565b60405180910390fd5b6105e8610d48565b6001600160a01b0316336001600160a01b0316146106185760405162461bcd60e51b81526004016105d790611ffa565b6013805460ff1916911515919091179055565b60606000805461063a906123b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610666906123b3565b80156106b35780601f10610688576101008083540402835291602001916106b3565b820191906000526020600020905b81548152906001019060200180831161069657829003601f168201915b5050505050905090565b60006106c882610fb2565b6106e45760405162461bcd60e51b81526004016105d79061205e565b506000908152600460205260409020546001600160a01b031690565b600061070b82610b42565b9050806001600160a01b0316836001600160a01b0316141561073f5760405162461bcd60e51b81526004016105d790612196565b806001600160a01b0316610751610fae565b6001600160a01b0316148061076d575061076d81610531610fae565b6107895760405162461bcd60e51b81526004016105d790611f0a565b6107938383610fcf565b505050565b60006107a2610d48565b6001600160a01b0316336001600160a01b0316146107d25760405162461bcd60e51b81526004016105d790611ce3565b50600d81905590565b60085490565b600d5481565b4790565b6107fc6107f6610fae565b8261103d565b6108185760405162461bcd60e51b81526004016105d7906121d7565b6107938383836110c2565b600061082e83610c58565b821061084c5760405162461bcd60e51b81526004016105d790611bc9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600e546001600160a01b03163314806108985750600f546001600160a01b031633145b806108ad57506010546001600160a01b031633145b806108c257506011546001600160a01b031633145b6108de5760405162461bcd60e51b81526004016105d790611ec9565b600047116108fe5760405162461bcd60e51b81526004016105d7906122d9565b6000600a61090d476001612351565b610917919061233d565b905060006109258247612370565b90506000600a610936836003612351565b610940919061233d565b90506000600a610951846004612351565b61095b919061233d565b600e546040519192506001600160a01b03169083156108fc029084906000818181858888f1935050505061098e57600080fd5b600f546040516001600160a01b039091169083156108fc029084906000818181858888f193505050506109c057600080fd5b6010546040516001600160a01b039091169082156108fc029083906000818181858888f193505050506109f257600080fd5b6011546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050610a2457600080fd5b50505050565b610a32610d48565b6001600160a01b0316336001600160a01b031614610a625760405162461bcd60e51b81526004016105d7906120aa565b6000610a6c6107db565b600c54909150610a7c8383612325565b1115610a9a5760405162461bcd60e51b81526004016105d7906122a2565b60015b82811161079357610ab733610ab28385612325565b6111ef565b80610ac1816123ee565b915050610a9d565b50565b61079383838360405180602001604052806000815250610e34565b6000610af16107db565b8210610b0f5760405162461bcd60e51b81526004016105d790612228565b60088281548110610b3057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105905760405162461bcd60e51b81526004016105d790611fb1565b6000610b816107db565b9050600d54421015610ba55760405162461bcd60e51b81526004016105d790612274565b600f821115610bc65760405162461bcd60e51b81526004016105d790612116565b600c54610bd38383612325565b1115610bf15760405162461bcd60e51b81526004016105d7906122a2565b60135460ff1615610c145760405162461bcd60e51b81526004016105d790611dbb565b81600b54610c229190612351565b341015610c2e57600080fd5b60015b82811161079357610c4633610ab28385612325565b80610c50816123ee565b915050610c31565b60006001600160a01b038216610c805760405162461bcd60e51b81526004016105d790611f67565b506001600160a01b031660009081526003602052604090205490565b60606012805461063a906123b3565b610cb3610fae565b6001600160a01b0316610cc4610d48565b6001600160a01b031614610cea5760405162461bcd60e51b81526004016105d7906120e1565b610cf460006112ce565b565b6000610d00610d48565b6001600160a01b0316336001600160a01b031614610d305760405162461bcd60e51b81526004016105d790611d29565b50600b81905590565b6000610d43610d48565b905090565b600a546001600160a01b031690565b60606001805461063a906123b3565b610d6e610fae565b6001600160a01b0316826001600160a01b03161415610d9f5760405162461bcd60e51b81526004016105d790611e46565b8060056000610dac610fae565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610df0610fae565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e289190611bab565b60405180910390a35050565b610e45610e3f610fae565b8361103d565b610e615760405162461bcd60e51b81526004016105d7906121d7565b610a2484848484611320565b6060610e7882610fb2565b610e945760405162461bcd60e51b81526004016105d790611d6d565b6012610e9f83611353565b604051602001610eb0929190611ab4565b6040516020818303038152906040529050919050565b600c5481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b5490565b610f08610fae565b6001600160a01b0316610f19610d48565b6001600160a01b031614610f3f5760405162461bcd60e51b81526004016105d7906120e1565b6001600160a01b038116610f655760405162461bcd60e51b81526004016105d790611c66565b610ac9816112ce565b60006001600160e01b031982166380ac58cd60e01b1480610f9f57506001600160e01b03198216635b5e139f60e01b145b8061059057506105908261146e565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061100482610b42565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061104882610fb2565b6110645760405162461bcd60e51b81526004016105d790611e7d565b600061106f83610b42565b9050806001600160a01b0316846001600160a01b031614806110aa5750836001600160a01b031661109f846106bd565b6001600160a01b0316145b806110ba57506110ba8185610ecc565b949350505050565b826001600160a01b03166110d582610b42565b6001600160a01b0316146110fb5760405162461bcd60e51b81526004016105d79061214d565b6001600160a01b0382166111215760405162461bcd60e51b81526004016105d790611e02565b61112c838383611487565b611137600082610fcf565b6001600160a01b0383166000908152600360205260408120805460019290611160908490612370565b90915550506001600160a01b038216600090815260036020526040812080546001929061118e908490612325565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166112155760405162461bcd60e51b81526004016105d790612029565b61121e81610fb2565b1561123b5760405162461bcd60e51b81526004016105d790611cac565b61124760008383611487565b6001600160a01b0382166000908152600360205260408120805460019290611270908490612325565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61132b8484846110c2565b61133784848484611510565b610a245760405162461bcd60e51b81526004016105d790611c14565b60608161137857506040805180820190915260018152600360fc1b6020820152610593565b8160005b81156113a2578061138c816123ee565b915061139b9050600a8361233d565b915061137c565b60008167ffffffffffffffff8111156113cb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113f5576020820181803683370190505b5090505b84156110ba5761140a600183612370565b9150611417600a86612409565b611422906030612325565b60f81b81838151811061144557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611467600a8661233d565b94506113f9565b6001600160e01b031981166301ffc9a760e01b14919050565b611492838383610793565b6001600160a01b0383166114ae576114a98161162b565b6114d1565b816001600160a01b0316836001600160a01b0316146114d1576114d1838261166f565b6001600160a01b0382166114ed576114e88161170c565b610793565b826001600160a01b0316826001600160a01b0316146107935761079382826117e5565b6000611524846001600160a01b0316611829565b1561162057836001600160a01b031663150b7a02611540610fae565b8786866040518563ffffffff1660e01b81526004016115629493929190611b6e565b602060405180830381600087803b15801561157c57600080fd5b505af19250505080156115ac575060408051601f3d908101601f191682019092526115a991810190611a38565b60015b611606573d8080156115da576040519150601f19603f3d011682016040523d82523d6000602084013e6115df565b606091505b5080516115fe5760405162461bcd60e51b81526004016105d790611c14565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110ba565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161167c84610c58565b6116869190612370565b6000838152600760205260409020549091508082146116d9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061171e90600190612370565b6000838152600960205260408120546008805493945090928490811061175457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061178357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806117c957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006117f083610c58565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b80356001600160a01b038116811461059357600080fd5b8035801515811461059357600080fd5b600060208284031215611867578081fd5b6118708261182f565b9392505050565b60008060408385031215611889578081fd5b6118928361182f565b91506118a06020840161182f565b90509250929050565b6000806000606084860312156118bd578081fd5b6118c68461182f565b92506118d46020850161182f565b9150604084013590509250925092565b600080600080608085870312156118f9578081fd5b6119028561182f565b9350602061191181870161182f565b935060408601359250606086013567ffffffffffffffff80821115611934578384fd5b818801915088601f830112611947578384fd5b81358181111561195957611959612449565b604051601f8201601f191681018501838111828210171561197c5761197c612449565b60405281815283820185018b1015611992578586fd5b81858501868301379081019093019390935250939692955090935050565b600080604083850312156119c2578182fd5b6119cb8361182f565b91506118a060208401611846565b600080604083850312156119eb578182fd5b6119f48361182f565b946020939093013593505050565b600060208284031215611a13578081fd5b61187082611846565b600060208284031215611a2d578081fd5b81356118708161245f565b600060208284031215611a49578081fd5b81516118708161245f565b600060208284031215611a65578081fd5b5035919050565b60008151808452611a84816020860160208601612387565b601f01601f19169290920160200192915050565b60008151611aaa818560208601612387565b9290920192915050565b8254600090819060028104600180831680611ad057607f831692505b6020808410821415611af057634e487b7160e01b87526022600452602487fd5b818015611b045760018114611b1557611b41565b60ff19861689528489019650611b41565b611b1e8b612319565b885b86811015611b395781548b820152908501908301611b20565b505084890196505b505050505050611b518185611a98565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ba190830184611a6c565b9695505050505050565b901515815260200190565b6000602082526118706020830184611a6c565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526026908201527f4f6e6c79206f776e65722063616e206368616e67652073616c65207374617274604082015265103a34b6b29760d11b606082015260800190565b60208082526024908201527f4f6e6c79206f776e65722063616e206368616e67652063757272656e7420707260408201526334b1b29760e11b606082015260800190565b6020808252602e908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526d1b995e1a5cdd195b9d081cd9585b60921b606082015260800190565b60208082526027908201527f57652061726520707574206f6e20706175736520666f72207468652074696d65604082015266206265696e672160c81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f4f6e6c79207365616c207465616d2063616e2077697468647261772066756e646040820152607360f81b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601590820152744f6e6c79206f776e65722063616e2070617573652160581b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f4f6e6c79206f776e6572206d6179206d696e742066726565207365616c730000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f43616e206f6e6c79206d696e74203135207365616c7321000000000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526014908201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b604082015260600190565b6020808252601d908201527f4d6178696d756d207365616c7320616c7265616479206d696e74656421000000604082015260600190565b6020808252601e908201527f42616c616e6365206d7573742062652067726561746572207468616e20300000604082015260600190565b90815260200190565b60009081526020902090565b600082198211156123385761233861241d565b500190565b60008261234c5761234c612433565b500490565b600081600019048311821515161561236b5761236b61241d565b500290565b6000828210156123825761238261241d565b500390565b60005b838110156123a257818101518382015260200161238a565b83811115610a245750506000910152565b6002810460018216806123c757607f821691505b602082108114156123e857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124025761240261241d565b5060010190565b60008261241857612418612433565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ac957600080fdfea26469706673582212203856ad2ad504cd86b605a5b9422a8420ee0249ecd807035ceecdf10a12abd37364736f6c6343000800003368747470733a2f2f7365616c636c75626e66742e636f6d2f6170692f6d657461646174612e7068703f746f6b656e3d
Deployed Bytecode
0x6080604052600436106101d85760003560e01c80636352211e1161010257806395d89b4111610095578063d5abeb0111610064578063d5abeb0114610501578063e985e9c514610516578063eb91d37e14610536578063f2fde38b1461054b576101d8565b806395d89b411461048c578063a22cb465146104a1578063b88d4fde146104c1578063c87b56dd146104e1576101d8565b8063715018a6116100d1578063715018a61461042d5780637fc6686e14610442578063893d20e8146104625780638da5cb5b14610477576101d8565b80636352211e146103c557806368405a44146103e557806370a08231146103f8578063714c539814610418576101d8565b80631cbaee2d1161017a5780633ccfd60b116101495780633ccfd60b14610350578063409249e71461036557806342842e0e146103855780634f6ccce7146103a5576101d8565b80631cbaee2d146102e657806322968885146102fb57806323b872dd146103105780632f745c5914610330576101d8565b8063081812fc116101b6578063081812fc14610257578063095ea7b3146102845780630e90c00a146102a457806318160ddd146102d1576101d8565b806301ffc9a7146101dd57806302329a291461021357806306fdde0314610235575b600080fd5b3480156101e957600080fd5b506101fd6101f8366004611a1c565b61056b565b60405161020a9190611bab565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004611a02565b610598565b005b34801561024157600080fd5b5061024a61062b565b60405161020a9190611bb6565b34801561026357600080fd5b50610277610272366004611a54565b6106bd565b60405161020a9190611b5a565b34801561029057600080fd5b5061023361029f3660046119d9565b610700565b3480156102b057600080fd5b506102c46102bf366004611a54565b610798565b60405161020a9190612310565b3480156102dd57600080fd5b506102c46107db565b3480156102f257600080fd5b506102c46107e1565b34801561030757600080fd5b506102c46107e7565b34801561031c57600080fd5b5061023361032b3660046118a9565b6107eb565b34801561033c57600080fd5b506102c461034b3660046119d9565b610823565b34801561035c57600080fd5b50610233610875565b34801561037157600080fd5b50610233610380366004611a54565b610a2a565b34801561039157600080fd5b506102336103a03660046118a9565b610acc565b3480156103b157600080fd5b506102c46103c0366004611a54565b610ae7565b3480156103d157600080fd5b506102776103e0366004611a54565b610b42565b6102336103f3366004611a54565b610b77565b34801561040457600080fd5b506102c4610413366004611856565b610c58565b34801561042457600080fd5b5061024a610c9c565b34801561043957600080fd5b50610233610cab565b34801561044e57600080fd5b506102c461045d366004611a54565b610cf6565b34801561046e57600080fd5b50610277610d39565b34801561048357600080fd5b50610277610d48565b34801561049857600080fd5b5061024a610d57565b3480156104ad57600080fd5b506102336104bc3660046119b0565b610d66565b3480156104cd57600080fd5b506102336104dc3660046118e4565b610e34565b3480156104ed57600080fd5b5061024a6104fc366004611a54565b610e6d565b34801561050d57600080fd5b506102c4610ec6565b34801561052257600080fd5b506101fd610531366004611877565b610ecc565b34801561054257600080fd5b506102c4610efa565b34801561055757600080fd5b50610233610566366004611856565b610f00565b60006001600160e01b0319821663780e9d6360e01b1480610590575061059082610f6e565b90505b919050565b6105a0610fae565b6001600160a01b03166105b1610d48565b6001600160a01b0316146105e05760405162461bcd60e51b81526004016105d7906120e1565b60405180910390fd5b6105e8610d48565b6001600160a01b0316336001600160a01b0316146106185760405162461bcd60e51b81526004016105d790611ffa565b6013805460ff1916911515919091179055565b60606000805461063a906123b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610666906123b3565b80156106b35780601f10610688576101008083540402835291602001916106b3565b820191906000526020600020905b81548152906001019060200180831161069657829003601f168201915b5050505050905090565b60006106c882610fb2565b6106e45760405162461bcd60e51b81526004016105d79061205e565b506000908152600460205260409020546001600160a01b031690565b600061070b82610b42565b9050806001600160a01b0316836001600160a01b0316141561073f5760405162461bcd60e51b81526004016105d790612196565b806001600160a01b0316610751610fae565b6001600160a01b0316148061076d575061076d81610531610fae565b6107895760405162461bcd60e51b81526004016105d790611f0a565b6107938383610fcf565b505050565b60006107a2610d48565b6001600160a01b0316336001600160a01b0316146107d25760405162461bcd60e51b81526004016105d790611ce3565b50600d81905590565b60085490565b600d5481565b4790565b6107fc6107f6610fae565b8261103d565b6108185760405162461bcd60e51b81526004016105d7906121d7565b6107938383836110c2565b600061082e83610c58565b821061084c5760405162461bcd60e51b81526004016105d790611bc9565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600e546001600160a01b03163314806108985750600f546001600160a01b031633145b806108ad57506010546001600160a01b031633145b806108c257506011546001600160a01b031633145b6108de5760405162461bcd60e51b81526004016105d790611ec9565b600047116108fe5760405162461bcd60e51b81526004016105d7906122d9565b6000600a61090d476001612351565b610917919061233d565b905060006109258247612370565b90506000600a610936836003612351565b610940919061233d565b90506000600a610951846004612351565b61095b919061233d565b600e546040519192506001600160a01b03169083156108fc029084906000818181858888f1935050505061098e57600080fd5b600f546040516001600160a01b039091169083156108fc029084906000818181858888f193505050506109c057600080fd5b6010546040516001600160a01b039091169082156108fc029083906000818181858888f193505050506109f257600080fd5b6011546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050610a2457600080fd5b50505050565b610a32610d48565b6001600160a01b0316336001600160a01b031614610a625760405162461bcd60e51b81526004016105d7906120aa565b6000610a6c6107db565b600c54909150610a7c8383612325565b1115610a9a5760405162461bcd60e51b81526004016105d7906122a2565b60015b82811161079357610ab733610ab28385612325565b6111ef565b80610ac1816123ee565b915050610a9d565b50565b61079383838360405180602001604052806000815250610e34565b6000610af16107db565b8210610b0f5760405162461bcd60e51b81526004016105d790612228565b60088281548110610b3057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806105905760405162461bcd60e51b81526004016105d790611fb1565b6000610b816107db565b9050600d54421015610ba55760405162461bcd60e51b81526004016105d790612274565b600f821115610bc65760405162461bcd60e51b81526004016105d790612116565b600c54610bd38383612325565b1115610bf15760405162461bcd60e51b81526004016105d7906122a2565b60135460ff1615610c145760405162461bcd60e51b81526004016105d790611dbb565b81600b54610c229190612351565b341015610c2e57600080fd5b60015b82811161079357610c4633610ab28385612325565b80610c50816123ee565b915050610c31565b60006001600160a01b038216610c805760405162461bcd60e51b81526004016105d790611f67565b506001600160a01b031660009081526003602052604090205490565b60606012805461063a906123b3565b610cb3610fae565b6001600160a01b0316610cc4610d48565b6001600160a01b031614610cea5760405162461bcd60e51b81526004016105d7906120e1565b610cf460006112ce565b565b6000610d00610d48565b6001600160a01b0316336001600160a01b031614610d305760405162461bcd60e51b81526004016105d790611d29565b50600b81905590565b6000610d43610d48565b905090565b600a546001600160a01b031690565b60606001805461063a906123b3565b610d6e610fae565b6001600160a01b0316826001600160a01b03161415610d9f5760405162461bcd60e51b81526004016105d790611e46565b8060056000610dac610fae565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610df0610fae565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e289190611bab565b60405180910390a35050565b610e45610e3f610fae565b8361103d565b610e615760405162461bcd60e51b81526004016105d7906121d7565b610a2484848484611320565b6060610e7882610fb2565b610e945760405162461bcd60e51b81526004016105d790611d6d565b6012610e9f83611353565b604051602001610eb0929190611ab4565b6040516020818303038152906040529050919050565b600c5481565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600b5490565b610f08610fae565b6001600160a01b0316610f19610d48565b6001600160a01b031614610f3f5760405162461bcd60e51b81526004016105d7906120e1565b6001600160a01b038116610f655760405162461bcd60e51b81526004016105d790611c66565b610ac9816112ce565b60006001600160e01b031982166380ac58cd60e01b1480610f9f57506001600160e01b03198216635b5e139f60e01b145b8061059057506105908261146e565b3390565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061100482610b42565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061104882610fb2565b6110645760405162461bcd60e51b81526004016105d790611e7d565b600061106f83610b42565b9050806001600160a01b0316846001600160a01b031614806110aa5750836001600160a01b031661109f846106bd565b6001600160a01b0316145b806110ba57506110ba8185610ecc565b949350505050565b826001600160a01b03166110d582610b42565b6001600160a01b0316146110fb5760405162461bcd60e51b81526004016105d79061214d565b6001600160a01b0382166111215760405162461bcd60e51b81526004016105d790611e02565b61112c838383611487565b611137600082610fcf565b6001600160a01b0383166000908152600360205260408120805460019290611160908490612370565b90915550506001600160a01b038216600090815260036020526040812080546001929061118e908490612325565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166112155760405162461bcd60e51b81526004016105d790612029565b61121e81610fb2565b1561123b5760405162461bcd60e51b81526004016105d790611cac565b61124760008383611487565b6001600160a01b0382166000908152600360205260408120805460019290611270908490612325565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61132b8484846110c2565b61133784848484611510565b610a245760405162461bcd60e51b81526004016105d790611c14565b60608161137857506040805180820190915260018152600360fc1b6020820152610593565b8160005b81156113a2578061138c816123ee565b915061139b9050600a8361233d565b915061137c565b60008167ffffffffffffffff8111156113cb57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113f5576020820181803683370190505b5090505b84156110ba5761140a600183612370565b9150611417600a86612409565b611422906030612325565b60f81b81838151811061144557634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611467600a8661233d565b94506113f9565b6001600160e01b031981166301ffc9a760e01b14919050565b611492838383610793565b6001600160a01b0383166114ae576114a98161162b565b6114d1565b816001600160a01b0316836001600160a01b0316146114d1576114d1838261166f565b6001600160a01b0382166114ed576114e88161170c565b610793565b826001600160a01b0316826001600160a01b0316146107935761079382826117e5565b6000611524846001600160a01b0316611829565b1561162057836001600160a01b031663150b7a02611540610fae565b8786866040518563ffffffff1660e01b81526004016115629493929190611b6e565b602060405180830381600087803b15801561157c57600080fd5b505af19250505080156115ac575060408051601f3d908101601f191682019092526115a991810190611a38565b60015b611606573d8080156115da576040519150601f19603f3d011682016040523d82523d6000602084013e6115df565b606091505b5080516115fe5760405162461bcd60e51b81526004016105d790611c14565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110ba565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161167c84610c58565b6116869190612370565b6000838152600760205260409020549091508082146116d9576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061171e90600190612370565b6000838152600960205260408120546008805493945090928490811061175457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061178357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806117c957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006117f083610c58565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b80356001600160a01b038116811461059357600080fd5b8035801515811461059357600080fd5b600060208284031215611867578081fd5b6118708261182f565b9392505050565b60008060408385031215611889578081fd5b6118928361182f565b91506118a06020840161182f565b90509250929050565b6000806000606084860312156118bd578081fd5b6118c68461182f565b92506118d46020850161182f565b9150604084013590509250925092565b600080600080608085870312156118f9578081fd5b6119028561182f565b9350602061191181870161182f565b935060408601359250606086013567ffffffffffffffff80821115611934578384fd5b818801915088601f830112611947578384fd5b81358181111561195957611959612449565b604051601f8201601f191681018501838111828210171561197c5761197c612449565b60405281815283820185018b1015611992578586fd5b81858501868301379081019093019390935250939692955090935050565b600080604083850312156119c2578182fd5b6119cb8361182f565b91506118a060208401611846565b600080604083850312156119eb578182fd5b6119f48361182f565b946020939093013593505050565b600060208284031215611a13578081fd5b61187082611846565b600060208284031215611a2d578081fd5b81356118708161245f565b600060208284031215611a49578081fd5b81516118708161245f565b600060208284031215611a65578081fd5b5035919050565b60008151808452611a84816020860160208601612387565b601f01601f19169290920160200192915050565b60008151611aaa818560208601612387565b9290920192915050565b8254600090819060028104600180831680611ad057607f831692505b6020808410821415611af057634e487b7160e01b87526022600452602487fd5b818015611b045760018114611b1557611b41565b60ff19861689528489019650611b41565b611b1e8b612319565b885b86811015611b395781548b820152908501908301611b20565b505084890196505b505050505050611b518185611a98565b95945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ba190830184611a6c565b9695505050505050565b901515815260200190565b6000602082526118706020830184611a6c565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526026908201527f4f6e6c79206f776e65722063616e206368616e67652073616c65207374617274604082015265103a34b6b29760d11b606082015260800190565b60208082526024908201527f4f6e6c79206f776e65722063616e206368616e67652063757272656e7420707260408201526334b1b29760e11b606082015260800190565b6020808252602e908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526d1b995e1a5cdd195b9d081cd9585b60921b606082015260800190565b60208082526027908201527f57652061726520707574206f6e20706175736520666f72207468652074696d65604082015266206265696e672160c81b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526021908201527f4f6e6c79207365616c207465616d2063616e2077697468647261772066756e646040820152607360f81b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252601590820152744f6e6c79206f776e65722063616e2070617573652160581b604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f4f6e6c79206f776e6572206d6179206d696e742066726565207365616c730000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526017908201527f43616e206f6e6c79206d696e74203135207365616c7321000000000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526014908201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b604082015260600190565b6020808252601d908201527f4d6178696d756d207365616c7320616c7265616479206d696e74656421000000604082015260600190565b6020808252601e908201527f42616c616e6365206d7573742062652067726561746572207468616e20300000604082015260600190565b90815260200190565b60009081526020902090565b600082198211156123385761233861241d565b500190565b60008261234c5761234c612433565b500490565b600081600019048311821515161561236b5761236b61241d565b500290565b6000828210156123825761238261241d565b500390565b60005b838110156123a257818101518382015260200161238a565b83811115610a245750506000910152565b6002810460018216806123c757607f821691505b602082108114156123e857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124025761240261241d565b5060010190565b60008261241857612418612433565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610ac957600080fdfea26469706673582212203856ad2ad504cd86b605a5b9422a8420ee0249ecd807035ceecdf10a12abd37364736f6c63430008000033
Deployed Bytecode Sourcemap
45087:4107:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36341:300;;;;;;;;;;-1:-1:-1;36341:300:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48250:149;;;;;;;;;;-1:-1:-1;48250:149:0;;;;;:::i;:::-;;:::i;:::-;;22489:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24182:308::-;;;;;;;;;;-1:-1:-1;24182:308:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23705:411::-;;;;;;;;;;-1:-1:-1;23705:411:0;;;;;:::i;:::-;;:::i;47112:309::-;;;;;;;;;;-1:-1:-1;47112:309:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37144:113::-;;;;;;;;;;;;;:::i;45223:41::-;;;;;;;;;;;;;:::i;46993:111::-;;;;;;;;;;;;;:::i;25241:376::-;;;;;;;;;;-1:-1:-1;25241:376:0;;;;;:::i;:::-;;:::i;36725:343::-;;;;;;;;;;-1:-1:-1;36725:343:0;;;;;:::i;:::-;;:::i;48407:784::-;;;;;;;;;;;;;:::i;46471:423::-;;;;;;;;;;-1:-1:-1;46471:423:0;;;;;:::i;:::-;;:::i;25688:185::-;;;;;;;;;;-1:-1:-1;25688:185:0;;;;;:::i;:::-;;:::i;37334:320::-;;;;;;;;;;-1:-1:-1;37334:320:0;;;;;:::i;:::-;;:::i;22096:326::-;;;;;;;;;;-1:-1:-1;22096:326:0;;;;;:::i;:::-;;:::i;45796:667::-;;;;;;:::i;:::-;;:::i;21739:295::-;;;;;;;;;;-1:-1:-1;21739:295:0;;;;;:::i;:::-;;:::i;47801:91::-;;;;;;;;;;;;;:::i;44421:94::-;;;;;;;;;;;;;:::i;47429:261::-;;;;;;;;;;-1:-1:-1;47429:261:0;;;;;:::i;:::-;;:::i;46902:83::-;;;;;;;;;;;;;:::i;43770:87::-;;;;;;;;;;;;;:::i;22658:104::-;;;;;;;;;;;;;:::i;24562:327::-;;;;;;;;;;-1:-1:-1;24562:327:0;;;;;:::i;:::-;;:::i;25944:365::-;;;;;;;;;;-1:-1:-1;25944:365:0;;;;;:::i;:::-;;:::i;47900:342::-;;;;;;;;;;-1:-1:-1;47900:342:0;;;;;:::i;:::-;;:::i;45184:32::-;;;;;;;;;;;;;:::i;24960:214::-;;;;;;;;;;-1:-1:-1;24960:214:0;;;;;:::i;:::-;;:::i;47698:95::-;;;;;;;;;;;;;:::i;44670:229::-;;;;;;;;;;-1:-1:-1;44670:229:0;;;;;:::i;:::-;;:::i;36341:300::-;36488:4;-1:-1:-1;;;;;;36530:50:0;;-1:-1:-1;;;36530:50:0;;:103;;;36597:36;36621:11;36597:23;:36::i;:::-;36510:123;;36341:300;;;;:::o;48250:149::-;44001:12;:10;:12::i;:::-;-1:-1:-1;;;;;43990:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43990:23:0;;43982:68;;;;-1:-1:-1;;;43982:68:0;;;;;;;:::i;:::-;;;;;;;;;48331:7:::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;48317:21:0::1;:10;-1:-1:-1::0;;;;;48317:21:0::1;;48309:55;;;;-1:-1:-1::0;;;48309:55:0::1;;;;;;;:::i;:::-;48375:6;:16:::0;;-1:-1:-1;;48375:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48250:149::o;22489:100::-;22543:13;22576:5;22569:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22489:100;:::o;24182:308::-;24303:7;24350:16;24358:7;24350;:16::i;:::-;24328:110;;;;-1:-1:-1;;;24328:110:0;;;;;;;:::i;:::-;-1:-1:-1;24458:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24458:24:0;;24182:308::o;23705:411::-;23786:13;23802:23;23817:7;23802:14;:23::i;:::-;23786:39;;23850:5;-1:-1:-1;;;;;23844:11:0;:2;-1:-1:-1;;;;;23844:11:0;;;23836:57;;;;-1:-1:-1;;;23836:57:0;;;;;;;:::i;:::-;23944:5;-1:-1:-1;;;;;23928:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;23928:21:0;;:62;;;;23953:37;23970:5;23977:12;:10;:12::i;23953:37::-;23906:168;;;;-1:-1:-1;;;23906:168:0;;;;;;;:::i;:::-;24087:21;24096:2;24100:7;24087:8;:21::i;:::-;23705:411;;;:::o;47112:309::-;47203:7;47264;:5;:7::i;:::-;-1:-1:-1;;;;;47250:21:0;:10;-1:-1:-1;;;;;47250:21:0;;47228:109;;;;-1:-1:-1;;;47228:109:0;;;;;;;:::i;:::-;-1:-1:-1;47348:13:0;:32;;;;47112:309::o;37144:113::-;37232:10;:17;37144:113;:::o;45223:41::-;;;;:::o;46993:111::-;47075:21;46993:111;:::o;25241:376::-;25450:41;25469:12;:10;:12::i;:::-;25483:7;25450:18;:41::i;:::-;25428:140;;;;-1:-1:-1;;;25428:140:0;;;;;;;:::i;:::-;25581:28;25591:4;25597:2;25601:7;25581:9;:28::i;36725:343::-;36867:7;36922:23;36939:5;36922:16;:23::i;:::-;36914:5;:31;36892:124;;;;-1:-1:-1;;;36892:124:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;37034:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36725:343::o;48407:784::-;48481:5;;-1:-1:-1;;;;;48481:5:0;48467:10;:19;;:59;;-1:-1:-1;48521:5:0;;-1:-1:-1;;;;;48521:5:0;48507:10;:19;48467:59;:99;;;-1:-1:-1;48561:5:0;;-1:-1:-1;;;;;48561:5:0;48547:10;:19;48467:99;:137;;;-1:-1:-1;48601:3:0;;-1:-1:-1;;;;;48601:3:0;48587:10;:17;48467:137;48445:220;;;;-1:-1:-1;;;48445:220:0;;;;;;;:::i;:::-;48708:1;48684:21;:25;48676:68;;;;-1:-1:-1;;;48676:68:0;;;;;;;:::i;:::-;48755:22;48810:2;48781:25;:21;48805:1;48781:25;:::i;:::-;48780:32;;;;:::i;:::-;48755:57;-1:-1:-1;48823:24:0;48850:38;48755:57;48850:21;:38;:::i;:::-;48823:65;-1:-1:-1;48899:13:0;48940:2;48916:20;48823:65;48935:1;48916:20;:::i;:::-;48915:27;;;;:::i;:::-;48899:43;-1:-1:-1;48953:11:0;48992:2;48968:20;:16;48987:1;48968:20;:::i;:::-;48967:27;;;;:::i;:::-;49021:5;;49013:26;;48953:41;;-1:-1:-1;;;;;;49021:5:0;;49013:26;;;;;49033:5;;49021;49013:26;49021:5;49013:26;49033:5;49021;49013:26;;;;;;;49005:35;;;;;;49067:5;;49059:26;;-1:-1:-1;;;;;49067:5:0;;;;49059:26;;;;;49079:5;;49067;49059:26;49067:5;49059:26;49079:5;49067;49059:26;;;;;;;49051:35;;;;;;49113:5;;49105:24;;-1:-1:-1;;;;;49113:5:0;;;;49105:24;;;;;49125:3;;49113:5;49105:24;49113:5;49105:24;49125:3;49113:5;49105:24;;;;;;;49097:33;;;;;;49157:3;;49149:33;;-1:-1:-1;;;;;49157:3:0;;;;49149:33;;;;;49167:14;;49157:3;49149:33;49157:3;49149:33;49167:14;49157:3;49149:33;;;;;;;49141:42;;;;;;48407:784;;;;:::o;46471:423::-;46554:7;:5;:7::i;:::-;-1:-1:-1;;;;;46540:21:0;:10;-1:-1:-1;;;;;46540:21:0;;46532:64;;;;-1:-1:-1;;;46532:64:0;;;;;;;:::i;:::-;46607:14;46624:13;:11;:13::i;:::-;46692:9;;46607:30;;-1:-1:-1;46670:18:0;46679:9;46607:30;46670:18;:::i;:::-;:31;;46648:110;;;;-1:-1:-1;;;46648:110:0;;;;;;;:::i;:::-;46788:1;46771:97;46796:9;46791:1;:14;46771:97;;46827:29;46833:10;46845;46854:1;46845:6;:10;:::i;:::-;46827:5;:29::i;:::-;46807:3;;;;:::i;:::-;;;;46771:97;;46471:423;;:::o;25688:185::-;25826:39;25843:4;25849:2;25853:7;25826:39;;;;;;;;;;;;:16;:39::i;37334:320::-;37454:7;37509:30;:28;:30::i;:::-;37501:5;:38;37479:132;;;;-1:-1:-1;;;37479:132:0;;;;;;;:::i;:::-;37629:10;37640:5;37629:17;;;;;;-1:-1:-1;;;37629:17:0;;;;;;;;;;;;;;;;;37622:24;;37334:320;;;:::o;22096:326::-;22213:7;22254:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22254:16:0;22303:19;22281:110;;;;-1:-1:-1;;;22281:110:0;;;;;;;:::i;45796:667::-;45869:14;45886:13;:11;:13::i;:::-;45869:30;;45937:13;;45918:15;:32;;45910:65;;;;-1:-1:-1;;;45910:65:0;;;;;;;:::i;:::-;46016:2;45994:18;:24;;45986:60;;;;-1:-1:-1;;;45986:60:0;;;;;;;:::i;:::-;46110:9;;46079:27;46088:18;46079:6;:27;:::i;:::-;:40;;46057:119;;;;-1:-1:-1;;;46057:119:0;;;;;;;:::i;:::-;46195:6;;;;:15;46187:67;;;;-1:-1:-1;;;46187:67:0;;;;;;;:::i;:::-;46302:18;46287:12;;:33;;;;:::i;:::-;46273:9;:48;;46265:57;;;;;;46350:1;46333:106;46358:18;46353:1;:23;46333:106;;46398:29;46404:10;46416;46425:1;46416:6;:10;:::i;46398:29::-;46378:3;;;;:::i;:::-;;;;46333:106;;21739:295;21856:7;-1:-1:-1;;;;;21903:19:0;;21881:111;;;;-1:-1:-1;;;21881:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22010:16:0;;;;;:9;:16;;;;;;;21739:295::o;47801:91::-;47844:13;47877:7;47870:14;;;;;:::i;44421:94::-;44001:12;:10;:12::i;:::-;-1:-1:-1;;;;;43990:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43990:23:0;;43982:68;;;;-1:-1:-1;;;43982:68:0;;;;;;;:::i;:::-;44486:21:::1;44504:1;44486:9;:21::i;:::-;44421:94::o:0;47429:261::-;47516:7;47563;:5;:7::i;:::-;-1:-1:-1;;;;;47549:21:0;:10;-1:-1:-1;;;;;47549:21:0;;47541:70;;;;-1:-1:-1;;;47541:70:0;;;;;;;:::i;:::-;-1:-1:-1;47622:12:0;:30;;;;47429:261::o;46902:83::-;46943:7;46970;:5;:7::i;:::-;46963:14;;46902:83;:::o;43770:87::-;43843:6;;-1:-1:-1;;;;;43843:6:0;43770:87;:::o;22658:104::-;22714:13;22747:7;22740:14;;;;;:::i;24562:327::-;24709:12;:10;:12::i;:::-;-1:-1:-1;;;;;24697:24:0;:8;-1:-1:-1;;;;;24697:24:0;;;24689:62;;;;-1:-1:-1;;;24689:62:0;;;;;;;:::i;:::-;24809:8;24764:18;:32;24783:12;:10;:12::i;:::-;-1:-1:-1;;;;;24764:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24764:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;24764:53:0;;;;;;;;;;;24848:12;:10;:12::i;:::-;-1:-1:-1;;;;;24833:48:0;;24872:8;24833:48;;;;;;:::i;:::-;;;;;;;;24562:327;;:::o;25944:365::-;26133:41;26152:12;:10;:12::i;:::-;26166:7;26133:18;:41::i;:::-;26111:140;;;;-1:-1:-1;;;26111:140:0;;;;;;;:::i;:::-;26262:39;26276:4;26282:2;26286:7;26295:5;26262:13;:39::i;47900:342::-;48018:13;48071:16;48079:7;48071;:16::i;:::-;48049:112;;;;-1:-1:-1;;;48049:112:0;;;;;;;:::i;:::-;48205:7;48214:18;:7;:16;:18::i;:::-;48188:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48174:60;;47900:342;;;:::o;45184:32::-;;;;:::o;24960:214::-;-1:-1:-1;;;;;25131:25:0;;;25102:4;25131:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24960:214::o;47698:95::-;47773:12;;47698:95;:::o;44670:229::-;44001:12;:10;:12::i;:::-;-1:-1:-1;;;;;43990:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;43990:23:0;;43982:68;;;;-1:-1:-1;;;43982:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44773:22:0;::::1;44751:110;;;;-1:-1:-1::0;;;44751:110:0::1;;;;;;;:::i;:::-;44872:19;44882:8;44872:9;:19::i;21320:355::-:0;21467:4;-1:-1:-1;;;;;;21509:40:0;;-1:-1:-1;;;21509:40:0;;:105;;-1:-1:-1;;;;;;;21566:48:0;;-1:-1:-1;;;21566:48:0;21509:105;:158;;;;21631:36;21655:11;21631:23;:36::i;16688:98::-;16768:10;16688:98;:::o;27856:127::-;27921:4;27945:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27945:16:0;:30;;;27856:127::o;31979:174::-;32054:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32054:29:0;-1:-1:-1;;;;;32054:29:0;;;;;;;;:24;;32108:23;32054:24;32108:14;:23::i;:::-;-1:-1:-1;;;;;32099:46:0;;;;;;;;;;;31979:174;;:::o;28150:452::-;28279:4;28323:16;28331:7;28323;:16::i;:::-;28301:110;;;;-1:-1:-1;;;28301:110:0;;;;;;;:::i;:::-;28422:13;28438:23;28453:7;28438:14;:23::i;:::-;28422:39;;28491:5;-1:-1:-1;;;;;28480:16:0;:7;-1:-1:-1;;;;;28480:16:0;;:64;;;;28537:7;-1:-1:-1;;;;;28513:31:0;:20;28525:7;28513:11;:20::i;:::-;-1:-1:-1;;;;;28513:31:0;;28480:64;:113;;;;28561:32;28578:5;28585:7;28561:16;:32::i;:::-;28472:122;28150:452;-1:-1:-1;;;;28150:452:0:o;31246:615::-;31419:4;-1:-1:-1;;;;;31392:31:0;:23;31407:7;31392:14;:23::i;:::-;-1:-1:-1;;;;;31392:31:0;;31370:122;;;;-1:-1:-1;;;31370:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31511:16:0;;31503:65;;;;-1:-1:-1;;;31503:65:0;;;;;;;:::i;:::-;31581:39;31602:4;31608:2;31612:7;31581:20;:39::i;:::-;31685:29;31702:1;31706:7;31685:8;:29::i;:::-;-1:-1:-1;;;;;31727:15:0;;;;;;:9;:15;;;;;:20;;31746:1;;31727:15;:20;;31746:1;;31727:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31758:13:0;;;;;;:9;:13;;;;;:18;;31775:1;;31758:13;:18;;31775:1;;31758:18;:::i;:::-;;;;-1:-1:-1;;31787:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31787:21:0;-1:-1:-1;;;;;31787:21:0;;;;;;;;;31826:27;;31787:16;;31826:27;;;;;;;31246:615;;;:::o;29938:382::-;-1:-1:-1;;;;;30018:16:0;;30010:61;;;;-1:-1:-1;;;30010:61:0;;;;;;;:::i;:::-;30091:16;30099:7;30091;:16::i;:::-;30090:17;30082:58;;;;-1:-1:-1;;;30082:58:0;;;;;;;:::i;:::-;30153:45;30182:1;30186:2;30190:7;30153:20;:45::i;:::-;-1:-1:-1;;;;;30211:13:0;;;;;;:9;:13;;;;;:18;;30228:1;;30211:13;:18;;30228:1;;30211:18;:::i;:::-;;;;-1:-1:-1;;30240:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30240:21:0;-1:-1:-1;;;;;30240:21:0;;;;;;;;30279:33;;30240:16;;;30279:33;;30240:16;;30279:33;29938:382;;:::o;44907:173::-;44982:6;;;-1:-1:-1;;;;;44999:17:0;;;-1:-1:-1;;;;;;44999:17:0;;;;;;;45032:40;;44982:6;;;44999:17;44982:6;;45032:40;;44963:16;;45032:40;44907:173;;:::o;27191:352::-;27348:28;27358:4;27364:2;27368:7;27348:9;:28::i;:::-;27409:48;27432:4;27438:2;27442:7;27451:5;27409:22;:48::i;:::-;27387:148;;;;-1:-1:-1;;;27387:148:0;;;;;;;:::i;17209:723::-;17265:13;17486:10;17482:53;;-1:-1:-1;17513:10:0;;;;;;;;;;;;-1:-1:-1;;;17513:10:0;;;;;;17482:53;17560:5;17545:12;17601:78;17608:9;;17601:78;;17634:8;;;;:::i;:::-;;-1:-1:-1;17657:10:0;;-1:-1:-1;17665:2:0;17657:10;;:::i;:::-;;;17601:78;;;17689:19;17721:6;17711:17;;;;;;-1:-1:-1;;;17711:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17711:17:0;;17689:39;;17739:154;17746:10;;17739:154;;17773:11;17783:1;17773:11;;:::i;:::-;;-1:-1:-1;17842:10:0;17850:2;17842:5;:10;:::i;:::-;17829:24;;:2;:24;:::i;:::-;17816:39;;17799:6;17806;17799:14;;;;;;-1:-1:-1;;;17799:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17799:56:0;;;;;;;;-1:-1:-1;17870:11:0;17879:2;17870:11;;:::i;:::-;;;17739:154;;19792:207;-1:-1:-1;;;;;;19951:40:0;;-1:-1:-1;;;19951:40:0;19792:207;;;:::o;38267:589::-;38411:45;38438:4;38444:2;38448:7;38411:26;:45::i;:::-;-1:-1:-1;;;;;38473:18:0;;38469:187;;38508:40;38540:7;38508:31;:40::i;:::-;38469:187;;;38578:2;-1:-1:-1;;;;;38570:10:0;:4;-1:-1:-1;;;;;38570:10:0;;38566:90;;38597:47;38630:4;38636:7;38597:32;:47::i;:::-;-1:-1:-1;;;;;38670:16:0;;38666:183;;38703:45;38740:7;38703:36;:45::i;:::-;38666:183;;;38776:4;-1:-1:-1;;;;;38770:10:0;:2;-1:-1:-1;;;;;38770:10:0;;38766:83;;38797:40;38825:2;38829:7;38797:27;:40::i;32718:984::-;32873:4;32894:15;:2;-1:-1:-1;;;;;32894:13:0;;:15::i;:::-;32890:805;;;32963:2;-1:-1:-1;;;;;32947:36:0;;33006:12;:10;:12::i;:::-;33041:4;33068:7;33098:5;32947:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32947:175:0;;;;;;;;-1:-1:-1;;32947:175:0;;;;;;;;;;;;:::i;:::-;;;32926:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33309:13:0;;33305:320;;33352:108;;-1:-1:-1;;;33352:108:0;;;;;;;:::i;33305:320::-;33575:6;33569:13;33560:6;33556:2;33552:15;33545:38;32926:714;-1:-1:-1;;;;;;33186:55:0;-1:-1:-1;;;33186:55:0;;-1:-1:-1;33179:62:0;;32890:805;-1:-1:-1;33679:4:0;32718:984;;;;;;:::o;39579:164::-;39683:10;:17;;39656:24;;;;:15;:24;;;;;:44;;;39711:24;;;;;;;;;;;;39579:164::o;40370:1002::-;40650:22;40700:1;40675:22;40692:4;40675:16;:22::i;:::-;:26;;;;:::i;:::-;40712:18;40733:26;;;:17;:26;;;;;;40650:51;;-1:-1:-1;40866:28:0;;;40862:328;;-1:-1:-1;;;;;40933:18:0;;40911:19;40933:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40984:30;;;;;;:44;;;41101:30;;:17;:30;;;;;:43;;;40862:328;-1:-1:-1;41286:26:0;;;;:17;:26;;;;;;;;41279:33;;;-1:-1:-1;;;;;41330:18:0;;;;;:12;:18;;;;;:34;;;;;;;41323:41;40370:1002::o;41667:1079::-;41945:10;:17;41920:22;;41945:21;;41965:1;;41945:21;:::i;:::-;41977:18;41998:24;;;:15;:24;;;;;;42371:10;:26;;41920:46;;-1:-1:-1;41998:24:0;;41920:46;;42371:26;;;;-1:-1:-1;;;42371:26:0;;;;;;;;;;;;;;;;;42349:48;;42435:11;42410:10;42421;42410:22;;;;;;-1:-1:-1;;;42410:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;42515:28;;;:15;:28;;;;;;;:41;;;42687:24;;;;;42680:31;42722:10;:16;;;;;-1:-1:-1;;;42722:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;41667:1079;;;;:::o;39157:221::-;39242:14;39259:20;39276:2;39259:16;:20::i;:::-;-1:-1:-1;;;;;39290:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39335:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39157:221:0:o;8487:387::-;8810:20;8858:8;;;8487:387::o;14:175:1:-;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:162;261:20;;317:13;;310:21;300:32;;290:2;;346:1;343;336:12;361:198;;473:2;461:9;452:7;448:23;444:32;441:2;;;494:6;486;479:22;441:2;522:31;543:9;522:31;:::i;:::-;512:41;431:128;-1:-1:-1;;;431:128:1:o;564:274::-;;;693:2;681:9;672:7;668:23;664:32;661:2;;;714:6;706;699:22;661:2;742:31;763:9;742:31;:::i;:::-;732:41;;792:40;828:2;817:9;813:18;792:40;:::i;:::-;782:50;;651:187;;;;;:::o;843:342::-;;;;989:2;977:9;968:7;964:23;960:32;957:2;;;1010:6;1002;995:22;957:2;1038:31;1059:9;1038:31;:::i;:::-;1028:41;;1088:40;1124:2;1113:9;1109:18;1088:40;:::i;:::-;1078:50;;1175:2;1164:9;1160:18;1147:32;1137:42;;947:238;;;;;:::o;1190:1178::-;;;;;1362:3;1350:9;1341:7;1337:23;1333:33;1330:2;;;1384:6;1376;1369:22;1330:2;1412:31;1433:9;1412:31;:::i;:::-;1402:41;;1462:2;1483:40;1519:2;1508:9;1504:18;1483:40;:::i;:::-;1473:50;;1570:2;1559:9;1555:18;1542:32;1532:42;;1625:2;1614:9;1610:18;1597:32;1648:18;1689:2;1681:6;1678:14;1675:2;;;1710:6;1702;1695:22;1675:2;1753:6;1742:9;1738:22;1728:32;;1798:7;1791:4;1787:2;1783:13;1779:27;1769:2;;1825:6;1817;1810:22;1769:2;1866;1853:16;1888:2;1884;1881:10;1878:2;;;1894:18;;:::i;:::-;1943:2;1937:9;2012:2;1993:13;;-1:-1:-1;;1989:27:1;1977:40;;1973:49;;2037:18;;;2057:22;;;2034:46;2031:2;;;2083:18;;:::i;:::-;2119:2;2112:22;2143:18;;;2180:11;;;2176:20;;2173:33;-1:-1:-1;2170:2:1;;;2224:6;2216;2209:22;2170:2;2285;2280;2276;2272:11;2267:2;2259:6;2255:15;2242:46;2308:15;;;2304:24;;;2297:40;;;;-1:-1:-1;1320:1048:1;;;;-1:-1:-1;1320:1048:1;;-1:-1:-1;;1320:1048:1:o;2373:268::-;;;2499:2;2487:9;2478:7;2474:23;2470:32;2467:2;;;2520:6;2512;2505:22;2467:2;2548:31;2569:9;2548:31;:::i;:::-;2538:41;;2598:37;2631:2;2620:9;2616:18;2598:37;:::i;2646:266::-;;;2775:2;2763:9;2754:7;2750:23;2746:32;2743:2;;;2796:6;2788;2781:22;2743:2;2824:31;2845:9;2824:31;:::i;:::-;2814:41;2902:2;2887:18;;;;2874:32;;-1:-1:-1;;;2733:179:1:o;2917:192::-;;3026:2;3014:9;3005:7;3001:23;2997:32;2994:2;;;3047:6;3039;3032:22;2994:2;3075:28;3093:9;3075:28;:::i;3114:257::-;;3225:2;3213:9;3204:7;3200:23;3196:32;3193:2;;;3246:6;3238;3231:22;3193:2;3290:9;3277:23;3309:32;3335:5;3309:32;:::i;3376:261::-;;3498:2;3486:9;3477:7;3473:23;3469:32;3466:2;;;3519:6;3511;3504:22;3466:2;3556:9;3550:16;3575:32;3601:5;3575:32;:::i;3642:190::-;;3754:2;3742:9;3733:7;3729:23;3725:32;3722:2;;;3775:6;3767;3760:22;3722:2;-1:-1:-1;3803:23:1;;3712:120;-1:-1:-1;3712:120:1:o;3837:259::-;;3918:5;3912:12;3945:6;3940:3;3933:19;3961:63;4017:6;4010:4;4005:3;4001:14;3994:4;3987:5;3983:16;3961:63;:::i;:::-;4078:2;4057:15;-1:-1:-1;;4053:29:1;4044:39;;;;4085:4;4040:50;;3888:208;-1:-1:-1;;3888:208:1:o;4101:187::-;;4183:5;4177:12;4198:52;4243:6;4238:3;4231:4;4224:5;4220:16;4198:52;:::i;:::-;4266:16;;;;;4153:135;-1:-1:-1;;4153:135:1:o;4293:1181::-;4527:13;;4293:1181;;;;4600:1;4585:17;;4621:1;4657:18;;;;4684:2;;4738:4;4730:6;4726:17;4716:27;;4684:2;4764;4812;4804:6;4801:14;4781:18;4778:38;4775:2;;;-1:-1:-1;;;4839:33:1;;4895:4;4892:1;4885:15;4925:4;4846:3;4913:17;4775:2;4956:18;4983:104;;;;5101:1;5096:324;;;;4949:471;;4983:104;-1:-1:-1;;5016:24:1;;5004:37;;5061:16;;;;-1:-1:-1;4983:104:1;;5096:324;5132:39;5164:6;5132:39;:::i;:::-;5193:3;5209:165;5223:6;5220:1;5217:13;5209:165;;;5301:14;;5288:11;;;5281:35;5344:16;;;;5238:10;;5209:165;;;5213:3;;5403:6;5398:3;5394:16;5387:23;;4949:471;;;;;;;5436:32;5464:3;5456:6;5436:32;:::i;:::-;5429:39;4477:997;-1:-1:-1;;;;;4477:997:1:o;5479:203::-;-1:-1:-1;;;;;5643:32:1;;;;5625:51;;5613:2;5598:18;;5580:102::o;5687:490::-;-1:-1:-1;;;;;5956:15:1;;;5938:34;;6008:15;;6003:2;5988:18;;5981:43;6055:2;6040:18;;6033:34;;;6103:3;6098:2;6083:18;;6076:31;;;5687:490;;6124:47;;6151:19;;6143:6;6124:47;:::i;:::-;6116:55;5890:287;-1:-1:-1;;;;;;5890:287:1:o;6182:187::-;6347:14;;6340:22;6322:41;;6310:2;6295:18;;6277:92::o;6374:221::-;;6523:2;6512:9;6505:21;6543:46;6585:2;6574:9;6570:18;6562:6;6543:46;:::i;6600:407::-;6802:2;6784:21;;;6841:2;6821:18;;;6814:30;6880:34;6875:2;6860:18;;6853:62;-1:-1:-1;;;6946:2:1;6931:18;;6924:41;6997:3;6982:19;;6774:233::o;7012:414::-;7214:2;7196:21;;;7253:2;7233:18;;;7226:30;7292:34;7287:2;7272:18;;7265:62;-1:-1:-1;;;7358:2:1;7343:18;;7336:48;7416:3;7401:19;;7186:240::o;7431:402::-;7633:2;7615:21;;;7672:2;7652:18;;;7645:30;7711:34;7706:2;7691:18;;7684:62;-1:-1:-1;;;7777:2:1;7762:18;;7755:36;7823:3;7808:19;;7605:228::o;7838:352::-;8040:2;8022:21;;;8079:2;8059:18;;;8052:30;8118;8113:2;8098:18;;8091:58;8181:2;8166:18;;8012:178::o;8195:402::-;8397:2;8379:21;;;8436:2;8416:18;;;8409:30;8475:34;8470:2;8455:18;;8448:62;-1:-1:-1;;;8541:2:1;8526:18;;8519:36;8587:3;8572:19;;8369:228::o;8602:400::-;8804:2;8786:21;;;8843:2;8823:18;;;8816:30;8882:34;8877:2;8862:18;;8855:62;-1:-1:-1;;;8948:2:1;8933:18;;8926:34;8992:3;8977:19;;8776:226::o;9007:410::-;9209:2;9191:21;;;9248:2;9228:18;;;9221:30;9287:34;9282:2;9267:18;;9260:62;-1:-1:-1;;;9353:2:1;9338:18;;9331:44;9407:3;9392:19;;9181:236::o;9422:403::-;9624:2;9606:21;;;9663:2;9643:18;;;9636:30;9702:34;9697:2;9682:18;;9675:62;-1:-1:-1;;;9768:2:1;9753:18;;9746:37;9815:3;9800:19;;9596:229::o;9830:400::-;10032:2;10014:21;;;10071:2;10051:18;;;10044:30;10110:34;10105:2;10090:18;;10083:62;-1:-1:-1;;;10176:2:1;10161:18;;10154:34;10220:3;10205:19;;10004:226::o;10235:349::-;10437:2;10419:21;;;10476:2;10456:18;;;10449:30;10515:27;10510:2;10495:18;;10488:55;10575:2;10560:18;;10409:175::o;10589:408::-;10791:2;10773:21;;;10830:2;10810:18;;;10803:30;10869:34;10864:2;10849:18;;10842:62;-1:-1:-1;;;10935:2:1;10920:18;;10913:42;10987:3;10972:19;;10763:234::o;11002:397::-;11204:2;11186:21;;;11243:2;11223:18;;;11216:30;11282:34;11277:2;11262:18;;11255:62;-1:-1:-1;;;11348:2:1;11333:18;;11326:31;11389:3;11374:19;;11176:223::o;11404:420::-;11606:2;11588:21;;;11645:2;11625:18;;;11618:30;11684:34;11679:2;11664:18;;11657:62;11755:26;11750:2;11735:18;;11728:54;11814:3;11799:19;;11578:246::o;11829:406::-;12031:2;12013:21;;;12070:2;12050:18;;;12043:30;12109:34;12104:2;12089:18;;12082:62;-1:-1:-1;;;12175:2:1;12160:18;;12153:40;12225:3;12210:19;;12003:232::o;12240:405::-;12442:2;12424:21;;;12481:2;12461:18;;;12454:30;12520:34;12515:2;12500:18;;12493:62;-1:-1:-1;;;12586:2:1;12571:18;;12564:39;12635:3;12620:19;;12414:231::o;12650:345::-;12852:2;12834:21;;;12891:2;12871:18;;;12864:30;-1:-1:-1;;;12925:2:1;12910:18;;12903:51;12986:2;12971:18;;12824:171::o;13000:356::-;13202:2;13184:21;;;13221:18;;;13214:30;13280:34;13275:2;13260:18;;13253:62;13347:2;13332:18;;13174:182::o;13361:408::-;13563:2;13545:21;;;13602:2;13582:18;;;13575:30;13641:34;13636:2;13621:18;;13614:62;-1:-1:-1;;;13707:2:1;13692:18;;13685:42;13759:3;13744:19;;13535:234::o;13774:354::-;13976:2;13958:21;;;14015:2;13995:18;;;13988:30;14054:32;14049:2;14034:18;;14027:60;14119:2;14104:18;;13948:180::o;14133:356::-;14335:2;14317:21;;;14354:18;;;14347:30;14413:34;14408:2;14393:18;;14386:62;14480:2;14465:18;;14307:182::o;14494:347::-;14696:2;14678:21;;;14735:2;14715:18;;;14708:30;14774:25;14769:2;14754:18;;14747:53;14832:2;14817:18;;14668:173::o;14846:405::-;15048:2;15030:21;;;15087:2;15067:18;;;15060:30;15126:34;15121:2;15106:18;;15099:62;-1:-1:-1;;;15192:2:1;15177:18;;15170:39;15241:3;15226:19;;15020:231::o;15256:397::-;15458:2;15440:21;;;15497:2;15477:18;;;15470:30;15536:34;15531:2;15516:18;;15509:62;-1:-1:-1;;;15602:2:1;15587:18;;15580:31;15643:3;15628:19;;15430:223::o;15658:413::-;15860:2;15842:21;;;15899:2;15879:18;;;15872:30;15938:34;15933:2;15918:18;;15911:62;-1:-1:-1;;;16004:2:1;15989:18;;15982:47;16061:3;16046:19;;15832:239::o;16076:408::-;16278:2;16260:21;;;16317:2;16297:18;;;16290:30;16356:34;16351:2;16336:18;;16329:62;-1:-1:-1;;;16422:2:1;16407:18;;16400:42;16474:3;16459:19;;16250:234::o;16489:344::-;16691:2;16673:21;;;16730:2;16710:18;;;16703:30;-1:-1:-1;;;16764:2:1;16749:18;;16742:50;16824:2;16809:18;;16663:170::o;16838:353::-;17040:2;17022:21;;;17079:2;17059:18;;;17052:30;17118:31;17113:2;17098:18;;17091:59;17182:2;17167:18;;17012:179::o;17196:354::-;17398:2;17380:21;;;17437:2;17417:18;;;17410:30;17476:32;17471:2;17456:18;;17449:60;17541:2;17526:18;;17370:180::o;17555:177::-;17701:25;;;17689:2;17674:18;;17656:76::o;17737:129::-;;17805:17;;;17855:4;17839:21;;;17795:71::o;17871:128::-;;17942:1;17938:6;17935:1;17932:13;17929:2;;;17948:18;;:::i;:::-;-1:-1:-1;17984:9:1;;17919:80::o;18004:120::-;;18070:1;18060:2;;18075:18;;:::i;:::-;-1:-1:-1;18109:9:1;;18050:74::o;18129:168::-;;18235:1;18231;18227:6;18223:14;18220:1;18217:21;18212:1;18205:9;18198:17;18194:45;18191:2;;;18242:18;;:::i;:::-;-1:-1:-1;18282:9:1;;18181:116::o;18302:125::-;;18370:1;18367;18364:8;18361:2;;;18375:18;;:::i;:::-;-1:-1:-1;18412:9:1;;18351:76::o;18432:258::-;18504:1;18514:113;18528:6;18525:1;18522:13;18514:113;;;18604:11;;;18598:18;18585:11;;;18578:39;18550:2;18543:10;18514:113;;;18645:6;18642:1;18639:13;18636:2;;;-1:-1:-1;;18680:1:1;18662:16;;18655:27;18485:205::o;18695:380::-;18780:1;18770:12;;18827:1;18817:12;;;18838:2;;18892:4;18884:6;18880:17;18870:27;;18838:2;18945;18937:6;18934:14;18914:18;18911:38;18908:2;;;18991:10;18986:3;18982:20;18979:1;18972:31;19026:4;19023:1;19016:15;19054:4;19051:1;19044:15;18908:2;;18750:325;;;:::o;19080:135::-;;-1:-1:-1;;19140:17:1;;19137:2;;;19160:18;;:::i;:::-;-1:-1:-1;19207:1:1;19196:13;;19127:88::o;19220:112::-;;19278:1;19268:2;;19283:18;;:::i;:::-;-1:-1:-1;19317:9:1;;19258:74::o;19337:127::-;19398:10;19393:3;19389:20;19386:1;19379:31;19429:4;19426:1;19419:15;19453:4;19450:1;19443:15;19469:127;19530:10;19525:3;19521:20;19518:1;19511:31;19561:4;19558:1;19551:15;19585:4;19582:1;19575:15;19601:127;19662:10;19657:3;19653:20;19650:1;19643:31;19693:4;19690:1;19683:15;19717:4;19714:1;19707:15;19733:133;-1:-1:-1;;;;;;19809:32:1;;19799:43;;19789:2;;19856:1;19853;19846:12
Swarm Source
ipfs://3856ad2ad504cd86b605a5b9422a8420ee0249ecd807035ceecdf10a12abd373
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.