ETH Price: $3,980.53 (+1.83%)

Token

NotOkayBears (Bear)
 

Overview

Max Total Supply

3,000 Bear

Holders

3

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 Bear
0x9fe257e8914032d2cae2f9eac46d4383f46ac87b
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:
NotOkayBears

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;



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


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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)
/**
 * @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}.
 */
/* library Address {
    function isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
} */
abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
    
    string private _name;
    string private _symbol;

    // Mapping from token ID to owner address
    address[] internal _owners;

    mapping(uint256 => address) private _tokenApprovals;
    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 (uint) 
    {
        require(owner != address(0), "ERC721: balance query for the zero address");

        uint count;
        for( uint i; i < _owners.length; ++i ){
          if( owner == _owners[i] )
            ++count;
        }
        return count;
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        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 or 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 tokenId < _owners.length && _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, "");
    }

    /**
     * @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, _owners.length - 1, _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) internal virtual {
        /* require(to != address(0), "ERC721: mint to the zero address"); */
        /* require(!_exists(tokenId), "ERC721: token already minted"); */

        /* _beforeTokenTransfer(address(0), to, tokenId); */
        _owners.push(to);

        emit Transfer(address(0), to, _owners.length - 1);
    }

    /**
     * @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);
        _owners[tokenId] = address(0);

        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);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


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

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

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

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

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

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

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

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


contract NotOkayBears is ERC721, Ownable {
    using Strings for uint256;

    uint256 private maxTokens;

    mapping(uint256 => string) private customTokensURIs;

    bool private _saleEnabled = false;

    bool private _freeMintEnabled = false;

    uint256 private _maxMintForUser;

    uint256 private _maxFreeMints;

    uint256 private _currentFreeMints;
    
    string private _contractURI;
    string  private _baseTokenURI;

    address private serverAddress = address(0);
    
    mapping(bytes => bool) private signatureUsed;

    uint256 price = 1 ether;

    mapping (address => uint256) freeMints;

    
    constructor(uint256 maxTokens_, bool saleEnabled_, bool freeMintEnabled_, string memory baseURI_, uint256 maxMintForUser_, uint256 maxFreeMints_, uint256 price_) ERC721("NotOkayBears","Bear") {
        maxTokens = maxTokens_;

        _saleEnabled = saleEnabled_;

        _freeMintEnabled = freeMintEnabled_;

        _baseTokenURI = baseURI_;

        _maxMintForUser = maxMintForUser_;

        _maxFreeMints = maxFreeMints_;

        price = price_;
    }

    function setServerAddress(address target) external onlyOwner {
        serverAddress = target;
    }

    function setMaxTokens(uint256 _maxTokens) external onlyOwner {
        maxTokens = _maxTokens;
    }

    function setMaxMintForUser(uint256 maxMintForUser_) external onlyOwner {
        _maxMintForUser = maxMintForUser_;
    }

    function setMaxFreeMints(uint256 maxFreeMints_) external onlyOwner {
        _maxFreeMints = maxFreeMints_;
    }

    function getMaxTokens()  external view returns(uint256) {
        return maxTokens;
    }
    
    function hasFreeMint(address target) public view returns(bool){
        return _freeMintEnabled && freeMints[target] < _maxMintForUser && _currentFreeMints < _maxFreeMints;
    }
    
    function freeMintEnabled() external view returns(bool){
        return _freeMintEnabled;
    }
    
    function freeMintOn() external onlyOwner{
        _freeMintEnabled = true;
    }
    
    function freeMintOff() external onlyOwner{
        _freeMintEnabled = false;
    }
    
    function saleEnabled() external view returns(bool){
        return _saleEnabled;
    }
    
    function saleOn() external onlyOwner{
        _saleEnabled = true;
    }
    
    function saleOff() external onlyOwner{
        _saleEnabled = false;
    }

    function totalSupply() public view returns(uint256) {
        return maxTokens;
    }
    
    function setPrice(uint256 price_) external onlyOwner {
        price = price_;
    }


    function mintAdmin(address _to, uint256 count) external onlyOwner {
        require(tokensAvailable() >= count, "Max tokens reached");
        for (uint256 i; i < count; i++) {
            _mint(_to);
        }
    }
    

    function mint(uint256 count) external payable {
        require(_saleEnabled, "Sale off");
        require(msg.value >= count*price, "Insufficient value to mint");
        require(tokensAvailable() >= count, "Max tokens reached");
        for (uint256 i; i < count; i++) {
            _mint(msg.sender);
        }
    }


    function freeMint(uint256 count) external {
        require(_freeMintEnabled, "Free mint off");
        require(freeMints[msg.sender] + count <= _maxMintForUser, "You have max tokens");
        require(_currentFreeMints + count <= _maxFreeMints, "You have max tokens");
        for (uint256 i; i < count; i++) {
            _mint(msg.sender);
            freeMints[msg.sender]++;
            _currentFreeMints++;
        }
    }
    

    function mintServer(uint256 count, string memory salt, bytes memory signature) external payable {
        bytes32 message = prefixed(keccak256(abi.encodePacked(msg.value, msg.sender, count, salt)));
        require(recoverSigner(message, signature) == serverAddress, "Error");
        signatureUsed[signature] = true;
        for (uint256 i; i < count; i++) {
            _mint(msg.sender);
        }
    }

    function mintServer(uint256 count, string memory uri, string memory salt, bytes memory signature) external payable {
        bytes32 message = prefixed(keccak256(abi.encodePacked(msg.value, msg.sender, count, uri, salt)));
        require(recoverSigner(message, signature) == serverAddress, "Error");
        signatureUsed[signature] = true;
        for (uint256 i; i < count; i++) {
            _mint(msg.sender);
            customTokensURIs[_owners.length - 1] = uri;
        }
    }


    function burn(uint256 tokenId) external {
        require(ownerOf(tokenId) == msg.sender || msg.sender == owner(), "You dont have this token");
        _burn(tokenId);
    }


    function splitSignature(bytes memory sig) internal pure returns (uint8 v, bytes32 r, bytes32 s) {
        require(sig.length == 65);
        assembly {
            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }
        return (v, r, s);
    }


    function recoverSigner(bytes32 message, bytes memory sig) internal pure returns (address) {
        (uint8 v, bytes32 r, bytes32 s) = splitSignature(sig);
        return ecrecover(message, v, r, s);
    }
    
    function prefixed(bytes32 hash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    function setTokenURI(uint256 token, string memory uri) external onlyOwner {
        customTokensURIs[token] = uri;
    }

    function contractURI() public view returns (string memory) {
    	return _contractURI;
    }
    
    function withdraw() external onlyOwner
    {
        Address.sendValue(payable(msg.sender), address(this).balance);
    }

    function tokensAvailable() public view returns (uint256) {
        return maxTokens - _owners.length;
    }

    function _baseURI() internal view override  returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string memory uri) external onlyOwner {
        _baseTokenURI = uri;
    }
    
    function setContractURI(string memory uri) external onlyOwner {
        _contractURI = uri;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if(bytes(customTokensURIs[tokenId]).length != 0) return customTokensURIs[tokenId];
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
    }

    function URI(uint256 tokenId) external view virtual returns (string memory) {
        return tokenURI(tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"maxTokens_","type":"uint256"},{"internalType":"bool","name":"saleEnabled_","type":"bool"},{"internalType":"bool","name":"freeMintEnabled_","type":"bool"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint256","name":"maxMintForUser_","type":"uint256"},{"internalType":"uint256","name":"maxFreeMints_","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMintOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"hasFreeMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintServer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"string","name":"salt","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintServer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxFreeMints_","type":"uint256"}],"name":"setMaxFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintForUser_","type":"uint256"}],"name":"setMaxMintForUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"setServerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}]

60806040526008805461ffff19169055600e80546001600160a01b0319169055670de0b6b3a76400006010553480156200003857600080fd5b5060405162002cda38038062002cda8339810160408190526200005b916200023e565b604080518082018252600c81526b4e6f744f6b6179426561727360a01b6020808301918252835180850190945260048452632132b0b960e11b908401528151919291620000ab9160009162000182565b508051620000c190600190602084019062000182565b505050620000de620000d86200012c60201b60201c565b62000130565b60068790556008805461ffff191687151561ff001916176101008715150217905583516200011490600d90602087019062000182565b50600992909255600a5560105550620003bc92505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001909062000369565b90600052602060002090601f016020900481019282620001b45760008555620001ff565b82601f10620001cf57805160ff1916838001178555620001ff565b82800160010185558215620001ff579182015b82811115620001ff578251825591602001919060010190620001e2565b506200020d92915062000211565b5090565b5b808211156200020d576000815560010162000212565b805180151581146200023957600080fd5b919050565b600080600080600080600060e0888a0312156200025a57600080fd5b8751965060206200026d818a0162000228565b96506200027d60408a0162000228565b60608a01519096506001600160401b03808211156200029b57600080fd5b818b0191508b601f830112620002b057600080fd5b815181811115620002c557620002c5620003a6565b604051601f8201601f19908116603f01168101908382118183101715620002f057620002f0620003a6565b816040528281528e868487010111156200030957600080fd5b600093505b828410156200032d57848401860151818501870152928501926200030e565b828411156200033f5760008684830101525b8099505050505050506080880151925060a0880151915060c0880151905092959891949750929550565b600181811c908216806200037e57607f821691505b60208210811415620003a057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61290e80620003cc6000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d5cde1f21161007a578063d5cde1f21461069f578063dc8edabf146106bf578063deac290e146106d2578063e8a3d485146106e5578063e985e9c5146106fa578063f2fde38b1461074357600080fd5b8063a22cb4651461060a578063b88d4fde1461062a578063c3a719991461064a578063c87b56dd1461066a578063d28021bb1461068a57600080fd5b80638da5cb5b116101085780638da5cb5b14610564578063901e1c011461058257806391b7f5ed146105a2578063938e3d7b146105c257806395d89b41146105e2578063a0712d68146105f757600080fd5b806370a08231146104e2578063715018a61461050257806371b9b64614610517578063773ef1cf1461052f5780637c928fe91461054457600080fd5b80633ccfd60b116101dd57806355f804b3116101a157806355f804b31461045057806360659a921461047057806362ad68aa146104855780636352211e146104a257806366b9442e146104c25780636abcded11461035257600080fd5b80633ccfd60b146103bb578063407043fc146103d057806342842e0e146103f057806342966c681461041057806347b64eb01461043057600080fd5b8063162094c411610224578063162094c41461033257806318160ddd1461035257806323b872dd146103715780633103356814610391578063397ea5d7146103a657600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b8578063095ea7b3146102f057806311e776fe14610312575b600080fd5b34801561026d57600080fd5b5061028161027c3660046123b0565b610763565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab6107b5565b60405161028d91906126d8565b3480156102c457600080fd5b506102d86102d336600461241f565b610847565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b366004612386565b6108d4565b005b34801561031e57600080fd5b5061031061032d36600461241f565b6109ea565b34801561033e57600080fd5b5061031061034d366004612438565b610a19565b34801561035e57600080fd5b506006545b60405190815260200161028d565b34801561037d57600080fd5b5061031061038c3660046122a6565b610a62565b34801561039d57600080fd5b50610310610adc565b3480156103b257600080fd5b50610310610b13565b3480156103c757600080fd5b50610310610b4e565b3480156103dc57600080fd5b506103106103eb36600461241f565b610b84565b3480156103fc57600080fd5b5061031061040b3660046122a6565b610bb3565b34801561041c57600080fd5b5061031061042b36600461241f565b610bce565b34801561043c57600080fd5b5061031061044b366004612258565b610c4f565b34801561045c57600080fd5b5061031061046b3660046123ea565b610c9b565b34801561047c57600080fd5b50610363610cdc565b34801561049157600080fd5b50600854610100900460ff16610281565b3480156104ae57600080fd5b506102d86104bd36600461241f565b610cf3565b3480156104ce57600080fd5b506103106104dd36600461241f565b610d7f565b3480156104ee57600080fd5b506103636104fd366004612258565b610dae565b34801561050e57600080fd5b50610310610e7c565b34801561052357600080fd5b5060085460ff16610281565b34801561053b57600080fd5b50610310610eb0565b34801561055057600080fd5b5061031061055f36600461241f565b610ee9565b34801561057057600080fd5b506005546001600160a01b03166102d8565b34801561058e57600080fd5b506102ab61059d36600461241f565b611043565b3480156105ae57600080fd5b506103106105bd36600461241f565b61104e565b3480156105ce57600080fd5b506103106105dd3660046123ea565b61107d565b3480156105ee57600080fd5b506102ab6110ba565b61031061060536600461241f565b6110c9565b34801561061657600080fd5b5061031061062536600461234a565b6111d4565b34801561063657600080fd5b506103106106453660046122e2565b611299565b34801561065657600080fd5b50610310610665366004612386565b61131b565b34801561067657600080fd5b506102ab61068536600461241f565b6113b7565b34801561069657600080fd5b50610310611540565b3480156106ab57600080fd5b506102816106ba366004612258565b611576565b6103106106cd36600461247f565b6115bd565b6103106106e03660046124ec565b6116ef565b3480156106f157600080fd5b506102ab6117fd565b34801561070657600080fd5b50610281610715366004612273565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561074f57600080fd5b5061031061075e366004612258565b61180c565b60006001600160e01b031982166380ac58cd60e01b148061079457506001600160e01b03198216635b5e139f60e01b145b806107af57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546107c490612800565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090612800565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050905090565b6000610852826118a4565b6108b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006108df82610cf3565b9050806001600160a01b0316836001600160a01b0316141561094d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108af565b336001600160a01b038216148061096957506109698133610715565b6109db5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108af565b6109e583836118ee565b505050565b6005546001600160a01b03163314610a145760405162461bcd60e51b81526004016108af9061273d565b600655565b6005546001600160a01b03163314610a435760405162461bcd60e51b81526004016108af9061273d565b600082815260076020908152604090912082516109e592840190612116565b610a6c338261195c565b610ad15760405162461bcd60e51b815260206004820152603060248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201526f1ddb995c881bdc88185c1c1c9bdd995960821b60648201526084016108af565b6109e5838383611a46565b6005546001600160a01b03163314610b065760405162461bcd60e51b81526004016108af9061273d565b6008805461ff0019169055565b6005546001600160a01b03163314610b3d5760405162461bcd60e51b81526004016108af9061273d565b6008805461ff001916610100179055565b6005546001600160a01b03163314610b785760405162461bcd60e51b81526004016108af9061273d565b610b823347611b9c565b565b6005546001600160a01b03163314610bae5760405162461bcd60e51b81526004016108af9061273d565b600a55565b6109e583838360405180602001604052806000815250611299565b33610bd882610cf3565b6001600160a01b03161480610bf757506005546001600160a01b031633145b610c435760405162461bcd60e51b815260206004820152601860248201527f596f7520646f6e742068617665207468697320746f6b656e000000000000000060448201526064016108af565b610c4c81611cb5565b50565b6005546001600160a01b03163314610c795760405162461bcd60e51b81526004016108af9061273d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610cc55760405162461bcd60e51b81526004016108af9061273d565b8051610cd890600d906020840190612116565b5050565b600254600654600091610cee916127bd565b905090565b60008060028381548110610d0957610d09612896565b6000918252602090912001546001600160a01b03169050806107af5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108af565b6005546001600160a01b03163314610da95760405162461bcd60e51b81526004016108af9061273d565b600955565b60006001600160a01b038216610e195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108af565b6000805b600254811015610e755760028181548110610e3a57610e3a612896565b6000918252602090912001546001600160a01b0385811691161415610e6557610e628261283b565b91505b610e6e8161283b565b9050610e1d565b5092915050565b6005546001600160a01b03163314610ea65760405162461bcd60e51b81526004016108af9061273d565b610b826000611d37565b6005546001600160a01b03163314610eda5760405162461bcd60e51b81526004016108af9061273d565b6008805460ff19166001179055565b600854610100900460ff16610f305760405162461bcd60e51b815260206004820152600d60248201526c233932b29036b4b73a1037b33360991b60448201526064016108af565b60095433600090815260116020526040902054610f4e908390612772565b1115610f925760405162461bcd60e51b8152602060048201526013602482015272596f752068617665206d617820746f6b656e7360681b60448201526064016108af565b600a5481600b54610fa39190612772565b1115610fe75760405162461bcd60e51b8152602060048201526013602482015272596f752068617665206d617820746f6b656e7360681b60448201526064016108af565b60005b81811015610cd857610ffb33611d89565b3360009081526011602052604081208054916110168361283b565b9091555050600b805490600061102b8361283b565b9190505550808061103b9061283b565b915050610fea565b60606107af826113b7565b6005546001600160a01b031633146110785760405162461bcd60e51b81526004016108af9061273d565b601055565b6005546001600160a01b031633146110a75760405162461bcd60e51b81526004016108af9061273d565b8051610cd890600c906020840190612116565b6060600180546107c490612800565b60085460ff166111065760405162461bcd60e51b815260206004820152600860248201526729b0b6329037b33360c11b60448201526064016108af565b601054611113908261279e565b3410156111625760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742076616c756520746f206d696e7400000000000060448201526064016108af565b8061116b610cdc565b10156111ae5760405162461bcd60e51b815260206004820152601260248201527113585e081d1bdad95b9cc81c995858da195960721b60448201526064016108af565b60005b81811015610cd8576111c233611d89565b806111cc8161283b565b9150506111b1565b6001600160a01b03821633141561122d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108af565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112a3338361195c565b6113095760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b60648201526084016108af565b61131584848484611e1b565b50505050565b6005546001600160a01b031633146113455760405162461bcd60e51b81526004016108af9061273d565b8061134e610cdc565b10156113915760405162461bcd60e51b815260206004820152601260248201527113585e081d1bdad95b9cc81c995858da195960721b60448201526064016108af565b60005b818110156109e5576113a583611d89565b806113af8161283b565b915050611394565b60606113c2826118a4565b6114265760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108af565b6000828152600760205260409020805461143f90612800565b1590506114e4576000828152600760205260409020805461145f90612800565b80601f016020809104026020016040519081016040528092919081815260200182805461148b90612800565b80156114d85780601f106114ad576101008083540402835291602001916114d8565b820191906000526020600020905b8154815290600101906020018083116114bb57829003601f168201915b50505050509050919050565b60006114ee611e4e565b9050600081511161150e5760405180602001604052806000815250611539565b8061151884611e5d565b6040516020016115299291906125ba565b6040516020818303038152906040525b9392505050565b6005546001600160a01b0316331461156a5760405162461bcd60e51b81526004016108af9061273d565b6008805460ff19169055565b600854600090610100900460ff1680156115a957506009546001600160a01b038316600090815260116020526040902054105b80156107af5750600a54600b541092915050565b6000611639343386866040516020016115d994939291906125f9565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b600e549091506001600160a01b03166116528284611f5b565b6001600160a01b0316146116905760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b60448201526064016108af565b6001600f836040516116a2919061259e565b908152604051908190036020019020805491151560ff1990921691909117905560005b848110156116e8576116d633611d89565b806116e08161283b565b9150506116c5565b5050505050565b600061170d34338787876040516020016115d995949392919061263f565b600e549091506001600160a01b03166117268284611f5b565b6001600160a01b0316146117645760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b60448201526064016108af565b6001600f83604051611776919061259e565b908152604051908190036020019020805491151560ff1990921691909117905560005b858110156117f5576117aa33611d89565b846007600060016002805490506117c191906127bd565b815260200190815260200160002090805190602001906117e2929190612116565b50806117ed8161283b565b915050611799565b505050505050565b6060600c80546107c490612800565b6005546001600160a01b031633146118365760405162461bcd60e51b81526004016108af9061273d565b6001600160a01b03811661189b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108af565b610c4c81611d37565b600254600090821080156107af575060006001600160a01b0316600283815481106118d1576118d1612896565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061192382610cf3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611967826118a4565b6119c85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108af565b60006119d383610cf3565b9050806001600160a01b0316846001600160a01b03161480611a0e5750836001600160a01b0316611a0384610847565b6001600160a01b0316145b80611a3e57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a5982610cf3565b6001600160a01b031614611ac15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108af565b6001600160a01b038216611b235760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108af565b611b2e6000826118ee565b8160028281548110611b4257611b42612896565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b80471015611bec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108af565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c39576040519150601f19603f3d011682016040523d82523d6000602084013e611c3e565b606091505b50509050806109e55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108af565b6000611cc082610cf3565b9050611ccd6000836118ee565b600060028381548110611ce257611ce2612896565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600280546001808201835560008390527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b0319166001600160a01b0385161790559054611de291906127bd565b6040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450565b611e26848484611a46565b611e3284848484611fda565b6113155760405162461bcd60e51b81526004016108af906126eb565b6060600d80546107c490612800565b606081611e815750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eab5780611e958161283b565b9150611ea49050600a8361278a565b9150611e85565b60008167ffffffffffffffff811115611ec657611ec66128ac565b6040519080825280601f01601f191660200182016040528015611ef0576020820181803683370190505b5090505b8415611a3e57611f056001836127bd565b9150611f12600a86612856565b611f1d906030612772565b60f81b818381518110611f3257611f32612896565b60200101906001600160f81b031916908160001a905350611f54600a8661278a565b9450611ef4565b600080600080611f6a856120e7565b6040805160008152602081018083528b905260ff8516918101919091526060810183905260808101829052929550909350915060019060a0016020604051602081039080840390855afa158015611fc5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60006001600160a01b0384163b156120dc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061201e90339089908890889060040161269b565b602060405180830381600087803b15801561203857600080fd5b505af1925050508015612068575060408051601f3d908101601f19168201909252612065918101906123cd565b60015b6120c2573d808015612096576040519150601f19603f3d011682016040523d82523d6000602084013e61209b565b606091505b5080516120ba5760405162461bcd60e51b81526004016108af906126eb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a3e565b506001949350505050565b600080600083516041146120fa57600080fd5b5050506020810151604082015160609092015160001a92909190565b82805461212290612800565b90600052602060002090601f016020900481019282612144576000855561218a565b82601f1061215d57805160ff191683800117855561218a565b8280016001018555821561218a579182015b8281111561218a57825182559160200191906001019061216f565b5061219692915061219a565b5090565b5b80821115612196576000815560010161219b565b80356001600160a01b03811681146121c657600080fd5b919050565b600082601f8301126121dc57600080fd5b813567ffffffffffffffff808211156121f7576121f76128ac565b604051601f8301601f19908116603f0116810190828211818310171561221f5761221f6128ac565b8160405283815286602085880101111561223857600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561226a57600080fd5b611539826121af565b6000806040838503121561228657600080fd5b61228f836121af565b915061229d602084016121af565b90509250929050565b6000806000606084860312156122bb57600080fd5b6122c4846121af565b92506122d2602085016121af565b9150604084013590509250925092565b600080600080608085870312156122f857600080fd5b612301856121af565b935061230f602086016121af565b925060408501359150606085013567ffffffffffffffff81111561233257600080fd5b61233e878288016121cb565b91505092959194509250565b6000806040838503121561235d57600080fd5b612366836121af565b91506020830135801515811461237b57600080fd5b809150509250929050565b6000806040838503121561239957600080fd5b6123a2836121af565b946020939093013593505050565b6000602082840312156123c257600080fd5b8135611539816128c2565b6000602082840312156123df57600080fd5b8151611539816128c2565b6000602082840312156123fc57600080fd5b813567ffffffffffffffff81111561241357600080fd5b611a3e848285016121cb565b60006020828403121561243157600080fd5b5035919050565b6000806040838503121561244b57600080fd5b82359150602083013567ffffffffffffffff81111561246957600080fd5b612475858286016121cb565b9150509250929050565b60008060006060848603121561249457600080fd5b83359250602084013567ffffffffffffffff808211156124b357600080fd5b6124bf878388016121cb565b935060408601359150808211156124d557600080fd5b506124e2868287016121cb565b9150509250925092565b6000806000806080858703121561250257600080fd5b84359350602085013567ffffffffffffffff8082111561252157600080fd5b61252d888389016121cb565b9450604087013591508082111561254357600080fd5b61254f888389016121cb565b9350606087013591508082111561256557600080fd5b5061233e878288016121cb565b6000815180845261258a8160208601602086016127d4565b601f01601f19169290920160200192915050565b600082516125b08184602087016127d4565b9190910192915050565b600083516125cc8184602088016127d4565b8351908301906125e08183602088016127d4565b64173539b7b760d91b9101908152600501949350505050565b8481526bffffffffffffffffffffffff198460601b1660208201528260348201526000825161262f8160548501602087016127d4565b9190910160540195945050505050565b8581526bffffffffffffffffffffffff198560601b166020820152836034820152600083516126758160548501602088016127d4565b83519083019061268c8160548401602088016127d4565b01605401979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126ce90830184612572565b9695505050505050565b6020815260006115396020830184612572565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156127855761278561286a565b500190565b60008261279957612799612880565b500490565b60008160001904831182151516156127b8576127b861286a565b500290565b6000828210156127cf576127cf61286a565b500390565b60005b838110156127ef5781810151838201526020016127d7565b838111156113155750506000910152565b600181811c9082168061281457607f821691505b6020821081141561283557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561284f5761284f61286a565b5060010190565b60008261286557612865612880565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c4c57600080fdfea2646970667358221220b2d98232080313cd3d29951b41acd20643eddb473ec548c70f16c7a5d2b66e3264736f6c6343000807003300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d643766466f443454736d766538677479727268597a59796b4e796344367a6b4370784d344d514d33723532512f00000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d5cde1f21161007a578063d5cde1f21461069f578063dc8edabf146106bf578063deac290e146106d2578063e8a3d485146106e5578063e985e9c5146106fa578063f2fde38b1461074357600080fd5b8063a22cb4651461060a578063b88d4fde1461062a578063c3a719991461064a578063c87b56dd1461066a578063d28021bb1461068a57600080fd5b80638da5cb5b116101085780638da5cb5b14610564578063901e1c011461058257806391b7f5ed146105a2578063938e3d7b146105c257806395d89b41146105e2578063a0712d68146105f757600080fd5b806370a08231146104e2578063715018a61461050257806371b9b64614610517578063773ef1cf1461052f5780637c928fe91461054457600080fd5b80633ccfd60b116101dd57806355f804b3116101a157806355f804b31461045057806360659a921461047057806362ad68aa146104855780636352211e146104a257806366b9442e146104c25780636abcded11461035257600080fd5b80633ccfd60b146103bb578063407043fc146103d057806342842e0e146103f057806342966c681461041057806347b64eb01461043057600080fd5b8063162094c411610224578063162094c41461033257806318160ddd1461035257806323b872dd146103715780633103356814610391578063397ea5d7146103a657600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b8578063095ea7b3146102f057806311e776fe14610312575b600080fd5b34801561026d57600080fd5b5061028161027c3660046123b0565b610763565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab6107b5565b60405161028d91906126d8565b3480156102c457600080fd5b506102d86102d336600461241f565b610847565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b366004612386565b6108d4565b005b34801561031e57600080fd5b5061031061032d36600461241f565b6109ea565b34801561033e57600080fd5b5061031061034d366004612438565b610a19565b34801561035e57600080fd5b506006545b60405190815260200161028d565b34801561037d57600080fd5b5061031061038c3660046122a6565b610a62565b34801561039d57600080fd5b50610310610adc565b3480156103b257600080fd5b50610310610b13565b3480156103c757600080fd5b50610310610b4e565b3480156103dc57600080fd5b506103106103eb36600461241f565b610b84565b3480156103fc57600080fd5b5061031061040b3660046122a6565b610bb3565b34801561041c57600080fd5b5061031061042b36600461241f565b610bce565b34801561043c57600080fd5b5061031061044b366004612258565b610c4f565b34801561045c57600080fd5b5061031061046b3660046123ea565b610c9b565b34801561047c57600080fd5b50610363610cdc565b34801561049157600080fd5b50600854610100900460ff16610281565b3480156104ae57600080fd5b506102d86104bd36600461241f565b610cf3565b3480156104ce57600080fd5b506103106104dd36600461241f565b610d7f565b3480156104ee57600080fd5b506103636104fd366004612258565b610dae565b34801561050e57600080fd5b50610310610e7c565b34801561052357600080fd5b5060085460ff16610281565b34801561053b57600080fd5b50610310610eb0565b34801561055057600080fd5b5061031061055f36600461241f565b610ee9565b34801561057057600080fd5b506005546001600160a01b03166102d8565b34801561058e57600080fd5b506102ab61059d36600461241f565b611043565b3480156105ae57600080fd5b506103106105bd36600461241f565b61104e565b3480156105ce57600080fd5b506103106105dd3660046123ea565b61107d565b3480156105ee57600080fd5b506102ab6110ba565b61031061060536600461241f565b6110c9565b34801561061657600080fd5b5061031061062536600461234a565b6111d4565b34801561063657600080fd5b506103106106453660046122e2565b611299565b34801561065657600080fd5b50610310610665366004612386565b61131b565b34801561067657600080fd5b506102ab61068536600461241f565b6113b7565b34801561069657600080fd5b50610310611540565b3480156106ab57600080fd5b506102816106ba366004612258565b611576565b6103106106cd36600461247f565b6115bd565b6103106106e03660046124ec565b6116ef565b3480156106f157600080fd5b506102ab6117fd565b34801561070657600080fd5b50610281610715366004612273565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b34801561074f57600080fd5b5061031061075e366004612258565b61180c565b60006001600160e01b031982166380ac58cd60e01b148061079457506001600160e01b03198216635b5e139f60e01b145b806107af57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600080546107c490612800565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090612800565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050905090565b6000610852826118a4565b6108b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b60006108df82610cf3565b9050806001600160a01b0316836001600160a01b0316141561094d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016108af565b336001600160a01b038216148061096957506109698133610715565b6109db5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016108af565b6109e583836118ee565b505050565b6005546001600160a01b03163314610a145760405162461bcd60e51b81526004016108af9061273d565b600655565b6005546001600160a01b03163314610a435760405162461bcd60e51b81526004016108af9061273d565b600082815260076020908152604090912082516109e592840190612116565b610a6c338261195c565b610ad15760405162461bcd60e51b815260206004820152603060248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201526f1ddb995c881bdc88185c1c1c9bdd995960821b60648201526084016108af565b6109e5838383611a46565b6005546001600160a01b03163314610b065760405162461bcd60e51b81526004016108af9061273d565b6008805461ff0019169055565b6005546001600160a01b03163314610b3d5760405162461bcd60e51b81526004016108af9061273d565b6008805461ff001916610100179055565b6005546001600160a01b03163314610b785760405162461bcd60e51b81526004016108af9061273d565b610b823347611b9c565b565b6005546001600160a01b03163314610bae5760405162461bcd60e51b81526004016108af9061273d565b600a55565b6109e583838360405180602001604052806000815250611299565b33610bd882610cf3565b6001600160a01b03161480610bf757506005546001600160a01b031633145b610c435760405162461bcd60e51b815260206004820152601860248201527f596f7520646f6e742068617665207468697320746f6b656e000000000000000060448201526064016108af565b610c4c81611cb5565b50565b6005546001600160a01b03163314610c795760405162461bcd60e51b81526004016108af9061273d565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610cc55760405162461bcd60e51b81526004016108af9061273d565b8051610cd890600d906020840190612116565b5050565b600254600654600091610cee916127bd565b905090565b60008060028381548110610d0957610d09612896565b6000918252602090912001546001600160a01b03169050806107af5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016108af565b6005546001600160a01b03163314610da95760405162461bcd60e51b81526004016108af9061273d565b600955565b60006001600160a01b038216610e195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016108af565b6000805b600254811015610e755760028181548110610e3a57610e3a612896565b6000918252602090912001546001600160a01b0385811691161415610e6557610e628261283b565b91505b610e6e8161283b565b9050610e1d565b5092915050565b6005546001600160a01b03163314610ea65760405162461bcd60e51b81526004016108af9061273d565b610b826000611d37565b6005546001600160a01b03163314610eda5760405162461bcd60e51b81526004016108af9061273d565b6008805460ff19166001179055565b600854610100900460ff16610f305760405162461bcd60e51b815260206004820152600d60248201526c233932b29036b4b73a1037b33360991b60448201526064016108af565b60095433600090815260116020526040902054610f4e908390612772565b1115610f925760405162461bcd60e51b8152602060048201526013602482015272596f752068617665206d617820746f6b656e7360681b60448201526064016108af565b600a5481600b54610fa39190612772565b1115610fe75760405162461bcd60e51b8152602060048201526013602482015272596f752068617665206d617820746f6b656e7360681b60448201526064016108af565b60005b81811015610cd857610ffb33611d89565b3360009081526011602052604081208054916110168361283b565b9091555050600b805490600061102b8361283b565b9190505550808061103b9061283b565b915050610fea565b60606107af826113b7565b6005546001600160a01b031633146110785760405162461bcd60e51b81526004016108af9061273d565b601055565b6005546001600160a01b031633146110a75760405162461bcd60e51b81526004016108af9061273d565b8051610cd890600c906020840190612116565b6060600180546107c490612800565b60085460ff166111065760405162461bcd60e51b815260206004820152600860248201526729b0b6329037b33360c11b60448201526064016108af565b601054611113908261279e565b3410156111625760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742076616c756520746f206d696e7400000000000060448201526064016108af565b8061116b610cdc565b10156111ae5760405162461bcd60e51b815260206004820152601260248201527113585e081d1bdad95b9cc81c995858da195960721b60448201526064016108af565b60005b81811015610cd8576111c233611d89565b806111cc8161283b565b9150506111b1565b6001600160a01b03821633141561122d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108af565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6112a3338361195c565b6113095760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b60648201526084016108af565b61131584848484611e1b565b50505050565b6005546001600160a01b031633146113455760405162461bcd60e51b81526004016108af9061273d565b8061134e610cdc565b10156113915760405162461bcd60e51b815260206004820152601260248201527113585e081d1bdad95b9cc81c995858da195960721b60448201526064016108af565b60005b818110156109e5576113a583611d89565b806113af8161283b565b915050611394565b60606113c2826118a4565b6114265760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108af565b6000828152600760205260409020805461143f90612800565b1590506114e4576000828152600760205260409020805461145f90612800565b80601f016020809104026020016040519081016040528092919081815260200182805461148b90612800565b80156114d85780601f106114ad576101008083540402835291602001916114d8565b820191906000526020600020905b8154815290600101906020018083116114bb57829003601f168201915b50505050509050919050565b60006114ee611e4e565b9050600081511161150e5760405180602001604052806000815250611539565b8061151884611e5d565b6040516020016115299291906125ba565b6040516020818303038152906040525b9392505050565b6005546001600160a01b0316331461156a5760405162461bcd60e51b81526004016108af9061273d565b6008805460ff19169055565b600854600090610100900460ff1680156115a957506009546001600160a01b038316600090815260116020526040902054105b80156107af5750600a54600b541092915050565b6000611639343386866040516020016115d994939291906125f9565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b600e549091506001600160a01b03166116528284611f5b565b6001600160a01b0316146116905760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b60448201526064016108af565b6001600f836040516116a2919061259e565b908152604051908190036020019020805491151560ff1990921691909117905560005b848110156116e8576116d633611d89565b806116e08161283b565b9150506116c5565b5050505050565b600061170d34338787876040516020016115d995949392919061263f565b600e549091506001600160a01b03166117268284611f5b565b6001600160a01b0316146117645760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b60448201526064016108af565b6001600f83604051611776919061259e565b908152604051908190036020019020805491151560ff1990921691909117905560005b858110156117f5576117aa33611d89565b846007600060016002805490506117c191906127bd565b815260200190815260200160002090805190602001906117e2929190612116565b50806117ed8161283b565b915050611799565b505050505050565b6060600c80546107c490612800565b6005546001600160a01b031633146118365760405162461bcd60e51b81526004016108af9061273d565b6001600160a01b03811661189b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108af565b610c4c81611d37565b600254600090821080156107af575060006001600160a01b0316600283815481106118d1576118d1612896565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061192382610cf3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611967826118a4565b6119c85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016108af565b60006119d383610cf3565b9050806001600160a01b0316846001600160a01b03161480611a0e5750836001600160a01b0316611a0384610847565b6001600160a01b0316145b80611a3e57506001600160a01b0380821660009081526004602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611a5982610cf3565b6001600160a01b031614611ac15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016108af565b6001600160a01b038216611b235760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108af565b611b2e6000826118ee565b8160028281548110611b4257611b42612896565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b80471015611bec5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016108af565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c39576040519150601f19603f3d011682016040523d82523d6000602084013e611c3e565b606091505b50509050806109e55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016108af565b6000611cc082610cf3565b9050611ccd6000836118ee565b600060028381548110611ce257611ce2612896565b6000918252602082200180546001600160a01b0319166001600160a01b0393841617905560405184928416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600280546001808201835560008390527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b0319166001600160a01b0385161790559054611de291906127bd565b6040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450565b611e26848484611a46565b611e3284848484611fda565b6113155760405162461bcd60e51b81526004016108af906126eb565b6060600d80546107c490612800565b606081611e815750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eab5780611e958161283b565b9150611ea49050600a8361278a565b9150611e85565b60008167ffffffffffffffff811115611ec657611ec66128ac565b6040519080825280601f01601f191660200182016040528015611ef0576020820181803683370190505b5090505b8415611a3e57611f056001836127bd565b9150611f12600a86612856565b611f1d906030612772565b60f81b818381518110611f3257611f32612896565b60200101906001600160f81b031916908160001a905350611f54600a8661278a565b9450611ef4565b600080600080611f6a856120e7565b6040805160008152602081018083528b905260ff8516918101919091526060810183905260808101829052929550909350915060019060a0016020604051602081039080840390855afa158015611fc5573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60006001600160a01b0384163b156120dc57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061201e90339089908890889060040161269b565b602060405180830381600087803b15801561203857600080fd5b505af1925050508015612068575060408051601f3d908101601f19168201909252612065918101906123cd565b60015b6120c2573d808015612096576040519150601f19603f3d011682016040523d82523d6000602084013e61209b565b606091505b5080516120ba5760405162461bcd60e51b81526004016108af906126eb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a3e565b506001949350505050565b600080600083516041146120fa57600080fd5b5050506020810151604082015160609092015160001a92909190565b82805461212290612800565b90600052602060002090601f016020900481019282612144576000855561218a565b82601f1061215d57805160ff191683800117855561218a565b8280016001018555821561218a579182015b8281111561218a57825182559160200191906001019061216f565b5061219692915061219a565b5090565b5b80821115612196576000815560010161219b565b80356001600160a01b03811681146121c657600080fd5b919050565b600082601f8301126121dc57600080fd5b813567ffffffffffffffff808211156121f7576121f76128ac565b604051601f8301601f19908116603f0116810190828211818310171561221f5761221f6128ac565b8160405283815286602085880101111561223857600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561226a57600080fd5b611539826121af565b6000806040838503121561228657600080fd5b61228f836121af565b915061229d602084016121af565b90509250929050565b6000806000606084860312156122bb57600080fd5b6122c4846121af565b92506122d2602085016121af565b9150604084013590509250925092565b600080600080608085870312156122f857600080fd5b612301856121af565b935061230f602086016121af565b925060408501359150606085013567ffffffffffffffff81111561233257600080fd5b61233e878288016121cb565b91505092959194509250565b6000806040838503121561235d57600080fd5b612366836121af565b91506020830135801515811461237b57600080fd5b809150509250929050565b6000806040838503121561239957600080fd5b6123a2836121af565b946020939093013593505050565b6000602082840312156123c257600080fd5b8135611539816128c2565b6000602082840312156123df57600080fd5b8151611539816128c2565b6000602082840312156123fc57600080fd5b813567ffffffffffffffff81111561241357600080fd5b611a3e848285016121cb565b60006020828403121561243157600080fd5b5035919050565b6000806040838503121561244b57600080fd5b82359150602083013567ffffffffffffffff81111561246957600080fd5b612475858286016121cb565b9150509250929050565b60008060006060848603121561249457600080fd5b83359250602084013567ffffffffffffffff808211156124b357600080fd5b6124bf878388016121cb565b935060408601359150808211156124d557600080fd5b506124e2868287016121cb565b9150509250925092565b6000806000806080858703121561250257600080fd5b84359350602085013567ffffffffffffffff8082111561252157600080fd5b61252d888389016121cb565b9450604087013591508082111561254357600080fd5b61254f888389016121cb565b9350606087013591508082111561256557600080fd5b5061233e878288016121cb565b6000815180845261258a8160208601602086016127d4565b601f01601f19169290920160200192915050565b600082516125b08184602087016127d4565b9190910192915050565b600083516125cc8184602088016127d4565b8351908301906125e08183602088016127d4565b64173539b7b760d91b9101908152600501949350505050565b8481526bffffffffffffffffffffffff198460601b1660208201528260348201526000825161262f8160548501602087016127d4565b9190910160540195945050505050565b8581526bffffffffffffffffffffffff198560601b166020820152836034820152600083516126758160548501602088016127d4565b83519083019061268c8160548401602088016127d4565b01605401979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906126ce90830184612572565b9695505050505050565b6020815260006115396020830184612572565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156127855761278561286a565b500190565b60008261279957612799612880565b500490565b60008160001904831182151516156127b8576127b861286a565b500290565b6000828210156127cf576127cf61286a565b500390565b60005b838110156127ef5781810151838201526020016127d7565b838111156113155750506000910152565b600181811c9082168061281457607f821691505b6020821081141561283557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561284f5761284f61286a565b5060010190565b60008261286557612865612880565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610c4c57600080fdfea2646970667358221220b2d98232080313cd3d29951b41acd20643eddb473ec548c70f16c7a5d2b66e3264736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d643766466f443454736d766538677479727268597a59796b4e796344367a6b4370784d344d514d33723532512f00000000000000000000

-----Decoded View---------------
Arg [0] : maxTokens_ (uint256): 10000
Arg [1] : saleEnabled_ (bool): True
Arg [2] : freeMintEnabled_ (bool): True
Arg [3] : baseURI_ (string): ipfs://Qmd7fFoD4Tsmve8gtyrrhYzYykNycD6zkCpxM4MQM3r52Q/
Arg [4] : maxMintForUser_ (uint256): 20
Arg [5] : maxFreeMints_ (uint256): 1000
Arg [6] : price_ (uint256): 10000000000000000

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d643766466f443454736d766538677479727268597a5979
Arg [9] : 6b4e796344367a6b4370784d344d514d33723532512f00000000000000000000


Deployed Bytecode Sourcemap

36680:7047:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20744:355;;;;;;;;;;-1:-1:-1;20744:355:0;;;;;:::i;:::-;;:::i;:::-;;;9588:14:1;;9581:22;9563:41;;9551:2;9536:18;20744:355:0;;;;;;;;22010:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23570:308::-;;;;;;;;;;-1:-1:-1;23570:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8886:32:1;;;8868:51;;8856:2;8841:18;23570:308:0;8722:203:1;23093:411:0;;;;;;;;;;-1:-1:-1;23093:411:0;;;;;:::i;:::-;;:::i;:::-;;37924:102;;;;;;;;;;-1:-1:-1;37924:102:0;;;;;:::i;:::-;;:::i;42345:122::-;;;;;;;;;;-1:-1:-1;42345:122:0;;;;;:::i;:::-;;:::i;39151:87::-;;;;;;;;;;-1:-1:-1;39221:9:0;;39151:87;;;19668:25:1;;;19656:2;19641:18;39151:87:0;19522:177:1;24629:375:0;;;;;;;;;;-1:-1:-1;24629:375:0;;;;;:::i;:::-;;:::i;38785:84::-;;;;;;;;;;;;;:::i;38691:82::-;;;;;;;;;;;;;:::i;42581:124::-;;;;;;;;;;;;;:::i;38165:115::-;;;;;;;;;;-1:-1:-1;38165:115:0;;;;;:::i;:::-;;:::i;25075:185::-;;;;;;;;;;-1:-1:-1;25075:185:0;;;;;:::i;:::-;;:::i;41293:176::-;;;;;;;;;;-1:-1:-1;41293:176:0;;;;;:::i;:::-;;:::i;37814:102::-;;;;;;;;;;-1:-1:-1;37814:102:0;;;;;:::i;:::-;;:::i;42945:96::-;;;;;;;;;;-1:-1:-1;42945:96:0;;;;;:::i;:::-;;:::i;42713:109::-;;;;;;;;;;;;;:::i;38583:96::-;;;;;;;;;;-1:-1:-1;38655:16:0;;;;;;;38583:96;;21617:326;;;;;;;;;;-1:-1:-1;21617:326:0;;;;;:::i;:::-;;:::i;38034:123::-;;;;;;;;;;-1:-1:-1;38034:123:0;;;;;:::i;:::-;;:::i;21163:392::-;;;;;;;;;;-1:-1:-1;21163:392:0;;;;;:::i;:::-;;:::i;35861:103::-;;;;;;;;;;;;;:::i;38881:88::-;;;;;;;;;;-1:-1:-1;38949:12:0;;;;38881:88;;38981:74;;;;;;;;;;;;;:::i;39917:437::-;;;;;;;;;;-1:-1:-1;39917:437:0;;;;;:::i;:::-;;:::i;35210:87::-;;;;;;;;;;-1:-1:-1;35283:6:0;;-1:-1:-1;;;;;35283:6:0;35210:87;;43605:119;;;;;;;;;;-1:-1:-1;43605:119:0;;;;;:::i;:::-;;:::i;39250:86::-;;;;;;;;;;-1:-1:-1;39250:86:0;;;;;:::i;:::-;;:::i;43053:99::-;;;;;;;;;;-1:-1:-1;43053:99:0;;;;;:::i;:::-;;:::i;22179:104::-;;;;;;;;;;;;;:::i;39581:326::-;;;;;;:::i;:::-;;:::i;23950:327::-;;;;;;;;;;-1:-1:-1;23950:327:0;;;;;:::i;:::-;;:::i;25331:365::-;;;;;;;;;;-1:-1:-1;25331:365:0;;;;;:::i;:::-;;:::i;39346:221::-;;;;;;;;;;-1:-1:-1;39346:221:0;;;;;:::i;:::-;;:::i;43164:433::-;;;;;;;;;;-1:-1:-1;43164:433:0;;;;;:::i;:::-;;:::i;39067:76::-;;;;;;;;;;;;;:::i;38391:180::-;;;;;;;;;;-1:-1:-1;38391:180:0;;;;;:::i;:::-;;:::i;40368:413::-;;;;;;:::i;:::-;;:::i;40789:494::-;;;;;;:::i;:::-;;:::i;42475:94::-;;;;;;;;;;;;;:::i;24348:214::-;;;;;;;;;;-1:-1:-1;24348:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;24519:25:0;;;24490:4;24519:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24348:214;36119:201;;;;;;;;;;-1:-1:-1;36119:201:0;;;;;:::i;:::-;;:::i;20744:355::-;20891:4;-1:-1:-1;;;;;;20933:40:0;;-1:-1:-1;;;20933:40:0;;:105;;-1:-1:-1;;;;;;;20990:48:0;;-1:-1:-1;;;20990:48:0;20933:105;:158;;;-1:-1:-1;;;;;;;;;;19419:40:0;;;21055:36;20913:178;20744:355;-1:-1:-1;;20744:355:0:o;22010:100::-;22064:13;22097:5;22090:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22010:100;:::o;23570:308::-;23691:7;23738:16;23746:7;23738;:16::i;:::-;23716:110;;;;-1:-1:-1;;;23716:110:0;;15865:2:1;23716:110:0;;;15847:21:1;15904:2;15884:18;;;15877:30;15943:34;15923:18;;;15916:62;-1:-1:-1;;;15994:18:1;;;15987:42;16046:19;;23716:110:0;;;;;;;;;-1:-1:-1;23846:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23846:24:0;;23570:308::o;23093:411::-;23174:13;23190:23;23205:7;23190:14;:23::i;:::-;23174:39;;23238:5;-1:-1:-1;;;;;23232:11:0;:2;-1:-1:-1;;;;;23232:11:0;;;23224:57;;;;-1:-1:-1;;;23224:57:0;;17465:2:1;23224:57:0;;;17447:21:1;17504:2;17484:18;;;17477:30;17543:34;17523:18;;;17516:62;-1:-1:-1;;;17594:18:1;;;17587:31;17635:19;;23224:57:0;17263:397:1;23224:57:0;16368:10;-1:-1:-1;;;;;23316:21:0;;;;:62;;-1:-1:-1;23341:37:0;23358:5;16368:10;24348:214;:::i;23341:37::-;23294:168;;;;-1:-1:-1;;;23294:168:0;;14619:2:1;23294:168:0;;;14601:21:1;14658:2;14638:18;;;14631:30;14697:34;14677:18;;;14670:62;14768:26;14748:18;;;14741:54;14812:19;;23294:168:0;14417:420:1;23294:168:0;23475:21;23484:2;23488:7;23475:8;:21::i;:::-;23163:341;23093:411;;:::o;37924:102::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;37996:9:::1;:22:::0;37924:102::o;42345:122::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;42430:23:::1;::::0;;;:16:::1;:23;::::0;;;;;;;:29;;::::1;::::0;;::::1;::::0;::::1;:::i;24629:375::-:0;24838:41;16368:10;24871:7;24838:18;:41::i;:::-;24816:139;;;;-1:-1:-1;;;24816:139:0;;19307:2:1;24816:139:0;;;19289:21:1;19346:2;19326:18;;;19319:30;19385:34;19365:18;;;19358:62;-1:-1:-1;;;19436:18:1;;;19429:46;19492:19;;24816:139:0;19105:412:1;24816:139:0;24968:28;24978:4;24984:2;24988:7;24968:9;:28::i;38785:84::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;38837:16:::1;:24:::0;;-1:-1:-1;;38837:24:0::1;::::0;;38785:84::o;38691:82::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;38742:16:::1;:23:::0;;-1:-1:-1;;38742:23:0::1;;;::::0;;38691:82::o;42581:124::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;42636:61:::1;42662:10;42675:21;42636:17;:61::i;:::-;42581:124::o:0;38165:115::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;38243:13:::1;:29:::0;38165:115::o;25075:185::-;25213:39;25230:4;25236:2;25240:7;25213:39;;;;;;;;;;;;:16;:39::i;41293:176::-;41372:10;41352:16;41360:7;41352;:16::i;:::-;-1:-1:-1;;;;;41352:30:0;;:55;;;-1:-1:-1;35283:6:0;;-1:-1:-1;;;;;35283:6:0;41386:10;:21;41352:55;41344:92;;;;-1:-1:-1;;;41344:92:0;;18621:2:1;41344:92:0;;;18603:21:1;18660:2;18640:18;;;18633:30;18699:26;18679:18;;;18672:54;18743:18;;41344:92:0;18419:348:1;41344:92:0;41447:14;41453:7;41447:5;:14::i;:::-;41293:176;:::o;37814:102::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;37886:13:::1;:22:::0;;-1:-1:-1;;;;;;37886:22:0::1;-1:-1:-1::0;;;;;37886:22:0;;;::::1;::::0;;;::::1;::::0;;37814:102::o;42945:96::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;43014:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42945:96:::0;:::o;42713:109::-;42800:7;:14;42788:9;;42761:7;;42788:26;;;:::i;:::-;42781:33;;42713:109;:::o;21617:326::-;21734:7;21759:13;21775:7;21783;21775:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21775:16:0;;-1:-1:-1;21824:19:0;21802:110;;;;-1:-1:-1;;;21802:110:0;;15455:2:1;21802:110:0;;;15437:21:1;15494:2;15474:18;;;15467:30;15533:34;15513:18;;;15506:62;-1:-1:-1;;;15584:18:1;;;15577:39;15633:19;;21802:110:0;15253:405:1;38034:123:0;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;38116:15:::1;:33:::0;38034:123::o;21163:392::-;21285:4;-1:-1:-1;;;;;21316:19:0;;21308:74;;;;-1:-1:-1;;;21308:74:0;;15044:2:1;21308:74:0;;;15026:21:1;15083:2;15063:18;;;15056:30;15122:34;15102:18;;;15095:62;-1:-1:-1;;;15173:18:1;;;15166:40;15223:19;;21308:74:0;14842:406:1;21308:74:0;21395:10;21421:6;21416:109;21433:7;:14;21429:18;;21416:109;;;21480:7;21488:1;21480:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21471:19:0;;;21480:10;;21471:19;21467:46;;;21506:7;;;:::i;:::-;;;21467:46;21449:3;;;:::i;:::-;;;21416:109;;;-1:-1:-1;21542:5:0;21163:392;-1:-1:-1;;21163:392:0:o;35861:103::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;35926:30:::1;35953:1;35926:18;:30::i;38981:74::-:0;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;39028:12:::1;:19:::0;;-1:-1:-1;;39028:19:0::1;39043:4;39028:19;::::0;;38981:74::o;39917:437::-;39978:16;;;;;;;39970:42;;;;-1:-1:-1;;;39970:42:0;;13864:2:1;39970:42:0;;;13846:21:1;13903:2;13883:18;;;13876:30;-1:-1:-1;;;13922:18:1;;;13915:43;13975:18;;39970:42:0;13662:337:1;39970:42:0;40064:15;;40041:10;40031:21;;;;:9;:21;;;;;;:29;;40055:5;;40031:29;:::i;:::-;:48;;40023:80;;;;-1:-1:-1;;;40023:80:0;;12731:2:1;40023:80:0;;;12713:21:1;12770:2;12750:18;;;12743:30;-1:-1:-1;;;12789:18:1;;;12782:49;12848:18;;40023:80:0;12529:343:1;40023:80:0;40151:13;;40142:5;40122:17;;:25;;;;:::i;:::-;:42;;40114:74;;;;-1:-1:-1;;;40114:74:0;;12731:2:1;40114:74:0;;;12713:21:1;12770:2;12750:18;;;12743:30;-1:-1:-1;;;12789:18:1;;;12782:49;12848:18;;40114:74:0;12529:343:1;40114:74:0;40204:9;40199:148;40219:5;40215:1;:9;40199:148;;;40246:17;40252:10;40246:5;:17::i;:::-;40288:10;40278:21;;;;:9;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;40316:17:0;:19;;;:17;:19;;;:::i;:::-;;;;;;40226:3;;;;;:::i;:::-;;;;40199:148;;43605:119;43666:13;43699:17;43708:7;43699:8;:17::i;39250:86::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;39314:5:::1;:14:::0;39250:86::o;43053:99::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;43126:18;;::::1;::::0;:12:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;22179:104::-:0;22235:13;22268:7;22261:14;;;;;:::i;39581:326::-;39646:12;;;;39638:33;;;;-1:-1:-1;;;39638:33:0;;18285:2:1;39638:33:0;;;18267:21:1;18324:1;18304:18;;;18297:29;-1:-1:-1;;;18342:18:1;;;18335:38;18390:18;;39638:33:0;18083:331:1;39638:33:0;39709:5;;39703:11;;:5;:11;:::i;:::-;39690:9;:24;;39682:63;;;;-1:-1:-1;;;39682:63:0;;11617:2:1;39682:63:0;;;11599:21:1;11656:2;11636:18;;;11629:30;11695:28;11675:18;;;11668:56;11741:18;;39682:63:0;11415:350:1;39682:63:0;39785:5;39764:17;:15;:17::i;:::-;:26;;39756:57;;;;-1:-1:-1;;;39756:57:0;;10444:2:1;39756:57:0;;;10426:21:1;10483:2;10463:18;;;10456:30;-1:-1:-1;;;10502:18:1;;;10495:48;10560:18;;39756:57:0;10242:342:1;39756:57:0;39829:9;39824:76;39844:5;39840:1;:9;39824:76;;;39871:17;39877:10;39871:5;:17::i;:::-;39851:3;;;;:::i;:::-;;;;39824:76;;23950:327;-1:-1:-1;;;;;24085:24:0;;16368:10;24085:24;;24077:62;;;;-1:-1:-1;;;24077:62:0;;12377:2:1;24077:62:0;;;12359:21:1;12416:2;12396:18;;;12389:30;12455:27;12435:18;;;12428:55;12500:18;;24077:62:0;12175:349:1;24077:62:0;16368:10;24152:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;24152:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;24152:53:0;;;;;;;;;;24221:48;;9563:41:1;;;24152:42:0;;16368:10;24221:48;;9536:18:1;24221:48:0;;;;;;;23950:327;;:::o;25331:365::-;25520:41;16368:10;25553:7;25520:18;:41::i;:::-;25498:140;;;;-1:-1:-1;;;25498:140:0;;17867:2:1;25498:140:0;;;17849:21:1;17906:2;17886:18;;;17879:30;17945:34;17925:18;;;17918:62;-1:-1:-1;;;17996:18:1;;;17989:47;18053:19;;25498:140:0;17665:413:1;25498:140:0;25649:39;25663:4;25669:2;25673:7;25682:5;25649:13;:39::i;:::-;25331:365;;;;:::o;39346:221::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;39452:5:::1;39431:17;:15;:17::i;:::-;:26;;39423:57;;;::::0;-1:-1:-1;;;39423:57:0;;10444:2:1;39423:57:0::1;::::0;::::1;10426:21:1::0;10483:2;10463:18;;;10456:30;-1:-1:-1;;;10502:18:1;;;10495:48;10560:18;;39423:57:0::1;10242:342:1::0;39423:57:0::1;39496:9;39491:69;39511:5;39507:1;:9;39491:69;;;39538:10;39544:3;39538:5;:10::i;:::-;39518:3:::0;::::1;::::0;::::1;:::i;:::-;;;;39491:69;;43164:433:::0;43237:13;43271:16;43279:7;43271;:16::i;:::-;43263:76;;;;-1:-1:-1;;;43263:76:0;;17049:2:1;43263:76:0;;;17031:21:1;17088:2;17068:18;;;17061:30;17127:34;17107:18;;;17100:62;-1:-1:-1;;;17178:18:1;;;17171:45;17233:19;;43263:76:0;16847:411:1;43263:76:0;43359:25;;;;:16;:25;;;;;43353:39;;;;;:::i;:::-;:44;;-1:-1:-1;43350:81:0;;43406:25;;;;:16;:25;;;;;43399:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43164:433;;;:::o;43350:81::-;43442:21;43466:10;:8;:10::i;:::-;43442:34;;43518:1;43500:7;43494:21;:25;:95;;;;;;;;;;;;;;;;;43546:7;43555:18;:7;:16;:18::i;:::-;43529:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43494:95;43487:102;43164:433;-1:-1:-1;;;43164:433:0:o;39067:76::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;39115:12:::1;:20:::0;;-1:-1:-1;;39115:20:0::1;::::0;;39067:76::o;38391:180::-;38471:16;;38448:4;;38471:16;;;;;:55;;;;-1:-1:-1;38511:15:0;;-1:-1:-1;;;;;38491:17:0;;;;;;:9;:17;;;;;;:35;38471:55;:92;;;;;38550:13;;38530:17;;:33;38464:99;38391:180;-1:-1:-1;;38391:180:0:o;40368:413::-;40475:15;40493:73;40529:9;40540:10;40552:5;40559:4;40512:52;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;40512:52:0;;;;;;;;;40502:63;;40512:52;40502:63;;;;7117:66:1;42270:58:0;;;7105:79:1;7200:12;;;;7193:28;;;;42270:58:0;;;;;;;;;;7237:12:1;;;;42270:58:0;;;42260:69;;;;;;42178:159;40493:73;40622:13;;40475:91;;-1:-1:-1;;;;;;40622:13:0;40585:33;40475:91;40608:9;40585:13;:33::i;:::-;-1:-1:-1;;;;;40585:50:0;;40577:68;;;;-1:-1:-1;;;40577:68:0;;18974:2:1;40577:68:0;;;18956:21:1;19013:1;18993:18;;;18986:29;-1:-1:-1;;;19031:18:1;;;19024:35;19076:18;;40577:68:0;18772:328:1;40577:68:0;40683:4;40656:13;40670:9;40656:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;-1:-1:-1;;40656:31:0;;;;;;;;;:24;40698:76;40718:5;40714:1;:9;40698:76;;;40745:17;40751:10;40745:5;:17::i;:::-;40725:3;;;;:::i;:::-;;;;40698:76;;;;40464:317;40368:413;;;:::o;40789:494::-;40915:15;40933:78;40969:9;40980:10;40992:5;40999:3;41004:4;40952:57;;;;;;;;;;;;:::i;40933:78::-;41067:13;;40915:96;;-1:-1:-1;;;;;;41067:13:0;41030:33;40915:96;41053:9;41030:13;:33::i;:::-;-1:-1:-1;;;;;41030:50:0;;41022:68;;;;-1:-1:-1;;;41022:68:0;;18974:2:1;41022:68:0;;;18956:21:1;19013:1;18993:18;;;18986:29;-1:-1:-1;;;19031:18:1;;;19024:35;19076:18;;41022:68:0;18772:328:1;41022:68:0;41128:4;41101:13;41115:9;41101:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;-1:-1:-1;;41101:31:0;;;;;;;;;:24;41143:133;41163:5;41159:1;:9;41143:133;;;41190:17;41196:10;41190:5;:17::i;:::-;41261:3;41222:16;:36;41256:1;41239:7;:14;;;;:18;;;;:::i;:::-;41222:36;;;;;;;;;;;:42;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41170:3:0;;;;:::i;:::-;;;;41143:133;;;;40904:379;40789:494;;;;:::o;42475:94::-;42519:13;42549:12;42542:19;;;;;:::i;36119:201::-;35283:6;;-1:-1:-1;;;;;35283:6:0;16368:10;35430:23;35422:68;;;;-1:-1:-1;;;35422:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36208:22:0;::::1;36200:73;;;::::0;-1:-1:-1;;;36200:73:0;;11210:2:1;36200:73:0::1;::::0;::::1;11192:21:1::0;11249:2;11229:18;;;11222:30;11288:34;11268:18;;;11261:62;-1:-1:-1;;;11339:18:1;;;11332:36;11385:19;;36200:73:0::1;11008:402:1::0;36200:73:0::1;36284:28;36303:8;36284:18;:28::i;27243:155::-:0;27342:7;:14;27308:4;;27332:24;;:58;;;;;27388:1;-1:-1:-1;;;;;27360:30:0;:7;27368;27360:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;27360:16:0;:30;;27325:65;27243:155;-1:-1:-1;;27243:155:0:o;31300:174::-;31375:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31375:29:0;-1:-1:-1;;;;;31375:29:0;;;;;;;;:24;;31429:23;31375:24;31429:14;:23::i;:::-;-1:-1:-1;;;;;31420:46:0;;;;;;;;;;;31300:174;;:::o;27565:452::-;27694:4;27738:16;27746:7;27738;:16::i;:::-;27716:110;;;;-1:-1:-1;;;27716:110:0;;14206:2:1;27716:110:0;;;14188:21:1;14245:2;14225:18;;;14218:30;14284:34;14264:18;;;14257:62;-1:-1:-1;;;14335:18:1;;;14328:42;14387:19;;27716:110:0;14004:408:1;27716:110:0;27837:13;27853:23;27868:7;27853:14;:23::i;:::-;27837:39;;27906:5;-1:-1:-1;;;;;27895:16:0;:7;-1:-1:-1;;;;;27895:16:0;;:64;;;;27952:7;-1:-1:-1;;;;;27928:31:0;:20;27940:7;27928:11;:20::i;:::-;-1:-1:-1;;;;;27928:31:0;;27895:64;:113;;;-1:-1:-1;;;;;;24519:25:0;;;24490:4;24519:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27976:32;27887:122;27565:452;-1:-1:-1;;;;27565:452:0:o;30629:553::-;30802:4;-1:-1:-1;;;;;30775:31:0;:23;30790:7;30775:14;:23::i;:::-;-1:-1:-1;;;;;30775:31:0;;30753:122;;;;-1:-1:-1;;;30753:122:0;;16639:2:1;30753:122:0;;;16621:21:1;16678:2;16658:18;;;16651:30;16717:34;16697:18;;;16690:62;-1:-1:-1;;;16768:18:1;;;16761:39;16817:19;;30753:122:0;16437:405:1;30753:122:0;-1:-1:-1;;;;;30894:16:0;;30886:65;;;;-1:-1:-1;;;30886:65:0;;11972:2:1;30886:65:0;;;11954:21:1;12011:2;11991:18;;;11984:30;12050:34;12030:18;;;12023:62;-1:-1:-1;;;12101:18:1;;;12094:34;12145:19;;30886:65:0;11770:400:1;30886:65:0;31068:29;31085:1;31089:7;31068:8;:29::i;:::-;31127:2;31108:7;31116;31108:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;31108:21:0;-1:-1:-1;;;;;31108:21:0;;;;;;31147:27;;31166:7;;31147:27;;;;;;;;;;31108:16;31147:27;30629:553;;;:::o;9683:317::-;9798:6;9773:21;:31;;9765:73;;;;-1:-1:-1;;;9765:73:0;;13506:2:1;9765:73:0;;;13488:21:1;13545:2;13525:18;;;13518:30;13584:31;13564:18;;;13557:59;13633:18;;9765:73:0;13304:353:1;9765:73:0;9852:12;9870:9;-1:-1:-1;;;;;9870:14:0;9892:6;9870:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9851:52;;;9922:7;9914:78;;;;-1:-1:-1;;;9914:78:0;;13079:2:1;9914:78:0;;;13061:21:1;13118:2;13098:18;;;13091:30;13157:34;13137:18;;;13130:62;13228:28;13208:18;;;13201:56;13274:19;;9914:78:0;12877:422:1;29960:332:0;30020:13;30036:23;30051:7;30036:14;:23::i;:::-;30020:39;;30161:29;30178:1;30182:7;30161:8;:29::i;:::-;30228:1;30201:7;30209;30201:16;;;;;;;;:::i;:::-;;;;;;;;;:29;;-1:-1:-1;;;;;;30201:29:0;-1:-1:-1;;;;;30201:29:0;;;;;;30248:36;;30276:7;;30248:36;;;;;30201:16;;30248:36;30009:283;29960:332;:::o;36480:191::-;36573:6;;;-1:-1:-1;;;;;36590:17:0;;;-1:-1:-1;;;;;;36590:17:0;;;;;;;36623:40;;36573:6;;;36590:17;36573:6;;36623:40;;36554:16;;36623:40;36543:128;36480:191;:::o;29373:358::-;29645:7;:16;;;;;;;;-1:-1:-1;29645:16:0;;;;;;;;;-1:-1:-1;;;;;;29645:16:0;-1:-1:-1;;;;;29645:16:0;;;;;29704:14;;:18;;29645:16;29704:18;:::i;:::-;29679:44;;-1:-1:-1;;;;;29679:44:0;;;29696:1;;29679:44;;29696:1;;29679:44;29373:358;:::o;26578:352::-;26735:28;26745:4;26751:2;26755:7;26735:9;:28::i;:::-;26796:48;26819:4;26825:2;26829:7;26838:5;26796:22;:48::i;:::-;26774:148;;;;-1:-1:-1;;;26774:148:0;;;;;;;:::i;42830:107::-;42883:13;42916;42909:20;;;;;:::i;16784:723::-;16840:13;17061:10;17057:53;;-1:-1:-1;;17088:10:0;;;;;;;;;;;;-1:-1:-1;;;17088:10:0;;;;;16784:723::o;17057:53::-;17135:5;17120:12;17176:78;17183:9;;17176:78;;17209:8;;;;:::i;:::-;;-1:-1:-1;17232:10:0;;-1:-1:-1;17240:2:0;17232:10;;:::i;:::-;;;17176:78;;;17264:19;17296:6;17286:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17286:17:0;;17264:39;;17314:154;17321:10;;17314:154;;17348:11;17358:1;17348:11;;:::i;:::-;;-1:-1:-1;17417:10:0;17425:2;17417:5;:10;:::i;:::-;17404:24;;:2;:24;:::i;:::-;17391:39;;17374:6;17381;17374:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17374:56:0;;;;;;;;-1:-1:-1;17445:11:0;17454:2;17445:11;;:::i;:::-;;;17314:154;;41959:207;42040:7;42061;42070:9;42081;42094:19;42109:3;42094:14;:19::i;:::-;42131:27;;;;;;;;;;;;9842:25:1;;;9915:4;9903:17;;9883:18;;;9876:45;;;;9937:18;;;9930:34;;;9980:18;;;9973:34;;;42060:53:0;;-1:-1:-1;42060:53:0;;-1:-1:-1;42060:53:0;-1:-1:-1;42131:27:0;;9814:19:1;;42131:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42131:27:0;;-1:-1:-1;;42131:27:0;;;41959:207;-1:-1:-1;;;;;;;41959:207:0:o;32039:980::-;32194:4;-1:-1:-1;;;;;32215:13:0;;8717:19;:23;32211:801;;32268:175;;-1:-1:-1;;;32268:175:0;;-1:-1:-1;;;;;32268:36:0;;;;;:175;;16368:10;;32362:4;;32389:7;;32419:5;;32268:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32268:175:0;;;;;;;;-1:-1:-1;;32268:175:0;;;;;;;;;;;;:::i;:::-;;;32247:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32626:13:0;;32622:320;;32669:108;;-1:-1:-1;;;32669:108:0;;;;;;;:::i;32622:320::-;32892:6;32886:13;32877:6;32873:2;32869:15;32862:38;32247:710;-1:-1:-1;;;;;;32507:51:0;-1:-1:-1;;;32507:51:0;;-1:-1:-1;32500:58:0;;32211:801;-1:-1:-1;32996:4:0;32039:980;;;;;;:::o;41479:470::-;41544:7;41553:9;41564;41594:3;:10;41608:2;41594:16;41586:25;;;;;;-1:-1:-1;;;41722:2:0;41713:12;;41707:19;41792:2;41783:12;;41777:19;41899:2;41890:12;;;41884:19;41881:1;41876:28;;41707:19;;41777;41479:470::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:718::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;404:2;400;397:10;394:36;;;410:18;;:::i;:::-;485:2;479:9;453:2;539:13;;-1:-1:-1;;535:22:1;;;559:2;531:31;527:40;515:53;;;583:18;;;603:22;;;580:46;577:72;;;629:18;;:::i;:::-;669:10;665:2;658:22;704:2;696:6;689:18;750:3;743:4;738:2;730:6;726:15;722:26;719:35;716:55;;;767:1;764;757:12;716:55;831:2;824:4;816:6;812:17;805:4;797:6;793:17;780:54;878:1;871:4;866:2;858:6;854:15;850:26;843:37;898:6;889:15;;;;;;192:718;;;;:::o;915:186::-;974:6;1027:2;1015:9;1006:7;1002:23;998:32;995:52;;;1043:1;1040;1033:12;995:52;1066:29;1085:9;1066:29;:::i;1106:260::-;1174:6;1182;1235:2;1223:9;1214:7;1210:23;1206:32;1203:52;;;1251:1;1248;1241:12;1203:52;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1106:260;;;;;:::o;1371:328::-;1448:6;1456;1464;1517:2;1505:9;1496:7;1492:23;1488:32;1485:52;;;1533:1;1530;1523:12;1485:52;1556:29;1575:9;1556:29;:::i;:::-;1546:39;;1604:38;1638:2;1627:9;1623:18;1604:38;:::i;:::-;1594:48;;1689:2;1678:9;1674:18;1661:32;1651:42;;1371:328;;;;;:::o;1704:537::-;1799:6;1807;1815;1823;1876:3;1864:9;1855:7;1851:23;1847:33;1844:53;;;1893:1;1890;1883:12;1844:53;1916:29;1935:9;1916:29;:::i;:::-;1906:39;;1964:38;1998:2;1987:9;1983:18;1964:38;:::i;:::-;1954:48;;2049:2;2038:9;2034:18;2021:32;2011:42;;2104:2;2093:9;2089:18;2076:32;2131:18;2123:6;2120:30;2117:50;;;2163:1;2160;2153:12;2117:50;2186:49;2227:7;2218:6;2207:9;2203:22;2186:49;:::i;:::-;2176:59;;;1704:537;;;;;;;:::o;2246:347::-;2311:6;2319;2372:2;2360:9;2351:7;2347:23;2343:32;2340:52;;;2388:1;2385;2378:12;2340:52;2411:29;2430:9;2411:29;:::i;:::-;2401:39;;2490:2;2479:9;2475:18;2462:32;2537:5;2530:13;2523:21;2516:5;2513:32;2503:60;;2559:1;2556;2549:12;2503:60;2582:5;2572:15;;;2246:347;;;;;:::o;2598:254::-;2666:6;2674;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;:::-;2756:39;2842:2;2827:18;;;;2814:32;;-1:-1:-1;;;2598:254:1:o;2857:245::-;2915:6;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;3023:9;3010:23;3042:30;3066:5;3042:30;:::i;3107:249::-;3176:6;3229:2;3217:9;3208:7;3204:23;3200:32;3197:52;;;3245:1;3242;3235:12;3197:52;3277:9;3271:16;3296:30;3320:5;3296:30;:::i;3361:321::-;3430:6;3483:2;3471:9;3462:7;3458:23;3454:32;3451:52;;;3499:1;3496;3489:12;3451:52;3539:9;3526:23;3572:18;3564:6;3561:30;3558:50;;;3604:1;3601;3594:12;3558:50;3627:49;3668:7;3659:6;3648:9;3644:22;3627:49;:::i;3687:180::-;3746:6;3799:2;3787:9;3778:7;3774:23;3770:32;3767:52;;;3815:1;3812;3805:12;3767:52;-1:-1:-1;3838:23:1;;3687:180;-1:-1:-1;3687:180:1:o;3872:389::-;3950:6;3958;4011:2;3999:9;3990:7;3986:23;3982:32;3979:52;;;4027:1;4024;4017:12;3979:52;4063:9;4050:23;4040:33;;4124:2;4113:9;4109:18;4096:32;4151:18;4143:6;4140:30;4137:50;;;4183:1;4180;4173:12;4137:50;4206:49;4247:7;4238:6;4227:9;4223:22;4206:49;:::i;:::-;4196:59;;;3872:389;;;;;:::o;4266:608::-;4362:6;4370;4378;4431:2;4419:9;4410:7;4406:23;4402:32;4399:52;;;4447:1;4444;4437:12;4399:52;4483:9;4470:23;4460:33;;4544:2;4533:9;4529:18;4516:32;4567:18;4608:2;4600:6;4597:14;4594:34;;;4624:1;4621;4614:12;4594:34;4647:49;4688:7;4679:6;4668:9;4664:22;4647:49;:::i;:::-;4637:59;;4749:2;4738:9;4734:18;4721:32;4705:48;;4778:2;4768:8;4765:16;4762:36;;;4794:1;4791;4784:12;4762:36;;4817:51;4860:7;4849:8;4838:9;4834:24;4817:51;:::i;:::-;4807:61;;;4266:608;;;;;:::o;4879:808::-;4994:6;5002;5010;5018;5071:3;5059:9;5050:7;5046:23;5042:33;5039:53;;;5088:1;5085;5078:12;5039:53;5124:9;5111:23;5101:33;;5185:2;5174:9;5170:18;5157:32;5208:18;5249:2;5241:6;5238:14;5235:34;;;5265:1;5262;5255:12;5235:34;5288:49;5329:7;5320:6;5309:9;5305:22;5288:49;:::i;:::-;5278:59;;5390:2;5379:9;5375:18;5362:32;5346:48;;5419:2;5409:8;5406:16;5403:36;;;5435:1;5432;5425:12;5403:36;5458:51;5501:7;5490:8;5479:9;5475:24;5458:51;:::i;:::-;5448:61;;5562:2;5551:9;5547:18;5534:32;5518:48;;5591:2;5581:8;5578:16;5575:36;;;5607:1;5604;5597:12;5575:36;;5630:51;5673:7;5662:8;5651:9;5647:24;5630:51;:::i;5692:257::-;5733:3;5771:5;5765:12;5798:6;5793:3;5786:19;5814:63;5870:6;5863:4;5858:3;5854:14;5847:4;5840:5;5836:16;5814:63;:::i;:::-;5931:2;5910:15;-1:-1:-1;;5906:29:1;5897:39;;;;5938:4;5893:50;;5692:257;-1:-1:-1;;5692:257:1:o;5954:274::-;6083:3;6121:6;6115:13;6137:53;6183:6;6178:3;6171:4;6163:6;6159:17;6137:53;:::i;:::-;6206:16;;;;;5954:274;-1:-1:-1;;5954:274:1:o;6233:637::-;6513:3;6551:6;6545:13;6567:53;6613:6;6608:3;6601:4;6593:6;6589:17;6567:53;:::i;:::-;6683:13;;6642:16;;;;6705:57;6683:13;6642:16;6739:4;6727:17;;6705:57;:::i;:::-;-1:-1:-1;;;6784:20:1;;6813:22;;;6862:1;6851:13;;6233:637;-1:-1:-1;;;;6233:637:1:o;7470:525::-;7715:6;7710:3;7703:19;7777:26;7773:31;7764:6;7760:2;7756:15;7752:53;7747:2;7742:3;7738:12;7731:75;7836:6;7831:2;7826:3;7822:12;7815:28;7685:3;7872:6;7866:13;7888:60;7941:6;7936:2;7931:3;7927:12;7922:2;7914:6;7910:15;7888:60;:::i;:::-;7968:16;;;;7986:2;7964:25;;7470:525;-1:-1:-1;;;;;7470:525:1:o;8000:717::-;8293:6;8288:3;8281:19;8355:26;8351:31;8342:6;8338:2;8334:15;8330:53;8325:2;8320:3;8316:12;8309:75;8414:6;8409:2;8404:3;8400:12;8393:28;8263:3;8450:6;8444:13;8466:60;8519:6;8514:2;8509:3;8505:12;8500:2;8492:6;8488:15;8466:60;:::i;:::-;8586:13;;8545:16;;;;8608:61;8586:13;8655:2;8647:11;;8642:2;8630:15;;8608:61;:::i;:::-;8689:17;8708:2;8685:26;;8000:717;-1:-1:-1;;;;;;;8000:717:1:o;8930:488::-;-1:-1:-1;;;;;9199:15:1;;;9181:34;;9251:15;;9246:2;9231:18;;9224:43;9298:2;9283:18;;9276:34;;;9346:3;9341:2;9326:18;;9319:31;;;9124:4;;9367:45;;9392:19;;9384:6;9367:45;:::i;:::-;9359:53;8930:488;-1:-1:-1;;;;;;8930:488:1:o;10018:219::-;10167:2;10156:9;10149:21;10130:4;10187:44;10227:2;10216:9;10212:18;10204:6;10187:44;:::i;10589:414::-;10791:2;10773:21;;;10830:2;10810:18;;;10803:30;10869:34;10864:2;10849:18;;10842:62;-1:-1:-1;;;10935:2:1;10920:18;;10913:48;10993:3;10978:19;;10589:414::o;16076:356::-;16278:2;16260:21;;;16297:18;;;16290:30;16356:34;16351:2;16336:18;;16329:62;16423:2;16408:18;;16076:356::o;19704:128::-;19744:3;19775:1;19771:6;19768:1;19765:13;19762:39;;;19781:18;;:::i;:::-;-1:-1:-1;19817:9:1;;19704:128::o;19837:120::-;19877:1;19903;19893:35;;19908:18;;:::i;:::-;-1:-1:-1;19942:9:1;;19837:120::o;19962:168::-;20002:7;20068:1;20064;20060:6;20056:14;20053:1;20050:21;20045:1;20038:9;20031:17;20027:45;20024:71;;;20075:18;;:::i;:::-;-1:-1:-1;20115:9:1;;19962:168::o;20135:125::-;20175:4;20203:1;20200;20197:8;20194:34;;;20208:18;;:::i;:::-;-1:-1:-1;20245:9:1;;20135:125::o;20265:258::-;20337:1;20347:113;20361:6;20358:1;20355:13;20347:113;;;20437:11;;;20431:18;20418:11;;;20411:39;20383:2;20376:10;20347:113;;;20478:6;20475:1;20472:13;20469:48;;;-1:-1:-1;;20513:1:1;20495:16;;20488:27;20265:258::o;20528:380::-;20607:1;20603:12;;;;20650;;;20671:61;;20725:4;20717:6;20713:17;20703:27;;20671:61;20778:2;20770:6;20767:14;20747:18;20744:38;20741:161;;;20824:10;20819:3;20815:20;20812:1;20805:31;20859:4;20856:1;20849:15;20887:4;20884:1;20877:15;20741:161;;20528:380;;;:::o;20913:135::-;20952:3;-1:-1:-1;;20973:17:1;;20970:43;;;20993:18;;:::i;:::-;-1:-1:-1;21040:1:1;21029:13;;20913:135::o;21053:112::-;21085:1;21111;21101:35;;21116:18;;:::i;:::-;-1:-1:-1;21150:9:1;;21053:112::o;21170:127::-;21231:10;21226:3;21222:20;21219:1;21212:31;21262:4;21259:1;21252:15;21286:4;21283:1;21276:15;21302:127;21363:10;21358:3;21354:20;21351:1;21344:31;21394:4;21391:1;21384:15;21418:4;21415:1;21408:15;21434:127;21495:10;21490:3;21486:20;21483:1;21476:31;21526:4;21523:1;21516:15;21550:4;21547:1;21540:15;21566:127;21627:10;21622:3;21618:20;21615:1;21608:31;21658:4;21655:1;21648:15;21682:4;21679:1;21672:15;21698:131;-1:-1:-1;;;;;;21772:32:1;;21762:43;;21752:71;;21819:1;21816;21809:12

Swarm Source

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