ETH Price: $2,979.81 (+1.66%)
Gas: 2 Gwei

Token

RebelCoin (SUB)
 

Overview

Max Total Supply

1,024 SUB

Holders

382

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 SUB
0x21e2efc65b1febab105a3f5f8d4fbe883e632e95
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SuburbanColors

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-14
*/

// SPDX-License-Identifier: MIT

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}.
 */

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);
}


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);
            }
        }
    }
}


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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);
    }
}


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);
}


abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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;
}



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);
}



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;
    
    // metadata api
    string baseUri = "ipfs://QmXuoQtta6Z8JMcpdxoNbTo8uVHVHLQeffBHW7ZDNdFz4F/"; 

    /**
     * @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(), ".json")) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return baseUri;
    }
    

    /**
     * @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 {}
}

contract VerifySignature is Ownable {
    
    function getMessageHash(
        address _to
    ) public pure returns (bytes32) {
        return keccak256(abi.encodePacked(_to));
    }

    function getEthSignedMessageHash(bytes32 _messageHash)
        private
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)
            );
    }

    function verify(
        address _signer,
        bytes memory signature
    ) public view returns (bool) {
        require(_signer == owner(), "Signer should be owner only.");
        bytes32 messageHash = getMessageHash(msg.sender);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

        return recoverSigner(ethSignedMessageHash, signature) == _signer;
    }

    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature)
        private
        pure
        returns (address)
    {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);

        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function splitSignature(bytes memory sig)
        private
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "invalid signature length");

        assembly {
            /*
            First 32 bytes stores the length of the signature

            add(sig, 32) = pointer of sig + 32
            effectively, skips first 32 bytes of signature

            mload(p) loads next 32 bytes starting at the memory address p into memory
            */

            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

    }
}

contract SuburbanColors is ERC721, Ownable, VerifySignature{
     
    uint256 public totalSupply = 0; // Total Minted Supply
    uint256 private constant totalSale = 2199; // total NFTs
    uint256 public reserved = 0; // reserved for whitelist users
    uint256 public mintPrice = 3 * 10 ** 16;  // minting price 0.03 ETH
    uint256 public launchedAt; 

    mapping(address => uint256) public whitelistMinted;

    constructor(uint256 _launchedAt, uint256 _reserved) ERC721("RebelCoin", "SUB"){
        launchedAt = _launchedAt;
        reserved = _reserved;
    }
    
    function presaleMint(bytes memory _signature, uint256 quantity) public payable{
        require(verify(owner(), _signature), "You are not Whitelisted.");
        require((whitelistMinted[msg.sender] + quantity) <= 3, "You have mint your all NFTs.");
        require(msg.value >= (mintPrice * quantity), "Invalid Price To Mint");
        require(reserved > 0, "All reserved NFTs are minted.");

        (bool success,) = owner().call{value: msg.value}("");
        if(!success) {
            revert("Payment Sending Failed");
        }
        else{
            for (uint256 i=0; i < quantity; i++) {
                totalSupply++;
                _safeMint(msg.sender, totalSupply);
                whitelistMinted[msg.sender] += 1;
            }
            reserved = reserved - quantity;     
        }
    } 

    function mintByUser(uint256 quantity) public payable{
        require(block.timestamp >= launchedAt, "Minting is not started.");
        require((totalSupply + quantity) <= (totalSale - reserved), "Max Limit To Total Sale");
        require(quantity > 0 && quantity <=3, "Invalid Mint Quantity");
        require(msg.value >= (mintPrice * quantity), "Invalid Price To Mint");

        (bool success,) = owner().call{value: msg.value}("");
        if(!success) {
            revert("Payment Sending Failed");
        }
        else{
            for (uint256 i=0; i < quantity; i++) {
                totalSupply++;
                _safeMint(msg.sender,totalSupply);
            }     
        }
        
    } 
    
    function setMintPrice(uint256 newPrice) external onlyOwner {
        mintPrice = newPrice;
    }
    
    function _setbaseURI(string memory _baseUri) external onlyOwner{
        baseUri = _baseUri;
    }
    
    function mintByOwner(address _to, uint256 quantity) public onlyOwner {
      require(totalSupply + quantity <= totalSale - reserved, "Max Limit To Admin Mint");
        for (uint256 i=0; i<quantity; i++) {
             totalSupply++;
            _safeMint(_to,totalSupply);
        }   
    }
    
    function batchMintByOwner(address[] memory mintAddressList,uint256[] memory quantityList) external onlyOwner {
        require (mintAddressList.length == quantityList.length, "The length should be same");

        for (uint256 i=0; i<mintAddressList.length; i++) {
            mintByOwner(mintAddressList[i], quantityList[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_launchedAt","type":"uint256"},{"internalType":"uint256","name":"_reserved","type":"uint256"}],"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":"string","name":"_baseUri","type":"string"}],"name":"_setbaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"mintAddressList","type":"address[]"},{"internalType":"uint256[]","name":"quantityList","type":"uint256[]"}],"name":"batchMintByOwner","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":"address","name":"_to","type":"address"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintByUser","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60e060405260366080818152906200274c60a0398051620000299160069160209091019062000153565b5060006008556000600955666a94d74f430000600a553480156200004c57600080fd5b5060405162002782380380620027828339810160408190526200006f91620001f9565b60408051808201825260098152682932b132b621b7b4b760b91b60208083019182528351808501909452600384526229aaa160e91b908401528151919291620000bb9160009162000153565b508051620000d190600190602084019062000153565b505050620000ee620000e8620000fd60201b60201c565b62000101565b600b919091556009556200025b565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000161906200021e565b90600052602060002090601f016020900481019282620001855760008555620001d0565b82601f10620001a057805160ff1916838001178555620001d0565b82800160010185558215620001d0579182015b82811115620001d0578251825591602001919060010190620001b3565b50620001de929150620001e2565b5090565b5b80821115620001de5760008155600101620001e3565b600080604083850312156200020d57600080fd5b505080516020909101519092909150565b600181811c908216806200023357607f821691505b602082108114156200025557634e487b7160e01b600052602260045260246000fd5b50919050565b6124e1806200026b6000396000f3fe6080604052600436106101c25760003560e01c80636817c76c116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146104e3578063f2fde38b1461052c578063f4a0a5281461054c578063fe60d12c1461056c57600080fd5b8063b88d4fde1461046d578063bf56b3711461048d578063c87b56dd146104a3578063db8ff1fd146104c357600080fd5b80638da5cb5b116100d15780638da5cb5b146103ed57806395d89b411461040b57806398a8cffe14610420578063a22cb4651461044d57600080fd5b80636817c76c146103a257806370a08231146103b8578063715018a6146103d857600080fd5b80633542aee2116101645780634a41d1ac1161013e5780634a41d1ac1461033c5780634e21dc401461035c5780636352211e1461036f57806366102d2d1461038f57600080fd5b80633542aee2146102dc57806342842e0e146102fc5780634985fb5b1461031c57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806318160ddd146102785780631f5ac1b21461029c57806323b872dd146102bc57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e236600461207c565b610582565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b506102116105d4565b6040516101f39190612205565b34801561022a57600080fd5b5061023e610239366004612144565b610666565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004611f95565b610700565b005b34801561028457600080fd5b5061028e60085481565b6040519081526020016101f3565b3480156102a857600080fd5b5061028e6102b7366004611e19565b610816565b3480156102c857600080fd5b506102766102d7366004611e67565b610856565b3480156102e857600080fd5b506102766102f7366004611f95565b610887565b34801561030857600080fd5b50610276610317366004611e67565b61095a565b34801561032857600080fd5b506102766103373660046120fb565b610975565b34801561034857600080fd5b506101e7610357366004611f47565b6109b6565b61027661036a3660046120b6565b610a6b565b34801561037b57600080fd5b5061023e61038a366004612144565b610d0d565b61027661039d366004612144565b610d84565b3480156103ae57600080fd5b5061028e600a5481565b3480156103c457600080fd5b5061028e6103d3366004611e19565b610fd6565b3480156103e457600080fd5b5061027661105d565b3480156103f957600080fd5b506007546001600160a01b031661023e565b34801561041757600080fd5b50610211611093565b34801561042c57600080fd5b5061028e61043b366004611e19565b600c6020526000908152604090205481565b34801561045957600080fd5b50610276610468366004611f0b565b6110a2565b34801561047957600080fd5b50610276610488366004611ea3565b611167565b34801561049957600080fd5b5061028e600b5481565b3480156104af57600080fd5b506102116104be366004612144565b61119f565b3480156104cf57600080fd5b506102766104de366004611fbf565b61127a565b3480156104ef57600080fd5b506101e76104fe366004611e34565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561053857600080fd5b50610276610547366004611e19565b61134f565b34801561055857600080fd5b50610276610567366004612144565b6113ea565b34801561057857600080fd5b5061028e60095481565b60006001600160e01b031982166380ac58cd60e01b14806105b357506001600160e01b03198216635b5e139f60e01b145b806105ce57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546105e3906123d3565b80601f016020809104026020016040519081016040528092919081815260200182805461060f906123d3565b801561065c5780601f106106315761010080835404028352916020019161065c565b820191906000526020600020905b81548152906001019060200180831161063f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106e45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061070b82610d0d565b9050806001600160a01b0316836001600160a01b031614156107795760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106db565b336001600160a01b0382161480610795575061079581336104fe565b6108075760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106db565b6108118383611419565b505050565b6040516bffffffffffffffffffffffff19606083901b1660208201526000906034015b604051602081830303815290604052805190602001209050919050565b6108603382611487565b61087c5760405162461bcd60e51b81526004016106db9061229f565b61081183838361157e565b6007546001600160a01b031633146108b15760405162461bcd60e51b81526004016106db9061226a565b6009546108c090610897612390565b816008546108ce9190612345565b111561091c5760405162461bcd60e51b815260206004820152601760248201527f4d6178204c696d697420546f2041646d696e204d696e7400000000000000000060448201526064016106db565b60005b8181101561081157600880549060006109378361240e565b91905055506109488360085461171e565b806109528161240e565b91505061091f565b61081183838360405180602001604052806000815250611167565b6007546001600160a01b0316331461099f5760405162461bcd60e51b81526004016106db9061226a565b80516109b2906006906020840190611c7a565b5050565b60006109ca6007546001600160a01b031690565b6001600160a01b0316836001600160a01b031614610a2a5760405162461bcd60e51b815260206004820152601c60248201527f5369676e65722073686f756c64206265206f776e6572206f6e6c792e0000000060448201526064016106db565b6000610a3533610816565b90506000610a4282611738565b9050846001600160a01b0316610a588286611773565b6001600160a01b03161495945050505050565b610a86610a806007546001600160a01b031690565b836109b6565b610ad25760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742057686974656c69737465642e000000000000000060448201526064016106db565b336000908152600c6020526040902054600390610af0908390612345565b1115610b3e5760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206d696e7420796f757220616c6c204e4654732e0000000060448201526064016106db565b80600a54610b4c9190612371565b341015610b935760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908141c9a58d948151bc8135a5b9d605a1b60448201526064016106db565b600060095411610be55760405162461bcd60e51b815260206004820152601d60248201527f416c6c207265736572766564204e46547320617265206d696e7465642e00000060448201526064016106db565b6000610bf96007546001600160a01b031690565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610c43576040519150601f19603f3d011682016040523d82523d6000602084013e610c48565b606091505b5050905080610c925760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d0814d95b991a5b99c811985a5b195960521b60448201526064016106db565b60005b82811015610cf65760088054906000610cad8361240e565b9190505550610cbe3360085461171e565b336000908152600c60205260408120805460019290610cde908490612345565b90915550819050610cee8161240e565b915050610c95565b5081600954610d059190612390565b600955505050565b6000818152600260205260408120546001600160a01b0316806105ce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106db565b600b54421015610dd65760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420737461727465642e00000000000000000060448201526064016106db565b600954610de590610897612390565b81600854610df39190612345565b1115610e415760405162461bcd60e51b815260206004820152601760248201527f4d6178204c696d697420546f20546f74616c2053616c6500000000000000000060448201526064016106db565b600081118015610e52575060038111155b610e965760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964204d696e74205175616e7469747960581b60448201526064016106db565b80600a54610ea49190612371565b341015610eeb5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908141c9a58d948151bc8135a5b9d605a1b60448201526064016106db565b6000610eff6007546001600160a01b031690565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b5050905080610f985760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d0814d95b991a5b99c811985a5b195960521b60448201526064016106db565b60005b828110156108115760088054906000610fb38361240e565b9190505550610fc43360085461171e565b80610fce8161240e565b915050610f9b565b60006001600160a01b0382166110415760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106db565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146110875760405162461bcd60e51b81526004016106db9061226a565b61109160006117f2565b565b6060600180546105e3906123d3565b6001600160a01b0382163314156110fb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106db565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111713383611487565b61118d5760405162461bcd60e51b81526004016106db9061229f565b61119984848484611844565b50505050565b6000818152600260205260409020546060906001600160a01b031661121e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106db565b6000611228611877565b905060008151116112485760405180602001604052806000815250611273565b8061125284611886565b604051602001611263929190612189565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146112a45760405162461bcd60e51b81526004016106db9061226a565b80518251146112f55760405162461bcd60e51b815260206004820152601960248201527f546865206c656e6774682073686f756c642062652073616d650000000000000060448201526064016106db565b60005b82518110156108115761133d83828151811061131657611316612469565b602002602001015183838151811061133057611330612469565b6020026020010151610887565b806113478161240e565b9150506112f8565b6007546001600160a01b031633146113795760405162461bcd60e51b81526004016106db9061226a565b6001600160a01b0381166113de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106db565b6113e7816117f2565b50565b6007546001600160a01b031633146114145760405162461bcd60e51b81526004016106db9061226a565b600a55565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061144e82610d0d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115005760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106db565b600061150b83610d0d565b9050806001600160a01b0316846001600160a01b031614806115465750836001600160a01b031661153b84610666565b6001600160a01b0316145b8061157657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661159182610d0d565b6001600160a01b0316146115f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106db565b6001600160a01b03821661165b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106db565b611666600082611419565b6001600160a01b038316600090815260036020526040812080546001929061168f908490612390565b90915550506001600160a01b03821660009081526003602052604081208054600192906116bd908490612345565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6109b2828260405180602001604052806000815250611984565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01610839565b600080600080611782856119b7565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156117dd573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61184f84848461157e565b61185b84848484611a2b565b6111995760405162461bcd60e51b81526004016106db90612218565b6060600680546105e3906123d3565b6060816118aa5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118d457806118be8161240e565b91506118cd9050600a8361235d565b91506118ae565b60008167ffffffffffffffff8111156118ef576118ef61247f565b6040519080825280601f01601f191660200182016040528015611919576020820181803683370190505b5090505b84156115765761192e600183612390565b915061193b600a86612429565b611946906030612345565b60f81b81838151811061195b5761195b612469565b60200101906001600160f81b031916908160001a90535061197d600a8661235d565b945061191d565b61198e8383611b38565b61199b6000848484611a2b565b6108115760405162461bcd60e51b81526004016106db90612218565b60008060008351604114611a0d5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016106db565b50505060208101516040820151606090920151909260009190911a90565b60006001600160a01b0384163b15611b2d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a6f9033908990889088906004016121c8565b602060405180830381600087803b158015611a8957600080fd5b505af1925050508015611ab9575060408051601f3d908101601f19168201909252611ab691810190612099565b60015b611b13573d808015611ae7576040519150601f19603f3d011682016040523d82523d6000602084013e611aec565b606091505b508051611b0b5760405162461bcd60e51b81526004016106db90612218565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611576565b506001949350505050565b6001600160a01b038216611b8e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106db565b6000818152600260205260409020546001600160a01b031615611bf35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106db565b6001600160a01b0382166000908152600360205260408120805460019290611c1c908490612345565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611c86906123d3565b90600052602060002090601f016020900481019282611ca85760008555611cee565b82601f10611cc157805160ff1916838001178555611cee565b82800160010185558215611cee579182015b82811115611cee578251825591602001919060010190611cd3565b50611cfa929150611cfe565b5090565b5b80821115611cfa5760008155600101611cff565b600067ffffffffffffffff831115611d2d57611d2d61247f565b611d40601f8401601f19166020016122f0565b9050828152838383011115611d5457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611d8257600080fd5b919050565b600082601f830112611d9857600080fd5b81356020611dad611da883612321565b6122f0565b80838252828201915082860187848660051b8901011115611dcd57600080fd5b60005b85811015611dec57813584529284019290840190600101611dd0565b5090979650505050505050565b600082601f830112611e0a57600080fd5b61127383833560208501611d13565b600060208284031215611e2b57600080fd5b61127382611d6b565b60008060408385031215611e4757600080fd5b611e5083611d6b565b9150611e5e60208401611d6b565b90509250929050565b600080600060608486031215611e7c57600080fd5b611e8584611d6b565b9250611e9360208501611d6b565b9150604084013590509250925092565b60008060008060808587031215611eb957600080fd5b611ec285611d6b565b9350611ed060208601611d6b565b925060408501359150606085013567ffffffffffffffff811115611ef357600080fd5b611eff87828801611df9565b91505092959194509250565b60008060408385031215611f1e57600080fd5b611f2783611d6b565b915060208301358015158114611f3c57600080fd5b809150509250929050565b60008060408385031215611f5a57600080fd5b611f6383611d6b565b9150602083013567ffffffffffffffff811115611f7f57600080fd5b611f8b85828601611df9565b9150509250929050565b60008060408385031215611fa857600080fd5b611fb183611d6b565b946020939093013593505050565b60008060408385031215611fd257600080fd5b823567ffffffffffffffff80821115611fea57600080fd5b818501915085601f830112611ffe57600080fd5b8135602061200e611da883612321565b8083825282820191508286018a848660051b890101111561202e57600080fd5b600096505b848710156120585761204481611d6b565b835260019690960195918301918301612033565b509650508601359250508082111561206f57600080fd5b50611f8b85828601611d87565b60006020828403121561208e57600080fd5b813561127381612495565b6000602082840312156120ab57600080fd5b815161127381612495565b600080604083850312156120c957600080fd5b823567ffffffffffffffff8111156120e057600080fd5b6120ec85828601611df9565b95602094909401359450505050565b60006020828403121561210d57600080fd5b813567ffffffffffffffff81111561212457600080fd5b8201601f8101841361213557600080fd5b61157684823560208401611d13565b60006020828403121561215657600080fd5b5035919050565b600081518084526121758160208601602086016123a7565b601f01601f19169290920160200192915050565b6000835161219b8184602088016123a7565b8351908301906121af8183602088016123a7565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121fb9083018461215d565b9695505050505050565b602081526000611273602083018461215d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123195761231961247f565b604052919050565b600067ffffffffffffffff82111561233b5761233b61247f565b5060051b60200190565b600082198211156123585761235861243d565b500190565b60008261236c5761236c612453565b500490565b600081600019048311821515161561238b5761238b61243d565b500290565b6000828210156123a2576123a261243d565b500390565b60005b838110156123c25781810151838201526020016123aa565b838111156111995750506000910152565b600181811c908216806123e757607f821691505b6020821081141561240857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124225761242261243d565b5060010190565b60008261243857612438612453565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113e757600080fdfea2646970667358221220bfe8fb37ecc274c502c98b6ab064259f59e7ca8bcc6b368703f46113203ef65164736f6c63430008070033697066733a2f2f516d58756f51747461365a384a4d637064786f4e62546f3875564856484c51656666424857375a444e64467a34462f0000000000000000000000000000000000000000000000000000000061bdb1200000000000000000000000000000000000000000000000000000000000000064

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80636817c76c116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c5146104e3578063f2fde38b1461052c578063f4a0a5281461054c578063fe60d12c1461056c57600080fd5b8063b88d4fde1461046d578063bf56b3711461048d578063c87b56dd146104a3578063db8ff1fd146104c357600080fd5b80638da5cb5b116100d15780638da5cb5b146103ed57806395d89b411461040b57806398a8cffe14610420578063a22cb4651461044d57600080fd5b80636817c76c146103a257806370a08231146103b8578063715018a6146103d857600080fd5b80633542aee2116101645780634a41d1ac1161013e5780634a41d1ac1461033c5780634e21dc401461035c5780636352211e1461036f57806366102d2d1461038f57600080fd5b80633542aee2146102dc57806342842e0e146102fc5780634985fb5b1461031c57600080fd5b8063095ea7b3116101a0578063095ea7b31461025657806318160ddd146102785780631f5ac1b21461029c57806323b872dd146102bc57600080fd5b806301ffc9a7146101c757806306fdde03146101fc578063081812fc1461021e575b600080fd5b3480156101d357600080fd5b506101e76101e236600461207c565b610582565b60405190151581526020015b60405180910390f35b34801561020857600080fd5b506102116105d4565b6040516101f39190612205565b34801561022a57600080fd5b5061023e610239366004612144565b610666565b6040516001600160a01b0390911681526020016101f3565b34801561026257600080fd5b50610276610271366004611f95565b610700565b005b34801561028457600080fd5b5061028e60085481565b6040519081526020016101f3565b3480156102a857600080fd5b5061028e6102b7366004611e19565b610816565b3480156102c857600080fd5b506102766102d7366004611e67565b610856565b3480156102e857600080fd5b506102766102f7366004611f95565b610887565b34801561030857600080fd5b50610276610317366004611e67565b61095a565b34801561032857600080fd5b506102766103373660046120fb565b610975565b34801561034857600080fd5b506101e7610357366004611f47565b6109b6565b61027661036a3660046120b6565b610a6b565b34801561037b57600080fd5b5061023e61038a366004612144565b610d0d565b61027661039d366004612144565b610d84565b3480156103ae57600080fd5b5061028e600a5481565b3480156103c457600080fd5b5061028e6103d3366004611e19565b610fd6565b3480156103e457600080fd5b5061027661105d565b3480156103f957600080fd5b506007546001600160a01b031661023e565b34801561041757600080fd5b50610211611093565b34801561042c57600080fd5b5061028e61043b366004611e19565b600c6020526000908152604090205481565b34801561045957600080fd5b50610276610468366004611f0b565b6110a2565b34801561047957600080fd5b50610276610488366004611ea3565b611167565b34801561049957600080fd5b5061028e600b5481565b3480156104af57600080fd5b506102116104be366004612144565b61119f565b3480156104cf57600080fd5b506102766104de366004611fbf565b61127a565b3480156104ef57600080fd5b506101e76104fe366004611e34565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561053857600080fd5b50610276610547366004611e19565b61134f565b34801561055857600080fd5b50610276610567366004612144565b6113ea565b34801561057857600080fd5b5061028e60095481565b60006001600160e01b031982166380ac58cd60e01b14806105b357506001600160e01b03198216635b5e139f60e01b145b806105ce57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546105e3906123d3565b80601f016020809104026020016040519081016040528092919081815260200182805461060f906123d3565b801561065c5780601f106106315761010080835404028352916020019161065c565b820191906000526020600020905b81548152906001019060200180831161063f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166106e45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061070b82610d0d565b9050806001600160a01b0316836001600160a01b031614156107795760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106db565b336001600160a01b0382161480610795575061079581336104fe565b6108075760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106db565b6108118383611419565b505050565b6040516bffffffffffffffffffffffff19606083901b1660208201526000906034015b604051602081830303815290604052805190602001209050919050565b6108603382611487565b61087c5760405162461bcd60e51b81526004016106db9061229f565b61081183838361157e565b6007546001600160a01b031633146108b15760405162461bcd60e51b81526004016106db9061226a565b6009546108c090610897612390565b816008546108ce9190612345565b111561091c5760405162461bcd60e51b815260206004820152601760248201527f4d6178204c696d697420546f2041646d696e204d696e7400000000000000000060448201526064016106db565b60005b8181101561081157600880549060006109378361240e565b91905055506109488360085461171e565b806109528161240e565b91505061091f565b61081183838360405180602001604052806000815250611167565b6007546001600160a01b0316331461099f5760405162461bcd60e51b81526004016106db9061226a565b80516109b2906006906020840190611c7a565b5050565b60006109ca6007546001600160a01b031690565b6001600160a01b0316836001600160a01b031614610a2a5760405162461bcd60e51b815260206004820152601c60248201527f5369676e65722073686f756c64206265206f776e6572206f6e6c792e0000000060448201526064016106db565b6000610a3533610816565b90506000610a4282611738565b9050846001600160a01b0316610a588286611773565b6001600160a01b03161495945050505050565b610a86610a806007546001600160a01b031690565b836109b6565b610ad25760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742057686974656c69737465642e000000000000000060448201526064016106db565b336000908152600c6020526040902054600390610af0908390612345565b1115610b3e5760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206d696e7420796f757220616c6c204e4654732e0000000060448201526064016106db565b80600a54610b4c9190612371565b341015610b935760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908141c9a58d948151bc8135a5b9d605a1b60448201526064016106db565b600060095411610be55760405162461bcd60e51b815260206004820152601d60248201527f416c6c207265736572766564204e46547320617265206d696e7465642e00000060448201526064016106db565b6000610bf96007546001600160a01b031690565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610c43576040519150601f19603f3d011682016040523d82523d6000602084013e610c48565b606091505b5050905080610c925760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d0814d95b991a5b99c811985a5b195960521b60448201526064016106db565b60005b82811015610cf65760088054906000610cad8361240e565b9190505550610cbe3360085461171e565b336000908152600c60205260408120805460019290610cde908490612345565b90915550819050610cee8161240e565b915050610c95565b5081600954610d059190612390565b600955505050565b6000818152600260205260408120546001600160a01b0316806105ce5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106db565b600b54421015610dd65760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420737461727465642e00000000000000000060448201526064016106db565b600954610de590610897612390565b81600854610df39190612345565b1115610e415760405162461bcd60e51b815260206004820152601760248201527f4d6178204c696d697420546f20546f74616c2053616c6500000000000000000060448201526064016106db565b600081118015610e52575060038111155b610e965760405162461bcd60e51b8152602060048201526015602482015274496e76616c6964204d696e74205175616e7469747960581b60448201526064016106db565b80600a54610ea49190612371565b341015610eeb5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908141c9a58d948151bc8135a5b9d605a1b60448201526064016106db565b6000610eff6007546001600160a01b031690565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610f49576040519150601f19603f3d011682016040523d82523d6000602084013e610f4e565b606091505b5050905080610f985760405162461bcd60e51b815260206004820152601660248201527514185e5b595b9d0814d95b991a5b99c811985a5b195960521b60448201526064016106db565b60005b828110156108115760088054906000610fb38361240e565b9190505550610fc43360085461171e565b80610fce8161240e565b915050610f9b565b60006001600160a01b0382166110415760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106db565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146110875760405162461bcd60e51b81526004016106db9061226a565b61109160006117f2565b565b6060600180546105e3906123d3565b6001600160a01b0382163314156110fb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106db565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111713383611487565b61118d5760405162461bcd60e51b81526004016106db9061229f565b61119984848484611844565b50505050565b6000818152600260205260409020546060906001600160a01b031661121e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106db565b6000611228611877565b905060008151116112485760405180602001604052806000815250611273565b8061125284611886565b604051602001611263929190612189565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146112a45760405162461bcd60e51b81526004016106db9061226a565b80518251146112f55760405162461bcd60e51b815260206004820152601960248201527f546865206c656e6774682073686f756c642062652073616d650000000000000060448201526064016106db565b60005b82518110156108115761133d83828151811061131657611316612469565b602002602001015183838151811061133057611330612469565b6020026020010151610887565b806113478161240e565b9150506112f8565b6007546001600160a01b031633146113795760405162461bcd60e51b81526004016106db9061226a565b6001600160a01b0381166113de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106db565b6113e7816117f2565b50565b6007546001600160a01b031633146114145760405162461bcd60e51b81526004016106db9061226a565b600a55565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061144e82610d0d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115005760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106db565b600061150b83610d0d565b9050806001600160a01b0316846001600160a01b031614806115465750836001600160a01b031661153b84610666565b6001600160a01b0316145b8061157657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661159182610d0d565b6001600160a01b0316146115f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106db565b6001600160a01b03821661165b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106db565b611666600082611419565b6001600160a01b038316600090815260036020526040812080546001929061168f908490612390565b90915550506001600160a01b03821660009081526003602052604081208054600192906116bd908490612345565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6109b2828260405180602001604052806000815250611984565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01610839565b600080600080611782856119b7565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa1580156117dd573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61184f84848461157e565b61185b84848484611a2b565b6111995760405162461bcd60e51b81526004016106db90612218565b6060600680546105e3906123d3565b6060816118aa5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118d457806118be8161240e565b91506118cd9050600a8361235d565b91506118ae565b60008167ffffffffffffffff8111156118ef576118ef61247f565b6040519080825280601f01601f191660200182016040528015611919576020820181803683370190505b5090505b84156115765761192e600183612390565b915061193b600a86612429565b611946906030612345565b60f81b81838151811061195b5761195b612469565b60200101906001600160f81b031916908160001a90535061197d600a8661235d565b945061191d565b61198e8383611b38565b61199b6000848484611a2b565b6108115760405162461bcd60e51b81526004016106db90612218565b60008060008351604114611a0d5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016106db565b50505060208101516040820151606090920151909260009190911a90565b60006001600160a01b0384163b15611b2d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a6f9033908990889088906004016121c8565b602060405180830381600087803b158015611a8957600080fd5b505af1925050508015611ab9575060408051601f3d908101601f19168201909252611ab691810190612099565b60015b611b13573d808015611ae7576040519150601f19603f3d011682016040523d82523d6000602084013e611aec565b606091505b508051611b0b5760405162461bcd60e51b81526004016106db90612218565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611576565b506001949350505050565b6001600160a01b038216611b8e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106db565b6000818152600260205260409020546001600160a01b031615611bf35760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016106db565b6001600160a01b0382166000908152600360205260408120805460019290611c1c908490612345565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611c86906123d3565b90600052602060002090601f016020900481019282611ca85760008555611cee565b82601f10611cc157805160ff1916838001178555611cee565b82800160010185558215611cee579182015b82811115611cee578251825591602001919060010190611cd3565b50611cfa929150611cfe565b5090565b5b80821115611cfa5760008155600101611cff565b600067ffffffffffffffff831115611d2d57611d2d61247f565b611d40601f8401601f19166020016122f0565b9050828152838383011115611d5457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611d8257600080fd5b919050565b600082601f830112611d9857600080fd5b81356020611dad611da883612321565b6122f0565b80838252828201915082860187848660051b8901011115611dcd57600080fd5b60005b85811015611dec57813584529284019290840190600101611dd0565b5090979650505050505050565b600082601f830112611e0a57600080fd5b61127383833560208501611d13565b600060208284031215611e2b57600080fd5b61127382611d6b565b60008060408385031215611e4757600080fd5b611e5083611d6b565b9150611e5e60208401611d6b565b90509250929050565b600080600060608486031215611e7c57600080fd5b611e8584611d6b565b9250611e9360208501611d6b565b9150604084013590509250925092565b60008060008060808587031215611eb957600080fd5b611ec285611d6b565b9350611ed060208601611d6b565b925060408501359150606085013567ffffffffffffffff811115611ef357600080fd5b611eff87828801611df9565b91505092959194509250565b60008060408385031215611f1e57600080fd5b611f2783611d6b565b915060208301358015158114611f3c57600080fd5b809150509250929050565b60008060408385031215611f5a57600080fd5b611f6383611d6b565b9150602083013567ffffffffffffffff811115611f7f57600080fd5b611f8b85828601611df9565b9150509250929050565b60008060408385031215611fa857600080fd5b611fb183611d6b565b946020939093013593505050565b60008060408385031215611fd257600080fd5b823567ffffffffffffffff80821115611fea57600080fd5b818501915085601f830112611ffe57600080fd5b8135602061200e611da883612321565b8083825282820191508286018a848660051b890101111561202e57600080fd5b600096505b848710156120585761204481611d6b565b835260019690960195918301918301612033565b509650508601359250508082111561206f57600080fd5b50611f8b85828601611d87565b60006020828403121561208e57600080fd5b813561127381612495565b6000602082840312156120ab57600080fd5b815161127381612495565b600080604083850312156120c957600080fd5b823567ffffffffffffffff8111156120e057600080fd5b6120ec85828601611df9565b95602094909401359450505050565b60006020828403121561210d57600080fd5b813567ffffffffffffffff81111561212457600080fd5b8201601f8101841361213557600080fd5b61157684823560208401611d13565b60006020828403121561215657600080fd5b5035919050565b600081518084526121758160208601602086016123a7565b601f01601f19169290920160200192915050565b6000835161219b8184602088016123a7565b8351908301906121af8183602088016123a7565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121fb9083018461215d565b9695505050505050565b602081526000611273602083018461215d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123195761231961247f565b604052919050565b600067ffffffffffffffff82111561233b5761233b61247f565b5060051b60200190565b600082198211156123585761235861243d565b500190565b60008261236c5761236c612453565b500490565b600081600019048311821515161561238b5761238b61243d565b500290565b6000828210156123a2576123a261243d565b500390565b60005b838110156123c25781810151838201526020016123aa565b838111156111995750506000910152565b600181811c908216806123e757607f821691505b6020821081141561240857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124225761242261243d565b5060010190565b60008261243857612438612453565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113e757600080fdfea2646970667358221220bfe8fb37ecc274c502c98b6ab064259f59e7ca8bcc6b368703f46113203ef65164736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000061bdb1200000000000000000000000000000000000000000000000000000000000000064

-----Decoded View---------------
Arg [0] : _launchedAt (uint256): 1639821600
Arg [1] : _reserved (uint256): 100

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000061bdb120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000064


Deployed Bytecode Sourcemap

34190:3051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19995:305;;;;;;;;;;-1:-1:-1;19995:305:0;;;;;:::i;:::-;;:::i;:::-;;;9145:14:1;;9138:22;9120:41;;9108:2;9093:18;19995:305:0;;;;;;;;20940:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22525:221::-;;;;;;;;;;-1:-1:-1;22525:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8443:32:1;;;8425:51;;8413:2;8398:18;22525:221:0;8279:203:1;22048:411:0;;;;;;;;;;-1:-1:-1;22048:411:0;;;;;:::i;:::-;;:::i;:::-;;34263:30;;;;;;;;;;;;;;;;;;;9318:25:1;;;9306:2;9291:18;34263:30:0;9172:177:1;32209:141:0;;;;;;;;;;-1:-1:-1;32209:141:0;;;;;:::i;:::-;;:::i;23415:339::-;;;;;;;;;;-1:-1:-1;23415:339:0;;;;;:::i;:::-;;:::i;36580:298::-;;;;;;;;;;-1:-1:-1;36580:298:0;;;;;:::i;:::-;;:::i;23825:185::-;;;;;;;;;;-1:-1:-1;23825:185:0;;;;;:::i;:::-;;:::i;36468:100::-;;;;;;;;;;-1:-1:-1;36468:100:0;;;;;:::i;:::-;;:::i;32632:401::-;;;;;;;;;;-1:-1:-1;32632:401:0;;;;;:::i;:::-;;:::i;34782:829::-;;;;;;:::i;:::-;;:::i;20634:239::-;;;;;;;;;;-1:-1:-1;20634:239:0;;;;;:::i;:::-;;:::i;35620:725::-;;;;;;:::i;:::-;;:::i;34451:39::-;;;;;;;;;;;;;;;;20364:208;;;;;;;;;;-1:-1:-1;20364:208:0;;;;;:::i;:::-;;:::i;10279:103::-;;;;;;;;;;;;;:::i;9628:87::-;;;;;;;;;;-1:-1:-1;9701:6:0;;-1:-1:-1;;;;;9701:6:0;9628:87;;21109:104;;;;;;;;;;;;;:::i;34559:50::-;;;;;;;;;;-1:-1:-1;34559:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;22818:295;;;;;;;;;;-1:-1:-1;22818:295:0;;;;;:::i;:::-;;:::i;24081:328::-;;;;;;;;;;-1:-1:-1;24081:328:0;;;;;:::i;:::-;;:::i;34524:25::-;;;;;;;;;;;;;;;;21290:343;;;;;;;;;;-1:-1:-1;21290:343:0;;;;;:::i;:::-;;:::i;36890:348::-;;;;;;;;;;-1:-1:-1;36890:348:0;;;;;:::i;:::-;;:::i;23184:164::-;;;;;;;;;;-1:-1:-1;23184:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23305:25:0;;;23281:4;23305:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23184:164;10537:201;;;;;;;;;;-1:-1:-1;10537:201:0;;;;;:::i;:::-;;:::i;36358:98::-;;;;;;;;;;-1:-1:-1;36358:98:0;;;;;:::i;:::-;;:::i;34385:27::-;;;;;;;;;;;;;;;;19995:305;20097:4;-1:-1:-1;;;;;;20134:40:0;;-1:-1:-1;;;20134:40:0;;:105;;-1:-1:-1;;;;;;;20191:48:0;;-1:-1:-1;;;20191:48:0;20134:105;:158;;;-1:-1:-1;;;;;;;;;;13726:40:0;;;20256:36;20114:178;19995:305;-1:-1:-1;;19995:305:0:o;20940:100::-;20994:13;21027:5;21020:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20940:100;:::o;22525:221::-;22601:7;26008:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26008:16:0;22621:73;;;;-1:-1:-1;;;22621:73:0;;15554:2:1;22621:73:0;;;15536:21:1;15593:2;15573:18;;;15566:30;15632:34;15612:18;;;15605:62;-1:-1:-1;;;15683:18:1;;;15676:42;15735:19;;22621:73:0;;;;;;;;;-1:-1:-1;22714:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22714:24:0;;22525:221::o;22048:411::-;22129:13;22145:23;22160:7;22145:14;:23::i;:::-;22129:39;;22193:5;-1:-1:-1;;;;;22187:11:0;:2;-1:-1:-1;;;;;22187:11:0;;;22179:57;;;;-1:-1:-1;;;22179:57:0;;18923:2:1;22179:57:0;;;18905:21:1;18962:2;18942:18;;;18935:30;19001:34;18981:18;;;18974:62;-1:-1:-1;;;19052:18:1;;;19045:31;19093:19;;22179:57:0;18721:397:1;22179:57:0;9080:10;-1:-1:-1;;;;;22271:21:0;;;;:62;;-1:-1:-1;22296:37:0;22313:5;9080:10;23184:164;:::i;22296:37::-;22249:168;;;;-1:-1:-1;;;22249:168:0;;12890:2:1;22249:168:0;;;12872:21:1;12929:2;12909:18;;;12902:30;12968:34;12948:18;;;12941:62;13039:26;13019:18;;;13012:54;13083:19;;22249:168:0;12688:420:1;22249:168:0;22430:21;22439:2;22443:7;22430:8;:21::i;:::-;22118:341;22048:411;;:::o;32209:141::-;32320:21;;-1:-1:-1;;6957:2:1;6953:15;;;6949:53;32320:21:0;;;6937:66:1;32283:7:0;;7019:12:1;;32320:21:0;;;;;;;;;;;;;32310:32;;;;;;32303:39;;32209:141;;;:::o;23415:339::-;23610:41;9080:10;23643:7;23610:18;:41::i;:::-;23602:103;;;;-1:-1:-1;;;23602:103:0;;;;;;;:::i;:::-;23718:28;23728:4;23734:2;23738:7;23718:9;:28::i;36580:298::-;9701:6;;-1:-1:-1;;;;;9701:6:0;9080:10;9848:23;9840:68;;;;-1:-1:-1;;;9840:68:0;;;;;;;:::i;:::-;36704:8:::1;::::0;36692:20:::1;::::0;34360:4:::1;36692:20;:::i;:::-;36680:8;36666:11;;:22;;;;:::i;:::-;:46;;36658:82;;;::::0;-1:-1:-1;;;36658:82:0;;10183:2:1;36658:82:0::1;::::0;::::1;10165:21:1::0;10222:2;10202:18;;;10195:30;10261:25;10241:18;;;10234:53;10304:18;;36658:82:0::1;9981:347:1::0;36658:82:0::1;36756:9;36751:117;36771:8;36769:1;:10;36751:117;;;36802:11;:13:::0;;;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;36830:26;36840:3;36844:11;;36830:9;:26::i;:::-;36781:3:::0;::::1;::::0;::::1;:::i;:::-;;;;36751:117;;23825:185:::0;23963:39;23980:4;23986:2;23990:7;23963:39;;;;;;;;;;;;:16;:39::i;36468:100::-;9701:6;;-1:-1:-1;;;;;9701:6:0;9080:10;9848:23;9840:68;;;;-1:-1:-1;;;9840:68:0;;;;;;;:::i;:::-;36542:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;36468:100:::0;:::o;32632:401::-;32735:4;32771:7;9701:6;;-1:-1:-1;;;;;9701:6:0;;9628:87;32771:7;-1:-1:-1;;;;;32760:18:0;:7;-1:-1:-1;;;;;32760:18:0;;32752:59;;;;-1:-1:-1;;;32752:59:0;;18209:2:1;32752:59:0;;;18191:21:1;18248:2;18228:18;;;18221:30;18287;18267:18;;;18260:58;18335:18;;32752:59:0;18007:352:1;32752:59:0;32822:19;32844:26;32859:10;32844:14;:26::i;:::-;32822:48;;32881:28;32912:36;32936:11;32912:23;:36::i;:::-;32881:67;;33018:7;-1:-1:-1;;;;;32968:57:0;:46;32982:20;33004:9;32968:13;:46::i;:::-;-1:-1:-1;;;;;32968:57:0;;;32632:401;-1:-1:-1;;;;;32632:401:0:o;34782:829::-;34879:27;34886:7;9701:6;;-1:-1:-1;;;;;9701:6:0;;9628:87;34886:7;34895:10;34879:6;:27::i;:::-;34871:64;;;;-1:-1:-1;;;34871:64:0;;17856:2:1;34871:64:0;;;17838:21:1;17895:2;17875:18;;;17868:30;17934:26;17914:18;;;17907:54;17978:18;;34871:64:0;17654:348:1;34871:64:0;34971:10;34955:27;;;;:15;:27;;;;;;34998:1;;34955:38;;34985:8;;34955:38;:::i;:::-;34954:45;;34946:86;;;;-1:-1:-1;;;34946:86:0;;18566:2:1;34946:86:0;;;18548:21:1;18605:2;18585:18;;;18578:30;18644;18624:18;;;18617:58;18692:18;;34946:86:0;18364:352:1;34946:86:0;35077:8;35065:9;;:20;;;;:::i;:::-;35051:9;:35;;35043:69;;;;-1:-1:-1;;;35043:69:0;;20454:2:1;35043:69:0;;;20436:21:1;20493:2;20473:18;;;20466:30;-1:-1:-1;;;20512:18:1;;;20505:51;20573:18;;35043:69:0;20252:345:1;35043:69:0;35142:1;35131:8;;:12;35123:54;;;;-1:-1:-1;;;35123:54:0;;19325:2:1;35123:54:0;;;19307:21:1;19364:2;19344:18;;;19337:30;19403:31;19383:18;;;19376:59;19452:18;;35123:54:0;19123:353:1;35123:54:0;35191:12;35208:7;9701:6;;-1:-1:-1;;;;;9701:6:0;;9628:87;35208:7;-1:-1:-1;;;;;35208:12:0;35228:9;35208:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35190:52;;;35257:7;35253:351;;35281:32;;-1:-1:-1;;;35281:32:0;;13726:2:1;35281:32:0;;;13708:21:1;13765:2;13745:18;;;13738:30;-1:-1:-1;;;13784:18:1;;;13777:52;13846:18;;35281:32:0;13524:346:1;35253:351:0;35359:9;35354:189;35376:8;35372:1;:12;35354:189;;;35410:11;:13;;;:11;:13;;;:::i;:::-;;;;;;35442:34;35452:10;35464:11;;35442:9;:34::i;:::-;35511:10;35495:27;;;;:15;:27;;;;;:32;;35526:1;;35495:27;:32;;35526:1;;35495:32;:::i;:::-;;;;-1:-1:-1;35386:3:0;;-1:-1:-1;35386:3:0;;;:::i;:::-;;;;35354:189;;;;35579:8;35568;;:19;;;;:::i;:::-;35557:8;:30;34860:751;34782:829;;:::o;20634:239::-;20706:7;20742:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20742:16:0;20777:19;20769:73;;;;-1:-1:-1;;;20769:73:0;;14077:2:1;20769:73:0;;;14059:21:1;14116:2;14096:18;;;14089:30;14155:34;14135:18;;;14128:62;-1:-1:-1;;;14206:18:1;;;14199:39;14255:19;;20769:73:0;13875:405:1;35620:725:0;35710:10;;35691:15;:29;;35683:65;;;;-1:-1:-1;;;35683:65:0;;14487:2:1;35683:65:0;;;14469:21:1;14526:2;14506:18;;;14499:30;14565:25;14545:18;;;14538:53;14608:18;;35683:65:0;14285:347:1;35683:65:0;35808:8;;35796:20;;34360:4;35796:20;:::i;:::-;35782:8;35768:11;;:22;;;;:::i;:::-;35767:50;;35759:86;;;;-1:-1:-1;;;35759:86:0;;16678:2:1;35759:86:0;;;16660:21:1;16717:2;16697:18;;;16690:30;16756:25;16736:18;;;16729:53;16799:18;;35759:86:0;16476:347:1;35759:86:0;35875:1;35864:8;:12;:28;;;;;35891:1;35880:8;:12;;35864:28;35856:62;;;;-1:-1:-1;;;35856:62:0;;16328:2:1;35856:62:0;;;16310:21:1;16367:2;16347:18;;;16340:30;-1:-1:-1;;;16386:18:1;;;16379:51;16447:18;;35856:62:0;16126:345:1;35856:62:0;35963:8;35951:9;;:20;;;;:::i;:::-;35937:9;:35;;35929:69;;;;-1:-1:-1;;;35929:69:0;;20454:2:1;35929:69:0;;;20436:21:1;20493:2;20473:18;;;20466:30;-1:-1:-1;;;20512:18:1;;;20505:51;20573:18;;35929:69:0;20252:345:1;35929:69:0;36012:12;36029:7;9701:6;;-1:-1:-1;;;;;9701:6:0;;9628:87;36029:7;-1:-1:-1;;;;;36029:12:0;36049:9;36029:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36011:52;;;36078:7;36074:254;;36102:32;;-1:-1:-1;;;36102:32:0;;13726:2:1;36102:32:0;;;13708:21:1;13765:2;13745:18;;;13738:30;-1:-1:-1;;;13784:18:1;;;13777:52;13846:18;;36102:32:0;13524:346:1;36074:254:0;36180:9;36175:137;36197:8;36193:1;:12;36175:137;;;36231:11;:13;;;:11;:13;;;:::i;:::-;;;;;;36263:33;36273:10;36284:11;;36263:9;:33::i;:::-;36207:3;;;;:::i;:::-;;;;36175:137;;20364:208;20436:7;-1:-1:-1;;;;;20464:19:0;;20456:74;;;;-1:-1:-1;;;20456:74:0;;13315:2:1;20456:74:0;;;13297:21:1;13354:2;13334:18;;;13327:30;13393:34;13373:18;;;13366:62;-1:-1:-1;;;13444:18:1;;;13437:40;13494:19;;20456:74:0;13113:406:1;20456:74:0;-1:-1:-1;;;;;;20548:16:0;;;;;:9;:16;;;;;;;20364:208::o;10279:103::-;9701:6;;-1:-1:-1;;;;;9701:6:0;9080:10;9848:23;9840:68;;;;-1:-1:-1;;;9840:68:0;;;;;;;:::i;:::-;10344:30:::1;10371:1;10344:18;:30::i;:::-;10279:103::o:0;21109:104::-;21165:13;21198:7;21191:14;;;;;:::i;22818:295::-;-1:-1:-1;;;;;22921:24:0;;9080:10;22921:24;;22913:62;;;;-1:-1:-1;;;22913:62:0;;12123:2:1;22913:62:0;;;12105:21:1;12162:2;12142:18;;;12135:30;12201:27;12181:18;;;12174:55;12246:18;;22913:62:0;11921:349:1;22913:62:0;9080:10;22988:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22988:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22988:53:0;;;;;;;;;;23057:48;;9120:41:1;;;22988:42:0;;9080:10;23057:48;;9093:18:1;23057:48:0;;;;;;;22818:295;;:::o;24081:328::-;24256:41;9080:10;24289:7;24256:18;:41::i;:::-;24248:103;;;;-1:-1:-1;;;24248:103:0;;;;;;;:::i;:::-;24362:39;24376:4;24382:2;24386:7;24395:5;24362:13;:39::i;:::-;24081:328;;;;:::o;21290:343::-;25984:4;26008:16;;;:7;:16;;;;;;21363:13;;-1:-1:-1;;;;;26008:16:0;21389:76;;;;-1:-1:-1;;;21389:76:0;;17440:2:1;21389:76:0;;;17422:21:1;17479:2;17459:18;;;17452:30;17518:34;17498:18;;;17491:62;-1:-1:-1;;;17569:18:1;;;17562:45;17624:19;;21389:76:0;17238:411:1;21389:76:0;21478:21;21502:10;:8;:10::i;:::-;21478:34;;21554:1;21536:7;21530:21;:25;:95;;;;;;;;;;;;;;;;;21582:7;21591:18;:7;:16;:18::i;:::-;21565:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21530:95;21523:102;21290:343;-1:-1:-1;;;21290:343:0:o;36890:348::-;9701:6;;-1:-1:-1;;;;;9701:6:0;9080:10;9848:23;9840:68;;;;-1:-1:-1;;;9840:68:0;;;;;;;:::i;:::-;37045:12:::1;:19;37019:15;:22;:45;37010:84;;;::::0;-1:-1:-1;;;37010:84:0;;14839:2:1;37010:84:0::1;::::0;::::1;14821:21:1::0;14878:2;14858:18;;;14851:30;14917:27;14897:18;;;14890:55;14962:18;;37010:84:0::1;14637:349:1::0;37010:84:0::1;37112:9;37107:124;37127:15;:22;37125:1;:24;37107:124;;;37171:48;37183:15;37199:1;37183:18;;;;;;;;:::i;:::-;;;;;;;37203:12;37216:1;37203:15;;;;;;;;:::i;:::-;;;;;;;37171:11;:48::i;:::-;37151:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37107:124;;10537:201:::0;9701:6;;-1:-1:-1;;;;;9701:6:0;9080:10;9848:23;9840:68;;;;-1:-1:-1;;;9840:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10626:22:0;::::1;10618:73;;;::::0;-1:-1:-1;;;10618:73:0;;10954:2:1;10618:73:0::1;::::0;::::1;10936:21:1::0;10993:2;10973:18;;;10966:30;11032:34;11012:18;;;11005:62;-1:-1:-1;;;11083:18:1;;;11076:36;11129:19;;10618:73:0::1;10752:402:1::0;10618:73:0::1;10702:28;10721:8;10702:18;:28::i;:::-;10537:201:::0;:::o;36358:98::-;9701:6;;-1:-1:-1;;;;;9701:6:0;9080:10;9848:23;9840:68;;;;-1:-1:-1;;;9840:68:0;;;;;;;:::i;:::-;36428:9:::1;:20:::0;36358:98::o;29917:174::-;29992:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29992:29:0;-1:-1:-1;;;;;29992:29:0;;;;;;;;:24;;30046:23;29992:24;30046:14;:23::i;:::-;-1:-1:-1;;;;;30037:46:0;;;;;;;;;;;29917:174;;:::o;26213:348::-;26306:4;26008:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26008:16:0;26323:73;;;;-1:-1:-1;;;26323:73:0;;12477:2:1;26323:73:0;;;12459:21:1;12516:2;12496:18;;;12489:30;12555:34;12535:18;;;12528:62;-1:-1:-1;;;12606:18:1;;;12599:42;12658:19;;26323:73:0;12275:408:1;26323:73:0;26407:13;26423:23;26438:7;26423:14;:23::i;:::-;26407:39;;26476:5;-1:-1:-1;;;;;26465:16:0;:7;-1:-1:-1;;;;;26465:16:0;;:51;;;;26509:7;-1:-1:-1;;;;;26485:31:0;:20;26497:7;26485:11;:20::i;:::-;-1:-1:-1;;;;;26485:31:0;;26465:51;:87;;;-1:-1:-1;;;;;;23305:25:0;;;23281:4;23305:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26520:32;26457:96;26213:348;-1:-1:-1;;;;26213:348:0:o;29209:578::-;29368:4;-1:-1:-1;;;;;29341:31:0;:23;29356:7;29341:14;:23::i;:::-;-1:-1:-1;;;;;29341:31:0;;29333:85;;;;-1:-1:-1;;;29333:85:0;;17030:2:1;29333:85:0;;;17012:21:1;17069:2;17049:18;;;17042:30;17108:34;17088:18;;;17081:62;-1:-1:-1;;;17159:18:1;;;17152:39;17208:19;;29333:85:0;16828:405:1;29333:85:0;-1:-1:-1;;;;;29437:16:0;;29429:65;;;;-1:-1:-1;;;29429:65:0;;11718:2:1;29429:65:0;;;11700:21:1;11757:2;11737:18;;;11730:30;11796:34;11776:18;;;11769:62;-1:-1:-1;;;11847:18:1;;;11840:34;11891:19;;29429:65:0;11516:400:1;29429:65:0;29611:29;29628:1;29632:7;29611:8;:29::i;:::-;-1:-1:-1;;;;;29653:15:0;;;;;;:9;:15;;;;;:20;;29672:1;;29653:15;:20;;29672:1;;29653:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29684:13:0;;;;;;:9;:13;;;;;:18;;29701:1;;29684:13;:18;;29701:1;;29684:18;:::i;:::-;;;;-1:-1:-1;;29713:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29713:21:0;-1:-1:-1;;;;;29713:21:0;;;;;;;;;29752:27;;29713:16;;29752:27;;;;;;;29209:578;;;:::o;26903:110::-;26979:26;26989:2;26993:7;26979:26;;;;;;;;;;;;:9;:26::i;32358:266::-;32535:66;;7926::1;32535::0;;;7914:79:1;8009:12;;;8002:28;;;32462:7:0;;8046:12:1;;32535:66:0;7684:380:1;33041:282:0;33169:7;33195:9;33206;33217:7;33228:26;33243:10;33228:14;:26::i;:::-;33274:41;;;;;;;;;;;;9581:25:1;;;9654:4;9642:17;;9622:18;;;9615:45;;;;9676:18;;;9669:34;;;9719:18;;;9712:34;;;33194:60:0;;-1:-1:-1;33194:60:0;;-1:-1:-1;33194:60:0;-1:-1:-1;33274:41:0;;9553:19:1;;33274:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33274:41:0;;-1:-1:-1;;33274:41:0;;;33041:282;-1:-1:-1;;;;;;;33041:282:0:o;10898:191::-;10991:6;;;-1:-1:-1;;;;;11008:17:0;;;-1:-1:-1;;;;;;11008:17:0;;;;;;;11041:40;;10991:6;;;11008:17;10991:6;;11041:40;;10972:16;;11041:40;10961:128;10898:191;:::o;25291:315::-;25448:28;25458:4;25464:2;25468:7;25448:9;:28::i;:::-;25495:48;25518:4;25524:2;25528:7;25537:5;25495:22;:48::i;:::-;25487:111;;;;-1:-1:-1;;;25487:111:0;;;;;;;:::i;21881:99::-;21932:13;21965:7;21958:14;;;;;:::i;11286:723::-;11342:13;11563:10;11559:53;;-1:-1:-1;;11590:10:0;;;;;;;;;;;;-1:-1:-1;;;11590:10:0;;;;;11286:723::o;11559:53::-;11637:5;11622:12;11678:78;11685:9;;11678:78;;11711:8;;;;:::i;:::-;;-1:-1:-1;11734:10:0;;-1:-1:-1;11742:2:0;11734:10;;:::i;:::-;;;11678:78;;;11766:19;11798:6;11788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11788:17:0;;11766:39;;11816:154;11823:10;;11816:154;;11850:11;11860:1;11850:11;;:::i;:::-;;-1:-1:-1;11919:10:0;11927:2;11919:5;:10;:::i;:::-;11906:24;;:2;:24;:::i;:::-;11893:39;;11876:6;11883;11876:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11876:56:0;;;;;;;;-1:-1:-1;11947:11:0;11956:2;11947:11;;:::i;:::-;;;11816:154;;27240:321;27370:18;27376:2;27380:7;27370:5;:18::i;:::-;27421:54;27452:1;27456:2;27460:7;27469:5;27421:22;:54::i;:::-;27399:154;;;;-1:-1:-1;;;27399:154:0;;;;;;;:::i;33331:852::-;33436:9;33460;33484:7;33527:3;:10;33541:2;33527:16;33519:53;;;;-1:-1:-1;;;33519:53:0;;20101:2:1;33519:53:0;;;20083:21:1;20140:2;20120:18;;;20113:30;20179:26;20159:18;;;20152:54;20223:18;;33519:53:0;19899:348:1;33519:53:0;-1:-1:-1;;;33981:2:0;33972:12;;33966:19;34051:2;34042:12;;34036:19;34158:2;34149:12;;;34143:19;33966;;34140:1;34135:28;;;;;33331:852::o;30656:799::-;30811:4;-1:-1:-1;;;;;30832:13:0;;1957:20;2005:8;30828:620;;30868:72;;-1:-1:-1;;;30868:72:0;;-1:-1:-1;;;;;30868:36:0;;;;;:72;;9080:10;;30919:4;;30925:7;;30934:5;;30868:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30868:72:0;;;;;;;;-1:-1:-1;;30868:72:0;;;;;;;;;;;;:::i;:::-;;;30864:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31110:13:0;;31106:272;;31153:60;;-1:-1:-1;;;31153:60:0;;;;;;;:::i;31106:272::-;31328:6;31322:13;31313:6;31309:2;31305:15;31298:38;30864:529;-1:-1:-1;;;;;;30991:51:0;-1:-1:-1;;;30991:51:0;;-1:-1:-1;30984:58:0;;30828:620;-1:-1:-1;31432:4:0;30656:799;;;;;;:::o;27897:386::-;-1:-1:-1;;;;;27977:16:0;;27969:61;;;;-1:-1:-1;;;27969:61:0;;15193:2:1;27969:61:0;;;15175:21:1;;;15212:18;;;15205:30;15271:34;15251:18;;;15244:62;15323:18;;27969:61:0;14991:356:1;27969:61:0;25984:4;26008:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26008:16:0;:30;28041:58;;;;-1:-1:-1;;;28041:58:0;;11361:2:1;28041:58:0;;;11343:21:1;11400:2;11380:18;;;11373:30;11439;11419:18;;;11412:58;11487:18;;28041:58:0;11159:352:1;28041:58:0;-1:-1:-1;;;;;28170:13:0;;;;;;:9;:13;;;;;:18;;28187:1;;28170:13;:18;;28187:1;;28170:18;:::i;:::-;;;;-1:-1:-1;;28199:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28199:21:0;-1:-1:-1;;;;;28199:21:0;;;;;;;;28242:33;;28199:16;;;28242:33;;28199:16;;28242:33;27897:386;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:673::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:163;1098:2;1095:1;1092:9;1084:163;;;1155:17;;1143:30;;1193:12;;;;1225;;;;1116:1;1109:9;1084:163;;;-1:-1:-1;1265:5:1;;603:673;-1:-1:-1;;;;;;;603:673:1:o;1281:220::-;1323:5;1376:3;1369:4;1361:6;1357:17;1353:27;1343:55;;1394:1;1391;1384:12;1343:55;1416:79;1491:3;1482:6;1469:20;1462:4;1454:6;1450:17;1416:79;:::i;1506:186::-;1565:6;1618:2;1606:9;1597:7;1593:23;1589:32;1586:52;;;1634:1;1631;1624:12;1586:52;1657:29;1676:9;1657:29;:::i;1697:260::-;1765:6;1773;1826:2;1814:9;1805:7;1801:23;1797:32;1794:52;;;1842:1;1839;1832:12;1794:52;1865:29;1884:9;1865:29;:::i;:::-;1855:39;;1913:38;1947:2;1936:9;1932:18;1913:38;:::i;:::-;1903:48;;1697:260;;;;;:::o;1962:328::-;2039:6;2047;2055;2108:2;2096:9;2087:7;2083:23;2079:32;2076:52;;;2124:1;2121;2114:12;2076:52;2147:29;2166:9;2147:29;:::i;:::-;2137:39;;2195:38;2229:2;2218:9;2214:18;2195:38;:::i;:::-;2185:48;;2280:2;2269:9;2265:18;2252:32;2242:42;;1962:328;;;;;:::o;2295:537::-;2390:6;2398;2406;2414;2467:3;2455:9;2446:7;2442:23;2438:33;2435:53;;;2484:1;2481;2474:12;2435:53;2507:29;2526:9;2507:29;:::i;:::-;2497:39;;2555:38;2589:2;2578:9;2574:18;2555:38;:::i;:::-;2545:48;;2640:2;2629:9;2625:18;2612:32;2602:42;;2695:2;2684:9;2680:18;2667:32;2722:18;2714:6;2711:30;2708:50;;;2754:1;2751;2744:12;2708:50;2777:49;2818:7;2809:6;2798:9;2794:22;2777:49;:::i;:::-;2767:59;;;2295:537;;;;;;;:::o;2837:347::-;2902:6;2910;2963:2;2951:9;2942:7;2938:23;2934:32;2931:52;;;2979:1;2976;2969:12;2931:52;3002:29;3021:9;3002:29;:::i;:::-;2992:39;;3081:2;3070:9;3066:18;3053:32;3128:5;3121:13;3114:21;3107:5;3104:32;3094:60;;3150:1;3147;3140:12;3094:60;3173:5;3163:15;;;2837:347;;;;;:::o;3189:394::-;3266:6;3274;3327:2;3315:9;3306:7;3302:23;3298:32;3295:52;;;3343:1;3340;3333:12;3295:52;3366:29;3385:9;3366:29;:::i;:::-;3356:39;;3446:2;3435:9;3431:18;3418:32;3473:18;3465:6;3462:30;3459:50;;;3505:1;3502;3495:12;3459:50;3528:49;3569:7;3560:6;3549:9;3545:22;3528:49;:::i;:::-;3518:59;;;3189:394;;;;;:::o;3588:254::-;3656:6;3664;3717:2;3705:9;3696:7;3692:23;3688:32;3685:52;;;3733:1;3730;3723:12;3685:52;3756:29;3775:9;3756:29;:::i;:::-;3746:39;3832:2;3817:18;;;;3804:32;;-1:-1:-1;;;3588:254:1:o;3847:1157::-;3965:6;3973;4026:2;4014:9;4005:7;4001:23;3997:32;3994:52;;;4042:1;4039;4032:12;3994:52;4082:9;4069:23;4111:18;4152:2;4144:6;4141:14;4138:34;;;4168:1;4165;4158:12;4138:34;4206:6;4195:9;4191:22;4181:32;;4251:7;4244:4;4240:2;4236:13;4232:27;4222:55;;4273:1;4270;4263:12;4222:55;4309:2;4296:16;4331:4;4355:60;4371:43;4411:2;4371:43;:::i;4355:60::-;4437:3;4461:2;4456:3;4449:15;4489:2;4484:3;4480:12;4473:19;;4520:2;4516;4512:11;4568:7;4563:2;4557;4554:1;4550:10;4546:2;4542:19;4538:28;4535:41;4532:61;;;4589:1;4586;4579:12;4532:61;4611:1;4602:10;;4621:169;4635:2;4632:1;4629:9;4621:169;;;4692:23;4711:3;4692:23;:::i;:::-;4680:36;;4653:1;4646:9;;;;;4736:12;;;;4768;;4621:169;;;-1:-1:-1;4809:5:1;-1:-1:-1;;4852:18:1;;4839:32;;-1:-1:-1;;4883:16:1;;;4880:36;;;4912:1;4909;4902:12;4880:36;;4935:63;4990:7;4979:8;4968:9;4964:24;4935:63;:::i;5009:245::-;5067:6;5120:2;5108:9;5099:7;5095:23;5091:32;5088:52;;;5136:1;5133;5126:12;5088:52;5175:9;5162:23;5194:30;5218:5;5194:30;:::i;5259:249::-;5328:6;5381:2;5369:9;5360:7;5356:23;5352:32;5349:52;;;5397:1;5394;5387:12;5349:52;5429:9;5423:16;5448:30;5472:5;5448:30;:::i;5513:388::-;5590:6;5598;5651:2;5639:9;5630:7;5626:23;5622:32;5619:52;;;5667:1;5664;5657:12;5619:52;5707:9;5694:23;5740:18;5732:6;5729:30;5726:50;;;5772:1;5769;5762:12;5726:50;5795:49;5836:7;5827:6;5816:9;5812:22;5795:49;:::i;:::-;5785:59;5891:2;5876:18;;;;5863:32;;-1:-1:-1;;;;5513:388:1:o;5906:450::-;5975:6;6028:2;6016:9;6007:7;6003:23;5999:32;5996:52;;;6044:1;6041;6034:12;5996:52;6084:9;6071:23;6117:18;6109:6;6106:30;6103:50;;;6149:1;6146;6139:12;6103:50;6172:22;;6225:4;6217:13;;6213:27;-1:-1:-1;6203:55:1;;6254:1;6251;6244:12;6203:55;6277:73;6342:7;6337:2;6324:16;6319:2;6315;6311:11;6277:73;:::i;6361:180::-;6420:6;6473:2;6461:9;6452:7;6448:23;6444:32;6441:52;;;6489:1;6486;6479:12;6441:52;-1:-1:-1;6512:23:1;;6361:180;-1:-1:-1;6361:180:1:o;6546:257::-;6587:3;6625:5;6619:12;6652:6;6647:3;6640:19;6668:63;6724:6;6717:4;6712:3;6708:14;6701:4;6694:5;6690:16;6668:63;:::i;:::-;6785:2;6764:15;-1:-1:-1;;6760:29:1;6751:39;;;;6792:4;6747:50;;6546:257;-1:-1:-1;;6546:257:1:o;7042:637::-;7322:3;7360:6;7354:13;7376:53;7422:6;7417:3;7410:4;7402:6;7398:17;7376:53;:::i;:::-;7492:13;;7451:16;;;;7514:57;7492:13;7451:16;7548:4;7536:17;;7514:57;:::i;:::-;-1:-1:-1;;;7593:20:1;;7622:22;;;7671:1;7660:13;;7042:637;-1:-1:-1;;;;7042:637:1:o;8487:488::-;-1:-1:-1;;;;;8756:15:1;;;8738:34;;8808:15;;8803:2;8788:18;;8781:43;8855:2;8840:18;;8833:34;;;8903:3;8898:2;8883:18;;8876:31;;;8681:4;;8924:45;;8949:19;;8941:6;8924:45;:::i;:::-;8916:53;8487:488;-1:-1:-1;;;;;;8487:488:1:o;9757:219::-;9906:2;9895:9;9888:21;9869:4;9926:44;9966:2;9955:9;9951:18;9943:6;9926:44;:::i;10333:414::-;10535:2;10517:21;;;10574:2;10554:18;;;10547:30;10613:34;10608:2;10593:18;;10586:62;-1:-1:-1;;;10679:2:1;10664:18;;10657:48;10737:3;10722:19;;10333:414::o;15765:356::-;15967:2;15949:21;;;15986:18;;;15979:30;16045:34;16040:2;16025:18;;16018:62;16112:2;16097:18;;15765:356::o;19481:413::-;19683:2;19665:21;;;19722:2;19702:18;;;19695:30;19761:34;19756:2;19741:18;;19734:62;-1:-1:-1;;;19827:2:1;19812:18;;19805:47;19884:3;19869:19;;19481:413::o;20784:275::-;20855:2;20849:9;20920:2;20901:13;;-1:-1:-1;;20897:27:1;20885:40;;20955:18;20940:34;;20976:22;;;20937:62;20934:88;;;21002:18;;:::i;:::-;21038:2;21031:22;20784:275;;-1:-1:-1;20784:275:1:o;21064:183::-;21124:4;21157:18;21149:6;21146:30;21143:56;;;21179:18;;:::i;:::-;-1:-1:-1;21224:1:1;21220:14;21236:4;21216:25;;21064:183::o;21252:128::-;21292:3;21323:1;21319:6;21316:1;21313:13;21310:39;;;21329:18;;:::i;:::-;-1:-1:-1;21365:9:1;;21252:128::o;21385:120::-;21425:1;21451;21441:35;;21456:18;;:::i;:::-;-1:-1:-1;21490:9:1;;21385:120::o;21510:168::-;21550:7;21616:1;21612;21608:6;21604:14;21601:1;21598:21;21593:1;21586:9;21579:17;21575:45;21572:71;;;21623:18;;:::i;:::-;-1:-1:-1;21663:9:1;;21510:168::o;21683:125::-;21723:4;21751:1;21748;21745:8;21742:34;;;21756:18;;:::i;:::-;-1:-1:-1;21793:9:1;;21683:125::o;21813:258::-;21885:1;21895:113;21909:6;21906:1;21903:13;21895:113;;;21985:11;;;21979:18;21966:11;;;21959:39;21931:2;21924:10;21895:113;;;22026:6;22023:1;22020:13;22017:48;;;-1:-1:-1;;22061:1:1;22043:16;;22036:27;21813:258::o;22076:380::-;22155:1;22151:12;;;;22198;;;22219:61;;22273:4;22265:6;22261:17;22251:27;;22219:61;22326:2;22318:6;22315:14;22295:18;22292:38;22289:161;;;22372:10;22367:3;22363:20;22360:1;22353:31;22407:4;22404:1;22397:15;22435:4;22432:1;22425:15;22289:161;;22076:380;;;:::o;22461:135::-;22500:3;-1:-1:-1;;22521:17:1;;22518:43;;;22541:18;;:::i;:::-;-1:-1:-1;22588:1:1;22577:13;;22461:135::o;22601:112::-;22633:1;22659;22649:35;;22664:18;;:::i;:::-;-1:-1:-1;22698:9:1;;22601:112::o;22718:127::-;22779:10;22774:3;22770:20;22767:1;22760:31;22810:4;22807:1;22800:15;22834:4;22831:1;22824:15;22850:127;22911:10;22906:3;22902:20;22899:1;22892:31;22942:4;22939:1;22932:15;22966:4;22963:1;22956:15;22982:127;23043:10;23038:3;23034:20;23031:1;23024:31;23074:4;23071:1;23064:15;23098:4;23095:1;23088:15;23114:127;23175:10;23170:3;23166:20;23163:1;23156:31;23206:4;23203:1;23196:15;23230:4;23227:1;23220:15;23246:131;-1:-1:-1;;;;;;23320:32:1;;23310:43;;23300:71;;23367:1;23364;23357:12

Swarm Source

ipfs://bfe8fb37ecc274c502c98b6ab064259f59e7ca8bcc6b368703f46113203ef651
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.