FTM Price: $1.26 (-4.74%)
Gas: 3.5 GWei
 

Overview

Max Total Supply

428 MOWSE

Holders

188

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Balance
0 MOWSE
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
MowsePack

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at ftmscan.com on 2021-09-09
*/

// Sources flattened with hardhat v2.6.2 https://hardhat.org

// SPDX-License-Identifier: MIT

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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;

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

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

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

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

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


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

pragma solidity ^0.8.0;

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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.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 {}
}


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}


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

pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


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

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}


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

pragma solidity ^0.8.0;



/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {grantRole} to track enumerable memberships
     */
    function grantRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {revokeRole} to track enumerable memberships
     */
    function revokeRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.revokeRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {renounceRole} to track enumerable memberships
     */
    function renounceRole(bytes32 role, address account) public virtual override(AccessControl, IAccessControl) {
        super.renounceRole(role, account);
        _roleMembers[role].remove(account);
    }

    /**
     * @dev Overload {_setupRole} to track enumerable memberships
     */
    function _setupRole(bytes32 role, address account) internal virtual override {
        super._setupRole(role, account);
        _roleMembers[role].add(account);
    }
}


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

pragma solidity ^0.8.0;

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

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

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

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

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


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

pragma solidity ^0.8.0;







/**
 * @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract ERC721PresetMinterPauserAutoId is
    Context,
    AccessControlEnumerable,
    ERC721Enumerable,
    ERC721Burnable,
    ERC721Pausable
{
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    Counters.Counter private _tokenIdTracker;

    string private _baseTokenURI;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;

        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

        _setupRole(MINTER_ROLE, _msgSender());
        _setupRole(PAUSER_ROLE, _msgSender());
    }

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

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     * See {ERC721-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    function mint(address to) public virtual {
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");

        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _mint(to, _tokenIdTracker.current());
        _tokenIdTracker.increment();
    }

    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
        _unpause();
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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


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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File contracts/interfaces/IMowsePack.sol
pragma solidity ^0.8.7;



interface IMowsePack is IERC721, IERC2981 {
    event MowseMinted(address indexed owner, uint256 indexed quantity);
    event MetadataVisualizerUpdated(
        uint256 indexed tokenId,
        address indexed newVisualizer,
        address indexed oldVisualizer
    );
    event MetadataVisualizerDisabled(uint256 indexed tokenId, address indexed previousVisualizer);

    event MetadataVisualizerActive(bool newState, bool oldState);
    event MetadataVisualizerAllowed(address indexed visualizer, bool newState, bool oldState);
    event MarketplaceUpdated(address indexed marketplace, bool newStatus, bool oldStatus);

    function mintMowse(uint8 quantity) external payable;

    function giftMowse(address to, uint256 id) external;

    function setMetadataVisualizer(uint256 tokenId, address visualizer) external;

    function disableMetadataVisualizer(uint256 tokenId) external;

    function tokenPermanentURI(uint256 tokenId) external returns (string memory);
}


// File contracts/interfaces/IMowseMetadataVisualizer.sol
pragma solidity ^0.8.7;

interface IMowseMetadataVisualizer {
    function getMowseTokenUri(uint256 mowseId) external view returns (string memory tokenURI);
}


// File contracts/MowsePack.sol
pragma solidity ^0.8.7;








contract MowsePack is IMowsePack, ERC721PresetMinterPauserAutoId, Ownable, ReentrancyGuard {
    using Strings for uint256;
    using Counters for Counters.Counter;

    uint8 public constant MINT_PER_TX = 10;
    uint16 public immutable MINT_MAX;
    uint256 public constant MINT_PRICE = 100 ether;
    uint256 public immutable MINT_START;

    uint16 public constant BASE = 10000;

    uint16 private royalty = 500; // base 10000, 5%

    address[] private recipients;
    uint256[] private splits;

    mapping(address => bool) private marketplaces;
    mapping(address => bool) private allowedMetadataVisualizers;
    mapping(uint256 => address) private visualizers;
    address defaultMetadataVisualizerAddress;
    bool private active;

    string private suffixTokenURI;

    Counters.Counter private _tokenIds;

    modifier mustExist(uint256 _tokenId) {
        require(_exists(_tokenId), 'This Mowse does not exist.');
        _;
    }

    modifier onlyHolder(uint256 _tokenId) {
        require(msg.sender == ownerOf(_tokenId), 'You must be the owner to set a Mowse metadata visualizer.');
        _;
    }

    /// @notice set the base URI, gift token reservations, and payment manager
    /// @param _baseTokenURI base URI for the Mowse metadata
    /// @param _suffixTokenURI suffix URI for the Mowse metadata
    /// @param _mintStartTime number of Mowse reserved for gifts
    /// @param _gifts number of Mowse reserved for gifts
    /// @param _recipients payout recipients
    /// @param _splits payout splits
    constructor(
        string memory _baseTokenURI,
        string memory _suffixTokenURI,
        uint16 _maxSupply,
        uint256 _mintStartTime,
        uint8 _gifts,
        address[] memory _recipients,
        uint256[] memory _splits
    ) ERC721PresetMinterPauserAutoId('MowsePack', 'MOWSE', _baseTokenURI) {
        // skip the ID for the reserved tokens
        for (; _tokenIds.current() < _gifts; _tokenIds.increment()) {}

        // used if the metadata URI has a suffix
        suffixTokenURI = _suffixTokenURI;

        // set the max supply
        MINT_MAX = _maxSupply;

        // set the start time, this is immutable
        MINT_START = _mintStartTime;

        // configure fee sharing
        uint256 _total = 0;
        for (uint256 i = 0; i < _splits.length; i++) {
            _total += _splits[i];
        }
        require(_total == BASE, 'Total must be equal to 100%');
        recipients = _recipients;
        splits = _splits;

        // default to paused state
        pause();
    }

    /// @notice Mint some mowse
    /// @param _quantity quantity of mowse to mint
    function mintMowse(uint8 _quantity) external payable override {
        require(MINT_PER_TX >= _quantity, 'Too many Mowse for this transaction.');
        require(MINT_PRICE * _quantity == msg.value, 'Not the right payment for all these Mowse.');
        require(MINT_START <= block.timestamp, 'Mowse minting has not started yet.');

        // mint the mowse
        for (uint256 _i = 0; _i < _quantity; _i++) {
            _tokenIds.increment();
            _safeMint(msg.sender, _tokenIds.current());
        }

        emit MowseMinted(msg.sender, _quantity);
    }

    /// @notice Gift a Mowse from the reserved set
    /// @dev Only the owner can call this method
    /// @param _to the address to gift the Mowse to
    /// @param _tokenId the token ID of the Mowse to gift
    function giftMowse(address _to, uint256 _tokenId) external override {
        require(hasRole(MINTER_ROLE, _msgSender()), 'Only minters can gift Mowse.');
        require(!_exists(_tokenId), 'This Mowse id already has an owner.');
        require(_tokenId < _tokenIds.current(), 'This Mowse cannot be gifted.');

        _safeMint(_to, _tokenId);
    }

    /// @notice Minting is only allowed through the mintMowse and giftMowse functions
    /// @dev only allow minting through safe mint
    function mint(address) public pure override {
        require(false, 'You must mintMowse().');
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 _tokenId) public view virtual override mustExist(_tokenId) returns (string memory) {
        // check to see if visualizers are active, enabled for this address, and allowed
        if (active && visualizers[_tokenId] != address(0) && allowedMetadataVisualizers[visualizers[_tokenId]]) {
            // do the thing
            return _getMowseMetadataVisualizer(_tokenId).getMowseTokenUri(_tokenId);
        }
        // default to the base URI
        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, _tokenId.toString(), suffixTokenURI)) : '';
    }

    /// @notice Shows the base metadata URI for the Mowse
    /// @dev This is the original metadata published with the contract
    function tokenPermanentURI(uint256 _tokenId) public view override mustExist(_tokenId) returns (string memory) {
        // default to the base URI
        return super.tokenURI(_tokenId);
    }

    /**
     * Override isApprovedForAll to whitelisted marketplaces to enable listings without needing approval.
     * Just makes it easier for users.
     */
    function isApprovedForAll(address _owner, address _operator)
        public
        view
        override(ERC721, IERC721)
        returns (bool isOperator)
    {
        if (marketplaces[_operator]) {
            return true;
        }

        return super.isApprovedForAll(_owner, _operator);
    }

    /// @dev Support for IERC-2981, royalties
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(IERC165, ERC721PresetMinterPauserAutoId)
        returns (bool)
    {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /// @notice Calculate the royalty payment
    /// @param _salePrice the sale price of the token
    function royaltyInfo(uint256, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (address(this), (_salePrice * royalty) / BASE);
    }

    /* HOLDER */

    /// @notice Set the metadata visualizer for a Mowse
    /// @dev Only the token owner can call this method
    /// @param _tokenId the token ID of the Mowse to set the metadata visualizer for
    /// @param _visualizer the address of the metadata visualizer
    function setMetadataVisualizer(uint256 _tokenId, address _visualizer)
        external
        override
        mustExist(_tokenId)
        onlyHolder(_tokenId)
    {
        require(allowedMetadataVisualizers[_visualizer], 'This metadata visualizer is not allowed.');

        emit MetadataVisualizerUpdated(_tokenId, _visualizer, visualizers[_tokenId]);

        visualizers[_tokenId] = _visualizer;
    }

    /// @notice Disable the metadata visualizer for a Mowse
    /// @dev Only the token owner can call this method
    /// @param _tokenId the token ID of the Mowse to disable the metadata visualizer for
    function disableMetadataVisualizer(uint256 _tokenId) external override mustExist(_tokenId) onlyHolder(_tokenId) {
        emit MetadataVisualizerDisabled(_tokenId, visualizers[_tokenId]);

        delete visualizers[_tokenId];
    }

    /* OWNER */

    /// @notice set the token URI functionality active state
    /// @dev Only the owner can call this method
    /// @param _active whether or not the token URI functionality is active
    function setActive(bool _active) external onlyOwner {
        emit MetadataVisualizerActive(_active, active);

        active = _active;
    }

    /// @notice set the whitelisted marketplace contract addresses
    /// @dev Only the owner can call this method
    /// @param _marketplace the marketplace contract address to whitelist
    /// @param _allowed the whitelist status
    function setMarketplace(address _marketplace, bool _allowed) external onlyOwner {
        emit MarketplaceUpdated(_marketplace, _allowed, marketplaces[_marketplace]);

        marketplaces[_marketplace] = _allowed;
    }

    /// @notice set the visualizers whitelisted state
    /// @dev Only the owner can call this method
    /// @param _visualizer the metadata visualizer address to whitelist
    /// @param _allowed the whitelist status
    function setAllowedMetadataVisualizer(address _visualizer, bool _allowed) external onlyOwner {
        emit MetadataVisualizerAllowed(_visualizer, _allowed, allowedMetadataVisualizers[_visualizer]);

        allowedMetadataVisualizers[_visualizer] = _allowed;
    }

    /// @dev set the ROYALTY
    /// @param _royalty the ROYALTY
    function setRoyalty(uint16 _royalty) external onlyOwner {
        require(_royalty >= 0, 'Royalty must be greater than or equal to 0%');
        require(_royalty <= 750, 'Royalty must be greater than or equal to 7.5%');

        royalty = _royalty;
    }

    /// @dev get balance in native currency of this contract
    function balance() external view returns (uint256) {
        return address(this).balance;
    }

    /// @dev withdraw native tokens divided by splits
    function withdraw() external nonReentrant {
        uint256 _amount = address(this).balance;
        for (uint256 i = 0; i < recipients.length; i++) {
            (bool sent, ) = payable(recipients[i]).call{value: (_amount * splits[i]) / BASE}('');
            require(sent, 'Failed to send payment');
        }
    }

    /// @dev withdraw ERC20 tokens divided by splits
    function withdrawTokens(address _tokenContract) external nonReentrant {
        IERC20 tokenContract = IERC20(_tokenContract);

        // transfer the token from address of this contract
        uint256 _amount = tokenContract.balanceOf(address(this));
        for (uint256 i = 0; i < recipients.length; i++) {
            tokenContract.transfer(recipients[i], (_amount * splits[i]) / BASE);
        }
    }

    /// @dev withdraw ERC721 tokens to the contract owner
    function withdrawNFT(address _tokenContract, uint256[] memory _id) external nonReentrant {
        IERC721 tokenContract = IERC721(_tokenContract);
        for (uint256 i = 0; i < _id.length; i++) {
            tokenContract.safeTransferFrom(address(this), this.owner(), _id[i]);
        }
    }

    /* PRIVATE */

    /// @dev get the metadata visualizer for a Mowse
    /// @param _tokenId the token ID of the Mowse to get the metadata visualizer for
    function _getMowseMetadataVisualizer(uint256 _tokenId) private view returns (IMowseMetadataVisualizer) {
        if (visualizers[_tokenId] != address(0) && allowedMetadataVisualizers[visualizers[_tokenId]]) {
            return IMowseMetadataVisualizer(visualizers[_tokenId]);
        }
        return IMowseMetadataVisualizer(defaultMetadataVisualizerAddress);
    }

    /// @dev override to check the max supply when minting
    function _mint(address to, uint256 _id) internal override {
        require(_id <= MINT_MAX, 'All the Mowse are minted.');
        super._mint(to, _id);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"string","name":"_suffixTokenURI","type":"string"},{"internalType":"uint16","name":"_maxSupply","type":"uint16"},{"internalType":"uint256","name":"_mintStartTime","type":"uint256"},{"internalType":"uint8","name":"_gifts","type":"uint8"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_splits","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"marketplace","type":"address"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"oldStatus","type":"bool"}],"name":"MarketplaceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"newState","type":"bool"},{"indexed":false,"internalType":"bool","name":"oldState","type":"bool"}],"name":"MetadataVisualizerActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"visualizer","type":"address"},{"indexed":false,"internalType":"bool","name":"newState","type":"bool"},{"indexed":false,"internalType":"bool","name":"oldState","type":"bool"}],"name":"MetadataVisualizerAllowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"previousVisualizer","type":"address"}],"name":"MetadataVisualizerDisabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newVisualizer","type":"address"},{"indexed":true,"internalType":"address","name":"oldVisualizer","type":"address"}],"name":"MetadataVisualizerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"MowseMinted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_MAX","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PER_TX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"disableMetadataVisualizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"giftMowse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mint","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantity","type":"uint8"}],"name":"mintMowse","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_active","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_visualizer","type":"address"},{"internalType":"bool","name":"_allowed","type":"bool"}],"name":"setAllowedMetadataVisualizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"bool","name":"_allowed","type":"bool"}],"name":"setMarketplace","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_visualizer","type":"address"}],"name":"setMetadataVisualizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","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":"tokenPermanentURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256[]","name":"_id","type":"uint256[]"}],"name":"withdrawNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526011805461ffff19166101f41790553480156200002057600080fd5b50604051620050ee380380620050ee8339810160408190526200004391620008ca565b604051806040016040528060098152602001684d6f7773655061636b60b81b815250604051806040016040528060058152602001644d4f57534560d81b81525088828281600290805190602001906200009e929190620005cb565b508051620000b4906003906020840190620005cb565b5050600c805460ff19169055508051620000d690600e906020840190620005cb565b50620000e4600033620002ba565b620001107f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620002ba565b6200013c7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620002ba565b5050506200015962000153620002b660201b60201c565b620002fd565b60016010555b8260ff166200017a60196200034f60201b620027911760201c565b10156200019e576200019860196200035360201b620027951760201c565b6200015f565b8551620001b3906018906020890190620005cb565b506001600160f01b031960f086901b1660805260a08490526000805b82518110156200021a57828181518110620001ee57620001ee62000a97565b60200260200101518262000203919062000a0b565b915080620002118162000a63565b915050620001cf565b506127108114620002725760405162461bcd60e51b815260206004820152601b60248201527f546f74616c206d75737420626520657175616c20746f2031303025000000000060448201526064015b60405180910390fd5b8251620002879060129060208601906200065a565b5081516200029d906013906020850190620006b2565b50620002a86200035c565b505050505050505062000ac3565b3390565b620002d182826200040e60201b6200279e1760201c565b6000828152600160209081526040909120620002f8918390620027a86200041e821b17901c565b505050565b600f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b5490565b80546001019055565b3360009081527ff7c9542c591017a21c74b6f3fab6263c7952fc0aaf9db4c22a2a04ddc7f8674f602052604090205460ff16620004025760405162461bcd60e51b815260206004820152603e60248201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060448201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000606482015260840162000269565b6200040c6200043e565b565b6200041a8282620004d9565b5050565b600062000435836001600160a01b03841662000579565b90505b92915050565b600c5460ff1615620004865760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000269565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004bc3390565b6040516001600160a01b03909116815260200160405180910390a1565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200041a576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620005353390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000818152600183016020526040812054620005c25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000438565b50600062000438565b828054620005d99062000a26565b90600052602060002090601f016020900481019282620005fd576000855562000648565b82601f106200061857805160ff191683800117855562000648565b8280016001018555821562000648579182015b82811115620006485782518255916020019190600101906200062b565b5062000656929150620006ef565b5090565b82805482825590600052602060002090810192821562000648579160200282015b828111156200064857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200067b565b828054828255906000526020600020908101928215620006485791602002820182811115620006485782518255916020019190600101906200062b565b5b80821115620006565760008155600101620006f0565b600082601f8301126200071857600080fd5b81516020620007316200072b83620009e5565b620009b2565b80838252828201915082860187848660051b89010111156200075257600080fd5b6000805b86811015620007895782516001600160a01b038116811462000776578283fd5b8552938501939185019160010162000756565b509198975050505050505050565b600082601f830112620007a957600080fd5b81516020620007bc6200072b83620009e5565b80838252828201915082860187848660051b8901011115620007dd57600080fd5b60005b85811015620007fe57815184529284019290840190600101620007e0565b5090979650505050505050565b600082601f8301126200081d57600080fd5b81516001600160401b0381111562000839576200083962000aad565b60206200084f601f8301601f19168201620009b2565b82815285828487010111156200086457600080fd5b60005b838110156200088457858101830151828201840152820162000867565b83811115620008965760008385840101525b5095945050505050565b805161ffff81168114620008b357600080fd5b919050565b805160ff81168114620008b357600080fd5b600080600080600080600060e0888a031215620008e657600080fd5b87516001600160401b0380821115620008fe57600080fd5b6200090c8b838c016200080b565b985060208a01519150808211156200092357600080fd5b620009318b838c016200080b565b97506200094160408b01620008a0565b965060608a015195506200095860808b01620008b8565b945060a08a01519150808211156200096f57600080fd5b6200097d8b838c0162000706565b935060c08a01519150808211156200099457600080fd5b50620009a38a828b0162000797565b91505092959891949750929550565b604051601f8201601f191681016001600160401b0381118282101715620009dd57620009dd62000aad565b604052919050565b60006001600160401b0382111562000a015762000a0162000aad565b5060051b60200190565b6000821982111562000a215762000a2162000a81565b500190565b600181811c9082168062000a3b57607f821691505b6020821081141562000a5d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141562000a7a5762000a7a62000a81565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160f01c60a0516145f462000afa600039600081816109020152611884015260008181610781015261369c01526145f46000f3fe60806040526004361061034a5760003560e01c80637419e77a116101bb578063b69ef8a8116100f7578063d539139311610095578063e985e9c51161006f578063e985e9c5146109ec578063ec342ad014610a0c578063ed967e1a14610a22578063f2fde38b14610a4957600080fd5b8063d539139314610964578063d547741f14610998578063e63ab1e9146109b857600080fd5b8063c0e16ec7116100d1578063c0e16ec7146108d0578063c6374d0c146108f0578063c87b56dd14610924578063ca15c8731461094457600080fd5b8063b69ef8a814610880578063b88d4fde14610893578063c002d23d146108b357600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610800578063a4033e7914610820578063aacad0bf14610840578063acec338a1461086057600080fd5b806395d89b41146107b65780639bdedea5146107cb578063a217fddf146107eb57600080fd5b80639010d07c116101955780639010d07c1461070b57806391d148541461072b57806395183a081461076f57600080fd5b80637419e77a146106b85780638456cb59146106d85780638da5cb5b146106ed57600080fd5b806336e79a5a1161028a5780634f6ccce71161023357806365008f251161020d57806365008f25146106505780636a6278421461066357806370a0823114610683578063715018a6146106a357600080fd5b80634f6ccce7146105f85780635c975abb146106185780636352211e1461063057600080fd5b806342842e0e1161026457806342842e0e1461059857806342966c68146105b857806349df728c146105d857600080fd5b806336e79a5a1461054e5780633ccfd60b1461056e5780633f4ba83a1461058357600080fd5b806323b872dd116102f75780632a55205a116102d15780632a55205a146104af5780632f2ff15d146104ee5780632f745c591461050e57806336568abe1461052e57600080fd5b806323b872dd1461043f578063248a9ca31461045f578063254caa7e1461048f57600080fd5b8063095ea7b311610328578063095ea7b3146103de57806314493b921461040057806318160ddd1461042057600080fd5b806301ffc9a71461034f57806306fdde0314610384578063081812fc146103a6575b600080fd5b34801561035b57600080fd5b5061036f61036a3660046140b5565b610a69565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b50610399610aad565b60405161037b91906143a2565b3480156103b257600080fd5b506103c66103c1366004614055565b610b3f565b6040516001600160a01b03909116815260200161037b565b3480156103ea57600080fd5b506103fe6103f9366004613fef565b610bd9565b005b34801561040c57600080fd5b506103fe61041b366004613fef565b610d0b565b34801561042c57600080fd5b50600a545b60405190815260200161037b565b34801561044b57600080fd5b506103fe61045a366004613e0f565b610e6b565b34801561046b57600080fd5b5061043161047a366004614055565b60009081526020819052604090206001015490565b34801561049b57600080fd5b506103996104aa366004614055565b610ef3565b3480156104bb57600080fd5b506104cf6104ca366004614093565b610f75565b604080516001600160a01b03909316835260208301919091520161037b565b3480156104fa57600080fd5b506103fe61050936600461406e565b610fa6565b34801561051a57600080fd5b50610431610529366004613fef565b610fc8565b34801561053a57600080fd5b506103fe61054936600461406e565b611070565b34801561055a57600080fd5b506103fe610569366004614166565b611092565b34801561057a57600080fd5b506103fe611180565b34801561058f57600080fd5b506103fe6112fa565b3480156105a457600080fd5b506103fe6105b3366004613e0f565b6113a2565b3480156105c457600080fd5b506103fe6105d3366004614055565b6113bd565b3480156105e457600080fd5b506103fe6105f3366004613d9c565b611444565b34801561060457600080fd5b50610431610613366004614055565b61164f565b34801561062457600080fd5b50600c5460ff1661036f565b34801561063c57600080fd5b506103c661064b366004614055565b6116f3565b6103fe61065e3660046141a3565b61177e565b34801561066f57600080fd5b506103fe61067e366004613d9c565b61198b565b34801561068f57600080fd5b5061043161069e366004613d9c565b6119d3565b3480156106af57600080fd5b506103fe611a6d565b3480156106c457600080fd5b506103fe6106d3366004613fc1565b611ad1565b3480156106e457600080fd5b506103fe611bb9565b3480156106f957600080fd5b50600f546001600160a01b03166103c6565b34801561071757600080fd5b506103c6610726366004614093565b611c5d565b34801561073757600080fd5b5061036f61074636600461406e565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561077b57600080fd5b506107a37f000000000000000000000000000000000000000000000000000000000000000081565b60405161ffff909116815260200161037b565b3480156107c257600080fd5b50610399611c7c565b3480156107d757600080fd5b506103fe6107e6366004613eff565b611c8b565b3480156107f757600080fd5b50610431600081565b34801561080c57600080fd5b506103fe61081b366004613fc1565b611e08565b34801561082c57600080fd5b506103fe61083b366004614055565b611ecd565b34801561084c57600080fd5b506103fe61085b366004613fc1565b612027565b34801561086c57600080fd5b506103fe61087b36600461401b565b61210f565b34801561088c57600080fd5b5047610431565b34801561089f57600080fd5b506103fe6108ae366004613e50565b6121eb565b3480156108bf57600080fd5b5061043168056bc75e2d6310000081565b3480156108dc57600080fd5b506103fe6108eb36600461406e565b612279565b3480156108fc57600080fd5b506104317f000000000000000000000000000000000000000000000000000000000000000081565b34801561093057600080fd5b5061039961093f366004614055565b612475565b34801561095057600080fd5b5061043161095f366004614055565b61263a565b34801561097057600080fd5b506104317f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109a457600080fd5b506103fe6109b336600461406e565b612651565b3480156109c457600080fd5b506104317f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b3480156109f857600080fd5b5061036f610a07366004613dd6565b61265b565b348015610a1857600080fd5b506107a361271081565b348015610a2e57600080fd5b50610a37600a81565b60405160ff909116815260200161037b565b348015610a5557600080fd5b506103fe610a64366004613d9c565b6126b2565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610aa75750610aa7826127bd565b92915050565b606060028054610abc906144b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae8906144b3565b8015610b355780601f10610b0a57610100808354040283529160200191610b35565b820191906000526020600020905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b0316610bbd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610be4826116f3565b9050806001600160a01b0316836001600160a01b03161415610c6e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b336001600160a01b0382161480610c8a5750610c8a813361265b565b610cfc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bb4565b610d0683836127c8565b505050565b610d357f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610746565b610d815760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c79206d696e746572732063616e2067696674204d6f7773652e000000006044820152606401610bb4565b6000818152600460205260409020546001600160a01b031615610e0c5760405162461bcd60e51b815260206004820152602360248201527f54686973204d6f77736520696420616c72656164792068617320616e206f776e60448201527f65722e00000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b6019548110610e5d5760405162461bcd60e51b815260206004820152601c60248201527f54686973204d6f7773652063616e6e6f74206265206769667465642e000000006044820152606401610bb4565b610e678282612836565b5050565b610e76335b82612850565b610ee85760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610bb4565b610d0683838361291f565b606081610f17816000908152600460205260409020546001600160a01b0316151590565b610f635760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b610f6c83612af7565b91505b50919050565b6011546000908190309061271090610f919061ffff168661443a565b610f9b9190614426565b915091509250929050565b610fb08282612bdf565b6000828152600160205260409020610d0690826127a8565b6000610fd3836119d3565b82106110475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610bb4565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b61107a8282612c05565b6000828152600160205260409020610d069082612c8d565b600f546001600160a01b031633146110ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6102ee8161ffff1611156111685760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479206d7573742062652067726561746572207468616e206f722060448201527f657175616c20746f20372e3525000000000000000000000000000000000000006064820152608401610bb4565b6011805461ffff191661ffff92909216919091179055565b600260105414156111d35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb4565b60026010554760005b6012548110156112f1576000601282815481106111fb576111fb614559565b600091825260209091200154601380546001600160a01b039092169161271091908590811061122c5761122c614559565b906000526020600020015485611242919061443a565b61124c9190614426565b604051600081818185875af1925050503d8060008114611288576040519150601f19603f3d011682016040523d82523d6000602084013e61128d565b606091505b50509050806112de5760405162461bcd60e51b815260206004820152601660248201527f4661696c656420746f2073656e64207061796d656e74000000000000000000006044820152606401610bb4565b50806112e9816144e8565b9150506111dc565b50506001601055565b6113247f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610746565b611398576040805162461bcd60e51b81526020600482015260248101919091527f4552433732315072657365744d696e7465725061757365724175746f49643a2060448201527f6d75737420686176652070617573657220726f6c6520746f20756e70617573656064820152608401610bb4565b6113a0612ca2565b565b610d06838383604051806020016040528060008152506121eb565b6113c633610e70565b6114385760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610bb4565b61144181612d3e565b50565b600260105414156114975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb4565b60026010556040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b1580156114f957600080fd5b505afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611531919061418a565b905060005b60125481101561164457826001600160a01b031663a9059cbb6012838154811061156257611562614559565b600091825260209091200154601380546001600160a01b039092169161271091908690811061159357611593614559565b9060005260206000200154866115a9919061443a565b6115b39190614426565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156115f957600080fd5b505af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190614038565b508061163c816144e8565b915050611536565b505060016010555050565b600061165a600a5490565b82106116ce5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610bb4565b600a82815481106116e1576116e1614559565b90600052602060002001549050919050565b6000818152600460205260408120546001600160a01b031680610aa75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610bb4565b60ff8116600a10156117f75760405162461bcd60e51b8152602060048201526024808201527f546f6f206d616e79204d6f77736520666f722074686973207472616e7361637460448201527f696f6e2e000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b3461180e60ff831668056bc75e2d6310000061443a565b146118815760405162461bcd60e51b815260206004820152602a60248201527f4e6f7420746865207269676874207061796d656e7420666f7220616c6c20746860448201527f657365204d6f7773652e000000000000000000000000000000000000000000006064820152608401610bb4565b427f000000000000000000000000000000000000000000000000000000000000000011156119175760405162461bcd60e51b815260206004820152602260248201527f4d6f777365206d696e74696e6720686173206e6f74207374617274656420796560448201527f742e0000000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b60005b8160ff1681101561195757611933601980546001019055565b6119453361194060195490565b612836565b8061194f816144e8565b91505061191a565b5060405160ff82169033907f5df4bf3bb30ff4eed9ff314620223d9982a1588fc3c57a63147c6b455db3057490600090a350565b60405162461bcd60e51b815260206004820152601560248201527f596f75206d757374206d696e744d6f77736528292e00000000000000000000006044820152606401610bb4565b60006001600160a01b038216611a515760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610bb4565b506001600160a01b031660009081526005602052604090205490565b600f546001600160a01b03163314611ac75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6113a06000612de5565b600f546001600160a01b03163314611b2b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6001600160a01b038216600081815260146020526040908190205490517f7822b3406af3f881636357828dff400888d9dc4441f7a9471688613318e66f4991611b8691859160ff169091151582521515602082015260400190565b60405180910390a26001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b611be37f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610746565b611c555760405162461bcd60e51b815260206004820152603e60248201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060448201527f6d75737420686176652070617573657220726f6c6520746f20706175736500006064820152608401610bb4565b6113a0612e37565b6000828152600160205260408120611c759083612ebf565b9392505050565b606060038054610abc906144b3565b60026010541415611cde5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb4565b60026010558160005b825181101561164457816001600160a01b03166342842e0e30306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3957600080fd5b505afa158015611d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d719190613db9565b868581518110611d8357611d83614559565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050508080611e00906144e8565b915050611ce7565b6001600160a01b038216331415611e615760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bb4565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008181526004602052604090205481906001600160a01b0316611f335760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b81611f3d816116f3565b6001600160a01b0316336001600160a01b031614611fc35760405162461bcd60e51b815260206004820152603960248201527f596f75206d75737420626520746865206f776e657220746f207365742061204d60448201527f6f777365206d657461646174612076697375616c697a65722e000000000000006064820152608401610bb4565b6000838152601660205260408082205490516001600160a01b039091169185917f455b1eed85683980a9a6314efb8d51de526a792a48b7a243d03afe72ba5be7469190a35050600090815260166020526040902080546001600160a01b0319169055565b600f546001600160a01b031633146120815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6001600160a01b038216600081815260156020526040908190205490517f64c356337f631cc47beae36a0f9eb803ed882801a756300159513ced60ef3171916120dc91859160ff169091151582521515602082015260400190565b60405180910390a26001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600f546001600160a01b031633146121695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b601754604080518315158152600160a01b90920460ff16151560208301527fa33ddaa6d1d3eda04afb55a0f9d9375305ab0d79809c49fc1f093dd009fae39f910160405180910390a160178054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6121f53383612850565b6122675760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610bb4565b61227384848484612ecb565b50505050565b60008281526004602052604090205482906001600160a01b03166122df5760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b826122e9816116f3565b6001600160a01b0316336001600160a01b03161461236f5760405162461bcd60e51b815260206004820152603960248201527f596f75206d75737420626520746865206f776e657220746f207365742061204d60448201527f6f777365206d657461646174612076697375616c697a65722e000000000000006064820152608401610bb4565b6001600160a01b03831660009081526015602052604090205460ff166123fd5760405162461bcd60e51b815260206004820152602860248201527f54686973206d657461646174612076697375616c697a6572206973206e6f742060448201527f616c6c6f7765642e0000000000000000000000000000000000000000000000006064820152608401610bb4565b6000848152601660205260408082205490516001600160a01b03918216929186169187917f04dc7856d7a752700ba076ec7bcff513f95a3d405ec3c68b536897d219bbf3c69190a4505060009182526016602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b606081612499816000908152600460205260409020546001600160a01b0316151590565b6124e55760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b601754600160a01b900460ff16801561251457506000838152601660205260409020546001600160a01b031615155b801561254457506000838152601660209081526040808320546001600160a01b03168352601590915290205460ff165b156125da5761255283612f49565b6001600160a01b03166382141454846040518263ffffffff1660e01b815260040161257f91815260200190565b60006040518083038186803b15801561259757600080fd5b505afa1580156125ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125d391908101906140ef565b9150610f6f565b60006125e4612fc5565b905060008151116126045760405180602001604052806000815250612632565b8061260e85612fd4565b601860405160200161262293929190614221565b6040516020818303038152906040525b949350505050565b6000818152600160205260408120610aa7906130d2565b61107a82826130dc565b6001600160a01b03811660009081526014602052604081205460ff161561268457506001610aa7565b6001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff16611c75565b600f546001600160a01b0316331461270c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6001600160a01b0381166127885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bb4565b61144181612de5565b5490565b80546001019055565b610e678282613102565b6000611c75836001600160a01b0384166131a0565b6000610aa7826131ef565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127fd826116f3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610e6782826040518060200160405280600081525061322d565b6000818152600460205260408120546001600160a01b03166128c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bb4565b60006128d4836116f3565b9050806001600160a01b0316846001600160a01b0316148061290f5750836001600160a01b031661290484610b3f565b6001600160a01b0316145b806126325750612632818561265b565b826001600160a01b0316612932826116f3565b6001600160a01b0316146129ae5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610bb4565b6001600160a01b038216612a295760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b612a348383836132ab565b612a3f6000826127c8565b6001600160a01b0383166000908152600560205260408120805460019290612a68908490614459565b90915550506001600160a01b0382166000908152600560205260408120805460019290612a9690849061440e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600460205260409020546060906001600160a01b0316612b845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610bb4565b6000612b8e612fc5565b90506000815111612bae5760405180602001604052806000815250610f6c565b80612bb884612fd4565b604051602001612bc99291906141f2565b6040516020818303038152906040529392505050565b600082815260208190526040902060010154612bfb81336132b6565b610d068383613102565b6001600160a01b0381163314612c835760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610bb4565b610e678282613334565b6000611c75836001600160a01b0384166133b3565b600c5460ff16612cf45760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610bb4565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612d49826116f3565b9050612d57816000846132ab565b612d626000836127c8565b6001600160a01b0381166000908152600560205260408120805460019290612d8b908490614459565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c5460ff1615612e8a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610bb4565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d213390565b6000611c7583836134a6565b612ed684848461291f565b612ee2848484846134d0565b6122735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610bb4565b6000818152601660205260408120546001600160a01b031615801590612f9357506000828152601660209081526040808320546001600160a01b03168352601590915290205460ff165b15612fb457506000908152601660205260409020546001600160a01b031690565b50506017546001600160a01b031690565b6060600e8054610abc906144b3565b606081612ff85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613022578061300c816144e8565b915061301b9050600a83614426565b9150612ffc565b60008167ffffffffffffffff81111561303d5761303d61456f565b6040519080825280601f01601f191660200182016040528015613067576020820181803683370190505b5090505b84156126325761307c600183614459565b9150613089600a86614503565b61309490603061440e565b60f81b8183815181106130a9576130a9614559565b60200101906001600160f81b031916908160001a9053506130cb600a86614426565b945061306b565b6000610aa7825490565b6000828152602081905260409020600101546130f881336132b6565b610d068383613334565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610e67576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561315c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008181526001830160205260408120546131e757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa7565b506000610aa7565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610aa75750610aa782613628565b613237838361369a565b61324460008484846134d0565b610d065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610bb4565b610d06838383613718565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610e67576132f2816001600160a01b0316601461379c565b6132fd83602061379c565b60405160200161330e9291906142e5565b60408051601f198184030181529082905262461bcd60e51b8252610bb4916004016143a2565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610e67576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600183016020526040812054801561349c5760006133d7600183614459565b85549091506000906133eb90600190614459565b905081811461345057600086600001828154811061340b5761340b614559565b906000526020600020015490508087600001848154811061342e5761342e614559565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061346157613461614543565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa7565b6000915050610aa7565b60008260000182815481106134bd576134bd614559565b9060005260206000200154905092915050565b60006001600160a01b0384163b1561361d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613514903390899088908890600401614366565b602060405180830381600087803b15801561352e57600080fd5b505af192505050801561355e575060408051601f3d908101601f1916820190925261355b918101906140d2565b60015b613603573d80801561358c576040519150601f19603f3d011682016040523d82523d6000602084013e613591565b606091505b5080516135fb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610bb4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612632565b506001949350505050565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061368b57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aa75750610aa782613961565b7f000000000000000000000000000000000000000000000000000000000000000061ffff1681111561370e5760405162461bcd60e51b815260206004820152601960248201527f416c6c20746865204d6f77736520617265206d696e7465642e000000000000006044820152606401610bb4565b610e67828261399f565b613723838383613aed565b600c5460ff1615610d065760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c65207061757365640000000000000000000000000000000000000000006064820152608401610bb4565b606060006137ab83600261443a565b6137b690600261440e565b67ffffffffffffffff8111156137ce576137ce61456f565b6040519080825280601f01601f1916602001820160405280156137f8576020820181803683370190505b509050600360fc1b8160008151811061381357613813614559565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061385e5761385e614559565b60200101906001600160f81b031916908160001a905350600061388284600261443a565b61388d90600161440e565b90505b6001811115613912577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106138ce576138ce614559565b1a60f81b8282815181106138e4576138e4614559565b60200101906001600160f81b031916908160001a90535060049490941c9361390b8161449c565b9050613890565b508315611c755760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bb4565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610aa75750610aa782613ba5565b6001600160a01b0382166139f55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bb4565b6000818152600460205260409020546001600160a01b031615613a5a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bb4565b613a66600083836132ab565b6001600160a01b0382166000908152600560205260408120805460019290613a8f90849061440e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316613b4857613b4381600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b613b6b565b816001600160a01b0316836001600160a01b031614613b6b57613b6b8382613c0c565b6001600160a01b038216613b8257610d0681613ca9565b826001600160a01b0316826001600160a01b031614610d0657610d068282613d58565b60006001600160e01b031982167f7965db0b000000000000000000000000000000000000000000000000000000001480610aa757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aa7565b60006001613c19846119d3565b613c239190614459565b600083815260096020526040902054909150808214613c76576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a54600090613cbb90600190614459565b6000838152600b6020526040812054600a8054939450909284908110613ce357613ce3614559565b9060005260206000200154905080600a8381548110613d0457613d04614559565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a805480613d3c57613d3c614543565b6001900381819060005260206000200160009055905550505050565b6000613d63836119d3565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b600060208284031215613dae57600080fd5b8135611c7581614585565b600060208284031215613dcb57600080fd5b8151611c7581614585565b60008060408385031215613de957600080fd5b8235613df481614585565b91506020830135613e0481614585565b809150509250929050565b600080600060608486031215613e2457600080fd5b8335613e2f81614585565b92506020840135613e3f81614585565b929592945050506040919091013590565b60008060008060808587031215613e6657600080fd5b8435613e7181614585565b93506020850135613e8181614585565b925060408501359150606085013567ffffffffffffffff811115613ea457600080fd5b8501601f81018713613eb557600080fd5b8035613ec8613ec3826143e6565b6143b5565b818152886020838501011115613edd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613f1257600080fd5b8235613f1d81614585565b915060208381013567ffffffffffffffff80821115613f3b57600080fd5b818601915086601f830112613f4f57600080fd5b813581811115613f6157613f6161456f565b8060051b9150613f728483016143b5565b8181528481019084860184860187018b1015613f8d57600080fd5b600095505b83861015613fb0578035835260019590950194918601918601613f92565b508096505050505050509250929050565b60008060408385031215613fd457600080fd5b8235613fdf81614585565b91506020830135613e048161459a565b6000806040838503121561400257600080fd5b823561400d81614585565b946020939093013593505050565b60006020828403121561402d57600080fd5b8135611c758161459a565b60006020828403121561404a57600080fd5b8151611c758161459a565b60006020828403121561406757600080fd5b5035919050565b6000806040838503121561408157600080fd5b823591506020830135613e0481614585565b600080604083850312156140a657600080fd5b50508035926020909101359150565b6000602082840312156140c757600080fd5b8135611c75816145a8565b6000602082840312156140e457600080fd5b8151611c75816145a8565b60006020828403121561410157600080fd5b815167ffffffffffffffff81111561411857600080fd5b8201601f8101841361412957600080fd5b8051614137613ec3826143e6565b81815285602083850101111561414c57600080fd5b61415d826020830160208601614470565b95945050505050565b60006020828403121561417857600080fd5b813561ffff81168114611c7557600080fd5b60006020828403121561419c57600080fd5b5051919050565b6000602082840312156141b557600080fd5b813560ff81168114611c7557600080fd5b600081518084526141de816020860160208601614470565b601f01601f19169290920160200192915050565b60008351614204818460208801614470565b835190830190614218818360208801614470565b01949350505050565b6000845160206142348285838a01614470565b8551918401916142478184848a01614470565b8554920191600090600181811c908083168061426457607f831692505b85831081141561428257634e487b7160e01b85526022600452602485fd5b80801561429657600181146142a7576142d4565b60ff198516885283880195506142d4565b60008b81526020902060005b858110156142cc5781548a8201529084019088016142b3565b505083880195505b50939b9a5050505050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161431d816017850160208801614470565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161435a816028840160208801614470565b01602801949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261439860808301846141c6565b9695505050505050565b602081526000611c7560208301846141c6565b604051601f8201601f1916810167ffffffffffffffff811182821017156143de576143de61456f565b604052919050565b600067ffffffffffffffff8211156144005761440061456f565b50601f01601f191660200190565b6000821982111561442157614421614517565b500190565b6000826144355761443561452d565b500490565b600081600019048311821515161561445457614454614517565b500290565b60008282101561446b5761446b614517565b500390565b60005b8381101561448b578181015183820152602001614473565b838111156122735750506000910152565b6000816144ab576144ab614517565b506000190190565b600181811c908216806144c757607f821691505b60208210811415610f6f57634e487b7160e01b600052602260045260246000fd5b60006000198214156144fc576144fc614517565b5060010190565b6000826145125761451261452d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461144157600080fd5b801515811461144157600080fd5b6001600160e01b03198116811461144157600080fdfea264697066735822122047d7bc03bee5b56e32631ab021ed6d0a253940f34c4eaa928fb753910d83458d64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000613a59b0000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000005368747470733a2f2f6e6674646174612e6d7970696e6174612e636c6f75642f697066732f516d636346615632506143784e4c73675442757264326d523865336a426f694337687232594b62786142385a704a2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000001ef411e11fbb23000a50d198b5226a80f7e9f3af000000000000000000000000ce1db19c21da28b70fb663ec0c49c8c8e69a16da00000000000000000000000009be68823d2a7a22be569816c9b2c104628545cf000000000000000000000000bbc02dbd39941fffa605171a977d44c6baf915c200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x60806040526004361061034a5760003560e01c80637419e77a116101bb578063b69ef8a8116100f7578063d539139311610095578063e985e9c51161006f578063e985e9c5146109ec578063ec342ad014610a0c578063ed967e1a14610a22578063f2fde38b14610a4957600080fd5b8063d539139314610964578063d547741f14610998578063e63ab1e9146109b857600080fd5b8063c0e16ec7116100d1578063c0e16ec7146108d0578063c6374d0c146108f0578063c87b56dd14610924578063ca15c8731461094457600080fd5b8063b69ef8a814610880578063b88d4fde14610893578063c002d23d146108b357600080fd5b806395d89b4111610164578063a22cb4651161013e578063a22cb46514610800578063a4033e7914610820578063aacad0bf14610840578063acec338a1461086057600080fd5b806395d89b41146107b65780639bdedea5146107cb578063a217fddf146107eb57600080fd5b80639010d07c116101955780639010d07c1461070b57806391d148541461072b57806395183a081461076f57600080fd5b80637419e77a146106b85780638456cb59146106d85780638da5cb5b146106ed57600080fd5b806336e79a5a1161028a5780634f6ccce71161023357806365008f251161020d57806365008f25146106505780636a6278421461066357806370a0823114610683578063715018a6146106a357600080fd5b80634f6ccce7146105f85780635c975abb146106185780636352211e1461063057600080fd5b806342842e0e1161026457806342842e0e1461059857806342966c68146105b857806349df728c146105d857600080fd5b806336e79a5a1461054e5780633ccfd60b1461056e5780633f4ba83a1461058357600080fd5b806323b872dd116102f75780632a55205a116102d15780632a55205a146104af5780632f2ff15d146104ee5780632f745c591461050e57806336568abe1461052e57600080fd5b806323b872dd1461043f578063248a9ca31461045f578063254caa7e1461048f57600080fd5b8063095ea7b311610328578063095ea7b3146103de57806314493b921461040057806318160ddd1461042057600080fd5b806301ffc9a71461034f57806306fdde0314610384578063081812fc146103a6575b600080fd5b34801561035b57600080fd5b5061036f61036a3660046140b5565b610a69565b60405190151581526020015b60405180910390f35b34801561039057600080fd5b50610399610aad565b60405161037b91906143a2565b3480156103b257600080fd5b506103c66103c1366004614055565b610b3f565b6040516001600160a01b03909116815260200161037b565b3480156103ea57600080fd5b506103fe6103f9366004613fef565b610bd9565b005b34801561040c57600080fd5b506103fe61041b366004613fef565b610d0b565b34801561042c57600080fd5b50600a545b60405190815260200161037b565b34801561044b57600080fd5b506103fe61045a366004613e0f565b610e6b565b34801561046b57600080fd5b5061043161047a366004614055565b60009081526020819052604090206001015490565b34801561049b57600080fd5b506103996104aa366004614055565b610ef3565b3480156104bb57600080fd5b506104cf6104ca366004614093565b610f75565b604080516001600160a01b03909316835260208301919091520161037b565b3480156104fa57600080fd5b506103fe61050936600461406e565b610fa6565b34801561051a57600080fd5b50610431610529366004613fef565b610fc8565b34801561053a57600080fd5b506103fe61054936600461406e565b611070565b34801561055a57600080fd5b506103fe610569366004614166565b611092565b34801561057a57600080fd5b506103fe611180565b34801561058f57600080fd5b506103fe6112fa565b3480156105a457600080fd5b506103fe6105b3366004613e0f565b6113a2565b3480156105c457600080fd5b506103fe6105d3366004614055565b6113bd565b3480156105e457600080fd5b506103fe6105f3366004613d9c565b611444565b34801561060457600080fd5b50610431610613366004614055565b61164f565b34801561062457600080fd5b50600c5460ff1661036f565b34801561063c57600080fd5b506103c661064b366004614055565b6116f3565b6103fe61065e3660046141a3565b61177e565b34801561066f57600080fd5b506103fe61067e366004613d9c565b61198b565b34801561068f57600080fd5b5061043161069e366004613d9c565b6119d3565b3480156106af57600080fd5b506103fe611a6d565b3480156106c457600080fd5b506103fe6106d3366004613fc1565b611ad1565b3480156106e457600080fd5b506103fe611bb9565b3480156106f957600080fd5b50600f546001600160a01b03166103c6565b34801561071757600080fd5b506103c6610726366004614093565b611c5d565b34801561073757600080fd5b5061036f61074636600461406e565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b34801561077b57600080fd5b506107a37f000000000000000000000000000000000000000000000000000000000000271081565b60405161ffff909116815260200161037b565b3480156107c257600080fd5b50610399611c7c565b3480156107d757600080fd5b506103fe6107e6366004613eff565b611c8b565b3480156107f757600080fd5b50610431600081565b34801561080c57600080fd5b506103fe61081b366004613fc1565b611e08565b34801561082c57600080fd5b506103fe61083b366004614055565b611ecd565b34801561084c57600080fd5b506103fe61085b366004613fc1565b612027565b34801561086c57600080fd5b506103fe61087b36600461401b565b61210f565b34801561088c57600080fd5b5047610431565b34801561089f57600080fd5b506103fe6108ae366004613e50565b6121eb565b3480156108bf57600080fd5b5061043168056bc75e2d6310000081565b3480156108dc57600080fd5b506103fe6108eb36600461406e565b612279565b3480156108fc57600080fd5b506104317f00000000000000000000000000000000000000000000000000000000613a59b081565b34801561093057600080fd5b5061039961093f366004614055565b612475565b34801561095057600080fd5b5061043161095f366004614055565b61263a565b34801561097057600080fd5b506104317f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156109a457600080fd5b506103fe6109b336600461406e565b612651565b3480156109c457600080fd5b506104317f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b3480156109f857600080fd5b5061036f610a07366004613dd6565b61265b565b348015610a1857600080fd5b506107a361271081565b348015610a2e57600080fd5b50610a37600a81565b60405160ff909116815260200161037b565b348015610a5557600080fd5b506103fe610a64366004613d9c565b6126b2565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610aa75750610aa7826127bd565b92915050565b606060028054610abc906144b3565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae8906144b3565b8015610b355780601f10610b0a57610100808354040283529160200191610b35565b820191906000526020600020905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b0316610bbd5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610be4826116f3565b9050806001600160a01b0316836001600160a01b03161415610c6e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b336001600160a01b0382161480610c8a5750610c8a813361265b565b610cfc5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610bb4565b610d0683836127c8565b505050565b610d357f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633610746565b610d815760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c79206d696e746572732063616e2067696674204d6f7773652e000000006044820152606401610bb4565b6000818152600460205260409020546001600160a01b031615610e0c5760405162461bcd60e51b815260206004820152602360248201527f54686973204d6f77736520696420616c72656164792068617320616e206f776e60448201527f65722e00000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b6019548110610e5d5760405162461bcd60e51b815260206004820152601c60248201527f54686973204d6f7773652063616e6e6f74206265206769667465642e000000006044820152606401610bb4565b610e678282612836565b5050565b610e76335b82612850565b610ee85760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610bb4565b610d0683838361291f565b606081610f17816000908152600460205260409020546001600160a01b0316151590565b610f635760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b610f6c83612af7565b91505b50919050565b6011546000908190309061271090610f919061ffff168661443a565b610f9b9190614426565b915091509250929050565b610fb08282612bdf565b6000828152600160205260409020610d0690826127a8565b6000610fd3836119d3565b82106110475760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610bb4565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b61107a8282612c05565b6000828152600160205260409020610d069082612c8d565b600f546001600160a01b031633146110ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6102ee8161ffff1611156111685760405162461bcd60e51b815260206004820152602d60248201527f526f79616c7479206d7573742062652067726561746572207468616e206f722060448201527f657175616c20746f20372e3525000000000000000000000000000000000000006064820152608401610bb4565b6011805461ffff191661ffff92909216919091179055565b600260105414156111d35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb4565b60026010554760005b6012548110156112f1576000601282815481106111fb576111fb614559565b600091825260209091200154601380546001600160a01b039092169161271091908590811061122c5761122c614559565b906000526020600020015485611242919061443a565b61124c9190614426565b604051600081818185875af1925050503d8060008114611288576040519150601f19603f3d011682016040523d82523d6000602084013e61128d565b606091505b50509050806112de5760405162461bcd60e51b815260206004820152601660248201527f4661696c656420746f2073656e64207061796d656e74000000000000000000006044820152606401610bb4565b50806112e9816144e8565b9150506111dc565b50506001601055565b6113247f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610746565b611398576040805162461bcd60e51b81526020600482015260248101919091527f4552433732315072657365744d696e7465725061757365724175746f49643a2060448201527f6d75737420686176652070617573657220726f6c6520746f20756e70617573656064820152608401610bb4565b6113a0612ca2565b565b610d06838383604051806020016040528060008152506121eb565b6113c633610e70565b6114385760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610bb4565b61144181612d3e565b50565b600260105414156114975760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb4565b60026010556040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281906000906001600160a01b038316906370a082319060240160206040518083038186803b1580156114f957600080fd5b505afa15801561150d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611531919061418a565b905060005b60125481101561164457826001600160a01b031663a9059cbb6012838154811061156257611562614559565b600091825260209091200154601380546001600160a01b039092169161271091908690811061159357611593614559565b9060005260206000200154866115a9919061443a565b6115b39190614426565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156115f957600080fd5b505af115801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190614038565b508061163c816144e8565b915050611536565b505060016010555050565b600061165a600a5490565b82106116ce5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610bb4565b600a82815481106116e1576116e1614559565b90600052602060002001549050919050565b6000818152600460205260408120546001600160a01b031680610aa75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610bb4565b60ff8116600a10156117f75760405162461bcd60e51b8152602060048201526024808201527f546f6f206d616e79204d6f77736520666f722074686973207472616e7361637460448201527f696f6e2e000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b3461180e60ff831668056bc75e2d6310000061443a565b146118815760405162461bcd60e51b815260206004820152602a60248201527f4e6f7420746865207269676874207061796d656e7420666f7220616c6c20746860448201527f657365204d6f7773652e000000000000000000000000000000000000000000006064820152608401610bb4565b427f00000000000000000000000000000000000000000000000000000000613a59b011156119175760405162461bcd60e51b815260206004820152602260248201527f4d6f777365206d696e74696e6720686173206e6f74207374617274656420796560448201527f742e0000000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b60005b8160ff1681101561195757611933601980546001019055565b6119453361194060195490565b612836565b8061194f816144e8565b91505061191a565b5060405160ff82169033907f5df4bf3bb30ff4eed9ff314620223d9982a1588fc3c57a63147c6b455db3057490600090a350565b60405162461bcd60e51b815260206004820152601560248201527f596f75206d757374206d696e744d6f77736528292e00000000000000000000006044820152606401610bb4565b60006001600160a01b038216611a515760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610bb4565b506001600160a01b031660009081526005602052604090205490565b600f546001600160a01b03163314611ac75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6113a06000612de5565b600f546001600160a01b03163314611b2b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6001600160a01b038216600081815260146020526040908190205490517f7822b3406af3f881636357828dff400888d9dc4441f7a9471688613318e66f4991611b8691859160ff169091151582521515602082015260400190565b60405180910390a26001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b611be37f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33610746565b611c555760405162461bcd60e51b815260206004820152603e60248201527f4552433732315072657365744d696e7465725061757365724175746f49643a2060448201527f6d75737420686176652070617573657220726f6c6520746f20706175736500006064820152608401610bb4565b6113a0612e37565b6000828152600160205260408120611c759083612ebf565b9392505050565b606060038054610abc906144b3565b60026010541415611cde5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bb4565b60026010558160005b825181101561164457816001600160a01b03166342842e0e30306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d3957600080fd5b505afa158015611d4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d719190613db9565b868581518110611d8357611d83614559565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b505050508080611e00906144e8565b915050611ce7565b6001600160a01b038216331415611e615760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610bb4565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60008181526004602052604090205481906001600160a01b0316611f335760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b81611f3d816116f3565b6001600160a01b0316336001600160a01b031614611fc35760405162461bcd60e51b815260206004820152603960248201527f596f75206d75737420626520746865206f776e657220746f207365742061204d60448201527f6f777365206d657461646174612076697375616c697a65722e000000000000006064820152608401610bb4565b6000838152601660205260408082205490516001600160a01b039091169185917f455b1eed85683980a9a6314efb8d51de526a792a48b7a243d03afe72ba5be7469190a35050600090815260166020526040902080546001600160a01b0319169055565b600f546001600160a01b031633146120815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6001600160a01b038216600081815260156020526040908190205490517f64c356337f631cc47beae36a0f9eb803ed882801a756300159513ced60ef3171916120dc91859160ff169091151582521515602082015260400190565b60405180910390a26001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600f546001600160a01b031633146121695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b601754604080518315158152600160a01b90920460ff16151560208301527fa33ddaa6d1d3eda04afb55a0f9d9375305ab0d79809c49fc1f093dd009fae39f910160405180910390a160178054911515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6121f53383612850565b6122675760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610bb4565b61227384848484612ecb565b50505050565b60008281526004602052604090205482906001600160a01b03166122df5760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b826122e9816116f3565b6001600160a01b0316336001600160a01b03161461236f5760405162461bcd60e51b815260206004820152603960248201527f596f75206d75737420626520746865206f776e657220746f207365742061204d60448201527f6f777365206d657461646174612076697375616c697a65722e000000000000006064820152608401610bb4565b6001600160a01b03831660009081526015602052604090205460ff166123fd5760405162461bcd60e51b815260206004820152602860248201527f54686973206d657461646174612076697375616c697a6572206973206e6f742060448201527f616c6c6f7765642e0000000000000000000000000000000000000000000000006064820152608401610bb4565b6000848152601660205260408082205490516001600160a01b03918216929186169187917f04dc7856d7a752700ba076ec7bcff513f95a3d405ec3c68b536897d219bbf3c69190a4505060009182526016602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b606081612499816000908152600460205260409020546001600160a01b0316151590565b6124e55760405162461bcd60e51b815260206004820152601a60248201527f54686973204d6f77736520646f6573206e6f742065786973742e0000000000006044820152606401610bb4565b601754600160a01b900460ff16801561251457506000838152601660205260409020546001600160a01b031615155b801561254457506000838152601660209081526040808320546001600160a01b03168352601590915290205460ff165b156125da5761255283612f49565b6001600160a01b03166382141454846040518263ffffffff1660e01b815260040161257f91815260200190565b60006040518083038186803b15801561259757600080fd5b505afa1580156125ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125d391908101906140ef565b9150610f6f565b60006125e4612fc5565b905060008151116126045760405180602001604052806000815250612632565b8061260e85612fd4565b601860405160200161262293929190614221565b6040516020818303038152906040525b949350505050565b6000818152600160205260408120610aa7906130d2565b61107a82826130dc565b6001600160a01b03811660009081526014602052604081205460ff161561268457506001610aa7565b6001600160a01b0380841660009081526007602090815260408083209386168352929052205460ff16611c75565b600f546001600160a01b0316331461270c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bb4565b6001600160a01b0381166127885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bb4565b61144181612de5565b5490565b80546001019055565b610e678282613102565b6000611c75836001600160a01b0384166131a0565b6000610aa7826131ef565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906127fd826116f3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610e6782826040518060200160405280600081525061322d565b6000818152600460205260408120546001600160a01b03166128c95760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610bb4565b60006128d4836116f3565b9050806001600160a01b0316846001600160a01b0316148061290f5750836001600160a01b031661290484610b3f565b6001600160a01b0316145b806126325750612632818561265b565b826001600160a01b0316612932826116f3565b6001600160a01b0316146129ae5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610bb4565b6001600160a01b038216612a295760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610bb4565b612a348383836132ab565b612a3f6000826127c8565b6001600160a01b0383166000908152600560205260408120805460019290612a68908490614459565b90915550506001600160a01b0382166000908152600560205260408120805460019290612a9690849061440e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000818152600460205260409020546060906001600160a01b0316612b845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610bb4565b6000612b8e612fc5565b90506000815111612bae5760405180602001604052806000815250610f6c565b80612bb884612fd4565b604051602001612bc99291906141f2565b6040516020818303038152906040529392505050565b600082815260208190526040902060010154612bfb81336132b6565b610d068383613102565b6001600160a01b0381163314612c835760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610bb4565b610e678282613334565b6000611c75836001600160a01b0384166133b3565b600c5460ff16612cf45760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610bb4565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6000612d49826116f3565b9050612d57816000846132ab565b612d626000836127c8565b6001600160a01b0381166000908152600560205260408120805460019290612d8b908490614459565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600f80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c5460ff1615612e8a5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610bb4565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612d213390565b6000611c7583836134a6565b612ed684848461291f565b612ee2848484846134d0565b6122735760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610bb4565b6000818152601660205260408120546001600160a01b031615801590612f9357506000828152601660209081526040808320546001600160a01b03168352601590915290205460ff165b15612fb457506000908152601660205260409020546001600160a01b031690565b50506017546001600160a01b031690565b6060600e8054610abc906144b3565b606081612ff85750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613022578061300c816144e8565b915061301b9050600a83614426565b9150612ffc565b60008167ffffffffffffffff81111561303d5761303d61456f565b6040519080825280601f01601f191660200182016040528015613067576020820181803683370190505b5090505b84156126325761307c600183614459565b9150613089600a86614503565b61309490603061440e565b60f81b8183815181106130a9576130a9614559565b60200101906001600160f81b031916908160001a9053506130cb600a86614426565b945061306b565b6000610aa7825490565b6000828152602081905260409020600101546130f881336132b6565b610d068383613334565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610e67576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561315c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008181526001830160205260408120546131e757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610aa7565b506000610aa7565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610aa75750610aa782613628565b613237838361369a565b61324460008484846134d0565b610d065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610bb4565b610d06838383613718565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610e67576132f2816001600160a01b0316601461379c565b6132fd83602061379c565b60405160200161330e9291906142e5565b60408051601f198184030181529082905262461bcd60e51b8252610bb4916004016143a2565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610e67576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600183016020526040812054801561349c5760006133d7600183614459565b85549091506000906133eb90600190614459565b905081811461345057600086600001828154811061340b5761340b614559565b906000526020600020015490508087600001848154811061342e5761342e614559565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061346157613461614543565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610aa7565b6000915050610aa7565b60008260000182815481106134bd576134bd614559565b9060005260206000200154905092915050565b60006001600160a01b0384163b1561361d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613514903390899088908890600401614366565b602060405180830381600087803b15801561352e57600080fd5b505af192505050801561355e575060408051601f3d908101601f1916820190925261355b918101906140d2565b60015b613603573d80801561358c576040519150601f19603f3d011682016040523d82523d6000602084013e613591565b606091505b5080516135fb5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610bb4565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612632565b506001949350505050565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061368b57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aa75750610aa782613961565b7f000000000000000000000000000000000000000000000000000000000000271061ffff1681111561370e5760405162461bcd60e51b815260206004820152601960248201527f416c6c20746865204d6f77736520617265206d696e7465642e000000000000006044820152606401610bb4565b610e67828261399f565b613723838383613aed565b600c5460ff1615610d065760405162461bcd60e51b815260206004820152602b60248201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760448201527f68696c65207061757365640000000000000000000000000000000000000000006064820152608401610bb4565b606060006137ab83600261443a565b6137b690600261440e565b67ffffffffffffffff8111156137ce576137ce61456f565b6040519080825280601f01601f1916602001820160405280156137f8576020820181803683370190505b509050600360fc1b8160008151811061381357613813614559565b60200101906001600160f81b031916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061385e5761385e614559565b60200101906001600160f81b031916908160001a905350600061388284600261443a565b61388d90600161440e565b90505b6001811115613912577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106138ce576138ce614559565b1a60f81b8282815181106138e4576138e4614559565b60200101906001600160f81b031916908160001a90535060049490941c9361390b8161449c565b9050613890565b508315611c755760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610bb4565b60006001600160e01b031982167f5a05180f000000000000000000000000000000000000000000000000000000001480610aa75750610aa782613ba5565b6001600160a01b0382166139f55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610bb4565b6000818152600460205260409020546001600160a01b031615613a5a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610bb4565b613a66600083836132ab565b6001600160a01b0382166000908152600560205260408120805460019290613a8f90849061440e565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b038316613b4857613b4381600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b613b6b565b816001600160a01b0316836001600160a01b031614613b6b57613b6b8382613c0c565b6001600160a01b038216613b8257610d0681613ca9565b826001600160a01b0316826001600160a01b031614610d0657610d068282613d58565b60006001600160e01b031982167f7965db0b000000000000000000000000000000000000000000000000000000001480610aa757507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aa7565b60006001613c19846119d3565b613c239190614459565b600083815260096020526040902054909150808214613c76576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a54600090613cbb90600190614459565b6000838152600b6020526040812054600a8054939450909284908110613ce357613ce3614559565b9060005260206000200154905080600a8381548110613d0457613d04614559565b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a805480613d3c57613d3c614543565b6001900381819060005260206000200160009055905550505050565b6000613d63836119d3565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b600060208284031215613dae57600080fd5b8135611c7581614585565b600060208284031215613dcb57600080fd5b8151611c7581614585565b60008060408385031215613de957600080fd5b8235613df481614585565b91506020830135613e0481614585565b809150509250929050565b600080600060608486031215613e2457600080fd5b8335613e2f81614585565b92506020840135613e3f81614585565b929592945050506040919091013590565b60008060008060808587031215613e6657600080fd5b8435613e7181614585565b93506020850135613e8181614585565b925060408501359150606085013567ffffffffffffffff811115613ea457600080fd5b8501601f81018713613eb557600080fd5b8035613ec8613ec3826143e6565b6143b5565b818152886020838501011115613edd57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215613f1257600080fd5b8235613f1d81614585565b915060208381013567ffffffffffffffff80821115613f3b57600080fd5b818601915086601f830112613f4f57600080fd5b813581811115613f6157613f6161456f565b8060051b9150613f728483016143b5565b8181528481019084860184860187018b1015613f8d57600080fd5b600095505b83861015613fb0578035835260019590950194918601918601613f92565b508096505050505050509250929050565b60008060408385031215613fd457600080fd5b8235613fdf81614585565b91506020830135613e048161459a565b6000806040838503121561400257600080fd5b823561400d81614585565b946020939093013593505050565b60006020828403121561402d57600080fd5b8135611c758161459a565b60006020828403121561404a57600080fd5b8151611c758161459a565b60006020828403121561406757600080fd5b5035919050565b6000806040838503121561408157600080fd5b823591506020830135613e0481614585565b600080604083850312156140a657600080fd5b50508035926020909101359150565b6000602082840312156140c757600080fd5b8135611c75816145a8565b6000602082840312156140e457600080fd5b8151611c75816145a8565b60006020828403121561410157600080fd5b815167ffffffffffffffff81111561411857600080fd5b8201601f8101841361412957600080fd5b8051614137613ec3826143e6565b81815285602083850101111561414c57600080fd5b61415d826020830160208601614470565b95945050505050565b60006020828403121561417857600080fd5b813561ffff81168114611c7557600080fd5b60006020828403121561419c57600080fd5b5051919050565b6000602082840312156141b557600080fd5b813560ff81168114611c7557600080fd5b600081518084526141de816020860160208601614470565b601f01601f19169290920160200192915050565b60008351614204818460208801614470565b835190830190614218818360208801614470565b01949350505050565b6000845160206142348285838a01614470565b8551918401916142478184848a01614470565b8554920191600090600181811c908083168061426457607f831692505b85831081141561428257634e487b7160e01b85526022600452602485fd5b80801561429657600181146142a7576142d4565b60ff198516885283880195506142d4565b60008b81526020902060005b858110156142cc5781548a8201529084019088016142b3565b505083880195505b50939b9a5050505050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161431d816017850160208801614470565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161435a816028840160208801614470565b01602801949350505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261439860808301846141c6565b9695505050505050565b602081526000611c7560208301846141c6565b604051601f8201601f1916810167ffffffffffffffff811182821017156143de576143de61456f565b604052919050565b600067ffffffffffffffff8211156144005761440061456f565b50601f01601f191660200190565b6000821982111561442157614421614517565b500190565b6000826144355761443561452d565b500490565b600081600019048311821515161561445457614454614517565b500290565b60008282101561446b5761446b614517565b500390565b60005b8381101561448b578181015183820152602001614473565b838111156122735750506000910152565b6000816144ab576144ab614517565b506000190190565b600181811c908216806144c757607f821691505b60208210811415610f6f57634e487b7160e01b600052602260045260246000fd5b60006000198214156144fc576144fc614517565b5060010190565b6000826145125761451261452d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461144157600080fd5b801515811461144157600080fd5b6001600160e01b03198116811461144157600080fdfea264697066735822122047d7bc03bee5b56e32631ab021ed6d0a253940f34c4eaa928fb753910d83458d64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000613a59b0000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000005368747470733a2f2f6e6674646174612e6d7970696e6174612e636c6f75642f697066732f516d636346615632506143784e4c73675442757264326d523865336a426f694337687232594b62786142385a704a2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000001ef411e11fbb23000a50d198b5226a80f7e9f3af000000000000000000000000ce1db19c21da28b70fb663ec0c49c8c8e69a16da00000000000000000000000009be68823d2a7a22be569816c9b2c104628545cf000000000000000000000000bbc02dbd39941fffa605171a977d44c6baf915c200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000009c400000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _baseTokenURI (string): https://nftdata.mypinata.cloud/ipfs/QmccFaV2PaCxNLsgTBurd2mR8e3jBoiC7hr2YKbxaB8ZpJ/
Arg [1] : _suffixTokenURI (string): .json
Arg [2] : _maxSupply (uint16): 10000
Arg [3] : _mintStartTime (uint256): 1631214000
Arg [4] : _gifts (uint8): 100
Arg [5] : _recipients (address[]): 0x1EF411E11fBb23000a50d198B5226A80f7E9F3AF,0xce1DB19c21da28B70FB663EC0c49C8C8e69a16DA,0x09BE68823D2A7a22Be569816c9b2c104628545cF,0xbbC02dbD39941FFFa605171A977D44C6BAF915c2
Arg [6] : _splits (uint256[]): 4000,2500,2500,1000

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [3] : 00000000000000000000000000000000000000000000000000000000613a59b0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000053
Arg [8] : 68747470733a2f2f6e6674646174612e6d7970696e6174612e636c6f75642f69
Arg [9] : 7066732f516d636346615632506143784e4c73675442757264326d523865336a
Arg [10] : 426f694337687232594b62786142385a704a2f00000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 2e6a736f6e000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [14] : 0000000000000000000000001ef411e11fbb23000a50d198b5226a80f7e9f3af
Arg [15] : 000000000000000000000000ce1db19c21da28b70fb663ec0c49c8c8e69a16da
Arg [16] : 00000000000000000000000009be68823d2a7a22be569816c9b2c104628545cf
Arg [17] : 000000000000000000000000bbc02dbd39941fffa605171a977d44c6baf915c2
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000fa0
Arg [20] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [21] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [22] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

91614:11346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97339:272;;;;;;;;;;-1:-1:-1;97339:272:0;;;;;:::i;:::-;;:::i;:::-;;;13041:14:1;;13034:22;13016:41;;13004:2;12989:18;97339:272:0;;;;;;;;23995:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25554:221::-;;;;;;;;;;-1:-1:-1;25554:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11588:55:1;;;11570:74;;11558:2;11543:18;25554:221:0;11424:226:1;25077:411:0;;;;;;;;;;-1:-1:-1;25077:411:0;;;;;:::i;:::-;;:::i;:::-;;95137:358;;;;;;;;;;-1:-1:-1;95137:358:0;;;;;:::i;:::-;;:::i;37738:113::-;;;;;;;;;;-1:-1:-1;37826:10:0;:17;37738:113;;;13487:25:1;;;13475:2;13460:18;37738:113:0;13341:177:1;26444:339:0;;;;;;;;;;-1:-1:-1;26444:339:0;;;;;:::i;:::-;;:::i;55213:123::-;;;;;;;;;;-1:-1:-1;55213:123:0;;;;;:::i;:::-;55279:7;55306:12;;;;;;;;;;:22;;;;55213:123;96603:196;;;;;;;;;;-1:-1:-1;96603:196:0;;;;;:::i;:::-;;:::i;97721:236::-;;;;;;;;;;-1:-1:-1;97721:236:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12766:55:1;;;12748:74;;12853:2;12838:18;;12831:34;;;;12721:18;97721:236:0;12574:297:1;72790:196:0;;;;;;;;;;-1:-1:-1;72790:196:0;;;;;:::i;:::-;;:::i;37406:256::-;;;;;;;;;;-1:-1:-1;37406:256:0;;;;;:::i;:::-;;:::i;73375:205::-;;;;;;;;;;-1:-1:-1;73375:205:0;;;;;:::i;:::-;;:::i;100529:259::-;;;;;;;;;;-1:-1:-1;100529:259:0;;;;;:::i;:::-;;:::i;101019:323::-;;;;;;;;;;;;;:::i;78583:185::-;;;;;;;;;;;;;:::i;26854:::-;;;;;;;;;;-1:-1:-1;26854:185:0;;;;;:::i;:::-;;:::i;43705:245::-;;;;;;;;;;-1:-1:-1;43705:245:0;;;;;:::i;:::-;;:::i;101404:416::-;;;;;;;;;;-1:-1:-1;101404:416:0;;;;;:::i;:::-;;:::i;37928:233::-;;;;;;;;;;-1:-1:-1;37928:233:0;;;;;:::i;:::-;;:::i;45033:86::-;;;;;;;;;;-1:-1:-1;45104:7:0;;;;45033:86;;23689:239;;;;;;;;;;-1:-1:-1;23689:239:0;;;;;:::i;:::-;;:::i;94334:581::-;;;;;;:::i;:::-;;:::i;95641:102::-;;;;;;;;;;-1:-1:-1;95641:102:0;;;;;:::i;:::-;;:::i;23419:208::-;;;;;;;;;;-1:-1:-1;23419:208:0;;;;;:::i;:::-;;:::i;2591:94::-;;;;;;;;;;;;;:::i;99729:224::-;;;;;;;;;;-1:-1:-1;99729:224:0;;;;;:::i;:::-;;:::i;78185:179::-;;;;;;;;;;;;;:::i;1940:87::-;;;;;;;;;;-1:-1:-1;2013:6:0;;-1:-1:-1;;;;;2013:6:0;1940:87;;72245:145;;;;;;;;;;-1:-1:-1;72245:145:0;;;;;:::i;:::-;;:::i;54098:139::-;;;;;;;;;;-1:-1:-1;54098:139:0;;;;;:::i;:::-;54176:4;54200:12;;;;;;;;;;;-1:-1:-1;;;;;54200:29:0;;;;;;;;;;;;;;;54098:139;91833:32;;;;;;;;;;;;;;;;;;30060:6:1;30048:19;;;30030:38;;30018:2;30003:18;91833:32:0;29886:188:1;24164:104:0;;;;;;;;;;;;;:::i;101887:300::-;;;;;;;;;;-1:-1:-1;101887:300:0;;;;;:::i;:::-;;:::i;53189:49::-;;;;;;;;;;-1:-1:-1;53189:49:0;53234:4;53189:49;;25847:295;;;;;;;;;;-1:-1:-1;25847:295:0;;;;;:::i;:::-;;:::i;98884:236::-;;;;;;;;;;-1:-1:-1;98884:236:0;;;;;:::i;:::-;;:::i;100185:269::-;;;;;;;;;;-1:-1:-1;100185:269:0;;;;;:::i;:::-;;:::i;99336:146::-;;;;;;;;;;-1:-1:-1;99336:146:0;;;;;:::i;:::-;;:::i;100858:98::-;;;;;;;;;;-1:-1:-1;100927:21:0;100858:98;;27110:328;;;;;;;;;;-1:-1:-1;27110:328:0;;;;;:::i;:::-;;:::i;91872:46::-;;;;;;;;;;;;91909:9;91872:46;;98251:418;;;;;;;;;;-1:-1:-1;98251:418:0;;;;;:::i;:::-;;:::i;91925:35::-;;;;;;;;;;;;;;;95814:650;;;;;;;;;;-1:-1:-1;95814:650:0;;;;;:::i;:::-;;:::i;72564:134::-;;;;;;;;;;-1:-1:-1;72564:134:0;;;;;:::i;:::-;;:::i;76226:62::-;;;;;;;;;;;;76264:24;76226:62;;73079:201;;;;;;;;;;-1:-1:-1;73079:201:0;;;;;:::i;:::-;;:::i;76295:62::-;;;;;;;;;;;;76333:24;76295:62;;96972:312;;;;;;;;;;-1:-1:-1;96972:312:0;;;;;:::i;:::-;;:::i;91969:35::-;;;;;;;;;;;;91999:5;91969:35;;91788:38;;;;;;;;;;;;91824:2;91788:38;;;;;30433:4:1;30421:17;;;30403:36;;30391:2;30376:18;91788:38:0;30261:184:1;2840:192:0;;;;;;;;;;-1:-1:-1;2840:192:0;;;;;:::i;:::-;;:::i;97339:272::-;97493:4;-1:-1:-1;;;;;;97522:41:0;;97537:26;97522:41;;:81;;;97567:36;97591:11;97567:23;:36::i;:::-;97515:88;97339:272;-1:-1:-1;;97339:272:0:o;23995:100::-;24049:13;24082:5;24075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23995:100;:::o;25554:221::-;25630:7;29037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29037:16:0;25650:73;;;;-1:-1:-1;;;25650:73:0;;22935:2:1;25650:73:0;;;22917:21:1;22974:2;22954:18;;;22947:30;23013:34;22993:18;;;22986:62;-1:-1:-1;;;23064:18:1;;;23057:42;23116:19;;25650:73:0;;;;;;;;;-1:-1:-1;25743:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25743:24:0;;25554:221::o;25077:411::-;25158:13;25174:23;25189:7;25174:14;:23::i;:::-;25158:39;;25222:5;-1:-1:-1;;;;;25216:11:0;:2;-1:-1:-1;;;;;25216:11:0;;;25208:57;;;;-1:-1:-1;;;25208:57:0;;25240:2:1;25208:57:0;;;25222:21:1;25279:2;25259:18;;;25252:30;25318:34;25298:18;;;25291:62;25389:3;25369:18;;;25362:31;25410:19;;25208:57:0;25038:397:1;25208:57:0;806:10;-1:-1:-1;;;;;25300:21:0;;;;:62;;-1:-1:-1;25325:37:0;25342:5;806:10;96972:312;:::i;25325:37::-;25278:168;;;;-1:-1:-1;;;25278:168:0;;20490:2:1;25278:168:0;;;20472:21:1;20529:2;20509:18;;;20502:30;20568:34;20548:18;;;20541:62;20639:26;20619:18;;;20612:54;20683:19;;25278:168:0;20288:420:1;25278:168:0;25459:21;25468:2;25472:7;25459:8;:21::i;:::-;25147:341;25077:411;;:::o;95137:358::-;95224:34;76264:24;806:10;54098:139;:::i;95224:34::-;95216:75;;;;-1:-1:-1;;;95216:75:0;;28105:2:1;95216:75:0;;;28087:21:1;28144:2;28124:18;;;28117:30;28183;28163:18;;;28156:58;28231:18;;95216:75:0;27903:352:1;95216:75:0;29013:4;29037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29037:16:0;:30;95302:66;;;;-1:-1:-1;;;95302:66:0;;27701:2:1;95302:66:0;;;27683:21:1;27740:2;27720:18;;;27713:30;27779:34;27759:18;;;27752:62;27850:5;27830:18;;;27823:33;27873:19;;95302:66:0;27499:399:1;95302:66:0;95398:9;74762:14;95387:8;:30;95379:71;;;;-1:-1:-1;;;95379:71:0;;13949:2:1;95379:71:0;;;13931:21:1;13988:2;13968:18;;;13961:30;14027;14007:18;;;14000:58;14075:18;;95379:71:0;13747:352:1;95379:71:0;95463:24;95473:3;95478:8;95463:9;:24::i;:::-;95137:358;;:::o;26444:339::-;26639:41;806:10;26658:12;26672:7;26639:18;:41::i;:::-;26631:103;;;;-1:-1:-1;;;26631:103:0;;26870:2:1;26631:103:0;;;26852:21:1;26909:2;26889:18;;;26882:30;26948:34;26928:18;;;26921:62;27019:19;26999:18;;;26992:47;27056:19;;26631:103:0;26668:413:1;26631:103:0;26747:28;26757:4;26763:2;26767:7;26747:9;:28::i;96603:196::-;96698:13;96679:8;92520:17;92528:8;29013:4;29037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29037:16:0;:30;;;28948:127;92520:17;92512:56;;;;-1:-1:-1;;;92512:56:0;;17830:2:1;92512:56:0;;;17812:21:1;17869:2;17849:18;;;17842:30;17908:28;17888:18;;;17881:56;17954:18;;92512:56:0;17628:350:1;92512:56:0;96767:24:::1;96782:8;96767:14;:24::i;:::-;96760:31;;92579:1;96603:196:::0;;;;:::o;97721:236::-;97933:7;;97839:16;;;;97912:4;;91999:5;;97920:20;;97919:29;97933:7;97920:10;:20;:::i;:::-;97919:29;;;;:::i;:::-;97896:53;;;;97721:236;;;;;:::o;72790:196::-;72906:30;72922:4;72928:7;72906:15;:30::i;:::-;72947:18;;;;:12;:18;;;;;:31;;72970:7;72947:22;:31::i;37406:256::-;37503:7;37539:23;37556:5;37539:16;:23::i;:::-;37531:5;:31;37523:87;;;;-1:-1:-1;;;37523:87:0;;16592:2:1;37523:87:0;;;16574:21:1;16631:2;16611:18;;;16604:30;16670:34;16650:18;;;16643:62;16741:13;16721:18;;;16714:41;16772:19;;37523:87:0;16390:407:1;37523:87:0;-1:-1:-1;;;;;;37628:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;37406:256::o;73375:205::-;73494:33;73513:4;73519:7;73494:18;:33::i;:::-;73538:18;;;;:12;:18;;;;;:34;;73564:7;73538:25;:34::i;100529:259::-;2013:6;;-1:-1:-1;;;;;2013:6:0;806:10;2160:23;2152:68;;;;-1:-1:-1;;;2152:68:0;;23699:2:1;2152:68:0;;;23681:21:1;;;23718:18;;;23711:30;23777:34;23757:18;;;23750:62;23829:18;;2152:68:0;23497:356:1;2152:68:0;100696:3:::1;100684:8;:15;;;;100676:73;;;::::0;-1:-1:-1;;;100676:73:0;;26053:2:1;100676:73:0::1;::::0;::::1;26035:21:1::0;26092:2;26072:18;;;26065:30;26131:34;26111:18;;;26104:62;26202:15;26182:18;;;26175:43;26235:19;;100676:73:0::1;25851:409:1::0;100676:73:0::1;100762:7;:18:::0;;-1:-1:-1;;100762:18:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;100529:259::o;101019:323::-;88333:1;88929:7;;:19;;88921:63;;;;-1:-1:-1;;;88921:63:0;;28462:2:1;88921:63:0;;;28444:21:1;28501:2;28481:18;;;28474:30;28540:33;28520:18;;;28513:61;28591:18;;88921:63:0;28260:355:1;88921:63:0;88333:1;89062:7;:18;101090:21:::1;101072:15;101122:213;101146:10;:17:::0;101142:21;::::1;101122:213;;;101186:9;101209:10;101220:1;101209:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;101247:6:::1;:9:::0;;-1:-1:-1;;;;;101209:13:0;;::::1;::::0;91999:5:::1;::::0;101247:6;101254:1;;101247:9;::::1;;;;;:::i;:::-;;;;;;;;;101237:7;:19;;;;:::i;:::-;101236:28;;;;:::i;:::-;101201:68;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101185:84;;;101292:4;101284:39;;;::::0;-1:-1:-1;;;101284:39:0;;23348:2:1;101284:39:0::1;::::0;::::1;23330:21:1::0;23387:2;23367:18;;;23360:30;23426:24;23406:18;;;23399:52;23468:18;;101284:39:0::1;23146:346:1::0;101284:39:0::1;-1:-1:-1::0;101165:3:0;::::1;::::0;::::1;:::i;:::-;;;;101122:213;;;-1:-1:-1::0;;88289:1:0;89241:7;:22;101019:323::o;78583:185::-;78636:34;76333:24;806:10;54098:139;:::i;78636:34::-;78628:111;;;;;-1:-1:-1;;;78628:111:0;;29239:2:1;78628:111:0;;;29221:21:1;29258:18;;;29251:30;;;;29317:34;29297:18;;;29290:62;29388:34;29368:18;;;29361:62;29440:19;;78628:111:0;29037:428:1;78628:111:0;78750:10;:8;:10::i;:::-;78583:185::o;26854:::-;26992:39;27009:4;27015:2;27019:7;26992:39;;;;;;;;;;;;:16;:39::i;43705:245::-;43823:41;806:10;43842:12;726:98;43823:41;43815:102;;;;-1:-1:-1;;;43815:102:0;;28822:2:1;43815:102:0;;;28804:21:1;28861:2;28841:18;;;28834:30;28900:34;28880:18;;;28873:62;28971:18;28951;;;28944:46;29007:19;;43815:102:0;28620:412:1;43815:102:0;43928:14;43934:7;43928:5;:14::i;:::-;43705:245;:::o;101404:416::-;88333:1;88929:7;;:19;;88921:63;;;;-1:-1:-1;;;88921:63:0;;28462:2:1;88921:63:0;;;28444:21:1;28501:2;28481:18;;;28474:30;28540:33;28520:18;;;28513:61;28591:18;;88921:63:0;28260:355:1;88921:63:0;88333:1;89062:7;:18;101622:38:::1;::::0;;;;101654:4:::1;101622:38;::::0;::::1;11570:74:1::0;101515:14:0;;101485:20:::1;::::0;-1:-1:-1;;;;;101622:23:0;::::1;::::0;::::1;::::0;11543:18:1;;101622:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;101604:56;;101676:9;101671:142;101695:10;:17:::0;101691:21;::::1;101671:142;;;101734:13;-1:-1:-1::0;;;;;101734:22:0::1;;101757:10;101768:1;101757:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;101783:6:::1;:9:::0;;-1:-1:-1;;;;;101757:13:0;;::::1;::::0;91999:5:::1;::::0;101783:6;101790:1;;101783:9;::::1;;;;;:::i;:::-;;;;;;;;;101773:7;:19;;;;:::i;:::-;101772:28;;;;:::i;:::-;101734:67;::::0;-1:-1:-1;;;;;;101734:67:0::1;::::0;;;;;;-1:-1:-1;;;;;12766:55:1;;;101734:67:0::1;::::0;::::1;12748:74:1::0;12838:18;;;12831:34;12721:18;;101734:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;101714:3:0;::::1;::::0;::::1;:::i;:::-;;;;101671:142;;;-1:-1:-1::0;;88289:1:0;89241:7;:22;-1:-1:-1;;101404:416:0:o;37928:233::-;38003:7;38039:30;37826:10;:17;;37738:113;38039:30;38031:5;:38;38023:95;;;;-1:-1:-1;;;38023:95:0;;27288:2:1;38023:95:0;;;27270:21:1;27327:2;27307:18;;;27300:30;27366:34;27346:18;;;27339:62;27437:14;27417:18;;;27410:42;27469:19;;38023:95:0;27086:408:1;38023:95:0;38136:10;38147:5;38136:17;;;;;;;;:::i;:::-;;;;;;;;;38129:24;;37928:233;;;:::o;23689:239::-;23761:7;23797:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23797:16:0;23832:19;23824:73;;;;-1:-1:-1;;;23824:73:0;;21738:2:1;23824:73:0;;;21720:21:1;21777:2;21757:18;;;21750:30;21816:34;21796:18;;;21789:62;21887:11;21867:18;;;21860:39;21916:19;;23824:73:0;21536:405:1;94334:581:0;94415:24;;;91824:2;94415:24;;94407:73;;;;-1:-1:-1;;;94407:73:0;;16187:2:1;94407:73:0;;;16169:21:1;16226:2;16206:18;;;16199:30;16265:34;16245:18;;;16238:62;16336:6;16316:18;;;16309:34;16360:19;;94407:73:0;15985:400:1;94407:73:0;94525:9;94499:22;;;;91909:9;94499:22;:::i;:::-;:35;94491:90;;;;-1:-1:-1;;;94491:90:0;;25642:2:1;94491:90:0;;;25624:21:1;25681:2;25661:18;;;25654:30;25720:34;25700:18;;;25693:62;25791:12;25771:18;;;25764:40;25821:19;;94491:90:0;25440:406:1;94491:90:0;94614:15;94600:10;:29;;94592:76;;;;-1:-1:-1;;;94592:76:0;;26467:2:1;94592:76:0;;;26449:21:1;26506:2;26486:18;;;26479:30;26545:34;26525:18;;;26518:62;26616:4;26596:18;;;26589:32;26638:19;;94592:76:0;26265:398:1;94592:76:0;94713:10;94708:148;94734:9;94729:14;;:2;:14;94708:148;;;94766:21;:9;74881:19;;74899:1;74881:19;;;74792:127;94766:21;94802:42;94812:10;94824:19;:9;74762:14;;74670:114;94824:19;94802:9;:42::i;:::-;94745:4;;;;:::i;:::-;;;;94708:148;;;-1:-1:-1;94873:34:0;;;;;;94885:10;;94873:34;;;;;94334:581;:::o;95641:102::-;95696:39;;-1:-1:-1;;;95696:39:0;;14306:2:1;95696:39:0;;;14288:21:1;14345:2;14325:18;;;14318:30;14384:23;14364:18;;;14357:51;14425:18;;95696:39:0;14104:345:1;23419:208:0;23491:7;-1:-1:-1;;;;;23519:19:0;;23511:74;;;;-1:-1:-1;;;23511:74:0;;21327:2:1;23511:74:0;;;21309:21:1;21366:2;21346:18;;;21339:30;21405:34;21385:18;;;21378:62;21476:12;21456:18;;;21449:40;21506:19;;23511:74:0;21125:406:1;23511:74:0;-1:-1:-1;;;;;;23603:16:0;;;;;:9;:16;;;;;;;23419:208::o;2591:94::-;2013:6;;-1:-1:-1;;;;;2013:6:0;806:10;2160:23;2152:68;;;;-1:-1:-1;;;2152:68:0;;23699:2:1;2152:68:0;;;23681:21:1;;;23718:18;;;23711:30;23777:34;23757:18;;;23750:62;23829:18;;2152:68:0;23497:356:1;2152:68:0;2656:21:::1;2674:1;2656:9;:21::i;99729:224::-:0;2013:6;;-1:-1:-1;;;;;2013:6:0;806:10;2160:23;2152:68;;;;-1:-1:-1;;;2152:68:0;;23699:2:1;2152:68:0;;;23681:21:1;;;23718:18;;;23711:30;23777:34;23757:18;;;23750:62;23829:18;;2152:68:0;23497:356:1;2152:68:0;-1:-1:-1;;;;;99825:70:0;::::1;99868:26;::::0;;;:12:::1;:26;::::0;;;;;;;99825:70;;::::1;::::0;::::1;::::0;99858:8;;99868:26:::1;;::::0;13255:14:1;;13248:22;13230:41;;13314:14;13307:22;13302:2;13287:18;;13280:50;13218:2;13203:18;;13068:268;99825:70:0::1;;;;;;;;-1:-1:-1::0;;;;;99908:26:0;;;::::1;;::::0;;;:12:::1;:26;::::0;;;;:37;;-1:-1:-1;;99908:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;99729:224::o;78185:179::-;78236:34;76333:24;806:10;54098:139;:::i;78236:34::-;78228:109;;;;-1:-1:-1;;;78228:109:0;;18542:2:1;78228:109:0;;;18524:21:1;18581:2;18561:18;;;18554:30;18620:34;18600:18;;;18593:62;18691:32;18671:18;;;18664:60;18741:19;;78228:109:0;18340:426:1;78228:109:0;78348:8;:6;:8::i;72245:145::-;72327:7;72354:18;;;:12;:18;;;;;:28;;72376:5;72354:21;:28::i;:::-;72347:35;72245:145;-1:-1:-1;;;72245:145:0:o;24164:104::-;24220:13;24253:7;24246:14;;;;;:::i;101887:300::-;88333:1;88929:7;;:19;;88921:63;;;;-1:-1:-1;;;88921:63:0;;28462:2:1;88921:63:0;;;28444:21:1;28501:2;28481:18;;;28474:30;28540:33;28520:18;;;28513:61;28591:18;;88921:63:0;28260:355:1;88921:63:0;88333:1;89062:7;:18;102019:14;101987:21:::1;102045:135;102069:3;:10;102065:1;:14;102045:135;;;102101:13;-1:-1:-1::0;;;;;102101:30:0::1;;102140:4;102147;-1:-1:-1::0;;;;;102147:10:0::1;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;102161:3;102165:1;102161:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;102101:67:::1;::::0;-1:-1:-1;;;;;;102101:67:0::1;::::0;;;;;;-1:-1:-1;;;;;11936:15:1;;;102101:67:0::1;::::0;::::1;11918:34:1::0;11988:15;;;;11968:18;;;11961:43;12020:18;;;12013:34;11830:18;;102101:67:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;102081:3;;;;;:::i;:::-;;;;102045:135;;25847:295:::0;-1:-1:-1;;;;;25950:24:0;;806:10;25950:24;;25942:62;;;;-1:-1:-1;;;25942:62:0;;19378:2:1;25942:62:0;;;19360:21:1;19417:2;19397:18;;;19390:30;19456:27;19436:18;;;19429:55;19501:18;;25942:62:0;19176:349:1;25942:62:0;806:10;26017:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;26017:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;26017:53:0;;;;;;;;;;26086:48;;13016:41:1;;;26017:42:0;;806:10;26086:48;;12989:18:1;26086:48:0;;;;;;;25847:295;;:::o;98884:236::-;29013:4;29037:16;;;:7;:16;;;;;;98965:8;;-1:-1:-1;;;;;29037:16:0;92512:56;;;;-1:-1:-1;;;92512:56:0;;17830:2:1;92512:56:0;;;17812:21:1;17869:2;17849:18;;;17842:30;17908:28;17888:18;;;17881:56;17954:18;;92512:56:0;17628:350:1;92512:56:0;98986:8:::1;92667:17;92675:8;92667:7;:17::i;:::-;-1:-1:-1::0;;;;;92653:31:0::1;:10;-1:-1:-1::0;;;;;92653:31:0::1;;92645:101;;;::::0;-1:-1:-1;;;92645:101:0;;22148:2:1;92645:101:0::1;::::0;::::1;22130:21:1::0;22187:2;22167:18;;;22160:30;22226:34;22206:18;;;22199:62;22297:27;22277:18;;;22270:55;22342:19;;92645:101:0::1;21946:421:1::0;92645:101:0::1;99049:21:::2;::::0;;;:11:::2;:21;::::0;;;;;;99012:59;;-1:-1:-1;;;;;99049:21:0;;::::2;::::0;99061:8;;99012:59:::2;::::0;99049:21;99012:59:::2;-1:-1:-1::0;;99091:21:0::2;::::0;;;:11:::2;:21;::::0;;;;99084:28;;-1:-1:-1;;;;;;99084:28:0::2;::::0;;98884:236::o;100185:269::-;2013:6;;-1:-1:-1;;;;;2013:6:0;806:10;2160:23;2152:68;;;;-1:-1:-1;;;2152:68:0;;23699:2:1;2152:68:0;;;23681:21:1;;;23718:18;;;23711:30;23777:34;23757:18;;;23750:62;23829:18;;2152:68:0;23497:356:1;2152:68:0;-1:-1:-1;;;;;100294:89:0;::::1;100343:39;::::0;;;:26:::1;:39;::::0;;;;;;;100294:89;;::::1;::::0;::::1;::::0;100333:8;;100343:39:::1;;::::0;13255:14:1;;13248:22;13230:41;;13314:14;13307:22;13302:2;13287:18;;13280:50;13218:2;13203:18;;13068:268;100294:89:0::1;;;;;;;;-1:-1:-1::0;;;;;100396:39:0;;;::::1;;::::0;;;:26:::1;:39;::::0;;;;:50;;-1:-1:-1;;100396:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;100185:269::o;99336:146::-;2013:6;;-1:-1:-1;;;;;2013:6:0;806:10;2160:23;2152:68;;;;-1:-1:-1;;;2152:68:0;;23699:2:1;2152:68:0;;;23681:21:1;;;23718:18;;;23711:30;23777:34;23757:18;;;23750:62;23829:18;;2152:68:0;23497:356:1;2152:68:0;99438:6:::1;::::0;99404:41:::1;::::0;;13255:14:1;;13248:22;13230:41;;-1:-1:-1;;;99438:6:0;;::::1;;;13314:14:1::0;13307:22;13302:2;13287:18;;13280:50;99404:41:0::1;::::0;13203:18:1;99404:41:0::1;;;;;;;99458:6;:16:::0;;;::::1;;-1:-1:-1::0;;;99458:16:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;99336:146::o;27110:328::-;27285:41;806:10;27318:7;27285:18;:41::i;:::-;27277:103;;;;-1:-1:-1;;;27277:103:0;;26870:2:1;27277:103:0;;;26852:21:1;26909:2;26889:18;;;26882:30;26948:34;26928:18;;;26921:62;27019:19;26999:18;;;26992:47;27056:19;;27277:103:0;26668:413:1;27277:103:0;27391:39;27405:4;27411:2;27415:7;27424:5;27391:13;:39::i;:::-;27110:328;;;;:::o;98251:418::-;29013:4;29037:16;;;:7;:16;;;;;;98376:8;;-1:-1:-1;;;;;29037:16:0;92512:56;;;;-1:-1:-1;;;92512:56:0;;17830:2:1;92512:56:0;;;17812:21:1;17869:2;17849:18;;;17842:30;17908:28;17888:18;;;17881:56;17954:18;;92512:56:0;17628:350:1;92512:56:0;98406:8:::1;92667:17;92675:8;92667:7;:17::i;:::-;-1:-1:-1::0;;;;;92653:31:0::1;:10;-1:-1:-1::0;;;;;92653:31:0::1;;92645:101;;;::::0;-1:-1:-1;;;92645:101:0;;22148:2:1;92645:101:0::1;::::0;::::1;22130:21:1::0;22187:2;22167:18;;;22160:30;22226:34;22206:18;;;22199:62;22297:27;22277:18;;;22270:55;22342:19;;92645:101:0::1;21946:421:1::0;92645:101:0::1;-1:-1:-1::0;;;;;98440:39:0;::::2;;::::0;;;:26:::2;:39;::::0;;;;;::::2;;98432:92;;;::::0;-1:-1:-1;;;98432:92:0;;15429:2:1;98432:92:0::2;::::0;::::2;15411:21:1::0;15468:2;15448:18;;;15441:30;15507:34;15487:18;;;15480:62;15578:10;15558:18;;;15551:38;15606:19;;98432:92:0::2;15227:404:1::0;98432:92:0::2;98591:21;::::0;;;:11:::2;:21;::::0;;;;;;98542:71;;-1:-1:-1;;;;;98591:21:0;;::::2;::::0;98542:71;;::::2;::::0;98603:8;;98542:71:::2;::::0;98591:21;98542:71:::2;-1:-1:-1::0;;98626:21:0::2;::::0;;;:11:::2;:21;::::0;;;;;:35;;-1:-1:-1;;;;;;98626:35:0::2;-1:-1:-1::0;;;;;98626:35:0;;::::2;::::0;;;::::2;::::0;;98251:418::o;95814:650::-;95908:13;95889:8;92520:17;92528:8;29013:4;29037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29037:16:0;:30;;;28948:127;92520:17;92512:56;;;;-1:-1:-1;;;92512:56:0;;17830:2:1;92512:56:0;;;17812:21:1;17869:2;17849:18;;;17842:30;17908:28;17888:18;;;17881:56;17954:18;;92512:56:0;17628:350:1;92512:56:0;96028:6:::1;::::0;-1:-1:-1;;;96028:6:0;::::1;;;:45:::0;::::1;;;-1:-1:-1::0;96071:1:0::1;96038:21:::0;;;:11:::1;:21;::::0;;;;;-1:-1:-1;;;;;96038:21:0::1;:35:::0;::::1;96028:45;:98;;;;-1:-1:-1::0;96077:49:0::1;96104:21:::0;;;:11:::1;:21;::::0;;;;;;;;-1:-1:-1;;;;;96104:21:0::1;96077:49:::0;;:26:::1;:49:::0;;;;;;::::1;;96028:98;96024:231;;;96179:37;96207:8;96179:27;:37::i;:::-;-1:-1:-1::0;;;;;96179:54:0::1;;96234:8;96179:64;;;;;;;;;;;;;13487:25:1::0;;13475:2;13460:18;;13341:177;96179:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;96179:64:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;96172:71;;;;96024:231;96301:21;96325:10;:8;:10::i;:::-;96301:34;;96377:1;96359:7;96353:21;:25;:103;;;;;;;;;;;;;::::0;::::1;;;96405:7;96414:19;:8;:17;:19::i;:::-;96435:14;96388:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96353:103;96346:110:::0;95814:650;-1:-1:-1;;;;95814:650:0:o;72564:134::-;72636:7;72663:18;;;:12;:18;;;;;:27;;:25;:27::i;73079:201::-;73196:31;73213:4;73219:7;73196:16;:31::i;96972:312::-;-1:-1:-1;;;;;97153:23:0;;97116:15;97153:23;;;:12;:23;;;;;;;;97149:67;;;-1:-1:-1;97200:4:0;97193:11;;97149:67;-1:-1:-1;;;;;26334:25:0;;;26310:4;26334:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;97235:41;26213:164;2840:192;2013:6;;-1:-1:-1;;;;;2013:6:0;806:10;2160:23;2152:68;;;;-1:-1:-1;;;2152:68:0;;23699:2:1;2152:68:0;;;23681:21:1;;;23718:18;;;23711:30;23777:34;23757:18;;;23750:62;23829:18;;2152:68:0;23497:356:1;2152:68:0;-1:-1:-1;;;;;2929:22:0;::::1;2921:73;;;::::0;-1:-1:-1;;;2921:73:0;;17423:2:1;2921:73:0::1;::::0;::::1;17405:21:1::0;17462:2;17442:18;;;17435:30;17501:34;17481:18;;;17474:62;17572:8;17552:18;;;17545:36;17598:19;;2921:73:0::1;17221:402:1::0;2921:73:0::1;3005:19;3015:8;3005:9;:19::i;74670:114::-:0;74762:14;;74670:114::o;74792:127::-;74881:19;;74899:1;74881:19;;;74792:127::o;57447:112::-;57526:25;57537:4;57543:7;57526:10;:25::i;66232:152::-;66302:4;66326:50;66331:3;-1:-1:-1;;;;;66351:23:0;;66326:4;:50::i;79087:254::-;79268:4;79297:36;79321:11;79297:23;:36::i;32930:174::-;33005:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;33005:29:0;-1:-1:-1;;;;;33005:29:0;;;;;;;;:24;;33059:23;33005:24;33059:14;:23::i;:::-;-1:-1:-1;;;;;33050:46:0;;;;;;;;;;;32930:174;;:::o;29932:110::-;30008:26;30018:2;30022:7;30008:26;;;;;;;;;;;;:9;:26::i;29242:348::-;29335:4;29037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29037:16:0;29352:73;;;;-1:-1:-1;;;29352:73:0;;19732:2:1;29352:73:0;;;19714:21:1;19771:2;19751:18;;;19744:30;19810:34;19790:18;;;19783:62;-1:-1:-1;;;19861:18:1;;;19854:42;19913:19;;29352:73:0;19530:408:1;29352:73:0;29436:13;29452:23;29467:7;29452:14;:23::i;:::-;29436:39;;29505:5;-1:-1:-1;;;;;29494:16:0;:7;-1:-1:-1;;;;;29494:16:0;;:51;;;;29538:7;-1:-1:-1;;;;;29514:31:0;:20;29526:7;29514:11;:20::i;:::-;-1:-1:-1;;;;;29514:31:0;;29494:51;:87;;;;29549:32;29566:5;29573:7;29549:16;:32::i;32234:578::-;32393:4;-1:-1:-1;;;;;32366:31:0;:23;32381:7;32366:14;:23::i;:::-;-1:-1:-1;;;;;32366:31:0;;32358:85;;;;-1:-1:-1;;;32358:85:0;;24414:2:1;32358:85:0;;;24396:21:1;24453:2;24433:18;;;24426:30;24492:34;24472:18;;;24465:62;24563:11;24543:18;;;24536:39;24592:19;;32358:85:0;24212:405:1;32358:85:0;-1:-1:-1;;;;;32462:16:0;;32454:65;;;;-1:-1:-1;;;32454:65:0;;18973:2:1;32454:65:0;;;18955:21:1;19012:2;18992:18;;;18985:30;19051:34;19031:18;;;19024:62;19122:6;19102:18;;;19095:34;19146:19;;32454:65:0;18771:400:1;32454:65:0;32532:39;32553:4;32559:2;32563:7;32532:20;:39::i;:::-;32636:29;32653:1;32657:7;32636:8;:29::i;:::-;-1:-1:-1;;;;;32678:15:0;;;;;;:9;:15;;;;;:20;;32697:1;;32678:15;:20;;32697:1;;32678:20;:::i;:::-;;;;-1:-1:-1;;;;;;;32709:13:0;;;;;;:9;:13;;;;;:18;;32726:1;;32709:13;:18;;32726:1;;32709:18;:::i;:::-;;;;-1:-1:-1;;32738:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32738:21:0;-1:-1:-1;;;;;32738:21:0;;;;;;;;;32777:27;;32738:16;;32777:27;;;;;;;32234:578;;;:::o;24339:334::-;29013:4;29037:16;;;:7;:16;;;;;;24412:13;;-1:-1:-1;;;;;29037:16:0;24438:76;;;;-1:-1:-1;;;24438:76:0;;24824:2:1;24438:76:0;;;24806:21:1;24863:2;24843:18;;;24836:30;24902:34;24882:18;;;24875:62;24973:17;24953:18;;;24946:45;25008:19;;24438:76:0;24622:411:1;24438:76:0;24527:21;24551:10;:8;:10::i;:::-;24527:34;;24603:1;24585:7;24579:21;:25;:86;;;;;;;;;;;;;;;;;24631:7;24640:18;:7;:16;:18::i;:::-;24614:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24572:93;24339:334;-1:-1:-1;;;24339:334:0:o;55598:147::-;55279:7;55306:12;;;;;;;;;;:22;;;53680:30;53691:4;806:10;53680;:30::i;:::-;55712:25:::1;55723:4;55729:7;55712:10;:25::i;56646:218::-:0;-1:-1:-1;;;;;56742:23:0;;806:10;56742:23;56734:83;;;;-1:-1:-1;;;56734:83:0;;29672:2:1;56734:83:0;;;29654:21:1;29711:2;29691:18;;;29684:30;29750:34;29730:18;;;29723:62;29821:17;29801:18;;;29794:45;29856:19;;56734:83:0;29470:411:1;56734:83:0;56830:26;56842:4;56848:7;56830:11;:26::i;66560:158::-;66633:4;66657:53;66665:3;-1:-1:-1;;;;;66685:23:0;;66657:7;:53::i;46092:120::-;45104:7;;;;45628:41;;;;-1:-1:-1;;;45628:41:0;;15838:2:1;45628:41:0;;;15820:21:1;15877:2;15857:18;;;15850:30;15916:22;15896:18;;;15889:50;15956:18;;45628:41:0;15636:344:1;45628:41:0;46151:7:::1;:15:::0;;-1:-1:-1;;46151:15:0::1;::::0;;46182:22:::1;806:10:::0;46191:12:::1;46182:22;::::0;-1:-1:-1;;;;;11588:55:1;;;11570:74;;11558:2;11543:18;46182:22:0::1;;;;;;;46092:120::o:0;31537:360::-;31597:13;31613:23;31628:7;31613:14;:23::i;:::-;31597:39;;31649:48;31670:5;31685:1;31689:7;31649:20;:48::i;:::-;31738:29;31755:1;31759:7;31738:8;:29::i;:::-;-1:-1:-1;;;;;31780:16:0;;;;;;:9;:16;;;;;:21;;31800:1;;31780:16;:21;;31800:1;;31780:21;:::i;:::-;;;;-1:-1:-1;;31819:16:0;;;;:7;:16;;;;;;31812:23;;-1:-1:-1;;;;;;31812:23:0;;;31853:36;31827:7;;31819:16;-1:-1:-1;;;;;31853:36:0;;;;;31819:16;;31853:36;31586:311;31537:360;:::o;3040:173::-;3115:6;;;-1:-1:-1;;;;;3132:17:0;;;-1:-1:-1;;;;;;3132:17:0;;;;;;;3165:40;;3115:6;;;3132:17;3115:6;;3165:40;;3096:16;;3165:40;3085:128;3040:173;:::o;45833:118::-;45104:7;;;;45358:9;45350:38;;;;-1:-1:-1;;;45350:38:0;;20145:2:1;45350:38:0;;;20127:21:1;20184:2;20164:18;;;20157:30;20223:18;20203;;;20196:46;20259:18;;45350:38:0;19943:340:1;45350:38:0;45893:7:::1;:14:::0;;-1:-1:-1;;45893:14:0::1;45903:4;45893:14;::::0;;45923:20:::1;45930:12;806:10:::0;;726:98;67528:158;67602:7;67653:22;67657:3;67669:5;67653:3;:22::i;28320:315::-;28477:28;28487:4;28493:2;28497:7;28477:9;:28::i;:::-;28524:48;28547:4;28553:2;28557:7;28566:5;28524:22;:48::i;:::-;28516:111;;;;-1:-1:-1;;;28516:111:0;;17004:2:1;28516:111:0;;;16986:21:1;17043:2;17023:18;;;17016:30;17082:34;17062:18;;;17055:62;-1:-1:-1;;;17133:18:1;;;17126:48;17191:19;;28516:111:0;16802:414:1;102356:372:0;102433:24;102474:21;;;:11;:21;;;;;;-1:-1:-1;;;;;102474:21:0;:35;;;;:88;;-1:-1:-1;102513:49:0;102540:21;;;:11;:21;;;;;;;;;-1:-1:-1;;;;;102540:21:0;102513:49;;:26;:49;;;;;;;;102474:88;102470:175;;;-1:-1:-1;102611:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;102611:21:0;;102356:372::o;102470:175::-;-1:-1:-1;;102687:32:0;;-1:-1:-1;;;;;102687:32:0;;102356:372::o;77061:114::-;77121:13;77154;77147:20;;;;;:::i;18993:723::-;19049:13;19270:10;19266:53;;-1:-1:-1;;19297:10:0;;;;;;;;;;;;-1:-1:-1;;;19297:10:0;;;;;18993:723::o;19266:53::-;19344:5;19329:12;19385:78;19392:9;;19385:78;;19418:8;;;;:::i;:::-;;-1:-1:-1;19441:10:0;;-1:-1:-1;19449:2:0;19441:10;;:::i;:::-;;;19385:78;;;19473:19;19505:6;19495:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19495:17:0;;19473:39;;19523:154;19530:10;;19523:154;;19557:11;19567:1;19557:11;;:::i;:::-;;-1:-1:-1;19626:10:0;19634:2;19626:5;:10;:::i;:::-;19613:24;;:2;:24;:::i;:::-;19600:39;;19583:6;19590;19583:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19583:56:0;;;;;;;;-1:-1:-1;19654:11:0;19663:2;19654:11;;:::i;:::-;;;19523:154;;67057:117;67120:7;67147:19;67155:3;62541:18;;62458:109;55990:149;55279:7;55306:12;;;;;;;;;;:22;;;53680:30;53691:4;806:10;53680;:30::i;:::-;56105:26:::1;56117:4;56123:7;56105:11;:26::i;57950:229::-:0;54176:4;54200:12;;;;;;;;;;;-1:-1:-1;;;;;54200:29:0;;;;;;;;;;;;58020:152;;58064:6;:12;;;;;;;;;;;-1:-1:-1;;;;;58064:29:0;;;;;;;;;:36;;-1:-1:-1;;58064:36:0;58096:4;58064:36;;;58147:12;806:10;;726:98;58147:12;-1:-1:-1;;;;;58120:40:0;58138:7;-1:-1:-1;;;;;58120:40:0;58132:4;58120:40;;;;;;;;;;57950:229;;:::o;60147:414::-;60210:4;62340:19;;;:12;;;:19;;;;;;60227:327;;-1:-1:-1;60270:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;60453:18;;60431:19;;;:12;;;:19;;;;;;:40;;;;60486:11;;60227:327;-1:-1:-1;60537:5:0;60530:12;;37098:224;37200:4;-1:-1:-1;;;;;;37224:50:0;;37239:35;37224:50;;:90;;;37278:36;37302:11;37278:23;:36::i;30269:321::-;30399:18;30405:2;30409:7;30399:5;:18::i;:::-;30450:54;30481:1;30485:2;30489:7;30498:5;30450:22;:54::i;:::-;30428:154;;;;-1:-1:-1;;;30428:154:0;;17004:2:1;30428:154:0;;;16986:21:1;17043:2;17023:18;;;17016:30;17082:34;17062:18;;;17055:62;-1:-1:-1;;;17133:18:1;;;17126:48;17191:19;;30428:154:0;16802:414:1;78776:239:0;78962:45;78989:4;78995:2;78999:7;78962:26;:45::i;54527:497::-;54176:4;54200:12;;;;;;;;;;;-1:-1:-1;;;;;54200:29:0;;;;;;;;;;;;54603:414;;54796:41;54824:7;-1:-1:-1;;;;;54796:41:0;54834:2;54796:19;:41::i;:::-;54910:38;54938:4;54945:2;54910:19;:38::i;:::-;54701:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;54701:270:0;;;;;;;;;;-1:-1:-1;;;54647:358:0;;;;;;;:::i;58187:230::-;54176:4;54200:12;;;;;;;;;;;-1:-1:-1;;;;;54200:29:0;;;;;;;;;;;;58258:152;;;58333:5;58301:12;;;;;;;;;;;-1:-1:-1;;;;;58301:29:0;;;;;;;;;;:37;;-1:-1:-1;;58301:37:0;;;58358:40;806:10;;58301:12;;58358:40;;58333:5;58358:40;58187:230;;:::o;60737:1420::-;60803:4;60942:19;;;:12;;;:19;;;;;;60978:15;;60974:1176;;61353:21;61377:14;61390:1;61377:10;:14;:::i;:::-;61426:18;;61353:38;;-1:-1:-1;61406:17:0;;61426:22;;61447:1;;61426:22;:::i;:::-;61406:42;;61482:13;61469:9;:26;61465:405;;61516:17;61536:3;:11;;61548:9;61536:22;;;;;;;;:::i;:::-;;;;;;;;;61516:42;;61690:9;61661:3;:11;;61673:13;61661:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;61775:23;;;:12;;;:23;;;;;:36;;;61465:405;61951:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62046:3;:12;;:19;62059:5;62046:19;;;;;;;;;;;62039:26;;;62089:4;62082:11;;;;;;;60974:1176;62133:5;62126:12;;;;;62921:120;62988:7;63015:3;:11;;63027:5;63015:18;;;;;;;;:::i;:::-;;;;;;;;;63008:25;;62921:120;;;;:::o;33669:799::-;33824:4;-1:-1:-1;;;;;33845:13:0;;11670:20;11718:8;33841:620;;33881:72;;-1:-1:-1;;;33881:72:0;;-1:-1:-1;;;;;33881:36:0;;;;;:72;;806:10;;33932:4;;33938:7;;33947:5;;33881:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33881:72:0;;;;;;;;-1:-1:-1;;33881:72:0;;;;;;;;;;;;:::i;:::-;;;33877:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34123:13:0;;34119:272;;34166:60;;-1:-1:-1;;;34166:60:0;;17004:2:1;34166:60:0;;;16986:21:1;17043:2;17023:18;;;17016:30;17082:34;17062:18;;;17055:62;-1:-1:-1;;;17133:18:1;;;17126:48;17191:19;;34166:60:0;16802:414:1;34119:272:0;34341:6;34335:13;34326:6;34322:2;34318:15;34311:38;33877:529;-1:-1:-1;;;;;;34004:51:0;-1:-1:-1;;;34004:51:0;;-1:-1:-1;33997:58:0;;33841:620;-1:-1:-1;34445:4:0;33669:799;;;;;;:::o;23050:305::-;23152:4;-1:-1:-1;;;;;;23189:40:0;;23204:25;23189:40;;:105;;-1:-1:-1;;;;;;;23246:48:0;;23261:33;23246:48;23189:105;:158;;;;23311:36;23335:11;23311:23;:36::i;102796:161::-;102880:8;102873:15;;:3;:15;;102865:53;;;;-1:-1:-1;;;102865:53:0;;24060:2:1;102865:53:0;;;24042:21:1;24099:2;24079:18;;;24072:30;24138:27;24118:18;;;24111:55;24183:18;;102865:53:0;23858:349:1;102865:53:0;102929:20;102941:2;102945:3;102929:11;:20::i;46820:275::-;46964:45;46991:4;46997:2;47001:7;46964:26;:45::i;:::-;45104:7;;;;47030:9;47022:65;;;;-1:-1:-1;;;47022:65:0;;15017:2:1;47022:65:0;;;14999:21:1;15056:2;15036:18;;;15029:30;15095:34;15075:18;;;15068:62;15166:13;15146:18;;;15139:41;15197:19;;47022:65:0;14815:407:1;20294:451:0;20369:13;20395:19;20427:10;20431:6;20427:1;:10;:::i;:::-;:14;;20440:1;20427:14;:::i;:::-;20417:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20417:25:0;;20395:47;;-1:-1:-1;;;20453:6:0;20460:1;20453:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;20453:15:0;;;;;;;;;20479;:6;20486:1;20479:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;20479:15:0;;;;;;;;-1:-1:-1;20510:9:0;20522:10;20526:6;20522:1;:10;:::i;:::-;:14;;20535:1;20522:14;:::i;:::-;20510:26;;20505:135;20542:1;20538;:5;20505:135;;;20577:12;20590:5;20598:3;20590:11;20577:25;;;;;;;:::i;:::-;;;;20565:6;20572:1;20565:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;20565:37:0;;;;;;;;-1:-1:-1;20627:1:0;20617:11;;;;;20545:3;;;:::i;:::-;;;20505:135;;;-1:-1:-1;20658:10:0;;20650:55;;;;-1:-1:-1;;;20650:55:0;;14656:2:1;20650:55:0;;;14638:21:1;;;14675:18;;;14668:30;14734:34;14714:18;;;14707:62;14786:18;;20650:55:0;14454:356:1;71432:214:0;71517:4;-1:-1:-1;;;;;;71541:57:0;;71556:42;71541:57;;:97;;;71602:36;71626:11;71602:23;:36::i;30926:382::-;-1:-1:-1;;;;;31006:16:0;;30998:61;;;;-1:-1:-1;;;30998:61:0;;22574:2:1;30998:61:0;;;22556:21:1;;;22593:18;;;22586:30;22652:34;22632:18;;;22625:62;22704:18;;30998:61:0;22372:356:1;30998:61:0;29013:4;29037:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29037:16:0;:30;31070:58;;;;-1:-1:-1;;;31070:58:0;;18185:2:1;31070:58:0;;;18167:21:1;18224:2;18204:18;;;18197:30;18263;18243:18;;;18236:58;18311:18;;31070:58:0;17983:352:1;31070:58:0;31141:45;31170:1;31174:2;31178:7;31141:20;:45::i;:::-;-1:-1:-1;;;;;31199:13:0;;;;;;:9;:13;;;;;:18;;31216:1;;31199:13;:18;;31216:1;;31199:18;:::i;:::-;;;;-1:-1:-1;;31228:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31228:21:0;-1:-1:-1;;;;;31228:21:0;;;;;;;;31267:33;;31228:16;;;31267:33;;31228:16;;31267:33;30926:382;;:::o;38774:589::-;-1:-1:-1;;;;;38980:18:0;;38976:187;;39015:40;39047:7;40190:10;:17;;40163:24;;;;:15;:24;;;;;:44;;;40218:24;;;;;;;;;;;;40086:164;39015:40;38976:187;;;39085:2;-1:-1:-1;;;;;39077:10:0;:4;-1:-1:-1;;;;;39077:10:0;;39073:90;;39104:47;39137:4;39143:7;39104:32;:47::i;:::-;-1:-1:-1;;;;;39177:16:0;;39173:183;;39210:45;39247:7;39210:36;:45::i;39173:183::-;39283:4;-1:-1:-1;;;;;39277:10:0;:2;-1:-1:-1;;;;;39277:10:0;;39273:83;;39304:40;39332:2;39336:7;39304:27;:40::i;53802:204::-;53887:4;-1:-1:-1;;;;;;53911:47:0;;53926:32;53911:47;;:87;;-1:-1:-1;21676:25:0;-1:-1:-1;;;;;;21661:40:0;;;53962:36;21552:157;40877:988;41143:22;41193:1;41168:22;41185:4;41168:16;:22::i;:::-;:26;;;;:::i;:::-;41205:18;41226:26;;;:17;:26;;;;;;41143:51;;-1:-1:-1;41359:28:0;;;41355:328;;-1:-1:-1;;;;;41426:18:0;;41404:19;41426:18;;;:12;:18;;;;;;;;:34;;;;;;;;;41477:30;;;;;;:44;;;41594:30;;:17;:30;;;;;:43;;;41355:328;-1:-1:-1;41779:26:0;;;;:17;:26;;;;;;;;41772:33;;;-1:-1:-1;;;;;41823:18:0;;;;;:12;:18;;;;;:34;;;;;;;41816:41;40877:988::o;42160:1079::-;42438:10;:17;42413:22;;42438:21;;42458:1;;42438:21;:::i;:::-;42470:18;42491:24;;;:15;:24;;;;;;42864:10;:26;;42413:46;;-1:-1:-1;42491:24:0;;42413:46;;42864:26;;;;;;:::i;:::-;;;;;;;;;42842:48;;42928:11;42903:10;42914;42903:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43008:28;;;:15;:28;;;;;;;:41;;;43180:24;;;;;43173:31;43215:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42231:1008;;;42160:1079;:::o;39664:221::-;39749:14;39766:20;39783:2;39766:16;:20::i;:::-;-1:-1:-1;;;;;39797:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;39842:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;39664:221:0:o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1016::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1730:2:1;1715:18;;1702:32;1743:33;1702:32;1743:33;:::i;:::-;1795:7;-1:-1:-1;1849:2:1;1834:18;;1821:32;;-1:-1:-1;1904:2:1;1889:18;;1876:32;1931:18;1920:30;;1917:50;;;1963:1;1960;1953:12;1917:50;1986:22;;2039:4;2031:13;;2027:27;-1:-1:-1;2017:55:1;;2068:1;2065;2058:12;2017:55;2104:2;2091:16;2129:48;2145:31;2173:2;2145:31;:::i;:::-;2129:48;:::i;:::-;2200:2;2193:5;2186:17;2240:7;2235:2;2230;2226;2222:11;2218:20;2215:33;2212:53;;;2261:1;2258;2251:12;2212:53;2316:2;2311;2307;2303:11;2298:2;2291:5;2287:14;2274:45;2360:1;2355:2;2350;2343:5;2339:14;2335:23;2328:34;2381:5;2371:15;;;;;1376:1016;;;;;;;:::o;2397:1092::-;2490:6;2498;2551:2;2539:9;2530:7;2526:23;2522:32;2519:52;;;2567:1;2564;2557:12;2519:52;2606:9;2593:23;2625:31;2650:5;2625:31;:::i;:::-;2675:5;-1:-1:-1;2699:2:1;2737:18;;;2724:32;2775:18;2805:14;;;2802:34;;;2832:1;2829;2822:12;2802:34;2870:6;2859:9;2855:22;2845:32;;2915:7;2908:4;2904:2;2900:13;2896:27;2886:55;;2937:1;2934;2927:12;2886:55;2973:2;2960:16;2995:2;2991;2988:10;2985:36;;;3001:18;;:::i;:::-;3047:2;3044:1;3040:10;3030:20;;3070:28;3094:2;3090;3086:11;3070:28;:::i;:::-;3132:15;;;3163:12;;;;3195:11;;;3225;;;3221:20;;3218:33;-1:-1:-1;3215:53:1;;;3264:1;3261;3254:12;3215:53;3286:1;3277:10;;3296:163;3310:2;3307:1;3304:9;3296:163;;;3367:17;;3355:30;;3328:1;3321:9;;;;;3405:12;;;;3437;;3296:163;;;3300:3;3478:5;3468:15;;;;;;;;2397:1092;;;;;:::o;3494:382::-;3559:6;3567;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;:::-;3744:5;-1:-1:-1;3801:2:1;3786:18;;3773:32;3814:30;3773:32;3814:30;:::i;3881:315::-;3949:6;3957;4010:2;3998:9;3989:7;3985:23;3981:32;3978:52;;;4026:1;4023;4016:12;3978:52;4065:9;4052:23;4084:31;4109:5;4084:31;:::i;:::-;4134:5;4186:2;4171:18;;;;4158:32;;-1:-1:-1;;;3881:315:1:o;4201:241::-;4257:6;4310:2;4298:9;4289:7;4285:23;4281:32;4278:52;;;4326:1;4323;4316:12;4278:52;4365:9;4352:23;4384:28;4406:5;4384:28;:::i;4447:245::-;4514:6;4567:2;4555:9;4546:7;4542:23;4538:32;4535:52;;;4583:1;4580;4573:12;4535:52;4615:9;4609:16;4634:28;4656:5;4634:28;:::i;4697:180::-;4756:6;4809:2;4797:9;4788:7;4784:23;4780:32;4777:52;;;4825:1;4822;4815:12;4777:52;-1:-1:-1;4848:23:1;;4697:180;-1:-1:-1;4697:180:1:o;4882:315::-;4950:6;4958;5011:2;4999:9;4990:7;4986:23;4982:32;4979:52;;;5027:1;5024;5017:12;4979:52;5063:9;5050:23;5040:33;;5123:2;5112:9;5108:18;5095:32;5136:31;5161:5;5136:31;:::i;5202:248::-;5270:6;5278;5331:2;5319:9;5310:7;5306:23;5302:32;5299:52;;;5347:1;5344;5337:12;5299:52;-1:-1:-1;;5370:23:1;;;5440:2;5425:18;;;5412:32;;-1:-1:-1;5202:248:1:o;5455:245::-;5513:6;5566:2;5554:9;5545:7;5541:23;5537:32;5534:52;;;5582:1;5579;5572:12;5534:52;5621:9;5608:23;5640:30;5664:5;5640:30;:::i;5705:249::-;5774:6;5827:2;5815:9;5806:7;5802:23;5798:32;5795:52;;;5843:1;5840;5833:12;5795:52;5875:9;5869:16;5894:30;5918:5;5894:30;:::i;5959:635::-;6039:6;6092:2;6080:9;6071:7;6067:23;6063:32;6060:52;;;6108:1;6105;6098:12;6060:52;6141:9;6135:16;6174:18;6166:6;6163:30;6160:50;;;6206:1;6203;6196:12;6160:50;6229:22;;6282:4;6274:13;;6270:27;-1:-1:-1;6260:55:1;;6311:1;6308;6301:12;6260:55;6340:2;6334:9;6365:48;6381:31;6409:2;6381:31;:::i;6365:48::-;6436:2;6429:5;6422:17;6476:7;6471:2;6466;6462;6458:11;6454:20;6451:33;6448:53;;;6497:1;6494;6487:12;6448:53;6510:54;6561:2;6556;6549:5;6545:14;6540:2;6536;6532:11;6510:54;:::i;:::-;6583:5;5959:635;-1:-1:-1;;;;;5959:635:1:o;6599:272::-;6657:6;6710:2;6698:9;6689:7;6685:23;6681:32;6678:52;;;6726:1;6723;6716:12;6678:52;6765:9;6752:23;6815:6;6808:5;6804:18;6797:5;6794:29;6784:57;;6837:1;6834;6827:12;7061:184;7131:6;7184:2;7172:9;7163:7;7159:23;7155:32;7152:52;;;7200:1;7197;7190:12;7152:52;-1:-1:-1;7223:16:1;;7061:184;-1:-1:-1;7061:184:1:o;7823:269::-;7880:6;7933:2;7921:9;7912:7;7908:23;7904:32;7901:52;;;7949:1;7946;7939:12;7901:52;7988:9;7975:23;8038:4;8031:5;8027:16;8020:5;8017:27;8007:55;;8058:1;8055;8048:12;8097:257;8138:3;8176:5;8170:12;8203:6;8198:3;8191:19;8219:63;8275:6;8268:4;8263:3;8259:14;8252:4;8245:5;8241:16;8219:63;:::i;:::-;8336:2;8315:15;-1:-1:-1;;8311:29:1;8302:39;;;;8343:4;8298:50;;8097:257;-1:-1:-1;;8097:257:1:o;8359:470::-;8538:3;8576:6;8570:13;8592:53;8638:6;8633:3;8626:4;8618:6;8614:17;8592:53;:::i;:::-;8708:13;;8667:16;;;;8730:57;8708:13;8667:16;8764:4;8752:17;;8730:57;:::i;:::-;8803:20;;8359:470;-1:-1:-1;;;;8359:470:1:o;8834:1584::-;9058:3;9096:6;9090:13;9122:4;9135:51;9179:6;9174:3;9169:2;9161:6;9157:15;9135:51;:::i;:::-;9249:13;;9208:16;;;;9271:55;9249:13;9208:16;9293:15;;;9271:55;:::i;:::-;9415:13;;9348:20;;;9388:1;;9475;9497:18;;;;9550;;;;9577:93;;9655:4;9645:8;9641:19;9629:31;;9577:93;9718:2;9708:8;9705:16;9685:18;9682:40;9679:224;;;-1:-1:-1;;;9752:3:1;9745:90;9858:4;9855:1;9848:15;9888:4;9883:3;9876:17;9679:224;9919:18;9946:110;;;;10070:1;10065:328;;;;9912:481;;9946:110;-1:-1:-1;;9981:24:1;;9967:39;;10026:20;;;;-1:-1:-1;9946:110:1;;10065:328;30994:1;30987:14;;;31031:4;31018:18;;10160:1;10174:169;10188:8;10185:1;10182:15;10174:169;;;10270:14;;10255:13;;;10248:37;10313:16;;;;10205:10;;10174:169;;;10178:3;;10374:8;10367:5;10363:20;10356:27;;9912:481;-1:-1:-1;10409:3:1;;8834:1584;-1:-1:-1;;;;;;;;;;;8834:1584:1:o;10633:786::-;11044:25;11039:3;11032:38;11014:3;11099:6;11093:13;11115:62;11170:6;11165:2;11160:3;11156:12;11149:4;11141:6;11137:17;11115:62;:::i;:::-;11241:19;11236:2;11196:16;;;11228:11;;;11221:40;11286:13;;11308:63;11286:13;11357:2;11349:11;;11342:4;11330:17;;11308:63;:::i;:::-;11391:17;11410:2;11387:26;;10633:786;-1:-1:-1;;;;10633:786:1:o;12058:511::-;12252:4;-1:-1:-1;;;;;12362:2:1;12354:6;12350:15;12339:9;12332:34;12414:2;12406:6;12402:15;12397:2;12386:9;12382:18;12375:43;;12454:6;12449:2;12438:9;12434:18;12427:34;12497:3;12492:2;12481:9;12477:18;12470:31;12518:45;12558:3;12547:9;12543:19;12535:6;12518:45;:::i;:::-;12510:53;12058:511;-1:-1:-1;;;;;;12058:511:1:o;13523:219::-;13672:2;13661:9;13654:21;13635:4;13692:44;13732:2;13721:9;13717:18;13709:6;13692:44;:::i;30450:275::-;30521:2;30515:9;30586:2;30567:13;;-1:-1:-1;;30563:27:1;30551:40;;30621:18;30606:34;;30642:22;;;30603:62;30600:88;;;30668:18;;:::i;:::-;30704:2;30697:22;30450:275;;-1:-1:-1;30450:275:1:o;30730:186::-;30778:4;30811:18;30803:6;30800:30;30797:56;;;30833:18;;:::i;:::-;-1:-1:-1;30899:2:1;30878:15;-1:-1:-1;;30874:29:1;30905:4;30870:40;;30730:186::o;31047:128::-;31087:3;31118:1;31114:6;31111:1;31108:13;31105:39;;;31124:18;;:::i;:::-;-1:-1:-1;31160:9:1;;31047:128::o;31180:120::-;31220:1;31246;31236:35;;31251:18;;:::i;:::-;-1:-1:-1;31285:9:1;;31180:120::o;31305:168::-;31345:7;31411:1;31407;31403:6;31399:14;31396:1;31393:21;31388:1;31381:9;31374:17;31370:45;31367:71;;;31418:18;;:::i;:::-;-1:-1:-1;31458:9:1;;31305:168::o;31478:125::-;31518:4;31546:1;31543;31540:8;31537:34;;;31551:18;;:::i;:::-;-1:-1:-1;31588:9:1;;31478:125::o;31608:258::-;31680:1;31690:113;31704:6;31701:1;31698:13;31690:113;;;31780:11;;;31774:18;31761:11;;;31754:39;31726:2;31719:10;31690:113;;;31821:6;31818:1;31815:13;31812:48;;;-1:-1:-1;;31856:1:1;31838:16;;31831:27;31608:258::o;31871:136::-;31910:3;31938:5;31928:39;;31947:18;;:::i;:::-;-1:-1:-1;;;31983:18:1;;31871:136::o;32012:437::-;32091:1;32087:12;;;;32134;;;32155:61;;32209:4;32201:6;32197:17;32187:27;;32155:61;32262:2;32254:6;32251:14;32231:18;32228:38;32225:218;;;-1:-1:-1;;;32296:1:1;32289:88;32400:4;32397:1;32390:15;32428:4;32425:1;32418:15;32454:135;32493:3;-1:-1:-1;;32514:17:1;;32511:43;;;32534:18;;:::i;:::-;-1:-1:-1;32581:1:1;32570:13;;32454:135::o;32594:112::-;32626:1;32652;32642:35;;32657:18;;:::i;:::-;-1:-1:-1;32691:9:1;;32594:112::o;32711:184::-;-1:-1:-1;;;32760:1:1;32753:88;32860:4;32857:1;32850:15;32884:4;32881:1;32874:15;32900:184;-1:-1:-1;;;32949:1:1;32942:88;33049:4;33046:1;33039:15;33073:4;33070:1;33063:15;33089:184;-1:-1:-1;;;33138:1:1;33131:88;33238:4;33235:1;33228:15;33262:4;33259:1;33252:15;33278:184;-1:-1:-1;;;33327:1:1;33320:88;33427:4;33424:1;33417:15;33451:4;33448:1;33441:15;33467:184;-1:-1:-1;;;33516:1:1;33509:88;33616:4;33613:1;33606:15;33640:4;33637:1;33630:15;33656:154;-1:-1:-1;;;;;33735:5:1;33731:54;33724:5;33721:65;33711:93;;33800:1;33797;33790:12;33815:118;33901:5;33894:13;33887:21;33880:5;33877:32;33867:60;;33923:1;33920;33913:12;33938:177;-1:-1:-1;;;;;;34016:5:1;34012:78;34005:5;34002:89;33992:117;;34105:1;34102;34095:12

Swarm Source

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