ETH Price: $2,348.26 (+2.51%)

Token

MetaBogans (MB)
 

Overview

Max Total Supply

246 MB

Holders

119

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 MB
0x2c66841927c5d06a5bba10aa43779cd0c853cc7e
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:
MetaBogans

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-23
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.2;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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 || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

contract MetaBogans is ERC721, Ownable, ERC721Enumerable, ReentrancyGuard {
    using Strings for uint256;
	
	uint256 public GIVEAWAY_NFT = 100;
	uint256 public RESERVED_NFT = 100;
	uint256 public EARLYSALE_NFT = 600;
	uint256 public PRESALE_NFT = 1400;
	uint256 public SALE_NFT_BATCH_ONE = 1400;
	uint256 public SALE_NFT_BATCH_TWO = 1400;
	uint256 public BREEDING_NFT = 1600;
	
	uint256 public GOLD_NFT_EARLYSALE = 25;
	uint256 public GOLD_NFT_PRESALE = 25;
	uint256 public GOLD_NFT_SALE_BATCH_ONE = 25;
	uint256 public GOLD_NFT_SALE_BATCH_TWO = 25;

	uint256 public MAX_MINT_EARLYSALE = 3;
	uint256 public MAX_MINT_PRESALE = 2;
	uint256 public MAX_MINT_SALE_BATCH_ONE = 3;
	uint256 public MAX_MINT_SALE_BATCH_TWO = 3;
	
	uint256 public MAX_BY_MINT_IN_TRANSACTION_EARLYSALE = 3;
	uint256 public MAX_BY_MINT_IN_TRANSACTION_PRESALE = 2;
	uint256 public MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_ONE = 3;
	uint256 public MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_TWO = 3;
	
	uint256 public EARLYSALE_PRICE = 1 * 10**17;
	uint256 public PRESALE_PRICE = 12 * 10**16;
	uint256 public SALE_PRICE_BATCH_ONE = 13 * 10**16;
	uint256 public SALE_PRICE_BATCH_TWO = 15 * 10**16;
	
	uint256 public GIVEAWAY_MINTED;
	uint256 public RESERVED_MINTED;
	uint256 public EARLYSALE_MINTED;
	uint256 public PRESALE_MINTED;
	uint256 public SALE_MINTED_BATCH_ONE;
	uint256 public SALE_MINTED_BATCH_TWO;
	
	bool public earlysaleEnable = false;
    bool public presaleEnable = false;
	bool public saleEnableBatchOne = false;
	bool public saleEnableBatchTwo = false;
	bool public breedingEnable = false;

	uint256[] public goldNFT;
	
	bytes32 public merkleRootEarlySale;
	bytes32 public merkleRootPreSale;

    string private baseURI;
	
	struct User {
	    uint256 earlySaleMint;
		uint256 preSaleMint;
		uint256 saleMintBatchOne;
		uint256 saleMintBatchTwo;
    }
	mapping (address => User) public users;
	mapping (uint256 => bool) public isGold;

    constructor() ERC721('MetaBogans', 'MB') {}
	
	
	/**************** Giveaway NFT Minting ******************************/
	function mintGiveawayNFT(address _to, uint256 _count) public onlyOwner{
        require(
            GIVEAWAY_MINTED + _count <= GIVEAWAY_NFT, 
            "max limit reached"
        );
		for (uint256 i = 0; i < _count; i++) {
		     uint256 tokenId = _randMod();
            _safeMint(_to, tokenId);
			GIVEAWAY_MINTED++;
        }
    }
	
	/**************** Reserved NFT Minting ******************************/
	function mintReservedNFT(uint256 _count) public onlyOwner{
        require(
            RESERVED_MINTED + _count <= RESERVED_NFT, 
            "max limit reached"
        );
		for (uint256 i = 0; i < _count; i++) {
		     uint256 tokenId = _randMod();
            _safeMint(msg.sender, tokenId);
			RESERVED_MINTED++;
			goldNFT.push(tokenId);
			isGold[tokenId] = true;
        }
    }
	
	/**************** Early Sale Minting ******************************/
	function mintEarlySaleNFT(uint256 _count, bytes32[] calldata merkleProof) public payable{
		bytes32 node = keccak256(abi.encodePacked(msg.sender));
		require(
			earlysaleEnable, 
			"Early sale is not enable"
		);
		require(
			EARLYSALE_MINTED + _count <= EARLYSALE_NFT, 
			"Exceeds max limit"
		);
		require(
			MerkleProof.verify(merkleProof, merkleRootEarlySale, node), 
			"MerkleDistributor: Invalid proof."
		);
		require(
			users[msg.sender].earlySaleMint + _count <= MAX_MINT_EARLYSALE,
			"Exceeds max mint limit per wallet"
		);
		require(
			_count <= MAX_BY_MINT_IN_TRANSACTION_EARLYSALE,
			"Exceeds max mint limit per tnx"
		);
		require(
			msg.value >= EARLYSALE_PRICE * _count,
			"Value below price"
		);
		for (uint256 i = 0; i < _count; i++) {
			uint256 tokenId = _randMod();
			_safeMint(msg.sender, tokenId);
			EARLYSALE_MINTED++;
			
			if(GOLD_NFT_EARLYSALE > 0)
			{
			   if((EARLYSALE_NFT - EARLYSALE_MINTED) <= GOLD_NFT_EARLYSALE)
			   {
			       goldNFT.push(tokenId);
				   GOLD_NFT_EARLYSALE--;
				   isGold[tokenId] = true;
			   }
			   else
			   {
			      uint256 goldNumber = pickgold(i);
			      if(goldNumber==1 || goldNumber==10 || goldNumber==15)
				  {
				      goldNFT.push(tokenId);
					  GOLD_NFT_EARLYSALE--;
					  isGold[tokenId] = true;
				  }
			   }
			}
		}
		users[msg.sender].earlySaleMint +=  _count;
	}
	
	/**************** Pre-Sale Minting ******************************/
	function mintPreSaleNFT(uint256 _count, bytes32[] calldata merkleProof) public payable{
		bytes32 node = keccak256(abi.encodePacked(msg.sender));
		require(
			presaleEnable, 
			"Pre-sale is not enable"
		);
		require(
			PRESALE_MINTED + _count <= PRESALE_NFT, 
			"Exceeds max limit"
		);
		require(
			MerkleProof.verify(merkleProof, merkleRootPreSale, node), 
			"MerkleDistributor: Invalid proof."
		);
		require(
			users[msg.sender].preSaleMint + _count <= MAX_MINT_PRESALE,
			"Exceeds max mint limit per wallet"
		);
		require(
			_count <= MAX_BY_MINT_IN_TRANSACTION_PRESALE,
			"Exceeds max mint limit per tnx"
		);
		require(
			msg.value >= PRESALE_PRICE * _count,
			"Value below price"
		);
		for (uint256 i = 0; i < _count; i++) {
			uint256 tokenId = _randMod();
			_safeMint(msg.sender, tokenId);
			PRESALE_MINTED++;
			
			if(GOLD_NFT_PRESALE > 0)
			{
			   if((PRESALE_NFT - PRESALE_MINTED) <= GOLD_NFT_PRESALE)
			   {
			       goldNFT.push(tokenId);
				   GOLD_NFT_PRESALE--;
				   isGold[tokenId] = true;
			   }
			   else
			   {
			      uint256 goldNumber = pickgold(i);
			      if(goldNumber==14)
				  {
				      goldNFT.push(tokenId);
					  GOLD_NFT_PRESALE--;
					  isGold[tokenId] = true;
				  }
			   }
			}
			
		}
		users[msg.sender].preSaleMint += _count;
	}
	
	/**************** Sale Minting Batch One******************************/
	function mintSaleNFTBatchOne(uint256 _count) public payable{
		require(
			saleEnableBatchOne, 
			"Sale is not enable"
		);
		require(
			SALE_MINTED_BATCH_ONE + _count <= SALE_NFT_BATCH_ONE, 
			"Exceeds max limit"
		);
		require(
			users[msg.sender].saleMintBatchOne + _count <= MAX_MINT_SALE_BATCH_ONE,
			"Exceeds max mint limit per wallet"
		);
		require(
			_count <= MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_ONE,
			"Exceeds max mint limit per tnx"
		);
		require(
			msg.value >= SALE_PRICE_BATCH_ONE * _count,
			"Value below price"
		);
		for (uint256 i = 0; i < _count; i++) {
			uint256 tokenId = _randMod();
			_safeMint(msg.sender, tokenId);
			SALE_MINTED_BATCH_ONE++;
			
			if(GOLD_NFT_SALE_BATCH_ONE > 0)
			{
			   if((SALE_NFT_BATCH_ONE - SALE_MINTED_BATCH_ONE) <= GOLD_NFT_SALE_BATCH_ONE)
			   {
			       goldNFT.push(tokenId);
				   GOLD_NFT_SALE_BATCH_ONE--;
				   isGold[tokenId] = true;
			   }
			   else
			   {
			      uint256 goldNumber = pickgold(i);
			      if(goldNumber==10)
				  {
				      goldNFT.push(tokenId);
					  GOLD_NFT_SALE_BATCH_ONE--;
					  isGold[tokenId] = true;
				  }
			   }
			}
		}
		users[msg.sender].saleMintBatchOne += _count;
	}
	
	/**************** Sale Minting Batch Two ******************************/
	function mintSaleNFTBatchTwo(uint256 _count) public payable {
		require(
			saleEnableBatchTwo, 
			"Sale is not enable"
		);
		require(
			SALE_MINTED_BATCH_TWO + _count <= SALE_NFT_BATCH_TWO, 
			"Exceeds max limit"
		);
		require(
			users[msg.sender].saleMintBatchTwo + _count <= MAX_MINT_SALE_BATCH_TWO,
			"Exceeds max mint limit per wallet"
		);
		require(
			_count <= MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_TWO,
			"Exceeds max mint limit per tnx"
		);
		require(
			msg.value >= SALE_PRICE_BATCH_TWO * _count,
			"Value below price"
		);
		
		for (uint256 i = 0; i < _count; i++) {
			uint256 tokenId = _randMod();
			_safeMint(msg.sender, tokenId);
			SALE_MINTED_BATCH_TWO++;
			
			if(GOLD_NFT_SALE_BATCH_TWO > 0)
			{
			   if((SALE_NFT_BATCH_TWO - SALE_MINTED_BATCH_TWO) <= GOLD_NFT_SALE_BATCH_TWO)
			   {
			       goldNFT.push(tokenId);
				   GOLD_NFT_SALE_BATCH_TWO--;
				   isGold[tokenId] = true;
			   }
			   else
			   {
			      uint256 goldNumber = pickgold(i);
			      if(goldNumber==1)
				  {
				      goldNFT.push(tokenId);
					  GOLD_NFT_SALE_BATCH_TWO--;
					  isGold[tokenId] = true;
				  }
			   }
			}
		}
		users[msg.sender].saleMintBatchTwo += _count;
	}
	
	/**************** Breeding Minting ******************************/
	function mintBreedingNFT(uint256 NFTOne, uint256 NFTTwo, uint256 NFTThree) public{
	    require(
			breedingEnable, 
			"Breeding is not enable"
		);
		require(
			!isGold[NFTOne] && !isGold[NFTTwo] && !isGold[NFTThree], 
			"Gold NFT can't Burn"
		);
		require(
			ownerOf(NFTOne) == msg.sender && ownerOf(NFTTwo) == msg.sender && ownerOf(NFTThree) == msg.sender, 
			"Invalid NFT"
		);
		
		_burn(NFTOne);
		_burn(NFTTwo);
		_burn(NFTThree);
		
		uint256 tokenId = _randMod();
		_safeMint(msg.sender, tokenId);
		
		 goldNFT.push(tokenId);
	    isGold[tokenId] = true;
	}
	
	function pickgold(uint256 loopNumber) public view returns (uint256) {
	   return uint256(uint256(keccak256(abi.encodePacked(loopNumber, block.timestamp, block.difficulty)))%20);
	}
	
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable){
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(baseURI, _tokenId.toString(), ".json"));
    }
	
    function setURI(string memory _URI) external onlyOwner {
        baseURI = _URI;
    }
	
	function withdraw() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
	
	function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
    }
	
	function updatePrice(uint256 earlySalePrice, uint256 preSalePrice, uint256 salePriceBatchOne, uint256 salePriceBatchTwo) external onlyOwner {
        EARLYSALE_PRICE = earlySalePrice;
		PRESALE_PRICE = preSalePrice;
		SALE_PRICE_BATCH_ONE = salePriceBatchOne;
		SALE_PRICE_BATCH_TWO = salePriceBatchTwo;
    }
	
	function setEarlySaleStatus(bool status) public onlyOwner {
        require(earlysaleEnable != status);
		earlysaleEnable = status;
    }
	
	function setPreSaleStatus(bool status) public onlyOwner {
	   require(presaleEnable != status);
       presaleEnable = status;
    }
	
	function setSaleStatusBatchOne(bool status) public onlyOwner {
	   require(saleEnableBatchOne != status);
       saleEnableBatchOne = status;
    }
	
	function setSaleStatusBatchTwo(bool status) public onlyOwner {
	   require(saleEnableBatchTwo != status);
       saleEnableBatchTwo = status;
    }
	
	function setBreedingStatus(bool status) public onlyOwner {
	   require(breedingEnable != status);
       breedingEnable = status;
    }
	
	function updateMintLimit(uint256 maxMintEarlySale, uint256 maxMintPreSale, uint256 maxMintSaleBatchOne, uint256 maxMintSaleBatchTwo) external onlyOwner {
        MAX_MINT_EARLYSALE = maxMintEarlySale;
		MAX_MINT_PRESALE = maxMintPreSale;
		MAX_MINT_SALE_BATCH_ONE = maxMintSaleBatchOne;
		MAX_MINT_SALE_BATCH_TWO = maxMintSaleBatchTwo;
    }
	
	function updateMintLimitPerTransection(uint256 mintPerTransectionEarlySale, uint256 mintPerTransectionPreSale, uint256 mintPerTransectionSaleBatchOne, uint256 mintPerTransectionSaleBatchTwo) external onlyOwner {
        MAX_BY_MINT_IN_TRANSACTION_EARLYSALE = mintPerTransectionEarlySale;
		MAX_BY_MINT_IN_TRANSACTION_PRESALE = mintPerTransectionPreSale;
		MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_ONE = mintPerTransectionSaleBatchOne;
		MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_TWO = mintPerTransectionSaleBatchTwo;
    }
	
	function updateMerkleRootEarlySale(bytes32 newRoot) external onlyOwner {
	   merkleRootEarlySale = newRoot;
	}
	
	function updateMerkleRootPreSale(bytes32 newRoot) external onlyOwner {
	   merkleRootPreSale = newRoot;
	}
	
	function updateGoldSupply(uint256 EarlySaleSupply, uint256 PreSaleSupply, uint256 SaleBatchOneSupply, uint256 SaleBatchTwoSupply) external onlyOwner {
        require(EarlySaleSupply + PreSaleSupply + SaleBatchOneSupply + SaleBatchTwoSupply == 4800);
		
		EARLYSALE_NFT = EarlySaleSupply;
		PRESALE_NFT = PreSaleSupply;
		SALE_NFT_BATCH_ONE = SaleBatchOneSupply;
		SALE_NFT_BATCH_TWO = SaleBatchTwoSupply;
    }
	
	function updateMintSupply(uint256 EarlySaleGoldSupply, uint256 PreSaleGoldSupply, uint256 SaleBatchOneGoldSupply, uint256 SaleBatchTwoGoldSupply) external onlyOwner {
        require(EarlySaleGoldSupply + PreSaleGoldSupply + SaleBatchOneGoldSupply + SaleBatchTwoGoldSupply == 100);
		
		GOLD_NFT_EARLYSALE = EarlySaleGoldSupply;
		GOLD_NFT_PRESALE = PreSaleGoldSupply;
		GOLD_NFT_SALE_BATCH_ONE = SaleBatchOneGoldSupply;
		GOLD_NFT_SALE_BATCH_TWO = SaleBatchTwoGoldSupply;
    }
	
    uint256 constant private MAX_NFT = 6600;
	uint[MAX_NFT] public indices;
    uint nonce;
	
    function _randMod() private returns (uint) {
        uint totalSize = MAX_NFT - nonce;
        uint index = uint(keccak256(abi.encodePacked(nonce, msg.sender, block.difficulty, block.timestamp))) % totalSize;
        uint value = 0;
        if (indices[index] != 0) {
            value = indices[index];
        } else {
            value = index;
        }
 
        if (indices[totalSize - 1] == 0) {
            indices[index] = totalSize - 1;
        } else {
            indices[index] = indices[totalSize - 1];
        }
        nonce++;
        return value+1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BREEDING_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLYSALE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLYSALE_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EARLYSALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GIVEAWAY_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GIVEAWAY_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_NFT_EARLYSALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_NFT_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_NFT_SALE_BATCH_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOLD_NFT_SALE_BATCH_TWO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT_IN_TRANSACTION_EARLYSALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT_IN_TRANSACTION_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BY_MINT_IN_TRANSACTION_SALE_BATCH_TWO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_EARLYSALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_SALE_BATCH_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_SALE_BATCH_TWO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_MINTED_BATCH_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_MINTED_BATCH_TWO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_NFT_BATCH_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_NFT_BATCH_TWO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE_BATCH_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PRICE_BATCH_TWO","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":"breedingEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlysaleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"","type":"uint256"}],"name":"goldNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"indices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"uint256"}],"name":"isGold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootEarlySale","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootPreSale","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"NFTOne","type":"uint256"},{"internalType":"uint256","name":"NFTTwo","type":"uint256"},{"internalType":"uint256","name":"NFTThree","type":"uint256"}],"name":"mintBreedingNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintEarlySaleNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintGiveawayNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintPreSaleNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintReservedNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintSaleNFTBatchOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintSaleNFTBatchTwo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"loopNumber","type":"uint256"}],"name":"pickgold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleEnableBatchOne","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleEnableBatchTwo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setBreedingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setEarlySaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPreSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSaleStatusBatchOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSaleStatusBatchTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"EarlySaleSupply","type":"uint256"},{"internalType":"uint256","name":"PreSaleSupply","type":"uint256"},{"internalType":"uint256","name":"SaleBatchOneSupply","type":"uint256"},{"internalType":"uint256","name":"SaleBatchTwoSupply","type":"uint256"}],"name":"updateGoldSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"updateMerkleRootEarlySale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"updateMerkleRootPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintEarlySale","type":"uint256"},{"internalType":"uint256","name":"maxMintPreSale","type":"uint256"},{"internalType":"uint256","name":"maxMintSaleBatchOne","type":"uint256"},{"internalType":"uint256","name":"maxMintSaleBatchTwo","type":"uint256"}],"name":"updateMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPerTransectionEarlySale","type":"uint256"},{"internalType":"uint256","name":"mintPerTransectionPreSale","type":"uint256"},{"internalType":"uint256","name":"mintPerTransectionSaleBatchOne","type":"uint256"},{"internalType":"uint256","name":"mintPerTransectionSaleBatchTwo","type":"uint256"}],"name":"updateMintLimitPerTransection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"EarlySaleGoldSupply","type":"uint256"},{"internalType":"uint256","name":"PreSaleGoldSupply","type":"uint256"},{"internalType":"uint256","name":"SaleBatchOneGoldSupply","type":"uint256"},{"internalType":"uint256","name":"SaleBatchTwoGoldSupply","type":"uint256"}],"name":"updateMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"earlySalePrice","type":"uint256"},{"internalType":"uint256","name":"preSalePrice","type":"uint256"},{"internalType":"uint256","name":"salePriceBatchOne","type":"uint256"},{"internalType":"uint256","name":"salePriceBatchTwo","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"earlySaleMint","type":"uint256"},{"internalType":"uint256","name":"preSaleMint","type":"uint256"},{"internalType":"uint256","name":"saleMintBatchOne","type":"uint256"},{"internalType":"uint256","name":"saleMintBatchTwo","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526064600c819055600d55610258600e55610578600f819055601081905560115561064060125560196013819055601481905560158190556016819055600360178190556002601881905591819055601a819055601b819055601c91909155601d819055601e5567016345785d8a0000601f556701aa535d3d0c00006020556701cdda4faccd0000602155670214e8348c4f00006022556029805464ffffffffff19169055348015620000b557600080fd5b50604080518082018252600a8152694d657461426f67616e7360b01b60208083019182528351808501909452600284526126a160f11b908401528151919291620001029160009162000196565b5080516200011890600190602084019062000196565b505050620001356200012f6200014060201b60201c565b62000144565b6001600b5562000279565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a4906200023c565b90600052602060002090601f016020900481019282620001c8576000855562000213565b82601f10620001e357805160ff191683800117855562000213565b8280016001018555821562000213579182015b8281111562000213578251825591602001919060010190620001f6565b506200022192915062000225565b5090565b5b8082111562000221576000815560010162000226565b600181811c908216806200025157607f821691505b602082108114156200027357634e487b7160e01b600052602260045260246000fd5b50919050565b613e4080620002896000396000f3fe6080604052600436106104895760003560e01c806395d89b4111610255578063c815b64a11610144578063d7ff3a90116100c1578063e985e9c511610085578063e985e9c514610d0b578063f246d70f14610d54578063f2fde38b14610d6a578063f6a2ca8814610d8a578063f921d83f14610da0578063fc922db814610db657600080fd5b8063d7ff3a9014610c87578063d8dcd0d814610c9d578063dbd5dd1214610cbf578063dce051cc14610cd5578063e60400b414610cf557600080fd5b8063d1b76b3d11610108578063d1b76b3d14610c05578063d1d95daf14610c1b578063d4bba0e914610c31578063d4e80f9814610c47578063d701623214610c6757600080fd5b8063c815b64a14610b83578063c87b56dd14610ba3578063caa5330d14610bc3578063ccb2ffce14610bd9578063ccfb63a414610bef57600080fd5b8063a5e634bd116101d2578063b7d0ef1211610196578063b7d0ef1214610af2578063b88d4fde14610b08578063bb6eb17914610b28578063c26f325b14610b49578063c2995c3b14610b6957600080fd5b8063a5e634bd14610a2e578063a87430ba14610a44578063aa294db614610aa6578063b0e1545a14610abc578063b1eb88fc14610ad257600080fd5b80639c17eff4116102195780639c17eff4146109a25780639fa63c93146109c2578063a1a953fd146109d8578063a22cb465146109f8578063a384491614610a1857600080fd5b806395d89b411461092e5780639615d548146109435780639646586d1461095957806399eaab461461096c5780639b6613941461098257600080fd5b80634d7dcde31161037c57806370a08231116102f9578063860743cb116102bd578063860743cb146108875780638da5cb5b146108a75780638f7c0cff146108c557806391a1e6a6146108db578063944c21ec146108fb578063945242c61461091b57600080fd5b806370a08231146107fd578063715018a61461081d5780637e95eac4146108325780637ec18cf61461084857806382a0e4191461086757600080fd5b80635c98cfc1116103405780635c98cfc1146107745780635e326b921461078757806362dc6e21146107a75780636352211e146107bd5780636517d08b146107dd57600080fd5b80634d7dcde3146107085780634f6ccce71461071e578063510127aa1461073e57806355f804b3146104c35780635ac8cd3d1461075e57600080fd5b806318160ddd1161040a5780633ccfd60b116103ce5780633ccfd60b1461067757806342842e0e1461068c5780634878f78f146106ac578063497865b3146106dc5780634d7cea16146106f257600080fd5b806318160ddd146105e257806323b872dd146105f75780632f745c59146106175780633262f1d3146106375780633b9920511461065757600080fd5b8063093fda0711610451578063093fda0714610563578063095ea7b3146105795780630f02c339146105995780630f8312f5146105ac5780631786e067146105cc57600080fd5b806301ffc9a71461048e57806302fe5305146104c357806304576656146104e557806306fdde0314610509578063081812fc1461052b575b600080fd5b34801561049a57600080fd5b506104ae6104a93660046137bd565b610dcc565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104e36104de3660046137f7565b610ddd565b005b3480156104f157600080fd5b506104fb60105481565b6040519081526020016104ba565b34801561051557600080fd5b5061051e610e27565b6040516104ba9190613a5d565b34801561053757600080fd5b5061054b6105463660046137a4565b610eb9565b6040516001600160a01b0390911681526020016104ba565b34801561056f57600080fd5b506104fb60155481565b34801561058557600080fd5b506104e361059436600461375f565b610f4e565b6104e36105a73660046137a4565b611064565b3480156105b857600080fd5b506104e36105c73660046138eb565b6112bc565b3480156105d857600080fd5b506104fb601f5481565b3480156105ee57600080fd5b506009546104fb565b34801561060357600080fd5b506104e361061236600461367d565b6112fa565b34801561062357600080fd5b506104fb61063236600461375f565b61132b565b34801561064357600080fd5b506104fb6106523660046137a4565b6113c1565b34801561066357600080fd5b506104e36106723660046137a4565b611406565b34801561068357600080fd5b506104e3611435565b34801561069857600080fd5b506104e36106a736600461367d565b611485565b3480156106b857600080fd5b506104ae6106c73660046137a4565b602f6020526000908152604090205460ff1681565b3480156106e857600080fd5b506104fb600c5481565b3480156106fe57600080fd5b506104fb60235481565b34801561071457600080fd5b506104fb60285481565b34801561072a57600080fd5b506104fb6107393660046137a4565b6114a0565b34801561074a57600080fd5b506104e36107593660046138eb565b611533565b34801561076a57600080fd5b506104fb602b5481565b6104e36107823660046137a4565b611571565b34801561079357600080fd5b506104e36107a2366004613789565b6117c2565b3480156107b357600080fd5b506104fb60205481565b3480156107c957600080fd5b5061054b6107d83660046137a4565b611822565b3480156107e957600080fd5b506104e36107f83660046138eb565b611899565b34801561080957600080fd5b506104fb610818366004613628565b611903565b34801561082957600080fd5b506104e361198a565b34801561083e57600080fd5b506104fb60185481565b34801561085457600080fd5b506029546104ae90610100900460ff1681565b34801561087357600080fd5b506104e36108823660046138eb565b6119be565b34801561089357600080fd5b506104e36108a2366004613789565b611a29565b3480156108b357600080fd5b506006546001600160a01b031661054b565b3480156108d157600080fd5b506104fb60275481565b3480156108e757600080fd5b506104e36108f63660046138bf565b611a8f565b34801561090757600080fd5b506104e3610916366004613789565b611c62565b6104e3610929366004613840565b611ccb565b34801561093a57600080fd5b5061051e611fb8565b34801561094f57600080fd5b506104fb60135481565b6104e3610967366004613840565b611fc7565b34801561097857600080fd5b506104fb601d5481565b34801561098e57600080fd5b506104e361099d366004613789565b6122bb565b3480156109ae57600080fd5b506104e36109bd3660046137a4565b61230e565b3480156109ce57600080fd5b506104fb60215481565b3480156109e457600080fd5b506104fb6109f33660046137a4565b61233d565b348015610a0457600080fd5b506104e3610a13366004613735565b612355565b348015610a2457600080fd5b506104fb600f5481565b348015610a3a57600080fd5b506104fb601a5481565b348015610a5057600080fd5b50610a86610a5f366004613628565b602e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016104ba565b348015610ab257600080fd5b506104fb60125481565b348015610ac857600080fd5b506104fb60175481565b348015610ade57600080fd5b506104e3610aed366004613789565b612360565b348015610afe57600080fd5b506104fb60115481565b348015610b1457600080fd5b506104e3610b233660046136b9565b6123c3565b348015610b3457600080fd5b506029546104ae906301000000900460ff1681565b348015610b5557600080fd5b506104fb610b643660046137a4565b6123fb565b348015610b7557600080fd5b506029546104ae9060ff1681565b348015610b8f57600080fd5b506029546104ae9062010000900460ff1681565b348015610baf57600080fd5b5061051e610bbe3660046137a4565b61241c565b348015610bcf57600080fd5b506104fb602c5481565b348015610be557600080fd5b506104fb60225481565b348015610bfb57600080fd5b506104fb601c5481565b348015610c1157600080fd5b506104fb60145481565b348015610c2757600080fd5b506104fb601e5481565b348015610c3d57600080fd5b506104fb600d5481565b348015610c5357600080fd5b506104e3610c623660046138eb565b6124cd565b348015610c7357600080fd5b506104e3610c823660046137a4565b61250b565b348015610c9357600080fd5b506104fb601b5481565b348015610ca957600080fd5b506029546104ae90640100000000900460ff1681565b348015610ccb57600080fd5b506104fb60165481565b348015610ce157600080fd5b506104e3610cf036600461375f565b612609565b348015610d0157600080fd5b506104fb60265481565b348015610d1757600080fd5b506104ae610d2636600461364a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610d6057600080fd5b506104fb60255481565b348015610d7657600080fd5b506104e3610d85366004613628565b6126d0565b348015610d9657600080fd5b506104fb600e5481565b348015610dac57600080fd5b506104fb60245481565b348015610dc257600080fd5b506104fb60195481565b6000610dd78261276b565b92915050565b6006546001600160a01b03163314610e105760405162461bcd60e51b8152600401610e0790613b65565b60405180910390fd5b8051610e2390602d9060208401906134ed565b5050565b606060008054610e3690613cfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6290613cfc565b8015610eaf5780601f10610e8457610100808354040283529160200191610eaf565b820191906000526020600020905b815481529060010190602001808311610e9257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610f325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e07565b506000908152600460205260409020546001600160a01b031690565b6000610f5982611822565b9050806001600160a01b0316836001600160a01b03161415610fc75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e07565b336001600160a01b0382161480610fe35750610fe38133610d26565b6110555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e07565b61105f8383612790565b505050565b60295462010000900460ff166110b15760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f7420656e61626c6560701b6044820152606401610e07565b601054816027546110c29190613c57565b11156110e05760405162461bcd60e51b8152600401610e0790613b3a565b601954336000908152602e6020526040902060020154611101908390613c57565b111561111f5760405162461bcd60e51b8152600401610e0790613c16565b601d548111156111415760405162461bcd60e51b8152600401610e0790613b03565b8060215461114f9190613c83565b34101561116e5760405162461bcd60e51b8152600401610e0790613b9a565b60005b818110156112915760006111836127fe565b905061118f3382612958565b6027805490600061119f83613d37565b90915550506015541561127e576015546027546010546111bf9190613ca2565b1161121757602a80546001810182556000918252600080516020613deb8339815191520182905560158054916111f483613ce5565b90915550506000818152602f60205260409020805460ff1916600117905561127e565b6000611222836113c1565b905080600a141561127c57602a80546001810182556000918252600080516020613deb83398151915201839055601580549161125d83613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b508061128981613d37565b915050611171565b50336000908152602e6020526040812060020180548392906112b4908490613c57565b909155505050565b6006546001600160a01b031633146112e65760405162461bcd60e51b8152600401610e0790613b65565b601793909355601891909155601955601a55565b6113043382612972565b6113205760405162461bcd60e51b8152600401610e0790613bc5565b61105f838383612a69565b600061133683611903565b82106113985760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e07565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b604080516020810183905242918101919091524460608201526000906014906080016040516020818303038152906040528051906020012060001c610dd79190613d52565b6006546001600160a01b031633146114305760405162461bcd60e51b8152600401610e0790613b65565b602b55565b6006546001600160a01b0316331461145f5760405162461bcd60e51b8152600401610e0790613b65565b60405133904780156108fc02916000818181858888f1935050505061148357600080fd5b565b61105f838383604051806020016040528060008152506123c3565b60006114ab60095490565b821061150e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e07565b6009828154811061152157611521613da8565b90600052602060002001549050919050565b6006546001600160a01b0316331461155d5760405162461bcd60e51b8152600401610e0790613b65565b601b93909355601c91909155601d55601e55565b6029546301000000900460ff166115bf5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f7420656e61626c6560701b6044820152606401610e07565b601154816028546115d09190613c57565b11156115ee5760405162461bcd60e51b8152600401610e0790613b3a565b601a54336000908152602e602052604090206003015461160f908390613c57565b111561162d5760405162461bcd60e51b8152600401610e0790613c16565b601e5481111561164f5760405162461bcd60e51b8152600401610e0790613b03565b8060225461165d9190613c83565b34101561167c5760405162461bcd60e51b8152600401610e0790613b9a565b60005b8181101561179f5760006116916127fe565b905061169d3382612958565b602880549060006116ad83613d37565b90915550506016541561178c576016546028546011546116cd9190613ca2565b1161172557602a80546001810182556000918252600080516020613deb83398151915201829055601680549161170283613ce5565b90915550506000818152602f60205260409020805460ff1916600117905561178c565b6000611730836113c1565b9050806001141561178a57602a80546001810182556000918252600080516020613deb83398151915201839055601680549161176b83613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b508061179781613d37565b91505061167f565b50336000908152602e6020526040812060030180548392906112b4908490613c57565b6006546001600160a01b031633146117ec5760405162461bcd60e51b8152600401610e0790613b65565b60295460ff610100909104161515811515141561180857600080fd5b602980549115156101000261ff0019909216919091179055565b6000818152600260205260408120546001600160a01b031680610dd75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610e07565b6006546001600160a01b031633146118c35760405162461bcd60e51b8152600401610e0790613b65565b80826118cf8587613c57565b6118d99190613c57565b6118e39190613c57565b6064146118ef57600080fd5b601393909355601491909155601555601655565b60006001600160a01b03821661196e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610e07565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119b45760405162461bcd60e51b8152600401610e0790613b65565b6114836000612c14565b6006546001600160a01b031633146119e85760405162461bcd60e51b8152600401610e0790613b65565b80826119f48587613c57565b6119fe9190613c57565b611a089190613c57565b6112c014611a1557600080fd5b600e93909355600f91909155601055601155565b6006546001600160a01b03163314611a535760405162461bcd60e51b8152600401610e0790613b65565b60295460ff63010000009091041615158115151415611a7157600080fd5b6029805491151563010000000263ff00000019909216919091179055565b602954640100000000900460ff16611ae25760405162461bcd60e51b81526020600482015260166024820152754272656564696e67206973206e6f7420656e61626c6560501b6044820152606401610e07565b6000838152602f602052604090205460ff16158015611b1057506000828152602f602052604090205460ff16155b8015611b2b57506000818152602f602052604090205460ff16155b611b6d5760405162461bcd60e51b815260206004820152601360248201527223b7b6321027232a1031b0b713ba10213ab93760691b6044820152606401610e07565b33611b7784611822565b6001600160a01b0316148015611b9d575033611b9283611822565b6001600160a01b0316145b8015611bb9575033611bae82611822565b6001600160a01b0316145b611bf35760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610e07565b611bfc83612c66565b611c0582612c66565b611c0e81612c66565b6000611c186127fe565b9050611c243382612958565b602a80546001818101909255600080516020613deb833981519152018290556000918252602f6020526040909120805460ff19169091179055505050565b6006546001600160a01b03163314611c8c5760405162461bcd60e51b8152600401610e0790613b65565b60295460ff6401000000009091041615158115151415611cab57600080fd5b602980549115156401000000000264ff0000000019909216919091179055565b604080516001600160601b03193360601b166020808301919091528251808303601401815260349092019092528051910120602954610100900460ff16611d4d5760405162461bcd60e51b81526020600482015260166024820152755072652d73616c65206973206e6f7420656e61626c6560501b6044820152606401610e07565b600f5484602654611d5e9190613c57565b1115611d7c5760405162461bcd60e51b8152600401610e0790613b3a565b611dbd83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050602c549150849050612d0d565b611dd95760405162461bcd60e51b8152600401610e0790613ac2565b601854336000908152602e6020526040902060010154611dfa908690613c57565b1115611e185760405162461bcd60e51b8152600401610e0790613c16565b601c54841115611e3a5760405162461bcd60e51b8152600401610e0790613b03565b83602054611e489190613c83565b341015611e675760405162461bcd60e51b8152600401610e0790613b9a565b60005b84811015611f8a576000611e7c6127fe565b9050611e883382612958565b60268054906000611e9883613d37565b909155505060145415611f7757601454602654600f54611eb89190613ca2565b11611f1057602a80546001810182556000918252600080516020613deb833981519152018290556014805491611eed83613ce5565b90915550506000818152602f60205260409020805460ff19166001179055611f77565b6000611f1b836113c1565b905080600e1415611f7557602a80546001810182556000918252600080516020613deb833981519152018390556014805491611f5683613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b5080611f8281613d37565b915050611e6a565b50336000908152602e602052604081206001018054869290611fad908490613c57565b909155505050505050565b606060018054610e3690613cfc565b604080513360601b6001600160601b031916602080830191909152825160148184030181526034909201909252805191012060295460ff1661204b5760405162461bcd60e51b815260206004820152601860248201527f4561726c792073616c65206973206e6f7420656e61626c6500000000000000006044820152606401610e07565b600e548460255461205c9190613c57565b111561207a5760405162461bcd60e51b8152600401610e0790613b3a565b6120bb83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050602b549150849050612d0d565b6120d75760405162461bcd60e51b8152600401610e0790613ac2565b601754336000908152602e60205260409020546120f5908690613c57565b11156121135760405162461bcd60e51b8152600401610e0790613c16565b601b548411156121355760405162461bcd60e51b8152600401610e0790613b03565b83601f546121439190613c83565b3410156121625760405162461bcd60e51b8152600401610e0790613b9a565b60005b8481101561229b5760006121776127fe565b90506121833382612958565b6025805490600061219383613d37565b90915550506013541561228857601354602554600e546121b39190613ca2565b1161220b57602a80546001810182556000918252600080516020613deb8339815191520182905560138054916121e883613ce5565b90915550506000818152602f60205260409020805460ff19166001179055612288565b6000612216836113c1565b90508060011480612227575080600a145b80612232575080600f145b1561228657602a80546001810182556000918252600080516020613deb83398151915201839055601380549161226783613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b508061229381613d37565b915050612165565b50336000908152602e602052604081208054869290611fad908490613c57565b6006546001600160a01b031633146122e55760405162461bcd60e51b8152600401610e0790613b65565b60295460ff16151581151514156122fb57600080fd5b6029805460ff1916911515919091179055565b6006546001600160a01b031633146123385760405162461bcd60e51b8152600401610e0790613b65565b602c55565b6030816119c8811061234e57600080fd5b0154905081565b610e23338383612dbc565b6006546001600160a01b0316331461238a5760405162461bcd60e51b8152600401610e0790613b65565b60295460ff6201000090910416151581151514156123a757600080fd5b60298054911515620100000262ff000019909216919091179055565b6123cd3383612972565b6123e95760405162461bcd60e51b8152600401610e0790613bc5565b6123f584848484612e8b565b50505050565b602a818154811061240b57600080fd5b600091825260209091200154905081565b6000818152600260205260409020546060906001600160a01b031661249b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e07565b602d6124a683612ebe565b6040516020016124b7929190613965565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146124f75760405162461bcd60e51b8152600401610e0790613b65565b601f93909355602091909155602155602255565b6006546001600160a01b031633146125355760405162461bcd60e51b8152600401610e0790613b65565b600d54816024546125469190613c57565b11156125885760405162461bcd60e51b81526020600482015260116024820152701b585e081b1a5b5a5d081c995858da1959607a1b6044820152606401610e07565b60005b81811015610e2357600061259d6127fe565b90506125a93382612958565b602480549060006125b983613d37565b9091555050602a80546001818101909255600080516020613deb833981519152018290556000918252602f6020526040909120805460ff191690911790558061260181613d37565b91505061258b565b6006546001600160a01b031633146126335760405162461bcd60e51b8152600401610e0790613b65565b600c54816023546126449190613c57565b11156126865760405162461bcd60e51b81526020600482015260116024820152701b585e081b1a5b5a5d081c995858da1959607a1b6044820152606401610e07565b60005b8181101561105f57600061269b6127fe565b90506126a78482612958565b602380549060006126b783613d37565b91905055505080806126c890613d37565b915050612689565b6006546001600160a01b031633146126fa5760405162461bcd60e51b8152600401610e0790613b65565b6001600160a01b03811661275f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e07565b61276881612c14565b50565b60006001600160e01b0319821663780e9d6360e01b1480610dd75750610dd782612fbc565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127c582611822565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806119f8546119c86128129190613ca2565b6119f8546040805160208101929092526001600160601b03193360601b169082015244605482015242607482015290915060009082906094016040516020818303038152906040528051906020012060001c61286e9190613d52565b905060006030826119c8811061288657612886613da8565b0154156128aa576030826119c881106128a1576128a1613da8565b015490506128ad565b50805b60306128ba600185613ca2565b6119c881106128cb576128cb613da8565b01546128f7576128dc600184613ca2565b6030836119c881106128f0576128f0613da8565b015561292e565b6030612904600185613ca2565b6119c8811061291557612915613da8565b01546030836119c8811061292b5761292b613da8565b01555b6119f8805490600061293f83613d37565b909155506129509050816001613c57565b935050505090565b610e2382826040518060200160405280600081525061300c565b6000818152600260205260408120546001600160a01b03166129eb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e07565b60006129f683611822565b9050806001600160a01b0316846001600160a01b03161480612a315750836001600160a01b0316612a2684610eb9565b6001600160a01b0316145b80612a6157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612a7c82611822565b6001600160a01b031614612ae45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e07565b6001600160a01b038216612b465760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e07565b612b5183838361303f565b612b5c600082612790565b6001600160a01b0383166000908152600360205260408120805460019290612b85908490613ca2565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bb3908490613c57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612c7182611822565b9050612c7f8160008461303f565b612c8a600083612790565b6001600160a01b0381166000908152600360205260408120805460019290612cb3908490613ca2565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815b8551811015612db1576000868281518110612d2f57612d2f613da8565b60200260200101519050808311612d71576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612d9e565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612da981613d37565b915050612d12565b509092149392505050565b816001600160a01b0316836001600160a01b03161415612e1e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e07565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612e96848484612a69565b612ea28484848461304a565b6123f55760405162461bcd60e51b8152600401610e0790613a70565b606081612ee25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f0c5780612ef681613d37565b9150612f059050600a83613c6f565b9150612ee6565b60008167ffffffffffffffff811115612f2757612f27613dbe565b6040519080825280601f01601f191660200182016040528015612f51576020820181803683370190505b5090505b8415612a6157612f66600183613ca2565b9150612f73600a86613d52565b612f7e906030613c57565b60f81b818381518110612f9357612f93613da8565b60200101906001600160f81b031916908160001a905350612fb5600a86613c6f565b9450612f55565b60006001600160e01b031982166380ac58cd60e01b1480612fed57506001600160e01b03198216635b5e139f60e01b145b80610dd757506301ffc9a760e01b6001600160e01b0319831614610dd7565b6130168383613157565b613023600084848461304a565b61105f5760405162461bcd60e51b8152600401610e0790613a70565b61105f8383836132a5565b60006001600160a01b0384163b1561314c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061308e903390899088908890600401613a20565b602060405180830381600087803b1580156130a857600080fd5b505af19250505080156130d8575060408051601f3d908101601f191682019092526130d5918101906137da565b60015b613132573d808015613106576040519150601f19603f3d011682016040523d82523d6000602084013e61310b565b606091505b50805161312a5760405162461bcd60e51b8152600401610e0790613a70565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a61565b506001949350505050565b6001600160a01b0382166131ad5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e07565b6000818152600260205260409020546001600160a01b0316156132125760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e07565b61321e6000838361303f565b6001600160a01b0382166000908152600360205260408120805460019290613247908490613c57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316613300576132fb81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b613323565b816001600160a01b0316836001600160a01b03161461332357613323838261335d565b6001600160a01b03821661333a5761105f816133fa565b826001600160a01b0316826001600160a01b03161461105f5761105f82826134a9565b6000600161336a84611903565b6133749190613ca2565b6000838152600860205260409020549091508082146133c7576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061340c90600190613ca2565b6000838152600a60205260408120546009805493945090928490811061343457613434613da8565b90600052602060002001549050806009838154811061345557613455613da8565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061348d5761348d613d92565b6001900381819060005260206000200160009055905550505050565b60006134b483611903565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b8280546134f990613cfc565b90600052602060002090601f01602090048101928261351b5760008555613561565b82601f1061353457805160ff1916838001178555613561565b82800160010185558215613561579182015b82811115613561578251825591602001919060010190613546565b5061356d929150613571565b5090565b5b8082111561356d5760008155600101613572565b600067ffffffffffffffff808411156135a1576135a1613dbe565b604051601f8501601f19908116603f011681019082821181831017156135c9576135c9613dbe565b816040528093508581528686860111156135e257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461361357600080fd5b919050565b8035801515811461361357600080fd5b60006020828403121561363a57600080fd5b613643826135fc565b9392505050565b6000806040838503121561365d57600080fd5b613666836135fc565b9150613674602084016135fc565b90509250929050565b60008060006060848603121561369257600080fd5b61369b846135fc565b92506136a9602085016135fc565b9150604084013590509250925092565b600080600080608085870312156136cf57600080fd5b6136d8856135fc565b93506136e6602086016135fc565b925060408501359150606085013567ffffffffffffffff81111561370957600080fd5b8501601f8101871361371a57600080fd5b61372987823560208401613586565b91505092959194509250565b6000806040838503121561374857600080fd5b613751836135fc565b915061367460208401613618565b6000806040838503121561377257600080fd5b61377b836135fc565b946020939093013593505050565b60006020828403121561379b57600080fd5b61364382613618565b6000602082840312156137b657600080fd5b5035919050565b6000602082840312156137cf57600080fd5b813561364381613dd4565b6000602082840312156137ec57600080fd5b815161364381613dd4565b60006020828403121561380957600080fd5b813567ffffffffffffffff81111561382057600080fd5b8201601f8101841361383157600080fd5b612a6184823560208401613586565b60008060006040848603121561385557600080fd5b83359250602084013567ffffffffffffffff8082111561387457600080fd5b818601915086601f83011261388857600080fd5b81358181111561389757600080fd5b8760208260051b85010111156138ac57600080fd5b6020830194508093505050509250925092565b6000806000606084860312156138d457600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561390157600080fd5b5050823594602084013594506040840135936060013592509050565b60008151808452613935816020860160208601613cb9565b601f01601f19169290920160200192915050565b6000815161395b818560208601613cb9565b9290920192915050565b600080845481600182811c91508083168061398157607f831692505b60208084108214156139a157634e487b7160e01b86526022600452602486fd5b8180156139b557600181146139c6576139f3565b60ff198616895284890196506139f3565b60008b81526020902060005b868110156139eb5781548b8201529085019083016139d2565b505084890196505b505050505050613a17613a068286613949565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a539083018461391d565b9695505050505050565b602081526000613643602083018461391d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666040820152601760f91b606082015260800190565b6020808252601e908201527f45786365656473206d6178206d696e74206c696d69742070657220746e780000604082015260600190565b602080825260119082015270115e18d959591cc81b585e081b1a5b5a5d607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526011908201527056616c75652062656c6f7720707269636560781b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f45786365656473206d6178206d696e74206c696d6974207065722077616c6c656040820152601d60fa1b606082015260800190565b60008219821115613c6a57613c6a613d66565b500190565b600082613c7e57613c7e613d7c565b500490565b6000816000190483118215151615613c9d57613c9d613d66565b500290565b600082821015613cb457613cb4613d66565b500390565b60005b83811015613cd4578181015183820152602001613cbc565b838111156123f55750506000910152565b600081613cf457613cf4613d66565b506000190190565b600181811c90821680613d1057607f821691505b60208210811415613d3157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d4b57613d4b613d66565b5060010190565b600082613d6157613d61613d7c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461276857600080fdfebeced09521047d05b8960b7e7bcc1d1292cf3e4b2a6b63f48335cbde5f7545d2a26469706673582212206f68b1a988653d2f090787d1d7963b5010c54cf5109fd19ace94e8ff25b3329b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106104895760003560e01c806395d89b4111610255578063c815b64a11610144578063d7ff3a90116100c1578063e985e9c511610085578063e985e9c514610d0b578063f246d70f14610d54578063f2fde38b14610d6a578063f6a2ca8814610d8a578063f921d83f14610da0578063fc922db814610db657600080fd5b8063d7ff3a9014610c87578063d8dcd0d814610c9d578063dbd5dd1214610cbf578063dce051cc14610cd5578063e60400b414610cf557600080fd5b8063d1b76b3d11610108578063d1b76b3d14610c05578063d1d95daf14610c1b578063d4bba0e914610c31578063d4e80f9814610c47578063d701623214610c6757600080fd5b8063c815b64a14610b83578063c87b56dd14610ba3578063caa5330d14610bc3578063ccb2ffce14610bd9578063ccfb63a414610bef57600080fd5b8063a5e634bd116101d2578063b7d0ef1211610196578063b7d0ef1214610af2578063b88d4fde14610b08578063bb6eb17914610b28578063c26f325b14610b49578063c2995c3b14610b6957600080fd5b8063a5e634bd14610a2e578063a87430ba14610a44578063aa294db614610aa6578063b0e1545a14610abc578063b1eb88fc14610ad257600080fd5b80639c17eff4116102195780639c17eff4146109a25780639fa63c93146109c2578063a1a953fd146109d8578063a22cb465146109f8578063a384491614610a1857600080fd5b806395d89b411461092e5780639615d548146109435780639646586d1461095957806399eaab461461096c5780639b6613941461098257600080fd5b80634d7dcde31161037c57806370a08231116102f9578063860743cb116102bd578063860743cb146108875780638da5cb5b146108a75780638f7c0cff146108c557806391a1e6a6146108db578063944c21ec146108fb578063945242c61461091b57600080fd5b806370a08231146107fd578063715018a61461081d5780637e95eac4146108325780637ec18cf61461084857806382a0e4191461086757600080fd5b80635c98cfc1116103405780635c98cfc1146107745780635e326b921461078757806362dc6e21146107a75780636352211e146107bd5780636517d08b146107dd57600080fd5b80634d7dcde3146107085780634f6ccce71461071e578063510127aa1461073e57806355f804b3146104c35780635ac8cd3d1461075e57600080fd5b806318160ddd1161040a5780633ccfd60b116103ce5780633ccfd60b1461067757806342842e0e1461068c5780634878f78f146106ac578063497865b3146106dc5780634d7cea16146106f257600080fd5b806318160ddd146105e257806323b872dd146105f75780632f745c59146106175780633262f1d3146106375780633b9920511461065757600080fd5b8063093fda0711610451578063093fda0714610563578063095ea7b3146105795780630f02c339146105995780630f8312f5146105ac5780631786e067146105cc57600080fd5b806301ffc9a71461048e57806302fe5305146104c357806304576656146104e557806306fdde0314610509578063081812fc1461052b575b600080fd5b34801561049a57600080fd5b506104ae6104a93660046137bd565b610dcc565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104e36104de3660046137f7565b610ddd565b005b3480156104f157600080fd5b506104fb60105481565b6040519081526020016104ba565b34801561051557600080fd5b5061051e610e27565b6040516104ba9190613a5d565b34801561053757600080fd5b5061054b6105463660046137a4565b610eb9565b6040516001600160a01b0390911681526020016104ba565b34801561056f57600080fd5b506104fb60155481565b34801561058557600080fd5b506104e361059436600461375f565b610f4e565b6104e36105a73660046137a4565b611064565b3480156105b857600080fd5b506104e36105c73660046138eb565b6112bc565b3480156105d857600080fd5b506104fb601f5481565b3480156105ee57600080fd5b506009546104fb565b34801561060357600080fd5b506104e361061236600461367d565b6112fa565b34801561062357600080fd5b506104fb61063236600461375f565b61132b565b34801561064357600080fd5b506104fb6106523660046137a4565b6113c1565b34801561066357600080fd5b506104e36106723660046137a4565b611406565b34801561068357600080fd5b506104e3611435565b34801561069857600080fd5b506104e36106a736600461367d565b611485565b3480156106b857600080fd5b506104ae6106c73660046137a4565b602f6020526000908152604090205460ff1681565b3480156106e857600080fd5b506104fb600c5481565b3480156106fe57600080fd5b506104fb60235481565b34801561071457600080fd5b506104fb60285481565b34801561072a57600080fd5b506104fb6107393660046137a4565b6114a0565b34801561074a57600080fd5b506104e36107593660046138eb565b611533565b34801561076a57600080fd5b506104fb602b5481565b6104e36107823660046137a4565b611571565b34801561079357600080fd5b506104e36107a2366004613789565b6117c2565b3480156107b357600080fd5b506104fb60205481565b3480156107c957600080fd5b5061054b6107d83660046137a4565b611822565b3480156107e957600080fd5b506104e36107f83660046138eb565b611899565b34801561080957600080fd5b506104fb610818366004613628565b611903565b34801561082957600080fd5b506104e361198a565b34801561083e57600080fd5b506104fb60185481565b34801561085457600080fd5b506029546104ae90610100900460ff1681565b34801561087357600080fd5b506104e36108823660046138eb565b6119be565b34801561089357600080fd5b506104e36108a2366004613789565b611a29565b3480156108b357600080fd5b506006546001600160a01b031661054b565b3480156108d157600080fd5b506104fb60275481565b3480156108e757600080fd5b506104e36108f63660046138bf565b611a8f565b34801561090757600080fd5b506104e3610916366004613789565b611c62565b6104e3610929366004613840565b611ccb565b34801561093a57600080fd5b5061051e611fb8565b34801561094f57600080fd5b506104fb60135481565b6104e3610967366004613840565b611fc7565b34801561097857600080fd5b506104fb601d5481565b34801561098e57600080fd5b506104e361099d366004613789565b6122bb565b3480156109ae57600080fd5b506104e36109bd3660046137a4565b61230e565b3480156109ce57600080fd5b506104fb60215481565b3480156109e457600080fd5b506104fb6109f33660046137a4565b61233d565b348015610a0457600080fd5b506104e3610a13366004613735565b612355565b348015610a2457600080fd5b506104fb600f5481565b348015610a3a57600080fd5b506104fb601a5481565b348015610a5057600080fd5b50610a86610a5f366004613628565b602e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016104ba565b348015610ab257600080fd5b506104fb60125481565b348015610ac857600080fd5b506104fb60175481565b348015610ade57600080fd5b506104e3610aed366004613789565b612360565b348015610afe57600080fd5b506104fb60115481565b348015610b1457600080fd5b506104e3610b233660046136b9565b6123c3565b348015610b3457600080fd5b506029546104ae906301000000900460ff1681565b348015610b5557600080fd5b506104fb610b643660046137a4565b6123fb565b348015610b7557600080fd5b506029546104ae9060ff1681565b348015610b8f57600080fd5b506029546104ae9062010000900460ff1681565b348015610baf57600080fd5b5061051e610bbe3660046137a4565b61241c565b348015610bcf57600080fd5b506104fb602c5481565b348015610be557600080fd5b506104fb60225481565b348015610bfb57600080fd5b506104fb601c5481565b348015610c1157600080fd5b506104fb60145481565b348015610c2757600080fd5b506104fb601e5481565b348015610c3d57600080fd5b506104fb600d5481565b348015610c5357600080fd5b506104e3610c623660046138eb565b6124cd565b348015610c7357600080fd5b506104e3610c823660046137a4565b61250b565b348015610c9357600080fd5b506104fb601b5481565b348015610ca957600080fd5b506029546104ae90640100000000900460ff1681565b348015610ccb57600080fd5b506104fb60165481565b348015610ce157600080fd5b506104e3610cf036600461375f565b612609565b348015610d0157600080fd5b506104fb60265481565b348015610d1757600080fd5b506104ae610d2636600461364a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610d6057600080fd5b506104fb60255481565b348015610d7657600080fd5b506104e3610d85366004613628565b6126d0565b348015610d9657600080fd5b506104fb600e5481565b348015610dac57600080fd5b506104fb60245481565b348015610dc257600080fd5b506104fb60195481565b6000610dd78261276b565b92915050565b6006546001600160a01b03163314610e105760405162461bcd60e51b8152600401610e0790613b65565b60405180910390fd5b8051610e2390602d9060208401906134ed565b5050565b606060008054610e3690613cfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6290613cfc565b8015610eaf5780601f10610e8457610100808354040283529160200191610eaf565b820191906000526020600020905b815481529060010190602001808311610e9257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610f325760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e07565b506000908152600460205260409020546001600160a01b031690565b6000610f5982611822565b9050806001600160a01b0316836001600160a01b03161415610fc75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610e07565b336001600160a01b0382161480610fe35750610fe38133610d26565b6110555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610e07565b61105f8383612790565b505050565b60295462010000900460ff166110b15760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f7420656e61626c6560701b6044820152606401610e07565b601054816027546110c29190613c57565b11156110e05760405162461bcd60e51b8152600401610e0790613b3a565b601954336000908152602e6020526040902060020154611101908390613c57565b111561111f5760405162461bcd60e51b8152600401610e0790613c16565b601d548111156111415760405162461bcd60e51b8152600401610e0790613b03565b8060215461114f9190613c83565b34101561116e5760405162461bcd60e51b8152600401610e0790613b9a565b60005b818110156112915760006111836127fe565b905061118f3382612958565b6027805490600061119f83613d37565b90915550506015541561127e576015546027546010546111bf9190613ca2565b1161121757602a80546001810182556000918252600080516020613deb8339815191520182905560158054916111f483613ce5565b90915550506000818152602f60205260409020805460ff1916600117905561127e565b6000611222836113c1565b905080600a141561127c57602a80546001810182556000918252600080516020613deb83398151915201839055601580549161125d83613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b508061128981613d37565b915050611171565b50336000908152602e6020526040812060020180548392906112b4908490613c57565b909155505050565b6006546001600160a01b031633146112e65760405162461bcd60e51b8152600401610e0790613b65565b601793909355601891909155601955601a55565b6113043382612972565b6113205760405162461bcd60e51b8152600401610e0790613bc5565b61105f838383612a69565b600061133683611903565b82106113985760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610e07565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b604080516020810183905242918101919091524460608201526000906014906080016040516020818303038152906040528051906020012060001c610dd79190613d52565b6006546001600160a01b031633146114305760405162461bcd60e51b8152600401610e0790613b65565b602b55565b6006546001600160a01b0316331461145f5760405162461bcd60e51b8152600401610e0790613b65565b60405133904780156108fc02916000818181858888f1935050505061148357600080fd5b565b61105f838383604051806020016040528060008152506123c3565b60006114ab60095490565b821061150e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610e07565b6009828154811061152157611521613da8565b90600052602060002001549050919050565b6006546001600160a01b0316331461155d5760405162461bcd60e51b8152600401610e0790613b65565b601b93909355601c91909155601d55601e55565b6029546301000000900460ff166115bf5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f7420656e61626c6560701b6044820152606401610e07565b601154816028546115d09190613c57565b11156115ee5760405162461bcd60e51b8152600401610e0790613b3a565b601a54336000908152602e602052604090206003015461160f908390613c57565b111561162d5760405162461bcd60e51b8152600401610e0790613c16565b601e5481111561164f5760405162461bcd60e51b8152600401610e0790613b03565b8060225461165d9190613c83565b34101561167c5760405162461bcd60e51b8152600401610e0790613b9a565b60005b8181101561179f5760006116916127fe565b905061169d3382612958565b602880549060006116ad83613d37565b90915550506016541561178c576016546028546011546116cd9190613ca2565b1161172557602a80546001810182556000918252600080516020613deb83398151915201829055601680549161170283613ce5565b90915550506000818152602f60205260409020805460ff1916600117905561178c565b6000611730836113c1565b9050806001141561178a57602a80546001810182556000918252600080516020613deb83398151915201839055601680549161176b83613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b508061179781613d37565b91505061167f565b50336000908152602e6020526040812060030180548392906112b4908490613c57565b6006546001600160a01b031633146117ec5760405162461bcd60e51b8152600401610e0790613b65565b60295460ff610100909104161515811515141561180857600080fd5b602980549115156101000261ff0019909216919091179055565b6000818152600260205260408120546001600160a01b031680610dd75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610e07565b6006546001600160a01b031633146118c35760405162461bcd60e51b8152600401610e0790613b65565b80826118cf8587613c57565b6118d99190613c57565b6118e39190613c57565b6064146118ef57600080fd5b601393909355601491909155601555601655565b60006001600160a01b03821661196e5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610e07565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119b45760405162461bcd60e51b8152600401610e0790613b65565b6114836000612c14565b6006546001600160a01b031633146119e85760405162461bcd60e51b8152600401610e0790613b65565b80826119f48587613c57565b6119fe9190613c57565b611a089190613c57565b6112c014611a1557600080fd5b600e93909355600f91909155601055601155565b6006546001600160a01b03163314611a535760405162461bcd60e51b8152600401610e0790613b65565b60295460ff63010000009091041615158115151415611a7157600080fd5b6029805491151563010000000263ff00000019909216919091179055565b602954640100000000900460ff16611ae25760405162461bcd60e51b81526020600482015260166024820152754272656564696e67206973206e6f7420656e61626c6560501b6044820152606401610e07565b6000838152602f602052604090205460ff16158015611b1057506000828152602f602052604090205460ff16155b8015611b2b57506000818152602f602052604090205460ff16155b611b6d5760405162461bcd60e51b815260206004820152601360248201527223b7b6321027232a1031b0b713ba10213ab93760691b6044820152606401610e07565b33611b7784611822565b6001600160a01b0316148015611b9d575033611b9283611822565b6001600160a01b0316145b8015611bb9575033611bae82611822565b6001600160a01b0316145b611bf35760405162461bcd60e51b815260206004820152600b60248201526a125b9d985b1a590813919560aa1b6044820152606401610e07565b611bfc83612c66565b611c0582612c66565b611c0e81612c66565b6000611c186127fe565b9050611c243382612958565b602a80546001818101909255600080516020613deb833981519152018290556000918252602f6020526040909120805460ff19169091179055505050565b6006546001600160a01b03163314611c8c5760405162461bcd60e51b8152600401610e0790613b65565b60295460ff6401000000009091041615158115151415611cab57600080fd5b602980549115156401000000000264ff0000000019909216919091179055565b604080516001600160601b03193360601b166020808301919091528251808303601401815260349092019092528051910120602954610100900460ff16611d4d5760405162461bcd60e51b81526020600482015260166024820152755072652d73616c65206973206e6f7420656e61626c6560501b6044820152606401610e07565b600f5484602654611d5e9190613c57565b1115611d7c5760405162461bcd60e51b8152600401610e0790613b3a565b611dbd83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050602c549150849050612d0d565b611dd95760405162461bcd60e51b8152600401610e0790613ac2565b601854336000908152602e6020526040902060010154611dfa908690613c57565b1115611e185760405162461bcd60e51b8152600401610e0790613c16565b601c54841115611e3a5760405162461bcd60e51b8152600401610e0790613b03565b83602054611e489190613c83565b341015611e675760405162461bcd60e51b8152600401610e0790613b9a565b60005b84811015611f8a576000611e7c6127fe565b9050611e883382612958565b60268054906000611e9883613d37565b909155505060145415611f7757601454602654600f54611eb89190613ca2565b11611f1057602a80546001810182556000918252600080516020613deb833981519152018290556014805491611eed83613ce5565b90915550506000818152602f60205260409020805460ff19166001179055611f77565b6000611f1b836113c1565b905080600e1415611f7557602a80546001810182556000918252600080516020613deb833981519152018390556014805491611f5683613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b5080611f8281613d37565b915050611e6a565b50336000908152602e602052604081206001018054869290611fad908490613c57565b909155505050505050565b606060018054610e3690613cfc565b604080513360601b6001600160601b031916602080830191909152825160148184030181526034909201909252805191012060295460ff1661204b5760405162461bcd60e51b815260206004820152601860248201527f4561726c792073616c65206973206e6f7420656e61626c6500000000000000006044820152606401610e07565b600e548460255461205c9190613c57565b111561207a5760405162461bcd60e51b8152600401610e0790613b3a565b6120bb83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050602b549150849050612d0d565b6120d75760405162461bcd60e51b8152600401610e0790613ac2565b601754336000908152602e60205260409020546120f5908690613c57565b11156121135760405162461bcd60e51b8152600401610e0790613c16565b601b548411156121355760405162461bcd60e51b8152600401610e0790613b03565b83601f546121439190613c83565b3410156121625760405162461bcd60e51b8152600401610e0790613b9a565b60005b8481101561229b5760006121776127fe565b90506121833382612958565b6025805490600061219383613d37565b90915550506013541561228857601354602554600e546121b39190613ca2565b1161220b57602a80546001810182556000918252600080516020613deb8339815191520182905560138054916121e883613ce5565b90915550506000818152602f60205260409020805460ff19166001179055612288565b6000612216836113c1565b90508060011480612227575080600a145b80612232575080600f145b1561228657602a80546001810182556000918252600080516020613deb83398151915201839055601380549161226783613ce5565b90915550506000828152602f60205260409020805460ff191660011790555b505b508061229381613d37565b915050612165565b50336000908152602e602052604081208054869290611fad908490613c57565b6006546001600160a01b031633146122e55760405162461bcd60e51b8152600401610e0790613b65565b60295460ff16151581151514156122fb57600080fd5b6029805460ff1916911515919091179055565b6006546001600160a01b031633146123385760405162461bcd60e51b8152600401610e0790613b65565b602c55565b6030816119c8811061234e57600080fd5b0154905081565b610e23338383612dbc565b6006546001600160a01b0316331461238a5760405162461bcd60e51b8152600401610e0790613b65565b60295460ff6201000090910416151581151514156123a757600080fd5b60298054911515620100000262ff000019909216919091179055565b6123cd3383612972565b6123e95760405162461bcd60e51b8152600401610e0790613bc5565b6123f584848484612e8b565b50505050565b602a818154811061240b57600080fd5b600091825260209091200154905081565b6000818152600260205260409020546060906001600160a01b031661249b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610e07565b602d6124a683612ebe565b6040516020016124b7929190613965565b6040516020818303038152906040529050919050565b6006546001600160a01b031633146124f75760405162461bcd60e51b8152600401610e0790613b65565b601f93909355602091909155602155602255565b6006546001600160a01b031633146125355760405162461bcd60e51b8152600401610e0790613b65565b600d54816024546125469190613c57565b11156125885760405162461bcd60e51b81526020600482015260116024820152701b585e081b1a5b5a5d081c995858da1959607a1b6044820152606401610e07565b60005b81811015610e2357600061259d6127fe565b90506125a93382612958565b602480549060006125b983613d37565b9091555050602a80546001818101909255600080516020613deb833981519152018290556000918252602f6020526040909120805460ff191690911790558061260181613d37565b91505061258b565b6006546001600160a01b031633146126335760405162461bcd60e51b8152600401610e0790613b65565b600c54816023546126449190613c57565b11156126865760405162461bcd60e51b81526020600482015260116024820152701b585e081b1a5b5a5d081c995858da1959607a1b6044820152606401610e07565b60005b8181101561105f57600061269b6127fe565b90506126a78482612958565b602380549060006126b783613d37565b91905055505080806126c890613d37565b915050612689565b6006546001600160a01b031633146126fa5760405162461bcd60e51b8152600401610e0790613b65565b6001600160a01b03811661275f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e07565b61276881612c14565b50565b60006001600160e01b0319821663780e9d6360e01b1480610dd75750610dd782612fbc565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127c582611822565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806119f8546119c86128129190613ca2565b6119f8546040805160208101929092526001600160601b03193360601b169082015244605482015242607482015290915060009082906094016040516020818303038152906040528051906020012060001c61286e9190613d52565b905060006030826119c8811061288657612886613da8565b0154156128aa576030826119c881106128a1576128a1613da8565b015490506128ad565b50805b60306128ba600185613ca2565b6119c881106128cb576128cb613da8565b01546128f7576128dc600184613ca2565b6030836119c881106128f0576128f0613da8565b015561292e565b6030612904600185613ca2565b6119c8811061291557612915613da8565b01546030836119c8811061292b5761292b613da8565b01555b6119f8805490600061293f83613d37565b909155506129509050816001613c57565b935050505090565b610e2382826040518060200160405280600081525061300c565b6000818152600260205260408120546001600160a01b03166129eb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610e07565b60006129f683611822565b9050806001600160a01b0316846001600160a01b03161480612a315750836001600160a01b0316612a2684610eb9565b6001600160a01b0316145b80612a6157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612a7c82611822565b6001600160a01b031614612ae45760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610e07565b6001600160a01b038216612b465760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610e07565b612b5183838361303f565b612b5c600082612790565b6001600160a01b0383166000908152600360205260408120805460019290612b85908490613ca2565b90915550506001600160a01b0382166000908152600360205260408120805460019290612bb3908490613c57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612c7182611822565b9050612c7f8160008461303f565b612c8a600083612790565b6001600160a01b0381166000908152600360205260408120805460019290612cb3908490613ca2565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815b8551811015612db1576000868281518110612d2f57612d2f613da8565b60200260200101519050808311612d71576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612d9e565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612da981613d37565b915050612d12565b509092149392505050565b816001600160a01b0316836001600160a01b03161415612e1e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610e07565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612e96848484612a69565b612ea28484848461304a565b6123f55760405162461bcd60e51b8152600401610e0790613a70565b606081612ee25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612f0c5780612ef681613d37565b9150612f059050600a83613c6f565b9150612ee6565b60008167ffffffffffffffff811115612f2757612f27613dbe565b6040519080825280601f01601f191660200182016040528015612f51576020820181803683370190505b5090505b8415612a6157612f66600183613ca2565b9150612f73600a86613d52565b612f7e906030613c57565b60f81b818381518110612f9357612f93613da8565b60200101906001600160f81b031916908160001a905350612fb5600a86613c6f565b9450612f55565b60006001600160e01b031982166380ac58cd60e01b1480612fed57506001600160e01b03198216635b5e139f60e01b145b80610dd757506301ffc9a760e01b6001600160e01b0319831614610dd7565b6130168383613157565b613023600084848461304a565b61105f5760405162461bcd60e51b8152600401610e0790613a70565b61105f8383836132a5565b60006001600160a01b0384163b1561314c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061308e903390899088908890600401613a20565b602060405180830381600087803b1580156130a857600080fd5b505af19250505080156130d8575060408051601f3d908101601f191682019092526130d5918101906137da565b60015b613132573d808015613106576040519150601f19603f3d011682016040523d82523d6000602084013e61310b565b606091505b50805161312a5760405162461bcd60e51b8152600401610e0790613a70565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a61565b506001949350505050565b6001600160a01b0382166131ad5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610e07565b6000818152600260205260409020546001600160a01b0316156132125760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610e07565b61321e6000838361303f565b6001600160a01b0382166000908152600360205260408120805460019290613247908490613c57565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316613300576132fb81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b613323565b816001600160a01b0316836001600160a01b03161461332357613323838261335d565b6001600160a01b03821661333a5761105f816133fa565b826001600160a01b0316826001600160a01b03161461105f5761105f82826134a9565b6000600161336a84611903565b6133749190613ca2565b6000838152600860205260409020549091508082146133c7576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061340c90600190613ca2565b6000838152600a60205260408120546009805493945090928490811061343457613434613da8565b90600052602060002001549050806009838154811061345557613455613da8565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061348d5761348d613d92565b6001900381819060005260206000200160009055905550505050565b60006134b483611903565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b8280546134f990613cfc565b90600052602060002090601f01602090048101928261351b5760008555613561565b82601f1061353457805160ff1916838001178555613561565b82800160010185558215613561579182015b82811115613561578251825591602001919060010190613546565b5061356d929150613571565b5090565b5b8082111561356d5760008155600101613572565b600067ffffffffffffffff808411156135a1576135a1613dbe565b604051601f8501601f19908116603f011681019082821181831017156135c9576135c9613dbe565b816040528093508581528686860111156135e257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461361357600080fd5b919050565b8035801515811461361357600080fd5b60006020828403121561363a57600080fd5b613643826135fc565b9392505050565b6000806040838503121561365d57600080fd5b613666836135fc565b9150613674602084016135fc565b90509250929050565b60008060006060848603121561369257600080fd5b61369b846135fc565b92506136a9602085016135fc565b9150604084013590509250925092565b600080600080608085870312156136cf57600080fd5b6136d8856135fc565b93506136e6602086016135fc565b925060408501359150606085013567ffffffffffffffff81111561370957600080fd5b8501601f8101871361371a57600080fd5b61372987823560208401613586565b91505092959194509250565b6000806040838503121561374857600080fd5b613751836135fc565b915061367460208401613618565b6000806040838503121561377257600080fd5b61377b836135fc565b946020939093013593505050565b60006020828403121561379b57600080fd5b61364382613618565b6000602082840312156137b657600080fd5b5035919050565b6000602082840312156137cf57600080fd5b813561364381613dd4565b6000602082840312156137ec57600080fd5b815161364381613dd4565b60006020828403121561380957600080fd5b813567ffffffffffffffff81111561382057600080fd5b8201601f8101841361383157600080fd5b612a6184823560208401613586565b60008060006040848603121561385557600080fd5b83359250602084013567ffffffffffffffff8082111561387457600080fd5b818601915086601f83011261388857600080fd5b81358181111561389757600080fd5b8760208260051b85010111156138ac57600080fd5b6020830194508093505050509250925092565b6000806000606084860312156138d457600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561390157600080fd5b5050823594602084013594506040840135936060013592509050565b60008151808452613935816020860160208601613cb9565b601f01601f19169290920160200192915050565b6000815161395b818560208601613cb9565b9290920192915050565b600080845481600182811c91508083168061398157607f831692505b60208084108214156139a157634e487b7160e01b86526022600452602486fd5b8180156139b557600181146139c6576139f3565b60ff198616895284890196506139f3565b60008b81526020902060005b868110156139eb5781548b8201529085019083016139d2565b505084890196505b505050505050613a17613a068286613949565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a539083018461391d565b9695505050505050565b602081526000613643602083018461391d565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526021908201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666040820152601760f91b606082015260800190565b6020808252601e908201527f45786365656473206d6178206d696e74206c696d69742070657220746e780000604082015260600190565b602080825260119082015270115e18d959591cc81b585e081b1a5b5a5d607a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526011908201527056616c75652062656c6f7720707269636560781b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526021908201527f45786365656473206d6178206d696e74206c696d6974207065722077616c6c656040820152601d60fa1b606082015260800190565b60008219821115613c6a57613c6a613d66565b500190565b600082613c7e57613c7e613d7c565b500490565b6000816000190483118215151615613c9d57613c9d613d66565b500290565b600082821015613cb457613cb4613d66565b500390565b60005b83811015613cd4578181015183820152602001613cbc565b838111156123f55750506000910152565b600081613cf457613cf4613d66565b506000190190565b600181811c90821680613d1057607f821691505b60208210811415613d3157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613d4b57613d4b613d66565b5060010190565b600082613d6157613d61613d7c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461276857600080fdfebeced09521047d05b8960b7e7bcc1d1292cf3e4b2a6b63f48335cbde5f7545d2a26469706673582212206f68b1a988653d2f090787d1d7963b5010c54cf5109fd19ace94e8ff25b3329b64736f6c63430008070033

Deployed Bytecode Sourcemap

46302:14125:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55869:171;;;;;;;;;;-1:-1:-1;55869:171:0;;;;;:::i;:::-;;:::i;:::-;;;9859:14:1;;9852:22;9834:41;;9822:2;9807:18;55869:171:0;;;;;;;;56323:88;;;;;;;;;;-1:-1:-1;56323:88:0;;;;;:::i;:::-;;:::i;:::-;;46564:40;;;;;;;;;;;;;;;;;;;10032:25:1;;;10020:2;10005:18;46564:40:0;9886:177:1;24049:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25608:221::-;;;;;;;;;;-1:-1:-1;25608:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9157:32:1;;;9139:51;;9127:2;9112:18;25608:221:0;8993:203:1;46775:43:0;;;;;;;;;;;;;;;;25131:411;;;;;;;;;;-1:-1:-1;25131:411:0;;;;;:::i;:::-;;:::i;52246:1241::-;;;;;;:::i;:::-;;:::i;57708:346::-;;;;;;;;;;-1:-1:-1;57708:346:0;;;;;:::i;:::-;;:::i;47293:43::-;;;;;;;;;;;;;;;;36998:113;;;;;;;;;;-1:-1:-1;37086:10:0;:17;36998:113;;26358:339;;;;;;;;;;-1:-1:-1;26358:339:0;;;;;:::i;:::-;;:::i;36666:256::-;;;;;;;;;;-1:-1:-1;36666:256:0;;;;;:::i;:::-;;:::i;55490:182::-;;;;;;;;;;-1:-1:-1;55490:182:0;;;;;:::i;:::-;;:::i;58586:112::-;;;;;;;;;;-1:-1:-1;58586:112:0;;;;;:::i;:::-;;:::i;56417:114::-;;;;;;;;;;;;;:::i;26768:185::-;;;;;;;;;;-1:-1:-1;26768:185:0;;;;;:::i;:::-;;:::i;48232:39::-;;;;;;;;;;-1:-1:-1;48232:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46415:33;;;;;;;;;;;;;;;;47495:30;;;;;;;;;;;;;;;;47671:36;;;;;;;;;;;;;;;;37188:233;;;;;;;;;;-1:-1:-1;37188:233:0;;;;;:::i;:::-;;:::i;58060:520::-;;;;;;;;;;-1:-1:-1;58060:520:0;;;;;:::i;:::-;;:::i;47948:34::-;;;;;;;;;;;;;;;;53568:1245;;;;;;:::i;:::-;;:::i;57111:135::-;;;;;;;;;;-1:-1:-1;57111:135:0;;;;;:::i;:::-;;:::i;47340:42::-;;;;;;;;;;;;;;;;23743:239;;;;;;;;;;-1:-1:-1;23743:239:0;;;;;:::i;:::-;;:::i;59242:485::-;;;;;;;;;;-1:-1:-1;59242:485:0;;;;;:::i;:::-;;:::i;23473:208::-;;;;;;;;;;-1:-1:-1;23473:208:0;;;;;:::i;:::-;;:::i;21060:103::-;;;;;;;;;;;;;:::i;46912:35::-;;;;;;;;;;;;;;;;47756:33;;;;;;;;;;-1:-1:-1;47756:33:0;;;;;;;;;;;58818:418;;;;;;;;;;-1:-1:-1;58818:418:0;;;;;:::i;:::-;;:::i;57408:150::-;;;;;;;;;;-1:-1:-1;57408:150:0;;;;;:::i;:::-;;:::i;20409:87::-;;;;;;;;;;-1:-1:-1;20482:6:0;;-1:-1:-1;;;;;20482:6:0;20409:87;;47631:36;;;;;;;;;;;;;;;;54888:596;;;;;;;;;;-1:-1:-1;54888:596:0;;;;;:::i;:::-;;:::i;57564:138::-;;;;;;;;;;-1:-1:-1;57564:138:0;;;;;:::i;:::-;;:::i;50808:1358::-;;;;;;:::i;:::-;;:::i;24218:104::-;;;;;;;;;;;;;:::i;46693:38::-;;;;;;;;;;;;;;;;49308:1425;;;;;;:::i;:::-;;:::i;47162:60::-;;;;;;;;;;;;;;;;56965:140;;;;;;;;;;-1:-1:-1;56965:140:0;;;;;:::i;:::-;;:::i;58704:108::-;;;;;;;;;;-1:-1:-1;58704:108:0;;;;;:::i;:::-;;:::i;47386:49::-;;;;;;;;;;;;;;;;59779:28;;;;;;;;;;-1:-1:-1;59779:28:0;;;;;:::i;:::-;;:::i;25901:155::-;;;;;;;;;;-1:-1:-1;25901:155:0;;;;;:::i;:::-;;:::i;46527:33::-;;;;;;;;;;;;;;;;46997:42;;;;;;;;;;;;;;;;48190:38;;;;;;;;;;-1:-1:-1;48190:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22203:25:1;;;22259:2;22244:18;;22237:34;;;;22287:18;;;22280:34;22345:2;22330:18;;22323:34;22190:3;22175:19;48190:38:0;21972:391:1;46652:34:0;;;;;;;;;;;;;;;;46871:37;;;;;;;;;;;;;;;;57252:150;;;;;;;;;;-1:-1:-1;57252:150:0;;;;;:::i;:::-;;:::i;46608:40::-;;;;;;;;;;;;;;;;27024:328;;;;;;;;;;-1:-1:-1;27024:328:0;;;;;:::i;:::-;;:::i;47835:38::-;;;;;;;;;;-1:-1:-1;47835:38:0;;;;;;;;;;;47917:24;;;;;;;;;;-1:-1:-1;47917:24:0;;;;;:::i;:::-;;:::i;47714:35::-;;;;;;;;;;-1:-1:-1;47714:35:0;;;;;;;;47793:38;;;;;;;;;;-1:-1:-1;47793:38:0;;;;;;;;;;;56048:266;;;;;;;;;;-1:-1:-1;56048:266:0;;;;;:::i;:::-;;:::i;47986:32::-;;;;;;;;;;;;;;;;47439:49;;;;;;;;;;;;;;;;47105:53;;;;;;;;;;;;;;;;46735:36;;;;;;;;;;;;;;;;47226:60;;;;;;;;;;;;;;;;46452:33;;;;;;;;;;;;;;;;56645:314;;;;;;;;;;-1:-1:-1;56645:314:0;;;;;:::i;:::-;;:::i;48833:398::-;;;;;;;;;;-1:-1:-1;48833:398:0;;;;;:::i;:::-;;:::i;47046:55::-;;;;;;;;;;;;;;;;47877:34;;;;;;;;;;-1:-1:-1;47877:34:0;;;;;;;;;;;46822:43;;;;;;;;;;;;;;;;48405:349;;;;;;;;;;-1:-1:-1;48405:349:0;;;;;:::i;:::-;;:::i;47598:29::-;;;;;;;;;;;;;;;;26127:164;;;;;;;;;;-1:-1:-1;26127:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;26248:25:0;;;26224:4;26248:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26127:164;47563:31;;;;;;;;;;;;;;;;21318:201;;;;;;;;;;-1:-1:-1;21318:201:0;;;;;:::i;:::-;;:::i;46489:34::-;;;;;;;;;;;;;;;;47529:30;;;;;;;;;;;;;;;;46951:42;;;;;;;;;;;;;;;;55869:171;55972:4;55996:36;56020:11;55996:23;:36::i;:::-;55989:43;55869:171;-1:-1:-1;;55869:171:0:o;56323:88::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;;;;;;;;;56389:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;:::-;;56323:88:::0;:::o;24049:100::-;24103:13;24136:5;24129:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24049:100;:::o;25608:221::-;25684:7;28951:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28951:16:0;25704:73;;;;-1:-1:-1;;;25704:73:0;;18063:2:1;25704:73:0;;;18045:21:1;18102:2;18082:18;;;18075:30;18141:34;18121:18;;;18114:62;-1:-1:-1;;;18192:18:1;;;18185:42;18244:19;;25704:73:0;17861:408:1;25704:73:0;-1:-1:-1;25797:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25797:24:0;;25608:221::o;25131:411::-;25212:13;25228:23;25243:7;25228:14;:23::i;:::-;25212:39;;25276:5;-1:-1:-1;;;;;25270:11:0;:2;-1:-1:-1;;;;;25270:11:0;;;25262:57;;;;-1:-1:-1;;;25262:57:0;;20009:2:1;25262:57:0;;;19991:21:1;20048:2;20028:18;;;20021:30;20087:34;20067:18;;;20060:62;-1:-1:-1;;;20138:18:1;;;20131:31;20179:19;;25262:57:0;19807:397:1;25262:57:0;17371:10;-1:-1:-1;;;;;25354:21:0;;;;:62;;-1:-1:-1;25379:37:0;25396:5;17371:10;26127:164;:::i;25379:37::-;25332:168;;;;-1:-1:-1;;;25332:168:0;;15065:2:1;25332:168:0;;;15047:21:1;15104:2;15084:18;;;15077:30;15143:34;15123:18;;;15116:62;15214:26;15194:18;;;15187:54;15258:19;;25332:168:0;14863:420:1;25332:168:0;25513:21;25522:2;25526:7;25513:8;:21::i;:::-;25201:341;25131:411;;:::o;52246:1241::-;52323:18;;;;;;;52310:63;;;;-1:-1:-1;;;52310:63:0;;13552:2:1;52310:63:0;;;13534:21:1;13591:2;13571:18;;;13564:30;-1:-1:-1;;;13610:18:1;;;13603:48;13668:18;;52310:63:0;13350:342:1;52310:63:0;52425:18;;52415:6;52391:21;;:30;;;;:::i;:::-;:52;;52378:96;;;;-1:-1:-1;;;52378:96:0;;;;;;;:::i;:::-;52539:23;;52498:10;52492:17;;;;:5;:17;;;;;:34;;;:43;;52529:6;;52492:43;:::i;:::-;:70;;52479:129;;;;-1:-1:-1;;;52479:129:0;;;;;;;:::i;:::-;52636:41;;52626:6;:51;;52613:107;;;;-1:-1:-1;;;52613:107:0;;;;;;;:::i;:::-;52774:6;52751:20;;:29;;;;:::i;:::-;52738:9;:42;;52725:85;;;;-1:-1:-1;;;52725:85:0;;;;;;;:::i;:::-;52820:9;52815:619;52839:6;52835:1;:10;52815:619;;;52858:15;52876:10;:8;:10::i;:::-;52858:28;;52892:30;52902:10;52914:7;52892:9;:30::i;:::-;52928:21;:23;;;:21;:23;;;:::i;:::-;;;;-1:-1:-1;;52965:23:0;;:27;52962:467;;53058:23;;53032:21;;53011:18;;:42;;;;:::i;:::-;53010:71;53007:416;;53103:7;:21;;;;;;;-1:-1:-1;53103:21:0;;;-1:-1:-1;;;;;;;;;;;53103:21:0;;;;53134:23;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;53169:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;53169:22:0;53187:4;53169:22;;;53007:416;;;53233:18;53254:11;53263:1;53254:8;:11::i;:::-;53233:32;;53280:10;53292:2;53280:14;53277:137;;;53316:7;:21;;;;;;;-1:-1:-1;53316:21:0;;;-1:-1:-1;;;;;;;;;;;53316:21:0;;;;53347:23;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;53382:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;53382:22:0;53400:4;53382:22;;;53277:137;53221:202;53007:416;-1:-1:-1;52847:3:0;;;;:::i;:::-;;;;52815:619;;;-1:-1:-1;53444:10:0;53438:17;;;;:5;:17;;;;;:34;;:44;;53476:6;;53438:17;:44;;53476:6;;53438:44;:::i;:::-;;;;-1:-1:-1;;;52246:1241:0:o;57708:346::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;57871:18:::1;:37:::0;;;;57913:16:::1;:33:::0;;;;57951:23:::1;:45:::0;58001:23:::1;:45:::0;57708:346::o;26358:339::-;26553:41;17371:10;26586:7;26553:18;:41::i;:::-;26545:103;;;;-1:-1:-1;;;26545:103:0;;;;;;;:::i;:::-;26661:28;26671:4;26677:2;26681:7;26661:9;:28::i;36666:256::-;36763:7;36799:23;36816:5;36799:16;:23::i;:::-;36791:5;:31;36783:87;;;;-1:-1:-1;;;36783:87:0;;10494:2:1;36783:87:0;;;10476:21:1;10533:2;10513:18;;;10506:30;10572:34;10552:18;;;10545:62;-1:-1:-1;;;10623:18:1;;;10616:41;10674:19;;36783:87:0;10292:407:1;36783:87:0;-1:-1:-1;;;;;;36888:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36666:256::o;55490:182::-;55598:63;;;;;;8861:19:1;;;55627:15:0;8896:12:1;;;8889:28;;;;55644:16:0;8933:12:1;;;8926:28;55549:7:0;;55664:2;;8970:12:1;;55598:63:0;;;;;;;;;;;;55588:74;;;;;;55580:83;;:86;;;;:::i;58586:112::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;58664:19:::1;:29:::0;58586:112::o;56417:114::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;56475:47:::1;::::0;56483:10:::1;::::0;56500:21:::1;56475:47:::0;::::1;;;::::0;::::1;::::0;;;56500:21;56483:10;56475:47;::::1;;;;;;56467:56;;;::::0;::::1;;56417:114::o:0;26768:185::-;26906:39;26923:4;26929:2;26933:7;26906:39;;;;;;;;;;;;:16;:39::i;37188:233::-;37263:7;37299:30;37086:10;:17;;36998:113;37299:30;37291:5;:38;37283:95;;;;-1:-1:-1;;;37283:95:0;;21231:2:1;37283:95:0;;;21213:21:1;21270:2;21250:18;;;21243:30;21309:34;21289:18;;;21282:62;-1:-1:-1;;;21360:18:1;;;21353:42;21412:19;;37283:95:0;21029:408:1;37283:95:0;37396:10;37407:5;37396:17;;;;;;;;:::i;:::-;;;;;;;;;37389:24;;37188:233;;;:::o;58060:520::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;58281:36:::1;:66:::0;;;;58352:34:::1;:62:::0;;;;58419:41:::1;:74:::0;58498:41:::1;:74:::0;58060:520::o;53568:1245::-;53646:18;;;;;;;53633:63;;;;-1:-1:-1;;;53633:63:0;;13552:2:1;53633:63:0;;;13534:21:1;13591:2;13571:18;;;13564:30;-1:-1:-1;;;13610:18:1;;;13603:48;13668:18;;53633:63:0;13350:342:1;53633:63:0;53748:18;;53738:6;53714:21;;:30;;;;:::i;:::-;:52;;53701:96;;;;-1:-1:-1;;;53701:96:0;;;;;;;:::i;:::-;53862:23;;53821:10;53815:17;;;;:5;:17;;;;;:34;;;:43;;53852:6;;53815:43;:::i;:::-;:70;;53802:129;;;;-1:-1:-1;;;53802:129:0;;;;;;;:::i;:::-;53959:41;;53949:6;:51;;53936:107;;;;-1:-1:-1;;;53936:107:0;;;;;;;:::i;:::-;54097:6;54074:20;;:29;;;;:::i;:::-;54061:9;:42;;54048:85;;;;-1:-1:-1;;;54048:85:0;;;;;;;:::i;:::-;54147:9;54142:618;54166:6;54162:1;:10;54142:618;;;54185:15;54203:10;:8;:10::i;:::-;54185:28;;54219:30;54229:10;54241:7;54219:9;:30::i;:::-;54255:21;:23;;;:21;:23;;;:::i;:::-;;;;-1:-1:-1;;54292:23:0;;:27;54289:466;;54385:23;;54359:21;;54338:18;;:42;;;;:::i;:::-;54337:71;54334:415;;54430:7;:21;;;;;;;-1:-1:-1;54430:21:0;;;-1:-1:-1;;;;;;;;;;;54430:21:0;;;;54461:23;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;54496:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;54496:22:0;54514:4;54496:22;;;54334:415;;;54560:18;54581:11;54590:1;54581:8;:11::i;:::-;54560:32;;54607:10;54619:1;54607:13;54604:136;;;54642:7;:21;;;;;;;-1:-1:-1;54642:21:0;;;-1:-1:-1;;;;;;;;;;;54642:21:0;;;;54673:23;:25;;;;;;:::i;:::-;;;;-1:-1:-1;;54708:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;54708:22:0;54726:4;54708:22;;;54604:136;54548:201;54334:415;-1:-1:-1;54174:3:0;;;;:::i;:::-;;;;54142:618;;;-1:-1:-1;54770:10:0;54764:17;;;;:5;:17;;;;;:34;;:44;;54802:6;;54764:17;:44;;54802:6;;54764:44;:::i;57111:135::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;57182:13:::1;::::0;::::1;;::::0;;::::1;;:23;;::::0;::::1;;;;57174:32;;;::::0;::::1;;57216:13;:22:::0;;;::::1;;;;-1:-1:-1::0;;57216:22:0;;::::1;::::0;;;::::1;::::0;;57111:135::o;23743:239::-;23815:7;23851:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23851:16:0;23886:19;23878:73;;;;-1:-1:-1;;;23878:73:0;;16600:2:1;23878:73:0;;;16582:21:1;16639:2;16619:18;;;16612:30;16678:34;16658:18;;;16651:62;-1:-1:-1;;;16729:18:1;;;16722:39;16778:19;;23878:73:0;16398:405:1;59242:485:0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;59493:22;59468;59426:39:::1;59448:17:::0;59426:19;:39:::1;:::i;:::-;:64;;;;:::i;:::-;:89;;;;:::i;:::-;59519:3;59426:96;59418:105;;;::::0;::::1;;59532:18;:40:::0;;;;59577:16:::1;:36:::0;;;;59618:23:::1;:48:::0;59671:23:::1;:48:::0;59242:485::o;23473:208::-;23545:7;-1:-1:-1;;;;;23573:19:0;;23565:74;;;;-1:-1:-1;;;23565:74:0;;16189:2:1;23565:74:0;;;16171:21:1;16228:2;16208:18;;;16201:30;16267:34;16247:18;;;16240:62;-1:-1:-1;;;16318:18:1;;;16311:40;16368:19;;23565:74:0;15987:406:1;23565:74:0;-1:-1:-1;;;;;;23657:16:0;;;;;:9;:16;;;;;;;23473:208::o;21060:103::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;21125:30:::1;21152:1;21125:18;:30::i;58818:418::-:0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;59041:18;59020;58986:31:::1;59004:13:::0;58986:15;:31:::1;:::i;:::-;:52;;;;:::i;:::-;:73;;;;:::i;:::-;59063:4;58986:81;58978:90;;;::::0;::::1;;59077:13;:31:::0;;;;59113:11:::1;:27:::0;;;;59145:18:::1;:39:::0;59189:18:::1;:39:::0;58818:418::o;57408:150::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;57484:18:::1;::::0;::::1;::::0;;;::::1;;:28;;::::0;::::1;;;;57476:37;;;::::0;::::1;;57523:18;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;57523:27:0;;::::1;::::0;;;::::1;::::0;;57408:150::o;54888:596::-;54990:14;;;;;;;54977:63;;;;-1:-1:-1;;;54977:63:0;;12089:2:1;54977:63:0;;;12071:21:1;12128:2;12108:18;;;12101:30;-1:-1:-1;;;12147:18:1;;;12140:52;12209:18;;54977:63:0;11887:346:1;54977:63:0;55059:14;;;;:6;:14;;;;;;;;55058:15;:34;;;;-1:-1:-1;55078:14:0;;;;:6;:14;;;;;;;;55077:15;55058:34;:55;;;;-1:-1:-1;55097:16:0;;;;:6;:16;;;;;;;;55096:17;55058:55;55045:101;;;;-1:-1:-1;;;55045:101:0;;21644:2:1;55045:101:0;;;21626:21:1;21683:2;21663:18;;;21656:30;-1:-1:-1;;;21702:18:1;;;21695:49;21761:18;;55045:101:0;21442:343:1;55045:101:0;55183:10;55164:15;55172:6;55164:7;:15::i;:::-;-1:-1:-1;;;;;55164:29:0;;:62;;;;-1:-1:-1;55216:10:0;55197:15;55205:6;55197:7;:15::i;:::-;-1:-1:-1;;;;;55197:29:0;;55164:62;:97;;;;-1:-1:-1;55251:10:0;55230:17;55238:8;55230:7;:17::i;:::-;-1:-1:-1;;;;;55230:31:0;;55164:97;55151:135;;;;-1:-1:-1;;;55151:135:0;;15849:2:1;55151:135:0;;;15831:21:1;15888:2;15868:18;;;15861:30;-1:-1:-1;;;15907:18:1;;;15900:41;15958:18;;55151:135:0;15647:335:1;55151:135:0;55295:13;55301:6;55295:5;:13::i;:::-;55313;55319:6;55313:5;:13::i;:::-;55331:15;55337:8;55331:5;:15::i;:::-;55355;55373:10;:8;:10::i;:::-;55355:28;;55388:30;55398:10;55410:7;55388:9;:30::i;:::-;55428:7;:21;;;;;;;;;-1:-1:-1;;;;;;;;;;;55428:21:0;;;;-1:-1:-1;55457:15:0;;;:6;55428:21;55457:15;;;;;:22;;-1:-1:-1;;55457:22:0;;;;;;-1:-1:-1;;;54888:596:0:o;57564:138::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;57636:14:::1;::::0;::::1;::::0;;;::::1;;:24;;::::0;::::1;;;;57628:33;;;::::0;::::1;;57671:14;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;57671:23:0;;::::1;::::0;;;::::1;::::0;;57564:138::o;50808:1358::-;50924:28;;;-1:-1:-1;;;;;;50941:10:0;6603:2:1;6599:15;6595:53;50924:28:0;;;;6583:66:1;;;;50924:28:0;;;;;;;;;6665:12:1;;;;50924:28:0;;;50914:39;;;;;50971:13;;;;;;;50958:62;;;;-1:-1:-1;;;50958:62:0;;14312:2:1;50958:62:0;;;14294:21:1;14351:2;14331:18;;;14324:30;-1:-1:-1;;;14370:18:1;;;14363:52;14432:18;;50958:62:0;14110:346:1;50958:62:0;51065:11;;51055:6;51038:14;;:23;;;;:::i;:::-;:38;;51025:82;;;;-1:-1:-1;;;51025:82:0;;;;;;;:::i;:::-;51125:56;51144:11;;51125:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;51157:17:0;;;-1:-1:-1;51176:4:0;;-1:-1:-1;51125:18:0;:56::i;:::-;51112:116;;;;-1:-1:-1;;;51112:116:0;;;;;;;:::i;:::-;51288:16;;51252:10;51246:17;;;;:5;:17;;;;;:29;;;:38;;51278:6;;51246:38;:::i;:::-;:58;;51233:117;;;;-1:-1:-1;;;51233:117:0;;;;;;;:::i;:::-;51378:34;;51368:6;:44;;51355:100;;;;-1:-1:-1;;;51355:100:0;;;;;;;:::i;:::-;51502:6;51486:13;;:22;;;;:::i;:::-;51473:9;:35;;51460:78;;;;-1:-1:-1;;;51460:78:0;;;;;;;:::i;:::-;51548:9;51543:575;51567:6;51563:1;:10;51543:575;;;51586:15;51604:10;:8;:10::i;:::-;51586:28;;51620:30;51630:10;51642:7;51620:9;:30::i;:::-;51656:14;:16;;;:14;:16;;;:::i;:::-;;;;-1:-1:-1;;51686:16:0;;:20;51683:425;;51758:16;;51739:14;;51725:11;;:28;;;;:::i;:::-;51724:50;51721:381;;51796:7;:21;;;;;;;-1:-1:-1;51796:21:0;;;-1:-1:-1;;;;;;;;;;;51796:21:0;;;;51827:16;:18;;;;;;:::i;:::-;;;;-1:-1:-1;;51855:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;51855:22:0;51873:4;51855:22;;;51721:381;;;51919:18;51940:11;51949:1;51940:8;:11::i;:::-;51919:32;;51966:10;51978:2;51966:14;51963:130;;;52002:7;:21;;;;;;;-1:-1:-1;52002:21:0;;;-1:-1:-1;;;;;;;;;;;52002:21:0;;;;52033:16;:18;;;;;;:::i;:::-;;;;-1:-1:-1;;52061:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;52061:22:0;52079:4;52061:22;;;51963:130;51907:195;51721:381;-1:-1:-1;51575:3:0;;;;:::i;:::-;;;;51543:575;;;-1:-1:-1;52128:10:0;52122:17;;;;:5;:17;;;;;:29;;:39;;52155:6;;52122:17;:39;;52155:6;;52122:39;:::i;:::-;;;;-1:-1:-1;;;;;;50808:1358:0:o;24218:104::-;24274:13;24307:7;24300:14;;;;;:::i;49308:1425::-;49426:28;;;49443:10;6603:2:1;6599:15;-1:-1:-1;;;;;;6595:53:1;49426:28:0;;;;6583:66:1;;;;49426:28:0;;;;;;;;;6665:12:1;;;;49426:28:0;;;49416:39;;;;;49473:15;;;;49460:66;;;;-1:-1:-1;;;49460:66:0;;13199:2:1;49460:66:0;;;13181:21:1;13238:2;13218:18;;;13211:30;13277:26;13257:18;;;13250:54;13321:18;;49460:66:0;12997:348:1;49460:66:0;49573:13;;49563:6;49544:16;;:25;;;;:::i;:::-;:42;;49531:86;;;;-1:-1:-1;;;49531:86:0;;;;;;;:::i;:::-;49635:58;49654:11;;49635:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49667:19:0;;;-1:-1:-1;49688:4:0;;-1:-1:-1;49635:18:0;:58::i;:::-;49622:118;;;;-1:-1:-1;;;49622:118:0;;;;;;;:::i;:::-;49802:18;;49764:10;49758:17;;;;:5;:17;;;;;:31;:40;;49792:6;;49758:40;:::i;:::-;:62;;49745:121;;;;-1:-1:-1;;;49745:121:0;;;;;;;:::i;:::-;49894:36;;49884:6;:46;;49871:102;;;;-1:-1:-1;;;49871:102:0;;;;;;;:::i;:::-;50022:6;50004:15;;:24;;;;:::i;:::-;49991:9;:37;;49978:80;;;;-1:-1:-1;;;49978:80:0;;;;;;;:::i;:::-;50068:9;50063:619;50087:6;50083:1;:10;50063:619;;;50106:15;50124:10;:8;:10::i;:::-;50106:28;;50140:30;50150:10;50162:7;50140:9;:30::i;:::-;50176:16;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;50208:18:0;;:22;50205:472;;50286:18;;50265:16;;50249:13;;:32;;;;:::i;:::-;50248:56;50245:426;;50326:7;:21;;;;;;;-1:-1:-1;50326:21:0;;;-1:-1:-1;;;;;;;;;;;50326:21:0;;;;50357:18;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;50387:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;50387:22:0;50405:4;50387:22;;;50245:426;;;50451:18;50472:11;50481:1;50472:8;:11::i;:::-;50451:32;;50498:10;50510:1;50498:13;:31;;;;50515:10;50527:2;50515:14;50498:31;:49;;;;50533:10;50545:2;50533:14;50498:49;50495:167;;;50569:7;:21;;;;;;;-1:-1:-1;50569:21:0;;;-1:-1:-1;;;;;;;;;;;50569:21:0;;;;50600:18;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;50630:15:0;;;;:6;:15;;;;;:22;;-1:-1:-1;;50630:22:0;50648:4;50630:22;;;50495:167;50439:232;50245:426;-1:-1:-1;50095:3:0;;;;:::i;:::-;;;;50063:619;;;-1:-1:-1;50692:10:0;50686:17;;;;:5;:17;;;;;:42;;50722:6;;50686:17;:42;;50722:6;;50686:42;:::i;56965:140::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;57042:15:::1;::::0;::::1;;:25;;::::0;::::1;;;;57034:34;;;::::0;::::1;;57073:15;:24:::0;;-1:-1:-1;;57073:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56965:140::o;58704:108::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;58780:17:::1;:27:::0;58704:108::o;59779:28::-;;;;;;;;;;;;;;;-1:-1:-1;59779:28:0;:::o;25901:155::-;25996:52;17371:10;26029:8;26039;25996:18;:52::i;57252:150::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;57328:18:::1;::::0;::::1;::::0;;;::::1;;:28;;::::0;::::1;;;;57320:37;;;::::0;::::1;;57367:18;:27:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;57367:27:0;;::::1;::::0;;;::::1;::::0;;57252:150::o;27024:328::-;27199:41;17371:10;27232:7;27199:18;:41::i;:::-;27191:103;;;;-1:-1:-1;;;27191:103:0;;;;;;;:::i;:::-;27305:39;27319:4;27325:2;27329:7;27338:5;27305:13;:39::i;:::-;27024:328;;;;:::o;47917:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47917:24:0;:::o;56048:266::-;28927:4;28951:16;;;:7;:16;;;;;;56122:13;;-1:-1:-1;;;;;28951:16:0;56148:77;;;;-1:-1:-1;;;56148:77:0;;19247:2:1;56148:77:0;;;19229:21:1;19286:2;19266:18;;;19259:30;19325:34;19305:18;;;19298:62;-1:-1:-1;;;19376:18:1;;;19369:45;19431:19;;56148:77:0;19045:411:1;56148:77:0;56267:7;56276:19;:8;:17;:19::i;:::-;56250:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56236:70;;56048:266;;;:::o;56645:314::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;56796:15:::1;:32:::0;;;;56833:13:::1;:28:::0;;;;56866:20:::1;:40:::0;56911:20:::1;:40:::0;56645:314::o;48833:398::-;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;48951:12:::1;;48941:6;48923:15;;:24;;;;:::i;:::-;:40;;48901:108;;;::::0;-1:-1:-1;;;48901:108:0;;17717:2:1;48901:108:0::1;::::0;::::1;17699:21:1::0;17756:2;17736:18;;;17729:30;-1:-1:-1;;;17775:18:1;;;17768:47;17832:18;;48901:108:0::1;17515:341:1::0;48901:108:0::1;49019:9;49014:210;49038:6;49034:1;:10;49014:210;;;49061:15;49079:10;:8;:10::i;:::-;49061:28;;49104:30;49114:10;49126:7;49104:9;:30::i;:::-;49140:15;:17:::0;;;:15:::1;:17;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;49163:7:0::1;:21:::0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;;;;;;;49163:21:0::1;::::0;;;-1:-1:-1;49190:15:0;;;:6:::1;49163:21;49190:15:::0;;;;;:22;;-1:-1:-1;;49190:22:0::1;::::0;;::::1;::::0;;49046:3;::::1;::::0;::::1;:::i;:::-;;;;49014:210;;48405:349:::0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;48536:12:::1;;48526:6;48508:15;;:24;;;;:::i;:::-;:40;;48486:108;;;::::0;-1:-1:-1;;;48486:108:0;;17717:2:1;48486:108:0::1;::::0;::::1;17699:21:1::0;17756:2;17736:18;;;17729:30;-1:-1:-1;;;17775:18:1;;;17768:47;17832:18;;48486:108:0::1;17515:341:1::0;48486:108:0::1;48604:9;48599:148;48623:6;48619:1;:10;48599:148;;;48646:15;48664:10;:8;:10::i;:::-;48646:28;;48689:23;48699:3;48704:7;48689:9;:23::i;:::-;48718:15;:17:::0;;;:15:::1;:17;::::0;::::1;:::i;:::-;;;;;;48636:111;48631:3;;;;;:::i;:::-;;;;48599:148;;21318:201:::0;20482:6;;-1:-1:-1;;;;;20482:6:0;17371:10;20629:23;20621:68;;;;-1:-1:-1;;;20621:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21407:22:0;::::1;21399:73;;;::::0;-1:-1:-1;;;21399:73:0;;11325:2:1;21399:73:0::1;::::0;::::1;11307:21:1::0;11364:2;11344:18;;;11337:30;11403:34;11383:18;;;11376:62;-1:-1:-1;;;11454:18:1;;;11447:36;11500:19;;21399:73:0::1;11123:402:1::0;21399:73:0::1;21483:28;21502:8;21483:18;:28::i;:::-;21318:201:::0;:::o;36358:224::-;36460:4;-1:-1:-1;;;;;;36484:50:0;;-1:-1:-1;;;36484:50:0;;:90;;;36538:36;36562:11;36538:23;:36::i;32844:174::-;32919:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32919:29:0;-1:-1:-1;;;;;32919:29:0;;;;;;;;:24;;32973:23;32919:24;32973:14;:23::i;:::-;-1:-1:-1;;;;;32964:46:0;;;;;;;;;;;32844:174;;:::o;59834:590::-;59871:4;59888:14;59915:5;;59771:4;59905:15;;;;:::i;:::-;59976:5;;59959:70;;;;;;8459:19:1;;;;-1:-1:-1;;;;;;59983:10:0;8516:2:1;8512:15;8508:53;8494:12;;;8487:75;59995:16:0;8578:12:1;;;8571:28;60013:15:0;8615:12:1;;;8608:28;59888:32:0;;-1:-1:-1;59931:10:0;;59888:32;;8652:13:1;;59959:70:0;;;;;;;;;;;;59949:81;;;;;;59944:87;;:99;;;;:::i;:::-;59931:112;;60054:10;60083:7;60091:5;60083:14;;;;;;;:::i;:::-;;;:19;60079:120;;60127:7;60135:5;60127:14;;;;;;;:::i;:::-;;;60119:22;;60079:120;;;-1:-1:-1;60182:5:0;60079:120;60216:7;60224:13;60236:1;60224:9;:13;:::i;:::-;60216:22;;;;;;;:::i;:::-;;;60212:162;;60277:13;60289:1;60277:9;:13;:::i;:::-;60260:7;60268:5;60260:14;;;;;;;:::i;:::-;;:30;60212:162;;;60340:7;60348:13;60360:1;60348:9;:13;:::i;:::-;60340:22;;;;;;;:::i;:::-;;;60323:7;60331:5;60323:14;;;;;;;:::i;:::-;;:39;60212:162;60384:5;:7;;;:5;:7;;;:::i;:::-;;;;-1:-1:-1;60409:7:0;;-1:-1:-1;60409:5:0;60415:1;60409:7;:::i;:::-;60402:14;;;;;59834:590;:::o;29846:110::-;29922:26;29932:2;29936:7;29922:26;;;;;;;;;;;;:9;:26::i;29156:348::-;29249:4;28951:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28951:16:0;29266:73;;;;-1:-1:-1;;;29266:73:0;;13899:2:1;29266:73:0;;;13881:21:1;13938:2;13918:18;;;13911:30;13977:34;13957:18;;;13950:62;-1:-1:-1;;;14028:18:1;;;14021:42;14080:19;;29266:73:0;13697:408:1;29266:73:0;29350:13;29366:23;29381:7;29366:14;:23::i;:::-;29350:39;;29419:5;-1:-1:-1;;;;;29408:16:0;:7;-1:-1:-1;;;;;29408:16:0;;:51;;;;29452:7;-1:-1:-1;;;;;29428:31:0;:20;29440:7;29428:11;:20::i;:::-;-1:-1:-1;;;;;29428:31:0;;29408:51;:87;;;-1:-1:-1;;;;;;26248:25:0;;;26224:4;26248:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;29463:32;29400:96;29156:348;-1:-1:-1;;;;29156:348:0:o;32148:578::-;32307:4;-1:-1:-1;;;;;32280:31:0;:23;32295:7;32280:14;:23::i;:::-;-1:-1:-1;;;;;32280:31:0;;32272:85;;;;-1:-1:-1;;;32272:85:0;;18837:2:1;32272:85:0;;;18819:21:1;18876:2;18856:18;;;18849:30;18915:34;18895:18;;;18888:62;-1:-1:-1;;;18966:18:1;;;18959:39;19015:19;;32272:85:0;18635:405:1;32272:85:0;-1:-1:-1;;;;;32376:16:0;;32368:65;;;;-1:-1:-1;;;32368:65:0;;12440:2:1;32368:65:0;;;12422:21:1;12479:2;12459:18;;;12452:30;12518:34;12498:18;;;12491:62;-1:-1:-1;;;12569:18:1;;;12562:34;12613:19;;32368:65:0;12238:400:1;32368:65:0;32446:39;32467:4;32473:2;32477:7;32446:20;:39::i;:::-;32550:29;32567:1;32571:7;32550:8;:29::i;:::-;-1:-1:-1;;;;;32592:15:0;;;;;;:9;:15;;;;;:20;;32611:1;;32592:15;:20;;32611:1;;32592:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32623:13:0;;;;;;:9;:13;;;;;:18;;32640:1;;32623:13;:18;;32640:1;;32623:18;:::i;:::-;;;;-1:-1:-1;;32652:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32652:21:0;-1:-1:-1;;;;;32652:21:0;;;;;;;;;32691:27;;32652:16;;32691:27;;;;;;;32148:578;;;:::o;21679:191::-;21772:6;;;-1:-1:-1;;;;;21789:17:0;;;-1:-1:-1;;;;;;21789:17:0;;;;;;;21822:40;;21772:6;;;21789:17;21772:6;;21822:40;;21753:16;;21822:40;21742:128;21679:191;:::o;31451:360::-;31511:13;31527:23;31542:7;31527:14;:23::i;:::-;31511:39;;31563:48;31584:5;31599:1;31603:7;31563:20;:48::i;:::-;31652:29;31669:1;31673:7;31652:8;:29::i;:::-;-1:-1:-1;;;;;31694:16:0;;;;;;:9;:16;;;;;:21;;31714:1;;31694:16;:21;;31714:1;;31694:21;:::i;:::-;;;;-1:-1:-1;;31733:16:0;;;;:7;:16;;;;;;31726:23;;-1:-1:-1;;;;;;31726:23:0;;;31767:36;31741:7;;31733:16;-1:-1:-1;;;;;31767:36:0;;;;;31733:16;;31767:36;31500:311;31451:360;:::o;45465:830::-;45590:4;45630;45590;45647:525;45671:5;:12;45667:1;:16;45647:525;;;45705:20;45728:5;45734:1;45728:8;;;;;;;;:::i;:::-;;;;;;;45705:31;;45773:12;45757;:28;45753:408;;45910:44;;;;;;6845:19:1;;;6880:12;;;6873:28;;;6917:12;;45910:44:0;;;;;;;;;;;;45900:55;;;;;;45885:70;;45753:408;;;46100:44;;;;;;6845:19:1;;;6880:12;;;6873:28;;;6917:12;;46100:44:0;;;;;;;;;;;;46090:55;;;;;;46075:70;;45753:408;-1:-1:-1;45685:3:0;;;;:::i;:::-;;;;45647:525;;;-1:-1:-1;46267:20:0;;;;45465:830;-1:-1:-1;;;45465:830:0:o;33160:315::-;33315:8;-1:-1:-1;;;;;33306:17:0;:5;-1:-1:-1;;;;;33306:17:0;;;33298:55;;;;-1:-1:-1;;;33298:55:0;;12845:2:1;33298:55:0;;;12827:21:1;12884:2;12864:18;;;12857:30;12923:27;12903:18;;;12896:55;12968:18;;33298:55:0;12643:349:1;33298:55:0;-1:-1:-1;;;;;33364:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;33364:46:0;;;;;;;;;;33426:41;;9834::1;;;33426::0;;9807:18:1;33426:41:0;;;;;;;33160:315;;;:::o;28234:::-;28391:28;28401:4;28407:2;28411:7;28391:9;:28::i;:::-;28438:48;28461:4;28467:2;28471:7;28480:5;28438:22;:48::i;:::-;28430:111;;;;-1:-1:-1;;;28430:111:0;;;;;;;:::i;17731:723::-;17787:13;18008:10;18004:53;;-1:-1:-1;;18035:10:0;;;;;;;;;;;;-1:-1:-1;;;18035:10:0;;;;;17731:723::o;18004:53::-;18082:5;18067:12;18123:78;18130:9;;18123:78;;18156:8;;;;:::i;:::-;;-1:-1:-1;18179:10:0;;-1:-1:-1;18187:2:0;18179:10;;:::i;:::-;;;18123:78;;;18211:19;18243:6;18233:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18233:17:0;;18211:39;;18261:154;18268:10;;18261:154;;18295:11;18305:1;18295:11;;:::i;:::-;;-1:-1:-1;18364:10:0;18372:2;18364:5;:10;:::i;:::-;18351:24;;:2;:24;:::i;:::-;18338:39;;18321:6;18328;18321:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18321:56:0;;;;;;;;-1:-1:-1;18392:11:0;18401:2;18392:11;;:::i;:::-;;;18261:154;;23104:305;23206:4;-1:-1:-1;;;;;;23243:40:0;;-1:-1:-1;;;23243:40:0;;:105;;-1:-1:-1;;;;;;;23300:48:0;;-1:-1:-1;;;23300:48:0;23243:105;:158;;;-1:-1:-1;;;;;;;;;;7202:40:0;;;23365:36;7093:157;30183:321;30313:18;30319:2;30323:7;30313:5;:18::i;:::-;30364:54;30395:1;30399:2;30403:7;30412:5;30364:22;:54::i;:::-;30342:154;;;;-1:-1:-1;;;30342:154:0;;;;;;;:::i;55681:180::-;55808:45;55835:4;55841:2;55845:7;55808:26;:45::i;34040:799::-;34195:4;-1:-1:-1;;;;;34216:13:0;;9743:20;9791:8;34212:620;;34252:72;;-1:-1:-1;;;34252:72:0;;-1:-1:-1;;;;;34252:36:0;;;;;:72;;17371:10;;34303:4;;34309:7;;34318:5;;34252:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34252:72:0;;;;;;;;-1:-1:-1;;34252:72:0;;;;;;;;;;;;:::i;:::-;;;34248:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34494:13:0;;34490:272;;34537:60;;-1:-1:-1;;;34537:60:0;;;;;;;:::i;34490:272::-;34712:6;34706:13;34697:6;34693:2;34689:15;34682:38;34248:529;-1:-1:-1;;;;;;34375:51:0;-1:-1:-1;;;34375:51:0;;-1:-1:-1;34368:58:0;;34212:620;-1:-1:-1;34816:4:0;34040:799;;;;;;:::o;30840:382::-;-1:-1:-1;;;;;30920:16:0;;30912:61;;;;-1:-1:-1;;;30912:61:0;;17356:2:1;30912:61:0;;;17338:21:1;;;17375:18;;;17368:30;17434:34;17414:18;;;17407:62;17486:18;;30912:61:0;17154:356:1;30912:61:0;28927:4;28951:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28951:16:0;:30;30984:58;;;;-1:-1:-1;;;30984:58:0;;11732:2:1;30984:58:0;;;11714:21:1;11771:2;11751:18;;;11744:30;11810;11790:18;;;11783:58;11858:18;;30984:58:0;11530:352:1;30984:58:0;31055:45;31084:1;31088:2;31092:7;31055:20;:45::i;:::-;-1:-1:-1;;;;;31113:13:0;;;;;;:9;:13;;;;;:18;;31130:1;;31113:13;:18;;31130:1;;31113:18;:::i;:::-;;;;-1:-1:-1;;31142:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31142:21:0;-1:-1:-1;;;;;31142:21:0;;;;;;;;31181:33;;31142:16;;;31181:33;;31142:16;;31181:33;30840:382;;:::o;38034:589::-;-1:-1:-1;;;;;38240:18:0;;38236:187;;38275:40;38307:7;39450:10;:17;;39423:24;;;;:15;:24;;;;;:44;;;39478:24;;;;;;;;;;;;39346:164;38275:40;38236:187;;;38345:2;-1:-1:-1;;;;;38337:10:0;:4;-1:-1:-1;;;;;38337:10:0;;38333:90;;38364:47;38397:4;38403:7;38364:32;:47::i;:::-;-1:-1:-1;;;;;38437:16:0;;38433:183;;38470:45;38507:7;38470:36;:45::i;38433:183::-;38543:4;-1:-1:-1;;;;;38537:10:0;:2;-1:-1:-1;;;;;38537:10:0;;38533:83;;38564:40;38592:2;38596:7;38564:27;:40::i;40137:988::-;40403:22;40453:1;40428:22;40445:4;40428:16;:22::i;:::-;:26;;;;:::i;:::-;40465:18;40486:26;;;:17;:26;;;;;;40403:51;;-1:-1:-1;40619:28:0;;;40615:328;;-1:-1:-1;;;;;40686:18:0;;40664:19;40686:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40737:30;;;;;;:44;;;40854:30;;:17;:30;;;;;:43;;;40615:328;-1:-1:-1;41039:26:0;;;;:17;:26;;;;;;;;41032:33;;;-1:-1:-1;;;;;41083:18:0;;;;;:12;:18;;;;;:34;;;;;;;41076:41;40137:988::o;41420:1079::-;41698:10;:17;41673:22;;41698:21;;41718:1;;41698:21;:::i;:::-;41730:18;41751:24;;;:15;:24;;;;;;42124:10;:26;;41673:46;;-1:-1:-1;41751:24:0;;41673:46;;42124:26;;;;;;:::i;:::-;;;;;;;;;42102:48;;42188:11;42163:10;42174;42163:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;42268:28;;;:15;:28;;;;;;;:41;;;42440:24;;;;;42433:31;42475:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41491:1008;;;41420:1079;:::o;38924:221::-;39009:14;39026:20;39043:2;39026:16;:20::i;:::-;-1:-1:-1;;;;;39057:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39102:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38924:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;:::-;1134:39;993:186;-1:-1:-1;;;993:186:1:o;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:180::-;3027:6;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3119:26;3135:9;3119:26;:::i;3156:180::-;3215:6;3268:2;3256:9;3247:7;3243:23;3239:32;3236:52;;;3284:1;3281;3274:12;3236:52;-1:-1:-1;3307:23:1;;3156:180;-1:-1:-1;3156:180:1:o;3341:245::-;3399:6;3452:2;3440:9;3431:7;3427:23;3423:32;3420:52;;;3468:1;3465;3458:12;3420:52;3507:9;3494:23;3526:30;3550:5;3526:30;:::i;3591:249::-;3660:6;3713:2;3701:9;3692:7;3688:23;3684:32;3681:52;;;3729:1;3726;3719:12;3681:52;3761:9;3755:16;3780:30;3804:5;3780:30;:::i;3845:450::-;3914:6;3967:2;3955:9;3946:7;3942:23;3938:32;3935:52;;;3983:1;3980;3973:12;3935:52;4023:9;4010:23;4056:18;4048:6;4045:30;4042:50;;;4088:1;4085;4078:12;4042:50;4111:22;;4164:4;4156:13;;4152:27;-1:-1:-1;4142:55:1;;4193:1;4190;4183:12;4142:55;4216:73;4281:7;4276:2;4263:16;4258:2;4254;4250:11;4216:73;:::i;4485:683::-;4580:6;4588;4596;4649:2;4637:9;4628:7;4624:23;4620:32;4617:52;;;4665:1;4662;4655:12;4617:52;4701:9;4688:23;4678:33;;4762:2;4751:9;4747:18;4734:32;4785:18;4826:2;4818:6;4815:14;4812:34;;;4842:1;4839;4832:12;4812:34;4880:6;4869:9;4865:22;4855:32;;4925:7;4918:4;4914:2;4910:13;4906:27;4896:55;;4947:1;4944;4937:12;4896:55;4987:2;4974:16;5013:2;5005:6;5002:14;4999:34;;;5029:1;5026;5019:12;4999:34;5082:7;5077:2;5067:6;5064:1;5060:14;5056:2;5052:23;5048:32;5045:45;5042:65;;;5103:1;5100;5093:12;5042:65;5134:2;5130;5126:11;5116:21;;5156:6;5146:16;;;;;4485:683;;;;;:::o;5173:316::-;5250:6;5258;5266;5319:2;5307:9;5298:7;5294:23;5290:32;5287:52;;;5335:1;5332;5325:12;5287:52;-1:-1:-1;;5358:23:1;;;5428:2;5413:18;;5400:32;;-1:-1:-1;5479:2:1;5464:18;;;5451:32;;5173:316;-1:-1:-1;5173:316:1:o;5494:385::-;5580:6;5588;5596;5604;5657:3;5645:9;5636:7;5632:23;5628:33;5625:53;;;5674:1;5671;5664:12;5625:53;-1:-1:-1;;5697:23:1;;;5767:2;5752:18;;5739:32;;-1:-1:-1;5818:2:1;5803:18;;5790:32;;5869:2;5854:18;5841:32;;-1:-1:-1;5494:385:1;-1:-1:-1;5494:385:1:o;5884:257::-;5925:3;5963:5;5957:12;5990:6;5985:3;5978:19;6006:63;6062:6;6055:4;6050:3;6046:14;6039:4;6032:5;6028:16;6006:63;:::i;:::-;6123:2;6102:15;-1:-1:-1;;6098:29:1;6089:39;;;;6130:4;6085:50;;5884:257;-1:-1:-1;;5884:257:1:o;6146:185::-;6188:3;6226:5;6220:12;6241:52;6286:6;6281:3;6274:4;6267:5;6263:16;6241:52;:::i;:::-;6309:16;;;;;6146:185;-1:-1:-1;;6146:185:1:o;6940:1301::-;7217:3;7246:1;7279:6;7273:13;7309:3;7331:1;7359:9;7355:2;7351:18;7341:28;;7419:2;7408:9;7404:18;7441;7431:61;;7485:4;7477:6;7473:17;7463:27;;7431:61;7511:2;7559;7551:6;7548:14;7528:18;7525:38;7522:165;;;-1:-1:-1;;;7586:33:1;;7642:4;7639:1;7632:15;7672:4;7593:3;7660:17;7522:165;7703:18;7730:104;;;;7848:1;7843:320;;;;7696:467;;7730:104;-1:-1:-1;;7763:24:1;;7751:37;;7808:16;;;;-1:-1:-1;7730:104:1;;7843:320;22441:1;22434:14;;;22478:4;22465:18;;7938:1;7952:165;7966:6;7963:1;7960:13;7952:165;;;8044:14;;8031:11;;;8024:35;8087:16;;;;7981:10;;7952:165;;;7956:3;;8146:6;8141:3;8137:16;8130:23;;7696:467;;;;;;;8179:56;8204:30;8230:3;8222:6;8204:30;:::i;:::-;-1:-1:-1;;;6396:20:1;;6441:1;6432:11;;6336:113;8179:56;8172:63;6940:1301;-1:-1:-1;;;;;6940:1301:1:o;9201:488::-;-1:-1:-1;;;;;9470:15:1;;;9452:34;;9522:15;;9517:2;9502:18;;9495:43;9569:2;9554:18;;9547:34;;;9617:3;9612:2;9597:18;;9590:31;;;9395:4;;9638:45;;9663:19;;9655:6;9638:45;:::i;:::-;9630:53;9201:488;-1:-1:-1;;;;;;9201:488:1:o;10068:219::-;10217:2;10206:9;10199:21;10180:4;10237:44;10277:2;10266:9;10262:18;10254:6;10237:44;:::i;10704:414::-;10906:2;10888:21;;;10945:2;10925:18;;;10918:30;10984:34;10979:2;10964:18;;10957:62;-1:-1:-1;;;11050:2:1;11035:18;;11028:48;11108:3;11093:19;;10704:414::o;14461:397::-;14663:2;14645:21;;;14702:2;14682:18;;;14675:30;14741:34;14736:2;14721:18;;14714:62;-1:-1:-1;;;14807:2:1;14792:18;;14785:31;14848:3;14833:19;;14461:397::o;15288:354::-;15490:2;15472:21;;;15529:2;15509:18;;;15502:30;15568:32;15563:2;15548:18;;15541:60;15633:2;15618:18;;15288:354::o;16808:341::-;17010:2;16992:21;;;17049:2;17029:18;;;17022:30;-1:-1:-1;;;17083:2:1;17068:18;;17061:47;17140:2;17125:18;;16808:341::o;18274:356::-;18476:2;18458:21;;;18495:18;;;18488:30;18554:34;18549:2;18534:18;;18527:62;18621:2;18606:18;;18274:356::o;19461:341::-;19663:2;19645:21;;;19702:2;19682:18;;;19675:30;-1:-1:-1;;;19736:2:1;19721:18;;19714:47;19793:2;19778:18;;19461:341::o;20209:413::-;20411:2;20393:21;;;20450:2;20430:18;;;20423:30;20489:34;20484:2;20469:18;;20462:62;-1:-1:-1;;;20555:2:1;20540:18;;20533:47;20612:3;20597:19;;20209:413::o;20627:397::-;20829:2;20811:21;;;20868:2;20848:18;;;20841:30;20907:34;20902:2;20887:18;;20880:62;-1:-1:-1;;;20973:2:1;20958:18;;20951:31;21014:3;20999:19;;20627:397::o;22494:128::-;22534:3;22565:1;22561:6;22558:1;22555:13;22552:39;;;22571:18;;:::i;:::-;-1:-1:-1;22607:9:1;;22494:128::o;22627:120::-;22667:1;22693;22683:35;;22698:18;;:::i;:::-;-1:-1:-1;22732:9:1;;22627:120::o;22752:168::-;22792:7;22858:1;22854;22850:6;22846:14;22843:1;22840:21;22835:1;22828:9;22821:17;22817:45;22814:71;;;22865:18;;:::i;:::-;-1:-1:-1;22905:9:1;;22752:168::o;22925:125::-;22965:4;22993:1;22990;22987:8;22984:34;;;22998:18;;:::i;:::-;-1:-1:-1;23035:9:1;;22925:125::o;23055:258::-;23127:1;23137:113;23151:6;23148:1;23145:13;23137:113;;;23227:11;;;23221:18;23208:11;;;23201:39;23173:2;23166:10;23137:113;;;23268:6;23265:1;23262:13;23259:48;;;-1:-1:-1;;23303:1:1;23285:16;;23278:27;23055:258::o;23318:136::-;23357:3;23385:5;23375:39;;23394:18;;:::i;:::-;-1:-1:-1;;;23430:18:1;;23318:136::o;23459:380::-;23538:1;23534:12;;;;23581;;;23602:61;;23656:4;23648:6;23644:17;23634:27;;23602:61;23709:2;23701:6;23698:14;23678:18;23675:38;23672:161;;;23755:10;23750:3;23746:20;23743:1;23736:31;23790:4;23787:1;23780:15;23818:4;23815:1;23808:15;23672:161;;23459:380;;;:::o;23844:135::-;23883:3;-1:-1:-1;;23904:17:1;;23901:43;;;23924:18;;:::i;:::-;-1:-1:-1;23971:1:1;23960:13;;23844:135::o;23984:112::-;24016:1;24042;24032:35;;24047:18;;:::i;:::-;-1:-1:-1;24081:9:1;;23984:112::o;24101:127::-;24162:10;24157:3;24153:20;24150:1;24143:31;24193:4;24190:1;24183:15;24217:4;24214:1;24207:15;24233:127;24294:10;24289:3;24285:20;24282:1;24275:31;24325:4;24322:1;24315:15;24349:4;24346:1;24339:15;24365:127;24426:10;24421:3;24417:20;24414:1;24407:31;24457:4;24454:1;24447:15;24481:4;24478:1;24471:15;24497:127;24558:10;24553:3;24549:20;24546:1;24539:31;24589:4;24586:1;24579:15;24613:4;24610:1;24603:15;24629:127;24690:10;24685:3;24681:20;24678:1;24671:31;24721:4;24718:1;24711:15;24745:4;24742:1;24735:15;24761:131;-1:-1:-1;;;;;;24835:32:1;;24825:43;;24815:71;;24882:1;24879;24872:12

Swarm Source

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