ETH Price: $3,414.60 (+3.09%)

Token

TheStarslab (TSL)
 

Overview

Max Total Supply

1,390 TSL

Holders

824

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 TSL
0x8Ee4CfB37A0b9863364806b2d8a809D03F10BDd2
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:
TheStarslab

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-25
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
 /**
 ______ __                  ____    __                        __              __        
/\__  _/\ \                /\  _`\ /\ \__                    /\ \            /\ \       
\/_/\ \\ \ \___      __    \ \,\L\_\ \ ,_\    __    _ __  ___\ \ \        __ \ \ \____  
   \ \ \\ \  _ `\  /'__`\   \/_\__ \\ \ \/  /'__`\ /\`'__/',__\ \ \  __ /'__`\\ \ '__`\ 
    \ \ \\ \ \ \ \/\  __/     /\ \L\ \ \ \_/\ \L\.\\ \ \/\__, `\ \ \L\ /\ \L\.\\ \ \L\ \
     \ \_\\ \_\ \_\ \____\    \ `\____\ \__\ \__/.\_\ \_\/\____/\ \____\ \__/.\_\ \_,__/
      \/_/ \/_/\/_/\/____/     \/_____/\/__/\/__/\/_/\/_/\/___/  \/___/ \/__/\/_/\/___/ 
  */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721.sol

pragma solidity ^0.8.9;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol

pragma solidity ^0.8.9;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Metadata.sol

pragma solidity ^0.8.9;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: node_modules\openzeppelin-solidity\contracts\utils\Address.sol

pragma solidity ^0.8.9;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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.9/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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: node_modules\openzeppelin-solidity\contracts\utils\Context.sol

pragma solidity ^0.8.9;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: node_modules\openzeppelin-solidity\contracts\utils\Strings.sol

pragma solidity ^0.8.9;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: node_modules\openzeppelin-solidity\contracts\utils\introspection\ERC165.sol

pragma solidity ^0.8.9;

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721.sol

pragma solidity ^0.8.9;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: node_modules\openzeppelin-solidity\contracts\token\ERC721\extensions\IERC721Enumerable.sol

pragma solidity ^0.8.9;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: openzeppelin-solidity\contracts\access\Ownable.sol

pragma solidity ^0.8.9;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;
    address private _creator;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _creator = msgSender;
        emit OwnershipTransferred(address(0), 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() || _creator == _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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: openzeppelin-solidity\contracts\token\ERC721\extensions\ERC721Enumerable.sol

pragma solidity ^0.8.9;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts\lib\Counters.sol

pragma solidity ^0.8.9;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        {
            counter._value = value - 1;
        }
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.9;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


pragma solidity ^0.8.9;

contract TheStarslab is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;

    address payable private _PaymentAddress1 = payable(0x7d0F904ccCc7fA01383d5cEd1944774BAc3508b3);
    address payable private _PaymentAddress2 = payable(0x39968b14C7A25ce05072dafe2caa4D6a3Bb6b839);

    uint256 public MAX_SUPPLY = 9999;
    uint256 public PRESALE_PRICE = 0.25 ether; // 0.25 ETH
    uint256 public PUBLIC_PRICE = 0.25 ether; // 0.25 ETH
    uint256 private REVEAL_DELAY = 144 hours;
    uint256 private PRESALE_HOURS = 24 hours;
    uint256 public PRESALE_MINT_LIMIT = 2;
    uint256 public PUBLIC_MINT_LIMIT = 1;

    mapping(address => uint256) _mappingPresaleMintCount;
    mapping(address => uint256) _mappingPublicMintCount;

    bytes32 private _whitelistRoot;

    uint256 private _activeDateTime = 1646092800; // Date and time (GMT): Tuesday, March 1, 2022 12:00:00 AM

    string private _tokenBaseURI = "";
    string private _revealURI = "";

    Counters.Counter private _publicCounter;

    constructor() ERC721("TheStarslab", "TSL") {}

    function setPaymentAddress(address paymentAddress1, address paymentAddress2) external onlyOwner {
        _PaymentAddress1 = payable(paymentAddress1);
        _PaymentAddress2 = payable(paymentAddress2);
    }

    function setActiveDateTime(uint256 activeDateTime) external onlyOwner {
        _activeDateTime = activeDateTime;
    }

    function setRevealDelay(uint256 revealDelay) external onlyOwner {
        REVEAL_DELAY = revealDelay;
    }

    function setPresaleHours(uint256 presaleHours) external onlyOwner {
        PRESALE_HOURS = presaleHours;
    }

    function setMintPrice(uint256 presaleMintPrice, uint256 publicMintPrice) external onlyOwner {
        PRESALE_PRICE = presaleMintPrice;
        PUBLIC_PRICE = publicMintPrice;
    }

    function setMaxLimit(uint256 maxLimit) external onlyOwner {
        MAX_SUPPLY = maxLimit;
    }

    function setPurchaseLimit( uint256 presaleMintLimit, uint256 publicMintLimit) external onlyOwner {
        PRESALE_MINT_LIMIT = presaleMintLimit;
        PUBLIC_MINT_LIMIT = publicMintLimit;
    }

    function setRevealURI(string memory revealURI) external onlyOwner {
        _revealURI = revealURI;
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        _tokenBaseURI = baseURI;
    }

    function airdrop(address[] memory airdropAddress, uint256 numberOfTokens) external onlyOwner {
        for (uint256 k = 0; k < airdropAddress.length; k++) {
            for (uint256 i = 0; i < numberOfTokens; i++) {
                uint256 tokenId = _publicCounter.current();

                if (_publicCounter.current() < MAX_SUPPLY) {
                    _publicCounter.increment();
                    if (!_exists(tokenId)) _safeMint(airdropAddress[k], tokenId);
                }
            }
        }
    }

    function setWhiteListRoot(bytes32 root) external onlyOwner {
        _whitelistRoot = root;
    }

    // Verify that a given leaf is in the tree.
    function isWhiteListed(bytes32 _leafNode, bytes32[] memory proof) internal view returns (bool) {
        return MerkleProof.verify(proof, _whitelistRoot, _leafNode);
    }

    // Generate the leaf node (just the hash of tokenID concatenated with the account address)
    function toLeaf(address account, uint256 index, uint256 amount) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(index, account, amount));
    }

    function presale(uint256 numberOfTokens, uint256 index, uint256 amount, bytes32[] calldata proof) external payable {
        require( _publicCounter.current() < MAX_SUPPLY, "Purchase would exceed MAX_SUPPLY");

        if (msg.sender != owner()) {
            require(isWhiteListed(toLeaf(msg.sender, index, amount), proof), "Invalid proof");
            
            require(block.timestamp > _activeDateTime - PRESALE_HOURS,"Contract is not active for presale");

            _mappingPresaleMintCount[msg.sender] = _mappingPresaleMintCount[msg.sender] + numberOfTokens;
            require(_mappingPresaleMintCount[msg.sender] <= PRESALE_MINT_LIMIT, "Overflow for PRESALE_MINT_LIMIT");

            require( PRESALE_PRICE * numberOfTokens <= msg.value, "ETH amount is not sufficient");
        }

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicCounter.current();

            if (_publicCounter.current() < MAX_SUPPLY) {
                _publicCounter.increment();
                _safeMint(msg.sender, tokenId);
            }
        }
    }

    function purchase(uint256 numberOfTokens) external payable {
        require( _publicCounter.current() < MAX_SUPPLY, "Purchase would exceed MAX_SUPPLY");

        if (msg.sender != owner()) {
            require( block.timestamp > _activeDateTime, "Contract is not active");

            _mappingPublicMintCount[msg.sender] = _mappingPublicMintCount[msg.sender] + numberOfTokens;
            require(_mappingPublicMintCount[msg.sender] <= PUBLIC_MINT_LIMIT, "Overflow for PUBLIC_MINT_LIMIT");

            require( PUBLIC_PRICE * numberOfTokens <= msg.value, "ETH amount is not sufficient");
        }

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = _publicCounter.current();

            if (_publicCounter.current() < MAX_SUPPLY) {
                _publicCounter.increment();
                _safeMint(msg.sender, tokenId);
            }
        }
    }

    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Token does not exist");

        if (_activeDateTime + REVEAL_DELAY < block.timestamp) {
            return string(abi.encodePacked(_tokenBaseURI, tokenId.toString()));
        }

        return _revealURI;
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        uint256 amount1 = (balance * 9500) / 10000; // 95%
        uint256 amount2 = (balance * 500) / 10000; // 5%
        _PaymentAddress1.transfer(amount1);
        _PaymentAddress2.transfer(amount2);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropAddress","type":"address[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdrop","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"activeDateTime","type":"uint256"}],"name":"setActiveDateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxLimit","type":"uint256"}],"name":"setMaxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintPrice","type":"uint256"},{"internalType":"uint256","name":"publicMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"paymentAddress1","type":"address"},{"internalType":"address","name":"paymentAddress2","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleHours","type":"uint256"}],"name":"setPresaleHours","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintLimit","type":"uint256"},{"internalType":"uint256","name":"publicMintLimit","type":"uint256"}],"name":"setPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealDelay","type":"uint256"}],"name":"setRevealDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealURI","type":"string"}],"name":"setRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWhiteListRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600c80546001600160a01b0319908116737d0f904cccc7fa01383d5ced1944774bac3508b317909155600d80549091167339968b14c7a25ce05072dafe2caa4d6a3bb6b83917905561270f600e556703782dace9d90000600f8190556010556207e900601155620151806012556002601355600160145563621d620060185560a06040819052600060808190526200009a91601991620001a7565b50604080516020810191829052600090819052620000bb91601a91620001a7565b50348015620000c957600080fd5b50604080518082018252600b81526a2a3432a9ba30b939b630b160a91b6020808301918252835180850190945260038452621514d360ea1b9084015281519192916200011891600091620001a7565b5080516200012e906001906020840190620001a7565b505050600062000143620001a360201b60201c565b600a80546001600160a01b0383166001600160a01b03199182168117909255600b805490911682179055604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200028a565b3390565b828054620001b5906200024d565b90600052602060002090601f016020900481019282620001d9576000855562000224565b82601f10620001f457805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022457825182559160200191906001019062000207565b506200023292915062000236565b5090565b5b8082111562000232576000815560010162000237565b600181811c908216806200026257607f821691505b602082108114156200028457634e487b7160e01b600052602260045260246000fd5b50919050565b612bcb806200029a6000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063bceae77b116100ab578063e985e9c51161006f578063e985e9c514610622578063efef39a11461066b578063f2fde38b1461067e578063f5ebec801461069e578063fefd229d146106b457600080fd5b8063bceae77b1461058c578063bf8bcee4146105a2578063c204642c146105c2578063c87b56dd146105e2578063e62207701461060257600080fd5b8063a22cb465116100f2578063a22cb465146104ec578063a68c25d81461050c578063a811a37b1461052c578063b44302a31461054c578063b88d4fde1461056c57600080fd5b8063715018a614610491578063848da3b9146104a65780638da5cb5b146104b957806395d89b41146104d757600080fd5b80633ccfd60b116101b157806355f804b31161017557806355f804b314610405578063611f3f101461042557806362dc6e211461043b5780636352211e1461045157806370a082311461047157600080fd5b80633ccfd60b146103705780634080a9b81461038557806342842e0e146103a557806345149bb3146103c55780634f6ccce7146103e557600080fd5b8063095ea7b3116101f8578063095ea7b3146102db57806318160ddd146102fb57806323b872dd1461031a5780632f745c591461033a57806332cb6b0c1461035a57600080fd5b806301ffc9a71461022a5780630442bfa81461025f57806306fdde0314610281578063081812fc146102a3575b600080fd5b34801561023657600080fd5b5061024a610245366004612406565b6106d4565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027f61027a366004612423565b6106ff565b005b34801561028d57600080fd5b50610296610752565b604051610256919061249d565b3480156102af57600080fd5b506102c36102be3660046124b0565b6107e4565b6040516001600160a01b039091168152602001610256565b3480156102e757600080fd5b5061027f6102f63660046124e5565b610879565b34801561030757600080fd5b506008545b604051908152602001610256565b34801561032657600080fd5b5061027f61033536600461250f565b61098f565b34801561034657600080fd5b5061030c6103553660046124e5565b6109c0565b34801561036657600080fd5b5061030c600e5481565b34801561037c57600080fd5b5061027f610a56565b34801561039157600080fd5b5061027f6103a036600461254b565b610b4a565b3480156103b157600080fd5b5061027f6103c036600461250f565b610bb7565b3480156103d157600080fd5b5061027f6103e03660046124b0565b610bd2565b3480156103f157600080fd5b5061030c6104003660046124b0565b610c16565b34801561041157600080fd5b5061027f61042036600461261d565b610ca9565b34801561043157600080fd5b5061030c60105481565b34801561044757600080fd5b5061030c600f5481565b34801561045d57600080fd5b506102c361046c3660046124b0565b610cff565b34801561047d57600080fd5b5061030c61048c366004612666565b610d76565b34801561049d57600080fd5b5061027f610dfd565b61027f6104b4366004612681565b610e86565b3480156104c557600080fd5b50600a546001600160a01b03166102c3565b3480156104e357600080fd5b50610296611143565b3480156104f857600080fd5b5061027f610507366004612711565b611152565b34801561051857600080fd5b5061027f6105273660046124b0565b611217565b34801561053857600080fd5b5061027f61054736600461261d565b61125b565b34801561055857600080fd5b5061027f6105673660046124b0565b6112ad565b34801561057857600080fd5b5061027f61058736600461274d565b6112f1565b34801561059857600080fd5b5061030c60145481565b3480156105ae57600080fd5b5061027f6105bd3660046124b0565b611323565b3480156105ce57600080fd5b5061027f6105dd3660046127c9565b611367565b3480156105ee57600080fd5b506102966105fd3660046124b0565b61144b565b34801561060e57600080fd5b5061027f61061d3660046124b0565b611584565b34801561062e57600080fd5b5061024a61063d36600461254b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61027f6106793660046124b0565b6115c8565b34801561068a57600080fd5b5061027f610699366004612666565b6117a3565b3480156106aa57600080fd5b5061030c60135481565b3480156106c057600080fd5b5061027f6106cf366004612423565b6118a3565b60006001600160e01b0319821663780e9d6360e01b14806106f957506106f9826118ed565b92915050565b600a546001600160a01b03163314806107225750600b546001600160a01b031633145b6107475760405162461bcd60e51b815260040161073e9061287c565b60405180910390fd5b600f91909155601055565b606060008054610761906128b1565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906128b1565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661085d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161073e565b506000908152600460205260409020546001600160a01b031690565b600061088482610cff565b9050806001600160a01b0316836001600160a01b031614156108f25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161073e565b336001600160a01b038216148061090e575061090e813361063d565b6109805760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161073e565b61098a838361193d565b505050565b61099933826119ab565b6109b55760405162461bcd60e51b815260040161073e906128ec565b61098a838383611aa2565b60006109cb83610d76565b8210610a2d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161073e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331480610a795750600b546001600160a01b031633145b610a955760405162461bcd60e51b815260040161073e9061287c565b476000612710610aa78361251c612953565b610ab19190612988565b90506000612710610ac4846101f4612953565b610ace9190612988565b600c546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015610b09573d6000803e3d6000fd5b50600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b44573d6000803e3d6000fd5b50505050565b600a546001600160a01b0316331480610b6d5750600b546001600160a01b031633145b610b895760405162461bcd60e51b815260040161073e9061287c565b600c80546001600160a01b039384166001600160a01b031991821617909155600d8054929093169116179055565b61098a838383604051806020016040528060008152506112f1565b600a546001600160a01b0316331480610bf55750600b546001600160a01b031633145b610c115760405162461bcd60e51b815260040161073e9061287c565b601755565b6000610c2160085490565b8210610c845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161073e565b60088281548110610c9757610c9761299c565b90600052602060002001549050919050565b600a546001600160a01b0316331480610ccc5750600b546001600160a01b031633145b610ce85760405162461bcd60e51b815260040161073e9061287c565b8051610cfb906019906020840190612354565b5050565b6000818152600260205260408120546001600160a01b0316806106f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161073e565b60006001600160a01b038216610de15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161073e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331480610e205750600b546001600160a01b031633145b610e3c5760405162461bcd60e51b815260040161073e9061287c565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600e54601b5410610ed95760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564204d41585f535550504c59604482015260640161073e565b600a546001600160a01b031633146110ea576040805160208082018790526bffffffffffffffffffffffff193360601b168284015260548083018790528351808403909101815260749092019092528051910120610f6a90838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c4d92505050565b610fa65760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161073e565b601254601854610fb691906129b2565b421161100f5760405162461bcd60e51b815260206004820152602260248201527f436f6e7472616374206973206e6f742061637469766520666f722070726573616044820152616c6560f01b606482015260840161073e565b3360009081526015602052604090205461102a9086906129c9565b336000908152601560205260409020819055601354101561108d5760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720666f722050524553414c455f4d494e545f4c494d495400604482015260640161073e565b3485600f5461109c9190612953565b11156110ea5760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604482015260640161073e565b60005b8581101561113b576000611100601b5490565b9050600e5461110e601b5490565b10156111285761111e601b611c63565b6111283382611c80565b5080611133816129e1565b9150506110ed565b505050505050565b606060018054610761906128b1565b6001600160a01b0382163314156111ab5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161073e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633148061123a5750600b546001600160a01b031633145b6112565760405162461bcd60e51b815260040161073e9061287c565b601155565b600a546001600160a01b031633148061127e5750600b546001600160a01b031633145b61129a5760405162461bcd60e51b815260040161073e9061287c565b8051610cfb90601a906020840190612354565b600a546001600160a01b03163314806112d05750600b546001600160a01b031633145b6112ec5760405162461bcd60e51b815260040161073e9061287c565b601255565b6112fb33836119ab565b6113175760405162461bcd60e51b815260040161073e906128ec565b610b4484848484611c9a565b600a546001600160a01b03163314806113465750600b546001600160a01b031633145b6113625760405162461bcd60e51b815260040161073e9061287c565b600e55565b600a546001600160a01b031633148061138a5750600b546001600160a01b031633145b6113a65760405162461bcd60e51b815260040161073e9061287c565b60005b825181101561098a5760005b828110156114385760006113c8601b5490565b9050600e546113d6601b5490565b1015611425576113e6601b611c63565b6000818152600260205260409020546001600160a01b0316611425576114258584815181106114175761141761299c565b602002602001015182611c80565b5080611430816129e1565b9150506113b5565b5080611443816129e1565b9150506113a9565b6000818152600260205260409020546060906001600160a01b03166114a95760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161073e565b426011546018546114ba91906129c9565b10156114f25760196114cb83611ccd565b6040516020016114dc929190612a18565b6040516020818303038152906040529050919050565b601a80546114ff906128b1565b80601f016020809104026020016040519081016040528092919081815260200182805461152b906128b1565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b50505050509050919050565b600a546001600160a01b03163314806115a75750600b546001600160a01b031633145b6115c35760405162461bcd60e51b815260040161073e9061287c565b601855565b600e54601b541061161b5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564204d41585f535550504c59604482015260640161073e565b600a546001600160a01b031633146117525760185442116116775760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161073e565b336000908152601660205260409020546116929082906129c9565b33600090815260166020526040902081905560145410156116f55760405162461bcd60e51b815260206004820152601e60248201527f4f766572666c6f7720666f72205055424c49435f4d494e545f4c494d49540000604482015260640161073e565b34816010546117049190612953565b11156117525760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604482015260640161073e565b60005b81811015610cfb576000611768601b5490565b9050600e54611776601b5490565b101561179057611786601b611c63565b6117903382611c80565b508061179b816129e1565b915050611755565b600a546001600160a01b03163314806117c65750600b546001600160a01b031633145b6117e25760405162461bcd60e51b815260040161073e9061287c565b6001600160a01b0381166118475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161073e565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314806118c65750600b546001600160a01b031633145b6118e25760405162461bcd60e51b815260040161073e9061287c565b601391909155601455565b60006001600160e01b031982166380ac58cd60e01b148061191e57506001600160e01b03198216635b5e139f60e01b145b806106f957506301ffc9a760e01b6001600160e01b03198316146106f9565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197282610cff565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161073e565b6000611a2f83610cff565b9050806001600160a01b0316846001600160a01b03161480611a6a5750836001600160a01b0316611a5f846107e4565b6001600160a01b0316145b80611a9a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ab582610cff565b6001600160a01b031614611b1d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161073e565b6001600160a01b038216611b7f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161073e565b611b8a838383611dcb565b611b9560008261193d565b6001600160a01b0383166000908152600360205260408120805460019290611bbe9084906129b2565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bec9084906129c9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611c5c8260175485611e83565b9392505050565b6001816000016000828254611c7891906129c9565b909155505050565b610cfb828260405180602001604052806000815250611e99565b611ca5848484611aa2565b611cb184848484611ecc565b610b445760405162461bcd60e51b815260040161073e90612abf565b606081611cf15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d1b5780611d05816129e1565b9150611d149050600a83612988565b9150611cf5565b60008167ffffffffffffffff811115611d3657611d3661257e565b6040519080825280601f01601f191660200182016040528015611d60576020820181803683370190505b5090505b8415611a9a57611d756001836129b2565b9150611d82600a86612b11565b611d8d9060306129c9565b60f81b818381518110611da257611da261299c565b60200101906001600160f81b031916908160001a905350611dc4600a86612988565b9450611d64565b6001600160a01b038316611e2657611e2181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e49565b816001600160a01b0316836001600160a01b031614611e4957611e498382611fca565b6001600160a01b038216611e605761098a81612067565b826001600160a01b0316826001600160a01b03161461098a5761098a8282612116565b600082611e90858461215a565b14949350505050565b611ea38383612206565b611eb06000848484611ecc565b61098a5760405162461bcd60e51b815260040161073e90612abf565b60006001600160a01b0384163b15611fbf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f10903390899088908890600401612b25565b6020604051808303816000875af1925050508015611f4b575060408051601f3d908101601f19168201909252611f4891810190612b62565b60015b611fa5573d808015611f79576040519150601f19603f3d011682016040523d82523d6000602084013e611f7e565b606091505b508051611f9d5760405162461bcd60e51b815260040161073e90612abf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a9a565b506001949350505050565b60006001611fd784610d76565b611fe191906129b2565b600083815260076020526040902054909150808214612034576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612079906001906129b2565b600083815260096020526040812054600880549394509092849081106120a1576120a161299c565b9060005260206000200154905080600883815481106120c2576120c261299c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806120fa576120fa612b7f565b6001900381819060005260206000200160009055905550505050565b600061212183610d76565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081815b84518110156121fe57600085828151811061217c5761217c61299c565b602002602001015190508083116121be5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506121eb565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806121f6816129e1565b91505061215f565b509392505050565b6001600160a01b03821661225c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161073e565b6000818152600260205260409020546001600160a01b0316156122c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161073e565b6122cd60008383611dcb565b6001600160a01b03821660009081526003602052604081208054600192906122f69084906129c9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612360906128b1565b90600052602060002090601f01602090048101928261238257600085556123c8565b82601f1061239b57805160ff19168380011785556123c8565b828001600101855582156123c8579182015b828111156123c85782518255916020019190600101906123ad565b506123d49291506123d8565b5090565b5b808211156123d457600081556001016123d9565b6001600160e01b03198116811461240357600080fd5b50565b60006020828403121561241857600080fd5b8135611c5c816123ed565b6000806040838503121561243657600080fd5b50508035926020909101359150565b60005b83811015612460578181015183820152602001612448565b83811115610b445750506000910152565b60008151808452612489816020860160208601612445565b601f01601f19169290920160200192915050565b602081526000611c5c6020830184612471565b6000602082840312156124c257600080fd5b5035919050565b80356001600160a01b03811681146124e057600080fd5b919050565b600080604083850312156124f857600080fd5b612501836124c9565b946020939093013593505050565b60008060006060848603121561252457600080fd5b61252d846124c9565b925061253b602085016124c9565b9150604084013590509250925092565b6000806040838503121561255e57600080fd5b612567836124c9565b9150612575602084016124c9565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125bd576125bd61257e565b604052919050565b600067ffffffffffffffff8311156125df576125df61257e565b6125f2601f8401601f1916602001612594565b905082815283838301111561260657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561262f57600080fd5b813567ffffffffffffffff81111561264657600080fd5b8201601f8101841361265757600080fd5b611a9a848235602084016125c5565b60006020828403121561267857600080fd5b611c5c826124c9565b60008060008060006080868803121561269957600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff808211156126c657600080fd5b818801915088601f8301126126da57600080fd5b8135818111156126e957600080fd5b8960208260051b85010111156126fe57600080fd5b9699959850939650602001949392505050565b6000806040838503121561272457600080fd5b61272d836124c9565b91506020830135801515811461274257600080fd5b809150509250929050565b6000806000806080858703121561276357600080fd5b61276c856124c9565b935061277a602086016124c9565b925060408501359150606085013567ffffffffffffffff81111561279d57600080fd5b8501601f810187136127ae57600080fd5b6127bd878235602084016125c5565b91505092959194509250565b600080604083850312156127dc57600080fd5b823567ffffffffffffffff808211156127f457600080fd5b818501915085601f83011261280857600080fd5b813560208282111561281c5761281c61257e565b8160051b925061282d818401612594565b828152928401810192818101908985111561284757600080fd5b948201945b8486101561286c5761285d866124c9565b8252948201949082019061284c565b9997909101359750505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806128c557607f821691505b602082108114156128e657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561296d5761296d61293d565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261299757612997612972565b500490565b634e487b7160e01b600052603260045260246000fd5b6000828210156129c4576129c461293d565b500390565b600082198211156129dc576129dc61293d565b500190565b60006000198214156129f5576129f561293d565b5060010190565b60008151612a0e818560208601612445565b9290920192915050565b600080845481600182811c915080831680612a3457607f831692505b6020808410821415612a5457634e487b7160e01b86526022600452602486fd5b818015612a685760018114612a7957612aa6565b60ff19861689528489019650612aa6565b60008b81526020902060005b86811015612a9e5781548b820152908501908301612a85565b505084890196505b505050505050612ab681856129fc565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612b2057612b20612972565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b5890830184612471565b9695505050505050565b600060208284031215612b7457600080fd5b8151611c5c816123ed565b634e487b7160e01b600052603160045260246000fdfea26469706673582212203e8d1eab5aef4715346cf08069987154f29321de9db4826f6ba57a8226e833d164736f6c634300080c0033

Deployed Bytecode

0x6080604052600436106102255760003560e01c8063715018a611610123578063bceae77b116100ab578063e985e9c51161006f578063e985e9c514610622578063efef39a11461066b578063f2fde38b1461067e578063f5ebec801461069e578063fefd229d146106b457600080fd5b8063bceae77b1461058c578063bf8bcee4146105a2578063c204642c146105c2578063c87b56dd146105e2578063e62207701461060257600080fd5b8063a22cb465116100f2578063a22cb465146104ec578063a68c25d81461050c578063a811a37b1461052c578063b44302a31461054c578063b88d4fde1461056c57600080fd5b8063715018a614610491578063848da3b9146104a65780638da5cb5b146104b957806395d89b41146104d757600080fd5b80633ccfd60b116101b157806355f804b31161017557806355f804b314610405578063611f3f101461042557806362dc6e211461043b5780636352211e1461045157806370a082311461047157600080fd5b80633ccfd60b146103705780634080a9b81461038557806342842e0e146103a557806345149bb3146103c55780634f6ccce7146103e557600080fd5b8063095ea7b3116101f8578063095ea7b3146102db57806318160ddd146102fb57806323b872dd1461031a5780632f745c591461033a57806332cb6b0c1461035a57600080fd5b806301ffc9a71461022a5780630442bfa81461025f57806306fdde0314610281578063081812fc146102a3575b600080fd5b34801561023657600080fd5b5061024a610245366004612406565b6106d4565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027f61027a366004612423565b6106ff565b005b34801561028d57600080fd5b50610296610752565b604051610256919061249d565b3480156102af57600080fd5b506102c36102be3660046124b0565b6107e4565b6040516001600160a01b039091168152602001610256565b3480156102e757600080fd5b5061027f6102f63660046124e5565b610879565b34801561030757600080fd5b506008545b604051908152602001610256565b34801561032657600080fd5b5061027f61033536600461250f565b61098f565b34801561034657600080fd5b5061030c6103553660046124e5565b6109c0565b34801561036657600080fd5b5061030c600e5481565b34801561037c57600080fd5b5061027f610a56565b34801561039157600080fd5b5061027f6103a036600461254b565b610b4a565b3480156103b157600080fd5b5061027f6103c036600461250f565b610bb7565b3480156103d157600080fd5b5061027f6103e03660046124b0565b610bd2565b3480156103f157600080fd5b5061030c6104003660046124b0565b610c16565b34801561041157600080fd5b5061027f61042036600461261d565b610ca9565b34801561043157600080fd5b5061030c60105481565b34801561044757600080fd5b5061030c600f5481565b34801561045d57600080fd5b506102c361046c3660046124b0565b610cff565b34801561047d57600080fd5b5061030c61048c366004612666565b610d76565b34801561049d57600080fd5b5061027f610dfd565b61027f6104b4366004612681565b610e86565b3480156104c557600080fd5b50600a546001600160a01b03166102c3565b3480156104e357600080fd5b50610296611143565b3480156104f857600080fd5b5061027f610507366004612711565b611152565b34801561051857600080fd5b5061027f6105273660046124b0565b611217565b34801561053857600080fd5b5061027f61054736600461261d565b61125b565b34801561055857600080fd5b5061027f6105673660046124b0565b6112ad565b34801561057857600080fd5b5061027f61058736600461274d565b6112f1565b34801561059857600080fd5b5061030c60145481565b3480156105ae57600080fd5b5061027f6105bd3660046124b0565b611323565b3480156105ce57600080fd5b5061027f6105dd3660046127c9565b611367565b3480156105ee57600080fd5b506102966105fd3660046124b0565b61144b565b34801561060e57600080fd5b5061027f61061d3660046124b0565b611584565b34801561062e57600080fd5b5061024a61063d36600461254b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61027f6106793660046124b0565b6115c8565b34801561068a57600080fd5b5061027f610699366004612666565b6117a3565b3480156106aa57600080fd5b5061030c60135481565b3480156106c057600080fd5b5061027f6106cf366004612423565b6118a3565b60006001600160e01b0319821663780e9d6360e01b14806106f957506106f9826118ed565b92915050565b600a546001600160a01b03163314806107225750600b546001600160a01b031633145b6107475760405162461bcd60e51b815260040161073e9061287c565b60405180910390fd5b600f91909155601055565b606060008054610761906128b1565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906128b1565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661085d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161073e565b506000908152600460205260409020546001600160a01b031690565b600061088482610cff565b9050806001600160a01b0316836001600160a01b031614156108f25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161073e565b336001600160a01b038216148061090e575061090e813361063d565b6109805760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161073e565b61098a838361193d565b505050565b61099933826119ab565b6109b55760405162461bcd60e51b815260040161073e906128ec565b61098a838383611aa2565b60006109cb83610d76565b8210610a2d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161073e565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331480610a795750600b546001600160a01b031633145b610a955760405162461bcd60e51b815260040161073e9061287c565b476000612710610aa78361251c612953565b610ab19190612988565b90506000612710610ac4846101f4612953565b610ace9190612988565b600c546040519192506001600160a01b03169083156108fc029084906000818181858888f19350505050158015610b09573d6000803e3d6000fd5b50600d546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610b44573d6000803e3d6000fd5b50505050565b600a546001600160a01b0316331480610b6d5750600b546001600160a01b031633145b610b895760405162461bcd60e51b815260040161073e9061287c565b600c80546001600160a01b039384166001600160a01b031991821617909155600d8054929093169116179055565b61098a838383604051806020016040528060008152506112f1565b600a546001600160a01b0316331480610bf55750600b546001600160a01b031633145b610c115760405162461bcd60e51b815260040161073e9061287c565b601755565b6000610c2160085490565b8210610c845760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161073e565b60088281548110610c9757610c9761299c565b90600052602060002001549050919050565b600a546001600160a01b0316331480610ccc5750600b546001600160a01b031633145b610ce85760405162461bcd60e51b815260040161073e9061287c565b8051610cfb906019906020840190612354565b5050565b6000818152600260205260408120546001600160a01b0316806106f95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161073e565b60006001600160a01b038216610de15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161073e565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b0316331480610e205750600b546001600160a01b031633145b610e3c5760405162461bcd60e51b815260040161073e9061287c565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600e54601b5410610ed95760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564204d41585f535550504c59604482015260640161073e565b600a546001600160a01b031633146110ea576040805160208082018790526bffffffffffffffffffffffff193360601b168284015260548083018790528351808403909101815260749092019092528051910120610f6a90838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c4d92505050565b610fa65760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161073e565b601254601854610fb691906129b2565b421161100f5760405162461bcd60e51b815260206004820152602260248201527f436f6e7472616374206973206e6f742061637469766520666f722070726573616044820152616c6560f01b606482015260840161073e565b3360009081526015602052604090205461102a9086906129c9565b336000908152601560205260409020819055601354101561108d5760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720666f722050524553414c455f4d494e545f4c494d495400604482015260640161073e565b3485600f5461109c9190612953565b11156110ea5760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604482015260640161073e565b60005b8581101561113b576000611100601b5490565b9050600e5461110e601b5490565b10156111285761111e601b611c63565b6111283382611c80565b5080611133816129e1565b9150506110ed565b505050505050565b606060018054610761906128b1565b6001600160a01b0382163314156111ab5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161073e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633148061123a5750600b546001600160a01b031633145b6112565760405162461bcd60e51b815260040161073e9061287c565b601155565b600a546001600160a01b031633148061127e5750600b546001600160a01b031633145b61129a5760405162461bcd60e51b815260040161073e9061287c565b8051610cfb90601a906020840190612354565b600a546001600160a01b03163314806112d05750600b546001600160a01b031633145b6112ec5760405162461bcd60e51b815260040161073e9061287c565b601255565b6112fb33836119ab565b6113175760405162461bcd60e51b815260040161073e906128ec565b610b4484848484611c9a565b600a546001600160a01b03163314806113465750600b546001600160a01b031633145b6113625760405162461bcd60e51b815260040161073e9061287c565b600e55565b600a546001600160a01b031633148061138a5750600b546001600160a01b031633145b6113a65760405162461bcd60e51b815260040161073e9061287c565b60005b825181101561098a5760005b828110156114385760006113c8601b5490565b9050600e546113d6601b5490565b1015611425576113e6601b611c63565b6000818152600260205260409020546001600160a01b0316611425576114258584815181106114175761141761299c565b602002602001015182611c80565b5080611430816129e1565b9150506113b5565b5080611443816129e1565b9150506113a9565b6000818152600260205260409020546060906001600160a01b03166114a95760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161073e565b426011546018546114ba91906129c9565b10156114f25760196114cb83611ccd565b6040516020016114dc929190612a18565b6040516020818303038152906040529050919050565b601a80546114ff906128b1565b80601f016020809104026020016040519081016040528092919081815260200182805461152b906128b1565b80156115785780601f1061154d57610100808354040283529160200191611578565b820191906000526020600020905b81548152906001019060200180831161155b57829003601f168201915b50505050509050919050565b600a546001600160a01b03163314806115a75750600b546001600160a01b031633145b6115c35760405162461bcd60e51b815260040161073e9061287c565b601855565b600e54601b541061161b5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564204d41585f535550504c59604482015260640161073e565b600a546001600160a01b031633146117525760185442116116775760405162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015260640161073e565b336000908152601660205260409020546116929082906129c9565b33600090815260166020526040902081905560145410156116f55760405162461bcd60e51b815260206004820152601e60248201527f4f766572666c6f7720666f72205055424c49435f4d494e545f4c494d49540000604482015260640161073e565b34816010546117049190612953565b11156117525760405162461bcd60e51b815260206004820152601c60248201527f45544820616d6f756e74206973206e6f742073756666696369656e7400000000604482015260640161073e565b60005b81811015610cfb576000611768601b5490565b9050600e54611776601b5490565b101561179057611786601b611c63565b6117903382611c80565b508061179b816129e1565b915050611755565b600a546001600160a01b03163314806117c65750600b546001600160a01b031633145b6117e25760405162461bcd60e51b815260040161073e9061287c565b6001600160a01b0381166118475760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161073e565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314806118c65750600b546001600160a01b031633145b6118e25760405162461bcd60e51b815260040161073e9061287c565b601391909155601455565b60006001600160e01b031982166380ac58cd60e01b148061191e57506001600160e01b03198216635b5e139f60e01b145b806106f957506301ffc9a760e01b6001600160e01b03198316146106f9565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197282610cff565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611a245760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161073e565b6000611a2f83610cff565b9050806001600160a01b0316846001600160a01b03161480611a6a5750836001600160a01b0316611a5f846107e4565b6001600160a01b0316145b80611a9a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611ab582610cff565b6001600160a01b031614611b1d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161073e565b6001600160a01b038216611b7f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161073e565b611b8a838383611dcb565b611b9560008261193d565b6001600160a01b0383166000908152600360205260408120805460019290611bbe9084906129b2565b90915550506001600160a01b0382166000908152600360205260408120805460019290611bec9084906129c9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611c5c8260175485611e83565b9392505050565b6001816000016000828254611c7891906129c9565b909155505050565b610cfb828260405180602001604052806000815250611e99565b611ca5848484611aa2565b611cb184848484611ecc565b610b445760405162461bcd60e51b815260040161073e90612abf565b606081611cf15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d1b5780611d05816129e1565b9150611d149050600a83612988565b9150611cf5565b60008167ffffffffffffffff811115611d3657611d3661257e565b6040519080825280601f01601f191660200182016040528015611d60576020820181803683370190505b5090505b8415611a9a57611d756001836129b2565b9150611d82600a86612b11565b611d8d9060306129c9565b60f81b818381518110611da257611da261299c565b60200101906001600160f81b031916908160001a905350611dc4600a86612988565b9450611d64565b6001600160a01b038316611e2657611e2181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611e49565b816001600160a01b0316836001600160a01b031614611e4957611e498382611fca565b6001600160a01b038216611e605761098a81612067565b826001600160a01b0316826001600160a01b03161461098a5761098a8282612116565b600082611e90858461215a565b14949350505050565b611ea38383612206565b611eb06000848484611ecc565b61098a5760405162461bcd60e51b815260040161073e90612abf565b60006001600160a01b0384163b15611fbf57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f10903390899088908890600401612b25565b6020604051808303816000875af1925050508015611f4b575060408051601f3d908101601f19168201909252611f4891810190612b62565b60015b611fa5573d808015611f79576040519150601f19603f3d011682016040523d82523d6000602084013e611f7e565b606091505b508051611f9d5760405162461bcd60e51b815260040161073e90612abf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a9a565b506001949350505050565b60006001611fd784610d76565b611fe191906129b2565b600083815260076020526040902054909150808214612034576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612079906001906129b2565b600083815260096020526040812054600880549394509092849081106120a1576120a161299c565b9060005260206000200154905080600883815481106120c2576120c261299c565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806120fa576120fa612b7f565b6001900381819060005260206000200160009055905550505050565b600061212183610d76565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b600081815b84518110156121fe57600085828151811061217c5761217c61299c565b602002602001015190508083116121be5760408051602081018590529081018290526060016040516020818303038152906040528051906020012092506121eb565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806121f6816129e1565b91505061215f565b509392505050565b6001600160a01b03821661225c5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161073e565b6000818152600260205260409020546001600160a01b0316156122c15760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161073e565b6122cd60008383611dcb565b6001600160a01b03821660009081526003602052604081208054600192906122f69084906129c9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612360906128b1565b90600052602060002090601f01602090048101928261238257600085556123c8565b82601f1061239b57805160ff19168380011785556123c8565b828001600101855582156123c8579182015b828111156123c85782518255916020019190600101906123ad565b506123d49291506123d8565b5090565b5b808211156123d457600081556001016123d9565b6001600160e01b03198116811461240357600080fd5b50565b60006020828403121561241857600080fd5b8135611c5c816123ed565b6000806040838503121561243657600080fd5b50508035926020909101359150565b60005b83811015612460578181015183820152602001612448565b83811115610b445750506000910152565b60008151808452612489816020860160208601612445565b601f01601f19169290920160200192915050565b602081526000611c5c6020830184612471565b6000602082840312156124c257600080fd5b5035919050565b80356001600160a01b03811681146124e057600080fd5b919050565b600080604083850312156124f857600080fd5b612501836124c9565b946020939093013593505050565b60008060006060848603121561252457600080fd5b61252d846124c9565b925061253b602085016124c9565b9150604084013590509250925092565b6000806040838503121561255e57600080fd5b612567836124c9565b9150612575602084016124c9565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125bd576125bd61257e565b604052919050565b600067ffffffffffffffff8311156125df576125df61257e565b6125f2601f8401601f1916602001612594565b905082815283838301111561260657600080fd5b828260208301376000602084830101529392505050565b60006020828403121561262f57600080fd5b813567ffffffffffffffff81111561264657600080fd5b8201601f8101841361265757600080fd5b611a9a848235602084016125c5565b60006020828403121561267857600080fd5b611c5c826124c9565b60008060008060006080868803121561269957600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff808211156126c657600080fd5b818801915088601f8301126126da57600080fd5b8135818111156126e957600080fd5b8960208260051b85010111156126fe57600080fd5b9699959850939650602001949392505050565b6000806040838503121561272457600080fd5b61272d836124c9565b91506020830135801515811461274257600080fd5b809150509250929050565b6000806000806080858703121561276357600080fd5b61276c856124c9565b935061277a602086016124c9565b925060408501359150606085013567ffffffffffffffff81111561279d57600080fd5b8501601f810187136127ae57600080fd5b6127bd878235602084016125c5565b91505092959194509250565b600080604083850312156127dc57600080fd5b823567ffffffffffffffff808211156127f457600080fd5b818501915085601f83011261280857600080fd5b813560208282111561281c5761281c61257e565b8160051b925061282d818401612594565b828152928401810192818101908985111561284757600080fd5b948201945b8486101561286c5761285d866124c9565b8252948201949082019061284c565b9997909101359750505050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806128c557607f821691505b602082108114156128e657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561296d5761296d61293d565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261299757612997612972565b500490565b634e487b7160e01b600052603260045260246000fd5b6000828210156129c4576129c461293d565b500390565b600082198211156129dc576129dc61293d565b500190565b60006000198214156129f5576129f561293d565b5060010190565b60008151612a0e818560208601612445565b9290920192915050565b600080845481600182811c915080831680612a3457607f831692505b6020808410821415612a5457634e487b7160e01b86526022600452602486fd5b818015612a685760018114612a7957612aa6565b60ff19861689528489019650612aa6565b60008b81526020902060005b86811015612a9e5781548b820152908501908301612a85565b505084890196505b505050505050612ab681856129fc565b95945050505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082612b2057612b20612972565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b5890830184612471565b9695505050505050565b600060208284031215612b7457600080fd5b8151611c5c816123ed565b634e487b7160e01b600052603160045260246000fdfea26469706673582212203e8d1eab5aef4715346cf08069987154f29321de9db4826f6ba57a8226e833d164736f6c634300080c0033

Deployed Bytecode Sourcemap

49782:6296:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39897:300;;;;;;;;;;-1:-1:-1;39897:300:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;39897:300:0;;;;;;;;51497:184;;;;;;;;;;-1:-1:-1;51497:184:0;;;;;:::i;:::-;;:::i;:::-;;23526:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25108:308::-;;;;;;;;;;-1:-1:-1;25108:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1967:32:1;;;1949:51;;1937:2;1922:18;25108:308:0;1803:203:1;24631:411:0;;;;;;;;;;-1:-1:-1;24631:411:0;;;;;:::i;:::-;;:::i;40700:113::-;;;;;;;;;;-1:-1:-1;40788:10:0;:17;40700:113;;;2594:25:1;;;2582:2;2567:18;40700:113:0;2448:177:1;26167:376:0;;;;;;;;;;-1:-1:-1;26167:376:0;;;;;:::i;:::-;;:::i;40281:343::-;;;;;;;;;;-1:-1:-1;40281:343:0;;;;;:::i;:::-;;:::i;50119:32::-;;;;;;;;;;;;;;;;55770:305;;;;;;;;;;;;;:::i;50910:212::-;;;;;;;;;;-1:-1:-1;50910:212:0;;;;;:::i;:::-;;:::i;26614:185::-;;;;;;;;;;-1:-1:-1;26614:185:0;;;;;:::i;:::-;;:::i;52763:99::-;;;;;;;;;;-1:-1:-1;52763:99:0;;;;;:::i;:::-;;:::i;40890:320::-;;;;;;;;;;-1:-1:-1;40890:320:0;;;;;:::i;:::-;;:::i;52117:104::-;;;;;;;;;;-1:-1:-1;52117:104:0;;;;;:::i;:::-;;:::i;50218:40::-;;;;;;;;;;;;;;;;50158:41;;;;;;;;;;;;;;;;23133:326;;;;;;;;;;-1:-1:-1;23133:326:0;;;;;:::i;:::-;;:::i;22776:295::-;;;;;;;;;;-1:-1:-1;22776:295:0;;;;;:::i;:::-;;:::i;38376:148::-;;;;;;;;;;;;;:::i;53377:1111::-;;;;;;:::i;:::-;;:::i;37660:87::-;;;;;;;;;;-1:-1:-1;37733:6:0;;-1:-1:-1;;;;;37733:6:0;37660:87;;23695:104;;;;;;;;;;;;;:::i;25488:327::-;;;;;;;;;;-1:-1:-1;25488:327:0;;;;;:::i;:::-;;:::i;51259:109::-;;;;;;;;;;-1:-1:-1;51259:109:0;;;;;:::i;:::-;;:::i;52002:107::-;;;;;;;;;;-1:-1:-1;52002:107:0;;;;;:::i;:::-;;:::i;51376:113::-;;;;;;;;;;-1:-1:-1;51376:113:0;;;;;:::i;:::-;;:::i;26870:365::-;;;;;;;;;;-1:-1:-1;26870:365:0;;;;;:::i;:::-;;:::i;50415:36::-;;;;;;;;;;;;;;;;51689:98;;;;;;;;;;-1:-1:-1;51689:98:0;;;;;:::i;:::-;;:::i;52229:526::-;;;;;;;;;;-1:-1:-1;52229:526:0;;;;;:::i;:::-;;:::i;55417:345::-;;;;;;;;;;-1:-1:-1;55417:345:0;;;;;:::i;:::-;;:::i;51130:121::-;;;;;;;;;;-1:-1:-1;51130:121:0;;;;;:::i;:::-;;:::i;25886:214::-;;;;;;;;;;-1:-1:-1;25886:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;26057:25:0;;;26028:4;26057:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;25886:214;54496:913;;;;;;:::i;:::-;;:::i;38679:281::-;;;;;;;;;;-1:-1:-1;38679:281:0;;;;;:::i;:::-;;:::i;50371:37::-;;;;;;;;;;;;;;;;51795:199;;;;;;;;;;-1:-1:-1;51795:199:0;;;;;:::i;:::-;;:::i;39897:300::-;40044:4;-1:-1:-1;;;;;;40086:50:0;;-1:-1:-1;;;40086:50:0;;:103;;;40153:36;40177:11;40153:23;:36::i;:::-;40066:123;39897:300;-1:-1:-1;;39897:300:0:o;51497:184::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;;;;;;;;;51600:13:::1;:32:::0;;;;51643:12:::1;:30:::0;51497:184::o;23526:100::-;23580:13;23613:5;23606:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23526:100;:::o;25108:308::-;25229:7;28871:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28871:16:0;25254:110;;;;-1:-1:-1;;;25254:110:0;;8708:2:1;25254:110:0;;;8690:21:1;8747:2;8727:18;;;8720:30;8786:34;8766:18;;;8759:62;-1:-1:-1;;;8837:18:1;;;8830:42;8889:19;;25254:110:0;8506:408:1;25254:110:0;-1:-1:-1;25384:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25384:24:0;;25108:308::o;24631:411::-;24712:13;24728:23;24743:7;24728:14;:23::i;:::-;24712:39;;24776:5;-1:-1:-1;;;;;24770:11:0;:2;-1:-1:-1;;;;;24770:11:0;;;24762:57;;;;-1:-1:-1;;;24762:57:0;;9121:2:1;24762:57:0;;;9103:21:1;9160:2;9140:18;;;9133:30;9199:34;9179:18;;;9172:62;-1:-1:-1;;;9250:18:1;;;9243:31;9291:19;;24762:57:0;8919:397:1;24762:57:0;17616:10;-1:-1:-1;;;;;24854:21:0;;;;:62;;-1:-1:-1;24879:37:0;24896:5;17616:10;25886:214;:::i;24879:37::-;24832:168;;;;-1:-1:-1;;;24832:168:0;;9523:2:1;24832:168:0;;;9505:21:1;9562:2;9542:18;;;9535:30;9601:34;9581:18;;;9574:62;9672:26;9652:18;;;9645:54;9716:19;;24832:168:0;9321:420:1;24832:168:0;25013:21;25022:2;25026:7;25013:8;:21::i;:::-;24701:341;24631:411;;:::o;26167:376::-;26376:41;17616:10;26409:7;26376:18;:41::i;:::-;26354:140;;;;-1:-1:-1;;;26354:140:0;;;;;;;:::i;:::-;26507:28;26517:4;26523:2;26527:7;26507:9;:28::i;40281:343::-;40423:7;40478:23;40495:5;40478:16;:23::i;:::-;40470:5;:31;40448:124;;;;-1:-1:-1;;;40448:124:0;;10366:2:1;40448:124:0;;;10348:21:1;10405:2;10385:18;;;10378:30;10444:34;10424:18;;;10417:62;-1:-1:-1;;;10495:18:1;;;10488:41;10546:19;;40448:124:0;10164:407:1;40448:124:0;-1:-1:-1;;;;;;40590:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40281:343::o;55770:305::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;55838:21:::1;55820:15;55907:5;55889:14;55838:21:::0;55899:4:::1;55889:14;:::i;:::-;55888:24;;;;:::i;:::-;55870:42:::0;-1:-1:-1;55930:15:0::1;55966:5;55949:13;:7:::0;55959:3:::1;55949:13;:::i;:::-;55948:23;;;;:::i;:::-;55988:16;::::0;:34:::1;::::0;55930:41;;-1:-1:-1;;;;;;55988:16:0::1;::::0;:34;::::1;;;::::0;56014:7;;55988:16:::1;:34:::0;:16;:34;56014:7;55988:16;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;56033:16:0::1;::::0;:34:::1;::::0;-1:-1:-1;;;;;56033:16:0;;::::1;::::0;:34;::::1;;;::::0;56059:7;;56033:16:::1;:34:::0;:16;:34;56059:7;56033:16;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55809:266;;;55770:305::o:0;50910:212::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;51017:16:::1;:43:::0;;-1:-1:-1;;;;;51017:43:0;;::::1;-1:-1:-1::0;;;;;;51017:43:0;;::::1;;::::0;;;51071:16:::1;:43:::0;;;;;::::1;::::0;::::1;;::::0;;50910:212::o;26614:185::-;26752:39;26769:4;26775:2;26779:7;26752:39;;;;;;;;;;;;:16;:39::i;52763:99::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;52833:14:::1;:21:::0;52763:99::o;40890:320::-;41010:7;41065:30;40788:10;:17;;40700:113;41065:30;41057:5;:38;41035:132;;;;-1:-1:-1;;;41035:132:0;;11340:2:1;41035:132:0;;;11322:21:1;11379:2;11359:18;;;11352:30;11418:34;11398:18;;;11391:62;-1:-1:-1;;;11469:18:1;;;11462:42;11521:19;;41035:132:0;11138:408:1;41035:132:0;41185:10;41196:5;41185:17;;;;;;;;:::i;:::-;;;;;;;;;41178:24;;40890:320;;;:::o;52117:104::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;52190:23;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52117:104:::0;:::o;23133:326::-;23250:7;23291:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23291:16:0;23340:19;23318:110;;;;-1:-1:-1;;;23318:110:0;;11885:2:1;23318:110:0;;;11867:21:1;11924:2;11904:18;;;11897:30;11963:34;11943:18;;;11936:62;-1:-1:-1;;;12014:18:1;;;12007:39;12063:19;;23318:110:0;11683:405:1;22776:295:0;22893:7;-1:-1:-1;;;;;22940:19:0;;22918:111;;;;-1:-1:-1;;;22918:111:0;;12295:2:1;22918:111:0;;;12277:21:1;12334:2;12314:18;;;12307:30;12373:34;12353:18;;;12346:62;-1:-1:-1;;;12424:18:1;;;12417:40;12474:19;;22918:111:0;12093:406:1;22918:111:0;-1:-1:-1;;;;;;23047:16:0;;;;;:9;:16;;;;;;;22776:295::o;38376:148::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;38467:6:::1;::::0;38446:40:::1;::::0;38483:1:::1;::::0;-1:-1:-1;;;;;38467:6:0::1;::::0;38446:40:::1;::::0;38483:1;;38446:40:::1;38497:6;:19:::0;;-1:-1:-1;;;;;;38497:19:0::1;::::0;;38376:148::o;53377:1111::-;53539:10;;53512:14;47198;53512:37;53503:83;;;;-1:-1:-1;;;53503:83:0;;12706:2:1;53503:83:0;;;12688:21:1;;;12725:18;;;12718:30;12784:34;12764:18;;;12757:62;12836:18;;53503:83:0;12504:356:1;53503:83:0;37733:6;;-1:-1:-1;;;;;37733:6:0;53603:10;:21;53599:587;;53320:40;;;;;;;19458:19:1;;;-1:-1:-1;;53670:10:0;19515:2:1;19511:15;19507:53;19493:12;;;19486:75;19577:12;;;;19570:28;;;53320:40:0;;;;;;;;;;19614:12:1;;;;53320:40:0;;;53310:51;;;;;53649:55;;53698:5;;53649:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53649:13:0;;-1:-1:-1;;;53649:55:0:i;:::-;53641:81;;;;-1:-1:-1;;;53641:81:0;;13067:2:1;53641:81:0;;;13049:21:1;13106:2;13086:18;;;13079:30;-1:-1:-1;;;13125:18:1;;;13118:43;13178:18;;53641:81:0;12865:337:1;53641:81:0;53795:13;;53777:15;;:31;;;;:::i;:::-;53759:15;:49;53751:95;;;;-1:-1:-1;;;53751:95:0;;13539:2:1;53751:95:0;;;13521:21:1;13578:2;13558:18;;;13551:30;13617:34;13597:18;;;13590:62;-1:-1:-1;;;13668:18:1;;;13661:32;13710:19;;53751:95:0;13337:398:1;53751:95:0;53927:10;53902:36;;;;:24;:36;;;;;;:53;;53941:14;;53902:53;:::i;:::-;53888:10;53863:36;;;;:24;:36;;;;;:92;;;54018:18;;-1:-1:-1;53978:58:0;53970:102;;;;-1:-1:-1;;;53970:102:0;;14075:2:1;53970:102:0;;;14057:21:1;14114:2;14094:18;;;14087:30;14153:33;14133:18;;;14126:61;14204:18;;53970:102:0;13873:355:1;53970:102:0;54132:9;54114:14;54098:13;;:30;;;;:::i;:::-;:43;;54089:85;;;;-1:-1:-1;;;54089:85:0;;14435:2:1;54089:85:0;;;14417:21:1;14474:2;14454:18;;;14447:30;14513;14493:18;;;14486:58;14561:18;;54089:85:0;14233:352:1;54089:85:0;54203:9;54198:283;54222:14;54218:1;:18;54198:283;;;54258:15;54276:24;:14;47198;;47106:114;54276:24;54258:42;;54348:10;;54321:24;:14;47198;;47106:114;54321:24;:37;54317:153;;;54379:26;:14;:24;:26::i;:::-;54424:30;54434:10;54446:7;54424:9;:30::i;:::-;-1:-1:-1;54238:3:0;;;;:::i;:::-;;;;54198:283;;;;53377:1111;;;;;:::o;23695:104::-;23751:13;23784:7;23777:14;;;;;:::i;25488:327::-;-1:-1:-1;;;;;25623:24:0;;17616:10;25623:24;;25615:62;;;;-1:-1:-1;;;25615:62:0;;14932:2:1;25615:62:0;;;14914:21:1;14971:2;14951:18;;;14944:30;15010:27;14990:18;;;14983:55;15055:18;;25615:62:0;14730:349:1;25615:62:0;17616:10;25690:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25690:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25690:53:0;;;;;;;;;;25759:48;;540:41:1;;;25690:42:0;;17616:10;25759:48;;513:18:1;25759:48:0;;;;;;;25488:327;;:::o;51259:109::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;51334:12:::1;:26:::0;51259:109::o;52002:107::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;52079:22;;::::1;::::0;:10:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;51376:113::-:0;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;51453:13:::1;:28:::0;51376:113::o;26870:365::-;27059:41;17616:10;27092:7;27059:18;:41::i;:::-;27037:140;;;;-1:-1:-1;;;27037:140:0;;;;;;;:::i;:::-;27188:39;27202:4;27208:2;27212:7;27221:5;27188:13;:39::i;51689:98::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;51758:10:::1;:21:::0;51689:98::o;52229:526::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;52338:9:::1;52333:415;52357:14;:21;52353:1;:25;52333:415;;;52405:9;52400:337;52424:14;52420:1;:18;52400:337;;;52464:15;52482:24;:14;47198::::0;;47106:114;52482:24:::1;52464:42;;52558:10;;52531:24;:14;47198::::0;;47106:114;52531:24:::1;:37;52527:195;;;52593:26;:14;:24;:26::i;:::-;28847:4:::0;28871:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28871:16:0;52642:60:::1;;52665:37;52675:14;52690:1;52675:17;;;;;;;;:::i;:::-;;;;;;;52694:7;52665:9;:37::i;:::-;-1:-1:-1::0;52440:3:0;::::1;::::0;::::1;:::i;:::-;;;;52400:337;;;-1:-1:-1::0;52380:3:0;::::1;::::0;::::1;:::i;:::-;;;;52333:415;;55417:345:::0;28847:4;28871:16;;;:7;:16;;;;;;55490:13;;-1:-1:-1;;;;;28871:16:0;55516:49;;;;-1:-1:-1;;;55516:49:0;;15286:2:1;55516:49:0;;;15268:21:1;15325:2;15305:18;;;15298:30;-1:-1:-1;;;15344:18:1;;;15337:50;15404:18;;55516:49:0;15084:344:1;55516:49:0;55615:15;55600:12;;55582:15;;:30;;;;:::i;:::-;:48;55578:147;;;55678:13;55693:18;:7;:16;:18::i;:::-;55661:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55647:66;;55417:345;;;:::o;55578:147::-;55744:10;55737:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55417:345;;;:::o;51130:121::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;51211:15:::1;:32:::0;51130:121::o;54496:913::-;54602:10;;54575:14;47198;54575:37;54566:83;;;;-1:-1:-1;;;54566:83:0;;12706:2:1;54566:83:0;;;12688:21:1;;;12725:18;;;12718:30;12784:34;12764:18;;;12757:62;12836:18;;54566:83:0;12504:356:1;54566:83:0;37733:6;;-1:-1:-1;;;;;37733:6:0;54666:10;:21;54662:445;;54731:15;;54713;:33;54704:69;;;;-1:-1:-1;;;54704:69:0;;17130:2:1;54704:69:0;;;17112:21:1;17169:2;17149:18;;;17142:30;-1:-1:-1;;;17188:18:1;;;17181:52;17250:18;;54704:69:0;16928:346:1;54704:69:0;54852:10;54828:35;;;;:23;:35;;;;;;:52;;54866:14;;54828:52;:::i;:::-;54814:10;54790:35;;;;:23;:35;;;;;:90;;;54942:17;;-1:-1:-1;54903:56:0;54895:99;;;;-1:-1:-1;;;54895:99:0;;17481:2:1;54895:99:0;;;17463:21:1;17520:2;17500:18;;;17493:30;17559:32;17539:18;;;17532:60;17609:18;;54895:99:0;17279:354:1;54895:99:0;55053:9;55035:14;55020:12;;:29;;;;:::i;:::-;:42;;55011:84;;;;-1:-1:-1;;;55011:84:0;;14435:2:1;55011:84:0;;;14417:21:1;14474:2;14454:18;;;14447:30;14513;14493:18;;;14486:58;14561:18;;55011:84:0;14233:352:1;55011:84:0;55124:9;55119:283;55143:14;55139:1;:18;55119:283;;;55179:15;55197:24;:14;47198;;47106:114;55197:24;55179:42;;55269:10;;55242:24;:14;47198;;47106:114;55242:24;:37;55238:153;;;55300:26;:14;:24;:26::i;:::-;55345:30;55355:10;55367:7;55345:9;:30::i;:::-;-1:-1:-1;55159:3:0;;;;:::i;:::-;;;;55119:283;;38679:281;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38782:22:0;::::1;38760:110;;;::::0;-1:-1:-1;;;38760:110:0;;17840:2:1;38760:110:0::1;::::0;::::1;17822:21:1::0;17879:2;17859:18;;;17852:30;17918:34;17898:18;;;17891:62;-1:-1:-1;;;17969:18:1;;;17962:36;18015:19;;38760:110:0::1;17638:402:1::0;38760:110:0::1;38907:6;::::0;38886:38:::1;::::0;-1:-1:-1;;;;;38886:38:0;;::::1;::::0;38907:6:::1;::::0;38886:38:::1;::::0;38907:6:::1;::::0;38886:38:::1;38935:6;:17:::0;;-1:-1:-1;;;;;;38935:17:0::1;-1:-1:-1::0;;;;;38935:17:0;;;::::1;::::0;;;::::1;::::0;;38679:281::o;51795:199::-;37733:6;;-1:-1:-1;;;;;37733:6:0;17616:10;37894:23;;:51;;-1:-1:-1;37921:8:0;;-1:-1:-1;;;;;37921:8:0;17616:10;37921:24;37894:51;37872:133;;;;-1:-1:-1;;;37872:133:0;;;;;;;:::i;:::-;51903:18:::1;:37:::0;;;;51951:17:::1;:35:::0;51795:199::o;22357:355::-;22504:4;-1:-1:-1;;;;;;22546:40:0;;-1:-1:-1;;;22546:40:0;;:105;;-1:-1:-1;;;;;;;22603:48:0;;-1:-1:-1;;;22603:48:0;22546:105;:158;;;-1:-1:-1;;;;;;;;;;20967:40:0;;;22668:36;20808:207;32905:174;32980:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32980:29:0;-1:-1:-1;;;;;32980:29:0;;;;;;;;:24;;33034:23;32980:24;33034:14;:23::i;:::-;-1:-1:-1;;;;;33025:46:0;;;;;;;;;;;32905:174;;:::o;29076:452::-;29205:4;28871:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28871:16:0;29227:110;;;;-1:-1:-1;;;29227:110:0;;18247:2:1;29227:110:0;;;18229:21:1;18286:2;18266:18;;;18259:30;18325:34;18305:18;;;18298:62;-1:-1:-1;;;18376:18:1;;;18369:42;18428:19;;29227:110:0;18045:408:1;29227:110:0;29348:13;29364:23;29379:7;29364:14;:23::i;:::-;29348:39;;29417:5;-1:-1:-1;;;;;29406:16:0;:7;-1:-1:-1;;;;;29406:16:0;;:64;;;;29463:7;-1:-1:-1;;;;;29439:31:0;:20;29451:7;29439:11;:20::i;:::-;-1:-1:-1;;;;;29439:31:0;;29406:64;:113;;;-1:-1:-1;;;;;;26057:25:0;;;26028:4;26057:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29487:32;29398:122;29076:452;-1:-1:-1;;;;29076:452:0:o;32172:615::-;32345:4;-1:-1:-1;;;;;32318:31:0;:23;32333:7;32318:14;:23::i;:::-;-1:-1:-1;;;;;32318:31:0;;32296:122;;;;-1:-1:-1;;;32296:122:0;;18660:2:1;32296:122:0;;;18642:21:1;18699:2;18679:18;;;18672:30;18738:34;18718:18;;;18711:62;-1:-1:-1;;;18789:18:1;;;18782:39;18838:19;;32296:122:0;18458:405:1;32296:122:0;-1:-1:-1;;;;;32437:16:0;;32429:65;;;;-1:-1:-1;;;32429:65:0;;19070:2:1;32429:65:0;;;19052:21:1;19109:2;19089:18;;;19082:30;19148:34;19128:18;;;19121:62;-1:-1:-1;;;19199:18:1;;;19192:34;19243:19;;32429:65:0;18868:400:1;32429:65:0;32507:39;32528:4;32534:2;32538:7;32507:20;:39::i;:::-;32611:29;32628:1;32632:7;32611:8;:29::i;:::-;-1:-1:-1;;;;;32653:15:0;;;;;;:9;:15;;;;;:20;;32672:1;;32653:15;:20;;32672:1;;32653:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32684:13:0;;;;;;:9;:13;;;;;:18;;32701:1;;32684:13;:18;;32701:1;;32684:18;:::i;:::-;;;;-1:-1:-1;;32713:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32713:21:0;-1:-1:-1;;;;;32713:21:0;;;;;;;;;32752:27;;32713:16;;32752:27;;;;;;;32172:615;;;:::o;52919:173::-;53008:4;53032:52;53051:5;53058:14;;53074:9;53032:18;:52::i;:::-;53025:59;52919:173;-1:-1:-1;;;52919:173:0:o;47228:117::-;47325:1;47307:7;:14;;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;;47228:117:0:o;29870:110::-;29946:26;29956:2;29960:7;29946:26;;;;;;;;;;;;:9;:26::i;28117:352::-;28274:28;28284:4;28290:2;28294:7;28274:9;:28::i;:::-;28335:48;28358:4;28364:2;28368:7;28377:5;28335:22;:48::i;:::-;28313:148;;;;-1:-1:-1;;;28313:148:0;;;;;;;:::i;18208:723::-;18264:13;18485:10;18481:53;;-1:-1:-1;;18512:10:0;;;;;;;;;;;;-1:-1:-1;;;18512:10:0;;;;;18208:723::o;18481:53::-;18559:5;18544:12;18600:78;18607:9;;18600:78;;18633:8;;;;:::i;:::-;;-1:-1:-1;18656:10:0;;-1:-1:-1;18664:2:0;18656:10;;:::i;:::-;;;18600:78;;;18688:19;18720:6;18710:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18710:17:0;;18688:39;;18738:154;18745:10;;18738:154;;18772:11;18782:1;18772:11;;:::i;:::-;;-1:-1:-1;18841:10:0;18849:2;18841:5;:10;:::i;:::-;18828:24;;:2;:24;:::i;:::-;18815:39;;18798:6;18805;18798:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18798:56:0;;;;;;;;-1:-1:-1;18869:11:0;18878:2;18869:11;;:::i;:::-;;;18738:154;;41823:589;-1:-1:-1;;;;;42029:18:0;;42025:187;;42064:40;42096:7;43239:10;:17;;43212:24;;;;:15;:24;;;;;:44;;;43267:24;;;;;;;;;;;;43135:164;42064:40;42025:187;;;42134:2;-1:-1:-1;;;;;42126:10:0;:4;-1:-1:-1;;;;;42126:10:0;;42122:90;;42153:47;42186:4;42192:7;42153:32;:47::i;:::-;-1:-1:-1;;;;;42226:16:0;;42222:183;;42259:45;42296:7;42259:36;:45::i;42222:183::-;42332:4;-1:-1:-1;;;;;42326:10:0;:2;-1:-1:-1;;;;;42326:10:0;;42322:83;;42353:40;42381:2;42385:7;42353:27;:40::i;48493:190::-;48618:4;48671;48642:25;48655:5;48662:4;48642:12;:25::i;:::-;:33;;48493:190;-1:-1:-1;;;;48493:190:0:o;30207:321::-;30337:18;30343:2;30347:7;30337:5;:18::i;:::-;30388:54;30419:1;30423:2;30427:7;30436:5;30388:22;:54::i;:::-;30366:154;;;;-1:-1:-1;;;30366:154:0;;;;;;;:::i;33644:1053::-;33799:4;-1:-1:-1;;;;;33820:13:0;;9316:20;9364:8;33816:874;;33873:175;;-1:-1:-1;;;33873:175:0;;-1:-1:-1;;;;;33873:36:0;;;;;:175;;17616:10;;33967:4;;33994:7;;34024:5;;33873:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33873:175:0;;;;;;;;-1:-1:-1;;33873:175:0;;;;;;;;;;;;:::i;:::-;;;33852:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34235:13:0;;34231:389;;34278:108;;-1:-1:-1;;;34278:108:0;;;;;;;:::i;34231:389::-;34570:6;34564:13;34555:6;34551:2;34547:15;34540:38;33852:783;-1:-1:-1;;;;;;34112:55:0;-1:-1:-1;;;34112:55:0;;-1:-1:-1;34105:62:0;;33816:874;-1:-1:-1;34674:4:0;33644:1053;;;;;;:::o;43926:1002::-;44206:22;44256:1;44231:22;44248:4;44231:16;:22::i;:::-;:26;;;;:::i;:::-;44268:18;44289:26;;;:17;:26;;;;;;44206:51;;-1:-1:-1;44422:28:0;;;44418:328;;-1:-1:-1;;;;;44489:18:0;;44467:19;44489:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44540:30;;;;;;:44;;;44657:30;;:17;:30;;;;;:43;;;44418:328;-1:-1:-1;44842:26:0;;;;:17;:26;;;;;;;;44835:33;;;-1:-1:-1;;;;;44886:18:0;;;;;:12;:18;;;;;:34;;;;;;;44879:41;43926:1002::o;45223:1079::-;45501:10;:17;45476:22;;45501:21;;45521:1;;45501:21;:::i;:::-;45533:18;45554:24;;;:15;:24;;;;;;45927:10;:26;;45476:46;;-1:-1:-1;45554:24:0;;45476:46;;45927:26;;;;;;:::i;:::-;;;;;;;;;45905:48;;45991:11;45966:10;45977;45966:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46071:28;;;:15;:28;;;;;;;:41;;;46243:24;;;;;46236:31;46278:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45294:1008;;;45223:1079;:::o;42713:221::-;42798:14;42815:20;42832:2;42815:16;:20::i;:::-;-1:-1:-1;;;;;42846:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42891:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42713:221:0:o;49045:701::-;49128:7;49171:4;49128:7;49186:523;49210:5;:12;49206:1;:16;49186:523;;;49244:20;49267:5;49273:1;49267:8;;;;;;;;:::i;:::-;;;;;;;49244:31;;49310:12;49294;:28;49290:408;;49447:44;;;;;;21221:19:1;;;21256:12;;;21249:28;;;21293:12;;49447:44:0;;;;;;;;;;;;49437:55;;;;;;49422:70;;49290:408;;;49637:44;;;;;;21221:19:1;;;21256:12;;;21249:28;;;21293:12;;49637:44:0;;;;;;;;;;;;49627:55;;;;;;49612:70;;49290:408;-1:-1:-1;49224:3:0;;;;:::i;:::-;;;;49186:523;;;-1:-1:-1;49726:12:0;49045:701;-1:-1:-1;;;49045:701:0:o;30864:382::-;-1:-1:-1;;;;;30944:16:0;;30936:61;;;;-1:-1:-1;;;30936:61:0;;21518:2:1;30936:61:0;;;21500:21:1;;;21537:18;;;21530:30;21596:34;21576:18;;;21569:62;21648:18;;30936:61:0;21316:356:1;30936:61:0;28847:4;28871:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28871:16:0;:30;31008:58;;;;-1:-1:-1;;;31008:58:0;;21879:2:1;31008:58:0;;;21861:21:1;21918:2;21898:18;;;21891:30;21957;21937:18;;;21930:58;22005:18;;31008:58:0;21677:352:1;31008:58:0;31079:45;31108:1;31112:2;31116:7;31079:20;:45::i;:::-;-1:-1:-1;;;;;31137:13:0;;;;;;:9;:13;;;;;:18;;31154:1;;31137:13;:18;;31154:1;;31137:18;:::i;:::-;;;;-1:-1:-1;;31166:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31166:21:0;-1:-1:-1;;;;;31166:21:0;;;;;;;;31205:33;;31166:16;;;31205:33;;31166:16;;31205:33;30864:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:248::-;660:6;668;721:2;709:9;700:7;696:23;692:32;689:52;;;737:1;734;727:12;689:52;-1:-1:-1;;760:23:1;;;830:2;815:18;;;802:32;;-1:-1:-1;592:248:1:o;845:258::-;917:1;927:113;941:6;938:1;935:13;927:113;;;1017:11;;;1011:18;998:11;;;991:39;963:2;956:10;927:113;;;1058:6;1055:1;1052:13;1049:48;;;-1:-1:-1;;1093:1:1;1075:16;;1068:27;845:258::o;1108:269::-;1161:3;1199:5;1193:12;1226:6;1221:3;1214:19;1242:63;1298:6;1291:4;1286:3;1282:14;1275:4;1268:5;1264:16;1242:63;:::i;:::-;1359:2;1338:15;-1:-1:-1;;1334:29:1;1325:39;;;;1366:4;1321:50;;1108:269;-1:-1:-1;;1108:269:1:o;1382:231::-;1531:2;1520:9;1513:21;1494:4;1551:56;1603:2;1592:9;1588:18;1580:6;1551:56;:::i;1618:180::-;1677:6;1730:2;1718:9;1709:7;1705:23;1701:32;1698:52;;;1746:1;1743;1736:12;1698:52;-1:-1:-1;1769:23:1;;1618:180;-1:-1:-1;1618:180:1:o;2011:173::-;2079:20;;-1:-1:-1;;;;;2128:31:1;;2118:42;;2108:70;;2174:1;2171;2164:12;2108:70;2011:173;;;:::o;2189:254::-;2257:6;2265;2318:2;2306:9;2297:7;2293:23;2289:32;2286:52;;;2334:1;2331;2324:12;2286:52;2357:29;2376:9;2357:29;:::i;:::-;2347:39;2433:2;2418:18;;;;2405:32;;-1:-1:-1;;;2189:254:1:o;2630:328::-;2707:6;2715;2723;2776:2;2764:9;2755:7;2751:23;2747:32;2744:52;;;2792:1;2789;2782:12;2744:52;2815:29;2834:9;2815:29;:::i;:::-;2805:39;;2863:38;2897:2;2886:9;2882:18;2863:38;:::i;:::-;2853:48;;2948:2;2937:9;2933:18;2920:32;2910:42;;2630:328;;;;;:::o;2963:260::-;3031:6;3039;3092:2;3080:9;3071:7;3067:23;3063:32;3060:52;;;3108:1;3105;3098:12;3060:52;3131:29;3150:9;3131:29;:::i;:::-;3121:39;;3179:38;3213:2;3202:9;3198:18;3179:38;:::i;:::-;3169:48;;2963:260;;;;;:::o;3413:127::-;3474:10;3469:3;3465:20;3462:1;3455:31;3505:4;3502:1;3495:15;3529:4;3526:1;3519:15;3545:275;3616:2;3610:9;3681:2;3662:13;;-1:-1:-1;;3658:27:1;3646:40;;3716:18;3701:34;;3737:22;;;3698:62;3695:88;;;3763:18;;:::i;:::-;3799:2;3792:22;3545:275;;-1:-1:-1;3545:275:1:o;3825:407::-;3890:5;3924:18;3916:6;3913:30;3910:56;;;3946:18;;:::i;:::-;3984:57;4029:2;4008:15;;-1:-1:-1;;4004:29:1;4035:4;4000:40;3984:57;:::i;:::-;3975:66;;4064:6;4057:5;4050:21;4104:3;4095:6;4090:3;4086:16;4083:25;4080:45;;;4121:1;4118;4111:12;4080:45;4170:6;4165:3;4158:4;4151:5;4147:16;4134:43;4224:1;4217:4;4208:6;4201:5;4197:18;4193:29;4186:40;3825:407;;;;;:::o;4237:451::-;4306:6;4359:2;4347:9;4338:7;4334:23;4330:32;4327:52;;;4375:1;4372;4365:12;4327:52;4415:9;4402:23;4448:18;4440:6;4437:30;4434:50;;;4480:1;4477;4470:12;4434:50;4503:22;;4556:4;4548:13;;4544:27;-1:-1:-1;4534:55:1;;4585:1;4582;4575:12;4534:55;4608:74;4674:7;4669:2;4656:16;4651:2;4647;4643:11;4608:74;:::i;4693:186::-;4752:6;4805:2;4793:9;4784:7;4780:23;4776:32;4773:52;;;4821:1;4818;4811:12;4773:52;4844:29;4863:9;4844:29;:::i;4884:820::-;4997:6;5005;5013;5021;5029;5082:3;5070:9;5061:7;5057:23;5053:33;5050:53;;;5099:1;5096;5089:12;5050:53;5135:9;5122:23;5112:33;;5192:2;5181:9;5177:18;5164:32;5154:42;;5243:2;5232:9;5228:18;5215:32;5205:42;;5298:2;5287:9;5283:18;5270:32;5321:18;5362:2;5354:6;5351:14;5348:34;;;5378:1;5375;5368:12;5348:34;5416:6;5405:9;5401:22;5391:32;;5461:7;5454:4;5450:2;5446:13;5442:27;5432:55;;5483:1;5480;5473:12;5432:55;5523:2;5510:16;5549:2;5541:6;5538:14;5535:34;;;5565:1;5562;5555:12;5535:34;5618:7;5613:2;5603:6;5600:1;5596:14;5592:2;5588:23;5584:32;5581:45;5578:65;;;5639:1;5636;5629:12;5578:65;4884:820;;;;-1:-1:-1;4884:820:1;;-1:-1:-1;5670:2:1;5662:11;;5692:6;4884:820;-1:-1:-1;;;4884:820:1:o;5709:347::-;5774:6;5782;5835:2;5823:9;5814:7;5810:23;5806:32;5803:52;;;5851:1;5848;5841:12;5803:52;5874:29;5893:9;5874:29;:::i;:::-;5864:39;;5953:2;5942:9;5938:18;5925:32;6000:5;5993:13;5986:21;5979:5;5976:32;5966:60;;6022:1;6019;6012:12;5966:60;6045:5;6035:15;;;5709:347;;;;;:::o;6061:667::-;6156:6;6164;6172;6180;6233:3;6221:9;6212:7;6208:23;6204:33;6201:53;;;6250:1;6247;6240:12;6201:53;6273:29;6292:9;6273:29;:::i;:::-;6263:39;;6321:38;6355:2;6344:9;6340:18;6321:38;:::i;:::-;6311:48;;6406:2;6395:9;6391:18;6378:32;6368:42;;6461:2;6450:9;6446:18;6433:32;6488:18;6480:6;6477:30;6474:50;;;6520:1;6517;6510:12;6474:50;6543:22;;6596:4;6588:13;;6584:27;-1:-1:-1;6574:55:1;;6625:1;6622;6615:12;6574:55;6648:74;6714:7;6709:2;6696:16;6691:2;6687;6683:11;6648:74;:::i;:::-;6638:84;;;6061:667;;;;;;;:::o;6733:1022::-;6826:6;6834;6887:2;6875:9;6866:7;6862:23;6858:32;6855:52;;;6903:1;6900;6893:12;6855:52;6943:9;6930:23;6972:18;7013:2;7005:6;7002:14;6999:34;;;7029:1;7026;7019:12;6999:34;7067:6;7056:9;7052:22;7042:32;;7112:7;7105:4;7101:2;7097:13;7093:27;7083:55;;7134:1;7131;7124:12;7083:55;7170:2;7157:16;7192:4;7215:2;7211;7208:10;7205:36;;;7221:18;;:::i;:::-;7267:2;7264:1;7260:10;7250:20;;7290:28;7314:2;7310;7306:11;7290:28;:::i;:::-;7352:15;;;7422:11;;;7418:20;;;7383:12;;;;7450:19;;;7447:39;;;7482:1;7479;7472:12;7447:39;7506:11;;;;7526:148;7542:6;7537:3;7534:15;7526:148;;;7608:23;7627:3;7608:23;:::i;:::-;7596:36;;7559:12;;;;7652;;;;7526:148;;;7693:5;7730:18;;;;7717:32;;-1:-1:-1;;;;;;;6733:1022:1:o;7760:356::-;7962:2;7944:21;;;7981:18;;;7974:30;8040:34;8035:2;8020:18;;8013:62;8107:2;8092:18;;7760:356::o;8121:380::-;8200:1;8196:12;;;;8243;;;8264:61;;8318:4;8310:6;8306:17;8296:27;;8264:61;8371:2;8363:6;8360:14;8340:18;8337:38;8334:161;;;8417:10;8412:3;8408:20;8405:1;8398:31;8452:4;8449:1;8442:15;8480:4;8477:1;8470:15;8334:161;;8121:380;;;:::o;9746:413::-;9948:2;9930:21;;;9987:2;9967:18;;;9960:30;10026:34;10021:2;10006:18;;9999:62;-1:-1:-1;;;10092:2:1;10077:18;;10070:47;10149:3;10134:19;;9746:413::o;10576:127::-;10637:10;10632:3;10628:20;10625:1;10618:31;10668:4;10665:1;10658:15;10692:4;10689:1;10682:15;10708:168;10748:7;10814:1;10810;10806:6;10802:14;10799:1;10796:21;10791:1;10784:9;10777:17;10773:45;10770:71;;;10821:18;;:::i;:::-;-1:-1:-1;10861:9:1;;10708:168::o;10881:127::-;10942:10;10937:3;10933:20;10930:1;10923:31;10973:4;10970:1;10963:15;10997:4;10994:1;10987:15;11013:120;11053:1;11079;11069:35;;11084:18;;:::i;:::-;-1:-1:-1;11118:9:1;;11013:120::o;11551:127::-;11612:10;11607:3;11603:20;11600:1;11593:31;11643:4;11640:1;11633:15;11667:4;11664:1;11657:15;13207:125;13247:4;13275:1;13272;13269:8;13266:34;;;13280:18;;:::i;:::-;-1:-1:-1;13317:9:1;;13207:125::o;13740:128::-;13780:3;13811:1;13807:6;13804:1;13801:13;13798:39;;;13817:18;;:::i;:::-;-1:-1:-1;13853:9:1;;13740:128::o;14590:135::-;14629:3;-1:-1:-1;;14650:17:1;;14647:43;;;14670:18;;:::i;:::-;-1:-1:-1;14717:1:1;14706:13;;14590:135::o;15559:185::-;15601:3;15639:5;15633:12;15654:52;15699:6;15694:3;15687:4;15680:5;15676:16;15654:52;:::i;:::-;15722:16;;;;;15559:185;-1:-1:-1;;15559:185:1:o;15749:1174::-;15925:3;15954:1;15987:6;15981:13;16017:3;16039:1;16067:9;16063:2;16059:18;16049:28;;16127:2;16116:9;16112:18;16149;16139:61;;16193:4;16185:6;16181:17;16171:27;;16139:61;16219:2;16267;16259:6;16256:14;16236:18;16233:38;16230:165;;;-1:-1:-1;;;16294:33:1;;16350:4;16347:1;16340:15;16380:4;16301:3;16368:17;16230:165;16411:18;16438:104;;;;16556:1;16551:320;;;;16404:467;;16438:104;-1:-1:-1;;16471:24:1;;16459:37;;16516:16;;;;-1:-1:-1;16438:104:1;;16551:320;15506:1;15499:14;;;15543:4;15530:18;;16646:1;16660:165;16674:6;16671:1;16668:13;16660:165;;;16752:14;;16739:11;;;16732:35;16795:16;;;;16689:10;;16660:165;;;16664:3;;16854:6;16849:3;16845:16;16838:23;;16404:467;;;;;;;16887:30;16913:3;16905:6;16887:30;:::i;:::-;16880:37;15749:1174;-1:-1:-1;;;;;15749:1174:1:o;19637:414::-;19839:2;19821:21;;;19878:2;19858:18;;;19851:30;19917:34;19912:2;19897:18;;19890:62;-1:-1:-1;;;19983:2:1;19968:18;;19961:48;20041:3;20026:19;;19637:414::o;20056:112::-;20088:1;20114;20104:35;;20119:18;;:::i;:::-;-1:-1:-1;20153:9:1;;20056:112::o;20173:500::-;-1:-1:-1;;;;;20442:15:1;;;20424:34;;20494:15;;20489:2;20474:18;;20467:43;20541:2;20526:18;;20519:34;;;20589:3;20584:2;20569:18;;20562:31;;;20367:4;;20610:57;;20647:19;;20639:6;20610:57;:::i;:::-;20602:65;20173:500;-1:-1:-1;;;;;;20173:500:1:o;20678:249::-;20747:6;20800:2;20788:9;20779:7;20775:23;20771:32;20768:52;;;20816:1;20813;20806:12;20768:52;20848:9;20842:16;20867:30;20891:5;20867:30;:::i;20932:127::-;20993:10;20988:3;20984:20;20981:1;20974:31;21024:4;21021:1;21014:15;21048:4;21045:1;21038:15

Swarm Source

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