ERC-721
NFT
Overview
Max Total Supply
0 OL
Holders
376
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
7 OLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OctoLab
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-23 */ // SPDX-License-Identifier: MIT 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); } 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; } } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, 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; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } 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); } 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; } } 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.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 {} } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } 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); } } 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); } } pragma solidity ^0.8.10; contract OctoLab is ERC721, Ownable, ReentrancyGuard { using Strings for uint256; string public baseURI; uint256 public cost = 0.025 ether; uint256 public minted; uint256 public maxSupply = 3000; uint256 public maxMint = 7; bool public status = false; address batzAddr = 0xc8adFb4D437357D0A656D4e62fd9a6D22e401aa0; //CryptoBatz address catsAddr = 0x1A92f7381B9F03921564a437210bB9396471050C; //CoolCats mapping(address => bool) public mintlist; constructor() ERC721("OctoLab", "OL") {} //checks if address owns at least one token from either of the qualifying collections function isHolder(address _wallet) public view returns (bool) { ERC721 batzToken = ERC721(batzAddr); uint256 _batzBalance = batzToken.balanceOf(_wallet); ERC721 catsToken = ERC721(catsAddr); uint256 _catsBalance = catsToken.balanceOf(_wallet); return (_batzBalance + _catsBalance > 0); } //public mint function mint(uint256 _mintAmount) public payable nonReentrant{ require(status, "Sale inactive" ); require(msg.sender == tx.origin, "No contracts!"); require(_mintAmount <= maxMint, "Too many" ); require(minted + _mintAmount <= maxSupply, "Would excced supply" ); require(msg.value >= cost * _mintAmount, "Not enough ETH"); for (uint256 i = 0; i < _mintAmount; i++) { minted++; _safeMint(msg.sender, minted); } } //free claim for qualifying holders function claim(address _wallet) external nonReentrant { require(status, "Sale inactive" ); require(msg.sender == tx.origin, "No contracts!"); require(minted + 1 <= maxSupply, "Would excced supply" ); (bool _holder) = isHolder(_wallet); require(_holder, "Must own at least one qualifying NFT to claim!"); require(mintlist[_wallet] != true, "Already claimed!"); mintlist[_wallet] = true; minted++; _safeMint(msg.sender, minted); } //giveaways function gift(uint[] calldata quantity, address[] calldata recipient) external onlyOwner{ require(quantity.length == recipient.length, "Provide quantities and recipients" ); uint totalQuantity = 0; for(uint i = 0; i < quantity.length; i++){ totalQuantity += quantity[i]; } require( minted + totalQuantity <= maxSupply, "Too many" ); delete totalQuantity; for(uint i = 0; i < recipient.length; i++){ for(uint j = 0; j < quantity[i]; j++){ minted++; _safeMint(recipient[i], minted); } } } //metadata function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, (tokenId).toString())) : ""; } //setters function setBatzAddress(address _batzAddr) external onlyOwner { batzAddr = _batzAddr; } function setCatsAddress(address _catsAddr) external onlyOwner { catsAddr = _catsAddr; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setMaxMintAmount(uint256 _newMaxMintAmount) public onlyOwner { maxMint = _newMaxMintAmount; } function setmaxSupply(uint256 _newMaxSupply) public onlyOwner { maxSupply = _newMaxSupply; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } //admin functions function _baseURI() internal view override returns (string memory) { return baseURI; } function flipSaleStatus() public onlyOwner { status = !status; } function withdraw() public payable onlyOwner { (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success); } }
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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"quantity","type":"uint256[]"},{"internalType":"address[]","name":"recipient","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_batzAddr","type":"address"}],"name":"setBatzAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_catsAddr","type":"address"}],"name":"setCatsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526658d15e17628000600955610bb8600b556007600c55600d805474c8adfb4d437357d0a656d4e62fd9a6d22e401aa0006001600160a81b0319909116179055600e80546001600160a01b031916731a92f7381b9f03921564a437210bb9396471050c1790553480156200007657600080fd5b50604080518082018252600781526627b1ba37a630b160c91b60208083019182528351808501909452600284526113d360f21b908401528151919291620000c09160009162000154565b508051620000d690600190602084019062000154565b505050620000f3620000ed620000fe60201b60201c565b62000102565b600160075562000237565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016290620001fa565b90600052602060002090601f016020900481019282620001865760008555620001d1565b82601f10620001a157805160ff1916838001178555620001d1565b82800160010185558215620001d1579182015b82811115620001d1578251825591602001919060010190620001b4565b50620001df929150620001e3565b5090565b5b80821115620001df5760008155600101620001e4565b600181811c908216806200020f57607f821691505b602082108114156200023157634e487b7160e01b600052602260045260246000fd5b50919050565b6124ce80620002476000396000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063a0712d68116100a0578063ce03ec931161006f578063ce03ec93146105ac578063d4d7b19a146105c1578063d5abeb01146105e1578063e985e9c5146105f7578063f2fde38b1461064057600080fd5b8063a0712d6814610539578063a22cb4651461054c578063b88d4fde1461056c578063c87b56dd1461058c57600080fd5b8063715018a6116100e7578063715018a6146104bb5780637501f741146104d05780638da5cb5b146104e657806395d89b411461050457806396ea3a471461051957600080fd5b80636352211e146104365780636c0360eb146104565780636fc6cbc51461046b57806370a082311461049b57600080fd5b8063228025e81161019b57806344a0d68a1161016a57806344a0d68a146103a057806348cd21ff146103c05780634f02c420146103e057806355f804b3146103f65780636310ab111461041657600080fd5b8063228025e81461033857806323b872dd146103585780633ccfd60b1461037857806342842e0e1461038057600080fd5b8063095ea7b3116101d7578063095ea7b3146102ba57806313faede6146102da5780631e83409a146102fe578063200d2ed21461031e57600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063088a4ed014610298575b600080fd5b34801561021557600080fd5b50610229610224366004611e5a565b610660565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b506102536106b2565b6040516102359190611ecf565b34801561026c57600080fd5b5061028061027b366004611ee2565b610744565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b3366004611ee2565b6107de565b005b3480156102c657600080fd5b506102b86102d5366004611f17565b61080d565b3480156102e657600080fd5b506102f060095481565b604051908152602001610235565b34801561030a57600080fd5b506102b8610319366004611f41565b610923565b34801561032a57600080fd5b50600d546102299060ff1681565b34801561034457600080fd5b506102b8610353366004611ee2565b610b6e565b34801561036457600080fd5b506102b8610373366004611f5c565b610b9d565b6102b8610bce565b34801561038c57600080fd5b506102b861039b366004611f5c565b610c50565b3480156103ac57600080fd5b506102b86103bb366004611ee2565b610c6b565b3480156103cc57600080fd5b506102b86103db366004611f41565b610c9a565b3480156103ec57600080fd5b506102f0600a5481565b34801561040257600080fd5b506102b8610411366004612024565b610cec565b34801561042257600080fd5b506102b8610431366004611f41565b610d2d565b34801561044257600080fd5b50610280610451366004611ee2565b610d79565b34801561046257600080fd5b50610253610df0565b34801561047757600080fd5b50610229610486366004611f41565b600f6020526000908152604090205460ff1681565b3480156104a757600080fd5b506102f06104b6366004611f41565b610e7e565b3480156104c757600080fd5b506102b8610f05565b3480156104dc57600080fd5b506102f0600c5481565b3480156104f257600080fd5b506006546001600160a01b0316610280565b34801561051057600080fd5b50610253610f3b565b34801561052557600080fd5b506102b86105343660046120b9565b610f4a565b6102b8610547366004611ee2565b611100565b34801561055857600080fd5b506102b8610567366004612125565b6112f7565b34801561057857600080fd5b506102b8610587366004612161565b6113bc565b34801561059857600080fd5b506102536105a7366004611ee2565b6113f4565b3480156105b857600080fd5b506102b86114ab565b3480156105cd57600080fd5b506102296105dc366004611f41565b6114e9565b3480156105ed57600080fd5b506102f0600b5481565b34801561060357600080fd5b506102296106123660046121dd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561064c57600080fd5b506102b861065b366004611f41565b6115ef565b60006001600160e01b031982166380ac58cd60e01b148061069157506001600160e01b03198216635b5e139f60e01b145b806106ac57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546106c190612210565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612210565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107c25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b031633146108085760405162461bcd60e51b81526004016107b99061224b565b600c55565b600061081882610d79565b9050806001600160a01b0316836001600160a01b031614156108865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b9565b336001600160a01b03821614806108a257506108a28133610612565b6109145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b9565b61091e8383611687565b505050565b600260075414156109765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b9565b6002600755600d5460ff166109bd5760405162461bcd60e51b815260206004820152600d60248201526c53616c6520696e61637469766560981b60448201526064016107b9565b3332146109fc5760405162461bcd60e51b815260206004820152600d60248201526c4e6f20636f6e7472616374732160981b60448201526064016107b9565b600b54600a54610a0d906001612296565b1115610a515760405162461bcd60e51b8152602060048201526013602482015272576f756c642065786363656420737570706c7960681b60448201526064016107b9565b6000610a5c826114e9565b905080610ac25760405162461bcd60e51b815260206004820152602e60248201527f4d757374206f776e206174206c65617374206f6e65207175616c696679696e6760448201526d204e465420746f20636c61696d2160901b60648201526084016107b9565b6001600160a01b0382166000908152600f602052604090205460ff16151560011415610b235760405162461bcd60e51b815260206004820152601060248201526f416c726561647920636c61696d65642160801b60448201526064016107b9565b6001600160a01b0382166000908152600f60205260408120805460ff19166001179055600a805491610b54836122ae565b9190505550610b6533600a546116f5565b50506001600755565b6006546001600160a01b03163314610b985760405162461bcd60e51b81526004016107b99061224b565b600b55565b610ba7338261170f565b610bc35760405162461bcd60e51b81526004016107b9906122c9565b61091e838383611806565b6006546001600160a01b03163314610bf85760405162461bcd60e51b81526004016107b99061224b565b604051600090339047908381818185875af1925050503d8060008114610c3a576040519150601f19603f3d011682016040523d82523d6000602084013e610c3f565b606091505b5050905080610c4d57600080fd5b50565b61091e838383604051806020016040528060008152506113bc565b6006546001600160a01b03163314610c955760405162461bcd60e51b81526004016107b99061224b565b600955565b6006546001600160a01b03163314610cc45760405162461bcd60e51b81526004016107b99061224b565b600d80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546001600160a01b03163314610d165760405162461bcd60e51b81526004016107b99061224b565b8051610d29906008906020840190611dab565b5050565b6006546001600160a01b03163314610d575760405162461bcd60e51b81526004016107b99061224b565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806106ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b9565b60088054610dfd90612210565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2990612210565b8015610e765780601f10610e4b57610100808354040283529160200191610e76565b820191906000526020600020905b815481529060010190602001808311610e5957829003601f168201915b505050505081565b60006001600160a01b038216610ee95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f2f5760405162461bcd60e51b81526004016107b99061224b565b610f3960006119a6565b565b6060600180546106c190612210565b6006546001600160a01b03163314610f745760405162461bcd60e51b81526004016107b99061224b565b828114610fcd5760405162461bcd60e51b815260206004820152602160248201527f50726f76696465207175616e74697469657320616e6420726563697069656e746044820152607360f81b60648201526084016107b9565b6000805b8481101561101157858582818110610feb57610feb61231a565b9050602002013582610ffd9190612296565b915080611009816122ae565b915050610fd1565b50600b5481600a546110239190612296565b111561105c5760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b60448201526064016107b9565b506000805b828110156110f85760005b86868381811061107e5761107e61231a565b905060200201358110156110e557600a805490600061109c836122ae565b91905055506110d38585848181106110b6576110b661231a565b90506020020160208101906110cb9190611f41565b600a546116f5565b806110dd816122ae565b91505061106c565b50806110f0816122ae565b915050611061565b505050505050565b600260075414156111535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b9565b6002600755600d5460ff1661119a5760405162461bcd60e51b815260206004820152600d60248201526c53616c6520696e61637469766560981b60448201526064016107b9565b3332146111d95760405162461bcd60e51b815260206004820152600d60248201526c4e6f20636f6e7472616374732160981b60448201526064016107b9565b600c548111156112165760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b60448201526064016107b9565b600b5481600a546112279190612296565b111561126b5760405162461bcd60e51b8152602060048201526013602482015272576f756c642065786363656420737570706c7960681b60448201526064016107b9565b806009546112799190612330565b3410156112b95760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b60448201526064016107b9565b60005b81811015610b6557600a80549060006112d4836122ae565b91905055506112e533600a546116f5565b806112ef816122ae565b9150506112bc565b6001600160a01b0382163314156113505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113c6338361170f565b6113e25760405162461bcd60e51b81526004016107b9906122c9565b6113ee848484846119f8565b50505050565b6000818152600260205260409020546060906001600160a01b031661144f5760405162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016107b9565b6000611459611a2b565b9050600081511161147957604051806020016040528060008152506114a4565b8061148384611a3a565b60405160200161149492919061234f565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146114d55760405162461bcd60e51b81526004016107b99061224b565b600d805460ff19811660ff90911615179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009261010090041690829082906370a0823190602401602060405180830381865afa15801561153d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611561919061237e565b600e546040516370a0823160e01b81526001600160a01b03878116600483015292935091169060009082906370a0823190602401602060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d6919061237e565b905060006115e48285612296565b119695505050505050565b6006546001600160a01b031633146116195760405162461bcd60e51b81526004016107b99061224b565b6001600160a01b03811661167e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b9565b610c4d816119a6565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116bc82610d79565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d29828260405180602001604052806000815250611b38565b6000818152600260205260408120546001600160a01b03166117885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b9565b600061179383610d79565b9050806001600160a01b0316846001600160a01b031614806117ce5750836001600160a01b03166117c384610744565b6001600160a01b0316145b806117fe57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661181982610d79565b6001600160a01b0316146118815760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b9565b6001600160a01b0382166118e35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b9565b6118ee600082611687565b6001600160a01b0383166000908152600360205260408120805460019290611917908490612397565b90915550506001600160a01b0382166000908152600360205260408120805460019290611945908490612296565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a03848484611806565b611a0f84848484611b6b565b6113ee5760405162461bcd60e51b81526004016107b9906123ae565b6060600880546106c190612210565b606081611a5e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a885780611a72816122ae565b9150611a819050600a83612416565b9150611a62565b60008167ffffffffffffffff811115611aa357611aa3611f98565b6040519080825280601f01601f191660200182016040528015611acd576020820181803683370190505b5090505b84156117fe57611ae2600183612397565b9150611aef600a8661242a565b611afa906030612296565b60f81b818381518110611b0f57611b0f61231a565b60200101906001600160f81b031916908160001a905350611b31600a86612416565b9450611ad1565b611b428383611c69565b611b4f6000848484611b6b565b61091e5760405162461bcd60e51b81526004016107b9906123ae565b60006001600160a01b0384163b15611c5e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611baf90339089908890889060040161243e565b6020604051808303816000875af1925050508015611bea575060408051601f3d908101601f19168201909252611be79181019061247b565b60015b611c44573d808015611c18576040519150601f19603f3d011682016040523d82523d6000602084013e611c1d565b606091505b508051611c3c5760405162461bcd60e51b81526004016107b9906123ae565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117fe565b506001949350505050565b6001600160a01b038216611cbf5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b9565b6000818152600260205260409020546001600160a01b031615611d245760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b9565b6001600160a01b0382166000908152600360205260408120805460019290611d4d908490612296565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611db790612210565b90600052602060002090601f016020900481019282611dd95760008555611e1f565b82601f10611df257805160ff1916838001178555611e1f565b82800160010185558215611e1f579182015b82811115611e1f578251825591602001919060010190611e04565b50611e2b929150611e2f565b5090565b5b80821115611e2b5760008155600101611e30565b6001600160e01b031981168114610c4d57600080fd5b600060208284031215611e6c57600080fd5b81356114a481611e44565b60005b83811015611e92578181015183820152602001611e7a565b838111156113ee5750506000910152565b60008151808452611ebb816020860160208601611e77565b601f01601f19169290920160200192915050565b6020815260006114a46020830184611ea3565b600060208284031215611ef457600080fd5b5035919050565b80356001600160a01b0381168114611f1257600080fd5b919050565b60008060408385031215611f2a57600080fd5b611f3383611efb565b946020939093013593505050565b600060208284031215611f5357600080fd5b6114a482611efb565b600080600060608486031215611f7157600080fd5b611f7a84611efb565b9250611f8860208501611efb565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611fc957611fc9611f98565b604051601f8501601f19908116603f01168101908282118183101715611ff157611ff1611f98565b8160405280935085815286868601111561200a57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561203657600080fd5b813567ffffffffffffffff81111561204d57600080fd5b8201601f8101841361205e57600080fd5b6117fe84823560208401611fae565b60008083601f84011261207f57600080fd5b50813567ffffffffffffffff81111561209757600080fd5b6020830191508360208260051b85010111156120b257600080fd5b9250929050565b600080600080604085870312156120cf57600080fd5b843567ffffffffffffffff808211156120e757600080fd5b6120f38883890161206d565b9096509450602087013591508082111561210c57600080fd5b506121198782880161206d565b95989497509550505050565b6000806040838503121561213857600080fd5b61214183611efb565b91506020830135801515811461215657600080fd5b809150509250929050565b6000806000806080858703121561217757600080fd5b61218085611efb565b935061218e60208601611efb565b925060408501359150606085013567ffffffffffffffff8111156121b157600080fd5b8501601f810187136121c257600080fd5b6121d187823560208401611fae565b91505092959194509250565b600080604083850312156121f057600080fd5b6121f983611efb565b915061220760208401611efb565b90509250929050565b600181811c9082168061222457607f821691505b6020821081141561224557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156122a9576122a9612280565b500190565b60006000198214156122c2576122c2612280565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561234a5761234a612280565b500290565b60008351612361818460208801611e77565b835190830190612375818360208801611e77565b01949350505050565b60006020828403121561239057600080fd5b5051919050565b6000828210156123a9576123a9612280565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261242557612425612400565b500490565b60008261243957612439612400565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061247190830184611ea3565b9695505050505050565b60006020828403121561248d57600080fd5b81516114a481611e4456fea2646970667358221220a5a300030aa9658b971a8eb843371322237661a7d68f3f1417f2ea3f4761e4f664736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106102045760003560e01c80636352211e11610118578063a0712d68116100a0578063ce03ec931161006f578063ce03ec93146105ac578063d4d7b19a146105c1578063d5abeb01146105e1578063e985e9c5146105f7578063f2fde38b1461064057600080fd5b8063a0712d6814610539578063a22cb4651461054c578063b88d4fde1461056c578063c87b56dd1461058c57600080fd5b8063715018a6116100e7578063715018a6146104bb5780637501f741146104d05780638da5cb5b146104e657806395d89b411461050457806396ea3a471461051957600080fd5b80636352211e146104365780636c0360eb146104565780636fc6cbc51461046b57806370a082311461049b57600080fd5b8063228025e81161019b57806344a0d68a1161016a57806344a0d68a146103a057806348cd21ff146103c05780634f02c420146103e057806355f804b3146103f65780636310ab111461041657600080fd5b8063228025e81461033857806323b872dd146103585780633ccfd60b1461037857806342842e0e1461038057600080fd5b8063095ea7b3116101d7578063095ea7b3146102ba57806313faede6146102da5780631e83409a146102fe578063200d2ed21461031e57600080fd5b806301ffc9a71461020957806306fdde031461023e578063081812fc14610260578063088a4ed014610298575b600080fd5b34801561021557600080fd5b50610229610224366004611e5a565b610660565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b506102536106b2565b6040516102359190611ecf565b34801561026c57600080fd5b5061028061027b366004611ee2565b610744565b6040516001600160a01b039091168152602001610235565b3480156102a457600080fd5b506102b86102b3366004611ee2565b6107de565b005b3480156102c657600080fd5b506102b86102d5366004611f17565b61080d565b3480156102e657600080fd5b506102f060095481565b604051908152602001610235565b34801561030a57600080fd5b506102b8610319366004611f41565b610923565b34801561032a57600080fd5b50600d546102299060ff1681565b34801561034457600080fd5b506102b8610353366004611ee2565b610b6e565b34801561036457600080fd5b506102b8610373366004611f5c565b610b9d565b6102b8610bce565b34801561038c57600080fd5b506102b861039b366004611f5c565b610c50565b3480156103ac57600080fd5b506102b86103bb366004611ee2565b610c6b565b3480156103cc57600080fd5b506102b86103db366004611f41565b610c9a565b3480156103ec57600080fd5b506102f0600a5481565b34801561040257600080fd5b506102b8610411366004612024565b610cec565b34801561042257600080fd5b506102b8610431366004611f41565b610d2d565b34801561044257600080fd5b50610280610451366004611ee2565b610d79565b34801561046257600080fd5b50610253610df0565b34801561047757600080fd5b50610229610486366004611f41565b600f6020526000908152604090205460ff1681565b3480156104a757600080fd5b506102f06104b6366004611f41565b610e7e565b3480156104c757600080fd5b506102b8610f05565b3480156104dc57600080fd5b506102f0600c5481565b3480156104f257600080fd5b506006546001600160a01b0316610280565b34801561051057600080fd5b50610253610f3b565b34801561052557600080fd5b506102b86105343660046120b9565b610f4a565b6102b8610547366004611ee2565b611100565b34801561055857600080fd5b506102b8610567366004612125565b6112f7565b34801561057857600080fd5b506102b8610587366004612161565b6113bc565b34801561059857600080fd5b506102536105a7366004611ee2565b6113f4565b3480156105b857600080fd5b506102b86114ab565b3480156105cd57600080fd5b506102296105dc366004611f41565b6114e9565b3480156105ed57600080fd5b506102f0600b5481565b34801561060357600080fd5b506102296106123660046121dd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561064c57600080fd5b506102b861065b366004611f41565b6115ef565b60006001600160e01b031982166380ac58cd60e01b148061069157506001600160e01b03198216635b5e139f60e01b145b806106ac57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546106c190612210565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed90612210565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107c25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6006546001600160a01b031633146108085760405162461bcd60e51b81526004016107b99061224b565b600c55565b600061081882610d79565b9050806001600160a01b0316836001600160a01b031614156108865760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b9565b336001600160a01b03821614806108a257506108a28133610612565b6109145760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b9565b61091e8383611687565b505050565b600260075414156109765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b9565b6002600755600d5460ff166109bd5760405162461bcd60e51b815260206004820152600d60248201526c53616c6520696e61637469766560981b60448201526064016107b9565b3332146109fc5760405162461bcd60e51b815260206004820152600d60248201526c4e6f20636f6e7472616374732160981b60448201526064016107b9565b600b54600a54610a0d906001612296565b1115610a515760405162461bcd60e51b8152602060048201526013602482015272576f756c642065786363656420737570706c7960681b60448201526064016107b9565b6000610a5c826114e9565b905080610ac25760405162461bcd60e51b815260206004820152602e60248201527f4d757374206f776e206174206c65617374206f6e65207175616c696679696e6760448201526d204e465420746f20636c61696d2160901b60648201526084016107b9565b6001600160a01b0382166000908152600f602052604090205460ff16151560011415610b235760405162461bcd60e51b815260206004820152601060248201526f416c726561647920636c61696d65642160801b60448201526064016107b9565b6001600160a01b0382166000908152600f60205260408120805460ff19166001179055600a805491610b54836122ae565b9190505550610b6533600a546116f5565b50506001600755565b6006546001600160a01b03163314610b985760405162461bcd60e51b81526004016107b99061224b565b600b55565b610ba7338261170f565b610bc35760405162461bcd60e51b81526004016107b9906122c9565b61091e838383611806565b6006546001600160a01b03163314610bf85760405162461bcd60e51b81526004016107b99061224b565b604051600090339047908381818185875af1925050503d8060008114610c3a576040519150601f19603f3d011682016040523d82523d6000602084013e610c3f565b606091505b5050905080610c4d57600080fd5b50565b61091e838383604051806020016040528060008152506113bc565b6006546001600160a01b03163314610c955760405162461bcd60e51b81526004016107b99061224b565b600955565b6006546001600160a01b03163314610cc45760405162461bcd60e51b81526004016107b99061224b565b600d80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546001600160a01b03163314610d165760405162461bcd60e51b81526004016107b99061224b565b8051610d29906008906020840190611dab565b5050565b6006546001600160a01b03163314610d575760405162461bcd60e51b81526004016107b99061224b565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b0316806106ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b9565b60088054610dfd90612210565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2990612210565b8015610e765780601f10610e4b57610100808354040283529160200191610e76565b820191906000526020600020905b815481529060010190602001808311610e5957829003601f168201915b505050505081565b60006001600160a01b038216610ee95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610f2f5760405162461bcd60e51b81526004016107b99061224b565b610f3960006119a6565b565b6060600180546106c190612210565b6006546001600160a01b03163314610f745760405162461bcd60e51b81526004016107b99061224b565b828114610fcd5760405162461bcd60e51b815260206004820152602160248201527f50726f76696465207175616e74697469657320616e6420726563697069656e746044820152607360f81b60648201526084016107b9565b6000805b8481101561101157858582818110610feb57610feb61231a565b9050602002013582610ffd9190612296565b915080611009816122ae565b915050610fd1565b50600b5481600a546110239190612296565b111561105c5760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b60448201526064016107b9565b506000805b828110156110f85760005b86868381811061107e5761107e61231a565b905060200201358110156110e557600a805490600061109c836122ae565b91905055506110d38585848181106110b6576110b661231a565b90506020020160208101906110cb9190611f41565b600a546116f5565b806110dd816122ae565b91505061106c565b50806110f0816122ae565b915050611061565b505050505050565b600260075414156111535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107b9565b6002600755600d5460ff1661119a5760405162461bcd60e51b815260206004820152600d60248201526c53616c6520696e61637469766560981b60448201526064016107b9565b3332146111d95760405162461bcd60e51b815260206004820152600d60248201526c4e6f20636f6e7472616374732160981b60448201526064016107b9565b600c548111156112165760405162461bcd60e51b8152602060048201526008602482015267546f6f206d616e7960c01b60448201526064016107b9565b600b5481600a546112279190612296565b111561126b5760405162461bcd60e51b8152602060048201526013602482015272576f756c642065786363656420737570706c7960681b60448201526064016107b9565b806009546112799190612330565b3410156112b95760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b60448201526064016107b9565b60005b81811015610b6557600a80549060006112d4836122ae565b91905055506112e533600a546116f5565b806112ef816122ae565b9150506112bc565b6001600160a01b0382163314156113505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b9565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6113c6338361170f565b6113e25760405162461bcd60e51b81526004016107b9906122c9565b6113ee848484846119f8565b50505050565b6000818152600260205260409020546060906001600160a01b031661144f5760405162461bcd60e51b81526020600482015260116024820152702737b732bc34b9ba32b73a103a37b5b2b760791b60448201526064016107b9565b6000611459611a2b565b9050600081511161147957604051806020016040528060008152506114a4565b8061148384611a3a565b60405160200161149492919061234f565b6040516020818303038152906040525b9392505050565b6006546001600160a01b031633146114d55760405162461bcd60e51b81526004016107b99061224b565b600d805460ff19811660ff90911615179055565b600d546040516370a0823160e01b81526001600160a01b03838116600483015260009261010090041690829082906370a0823190602401602060405180830381865afa15801561153d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611561919061237e565b600e546040516370a0823160e01b81526001600160a01b03878116600483015292935091169060009082906370a0823190602401602060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d6919061237e565b905060006115e48285612296565b119695505050505050565b6006546001600160a01b031633146116195760405162461bcd60e51b81526004016107b99061224b565b6001600160a01b03811661167e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b9565b610c4d816119a6565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116bc82610d79565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610d29828260405180602001604052806000815250611b38565b6000818152600260205260408120546001600160a01b03166117885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b9565b600061179383610d79565b9050806001600160a01b0316846001600160a01b031614806117ce5750836001600160a01b03166117c384610744565b6001600160a01b0316145b806117fe57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661181982610d79565b6001600160a01b0316146118815760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b9565b6001600160a01b0382166118e35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b9565b6118ee600082611687565b6001600160a01b0383166000908152600360205260408120805460019290611917908490612397565b90915550506001600160a01b0382166000908152600360205260408120805460019290611945908490612296565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a03848484611806565b611a0f84848484611b6b565b6113ee5760405162461bcd60e51b81526004016107b9906123ae565b6060600880546106c190612210565b606081611a5e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a885780611a72816122ae565b9150611a819050600a83612416565b9150611a62565b60008167ffffffffffffffff811115611aa357611aa3611f98565b6040519080825280601f01601f191660200182016040528015611acd576020820181803683370190505b5090505b84156117fe57611ae2600183612397565b9150611aef600a8661242a565b611afa906030612296565b60f81b818381518110611b0f57611b0f61231a565b60200101906001600160f81b031916908160001a905350611b31600a86612416565b9450611ad1565b611b428383611c69565b611b4f6000848484611b6b565b61091e5760405162461bcd60e51b81526004016107b9906123ae565b60006001600160a01b0384163b15611c5e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611baf90339089908890889060040161243e565b6020604051808303816000875af1925050508015611bea575060408051601f3d908101601f19168201909252611be79181019061247b565b60015b611c44573d808015611c18576040519150601f19603f3d011682016040523d82523d6000602084013e611c1d565b606091505b508051611c3c5760405162461bcd60e51b81526004016107b9906123ae565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117fe565b506001949350505050565b6001600160a01b038216611cbf5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b9565b6000818152600260205260409020546001600160a01b031615611d245760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b9565b6001600160a01b0382166000908152600360205260408120805460019290611d4d908490612296565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611db790612210565b90600052602060002090601f016020900481019282611dd95760008555611e1f565b82601f10611df257805160ff1916838001178555611e1f565b82800160010185558215611e1f579182015b82811115611e1f578251825591602001919060010190611e04565b50611e2b929150611e2f565b5090565b5b80821115611e2b5760008155600101611e30565b6001600160e01b031981168114610c4d57600080fd5b600060208284031215611e6c57600080fd5b81356114a481611e44565b60005b83811015611e92578181015183820152602001611e7a565b838111156113ee5750506000910152565b60008151808452611ebb816020860160208601611e77565b601f01601f19169290920160200192915050565b6020815260006114a46020830184611ea3565b600060208284031215611ef457600080fd5b5035919050565b80356001600160a01b0381168114611f1257600080fd5b919050565b60008060408385031215611f2a57600080fd5b611f3383611efb565b946020939093013593505050565b600060208284031215611f5357600080fd5b6114a482611efb565b600080600060608486031215611f7157600080fd5b611f7a84611efb565b9250611f8860208501611efb565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611fc957611fc9611f98565b604051601f8501601f19908116603f01168101908282118183101715611ff157611ff1611f98565b8160405280935085815286868601111561200a57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561203657600080fd5b813567ffffffffffffffff81111561204d57600080fd5b8201601f8101841361205e57600080fd5b6117fe84823560208401611fae565b60008083601f84011261207f57600080fd5b50813567ffffffffffffffff81111561209757600080fd5b6020830191508360208260051b85010111156120b257600080fd5b9250929050565b600080600080604085870312156120cf57600080fd5b843567ffffffffffffffff808211156120e757600080fd5b6120f38883890161206d565b9096509450602087013591508082111561210c57600080fd5b506121198782880161206d565b95989497509550505050565b6000806040838503121561213857600080fd5b61214183611efb565b91506020830135801515811461215657600080fd5b809150509250929050565b6000806000806080858703121561217757600080fd5b61218085611efb565b935061218e60208601611efb565b925060408501359150606085013567ffffffffffffffff8111156121b157600080fd5b8501601f810187136121c257600080fd5b6121d187823560208401611fae565b91505092959194509250565b600080604083850312156121f057600080fd5b6121f983611efb565b915061220760208401611efb565b90509250929050565b600181811c9082168061222457607f821691505b6020821081141561224557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156122a9576122a9612280565b500190565b60006000198214156122c2576122c2612280565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600081600019048311821515161561234a5761234a612280565b500290565b60008351612361818460208801611e77565b835190830190612375818360208801611e77565b01949350505050565b60006020828403121561239057600080fd5b5051919050565b6000828210156123a9576123a9612280565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261242557612425612400565b500490565b60008261243957612439612400565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061247190830184611ea3565b9695505050505050565b60006020828403121561248d57600080fd5b81516114a481611e4456fea2646970667358221220a5a300030aa9658b971a8eb843371322237661a7d68f3f1417f2ea3f4761e4f664736f6c634300080b0033
Deployed Bytecode Sourcemap
37999:3936:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10939:305;;;;;;;;;;-1:-1:-1;10939:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;10939:305:0;;;;;;;;11884:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13443:221::-;;;;;;;;;;-1:-1:-1;13443:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;13443:221:0;1528:203:1;41246:110:0;;;;;;;;;;-1:-1:-1;41246:110:0;;;;;:::i;:::-;;:::i;:::-;;12966:411;;;;;;;;;;-1:-1:-1;12966:411:0;;;;;:::i;:::-;;:::i;38112:33::-;;;;;;;;;;;;;;;;;;;2319:25:1;;;2307:2;2292:18;38112:33:0;2173:177:1;39512:509:0;;;;;;;;;;-1:-1:-1;39512:509:0;;;;;:::i;:::-;;:::i;38242:26::-;;;;;;;;;;-1:-1:-1;38242:26:0;;;;;;;;41359:100;;;;;;;;;;-1:-1:-1;41359:100:0;;;;;:::i;:::-;;:::i;14333:339::-;;;;;;;;;;-1:-1:-1;14333:339:0;;;;;:::i;:::-;;:::i;41779:151::-;;;:::i;14743:185::-;;;;;;;;;;-1:-1:-1;14743:185:0;;;;;:::i;:::-;;:::i;41163:80::-;;;;;;;;;;-1:-1:-1;41163:80:0;;;;;:::i;:::-;;:::i;40948:101::-;;;;;;;;;;-1:-1:-1;40948:101:0;;;;;:::i;:::-;;:::i;38152:21::-;;;;;;;;;;;;;;;;41462:101;;;;;;;;;;-1:-1:-1;41462:101:0;;;;;:::i;:::-;;:::i;41057:::-;;;;;;;;;;-1:-1:-1;41057:101:0;;;;;:::i;:::-;;:::i;11578:239::-;;;;;;;;;;-1:-1:-1;11578:239:0;;;;;:::i;:::-;;:::i;38087:21::-;;;;;;;;;;;;;:::i;38444:40::-;;;;;;;;;;-1:-1:-1;38444:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11308:208;;;;;;;;;;-1:-1:-1;11308:208:0;;;;;:::i;:::-;;:::i;37340:94::-;;;;;;;;;;;;;:::i;38212:26::-;;;;;;;;;;;;;;;;36689:87;;;;;;;;;;-1:-1:-1;36762:6:0;;-1:-1:-1;;;;;36762:6:0;36689:87;;12053:104;;;;;;;;;;;;;:::i;40045:541::-;;;;;;;;;;-1:-1:-1;40045:541:0;;;;;:::i;:::-;;:::i;39000:461::-;;;;;;:::i;:::-;;:::i;13736:295::-;;;;;;;;;;-1:-1:-1;13736:295:0;;;;;:::i;:::-;;:::i;14999:328::-;;;;;;;;;;-1:-1:-1;14999:328:0;;;;;:::i;:::-;;:::i;40610:313::-;;;;;;;;;;-1:-1:-1;40610:313:0;;;;;:::i;:::-;;:::i;41702:72::-;;;;;;;;;;;;;:::i;38631:343::-;;;;;;;;;;-1:-1:-1;38631:343:0;;;;;:::i;:::-;;:::i;38177:31::-;;;;;;;;;;;;;;;;14102:164;;;;;;;;;;-1:-1:-1;14102:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;14223:25:0;;;14199:4;14223:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;14102:164;37589:192;;;;;;;;;;-1:-1:-1;37589:192:0;;;;;:::i;:::-;;:::i;10939:305::-;11041:4;-1:-1:-1;;;;;;11078:40:0;;-1:-1:-1;;;11078:40:0;;:105;;-1:-1:-1;;;;;;;11135:48:0;;-1:-1:-1;;;11135:48:0;11078:105;:158;;;-1:-1:-1;;;;;;;;;;1654:40:0;;;11200:36;11058:178;10939:305;-1:-1:-1;;10939:305:0:o;11884:100::-;11938:13;11971:5;11964:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11884:100;:::o;13443:221::-;13519:7;16926:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16926:16:0;13539:73;;;;-1:-1:-1;;;13539:73:0;;7130:2:1;13539:73:0;;;7112:21:1;7169:2;7149:18;;;7142:30;7208:34;7188:18;;;7181:62;-1:-1:-1;;;7259:18:1;;;7252:42;7311:19;;13539:73:0;;;;;;;;;-1:-1:-1;13632:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;13632:24:0;;13443:221::o;41246:110::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41324:7:::1;:27:::0;41246:110::o;12966:411::-;13047:13;13063:23;13078:7;13063:14;:23::i;:::-;13047:39;;13111:5;-1:-1:-1;;;;;13105:11:0;:2;-1:-1:-1;;;;;13105:11:0;;;13097:57;;;;-1:-1:-1;;;13097:57:0;;7904:2:1;13097:57:0;;;7886:21:1;7943:2;7923:18;;;7916:30;7982:34;7962:18;;;7955:62;-1:-1:-1;;;8033:18:1;;;8026:31;8074:19;;13097:57:0;7702:397:1;13097:57:0;9549:10;-1:-1:-1;;;;;13189:21:0;;;;:62;;-1:-1:-1;13214:37:0;13231:5;9549:10;14102:164;:::i;13214:37::-;13167:168;;;;-1:-1:-1;;;13167:168:0;;8306:2:1;13167:168:0;;;8288:21:1;8345:2;8325:18;;;8318:30;8384:34;8364:18;;;8357:62;8455:26;8435:18;;;8428:54;8499:19;;13167:168:0;8104:420:1;13167:168:0;13348:21;13357:2;13361:7;13348:8;:21::i;:::-;13036:341;12966:411;;:::o;39512:509::-;32787:1;33383:7;;:19;;33375:63;;;;-1:-1:-1;;;33375:63:0;;8731:2:1;33375:63:0;;;8713:21:1;8770:2;8750:18;;;8743:30;8809:33;8789:18;;;8782:61;8860:18;;33375:63:0;8529:355:1;33375:63:0;32787:1;33516:7;:18;39585:6:::1;::::0;::::1;;39577:33;;;::::0;-1:-1:-1;;;39577:33:0;;9091:2:1;39577:33:0::1;::::0;::::1;9073:21:1::0;9130:2;9110:18;;;9103:30;-1:-1:-1;;;9149:18:1;;;9142:43;9202:18;;39577:33:0::1;8889:337:1::0;39577:33:0::1;39629:10;39643:9;39629:23;39621:49;;;::::0;-1:-1:-1;;;39621:49:0;;9433:2:1;39621:49:0::1;::::0;::::1;9415:21:1::0;9472:2;9452:18;;;9445:30;-1:-1:-1;;;9491:18:1;;;9484:43;9544:18;;39621:49:0::1;9231:337:1::0;39621:49:0::1;39697:9;::::0;39683:6:::1;::::0;:10:::1;::::0;39692:1:::1;39683:10;:::i;:::-;:23;;39675:56;;;::::0;-1:-1:-1;;;39675:56:0;;10040:2:1;39675:56:0::1;::::0;::::1;10022:21:1::0;10079:2;10059:18;;;10052:30;-1:-1:-1;;;10098:18:1;;;10091:49;10157:18;;39675:56:0::1;9838:343:1::0;39675:56:0::1;39743:12;39759:17;39768:7;39759:8;:17::i;:::-;39742:34;;39795:7;39787:66;;;::::0;-1:-1:-1;;;39787:66:0;;10388:2:1;39787:66:0::1;::::0;::::1;10370:21:1::0;10427:2;10407:18;;;10400:30;10466:34;10446:18;;;10439:62;-1:-1:-1;;;10517:18:1;;;10510:44;10571:19;;39787:66:0::1;10186:410:1::0;39787:66:0::1;-1:-1:-1::0;;;;;39872:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;::::1;;:25;;:17:::0;:25:::1;;39864:54;;;::::0;-1:-1:-1;;;39864:54:0;;10803:2:1;39864:54:0::1;::::0;::::1;10785:21:1::0;10842:2;10822:18;;;10815:30;-1:-1:-1;;;10861:18:1;;;10854:46;10917:18;;39864:54:0::1;10601:340:1::0;39864:54:0::1;-1:-1:-1::0;;;;;39929:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:24;;-1:-1:-1;;39929:24:0::1;39949:4;39929:24;::::0;;39964:6:::1;:8:::0;;;::::1;::::0;::::1;:::i;:::-;;;;;;39983:29;39993:10;40005:6;;39983:9;:29::i;:::-;-1:-1:-1::0;;32743:1:0;33695:7;:22;39512:509::o;41359:100::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41429:9:::1;:25:::0;41359:100::o;14333:339::-;14528:41;9549:10;14561:7;14528:18;:41::i;:::-;14520:103;;;;-1:-1:-1;;;14520:103:0;;;;;;;:::i;:::-;14636:28;14646:4;14652:2;14656:7;14636:9;:28::i;41779:151::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41847:58:::1;::::0;41829:12:::1;::::0;41855:10:::1;::::0;41879:21:::1;::::0;41829:12;41847:58;41829:12;41847:58;41879:21;41855:10;41847:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41828:77;;;41917:7;41909:16;;;::::0;::::1;;41824:106;41779:151::o:0;14743:185::-;14881:39;14898:4;14904:2;14908:7;14881:39;;;;;;;;;;;;:16;:39::i;41163:80::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41223:4:::1;:15:::0;41163:80::o;40948:101::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41021:8:::1;:20:::0;;-1:-1:-1;;;;;41021:20:0;;::::1;;;-1:-1:-1::0;;;;;;41021:20:0;;::::1;::::0;;;::::1;::::0;;40948:101::o;41462:::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41534:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41462:101:::0;:::o;41057:::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41130:8:::1;:20:::0;;-1:-1:-1;;;;;;41130:20:0::1;-1:-1:-1::0;;;;;41130:20:0;;;::::1;::::0;;;::::1;::::0;;41057:101::o;11578:239::-;11650:7;11686:16;;;:7;:16;;;;;;-1:-1:-1;;;;;11686:16:0;11721:19;11713:73;;;;-1:-1:-1;;;11713:73:0;;11916:2:1;11713:73:0;;;11898:21:1;11955:2;11935:18;;;11928:30;11994:34;11974:18;;;11967:62;-1:-1:-1;;;12045:18:1;;;12038:39;12094:19;;11713:73:0;11714:405:1;38087:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11308:208::-;11380:7;-1:-1:-1;;;;;11408:19:0;;11400:74;;;;-1:-1:-1;;;11400:74:0;;12326:2:1;11400:74:0;;;12308:21:1;12365:2;12345:18;;;12338:30;12404:34;12384:18;;;12377:62;-1:-1:-1;;;12455:18:1;;;12448:40;12505:19;;11400:74:0;12124:406:1;11400:74:0;-1:-1:-1;;;;;;11492:16:0;;;;;:9;:16;;;;;;;11308:208::o;37340:94::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;37405:21:::1;37423:1;37405:9;:21::i;:::-;37340:94::o:0;12053:104::-;12109:13;12142:7;12135:14;;;;;:::i;40045:541::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;40146:35;;::::1;40138:82;;;::::0;-1:-1:-1;;;40138:82:0;;12737:2:1;40138:82:0::1;::::0;::::1;12719:21:1::0;12776:2;12756:18;;;12749:30;12815:34;12795:18;;;12788:62;-1:-1:-1;;;12866:18:1;;;12859:31;12907:19;;40138:82:0::1;12535:397:1::0;40138:82:0::1;40225:18;40256:6:::0;40252:81:::1;40268:19:::0;;::::1;40252:81;;;40316:8;;40325:1;40316:11;;;;;;;:::i;:::-;;;;;;;40299:28;;;;;:::i;:::-;::::0;-1:-1:-1;40289:3:0;::::1;::::0;::::1;:::i;:::-;;;;40252:81;;;;40372:9;;40355:13;40346:6;;:22;;;;:::i;:::-;:35;;40337:58;;;::::0;-1:-1:-1;;;40337:58:0;;13271:2:1;40337:58:0::1;::::0;::::1;13253:21:1::0;13310:1;13290:18;;;13283:29;-1:-1:-1;;;13328:18:1;;;13321:38;13376:18;;40337:58:0::1;13069:331:1::0;40337:58:0::1;-1:-1:-1::0;40400:20:0::1;::::0;40425:157:::1;40441:20:::0;;::::1;40425:157;;;40477:6;40473:104;40493:8;;40502:1;40493:11;;;;;;;:::i;:::-;;;;;;;40489:1;:15;40473:104;;;40525:6;:8:::0;;;:6:::1;:8;::::0;::::1;:::i;:::-;;;;;;40539:31;40549:9;;40559:1;40549:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40563:6;;40539:9;:31::i;:::-;40506:3:::0;::::1;::::0;::::1;:::i;:::-;;;;40473:104;;;-1:-1:-1::0;40463:3:0;::::1;::::0;::::1;:::i;:::-;;;;40425:157;;;;40133:453;40045:541:::0;;;;:::o;39000:461::-;32787:1;33383:7;;:19;;33375:63;;;;-1:-1:-1;;;33375:63:0;;8731:2:1;33375:63:0;;;8713:21:1;8770:2;8750:18;;;8743:30;8809:33;8789:18;;;8782:61;8860:18;;33375:63:0;8529:355:1;33375:63:0;32787:1;33516:7;:18;39075:6:::1;::::0;::::1;;39067:33;;;::::0;-1:-1:-1;;;39067:33:0;;9091:2:1;39067:33:0::1;::::0;::::1;9073:21:1::0;9130:2;9110:18;;;9103:30;-1:-1:-1;;;9149:18:1;;;9142:43;9202:18;;39067:33:0::1;8889:337:1::0;39067:33:0::1;39119:10;39133:9;39119:23;39111:49;;;::::0;-1:-1:-1;;;39111:49:0;;9433:2:1;39111:49:0::1;::::0;::::1;9415:21:1::0;9472:2;9452:18;;;9445:30;-1:-1:-1;;;9491:18:1;;;9484:43;9544:18;;39111:49:0::1;9231:337:1::0;39111:49:0::1;39188:7;;39173:11;:22;;39165:44;;;::::0;-1:-1:-1;;;39165:44:0;;13271:2:1;39165:44:0::1;::::0;::::1;13253:21:1::0;13310:1;13290:18;;;13283:29;-1:-1:-1;;;13328:18:1;;;13321:38;13376:18;;39165:44:0::1;13069:331:1::0;39165:44:0::1;39246:9;;39231:11;39222:6;;:20;;;;:::i;:::-;:33;;39214:66;;;::::0;-1:-1:-1;;;39214:66:0;;10040:2:1;39214:66:0::1;::::0;::::1;10022:21:1::0;10079:2;10059:18;;;10052:30;-1:-1:-1;;;10098:18:1;;;10091:49;10157:18;;39214:66:0::1;9838:343:1::0;39214:66:0::1;39313:11;39306:4;;:18;;;;:::i;:::-;39293:9;:31;;39285:58;;;::::0;-1:-1:-1;;;39285:58:0;;13780:2:1;39285:58:0::1;::::0;::::1;13762:21:1::0;13819:2;13799:18;;;13792:30;-1:-1:-1;;;13838:18:1;;;13831:44;13892:18;;39285:58:0::1;13578:338:1::0;39285:58:0::1;39356:9;39351:106;39375:11;39371:1;:15;39351:106;;;39408:6;:8:::0;;;:6:::1;:8;::::0;::::1;:::i;:::-;;;;;;39422:29;39432:10;39444:6;;39422:9;:29::i;:::-;39388:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39351:106;;13736:295:::0;-1:-1:-1;;;;;13839:24:0;;9549:10;13839:24;;13831:62;;;;-1:-1:-1;;;13831:62:0;;14123:2:1;13831:62:0;;;14105:21:1;14162:2;14142:18;;;14135:30;14201:27;14181:18;;;14174:55;14246:18;;13831:62:0;13921:349:1;13831:62:0;9549:10;13906:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;13906:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;13906:53:0;;;;;;;;;;13975:48;;540:41:1;;;13906:42:0;;9549:10;13975:48;;513:18:1;13975:48:0;;;;;;;13736:295;;:::o;14999:328::-;15174:41;9549:10;15207:7;15174:18;:41::i;:::-;15166:103;;;;-1:-1:-1;;;15166:103:0;;;;;;;:::i;:::-;15280:39;15294:4;15300:2;15304:7;15313:5;15280:13;:39::i;:::-;14999:328;;;;:::o;40610:313::-;16902:4;16926:16;;;:7;:16;;;;;;40683:13;;-1:-1:-1;;;;;16926:16:0;40706:46;;;;-1:-1:-1;;;40706:46:0;;14477:2:1;40706:46:0;;;14459:21:1;14516:2;14496:18;;;14489:30;-1:-1:-1;;;14535:18:1;;;14528:47;14592:18;;40706:46:0;14275:341:1;40706:46:0;40760:28;40791:10;:8;:10::i;:::-;40760:41;;40847:1;40822:14;40816:28;:32;:102;;;;;;;;;;;;;;;;;40875:14;40891:20;40892:7;40891:18;:20::i;:::-;40858:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40816:102;40809:109;40610:313;-1:-1:-1;;;40610:313:0:o;41702:72::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;41763:6:::1;::::0;;-1:-1:-1;;41753:16:0;::::1;41763:6;::::0;;::::1;41762:7;41753:16;::::0;;41702:72::o;38631:343::-;38730:8;;38773:28;;-1:-1:-1;;;38773:28:0;;-1:-1:-1;;;;;1692:32:1;;;38773:28:0;;;1674:51:1;38687:4:0;;38730:8;;;;;38687:4;;38730:8;;38773:19;;1647:18:1;;38773:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38844:8;;38887:28;;-1:-1:-1;;;38887:28:0;;-1:-1:-1;;;;;1692:32:1;;;38887:28:0;;;1674:51:1;38750::0;;-1:-1:-1;38844:8:0;;;38818:16;;38844:8;;38887:19;;1647:18:1;;38887:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38864:51;-1:-1:-1;38966:1:0;38936:27;38864:51;38936:12;:27;:::i;:::-;:31;;38631:343;-1:-1:-1;;;;;;38631:343:0:o;37589:192::-;36762:6;;-1:-1:-1;;;;;36762:6:0;9549:10;36909:23;36901:68;;;;-1:-1:-1;;;36901:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37678:22:0;::::1;37670:73;;;::::0;-1:-1:-1;;;37670:73:0;;15487:2:1;37670:73:0::1;::::0;::::1;15469:21:1::0;15526:2;15506:18;;;15499:30;15565:34;15545:18;;;15538:62;-1:-1:-1;;;15616:18:1;;;15609:36;15662:19;;37670:73:0::1;15285:402:1::0;37670:73:0::1;37754:19;37764:8;37754:9;:19::i;20819:174::-:0;20894:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;20894:29:0;-1:-1:-1;;;;;20894:29:0;;;;;;;;:24;;20948:23;20894:24;20948:14;:23::i;:::-;-1:-1:-1;;;;;20939:46:0;;;;;;;;;;;20819:174;;:::o;17821:110::-;17897:26;17907:2;17911:7;17897:26;;;;;;;;;;;;:9;:26::i;17131:348::-;17224:4;16926:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16926:16:0;17241:73;;;;-1:-1:-1;;;17241:73:0;;15894:2:1;17241:73:0;;;15876:21:1;15933:2;15913:18;;;15906:30;15972:34;15952:18;;;15945:62;-1:-1:-1;;;16023:18:1;;;16016:42;16075:19;;17241:73:0;15692:408:1;17241:73:0;17325:13;17341:23;17356:7;17341:14;:23::i;:::-;17325:39;;17394:5;-1:-1:-1;;;;;17383:16:0;:7;-1:-1:-1;;;;;17383:16:0;;:51;;;;17427:7;-1:-1:-1;;;;;17403:31:0;:20;17415:7;17403:11;:20::i;:::-;-1:-1:-1;;;;;17403:31:0;;17383:51;:87;;;-1:-1:-1;;;;;;14223:25:0;;;14199:4;14223:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;17438:32;17375:96;17131:348;-1:-1:-1;;;;17131:348:0:o;20123:578::-;20282:4;-1:-1:-1;;;;;20255:31:0;:23;20270:7;20255:14;:23::i;:::-;-1:-1:-1;;;;;20255:31:0;;20247:85;;;;-1:-1:-1;;;20247:85:0;;16307:2:1;20247:85:0;;;16289:21:1;16346:2;16326:18;;;16319:30;16385:34;16365:18;;;16358:62;-1:-1:-1;;;16436:18:1;;;16429:39;16485:19;;20247:85:0;16105:405:1;20247:85:0;-1:-1:-1;;;;;20351:16:0;;20343:65;;;;-1:-1:-1;;;20343:65:0;;16717:2:1;20343:65:0;;;16699:21:1;16756:2;16736:18;;;16729:30;16795:34;16775:18;;;16768:62;-1:-1:-1;;;16846:18:1;;;16839:34;16890:19;;20343:65:0;16515:400:1;20343:65:0;20525:29;20542:1;20546:7;20525:8;:29::i;:::-;-1:-1:-1;;;;;20567:15:0;;;;;;:9;:15;;;;;:20;;20586:1;;20567:15;:20;;20586:1;;20567:20;:::i;:::-;;;;-1:-1:-1;;;;;;;20598:13:0;;;;;;:9;:13;;;;;:18;;20615:1;;20598:13;:18;;20615:1;;20598:18;:::i;:::-;;;;-1:-1:-1;;20627:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;20627:21:0;-1:-1:-1;;;;;20627:21:0;;;;;;;;;20666:27;;20627:16;;20666:27;;;;;;;20123:578;;;:::o;37789:173::-;37864:6;;;-1:-1:-1;;;;;37881:17:0;;;-1:-1:-1;;;;;;37881:17:0;;;;;;;37914:40;;37864:6;;;37881:17;37864:6;;37914:40;;37845:16;;37914:40;37834:128;37789:173;:::o;16209:315::-;16366:28;16376:4;16382:2;16386:7;16366:9;:28::i;:::-;16413:48;16436:4;16442:2;16446:7;16455:5;16413:22;:48::i;:::-;16405:111;;;;-1:-1:-1;;;16405:111:0;;;;;;;:::i;41596:100::-;41648:13;41681:7;41674:14;;;;;:::i;33987:723::-;34043:13;34264:10;34260:53;;-1:-1:-1;;34291:10:0;;;;;;;;;;;;-1:-1:-1;;;34291:10:0;;;;;33987:723::o;34260:53::-;34338:5;34323:12;34379:78;34386:9;;34379:78;;34412:8;;;;:::i;:::-;;-1:-1:-1;34435:10:0;;-1:-1:-1;34443:2:0;34435:10;;:::i;:::-;;;34379:78;;;34467:19;34499:6;34489:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34489:17:0;;34467:39;;34517:154;34524:10;;34517:154;;34551:11;34561:1;34551:11;;:::i;:::-;;-1:-1:-1;34620:10:0;34628:2;34620:5;:10;:::i;:::-;34607:24;;:2;:24;:::i;:::-;34594:39;;34577:6;34584;34577:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;34577:56:0;;;;;;;;-1:-1:-1;34648:11:0;34657:2;34648:11;;:::i;:::-;;;34517:154;;18158:321;18288:18;18294:2;18298:7;18288:5;:18::i;:::-;18339:54;18370:1;18374:2;18378:7;18387:5;18339:22;:54::i;:::-;18317:154;;;;-1:-1:-1;;;18317:154:0;;;;;;;:::i;21558:799::-;21713:4;-1:-1:-1;;;;;21734:13:0;;24097:20;24145:8;21730:620;;21770:72;;-1:-1:-1;;;21770:72:0;;-1:-1:-1;;;;;21770:36:0;;;;;:72;;9549:10;;21821:4;;21827:7;;21836:5;;21770:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21770:72:0;;;;;;;;-1:-1:-1;;21770:72:0;;;;;;;;;;;;:::i;:::-;;;21766:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22012:13:0;;22008:272;;22055:60;;-1:-1:-1;;;22055:60:0;;;;;;;:::i;22008:272::-;22230:6;22224:13;22215:6;22211:2;22207:15;22200:38;21766:529;-1:-1:-1;;;;;;21893:51:0;-1:-1:-1;;;21893:51:0;;-1:-1:-1;21886:58:0;;21730:620;-1:-1:-1;22334:4:0;21558:799;;;;;;:::o;18815:382::-;-1:-1:-1;;;;;18895:16:0;;18887:61;;;;-1:-1:-1;;;18887:61:0;;18793:2:1;18887:61:0;;;18775:21:1;;;18812:18;;;18805:30;18871:34;18851:18;;;18844:62;18923:18;;18887:61:0;18591:356:1;18887:61:0;16902:4;16926:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16926:16:0;:30;18959:58;;;;-1:-1:-1;;;18959:58:0;;19154:2:1;18959:58:0;;;19136:21:1;19193:2;19173:18;;;19166:30;19232;19212:18;;;19205:58;19280:18;;18959:58:0;18952:352:1;18959:58:0;-1:-1:-1;;;;;19088:13:0;;;;;;:9;:13;;;;;:18;;19105:1;;19088:13;:18;;19105:1;;19088:18;:::i;:::-;;;;-1:-1:-1;;19117:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;19117:21:0;-1:-1:-1;;;;;19117:21:0;;;;;;;;19156:33;;19117:16;;;19156:33;;19117:16;;19156:33;18815:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2355:186::-;2414:6;2467:2;2455:9;2446:7;2442:23;2438:32;2435:52;;;2483:1;2480;2473:12;2435:52;2506:29;2525:9;2506:29;:::i;2546:328::-;2623:6;2631;2639;2692:2;2680:9;2671:7;2667:23;2663:32;2660:52;;;2708:1;2705;2698:12;2660:52;2731:29;2750:9;2731:29;:::i;:::-;2721:39;;2779:38;2813:2;2802:9;2798:18;2779:38;:::i;:::-;2769:48;;2864:2;2853:9;2849:18;2836:32;2826:42;;2546:328;;;;;:::o;2879:127::-;2940:10;2935:3;2931:20;2928:1;2921:31;2971:4;2968:1;2961:15;2995:4;2992:1;2985:15;3011:632;3076:5;3106:18;3147:2;3139:6;3136:14;3133:40;;;3153:18;;:::i;:::-;3228:2;3222:9;3196:2;3282:15;;-1:-1:-1;;3278:24:1;;;3304:2;3274:33;3270:42;3258:55;;;3328:18;;;3348:22;;;3325:46;3322:72;;;3374:18;;:::i;:::-;3414:10;3410:2;3403:22;3443:6;3434:15;;3473:6;3465;3458:22;3513:3;3504:6;3499:3;3495:16;3492:25;3489:45;;;3530:1;3527;3520:12;3489:45;3580:6;3575:3;3568:4;3560:6;3556:17;3543:44;3635:1;3628:4;3619:6;3611;3607:19;3603:30;3596:41;;;;3011:632;;;;;:::o;3648:451::-;3717:6;3770:2;3758:9;3749:7;3745:23;3741:32;3738:52;;;3786:1;3783;3776:12;3738:52;3826:9;3813:23;3859:18;3851:6;3848:30;3845:50;;;3891:1;3888;3881:12;3845:50;3914:22;;3967:4;3959:13;;3955:27;-1:-1:-1;3945:55:1;;3996:1;3993;3986:12;3945:55;4019:74;4085:7;4080:2;4067:16;4062:2;4058;4054:11;4019:74;:::i;4104:367::-;4167:8;4177:6;4231:3;4224:4;4216:6;4212:17;4208:27;4198:55;;4249:1;4246;4239:12;4198:55;-1:-1:-1;4272:20:1;;4315:18;4304:30;;4301:50;;;4347:1;4344;4337:12;4301:50;4384:4;4376:6;4372:17;4360:29;;4444:3;4437:4;4427:6;4424:1;4420:14;4412:6;4408:27;4404:38;4401:47;4398:67;;;4461:1;4458;4451:12;4398:67;4104:367;;;;;:::o;4476:773::-;4598:6;4606;4614;4622;4675:2;4663:9;4654:7;4650:23;4646:32;4643:52;;;4691:1;4688;4681:12;4643:52;4731:9;4718:23;4760:18;4801:2;4793:6;4790:14;4787:34;;;4817:1;4814;4807:12;4787:34;4856:70;4918:7;4909:6;4898:9;4894:22;4856:70;:::i;:::-;4945:8;;-1:-1:-1;4830:96:1;-1:-1:-1;5033:2:1;5018:18;;5005:32;;-1:-1:-1;5049:16:1;;;5046:36;;;5078:1;5075;5068:12;5046:36;;5117:72;5181:7;5170:8;5159:9;5155:24;5117:72;:::i;:::-;4476:773;;;;-1:-1:-1;5208:8:1;-1:-1:-1;;;;4476:773:1:o;5254:347::-;5319:6;5327;5380:2;5368:9;5359:7;5355:23;5351:32;5348:52;;;5396:1;5393;5386:12;5348:52;5419:29;5438:9;5419:29;:::i;:::-;5409:39;;5498:2;5487:9;5483:18;5470:32;5545:5;5538:13;5531:21;5524:5;5521:32;5511:60;;5567:1;5564;5557:12;5511:60;5590:5;5580:15;;;5254:347;;;;;:::o;5606:667::-;5701:6;5709;5717;5725;5778:3;5766:9;5757:7;5753:23;5749:33;5746:53;;;5795:1;5792;5785:12;5746:53;5818:29;5837:9;5818:29;:::i;:::-;5808:39;;5866:38;5900:2;5889:9;5885:18;5866:38;:::i;:::-;5856:48;;5951:2;5940:9;5936:18;5923:32;5913:42;;6006:2;5995:9;5991:18;5978:32;6033:18;6025:6;6022:30;6019:50;;;6065:1;6062;6055:12;6019:50;6088:22;;6141:4;6133:13;;6129:27;-1:-1:-1;6119:55:1;;6170:1;6167;6160:12;6119:55;6193:74;6259:7;6254:2;6241:16;6236:2;6232;6228:11;6193:74;:::i;:::-;6183:84;;;5606:667;;;;;;;:::o;6278:260::-;6346:6;6354;6407:2;6395:9;6386:7;6382:23;6378:32;6375:52;;;6423:1;6420;6413:12;6375:52;6446:29;6465:9;6446:29;:::i;:::-;6436:39;;6494:38;6528:2;6517:9;6513:18;6494:38;:::i;:::-;6484:48;;6278:260;;;;;:::o;6543:380::-;6622:1;6618:12;;;;6665;;;6686:61;;6740:4;6732:6;6728:17;6718:27;;6686:61;6793:2;6785:6;6782:14;6762:18;6759:38;6756:161;;;6839:10;6834:3;6830:20;6827:1;6820:31;6874:4;6871:1;6864:15;6902:4;6899:1;6892:15;6756:161;;6543:380;;;:::o;7341:356::-;7543:2;7525:21;;;7562:18;;;7555:30;7621:34;7616:2;7601:18;;7594:62;7688:2;7673:18;;7341:356::o;9573:127::-;9634:10;9629:3;9625:20;9622:1;9615:31;9665:4;9662:1;9655:15;9689:4;9686:1;9679:15;9705:128;9745:3;9776:1;9772:6;9769:1;9766:13;9763:39;;;9782:18;;:::i;:::-;-1:-1:-1;9818:9:1;;9705:128::o;10946:135::-;10985:3;-1:-1:-1;;11006:17:1;;11003:43;;;11026:18;;:::i;:::-;-1:-1:-1;11073:1:1;11062:13;;10946:135::o;11086:413::-;11288:2;11270:21;;;11327:2;11307:18;;;11300:30;11366:34;11361:2;11346:18;;11339:62;-1:-1:-1;;;11432:2:1;11417:18;;11410:47;11489:3;11474:19;;11086:413::o;12937:127::-;12998:10;12993:3;12989:20;12986:1;12979:31;13029:4;13026:1;13019:15;13053:4;13050:1;13043:15;13405:168;13445:7;13511:1;13507;13503:6;13499:14;13496:1;13493:21;13488:1;13481:9;13474:17;13470:45;13467:71;;;13518:18;;:::i;:::-;-1:-1:-1;13558:9:1;;13405:168::o;14621:470::-;14800:3;14838:6;14832:13;14854:53;14900:6;14895:3;14888:4;14880:6;14876:17;14854:53;:::i;:::-;14970:13;;14929:16;;;;14992:57;14970:13;14929:16;15026:4;15014:17;;14992:57;:::i;:::-;15065:20;;14621:470;-1:-1:-1;;;;14621:470:1:o;15096:184::-;15166:6;15219:2;15207:9;15198:7;15194:23;15190:32;15187:52;;;15235:1;15232;15225:12;15187:52;-1:-1:-1;15258:16:1;;15096:184;-1:-1:-1;15096:184:1:o;16920:125::-;16960:4;16988:1;16985;16982:8;16979:34;;;16993:18;;:::i;:::-;-1:-1:-1;17030:9:1;;16920:125::o;17050:414::-;17252:2;17234:21;;;17291:2;17271:18;;;17264:30;17330:34;17325:2;17310:18;;17303:62;-1:-1:-1;;;17396:2:1;17381:18;;17374:48;17454:3;17439:19;;17050:414::o;17469:127::-;17530:10;17525:3;17521:20;17518:1;17511:31;17561:4;17558:1;17551:15;17585:4;17582:1;17575:15;17601:120;17641:1;17667;17657:35;;17672:18;;:::i;:::-;-1:-1:-1;17706:9:1;;17601:120::o;17726:112::-;17758:1;17784;17774:35;;17789:18;;:::i;:::-;-1:-1:-1;17823:9:1;;17726:112::o;17843:489::-;-1:-1:-1;;;;;18112:15:1;;;18094:34;;18164:15;;18159:2;18144:18;;18137:43;18211:2;18196:18;;18189:34;;;18259:3;18254:2;18239:18;;18232:31;;;18037:4;;18280:46;;18306:19;;18298:6;18280:46;:::i;:::-;18272:54;17843:489;-1:-1:-1;;;;;;17843:489:1:o;18337:249::-;18406:6;18459:2;18447:9;18438:7;18434:23;18430:32;18427:52;;;18475:1;18472;18465:12;18427:52;18507:9;18501:16;18526:30;18550:5;18526:30;:::i
Swarm Source
ipfs://a5a300030aa9658b971a8eb843371322237661a7d68f3f1417f2ea3f4761e4f6
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.