ETH Price: $2,522.63 (-0.80%)

Token

SquareUp (SQU)
 

Overview

Max Total Supply

200 SQU

Holders

77

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
godofcrypto.eth
Balance
1 SQU
0x7d8d77e614a976650f8b4f4db3fa738c12aecb0c
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:
SquareUpContest

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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


// File @chainlink/contracts/src/v0.8/interfaces/[email protected]


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;
}


// File @chainlink/contracts/src/v0.8/[email protected]


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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);
    }
}


// File @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File contracts/SquareUpContest.sol


pragma solidity ^0.8.0;
contract SquareUpContest is ERC721, VRFConsumerBaseV2, Ownable, ReentrancyGuard {
  using Counters for Counters.Counter;
  Counters.Counter public tokenIds;
  VRFCoordinatorV2Interface COORDINATOR;
  uint16 constant RequestConfirmations = 5;
  string public constant BaseExtension = ".json";
  uint constant private MaxTicketsPerMint = 1;
  uint32 constant CallbackGasLimit = 300000;
  uint32 constant NumWords = 1;
  uint64 immutable public LinkSubScriptionId;
  uint256 immutable public MaxTickets;
  uint256 immutable public MintFee;
  bytes32 public KeyHash;
  bytes32 public MerkleRootVIP;
  bytes32 public MerkleRootWhitelist;
  uint256[] public LinkRandomWords;
  uint256 public LinkRandomOffset;
  uint256 public RequestId;
  string public BaselineURI;
  uint256 public dtMintStartVIP;
  struct Payout {
    uint256 token;
    uint256 amount;
  }
  struct PayoutSet {
    uint256 amount;
    uint time;
  }
  enum EPhase {
    Mint,
    Between,
    Game,
    Payout
  }
  enum EMintType{
    VIP,
    Whitelist,
    Public
  }
  EPhase public Phase = EPhase.Mint;
  mapping(uint256 => PayoutSet) public PayoutPendingWithdrawls;
  mapping(address=> bool) public VIPClaimed;
  mapping(address=> uint) public WhitelistClaimed;
  ///events
  event PayoutsSet(uint256 indexed tokenId, uint256 indexed amount);
  event PayoutWithdraw(uint256 indexed tokenId, address indexed user, uint256 indexed amount);

  constructor(
    uint64 _linkSubscriptionId,
    address _vrfCoordinatorAddress,
    bytes32 _keyHash,
    string memory _baselineURIMintPhase,
    uint256 _maxTickets,
    uint256 _mintFee,
    uint256 _dtMintStartVIP,
    bytes32 _merkleRootVIP,
    bytes32 _merkleRootWhitelist
    ) VRFConsumerBaseV2 (_vrfCoordinatorAddress) ERC721("SquareUp", "SQU") {
    COORDINATOR = VRFCoordinatorV2Interface(_vrfCoordinatorAddress);
    LinkSubScriptionId = _linkSubscriptionId;
    KeyHash = _keyHash;
    BaselineURI = _baselineURIMintPhase;
    MaxTickets = _maxTickets;
    MintFee = _mintFee;
    dtMintStartVIP = _dtMintStartVIP;
    MerkleRootVIP = _merkleRootVIP;
    MerkleRootWhitelist = _merkleRootWhitelist;
  }

  function mintTicket(uint quantity, address sender) private {
    for (uint32 i = 0; i < quantity; i++) {
      tokenIds.increment();
      uint256 newItemId = tokenIds.current();
      _mint(sender, newItemId);
    }
  }

  function mintCheck(uint quantity, uint amount, EMintType mintType) private view {
    require(Phase == EPhase.Mint, "Mint phase is off");
    require(quantity > 0, "Cant mint 0 tickets");
    if (mintType == EMintType.VIP) {
      require(quantity <= MaxTicketsPerMint, "Can't mint this many tickets in one transaction");
    }
    else {
       require(quantity <= 10, "Can't mint this many tickets in one transaction");
    }
    require(tokenIds.current() + quantity <= MaxTickets, "Can't mint more than the total number of available tickets.");
    require(amount >= MintFee * quantity, "Not enough funds");
  }

  function mintTicketVIP(uint quantity, bytes32[] calldata _merkleProof) public payable nonReentrant {
    require(dtMintStartVIP <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    require(VIPClaimed[msg.sender] == false, "VIP can't mint more than one ticket");
    mintCheck(quantity, msg.value, EMintType.VIP);
    bytes32 leaf = keccak256((abi.encodePacked(msg.sender)));
    require(MerkleProof.verify(_merkleProof, MerkleRootVIP, leaf), "Not VIP");
    VIPClaimed[msg.sender] = true;
    mintTicket(quantity, msg.sender);
  }

  function mintTicketWhitelist(uint quantity, bytes32[] calldata _merkleProof) public payable nonReentrant {
    require(dtMintStartVIP + 8 hours <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    mintCheck(quantity, msg.value, EMintType.Whitelist);
    bytes32 leaf = keccak256((abi.encodePacked(msg.sender)));
    require(MerkleProof.verify(_merkleProof, MerkleRootWhitelist, leaf), "Not on the whitelist");
    require(WhitelistClaimed[msg.sender] + quantity <= 10, "Whitelist can't mint more than 10 tickets");
    WhitelistClaimed[msg.sender] = WhitelistClaimed[msg.sender] + quantity;
    mintTicket(quantity, msg.sender);
  }

  function mintTicketPublic(uint quantity) public payable nonReentrant {
    require(dtMintStartVIP + 14 hours <= block.timestamp, "Can't mint yet. Try again in a few seconds.");
    mintCheck(quantity, msg.value, EMintType.Public);
    mintTicket(quantity, msg.sender);
  }

  function setBaseURIGamePhase(string memory _baseUriNew) public onlyOwner {
    require(Phase == EPhase.Between, "Cannot switch team lists");
    require(LinkRandomWords.length > 0, "Cannot set base uri without chainlink random words");
    BaselineURI = _baseUriNew;
    Phase = EPhase.Game;
  }

  function setMintPhaseOff() external onlyOwner() {
    require(Phase == EPhase.Mint, "Mint phase is off");
    Phase = EPhase.Between;
  }

  function totalSupply() external view returns (uint256) {
    return tokenIds.current();
  }

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

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "query for nonexistent token");
    string memory baseURI = _baseURI();
    if (Phase != EPhase.Game) {
      return baseURI;
    }
    uint256 offset = offsetCalcURI(tokenId);
    string memory uri = string(abi.encodePacked(baseURI, Strings.toString(offset)));
    return string(abi.encodePacked(uri, BaseExtension));
  }

  function offsetCalcURI(uint256 tokenId) public view returns (uint256) {
    require(_exists(tokenId), "query for nonexistent token");
    require(LinkRandomWords.length > 0, "link random words doesn't exist");
    return (LinkRandomWords[0] + tokenId) % tokenIds.current() + 1; //from 1 to # tickets minted
  }

  function _beforeTokenTransfer(
      address from,
      address to,
      uint256 tokenId
  ) internal virtual override(ERC721) {
      require(Phase != EPhase.Payout, "No transfers once payouts are set");
      super._beforeTokenTransfer(from, to, tokenId);
  }


  function setMintStartTime(uint256 _newTime) external onlyOwner{
    dtMintStartVIP = _newTime;
  }

  function setGasLaneLink(bytes32 _gasLane) external onlyOwner {
    KeyHash = _gasLane;
  }

  function requestRandomWords() external onlyOwner {
    require(Phase == EPhase.Between, "Teams cannot be set during the mint phase");
    require(LinkRandomWords.length == 0, "Random words can only be set once");
    require(tokenIds.current() > 0, "Must have teams to shuffle");
    RequestId = COORDINATOR.requestRandomWords(
      KeyHash,
      LinkSubScriptionId,
      RequestConfirmations,
      CallbackGasLimit,
      NumWords
    );
  }

  function fulfillRandomWords(
    uint256, /* requestId */
    uint256[] memory randomWords
  ) internal override {
    require(Phase == EPhase.Between, "Teams cannot be set during the mint phase");
    LinkRandomWords = randomWords;
  }

  function randomWordsGet() external view returns (uint256[] memory) {
    return LinkRandomWords;
  }

  function setPayout(Payout calldata _payout) external onlyOwner {
    require(_exists(_payout.token), "query for nonexistent token");
    require(PayoutPendingWithdrawls[_payout.token].amount == 0 && PayoutPendingWithdrawls[_payout.token].time == 0, "Payout already set in the past");
    require(Phase != EPhase.Mint && Phase != EPhase.Between, "Must be in game phase or later");
    if (Phase == EPhase.Game) {
      Phase = EPhase.Payout;
    }
    uint timeNow = block.timestamp;
    PayoutSet memory payoutSet = PayoutSet(_payout.amount, timeNow);
    PayoutPendingWithdrawls[_payout.token] = payoutSet;
    emit PayoutsSet(_payout.token, _payout.amount);
  }

  function withdrawPayout(uint256 _tokenId) external payable nonReentrant {
    require(_exists(_tokenId), "query for nonexistent token");
    require(ownerOf(_tokenId) == msg.sender, "Unauthorized");
    require(PayoutPendingWithdrawls[_tokenId].time > 0, "No Payout set for this ticket");
    require(PayoutPendingWithdrawls[_tokenId].amount > 0, "Payout Already Claimed");
    uint256 amount = PayoutPendingWithdrawls[_tokenId].amount;
    PayoutPendingWithdrawls[_tokenId].amount = 0;
    emit PayoutWithdraw(_tokenId, msg.sender, amount);
    (bool sent, ) = (msg.sender.call{value: amount}(""));
    require(sent, "Transfer failed.");
  }

  function withdrawUnclaimed(address _destination, uint256 _tokenId) external payable onlyOwner {
    require(_exists(_tokenId), "query for nonexistent token");
    uint timeNow = block.timestamp;
    require(PayoutPendingWithdrawls[_tokenId].time != 0 && timeNow - PayoutPendingWithdrawls[_tokenId].time > 7776000 , "Can only withdraw unclaimed 90 days after Payouts are set");
    uint256 amount = PayoutPendingWithdrawls[_tokenId].amount;
    PayoutPendingWithdrawls[_tokenId].amount = 0;
    (bool sent, ) = (_destination.call{value: amount}(""));
    require(sent, "Transfer failed.");
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint64","name":"_linkSubscriptionId","type":"uint64"},{"internalType":"address","name":"_vrfCoordinatorAddress","type":"address"},{"internalType":"bytes32","name":"_keyHash","type":"bytes32"},{"internalType":"string","name":"_baselineURIMintPhase","type":"string"},{"internalType":"uint256","name":"_maxTickets","type":"uint256"},{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_dtMintStartVIP","type":"uint256"},{"internalType":"bytes32","name":"_merkleRootVIP","type":"bytes32"},{"internalType":"bytes32","name":"_merkleRootWhitelist","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PayoutsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BaseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BaselineURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkRandomOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LinkRandomWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LinkSubScriptionId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MerkleRootVIP","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MerkleRootWhitelist","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PayoutPendingWithdrawls","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Phase","outputs":[{"internalType":"enum SquareUpContest.EPhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"VIPClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhitelistClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"dtMintStartVIP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintTicketPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintTicketVIP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintTicketWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"offsetCalcURI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"randomWordsGet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUriNew","type":"string"}],"name":"setBaseURIGamePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_gasLane","type":"bytes32"}],"name":"setGasLaneLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintPhaseOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTime","type":"uint256"}],"name":"setMintStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"token","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SquareUpContest.Payout","name":"_payout","type":"tuple"}],"name":"setPayout","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":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawPayout","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawUnclaimed","outputs":[],"stateMutability":"payable","type":"function"}]

6101006040526012805460ff191690553480156200001c57600080fd5b5060405162003858380380620038588339810160408190526200003f91620002e2565b6040805180820182526008815267053717561726555760c41b60208083019182528351808501909452600384526253515560e81b9084015281518b93916200008b916000919062000185565b508051620000a190600190602084019062000185565b50505060601b6001600160601b031916608052620000c6620000c03390565b62000133565b6001600755600980546001600160a01b0319166001600160a01b038a1617905560c089901b6001600160c01b03191660a052600a87905585516200011290601090602089019062000185565b5060c09490945260e092909252601155600b55600c5550620003ec92505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001939062000399565b90600052602060002090601f016020900481019282620001b7576000855562000202565b82601f10620001d257805160ff191683800117855562000202565b8280016001018555821562000202579182015b8281111562000202578251825591602001919060010190620001e5565b506200021092915062000214565b5090565b5b8082111562000210576000815560010162000215565b600082601f8301126200023d57600080fd5b81516001600160401b03808211156200025a576200025a620003d6565b604051601f8301601f19908116603f01168101908282118183101715620002855762000285620003d6565b81604052838152602092508683858801011115620002a257600080fd5b600091505b83821015620002c65785820183015181830184015290820190620002a7565b83821115620002d85760008385830101525b9695505050505050565b60008060008060008060008060006101208a8c0312156200030257600080fd5b89516001600160401b0380821682146200031b57600080fd5b60208c0151919a506001600160a01b03821682146200033957600080fd5b60408c015160608d0151929a509850808211156200035657600080fd5b50620003658c828d016200022b565b96505060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600181811c90821680620003ae57607f821691505b60208210811415620003d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c60a05160c01c60c05160e05161341062000448600039600081816104db01526123b9015260008181610625015261230c0152600081816107f00152611d61015260008181610d3d0152610d7f01526134106000f3fe6080604052600436106102935760003560e01c8063714cff561161015a578063b21c7935116100c1578063da4e93cd1161007a578063da4e93cd1461082b578063e0c8628914610841578063e985e9c514610856578063ed7483be1461089f578063f2fde38b146108b5578063fb96e649146108d557600080fd5b8063b21c79351461074b578063b47654f41461075e578063b88d4fde1461077e578063c87b56dd1461079e578063d5b3621b146107be578063da1f7bff146107de57600080fd5b806395d89b411161011357806395d89b41146106a15780639ba7c0a4146106b65780639c7b99a6146106c9578063a22cb465146106e9578063a807e1a314610709578063ab1686ab1461071e57600080fd5b8063714cff56146105e7578063715018a6146105fe57806376d4df2c1461061357806381e55e2614610647578063826b41de1461065c5780638da5cb5b1461068357600080fd5b806342842e0e116101fe5780635867141e116101b75780635867141e146105135780635bb8ae7c146105355780636352211e1461057e5780636790884a1461059e5780636e084235146105b157806370a08231146105c757600080fd5b806342842e0e146104565780634286918c1461047657806344b7c545146104965780634d456dcb146104b65780634eb5659f146104c957806353a8bf22146104fd57600080fd5b80631fe543e3116102505780631fe543e31461037f57806323b872dd1461039f578063251b5e50146103bf5780633227555a146103ef5780633cb6a8d1146104055780634051a5a61461043657600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630de5c7131461034957806318160ddd1461035c575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612ce3565b6108eb565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e261093d565b6040516102c49190612fd3565b3480156102fb57600080fd5b5061030f61030a366004612cca565b6109cf565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612ca0565b610a5c565b005b610347610357366004612ca0565b610b72565b34801561036857600080fd5b50610371610d22565b6040519081526020016102c4565b34801561038b57600080fd5b5061034761039a366004612e16565b610d32565b3480156103ab57600080fd5b506103476103ba366004612bac565b610dba565b3480156103cb57600080fd5b506102b86103da366004612b57565b60146020526000908152604090205460ff1681565b3480156103fb57600080fd5b50610371600c5481565b34801561041157600080fd5b506102e260405180604001604052806005815260200164173539b7b760d91b81525081565b34801561044257600080fd5b50610347610451366004612d66565b610deb565b34801561046257600080fd5b50610347610471366004612bac565b610fd2565b34801561048257600080fd5b50610371610491366004612cca565b610fed565b3480156104a257600080fd5b506103476104b1366004612cca565b6110a5565b6103476104c4366004612cca565b6110d4565b3480156104d557600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b34801561050957600080fd5b50610371600a5481565b34801561051f57600080fd5b50610528611149565b6040516102c49190612f67565b34801561054157600080fd5b50610569610550366004612cca565b6013602052600090815260409020805460019091015482565b604080519283526020830191909152016102c4565b34801561058a57600080fd5b5061030f610599366004612cca565b6111a0565b6103476105ac366004612d97565b611217565b3480156105bd57600080fd5b50610371600e5481565b3480156105d357600080fd5b506103716105e2366004612b57565b6113f9565b3480156105f357600080fd5b506008546103719081565b34801561060a57600080fd5b50610347611480565b34801561061f57600080fd5b506103717f000000000000000000000000000000000000000000000000000000000000000081565b34801561065357600080fd5b506102e26114b6565b34801561066857600080fd5b506012546106769060ff1681565b6040516102c49190612fab565b34801561068f57600080fd5b506006546001600160a01b031661030f565b3480156106ad57600080fd5b506102e2611544565b6103476106c4366004612d97565b611553565b3480156106d557600080fd5b506103716106e4366004612cca565b6116ea565b3480156106f557600080fd5b50610347610704366004612c64565b61170b565b34801561071557600080fd5b50610347611716565b34801561072a57600080fd5b50610371610739366004612b57565b60156020526000908152604090205481565b610347610759366004612cca565b6117a9565b34801561076a57600080fd5b50610347610779366004612d1d565b6119cf565b34801561078a57600080fd5b50610347610799366004612be8565b611aed565b3480156107aa57600080fd5b506102e26107b9366004612cca565b611b25565b3480156107ca57600080fd5b506103476107d9366004612cca565b611bfa565b3480156107ea57600080fd5b506108127f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff90911681526020016102c4565b34801561083757600080fd5b5061037160115481565b34801561084d57600080fd5b50610347611c29565b34801561086257600080fd5b506102b8610871366004612b79565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108ab57600080fd5b50610371600b5481565b3480156108c157600080fd5b506103476108d0366004612b57565b611e09565b3480156108e157600080fd5b50610371600f5481565b60006001600160e01b031982166380ac58cd60e01b148061091c57506001600160e01b03198216635b5e139f60e01b145b8061093757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461094c906132ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610978906132ce565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b5050505050905090565b60006109da82611ea4565b610a405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a67826111a0565b9050806001600160a01b0316836001600160a01b03161415610ad55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a37565b336001600160a01b0382161480610af15750610af18133610871565b610b635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a37565b610b6d8383611ec1565b505050565b6006546001600160a01b03163314610b9c5760405162461bcd60e51b8152600401610a3790613152565b610ba581611ea4565b610bc15760405162461bcd60e51b8152600401610a37906130d2565b600081815260136020526040902060010154429015801590610c0157506000828152601360205260409020600101546276a70090610bff908361328b565b115b610c735760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610a37565b60008281526013602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610cd2576040519150601f19603f3d011682016040523d82523d6000602084013e610cd7565b606091505b5050905080610d1b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a37565b5050505050565b6000610d2d60085490565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dac5760405163073e64fd60e21b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610a37565b610db68282611f2f565b5050565b610dc43382611f78565b610de05760405162461bcd60e51b8152600401610a3790613187565b610b6d838383612062565b6006546001600160a01b03163314610e155760405162461bcd60e51b8152600401610a3790613152565b610e1f8135611ea4565b610e3b5760405162461bcd60e51b8152600401610a37906130d2565b8035600090815260136020526040902054158015610e6a57508035600090815260136020526040902060010154155b610eb65760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610a37565b600060125460ff166003811115610ecf57610ecf613382565b14158015610ef45750600160125460ff166003811115610ef157610ef1613382565b14155b610f405760405162461bcd60e51b815260206004820152601e60248201527f4d75737420626520696e2067616d65207068617365206f72206c6174657200006044820152606401610a37565b600260125460ff166003811115610f5957610f59613382565b1415610f6d576012805460ff191660031790555b604080518082018252602080840135808352428284018181528635600081815260139095528685208651815591516001909201919091559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610b6d83838360405180602001604052806000815250611aed565b6000610ff882611ea4565b6110145760405162461bcd60e51b8152600401610a37906130d2565b600d546110635760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610a37565b60085482600d60008154811061107b5761107b613398565b90600052602060002001546110909190613240565b61109a9190613342565b610937906001613240565b6006546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610a3790613152565b600a55565b600260075414156110f75760405162461bcd60e51b8152600401610a37906131d8565b6002600755601154429061110d9061c4e0613240565b111561112b5760405162461bcd60e51b8152600401610a3790612fe6565b61113781346002612209565b611141813361241f565b506001600755565b6060600d8054806020026020016040519081016040528092919081815260200182805480156109c557602002820191906000526020600020905b815481526020019060010190808311611183575050505050905090565b6000818152600260205260408120546001600160a01b0316806109375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a37565b6002600754141561123a5760405162461bcd60e51b8152600401610a37906131d8565b6002600755601154429061125090617080613240565b111561126e5760405162461bcd60e51b8152600401610a3790612fe6565b61127a83346001612209565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506112f483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050612468565b6113375760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610a37565b33600090815260156020526040902054600a90611355908690613240565b11156113b55760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e203160448201526830207469636b65747360b81b6064820152608401610a37565b336000908152601560205260409020546113d0908590613240565b336000818152601560205260409020919091556113ee90859061241f565b505060016007555050565b60006001600160a01b0382166114645760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a37565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610a3790613152565b6114b4600061247e565b565b601080546114c3906132ce565b80601f01602080910402602001604051908101604052809291908181526020018280546114ef906132ce565b801561153c5780601f106115115761010080835404028352916020019161153c565b820191906000526020600020905b81548152906001019060200180831161151f57829003601f168201915b505050505081565b60606001805461094c906132ce565b600260075414156115765760405162461bcd60e51b8152600401610a37906131d8565b600260075560115442101561159d5760405162461bcd60e51b8152600401610a3790612fe6565b3360009081526014602052604090205460ff16156116095760405162461bcd60e51b815260206004820152602360248201527f5649502063616e2774206d696e74206d6f7265207468616e206f6e65207469636044820152621ad95d60ea1b6064820152608401610a37565b61161583346000612209565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061168f83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050612468565b6116c55760405162461bcd60e51b815260206004820152600760248201526604e6f74205649560cc1b6044820152606401610a37565b336000818152601460205260409020805460ff191660011790556113ee90859061241f565b600d81815481106116fa57600080fd5b600091825260209091200154905081565b610db63383836124d0565b6006546001600160a01b031633146117405760405162461bcd60e51b8152600401610a3790613152565b600060125460ff16600381111561175957611759613382565b1461179a5760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a37565b6012805460ff19166001179055565b600260075414156117cc5760405162461bcd60e51b8152600401610a37906131d8565b60026007556117da81611ea4565b6117f65760405162461bcd60e51b8152600401610a37906130d2565b33611800826111a0565b6001600160a01b0316146118455760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a37565b6000818152601360205260409020600101546118a35760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610a37565b6000818152601360205260409020546118f75760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610a37565b600081815260136020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d806000811461197c576040519150601f19603f3d011682016040523d82523d6000602084013e611981565b606091505b50509050806119c55760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a37565b5050600160075550565b6006546001600160a01b031633146119f95760405162461bcd60e51b8152600401610a3790613152565b600160125460ff166003811115611a1257611a12613382565b14611a5f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610a37565b600d54611ac95760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610a37565b8051611adc906010906020840190612a10565b50506012805460ff19166002179055565b611af73383611f78565b611b135760405162461bcd60e51b8152600401610a3790613187565b611b1f8484848461259f565b50505050565b6060611b3082611ea4565b611b4c5760405162461bcd60e51b8152600401610a37906130d2565b6000611b566125d2565b9050600260125460ff166003811115611b7157611b71613382565b14611b7c5792915050565b6000611b8784610fed565b9050600082611b95836125e1565b604051602001611ba6929190612efb565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611be1928492909101612efb565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611c245760405162461bcd60e51b8152600401610a3790613152565b601155565b6006546001600160a01b03163314611c535760405162461bcd60e51b8152600401610a3790613152565b600160125460ff166003811115611c6c57611c6c613382565b14611c895760405162461bcd60e51b8152600401610a3790613109565b600d5415611ce35760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610a37565b6000611cee60085490565b11611d3b5760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610a37565b600954600a546040516305d3b1d360e41b8152600481019190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e049190612d7e565b600f55565b6006546001600160a01b03163314611e335760405162461bcd60e51b8152600401610a3790613152565b6001600160a01b038116611e985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b611ea18161247e565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ef6826111a0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600160125460ff166003811115611f4857611f48613382565b14611f655760405162461bcd60e51b8152600401610a3790613109565b8051610b6d90600d906020840190612a94565b6000611f8382611ea4565b611fe45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a37565b6000611fef836111a0565b9050806001600160a01b0316846001600160a01b0316148061203657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061205a5750836001600160a01b031661204f846109cf565b6001600160a01b0316145b949350505050565b826001600160a01b0316612075826111a0565b6001600160a01b0316146120d95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a37565b6001600160a01b03821661213b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a37565b6121468383836126df565b612151600082611ec1565b6001600160a01b038316600090815260036020526040812080546001929061217a90849061328b565b90915550506001600160a01b03821660009081526003602052604081208054600192906121a8908490613240565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600060125460ff16600381111561222257612222613382565b146122635760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a37565b600083116122a95760405162461bcd60e51b815260206004820152601360248201527243616e74206d696e742030207469636b65747360681b6044820152606401610a37565b60008160028111156122bd576122bd613382565b14156122e95760018311156122e45760405162461bcd60e51b8152600401610a3790613083565b61230a565b600a83111561230a5760405162461bcd60e51b8152600401610a3790613083565b7f00000000000000000000000000000000000000000000000000000000000000008361233560085490565b61233f9190613240565b11156123b35760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610a37565b6123dd837f000000000000000000000000000000000000000000000000000000000000000061326c565b821015610b6d5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610a37565b60005b828163ffffffff161015610b6d5761243e600880546001019055565b600061244960085490565b90506124558382612750565b50806124608161331e565b915050612422565b600082612475858461288f565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125325760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a37565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125aa848484612062565b6125b684848484612903565b611b1f5760405162461bcd60e51b8152600401610a3790613031565b60606010805461094c906132ce565b6060816126055750506040805180820190915260018152600360fc1b602082015290565b8160005b811561262f578061261981613303565b91506126289050600a83613258565b9150612609565b60008167ffffffffffffffff81111561264a5761264a6133ae565b6040519080825280601f01601f191660200182016040528015612674576020820181803683370190505b5090505b841561205a5761268960018361328b565b9150612696600a86613342565b6126a1906030613240565b60f81b8183815181106126b6576126b6613398565b60200101906001600160f81b031916908160001a9053506126d8600a86613258565b9450612678565b600360125460ff1660038111156126f8576126f8613382565b1415610b6d5760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610a37565b6001600160a01b0382166127a65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a37565b6127af81611ea4565b156127fc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a37565b612808600083836126df565b6001600160a01b0382166000908152600360205260408120805460019290612831908490613240565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b84518110156128fb5760008582815181106128b1576128b1613398565b602002602001015190508083116128d757600083815260208290526040902092506128e8565b600081815260208490526040902092505b50806128f381613303565b915050612894565b509392505050565b60006001600160a01b0384163b15612a0557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612947903390899088908890600401612f2a565b602060405180830381600087803b15801561296157600080fd5b505af1925050508015612991575060408051601f3d908101601f1916820190925261298e91810190612d00565b60015b6129eb573d8080156129bf576040519150601f19603f3d011682016040523d82523d6000602084013e6129c4565b606091505b5080516129e35760405162461bcd60e51b8152600401610a3790613031565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061205a565b506001949350505050565b828054612a1c906132ce565b90600052602060002090601f016020900481019282612a3e5760008555612a84565b82601f10612a5757805160ff1916838001178555612a84565b82800160010185558215612a84579182015b82811115612a84578251825591602001919060010190612a69565b50612a90929150612ace565b5090565b828054828255906000526020600020908101928215612a845791602002820182811115612a84578251825591602001919060010190612a69565b5b80821115612a905760008155600101612acf565b600067ffffffffffffffff831115612afd57612afd6133ae565b612b10601f8401601f191660200161320f565b9050828152838383011115612b2457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612b5257600080fd5b919050565b600060208284031215612b6957600080fd5b612b7282612b3b565b9392505050565b60008060408385031215612b8c57600080fd5b612b9583612b3b565b9150612ba360208401612b3b565b90509250929050565b600080600060608486031215612bc157600080fd5b612bca84612b3b565b9250612bd860208501612b3b565b9150604084013590509250925092565b60008060008060808587031215612bfe57600080fd5b612c0785612b3b565b9350612c1560208601612b3b565b925060408501359150606085013567ffffffffffffffff811115612c3857600080fd5b8501601f81018713612c4957600080fd5b612c5887823560208401612ae3565b91505092959194509250565b60008060408385031215612c7757600080fd5b612c8083612b3b565b915060208301358015158114612c9557600080fd5b809150509250929050565b60008060408385031215612cb357600080fd5b612cbc83612b3b565b946020939093013593505050565b600060208284031215612cdc57600080fd5b5035919050565b600060208284031215612cf557600080fd5b8135612b72816133c4565b600060208284031215612d1257600080fd5b8151612b72816133c4565b600060208284031215612d2f57600080fd5b813567ffffffffffffffff811115612d4657600080fd5b8201601f81018413612d5757600080fd5b61205a84823560208401612ae3565b600060408284031215612d7857600080fd5b50919050565b600060208284031215612d9057600080fd5b5051919050565b600080600060408486031215612dac57600080fd5b83359250602084013567ffffffffffffffff80821115612dcb57600080fd5b818601915086601f830112612ddf57600080fd5b813581811115612dee57600080fd5b8760208260051b8501011115612e0357600080fd5b6020830194508093505050509250925092565b60008060408385031215612e2957600080fd5b8235915060208084013567ffffffffffffffff80821115612e4957600080fd5b818601915086601f830112612e5d57600080fd5b813581811115612e6f57612e6f6133ae565b8060051b9150612e8084830161320f565b8181528481019084860184860187018b1015612e9b57600080fd5b600095505b83861015612ebe578035835260019590950194918601918601612ea0565b508096505050505050509250929050565b60008151808452612ee78160208601602086016132a2565b601f01601f19169290920160200192915050565b60008351612f0d8184602088016132a2565b835190830190612f218183602088016132a2565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f5d90830184612ecf565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612f9f57835183529284019291840191600101612f83565b50909695505050505050565b6020810160048310612fcd57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000612b726020830184612ecf565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613238576132386133ae565b604052919050565b6000821982111561325357613253613356565b500190565b6000826132675761326761336c565b500490565b600081600019048311821515161561328657613286613356565b500290565b60008282101561329d5761329d613356565b500390565b60005b838110156132bd5781810151838201526020016132a5565b83811115611b1f5750506000910152565b600181811c908216806132e257607f821691505b60208210811415612d7857634e487b7160e01b600052602260045260246000fd5b600060001982141561331757613317613356565b5060010190565b600063ffffffff8083168181141561333857613338613356565b6001019392505050565b6000826133515761335161336c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611ea157600080fdfea2646970667358221220befa49d912801fb68ee3a8cc390ff90b16957bf0f188b096a516498f76ebc7e464736f6c63430008070033000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000638d6cc0952d762954d9cf3221992d354fb8422a2410ce5e3a41d1f9bd6588b437c5a5ead6cd1b02f55fa11bf3f62b5637c9a4c440d6c58827a4984135fae3def5f124a70000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d546876344256594b334347397a523352427643796d4c42364d797631574150774c696947474836595066466f0000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063714cff561161015a578063b21c7935116100c1578063da4e93cd1161007a578063da4e93cd1461082b578063e0c8628914610841578063e985e9c514610856578063ed7483be1461089f578063f2fde38b146108b5578063fb96e649146108d557600080fd5b8063b21c79351461074b578063b47654f41461075e578063b88d4fde1461077e578063c87b56dd1461079e578063d5b3621b146107be578063da1f7bff146107de57600080fd5b806395d89b411161011357806395d89b41146106a15780639ba7c0a4146106b65780639c7b99a6146106c9578063a22cb465146106e9578063a807e1a314610709578063ab1686ab1461071e57600080fd5b8063714cff56146105e7578063715018a6146105fe57806376d4df2c1461061357806381e55e2614610647578063826b41de1461065c5780638da5cb5b1461068357600080fd5b806342842e0e116101fe5780635867141e116101b75780635867141e146105135780635bb8ae7c146105355780636352211e1461057e5780636790884a1461059e5780636e084235146105b157806370a08231146105c757600080fd5b806342842e0e146104565780634286918c1461047657806344b7c545146104965780634d456dcb146104b65780634eb5659f146104c957806353a8bf22146104fd57600080fd5b80631fe543e3116102505780631fe543e31461037f57806323b872dd1461039f578063251b5e50146103bf5780633227555a146103ef5780633cb6a8d1146104055780634051a5a61461043657600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630de5c7131461034957806318160ddd1461035c575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612ce3565b6108eb565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e261093d565b6040516102c49190612fd3565b3480156102fb57600080fd5b5061030f61030a366004612cca565b6109cf565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612ca0565b610a5c565b005b610347610357366004612ca0565b610b72565b34801561036857600080fd5b50610371610d22565b6040519081526020016102c4565b34801561038b57600080fd5b5061034761039a366004612e16565b610d32565b3480156103ab57600080fd5b506103476103ba366004612bac565b610dba565b3480156103cb57600080fd5b506102b86103da366004612b57565b60146020526000908152604090205460ff1681565b3480156103fb57600080fd5b50610371600c5481565b34801561041157600080fd5b506102e260405180604001604052806005815260200164173539b7b760d91b81525081565b34801561044257600080fd5b50610347610451366004612d66565b610deb565b34801561046257600080fd5b50610347610471366004612bac565b610fd2565b34801561048257600080fd5b50610371610491366004612cca565b610fed565b3480156104a257600080fd5b506103476104b1366004612cca565b6110a5565b6103476104c4366004612cca565b6110d4565b3480156104d557600080fd5b506103717f0000000000000000000000000000000000000000000000000011c37937e0800081565b34801561050957600080fd5b50610371600a5481565b34801561051f57600080fd5b50610528611149565b6040516102c49190612f67565b34801561054157600080fd5b50610569610550366004612cca565b6013602052600090815260409020805460019091015482565b604080519283526020830191909152016102c4565b34801561058a57600080fd5b5061030f610599366004612cca565b6111a0565b6103476105ac366004612d97565b611217565b3480156105bd57600080fd5b50610371600e5481565b3480156105d357600080fd5b506103716105e2366004612b57565b6113f9565b3480156105f357600080fd5b506008546103719081565b34801561060a57600080fd5b50610347611480565b34801561061f57600080fd5b506103717f00000000000000000000000000000000000000000000000000000000000000c881565b34801561065357600080fd5b506102e26114b6565b34801561066857600080fd5b506012546106769060ff1681565b6040516102c49190612fab565b34801561068f57600080fd5b506006546001600160a01b031661030f565b3480156106ad57600080fd5b506102e2611544565b6103476106c4366004612d97565b611553565b3480156106d557600080fd5b506103716106e4366004612cca565b6116ea565b3480156106f557600080fd5b50610347610704366004612c64565b61170b565b34801561071557600080fd5b50610347611716565b34801561072a57600080fd5b50610371610739366004612b57565b60156020526000908152604090205481565b610347610759366004612cca565b6117a9565b34801561076a57600080fd5b50610347610779366004612d1d565b6119cf565b34801561078a57600080fd5b50610347610799366004612be8565b611aed565b3480156107aa57600080fd5b506102e26107b9366004612cca565b611b25565b3480156107ca57600080fd5b506103476107d9366004612cca565b611bfa565b3480156107ea57600080fd5b506108127f000000000000000000000000000000000000000000000000000000000000020f81565b60405167ffffffffffffffff90911681526020016102c4565b34801561083757600080fd5b5061037160115481565b34801561084d57600080fd5b50610347611c29565b34801561086257600080fd5b506102b8610871366004612b79565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108ab57600080fd5b50610371600b5481565b3480156108c157600080fd5b506103476108d0366004612b57565b611e09565b3480156108e157600080fd5b50610371600f5481565b60006001600160e01b031982166380ac58cd60e01b148061091c57506001600160e01b03198216635b5e139f60e01b145b8061093757506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461094c906132ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610978906132ce565b80156109c55780601f1061099a576101008083540402835291602001916109c5565b820191906000526020600020905b8154815290600101906020018083116109a857829003601f168201915b5050505050905090565b60006109da82611ea4565b610a405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a67826111a0565b9050806001600160a01b0316836001600160a01b03161415610ad55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a37565b336001600160a01b0382161480610af15750610af18133610871565b610b635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a37565b610b6d8383611ec1565b505050565b6006546001600160a01b03163314610b9c5760405162461bcd60e51b8152600401610a3790613152565b610ba581611ea4565b610bc15760405162461bcd60e51b8152600401610a37906130d2565b600081815260136020526040902060010154429015801590610c0157506000828152601360205260409020600101546276a70090610bff908361328b565b115b610c735760405162461bcd60e51b815260206004820152603960248201527f43616e206f6e6c7920776974686472617720756e636c61696d6564203930206460448201527f617973206166746572205061796f7574732061726520736574000000000000006064820152608401610a37565b60008281526013602052604080822080549083905590519091906001600160a01b0386169083908381818185875af1925050503d8060008114610cd2576040519150601f19603f3d011682016040523d82523d6000602084013e610cd7565b606091505b5050905080610d1b5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a37565b5050505050565b6000610d2d60085490565b905090565b336001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699091614610dac5760405163073e64fd60e21b81523360048201526001600160a01b037f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909166024820152604401610a37565b610db68282611f2f565b5050565b610dc43382611f78565b610de05760405162461bcd60e51b8152600401610a3790613187565b610b6d838383612062565b6006546001600160a01b03163314610e155760405162461bcd60e51b8152600401610a3790613152565b610e1f8135611ea4565b610e3b5760405162461bcd60e51b8152600401610a37906130d2565b8035600090815260136020526040902054158015610e6a57508035600090815260136020526040902060010154155b610eb65760405162461bcd60e51b815260206004820152601e60248201527f5061796f757420616c72656164792073657420696e20746865207061737400006044820152606401610a37565b600060125460ff166003811115610ecf57610ecf613382565b14158015610ef45750600160125460ff166003811115610ef157610ef1613382565b14155b610f405760405162461bcd60e51b815260206004820152601e60248201527f4d75737420626520696e2067616d65207068617365206f72206c6174657200006044820152606401610a37565b600260125460ff166003811115610f5957610f59613382565b1415610f6d576012805460ff191660031790555b604080518082018252602080840135808352428284018181528635600081815260139095528685208651815591516001909201919091559451909491927fd5d5d049e9608f1efc24130fb8104fb6919491de8667a9d7aad9efe3d24892d291a3505050565b610b6d83838360405180602001604052806000815250611aed565b6000610ff882611ea4565b6110145760405162461bcd60e51b8152600401610a37906130d2565b600d546110635760405162461bcd60e51b815260206004820152601f60248201527f6c696e6b2072616e646f6d20776f72647320646f65736e2774206578697374006044820152606401610a37565b60085482600d60008154811061107b5761107b613398565b90600052602060002001546110909190613240565b61109a9190613342565b610937906001613240565b6006546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610a3790613152565b600a55565b600260075414156110f75760405162461bcd60e51b8152600401610a37906131d8565b6002600755601154429061110d9061c4e0613240565b111561112b5760405162461bcd60e51b8152600401610a3790612fe6565b61113781346002612209565b611141813361241f565b506001600755565b6060600d8054806020026020016040519081016040528092919081815260200182805480156109c557602002820191906000526020600020905b815481526020019060010190808311611183575050505050905090565b6000818152600260205260408120546001600160a01b0316806109375760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a37565b6002600754141561123a5760405162461bcd60e51b8152600401610a37906131d8565b6002600755601154429061125090617080613240565b111561126e5760405162461bcd60e51b8152600401610a3790612fe6565b61127a83346001612209565b6040516bffffffffffffffffffffffff193360601b1660208201526000906034016040516020818303038152906040528051906020012090506112f483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050612468565b6113375760405162461bcd60e51b8152602060048201526014602482015273139bdd081bdb881d1a19481dda1a5d195b1a5cdd60621b6044820152606401610a37565b33600090815260156020526040902054600a90611355908690613240565b11156113b55760405162461bcd60e51b815260206004820152602960248201527f57686974656c6973742063616e2774206d696e74206d6f7265207468616e203160448201526830207469636b65747360b81b6064820152608401610a37565b336000908152601560205260409020546113d0908590613240565b336000818152601560205260409020919091556113ee90859061241f565b505060016007555050565b60006001600160a01b0382166114645760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a37565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610a3790613152565b6114b4600061247e565b565b601080546114c3906132ce565b80601f01602080910402602001604051908101604052809291908181526020018280546114ef906132ce565b801561153c5780601f106115115761010080835404028352916020019161153c565b820191906000526020600020905b81548152906001019060200180831161151f57829003601f168201915b505050505081565b60606001805461094c906132ce565b600260075414156115765760405162461bcd60e51b8152600401610a37906131d8565b600260075560115442101561159d5760405162461bcd60e51b8152600401610a3790612fe6565b3360009081526014602052604090205460ff16156116095760405162461bcd60e51b815260206004820152602360248201527f5649502063616e2774206d696e74206d6f7265207468616e206f6e65207469636044820152621ad95d60ea1b6064820152608401610a37565b61161583346000612209565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061168f83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050612468565b6116c55760405162461bcd60e51b815260206004820152600760248201526604e6f74205649560cc1b6044820152606401610a37565b336000818152601460205260409020805460ff191660011790556113ee90859061241f565b600d81815481106116fa57600080fd5b600091825260209091200154905081565b610db63383836124d0565b6006546001600160a01b031633146117405760405162461bcd60e51b8152600401610a3790613152565b600060125460ff16600381111561175957611759613382565b1461179a5760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a37565b6012805460ff19166001179055565b600260075414156117cc5760405162461bcd60e51b8152600401610a37906131d8565b60026007556117da81611ea4565b6117f65760405162461bcd60e51b8152600401610a37906130d2565b33611800826111a0565b6001600160a01b0316146118455760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a37565b6000818152601360205260409020600101546118a35760405162461bcd60e51b815260206004820152601d60248201527f4e6f205061796f75742073657420666f722074686973207469636b65740000006044820152606401610a37565b6000818152601360205260409020546118f75760405162461bcd60e51b815260206004820152601660248201527514185e5bdd5d08105b1c9958591e4810db185a5b595960521b6044820152606401610a37565b600081815260136020526040808220805490839055905190918291339185917f425e2e0a3c1682ab47811bf16fdcee1b57b4af7706f31c08e7230192e5b8c0819190a4604051600090339083908381818185875af1925050503d806000811461197c576040519150601f19603f3d011682016040523d82523d6000602084013e611981565b606091505b50509050806119c55760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610a37565b5050600160075550565b6006546001600160a01b031633146119f95760405162461bcd60e51b8152600401610a3790613152565b600160125460ff166003811115611a1257611a12613382565b14611a5f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737769746368207465616d206c6973747300000000000000006044820152606401610a37565b600d54611ac95760405162461bcd60e51b815260206004820152603260248201527f43616e6e6f742073657420626173652075726920776974686f757420636861696044820152716e6c696e6b2072616e646f6d20776f72647360701b6064820152608401610a37565b8051611adc906010906020840190612a10565b50506012805460ff19166002179055565b611af73383611f78565b611b135760405162461bcd60e51b8152600401610a3790613187565b611b1f8484848461259f565b50505050565b6060611b3082611ea4565b611b4c5760405162461bcd60e51b8152600401610a37906130d2565b6000611b566125d2565b9050600260125460ff166003811115611b7157611b71613382565b14611b7c5792915050565b6000611b8784610fed565b9050600082611b95836125e1565b604051602001611ba6929190612efb565b60408051601f1981840301815282820182526005835264173539b7b760d91b6020848101919091529151909350611be1928492909101612efb565b6040516020818303038152906040529350505050919050565b6006546001600160a01b03163314611c245760405162461bcd60e51b8152600401610a3790613152565b601155565b6006546001600160a01b03163314611c535760405162461bcd60e51b8152600401610a3790613152565b600160125460ff166003811115611c6c57611c6c613382565b14611c895760405162461bcd60e51b8152600401610a3790613109565b600d5415611ce35760405162461bcd60e51b815260206004820152602160248201527f52616e646f6d20776f7264732063616e206f6e6c7920626520736574206f6e636044820152606560f81b6064820152608401610a37565b6000611cee60085490565b11611d3b5760405162461bcd60e51b815260206004820152601a60248201527f4d7573742068617665207465616d7320746f2073687566666c650000000000006044820152606401610a37565b600954600a546040516305d3b1d360e41b8152600481019190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000020f16602482015260056044820152620493e06064820152600160848201526001600160a01b0390911690635d3b1d309060a401602060405180830381600087803b158015611dcc57600080fd5b505af1158015611de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e049190612d7e565b600f55565b6006546001600160a01b03163314611e335760405162461bcd60e51b8152600401610a3790613152565b6001600160a01b038116611e985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b611ea18161247e565b50565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ef6826111a0565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600160125460ff166003811115611f4857611f48613382565b14611f655760405162461bcd60e51b8152600401610a3790613109565b8051610b6d90600d906020840190612a94565b6000611f8382611ea4565b611fe45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a37565b6000611fef836111a0565b9050806001600160a01b0316846001600160a01b0316148061203657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061205a5750836001600160a01b031661204f846109cf565b6001600160a01b0316145b949350505050565b826001600160a01b0316612075826111a0565b6001600160a01b0316146120d95760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a37565b6001600160a01b03821661213b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a37565b6121468383836126df565b612151600082611ec1565b6001600160a01b038316600090815260036020526040812080546001929061217a90849061328b565b90915550506001600160a01b03821660009081526003602052604081208054600192906121a8908490613240565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600060125460ff16600381111561222257612222613382565b146122635760405162461bcd60e51b815260206004820152601160248201527026b4b73a10383430b9b29034b99037b33360791b6044820152606401610a37565b600083116122a95760405162461bcd60e51b815260206004820152601360248201527243616e74206d696e742030207469636b65747360681b6044820152606401610a37565b60008160028111156122bd576122bd613382565b14156122e95760018311156122e45760405162461bcd60e51b8152600401610a3790613083565b61230a565b600a83111561230a5760405162461bcd60e51b8152600401610a3790613083565b7f00000000000000000000000000000000000000000000000000000000000000c88361233560085490565b61233f9190613240565b11156123b35760405162461bcd60e51b815260206004820152603b60248201527f43616e2774206d696e74206d6f7265207468616e2074686520746f74616c206e60448201527f756d626572206f6620617661696c61626c65207469636b6574732e00000000006064820152608401610a37565b6123dd837f0000000000000000000000000000000000000000000000000011c37937e0800061326c565b821015610b6d5760405162461bcd60e51b815260206004820152601060248201526f4e6f7420656e6f7567682066756e647360801b6044820152606401610a37565b60005b828163ffffffff161015610b6d5761243e600880546001019055565b600061244960085490565b90506124558382612750565b50806124608161331e565b915050612422565b600082612475858461288f565b14949350505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156125325760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a37565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125aa848484612062565b6125b684848484612903565b611b1f5760405162461bcd60e51b8152600401610a3790613031565b60606010805461094c906132ce565b6060816126055750506040805180820190915260018152600360fc1b602082015290565b8160005b811561262f578061261981613303565b91506126289050600a83613258565b9150612609565b60008167ffffffffffffffff81111561264a5761264a6133ae565b6040519080825280601f01601f191660200182016040528015612674576020820181803683370190505b5090505b841561205a5761268960018361328b565b9150612696600a86613342565b6126a1906030613240565b60f81b8183815181106126b6576126b6613398565b60200101906001600160f81b031916908160001a9053506126d8600a86613258565b9450612678565b600360125460ff1660038111156126f8576126f8613382565b1415610b6d5760405162461bcd60e51b815260206004820152602160248201527f4e6f207472616e7366657273206f6e6365207061796f757473206172652073656044820152601d60fa1b6064820152608401610a37565b6001600160a01b0382166127a65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a37565b6127af81611ea4565b156127fc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a37565b612808600083836126df565b6001600160a01b0382166000908152600360205260408120805460019290612831908490613240565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b84518110156128fb5760008582815181106128b1576128b1613398565b602002602001015190508083116128d757600083815260208290526040902092506128e8565b600081815260208490526040902092505b50806128f381613303565b915050612894565b509392505050565b60006001600160a01b0384163b15612a0557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612947903390899088908890600401612f2a565b602060405180830381600087803b15801561296157600080fd5b505af1925050508015612991575060408051601f3d908101601f1916820190925261298e91810190612d00565b60015b6129eb573d8080156129bf576040519150601f19603f3d011682016040523d82523d6000602084013e6129c4565b606091505b5080516129e35760405162461bcd60e51b8152600401610a3790613031565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061205a565b506001949350505050565b828054612a1c906132ce565b90600052602060002090601f016020900481019282612a3e5760008555612a84565b82601f10612a5757805160ff1916838001178555612a84565b82800160010185558215612a84579182015b82811115612a84578251825591602001919060010190612a69565b50612a90929150612ace565b5090565b828054828255906000526020600020908101928215612a845791602002820182811115612a84578251825591602001919060010190612a69565b5b80821115612a905760008155600101612acf565b600067ffffffffffffffff831115612afd57612afd6133ae565b612b10601f8401601f191660200161320f565b9050828152838383011115612b2457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612b5257600080fd5b919050565b600060208284031215612b6957600080fd5b612b7282612b3b565b9392505050565b60008060408385031215612b8c57600080fd5b612b9583612b3b565b9150612ba360208401612b3b565b90509250929050565b600080600060608486031215612bc157600080fd5b612bca84612b3b565b9250612bd860208501612b3b565b9150604084013590509250925092565b60008060008060808587031215612bfe57600080fd5b612c0785612b3b565b9350612c1560208601612b3b565b925060408501359150606085013567ffffffffffffffff811115612c3857600080fd5b8501601f81018713612c4957600080fd5b612c5887823560208401612ae3565b91505092959194509250565b60008060408385031215612c7757600080fd5b612c8083612b3b565b915060208301358015158114612c9557600080fd5b809150509250929050565b60008060408385031215612cb357600080fd5b612cbc83612b3b565b946020939093013593505050565b600060208284031215612cdc57600080fd5b5035919050565b600060208284031215612cf557600080fd5b8135612b72816133c4565b600060208284031215612d1257600080fd5b8151612b72816133c4565b600060208284031215612d2f57600080fd5b813567ffffffffffffffff811115612d4657600080fd5b8201601f81018413612d5757600080fd5b61205a84823560208401612ae3565b600060408284031215612d7857600080fd5b50919050565b600060208284031215612d9057600080fd5b5051919050565b600080600060408486031215612dac57600080fd5b83359250602084013567ffffffffffffffff80821115612dcb57600080fd5b818601915086601f830112612ddf57600080fd5b813581811115612dee57600080fd5b8760208260051b8501011115612e0357600080fd5b6020830194508093505050509250925092565b60008060408385031215612e2957600080fd5b8235915060208084013567ffffffffffffffff80821115612e4957600080fd5b818601915086601f830112612e5d57600080fd5b813581811115612e6f57612e6f6133ae565b8060051b9150612e8084830161320f565b8181528481019084860184860187018b1015612e9b57600080fd5b600095505b83861015612ebe578035835260019590950194918601918601612ea0565b508096505050505050509250929050565b60008151808452612ee78160208601602086016132a2565b601f01601f19169290920160200192915050565b60008351612f0d8184602088016132a2565b835190830190612f218183602088016132a2565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f5d90830184612ecf565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612f9f57835183529284019291840191600101612f83565b50909695505050505050565b6020810160048310612fcd57634e487b7160e01b600052602160045260246000fd5b91905290565b602081526000612b726020830184612ecf565b6020808252602b908201527f43616e2774206d696e74207965742e2054727920616761696e20696e2061206660408201526a32bb9039b2b1b7b732399760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602f908201527f43616e2774206d696e742074686973206d616e79207469636b65747320696e2060408201526e37b732903a3930b739b0b1ba34b7b760891b606082015260800190565b6020808252601b908201527f717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000604082015260600190565b60208082526029908201527f5465616d732063616e6e6f742062652073657420647572696e6720746865206d604082015268696e7420706861736560b81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613238576132386133ae565b604052919050565b6000821982111561325357613253613356565b500190565b6000826132675761326761336c565b500490565b600081600019048311821515161561328657613286613356565b500290565b60008282101561329d5761329d613356565b500390565b60005b838110156132bd5781810151838201526020016132a5565b83811115611b1f5750506000910152565b600181811c908216806132e257607f821691505b60208210811415612d7857634e487b7160e01b600052602260045260246000fd5b600060001982141561331757613317613356565b5060010190565b600063ffffffff8083168181141561333857613338613356565b6001019392505050565b6000826133515761335161336c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611ea157600080fdfea2646970667358221220befa49d912801fb68ee3a8cc390ff90b16957bf0f188b096a516498f76ebc7e464736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000020f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699098af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000011c37937e0800000000000000000000000000000000000000000000000000000000000638d6cc0952d762954d9cf3221992d354fb8422a2410ce5e3a41d1f9bd6588b437c5a5ead6cd1b02f55fa11bf3f62b5637c9a4c440d6c58827a4984135fae3def5f124a70000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d546876344256594b334347397a523352427643796d4c42364d797631574150774c696947474836595066466f0000000000000000000000

-----Decoded View---------------
Arg [0] : _linkSubscriptionId (uint64): 527
Arg [1] : _vrfCoordinatorAddress (address): 0x271682DEB8C4E0901D1a1550aD2e64D568E69909
Arg [2] : _keyHash (bytes32): 0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : _baselineURIMintPhase (string): ipfs://QmThv4BVYK3CG9zR3RBvCymLB6Myv1WAPwLiiGGH6YPfFo
Arg [4] : _maxTickets (uint256): 200
Arg [5] : _mintFee (uint256): 5000000000000000
Arg [6] : _dtMintStartVIP (uint256): 1670212800
Arg [7] : _merkleRootVIP (bytes32): 0x952d762954d9cf3221992d354fb8422a2410ce5e3a41d1f9bd6588b437c5a5ea
Arg [8] : _merkleRootWhitelist (bytes32): 0xd6cd1b02f55fa11bf3f62b5637c9a4c440d6c58827a4984135fae3def5f124a7

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000000000020f
Arg [1] : 000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e69909
Arg [2] : 8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [5] : 0000000000000000000000000000000000000000000000000011c37937e08000
Arg [6] : 00000000000000000000000000000000000000000000000000000000638d6cc0
Arg [7] : 952d762954d9cf3221992d354fb8422a2410ce5e3a41d1f9bd6588b437c5a5ea
Arg [8] : d6cd1b02f55fa11bf3f62b5637c9a4c440d6c58827a4984135fae3def5f124a7
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [10] : 697066733a2f2f516d546876344256594b334347397a523352427643796d4c42
Arg [11] : 364d797631574150774c696947474836595066466f0000000000000000000000


Deployed Bytecode Sourcemap

55986:9252:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21643:305;;;;;;;;;;-1:-1:-1;21643:305:0;;;;;:::i;:::-;;:::i;:::-;;;9100:14:1;;9093:22;9075:41;;9063:2;9048:18;21643:305:0;;;;;;;;22588:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24148:221::-;;;;;;;;;;-1:-1:-1;24148:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7452:32:1;;;7434:51;;7422:2;7407:18;24148:221:0;7288:203:1;23671:411:0;;;;;;;;;;-1:-1:-1;23671:411:0;;;;;:::i;:::-;;:::i;:::-;;64633:600;;;;;;:::i;:::-;;:::i;61014:93::-;;;;;;;;;;;;;:::i;:::-;;;9273:25:1;;;9261:2;9246:18;61014:93:0;9127:177:1;46179:261:0;;;;;;;;;;-1:-1:-1;46179:261:0;;;;;:::i;:::-;;:::i;24898:339::-;;;;;;;;;;-1:-1:-1;24898:339:0;;;;;:::i;:::-;;:::i;57166:41::-;;;;;;;;;;-1:-1:-1;57166:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56597:34;;;;;;;;;;;;;;;;56235:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56235:46:0;;;;;63295:674;;;;;;;;;;-1:-1:-1;63295:674:0;;;;;:::i;:::-;;:::i;25308:185::-;;;;;;;;;;-1:-1:-1;25308:185:0;;;;;:::i;:::-;;:::i;61674:314::-;;;;;;;;;;-1:-1:-1;61674:314:0;;;;;:::i;:::-;;:::i;62378:92::-;;;;;;;;;;-1:-1:-1;62378:92:0;;;;;:::i;:::-;;:::i;60280:276::-;;;;;;:::i;:::-;;:::i;56500:32::-;;;;;;;;;;;;;;;56537:22;;;;;;;;;;;;;;;;63187:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;57101:60::-;;;;;;;;;;-1:-1:-1;57101:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;26489:25:1;;;26545:2;26530:18;;26523:34;;;;26462:18;57101:60:0;26315:248:1;22282:239:0;;;;;;;;;;-1:-1:-1;22282:239:0;;;;;:::i;:::-;;:::i;59615:659::-;;;;;;:::i;:::-;;:::i;56673:31::-;;;;;;;;;;;;;;;;22012:208;;;;;;;;;;-1:-1:-1;22012:208:0;;;;;:::i;:::-;;:::i;56111:32::-;;;;;;;;;;-1:-1:-1;56111:32:0;;;;;;48166:103;;;;;;;;;;;;;:::i;56460:35::-;;;;;;;;;;;;;;;56738:25;;;;;;;;;;;;;:::i;57063:33::-;;;;;;;;;;-1:-1:-1;57063:33:0;;;;;;;;;;;;;;;:::i;47515:87::-;;;;;;;;;;-1:-1:-1;47588:6:0;;-1:-1:-1;;;;;47588:6:0;47515:87;;22757:104;;;;;;;;;;;;;:::i;59052:557::-;;;;;;:::i;:::-;;:::i;56636:32::-;;;;;;;;;;-1:-1:-1;56636:32:0;;;;;:::i;:::-;;:::i;24441:155::-;;;;;;;;;;-1:-1:-1;24441:155:0;;;;;:::i;:::-;;:::i;60868:140::-;;;;;;;;;;;;;:::i;57212:47::-;;;;;;;;;;-1:-1:-1;57212:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;63975:652;;;;;;:::i;:::-;;:::i;60562:300::-;;;;;;;;;;-1:-1:-1;60562:300:0;;;;;:::i;:::-;;:::i;25564:328::-;;;;;;;;;;-1:-1:-1;25564:328:0;;;;;:::i;:::-;;:::i;61217:451::-;;;;;;;;;;-1:-1:-1;61217:451:0;;;;;:::i;:::-;;:::i;62272:100::-;;;;;;;;;;-1:-1:-1;62272:100:0;;;;;:::i;:::-;;:::i;56413:42::-;;;;;;;;;;;;;;;;;;26742:18:1;26730:31;;;26712:50;;26700:2;26685:18;56413:42:0;26568:200:1;56768:29:0;;;;;;;;;;;;;;;;62476:457;;;;;;;;;;;;;:::i;24667:164::-;;;;;;;;;;-1:-1:-1;24667:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24667:164;56564:28;;;;;;;;;;;;;;;;48424:201;;;;;;;;;;-1:-1:-1;48424:201:0;;;;;:::i;:::-;;:::i;56709:24::-;;;;;;;;;;;;;;;;21643:305;21745:4;-1:-1:-1;;;;;;21782:40:0;;-1:-1:-1;;;21782:40:0;;:105;;-1:-1:-1;;;;;;;21839:48:0;;-1:-1:-1;;;21839:48:0;21782:105;:158;;;-1:-1:-1;;;;;;;;;;20175:40:0;;;21904:36;21762:178;21643:305;-1:-1:-1;;21643:305:0:o;22588:100::-;22642:13;22675:5;22668:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22588:100;:::o;24148:221::-;24224:7;24252:16;24260:7;24252;:16::i;:::-;24244:73;;;;-1:-1:-1;;;24244:73:0;;20988:2:1;24244:73:0;;;20970:21:1;21027:2;21007:18;;;21000:30;21066:34;21046:18;;;21039:62;-1:-1:-1;;;21117:18:1;;;21110:42;21169:19;;24244:73:0;;;;;;;;;-1:-1:-1;24337:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24337:24:0;;24148:221::o;23671:411::-;23752:13;23768:23;23783:7;23768:14;:23::i;:::-;23752:39;;23816:5;-1:-1:-1;;;;;23810:11:0;:2;-1:-1:-1;;;;;23810:11:0;;;23802:57;;;;-1:-1:-1;;;23802:57:0;;23738:2:1;23802:57:0;;;23720:21:1;23777:2;23757:18;;;23750:30;23816:34;23796:18;;;23789:62;-1:-1:-1;;;23867:18:1;;;23860:31;23908:19;;23802:57:0;23536:397:1;23802:57:0;16929:10;-1:-1:-1;;;;;23894:21:0;;;;:62;;-1:-1:-1;23919:37:0;23936:5;16929:10;24667:164;:::i;23919:37::-;23872:168;;;;-1:-1:-1;;;23872:168:0;;18279:2:1;23872:168:0;;;18261:21:1;18318:2;18298:18;;;18291:30;18357:34;18337:18;;;18330:62;18428:26;18408:18;;;18401:54;18472:19;;23872:168:0;18077:420:1;23872:168:0;24053:21;24062:2;24066:7;24053:8;:21::i;:::-;23741:341;23671:411;;:::o;64633:600::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;64742:17:::1;64750:8;64742:7;:17::i;:::-;64734:57;;;;-1:-1:-1::0;;;64734:57:0::1;;;;;;;:::i;:::-;64798:12;64843:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64813:15:::1;::::0;64843:43;;::::1;::::0;:105:::1;;-1:-1:-1::0;64900:33:0::1;::::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64941:7:::1;::::0;64890:48:::1;::::0;:7;:48:::1;:::i;:::-;:58;64843:105;64835:176;;;::::0;-1:-1:-1;;;64835:176:0;;22959:2:1;64835:176:0::1;::::0;::::1;22941:21:1::0;22998:2;22978:18;;;22971:30;23037:34;23017:18;;;23010:62;23108:27;23088:18;;;23081:55;23153:19;;64835:176:0::1;22757:421:1::0;64835:176:0::1;65018:14;65035:33:::0;;;:23:::1;:33;::::0;;;;;:40;;65082:44;;;;65150:36;;65035:40;;65018:14;-1:-1:-1;;;;;65150:17:0;::::1;::::0;65035:40;;65018:14;65150:36;65018:14;65150:36;65035:40;65150:17;:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65133:54;;;65202:4;65194:33;;;::::0;-1:-1:-1;;;65194:33:0;;24495:2:1;65194:33:0::1;::::0;::::1;24477:21:1::0;24534:2;24514:18;;;24507:30;-1:-1:-1;;;24553:18:1;;;24546:46;24609:18;;65194:33:0::1;24293:340:1::0;65194:33:0::1;64727:506;;;64633:600:::0;;:::o;61014:93::-;61060:7;61083:18;:8;52722:14;;52630:114;61083:18;61076:25;;61014:93;:::o;46179:261::-;46279:10;-1:-1:-1;;;;;46293:14:0;46279:28;;46275:111;;46325:53;;-1:-1:-1;;;46325:53:0;;46351:10;46325:53;;;7708:34:1;-1:-1:-1;;;;;46363:14:0;7778:15:1;7758:18;;;7751:43;7643:18;;46325:53:0;7496:304:1;46275:111:0;46392:42;46411:9;46422:11;46392:18;:42::i;:::-;46179:261;;:::o;24898:339::-;25093:41;16929:10;25126:7;25093:18;:41::i;:::-;25085:103;;;;-1:-1:-1;;;25085:103:0;;;;;;;:::i;:::-;25201:28;25211:4;25217:2;25221:7;25201:9;:28::i;63295:674::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;63373:22:::1;63381:13:::0;::::1;63373:7;:22::i;:::-;63365:62;;;;-1:-1:-1::0;;;63365:62:0::1;;;;;;;:::i;:::-;63466:13:::0;::::1;63442:38;::::0;;;:23:::1;:38;::::0;;;;:45;:50;:102;::::1;;;-1:-1:-1::0;63520:13:0;::::1;63496:38;::::0;;;:23:::1;:38;::::0;;;;:43:::1;;::::0;:48;63442:102:::1;63434:145;;;::::0;-1:-1:-1;;;63434:145:0;;25976:2:1;63434:145:0::1;::::0;::::1;25958:21:1::0;26015:2;25995:18;;;25988:30;26054:32;26034:18;;;26027:60;26104:18;;63434:145:0::1;25774:354:1::0;63434:145:0::1;63603:11;63594:5;::::0;::::1;;:20;::::0;::::1;;;;;;:::i;:::-;;;:47;;;;-1:-1:-1::0;63627:14:0::1;63618:5;::::0;::::1;;:23;::::0;::::1;;;;;;:::i;:::-;;;63594:47;63586:90;;;::::0;-1:-1:-1;;;63586:90:0;;22172:2:1;63586:90:0::1;::::0;::::1;22154:21:1::0;22211:2;22191:18;;;22184:30;22250:32;22230:18;;;22223:60;22300:18;;63586:90:0::1;21970:354:1::0;63586:90:0::1;63696:11;63687:5;::::0;::::1;;:20;::::0;::::1;;;;;;:::i;:::-;;63683:64;;;63718:5;:21:::0;;-1:-1:-1;;63718:21:0::1;63726:13;63718:21;::::0;;63683:64:::1;63819:34;::::0;;;;::::1;::::0;;63829:14:::1;::::0;;::::1;;63819:34:::0;;;63768:15:::1;63819:34:::0;;::::1;::::0;;;63884:13;::::1;63753:12;63860:38:::0;;;:23:::1;:38:::0;;;;;;:50;;;;;;::::1;::::0;;::::1;::::0;;;;63922:41;;63768:15;;63829:14;;63922:41:::1;::::0;::::1;63358:611;;63295:674:::0;:::o;25308:185::-;25446:39;25463:4;25469:2;25473:7;25446:39;;;;;;;;;;;;:16;:39::i;61674:314::-;61735:7;61759:16;61767:7;61759;:16::i;:::-;61751:56;;;;-1:-1:-1;;;61751:56:0;;;;;;;:::i;:::-;61822:15;:22;61814:70;;;;-1:-1:-1;;;61814:70:0;;10624:2:1;61814:70:0;;;10606:21:1;10663:2;10643:18;;;10636:30;10702:33;10682:18;;;10675:61;10753:18;;61814:70:0;10422:355:1;61814:70:0;61931:8;52722:14;61920:7;61899:15;61915:1;61899:18;;;;;;;;:::i;:::-;;;;;;;;;:28;;;;:::i;:::-;61898:51;;;;:::i;:::-;:55;;61952:1;61898:55;:::i;62378:92::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62446:7:::1;:18:::0;62378:92::o;60280:276::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;60364:14:::1;::::0;60393:15:::1;::::0;60364:25:::1;::::0;60381:8:::1;60364:25;:::i;:::-;:44;;60356:100;;;;-1:-1:-1::0;;;60356:100:0::1;;;;;;;:::i;:::-;60463:48;60473:8;60483:9;60494:16;60463:9;:48::i;:::-;60518:32;60529:8;60539:10;60518;:32::i;:::-;-1:-1:-1::0;50759:1:0;51713:7;:22;60280:276::o;63187:102::-;63236:16;63268:15;63261:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63187:102;:::o;22282:239::-;22354:7;22390:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22390:16:0;22425:19;22417:73;;;;-1:-1:-1;;;22417:73:0;;19115:2:1;22417:73:0;;;19097:21:1;19154:2;19134:18;;;19127:30;19193:34;19173:18;;;19166:62;-1:-1:-1;;;19244:18:1;;;19237:39;19293:19;;22417:73:0;18913:405:1;59615:659:0;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59735:14:::1;::::0;59763:15:::1;::::0;59735:24:::1;::::0;59752:7:::1;59735:24;:::i;:::-;:43;;59727:99;;;;-1:-1:-1::0;;;59727:99:0::1;;;;;;;:::i;:::-;59833:51;59843:8;59853:9;59864:19;59833:9;:51::i;:::-;59917:28;::::0;-1:-1:-1;;59934:10:0::1;6518:2:1::0;6514:15;6510:53;59917:28:0::1;::::0;::::1;6498:66:1::0;59891:12:0::1;::::0;6580::1;;59917:28:0::1;;;;;;;;;;;;59906:41;;;;;;59891:56;;59962:59;59981:12;;59962:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59995:19:0::1;::::0;;-1:-1:-1;60016:4:0;;-1:-1:-1;59962:18:0::1;:59::i;:::-;59954:92;;;::::0;-1:-1:-1;;;59954:92:0;;13713:2:1;59954:92:0::1;::::0;::::1;13695:21:1::0;13752:2;13732:18;;;13725:30;-1:-1:-1;;;13771:18:1;;;13764:50;13831:18;;59954:92:0::1;13511:344:1::0;59954:92:0::1;60078:10;60061:28;::::0;;;:16:::1;:28;::::0;;;;;60104:2:::1;::::0;60061:39:::1;::::0;60092:8;;60061:39:::1;:::i;:::-;:45;;60053:99;;;::::0;-1:-1:-1;;;60053:99:0;;17869:2:1;60053:99:0::1;::::0;::::1;17851:21:1::0;17908:2;17888:18;;;17881:30;17947:34;17927:18;;;17920:62;-1:-1:-1;;;17998:18:1;;;17991:39;18047:19;;60053:99:0::1;17667:405:1::0;60053:99:0::1;60207:10;60190:28;::::0;;;:16:::1;:28;::::0;;;;;:39:::1;::::0;60221:8;;60190:39:::1;:::i;:::-;60176:10;60159:28;::::0;;;:16:::1;:28;::::0;;;;:70;;;;60236:32:::1;::::0;60247:8;;60236:10:::1;:32::i;:::-;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;;59615:659:0:o;22012:208::-;22084:7;-1:-1:-1;;;;;22112:19:0;;22104:74;;;;-1:-1:-1;;;22104:74:0;;18704:2:1;22104:74:0;;;18686:21:1;18743:2;18723:18;;;18716:30;18782:34;18762:18;;;18755:62;-1:-1:-1;;;18833:18:1;;;18826:40;18883:19;;22104:74:0;18502:406:1;22104:74:0;-1:-1:-1;;;;;;22196:16:0;;;;;:9;:16;;;;;;;22012:208::o;48166:103::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;48231:30:::1;48258:1;48231:18;:30::i;:::-;48166:103::o:0;56738:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22757:104::-;22813:13;22846:7;22839:14;;;;;:::i;59052:557::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;59166:14:::1;::::0;59184:15:::1;-1:-1:-1::0;59166:33:0::1;59158:89;;;;-1:-1:-1::0;;;59158:89:0::1;;;;;;;:::i;:::-;59273:10;59262:22;::::0;;;:10:::1;:22;::::0;;;;;::::1;;:31;59254:79;;;::::0;-1:-1:-1;;;59254:79:0;;16345:2:1;59254:79:0::1;::::0;::::1;16327:21:1::0;16384:2;16364:18;;;16357:30;16423:34;16403:18;;;16396:62;-1:-1:-1;;;16474:18:1;;;16467:33;16517:19;;59254:79:0::1;16143:399:1::0;59254:79:0::1;59340:45;59350:8;59360:9;59371:13;59340:9;:45::i;:::-;59418:28;::::0;-1:-1:-1;;59435:10:0::1;6518:2:1::0;6514:15;6510:53;59418:28:0::1;::::0;::::1;6498:66:1::0;59392:12:0::1;::::0;6580::1;;59418:28:0::1;;;;;;;;;;;;59407:41;;;;;;59392:56;;59463:53;59482:12;;59463:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;59496:13:0::1;::::0;;-1:-1:-1;59511:4:0;;-1:-1:-1;59463:18:0::1;:53::i;:::-;59455:73;;;::::0;-1:-1:-1;;;59455:73:0;;19525:2:1;59455:73:0::1;::::0;::::1;19507:21:1::0;19564:1;19544:18;;;19537:29;-1:-1:-1;;;19582:18:1;;;19575:37;19629:18;;59455:73:0::1;19323:330:1::0;59455:73:0::1;59546:10;59535:22;::::0;;;:10:::1;:22;::::0;;;;:29;;-1:-1:-1;;59535:29:0::1;59560:4;59535:29;::::0;;59571:32:::1;::::0;59582:8;;59571:10:::1;:32::i;56636:::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56636:32:0;:::o;24441:155::-;24536:52;16929:10;24569:8;24579;24536:18;:52::i;60868:140::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60940:11:::1;60931:5;::::0;::::1;;:20;::::0;::::1;;;;;;:::i;:::-;;60923:50;;;::::0;-1:-1:-1;;;60923:50:0;;13367:2:1;60923:50:0::1;::::0;::::1;13349:21:1::0;13406:2;13386:18;;;13379:30;-1:-1:-1;;;13425:18:1;;;13418:47;13482:18;;60923:50:0::1;13165:341:1::0;60923:50:0::1;60980:5;:22:::0;;-1:-1:-1;;60980:22:0::1;60988:14;60980:22;::::0;;60868:140::o;63975:652::-;50803:1;51401:7;;:19;;51393:63;;;;-1:-1:-1;;;51393:63:0;;;;;;;:::i;:::-;50803:1;51534:7;:18;64062:17:::1;64070:8:::0;64062:7:::1;:17::i;:::-;64054:57;;;;-1:-1:-1::0;;;64054:57:0::1;;;;;;;:::i;:::-;64147:10;64126:17;64134:8:::0;64126:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;64126:31:0::1;;64118:56;;;::::0;-1:-1:-1;;;64118:56:0;;11798:2:1;64118:56:0::1;::::0;::::1;11780:21:1::0;11837:2;11817:18;;;11810:30;-1:-1:-1;;;11856:18:1;;;11849:42;11908:18;;64118:56:0::1;11596:336:1::0;64118:56:0::1;64230:1;64189:33:::0;;;:23:::1;:33;::::0;;;;:38:::1;;::::0;64181:84:::1;;;::::0;-1:-1:-1;;;64181:84:0;;25618:2:1;64181:84:0::1;::::0;::::1;25600:21:1::0;25657:2;25637:18;;;25630:30;25696:31;25676:18;;;25669:59;25745:18;;64181:84:0::1;25416:353:1::0;64181:84:0::1;64323:1;64280:33:::0;;;:23:::1;:33;::::0;;;;:40;64272:79:::1;;;::::0;-1:-1:-1;;;64272:79:0;;17518:2:1;64272:79:0::1;::::0;::::1;17500:21:1::0;17557:2;17537:18;;;17530:30;-1:-1:-1;;;17576:18:1;;;17569:52;17638:18;;64272:79:0::1;17316:346:1::0;64272:79:0::1;64358:14;64375:33:::0;;;:23:::1;:33;::::0;;;;;:40;;64422:44;;;;64478;;64375:40;;;;64503:10:::1;::::0;64399:8;;64478:44:::1;::::0;64358:14;64478:44:::1;64546:34;::::0;64530:9:::1;::::0;64546:10:::1;::::0;64569:6;;64530:9;64546:34;64530:9;64546:34;64569:6;64546:10;:34:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64529:52;;;64596:4;64588:33;;;::::0;-1:-1:-1;;;64588:33:0;;24495:2:1;64588:33:0::1;::::0;::::1;24477:21:1::0;24534:2;24514:18;;;24507:30;-1:-1:-1;;;24553:18:1;;;24546:46;24609:18;;64588:33:0::1;24293:340:1::0;64588:33:0::1;-1:-1:-1::0;;50759:1:0;51713:7;:22;-1:-1:-1;63975:652:0:o;60562:300::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;60659:14:::1;60650:5;::::0;::::1;;:23;::::0;::::1;;;;;;:::i;:::-;;60642:60;;;::::0;-1:-1:-1;;;60642:60:0;;23385:2:1;60642:60:0::1;::::0;::::1;23367:21:1::0;23424:2;23404:18;;;23397:30;23463:26;23443:18;;;23436:54;23507:18;;60642:60:0::1;23183:348:1::0;60642:60:0::1;60717:15;:22:::0;60709:89:::1;;;::::0;-1:-1:-1;;;60709:89:0;;19860:2:1;60709:89:0::1;::::0;::::1;19842:21:1::0;19899:2;19879:18;;;19872:30;19938:34;19918:18;;;19911:62;-1:-1:-1;;;19989:18:1;;;19982:48;20047:19;;60709:89:0::1;19658:414:1::0;60709:89:0::1;60805:25:::0;;::::1;::::0;:11:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;60837:5:0::1;:19:::0;;-1:-1:-1;;60837:19:0::1;60845:11;60837:19;::::0;;60562:300::o;25564:328::-;25739:41;16929:10;25772:7;25739:18;:41::i;:::-;25731:103;;;;-1:-1:-1;;;25731:103:0;;;;;;;:::i;:::-;25845:39;25859:4;25865:2;25869:7;25878:5;25845:13;:39::i;:::-;25564:328;;;;:::o;61217:451::-;61290:13;61320:16;61328:7;61320;:16::i;:::-;61312:56;;;;-1:-1:-1;;;61312:56:0;;;;;;;:::i;:::-;61375:21;61399:10;:8;:10::i;:::-;61375:34;-1:-1:-1;61429:11:0;61420:5;;;;:20;;;;;;;;:::i;:::-;;61416:57;;61458:7;61217:451;-1:-1:-1;;61217:451:0:o;61416:57::-;61479:14;61496:22;61510:7;61496:13;:22::i;:::-;61479:39;;61525:17;61569:7;61578:24;61595:6;61578:16;:24::i;:::-;61552:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61552:51:0;;;;;;61647:13;;;;;;;;-1:-1:-1;;;61552:51:0;61647:13;;;;;;;61625:36;;61552:51;;-1:-1:-1;61625:36:0;;61552:51;;;;61625:36;;:::i;:::-;;;;;;;;;;;;;61611:51;;;;;61217:451;;;:::o;62272:100::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62341:14:::1;:25:::0;62272:100::o;62476:457::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;62549:14:::1;62540:5;::::0;::::1;;:23;::::0;::::1;;;;;;:::i;:::-;;62532:77;;;;-1:-1:-1::0;;;62532:77:0::1;;;;;;;:::i;:::-;62624:15;:22:::0;:27;62616:73:::1;;;::::0;-1:-1:-1;;;62616:73:0;;12558:2:1;62616:73:0::1;::::0;::::1;12540:21:1::0;12597:2;12577:18;;;12570:30;12636:34;12616:18;;;12609:62;-1:-1:-1;;;12687:18:1;;;12680:31;12728:19;;62616:73:0::1;12356:397:1::0;62616:73:0::1;62725:1;62704:18;:8;52722:14:::0;;52630:114;62704:18:::1;:22;62696:61;;;::::0;-1:-1:-1;;;62696:61:0;;24140:2:1;62696:61:0::1;::::0;::::1;24122:21:1::0;24179:2;24159:18;;;24152:30;24218:28;24198:18;;;24191:56;24264:18;;62696:61:0::1;23938:350:1::0;62696:61:0::1;62776:11;::::0;62815:7:::1;::::0;62776:151:::1;::::0;-1:-1:-1;;;62776:151:0;;::::1;::::0;::::1;9560:25:1::0;;;;9633:18;62831::0::1;9621:31:1::0;9601:18;;;9594:59;56229:1:0::1;9669:18:1::0;;;9662:47;56369:6:0::1;9754:18:1::0;;;9747:43;62776:11:0;9806:19:1;;;9799:44;-1:-1:-1;;;;;62776:11:0;;::::1;::::0;:30:::1;::::0;9532:19:1;;62776:151:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62764:9;:163:::0;62476:457::o;48424:201::-;47588:6;;-1:-1:-1;;;;;47588:6:0;16929:10;47735:23;47727:68;;;;-1:-1:-1;;;47727:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48513:22:0;::::1;48505:73;;;::::0;-1:-1:-1;;;48505:73:0;;12960:2:1;48505:73:0::1;::::0;::::1;12942:21:1::0;12999:2;12979:18;;;12972:30;13038:34;13018:18;;;13011:62;-1:-1:-1;;;13089:18:1;;;13082:36;13135:19;;48505:73:0::1;12758:402:1::0;48505:73:0::1;48589:28;48608:8;48589:18;:28::i;:::-;48424:201:::0;:::o;27402:127::-;27467:4;27491:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27491:16:0;:30;;;27402:127::o;31548:174::-;31623:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31623:29:0;-1:-1:-1;;;;;31623:29:0;;;;;;;;:24;;31677:23;31623:24;31677:14;:23::i;:::-;-1:-1:-1;;;;;31668:46:0;;;;;;;;;;;31548:174;;:::o;62939:242::-;63079:14;63070:5;;;;:23;;;;;;;;:::i;:::-;;63062:77;;;;-1:-1:-1;;;63062:77:0;;;;;;;:::i;:::-;63146:29;;;;:15;;:29;;;;;:::i;27696:348::-;27789:4;27814:16;27822:7;27814;:16::i;:::-;27806:73;;;;-1:-1:-1;;;27806:73:0;;16749:2:1;27806:73:0;;;16731:21:1;16788:2;16768:18;;;16761:30;16827:34;16807:18;;;16800:62;-1:-1:-1;;;16878:18:1;;;16871:42;16930:19;;27806:73:0;16547:408:1;27806:73:0;27890:13;27906:23;27921:7;27906:14;:23::i;:::-;27890:39;;27959:5;-1:-1:-1;;;;;27948:16:0;:7;-1:-1:-1;;;;;27948:16:0;;:52;;;-1:-1:-1;;;;;;24788:25:0;;;24764:4;24788:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27968:32;27948:87;;;;28028:7;-1:-1:-1;;;;;28004:31:0;:20;28016:7;28004:11;:20::i;:::-;-1:-1:-1;;;;;28004:31:0;;27948:87;27940:96;27696:348;-1:-1:-1;;;;27696:348:0:o;30805:625::-;30964:4;-1:-1:-1;;;;;30937:31:0;:23;30952:7;30937:14;:23::i;:::-;-1:-1:-1;;;;;30937:31:0;;30929:81;;;;-1:-1:-1;;;30929:81:0;;14062:2:1;30929:81:0;;;14044:21:1;14101:2;14081:18;;;14074:30;14140:34;14120:18;;;14113:62;-1:-1:-1;;;14191:18:1;;;14184:35;14236:19;;30929:81:0;13860:401:1;30929:81:0;-1:-1:-1;;;;;31029:16:0;;31021:65;;;;-1:-1:-1;;;31021:65:0;;15170:2:1;31021:65:0;;;15152:21:1;15209:2;15189:18;;;15182:30;15248:34;15228:18;;;15221:62;-1:-1:-1;;;15299:18:1;;;15292:34;15343:19;;31021:65:0;14968:400:1;31021:65:0;31099:39;31120:4;31126:2;31130:7;31099:20;:39::i;:::-;31203:29;31220:1;31224:7;31203:8;:29::i;:::-;-1:-1:-1;;;;;31245:15:0;;;;;;:9;:15;;;;;:20;;31264:1;;31245:15;:20;;31264:1;;31245:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31276:13:0;;;;;;:9;:13;;;;;:18;;31293:1;;31276:13;:18;;31293:1;;31276:18;:::i;:::-;;;;-1:-1:-1;;31305:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31305:21:0;-1:-1:-1;;;;;31305:21:0;;;;;;;;;31344:27;;31305:16;;31344:27;;;;;;;23741:341;23671:411;;:::o;58420:626::-;58524:11;58515:5;;;;:20;;;;;;;;:::i;:::-;;58507:50;;;;-1:-1:-1;;;58507:50:0;;13367:2:1;58507:50:0;;;13349:21:1;13406:2;13386:18;;;13379:30;-1:-1:-1;;;13425:18:1;;;13418:47;13482:18;;58507:50:0;13165:341:1;58507:50:0;58583:1;58572:8;:12;58564:44;;;;-1:-1:-1;;;58564:44:0;;20279:2:1;58564:44:0;;;20261:21:1;20318:2;20298:18;;;20291:30;-1:-1:-1;;;20337:18:1;;;20330:49;20396:18;;58564:44:0;20077:343:1;58564:44:0;58631:13;58619:8;:25;;;;;;;;:::i;:::-;;58615:240;;;56328:1;58663:8;:29;;58655:89;;;;-1:-1:-1;;;58655:89:0;;;;;;;:::i;:::-;58615:240;;;58793:2;58781:8;:14;;58773:74;;;;-1:-1:-1;;;58773:74:0;;;;;;;:::i;:::-;58902:10;58890:8;58869:18;:8;52722:14;;52630:114;58869:18;:29;;;;:::i;:::-;:43;;58861:115;;;;-1:-1:-1;;;58861:115:0;;22531:2:1;58861:115:0;;;22513:21:1;22570:2;22550:18;;;22543:30;22609:34;22589:18;;;22582:62;22680:29;22660:18;;;22653:57;22727:19;;58861:115:0;22329:423:1;58861:115:0;59001:18;59011:8;59001:7;:18;:::i;:::-;58991:6;:28;;58983:57;;;;-1:-1:-1;;;58983:57:0;;14825:2:1;58983:57:0;;;14807:21:1;14864:2;14844:18;;;14837:30;-1:-1:-1;;;14883:18:1;;;14876:46;14939:18;;58983:57:0;14623:340:1;58188:226:0;58259:8;58254:155;58277:8;58273:1;:12;;;58254:155;;;58301:20;:8;52841:19;;52859:1;52841:19;;;52752:127;58301:20;58330:17;58350:18;:8;52722:14;;52630:114;58350:18;58330:38;;58377:24;58383:6;58391:9;58377:5;:24::i;:::-;-1:-1:-1;58287:3:0;;;;:::i;:::-;;;;58254:155;;54451:190;54576:4;54629;54600:25;54613:5;54620:4;54600:12;:25::i;:::-;:33;;54451:190;-1:-1:-1;;;;54451:190:0:o;48785:191::-;48878:6;;;-1:-1:-1;;;;;48895:17:0;;;-1:-1:-1;;;;;;48895:17:0;;;;;;;48928:40;;48878:6;;;48895:17;48878:6;;48928:40;;48859:16;;48928:40;48848:128;48785:191;:::o;31864:315::-;32019:8;-1:-1:-1;;;;;32010:17:0;:5;-1:-1:-1;;;;;32010:17:0;;;32002:55;;;;-1:-1:-1;;;32002:55:0;;15575:2:1;32002:55:0;;;15557:21:1;15614:2;15594:18;;;15587:30;15653:27;15633:18;;;15626:55;15698:18;;32002:55:0;15373:349:1;32002:55:0;-1:-1:-1;;;;;32068:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;32068:46:0;;;;;;;;;;32130:41;;9075::1;;;32130::0;;9048:18:1;32130:41:0;;;;;;;31864:315;;;:::o;26774:::-;26931:28;26941:4;26947:2;26951:7;26931:9;:28::i;:::-;26978:48;27001:4;27007:2;27011:7;27020:5;26978:22;:48::i;:::-;26970:111;;;;-1:-1:-1;;;26970:111:0;;;;;;;:::i;61113:98::-;61165:13;61194:11;61187:18;;;;;:::i;17436:723::-;17492:13;17713:10;17709:53;;-1:-1:-1;;17740:10:0;;;;;;;;;;;;-1:-1:-1;;;17740:10:0;;;;;17436:723::o;17709:53::-;17787:5;17772:12;17828:78;17835:9;;17828:78;;17861:8;;;;:::i;:::-;;-1:-1:-1;17884:10:0;;-1:-1:-1;17892:2:0;17884:10;;:::i;:::-;;;17828:78;;;17916:19;17948:6;17938:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17938:17:0;;17916:39;;17966:154;17973:10;;17966:154;;18000:11;18010:1;18000:11;;:::i;:::-;;-1:-1:-1;18069:10:0;18077:2;18069:5;:10;:::i;:::-;18056:24;;:2;:24;:::i;:::-;18043:39;;18026:6;18033;18026:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18026:56:0;;;;;;;;-1:-1:-1;18097:11:0;18106:2;18097:11;;:::i;:::-;;;17966:154;;61994:270;62153:13;62144:5;;;;:22;;;;;;;;:::i;:::-;;;62136:68;;;;-1:-1:-1;;;62136:68:0;;11396:2:1;62136:68:0;;;11378:21:1;11435:2;11415:18;;;11408:30;11474:34;11454:18;;;11447:62;-1:-1:-1;;;11525:18:1;;;11518:31;11566:19;;62136:68:0;11194:397:1;29380:439:0;-1:-1:-1;;;;;29460:16:0;;29452:61;;;;-1:-1:-1;;;29452:61:0;;20627:2:1;29452:61:0;;;20609:21:1;;;20646:18;;;20639:30;20705:34;20685:18;;;20678:62;20757:18;;29452:61:0;20425:356:1;29452:61:0;29533:16;29541:7;29533;:16::i;:::-;29532:17;29524:58;;;;-1:-1:-1;;;29524:58:0;;14468:2:1;29524:58:0;;;14450:21:1;14507:2;14487:18;;;14480:30;14546;14526:18;;;14519:58;14594:18;;29524:58:0;14266:352:1;29524:58:0;29595:45;29624:1;29628:2;29632:7;29595:20;:45::i;:::-;-1:-1:-1;;;;;29653:13:0;;;;;;:9;:13;;;;;:18;;29670:1;;29653:13;:18;;29670:1;;29653:18;:::i;:::-;;;;-1:-1:-1;;29682:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29682:21:0;-1:-1:-1;;;;;29682:21:0;;;;;;;;29721:33;;29682:16;;;29721:33;;29682:16;;29721:33;46179:261;;:::o;55002:675::-;55085:7;55128:4;55085:7;55143:497;55167:5;:12;55163:1;:16;55143:497;;;55201:20;55224:5;55230:1;55224:8;;;;;;;;:::i;:::-;;;;;;;55201:31;;55267:12;55251;:28;55247:382;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55379:57;;55247:382;;;55753:13;55803:15;;;55839:4;55832:15;;;55886:4;55870:21;;55556:57;;55247:382;-1:-1:-1;55181:3:0;;;;:::i;:::-;;;;55143:497;;;-1:-1:-1;55657:12:0;55002:675;-1:-1:-1;;;55002:675:0:o;32744:799::-;32899:4;-1:-1:-1;;;;;32920:13:0;;9187:19;:23;32916:620;;32956:72;;-1:-1:-1;;;32956:72:0;;-1:-1:-1;;;;;32956:36:0;;;;;:72;;16929:10;;33007:4;;33013:7;;33022:5;;32956:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32956:72:0;;;;;;;;-1:-1:-1;;32956:72:0;;;;;;;;;;;;:::i;:::-;;;32952:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33198:13:0;;33194:272;;33241:60;;-1:-1:-1;;;33241:60:0;;;;;;;:::i;33194:272::-;33416:6;33410:13;33401:6;33397:2;33393:15;33386:38;32952:529;-1:-1:-1;;;;;;33079:51:0;-1:-1:-1;;;33079:51:0;;-1:-1:-1;33072:58:0;;32916:620;-1:-1:-1;33520:4:0;32744:799;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:186::-;662:6;715:2;703:9;694:7;690:23;686:32;683:52;;;731:1;728;721:12;683:52;754:29;773:9;754:29;:::i;:::-;744:39;603:186;-1:-1:-1;;;603:186:1:o;794:260::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;;1010:38;1044:2;1033:9;1029:18;1010:38;:::i;:::-;1000:48;;794:260;;;;;:::o;1059:328::-;1136:6;1144;1152;1205:2;1193:9;1184:7;1180:23;1176:32;1173:52;;;1221:1;1218;1211:12;1173:52;1244:29;1263:9;1244:29;:::i;:::-;1234:39;;1292:38;1326:2;1315:9;1311:18;1292:38;:::i;:::-;1282:48;;1377:2;1366:9;1362:18;1349:32;1339:42;;1059:328;;;;;:::o;1392:666::-;1487:6;1495;1503;1511;1564:3;1552:9;1543:7;1539:23;1535:33;1532:53;;;1581:1;1578;1571:12;1532:53;1604:29;1623:9;1604:29;:::i;:::-;1594:39;;1652:38;1686:2;1675:9;1671:18;1652:38;:::i;:::-;1642:48;;1737:2;1726:9;1722:18;1709:32;1699:42;;1792:2;1781:9;1777:18;1764:32;1819:18;1811:6;1808:30;1805:50;;;1851:1;1848;1841:12;1805:50;1874:22;;1927:4;1919:13;;1915:27;-1:-1:-1;1905:55:1;;1956:1;1953;1946:12;1905:55;1979:73;2044:7;2039:2;2026:16;2021:2;2017;2013:11;1979:73;:::i;:::-;1969:83;;;1392:666;;;;;;;:::o;2063:347::-;2128:6;2136;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:29;2247:9;2228:29;:::i;:::-;2218:39;;2307:2;2296:9;2292:18;2279:32;2354:5;2347:13;2340:21;2333:5;2330:32;2320:60;;2376:1;2373;2366:12;2320:60;2399:5;2389:15;;;2063:347;;;;;:::o;2415:254::-;2483:6;2491;2544:2;2532:9;2523:7;2519:23;2515:32;2512:52;;;2560:1;2557;2550:12;2512:52;2583:29;2602:9;2583:29;:::i;:::-;2573:39;2659:2;2644:18;;;;2631:32;;-1:-1:-1;;;2415:254:1:o;2674:180::-;2733:6;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;-1:-1:-1;2825:23:1;;2674:180;-1:-1:-1;2674:180:1:o;2859:245::-;2917:6;2970:2;2958:9;2949:7;2945:23;2941:32;2938:52;;;2986:1;2983;2976:12;2938:52;3025:9;3012:23;3044:30;3068:5;3044:30;:::i;3109:249::-;3178:6;3231:2;3219:9;3210:7;3206:23;3202:32;3199:52;;;3247:1;3244;3237:12;3199:52;3279:9;3273:16;3298:30;3322:5;3298:30;:::i;3363:450::-;3432:6;3485:2;3473:9;3464:7;3460:23;3456:32;3453:52;;;3501:1;3498;3491:12;3453:52;3541:9;3528:23;3574:18;3566:6;3563:30;3560:50;;;3606:1;3603;3596:12;3560:50;3629:22;;3682:4;3674:13;;3670:27;-1:-1:-1;3660:55:1;;3711:1;3708;3701:12;3660:55;3734:73;3799:7;3794:2;3781:16;3776:2;3772;3768:11;3734:73;:::i;3818:192::-;3903:6;3956:2;3944:9;3935:7;3931:23;3927:32;3924:52;;;3972:1;3969;3962:12;3924:52;-1:-1:-1;3995:9:1;3818:192;-1:-1:-1;3818:192:1:o;4200:184::-;4270:6;4323:2;4311:9;4302:7;4298:23;4294:32;4291:52;;;4339:1;4336;4329:12;4291:52;-1:-1:-1;4362:16:1;;4200:184;-1:-1:-1;4200:184:1:o;4389:683::-;4484:6;4492;4500;4553:2;4541:9;4532:7;4528:23;4524:32;4521:52;;;4569:1;4566;4559:12;4521:52;4605:9;4592:23;4582:33;;4666:2;4655:9;4651:18;4638:32;4689:18;4730:2;4722:6;4719:14;4716:34;;;4746:1;4743;4736:12;4716:34;4784:6;4773:9;4769:22;4759:32;;4829:7;4822:4;4818:2;4814:13;4810:27;4800:55;;4851:1;4848;4841:12;4800:55;4891:2;4878:16;4917:2;4909:6;4906:14;4903:34;;;4933:1;4930;4923:12;4903:34;4986:7;4981:2;4971:6;4968:1;4964:14;4960:2;4956:23;4952:32;4949:45;4946:65;;;5007:1;5004;4997:12;4946:65;5038:2;5034;5030:11;5020:21;;5060:6;5050:16;;;;;4389:683;;;;;:::o;5077:1025::-;5170:6;5178;5231:2;5219:9;5210:7;5206:23;5202:32;5199:52;;;5247:1;5244;5237:12;5199:52;5283:9;5270:23;5260:33;;5312:2;5365;5354:9;5350:18;5337:32;5388:18;5429:2;5421:6;5418:14;5415:34;;;5445:1;5442;5435:12;5415:34;5483:6;5472:9;5468:22;5458:32;;5528:7;5521:4;5517:2;5513:13;5509:27;5499:55;;5550:1;5547;5540:12;5499:55;5586:2;5573:16;5608:2;5604;5601:10;5598:36;;;5614:18;;:::i;:::-;5660:2;5657:1;5653:10;5643:20;;5683:28;5707:2;5703;5699:11;5683:28;:::i;:::-;5745:15;;;5776:12;;;;5808:11;;;5838;;;5834:20;;5831:33;-1:-1:-1;5828:53:1;;;5877:1;5874;5867:12;5828:53;5899:1;5890:10;;5909:163;5923:2;5920:1;5917:9;5909:163;;;5980:17;;5968:30;;5941:1;5934:9;;;;;6018:12;;;;6050;;5909:163;;;5913:3;6091:5;6081:15;;;;;;;;5077:1025;;;;;:::o;6107:257::-;6148:3;6186:5;6180:12;6213:6;6208:3;6201:19;6229:63;6285:6;6278:4;6273:3;6269:14;6262:4;6255:5;6251:16;6229:63;:::i;:::-;6346:2;6325:15;-1:-1:-1;;6321:29:1;6312:39;;;;6353:4;6308:50;;6107:257;-1:-1:-1;;6107:257:1:o;6603:470::-;6782:3;6820:6;6814:13;6836:53;6882:6;6877:3;6870:4;6862:6;6858:17;6836:53;:::i;:::-;6952:13;;6911:16;;;;6974:57;6952:13;6911:16;7008:4;6996:17;;6974:57;:::i;:::-;7047:20;;6603:470;-1:-1:-1;;;;6603:470:1:o;7805:488::-;-1:-1:-1;;;;;8074:15:1;;;8056:34;;8126:15;;8121:2;8106:18;;8099:43;8173:2;8158:18;;8151:34;;;8221:3;8216:2;8201:18;;8194:31;;;7999:4;;8242:45;;8267:19;;8259:6;8242:45;:::i;:::-;8234:53;7805:488;-1:-1:-1;;;;;;7805:488:1:o;8298:632::-;8469:2;8521:21;;;8591:13;;8494:18;;;8613:22;;;8440:4;;8469:2;8692:15;;;;8666:2;8651:18;;;8440:4;8735:169;8749:6;8746:1;8743:13;8735:169;;;8810:13;;8798:26;;8879:15;;;;8844:12;;;;8771:1;8764:9;8735:169;;;-1:-1:-1;8921:3:1;;8298:632;-1:-1:-1;;;;;;8298:632:1:o;9854:339::-;9997:2;9982:18;;10030:1;10019:13;;10009:144;;10075:10;10070:3;10066:20;10063:1;10056:31;10110:4;10107:1;10100:15;10138:4;10135:1;10128:15;10009:144;10162:25;;;9854:339;:::o;10198:219::-;10347:2;10336:9;10329:21;10310:4;10367:44;10407:2;10396:9;10392:18;10384:6;10367:44;:::i;10782:407::-;10984:2;10966:21;;;11023:2;11003:18;;;10996:30;11062:34;11057:2;11042:18;;11035:62;-1:-1:-1;;;11128:2:1;11113:18;;11106:41;11179:3;11164:19;;10782:407::o;11937:414::-;12139:2;12121:21;;;12178:2;12158:18;;;12151:30;12217:34;12212:2;12197:18;;12190:62;-1:-1:-1;;;12283:2:1;12268:18;;12261:48;12341:3;12326:19;;11937:414::o;15727:411::-;15929:2;15911:21;;;15968:2;15948:18;;;15941:30;16007:34;16002:2;15987:18;;15980:62;-1:-1:-1;;;16073:2:1;16058:18;;16051:45;16128:3;16113:19;;15727:411::o;16960:351::-;17162:2;17144:21;;;17201:2;17181:18;;;17174:30;17240:29;17235:2;17220:18;;17213:57;17302:2;17287:18;;16960:351::o;21199:405::-;21401:2;21383:21;;;21440:2;21420:18;;;21413:30;21479:34;21474:2;21459:18;;21452:62;-1:-1:-1;;;21545:2:1;21530:18;;21523:39;21594:3;21579:19;;21199:405::o;21609:356::-;21811:2;21793:21;;;21830:18;;;21823:30;21889:34;21884:2;21869:18;;21862:62;21956:2;21941:18;;21609:356::o;24638:413::-;24840:2;24822:21;;;24879:2;24859:18;;;24852:30;24918:34;24913:2;24898:18;;24891:62;-1:-1:-1;;;24984:2:1;24969:18;;24962:47;25041:3;25026:19;;24638:413::o;25056:355::-;25258:2;25240:21;;;25297:2;25277:18;;;25270:30;25336:33;25331:2;25316:18;;25309:61;25402:2;25387:18;;25056:355::o;26773:275::-;26844:2;26838:9;26909:2;26890:13;;-1:-1:-1;;26886:27:1;26874:40;;26944:18;26929:34;;26965:22;;;26926:62;26923:88;;;26991:18;;:::i;:::-;27027:2;27020:22;26773:275;;-1:-1:-1;26773:275:1:o;27053:128::-;27093:3;27124:1;27120:6;27117:1;27114:13;27111:39;;;27130:18;;:::i;:::-;-1:-1:-1;27166:9:1;;27053:128::o;27186:120::-;27226:1;27252;27242:35;;27257:18;;:::i;:::-;-1:-1:-1;27291:9:1;;27186:120::o;27311:168::-;27351:7;27417:1;27413;27409:6;27405:14;27402:1;27399:21;27394:1;27387:9;27380:17;27376:45;27373:71;;;27424:18;;:::i;:::-;-1:-1:-1;27464:9:1;;27311:168::o;27484:125::-;27524:4;27552:1;27549;27546:8;27543:34;;;27557:18;;:::i;:::-;-1:-1:-1;27594:9:1;;27484:125::o;27614:258::-;27686:1;27696:113;27710:6;27707:1;27704:13;27696:113;;;27786:11;;;27780:18;27767:11;;;27760:39;27732:2;27725:10;27696:113;;;27827:6;27824:1;27821:13;27818:48;;;-1:-1:-1;;27862:1:1;27844:16;;27837:27;27614:258::o;27877:380::-;27956:1;27952:12;;;;27999;;;28020:61;;28074:4;28066:6;28062:17;28052:27;;28020:61;28127:2;28119:6;28116:14;28096:18;28093:38;28090:161;;;28173:10;28168:3;28164:20;28161:1;28154:31;28208:4;28205:1;28198:15;28236:4;28233:1;28226:15;28262:135;28301:3;-1:-1:-1;;28322:17:1;;28319:43;;;28342:18;;:::i;:::-;-1:-1:-1;28389:1:1;28378:13;;28262:135::o;28402:201::-;28440:3;28468:10;28513:2;28506:5;28502:14;28540:2;28531:7;28528:15;28525:41;;;28546:18;;:::i;:::-;28595:1;28582:15;;28402:201;-1:-1:-1;;;28402:201:1:o;28608:112::-;28640:1;28666;28656:35;;28671:18;;:::i;:::-;-1:-1:-1;28705:9:1;;28608:112::o;28725:127::-;28786:10;28781:3;28777:20;28774:1;28767:31;28817:4;28814:1;28807:15;28841:4;28838:1;28831:15;28857:127;28918:10;28913:3;28909:20;28906:1;28899:31;28949:4;28946:1;28939:15;28973:4;28970:1;28963:15;28989:127;29050:10;29045:3;29041:20;29038:1;29031:31;29081:4;29078:1;29071:15;29105:4;29102:1;29095:15;29121:127;29182:10;29177:3;29173:20;29170:1;29163:31;29213:4;29210:1;29203:15;29237:4;29234:1;29227:15;29253:127;29314:10;29309:3;29305:20;29302:1;29295:31;29345:4;29342:1;29335:15;29369:4;29366:1;29359:15;29385:131;-1:-1:-1;;;;;;29459:32:1;;29449:43;;29439:71;;29506:1;29503;29496:12

Swarm Source

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