ETH Price: $3,518.47 (+5.16%)

Token

XBorg (XBORG)
 

Overview

Max Total Supply

2,500 XBORG

Holders

327

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 XBORG
0x12e8987C762701d60f0FcfeE687Bb8E4c07555aa
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

XBorgs’ are a genesis collection on Ethereum blockchain and a brand mascot of VISPX. The XBorg NFTs are made up of hundreds of hand-drawn exciting visual traits that make them unique.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
XBorg

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

//                      //  ////////////////                 ///\\\               ////////////////                   ///////
  //                  //    //             //             //        \\            //             //                //       //
    //              //      //              //          //            \\          //              //             //           //
      //          //        //               //       //                \\        //               //          //               //
        //      //          //              //      //                    \\      //              //         //
          //  //            //             //     //                        \\    //             //        //
            //              ////////////////     //                          \\   ///////////////        //            ///////////
          //  //            //             //    \\                          //   //           //         //           //       // 
        //      //          //              //     \\                      //     //            //          //         //       //
      //          //        //               //      \\                  //       //             //           //                //
    //              //      //              //         \\              //         //              //            //              //
  //                  //    //             //            \\          //           //               //             //            //
//                      //  ////////////////                \\\\////              //                //              /////////////


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;

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

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

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;

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

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

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

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

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


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);
    }
}


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;
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721X is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint64 balance;
        uint64 numberMinted;
    }

    uint256 private currentIndex = 0;
    uint256 private burnedIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) private _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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
    * `maxBatchSize` refers to how much a minter can mint at a time.
    * `collectionSize_` refers to how many tokens are in the collection.
    */
    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(collectionSize_ > 0, "ERC721X: collection must have a nonzero supply");
        require(maxBatchSize_ > 0, "ERC721X: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

    /**
    * @dev See Remove store data in IERC721Enumerable {IERC721Enumerable-totalSupply}.
    */
    function totalSupply() public view returns (uint256) {
        return currentIndex - burnedIndex;
    }

    /**
    * @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 override returns (uint256) {
        require(owner != address(0), "ERC721X: balance query for the zero address");
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), "ERC721X: number minted query for the zero address");
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), "ERC721X: owner query for nonexistent token");
        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }
        revert("ERC721X: unable to determine the owner of token");
    }

    /**
    * @dev See {IERC721-ownerOf}.
    */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
    * @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(), ".json")): "";
    }

    /**
    * @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 override {
        address owner = ERC721X.ownerOf(tokenId);
        require(to != owner, "ERC721X: approval to current owner");
        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),"ERC721X: approve caller is not owner nor approved for all");
        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
    * @dev See {IERC721-setApprovalForAll}.
    */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), "ERC721X: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
    * @dev See {IERC721-safeTransferFrom}.
    */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721X: 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`),
    */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    /**
     * @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), "ERC721X: operator query for nonexistent token");
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);
        return(spender == prevOwnership.addr || getApproved(tokenId) == spender || isApprovedForAll(prevOwnership.addr, spender));
        //return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

    /**
    * @dev Mints `quantity` tokens and transfers them to `to`.
    *
    * Requirements:
    *
    * - there must be `quantity` tokens remaining unminted in the total collection.
    * - `to` cannot be the zero address.
    * - `quantity` cannot be larger than the max batch size.
    *
    * Emits a {Transfer} event.
    */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721X: mint to the zero address");
        require(!_exists(startTokenId), "ERC721X: token already minted");
        require(quantity <= maxBatchSize, "ERC721X: quantity to mint over than max batch size");

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

            uint256 updatedIndex = startTokenId;

            for (uint256 i = 0; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                require(_checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721X: transfer to non ERC721Receiver implementer");
                updatedIndex++;
            }
            currentIndex = updatedIndex;
            _afterTokenTransfers(address(0), to, startTokenId, quantity);
        }
    }

    /**
    * @dev burn function Transfers `tokenId` from `from` to `unused address`.
    *
    * Requirements:
    *
    * - `to` cannot be the zero address and fix to unused address.
    * - `tokenId` token must be owned by `from`.
    *
    * Emits a {Transfer} event.
    */

    function _burn(
        address from,
        uint256 tokenId
        ) internal virtual {
        address to = 0x000000000000000000000000000000000000dEaD;
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        //bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
        //getApproved(tokenId) == _msgSender() ||
        //isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721X: burn caller is not owner nor approved");
        require(prevOwnership.addr == from, "ERC721X: burn from incorrect owner");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                prevOwnership.addr,
                prevOwnership.startTimestamp
                );
            }
        }
        emit Transfer(from, to, tokenId);
        burnedIndex++;
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
    * @dev Transfers `tokenId` from `from` to `to`.
    *
    * 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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        //bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
        //getApproved(tokenId) == _msgSender() ||
        //isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721X: transfer caller is not owner nor approved");
        require(prevOwnership.addr == from, "ERC721X: transfer from incorrect owner");
        require(to != address(0), "ERC721X: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                prevOwnership.addr,
                prevOwnership.startTimestamp
                );
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

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

    uint256 public nextOwnerToExplicitlySet = 0;

    /**
    * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
    */
    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        // We know if the last one in the group exists, all in the group exist, due to serial ordering.
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                ownership.addr,
                ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

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

    /**
    * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
    *
    * startTokenId - the first token id to be transferred
    * quantity - the amount to be transferred
    *
    * 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`.
    */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
    * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
    * minting.
    *
    * startTokenId - the first token id to be transferred
    * quantity - the amount to be transferred
    *
    * Calling conditions:
    *
    * - when `from` and `to` are both non-zero.
    * - `from` and `to` are never both zero.
    */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)
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;
    }
}

pragma solidity ^0.8.0;
pragma abicoder v2;

abstract contract TokenStake is Ownable, ERC721X {
    using EnumerableSet for EnumerableSet.AddressSet;

    EnumerableSet.AddressSet private _tokenStakers;
    mapping(uint256 => address) private _stakedTokens;

    event TokenStaked(address indexed tokenStaker, uint256 tokenId);
    event TokenUnstaked(address indexed tokenStaker, uint256 tokenId);
    event TokenRecoverUnstaked(uint256 tokenId);
    event BatchUpdateTokenStaked(address indexed newTokenStaker, uint256[] tokenIds);

    event TokenStakerAdded(address indexed tokenStaker);
    event TokenStakerRemoved(address indexed tokenStaker);

    modifier tokenStakersOnly() {
        require(_tokenStakers.contains(_msgSender()), "TokenStake: Not staker");
        _;
    }

    modifier whenTokenNotStaked(uint256 tokenId) {
        require(_stakedTokens[tokenId] == address(0), "TokenStake: Token is staked");
        _;
    }

    modifier whenTokenStaked(uint256 tokenId) {
        require(_stakedTokens[tokenId] != address(0), "TokenStake: Token is not staked");
        _;
    }

    /**
     * @notice Returns `true` if token is staked and can't be transfered
     */
    function isTokenStaked(uint256 tokenId) public view returns (bool) {
        return _stakedTokens[tokenId] != address(0);
    }

    /**
     * @notice Returns the address of the staker for a specific `tokenId``
     * Returns 0x0 if token is not staked
     */
    function stakerForToken(uint256 tokenId) public view returns (address) {
        return _stakedTokens[tokenId];
    }

    /**
     * @notice Lock a token for staking
     * only callable by members of the `tokenStakers` list
     * The owner of the token must approve the staking contract prior to call this method
     */
    function stakeToken(uint256 tokenId) external tokenStakersOnly whenTokenNotStaked(tokenId) {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "TokenStake: Staker not approved");
        _stakedTokens[tokenId] = _msgSender();
        emit TokenStaked(_msgSender(), tokenId);
    }

    /**
     * @notice Lock a token for staking
     * only callable by the staker
     */
    function unstakeToken(uint256 tokenId) external whenTokenStaked(tokenId) {
        require(_msgSender() == _stakedTokens[tokenId], "TokenStake: Token not stake by account");
        require(_msgSender() != address(0), "TokenStake: can't unstake from zero address");
        _stakedTokens[tokenId] = address(0);
        emit TokenUnstaked(_msgSender(), tokenId);
    }

    /**
     * @notice Recover a staked token
     * only callable by the owner
     */
    function recoverStakeToken(uint256 tokenId) external onlyOwner whenTokenStaked(tokenId) {
        _stakedTokens[tokenId] = address(0);
        emit TokenRecoverUnstaked(tokenId);
    }

    /**
     * @dev Change the token staker for a list of tokenIds
     * only callable by the owner
     * this is usefull if the staker contract must be updated
     * if `newStaker` is set to 0x0, tokens will be unstaked
     */
    function batchUpdateTokenStake(address newStaker, uint256[] calldata tokenIds) external onlyOwner {
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(_stakedTokens[tokenIds[i]] != address(0), "TokenStake: not restakeable");
            if (newStaker != address(0)) {
                require(_isApprovedOrOwner(newStaker, tokenIds[i]), "TokenStake: Staker not approved");
            }
            _stakedTokens[tokenIds[i]] = newStaker;
        }
        emit BatchUpdateTokenStaked(newStaker, tokenIds);
    }

    /**
     * @dev returns true if `account` is a member of the staker group
     */
    function isTokenStaker(address account) public view returns (bool) {
        return _tokenStakers.contains(account);
    }

    /**
     * @dev Add `tokenStaker` to the list of allowed stakers
     * only callable by the owner
     */
    function addTokenStaker(address tokenStaker) external onlyOwner {
        require(!_tokenStakers.contains(tokenStaker), "TokenStake: Already TokenStaker");
        _tokenStakers.add(tokenStaker);
        emit TokenStakerAdded(tokenStaker);
    }

    /**
     * @dev Remove `tokenStaker` from the list of allowed stakers
     * only callable by the owner
     */
    function removeTokenStaker(address tokenStaker) external onlyOwner {
        require(_tokenStakers.contains(tokenStaker), "TokenStake: Not TokenStaker");
        _tokenStakers.remove(tokenStaker);
        emit TokenStakerRemoved(tokenStaker);
    }
}


pragma solidity ^0.8.0;

interface INftCollection {
     /**
     * @dev Stake Token
     */
    function stakeToken(uint256 tokenId) external;

    /**
     * @dev Unstake Token
     */
    function unstakeToken(uint256 tokenId) external;

    /**
     * @dev return Token stake status
     */
    function isTokenStaked(uint256 tokenId) external view returns (bool);
}

pragma solidity ^0.8.0;

contract XBorg is Ownable, IERC2981, ERC721X, ReentrancyGuard, TokenStake {
    using SafeMath for uint256;

    uint256 public MaxMintPerWallet = 3;
    uint256 public MaxSupply = 6000;
    uint256 public MaxMintSupply = 5500;
    uint256 public MaxBatchSize = 100;
    uint256 public NFT_PRICE = 0.08 ether;
    address public royalties;
    bool public isMetadataLocked;
    bool public saleIsActive = false;
    bool public PublicsaleIsActive = false;
    uint32 private publicSaleKey;
    string private _baseTokenURI;
    uint256 private WL_Class;
    address private constant WithDrawWallet1 = 0x592d4aE36dB7D196E0caD2c3083431B392f95e78;
    address private constant WithDrawWallet2 = 0xC0c464514d6397b7b529A3650697Fd5967b5A892;
    

    event LockMetadata();
    event Withdraw(uint256 amount);

    constructor(uint32 SetpublicSaleKey, uint32 SetWL_Class, address _royalty, string memory baseURI) ERC721X("XBorg", "XBORG", MaxBatchSize, MaxSupply) {
        publicSaleKey = SetpublicSaleKey;
        WL_Class = SetWL_Class;
        royalties = _royalty;
        _baseTokenURI = baseURI;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipPublicSaleState() public onlyOwner {
        PublicsaleIsActive = !PublicsaleIsActive;
        MaxMintPerWallet = 10;
        NFT_PRICE = 0.095 ether;
    }

    function mint(uint256 _Quantity, uint256 _WL, uint256 _CallerPublicSaleKey) external payable callerIsUser {
        require(saleIsActive, "Sale is not active at the moment");
        if(PublicsaleIsActive == false) {
            require(_WL == WL_Class, "You're not in WhiteList");
        }     
        require(publicSaleKey == _CallerPublicSaleKey, "Called with incorrect public sale key");
        require(totalSupply() + _Quantity <= MaxMintSupply, "Supply over the mint supply limit");
        require(numberMinted(msg.sender) + _Quantity <= MaxMintPerWallet,"Mint exceed the limit per wallet");
        require(NFT_PRICE * _Quantity <= msg.value, "Ether value sent is not correct");
        _safeMint(msg.sender, _Quantity);
    }

    function OwnerMint(uint256 _Quantity) external onlyOwner {     
        require(totalSupply() + _Quantity <= collectionSize, "Supply over the supply limit");
        _safeMint(msg.sender, _Quantity);
    }

    function _transfer(address from, address to, uint256 tokenId) internal override whenTokenNotStaked(tokenId) {
        super._transfer(from, to, tokenId);
    }

    function Burn(uint256 tokenId) external {           
        _burn(msg.sender, tokenId);
    }

    function setSaleConfig(uint32 key, uint256 MaxMint) external onlyOwner {
        publicSaleKey = key;
        MaxMintSupply = MaxMint;
    }

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

    function lockMetadata() external onlyOwner {
        require(!isMetadataLocked, "Contract is locked");
        require(bytes(_baseTokenURI).length > 0, "BaseUri not set");
        isMetadataLocked = true;
        emit LockMetadata();
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        require(!isMetadataLocked, "Contract is locked");
        _baseTokenURI = baseURI;
    }

    function withdraw() external onlyOwner {
        uint256 TotalBalance = address(this).balance;
        uint256 amount1 = TotalBalance.mul(50).div(100);
        uint256 amount2 = TotalBalance.mul(50).div(100);

        payable(WithDrawWallet1).transfer(amount1);
        payable(WithDrawWallet2).transfer(amount2);

        emit Withdraw(TotalBalance);
    }

    function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
        _setOwnersExplicit(quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    function contractURI() public view returns (string memory) {
        return bytes(_baseTokenURI).length > 0 ? string(abi.encodePacked(_baseTokenURI, "XBORG.json")) : "";
    }

    function setRoyalties(address _royalties) public onlyOwner {
        royalties = _royalties;
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address, uint256 royaltyAmount) {
        _tokenId; // silence solc warning
        royaltyAmount = (_salePrice / 100) * 5;
        return (royalties, royaltyAmount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint32","name":"SetpublicSaleKey","type":"uint32"},{"internalType":"uint32","name":"SetWL_Class","type":"uint32"},{"internalType":"address","name":"_royalty","type":"address"},{"internalType":"string","name":"baseURI","type":"string"}],"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":"newTokenStaker","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"BatchUpdateTokenStaked","type":"event"},{"anonymous":false,"inputs":[],"name":"LockMetadata","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":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenRecoverUnstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenStaker","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenStaker","type":"address"}],"name":"TokenStakerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenStaker","type":"address"}],"name":"TokenStakerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenStaker","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenUnstaked","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":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MaxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Quantity","type":"uint256"}],"name":"OwnerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"PublicsaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenStaker","type":"address"}],"name":"addTokenStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newStaker","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"batchUpdateTokenStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721X.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMetadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isTokenStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTokenStaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_Quantity","type":"uint256"},{"internalType":"uint256","name":"_WL","type":"uint256"},{"internalType":"uint256","name":"_CallerPublicSaleKey","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverStakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenStaker","type":"address"}],"name":"removeTokenStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royalties","type":"address"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"key","type":"uint32"},{"internalType":"uint256","name":"MaxMint","type":"uint256"}],"name":"setSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakerForToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000600181905560028190556009556003600e55611770600f5561157c601055606460115567011c37937e0800006012556013805461ffff60a81b191690553480156200005057600080fd5b5060405162003fe338038062003fe3833981016040819052620000739162000365565b6040518060400160405280600581526020016458426f726760d81b8152506040518060400160405280600581526020016458424f524760d81b815250601154600f54620000cf620000c96200025160201b60201c565b62000255565b600081116200013c5760405162461bcd60e51b815260206004820152602e60248201527f455243373231583a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b600082116200019e5760405162461bcd60e51b815260206004820152602760248201527f455243373231583a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000133565b8351620001b3906003906020870190620002a5565b508251620001c9906004906020860190620002a5565b5060a09190915260805250506001600a556013805463ffffffff8581166015557fffffffffff00000000ffffff0000000000000000000000000000000000000000909116600160b81b918716919091026001600160a01b031916176001600160a01b038416179055805162000246906014906020840190620002a5565b5050505050620004db565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002b39062000488565b90600052602060002090601f016020900481019282620002d7576000855562000322565b82601f10620002f257805160ff191683800117855562000322565b8280016001018555821562000322579182015b828111156200032257825182559160200191906001019062000305565b506200033092915062000334565b5090565b5b8082111562000330576000815560010162000335565b805163ffffffff811681146200036057600080fd5b919050565b600080600080608085870312156200037c57600080fd5b62000387856200034b565b93506020620003988187016200034b565b60408701519094506001600160a01b0381168114620003b657600080fd5b60608701519093506001600160401b0380821115620003d457600080fd5b818801915088601f830112620003e957600080fd5b815181811115620003fe57620003fe620004c5565b604051601f8201601f19908116603f01168101908382118183101715620004295762000429620004c5565b816040528281528b868487010111156200044257600080fd5b600093505b8284101562000466578484018601518185018701529285019262000447565b82841115620004785760008684830101525b989b979a50959850505050505050565b600181811c908216806200049d57607f821691505b60208210811415620004bf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160a051613ac66200051d6000396000818161234f015281816123790152612c06015260008181610ed701528181612128015261215a0152613ac66000f3fe6080604052600436106102e45760003560e01c80638da5cb5b11610190578063cb4644ff116100dc578063e985e9c511610095578063f0a524241161006f578063f0a52424146108ca578063f2b916c314610902578063f2fde38b14610922578063f7fcd13b1461094257600080fd5b8063e985e9c514610869578063eb8d244414610889578063f053dc5c146108aa57600080fd5b8063cb4644ff146107bd578063cda6b847146107dd578063d7224ba0146107fd578063d7e45cd714610813578063dc33e68114610834578063e8a3d4851461085457600080fd5b8063a9cd4cc511610149578063b36c128411610123578063b36c128414610747578063b88d4fde1461075d578063b90306ad1461077d578063c87b56dd1461079d57600080fd5b8063a9cd4cc5146106f0578063b0916f0314610711578063b2412af11461073157600080fd5b80638da5cb5b146106265780639231ab2a1461064457806395d89b4114610691578063989bdbb6146106a6578063a10866ef146106bb578063a22cb465146106d057600080fd5b80632d20fb601161024f57806355f804b31161020857806370a08231116101e257806370a08231146105c5578063715018a6146105e55780637ce6edb8146105fa57806389544cf51461061057600080fd5b806355f804b31461056f5780636352211e1461058f578063676dd563146105af57600080fd5b80632d20fb60146104af57806334918dfd146104cf578063396f650d146104e45780633ccfd60b146105045780634125062c1461051957806342842e0e1461054f57600080fd5b80631618c8df116102a15780631618c8df146103cd57806318160ddd146103ed57806323b872dd146104105780632a55205a146104305780632a9e63c61461046f5780632cfb66881461048f57600080fd5b806301ffc9a7146102e957806302acc94b1461031e57806306fdde0314610333578063081812fc14610355578063095ea7b31461038d5780630cd9c899146103ad575b600080fd5b3480156102f557600080fd5b50610309610304366004613544565b610962565b60405190151581526020015b60405180910390f35b61033161032c36600461362a565b6109b4565b005b34801561033f57600080fd5b50610348610c6e565b604051610315919061380f565b34801561036157600080fd5b506103756103703660046135ef565b610d00565b6040516001600160a01b039091168152602001610315565b34801561039957600080fd5b506103316103a836600461351a565b610d8b565b3480156103b957600080fd5b506103096103c83660046132f4565b610e9e565b3480156103d957600080fd5b506103316103e83660046135ef565b610eab565b3480156103f957600080fd5b50610402610f64565b604051908152602001610315565b34801561041c57600080fd5b5061033161042b366004613342565b610f7b565b34801561043c57600080fd5b5061045061044b366004613608565b610f86565b604080516001600160a01b039093168352602083019190915201610315565b34801561047b57600080fd5b5061033161048a3660046132f4565b610fb5565b34801561049b57600080fd5b506103316104aa3660046135ef565b611001565b3480156104bb57600080fd5b506103316104ca3660046135ef565b6111a9565b3480156104db57600080fd5b5061033161123c565b3480156104f057600080fd5b506103316104ff3660046132f4565b611287565b34801561051057600080fd5b5061033161134c565b34801561052557600080fd5b506103756105343660046135ef565b6000908152600d60205260409020546001600160a01b031690565b34801561055b57600080fd5b5061033161056a366004613342565b611462565b34801561057b57600080fd5b5061033161058a36600461357e565b61147d565b34801561059b57600080fd5b506103756105aa3660046135ef565b611502565b3480156105bb57600080fd5b5061040260125481565b3480156105d157600080fd5b506104026105e03660046132f4565b611514565b3480156105f157600080fd5b506103316115a5565b34801561060657600080fd5b50610402600e5481565b34801561061c57600080fd5b5061040260115481565b34801561063257600080fd5b506000546001600160a01b0316610375565b34801561065057600080fd5b5061066461065f3660046135ef565b6115db565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610315565b34801561069d57600080fd5b506103486115f8565b3480156106b257600080fd5b50610331611607565b3480156106c757600080fd5b5061033161170e565b3480156106dc57600080fd5b506103316106eb3660046134de565b61176a565b3480156106fc57600080fd5b5060135461030990600160b01b900460ff1681565b34801561071d57600080fd5b5061033161072c3660046135ef565b61182f565b34801561073d57600080fd5b5061040260105481565b34801561075357600080fd5b50610402600f5481565b34801561076957600080fd5b5061033161077836600461337e565b611919565b34801561078957600080fd5b506103316107983660046135ef565b611952565b3480156107a957600080fd5b506103486107b83660046135ef565b61195c565b3480156107c957600080fd5b506103316107d83660046132f4565b611a29565b3480156107e957600080fd5b506103316107f83660046135ef565b611aed565b34801561080957600080fd5b5061040260095481565b34801561081f57600080fd5b5060135461030990600160a01b900460ff1681565b34801561084057600080fd5b5061040261084f3660046132f4565b611c4d565b34801561086057600080fd5b50610348611c58565b34801561087557600080fd5b5061030961088436600461330f565b611ca9565b34801561089557600080fd5b5060135461030990600160a81b900460ff1681565b3480156108b657600080fd5b50601354610375906001600160a01b031681565b3480156108d657600080fd5b506103096108e53660046135ef565b6000908152600d60205260409020546001600160a01b0316151590565b34801561090e57600080fd5b5061033161091d366004613459565b611cd7565b34801561092e57600080fd5b5061033161093d3660046132f4565b611ebd565b34801561094e57600080fd5b5061033161095d366004613656565b611f55565b60006001600160e01b031982166380ac58cd60e01b148061099357506001600160e01b03198216635b5e139f60e01b145b806109ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b323314610a085760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b601354600160a81b900460ff16610a615760405162461bcd60e51b815260206004820181905260248201527f53616c65206973206e6f742061637469766520617420746865206d6f6d656e7460448201526064016109ff565b601354600160b01b900460ff16610ac3576015548214610ac35760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f7420696e2057686974654c69737400000000000000000060448201526064016109ff565b601354600160b81b900463ffffffff168114610b2f5760405162461bcd60e51b815260206004820152602560248201527f43616c6c6564207769746820696e636f7272656374207075626c69632073616c60448201526465206b657960d81b60648201526084016109ff565b60105483610b3b610f64565b610b4591906138aa565b1115610b9d5760405162461bcd60e51b815260206004820152602160248201527f537570706c79206f76657220746865206d696e7420737570706c79206c696d696044820152601d60fa1b60648201526084016109ff565b600e5483610baa33611c4d565b610bb491906138aa565b1115610c025760405162461bcd60e51b815260206004820181905260248201527f4d696e742065786365656420746865206c696d6974207065722077616c6c657460448201526064016109ff565b3483601254610c119190613901565b1115610c5f5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109ff565b610c693384611fa9565b505050565b606060038054610c7d906139a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca9906139a2565b8015610cf65780601f10610ccb57610100808354040283529160200191610cf6565b820191906000526020600020905b815481529060010190602001808311610cd957829003601f168201915b5050505050905090565b6000610d0d826001541190565b610d6f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231583a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109ff565b506000908152600760205260409020546001600160a01b031690565b6000610d9682611502565b9050806001600160a01b0316836001600160a01b03161415610e055760405162461bcd60e51b815260206004820152602260248201527f455243373231583a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109ff565b336001600160a01b0382161480610e215750610e218133611ca9565b610e935760405162461bcd60e51b815260206004820152603960248201527f455243373231583a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109ff565b610c69838383611fc7565b60006109ae600b83612023565b6000546001600160a01b03163314610ed55760405162461bcd60e51b81526004016109ff90613822565b7f000000000000000000000000000000000000000000000000000000000000000081610eff610f64565b610f0991906138aa565b1115610f575760405162461bcd60e51b815260206004820152601c60248201527f537570706c79206f7665722074686520737570706c79206c696d69740000000060448201526064016109ff565b610f613382611fa9565b50565b6000600254600154610f769190613920565b905090565b610c69838383612045565b600080610f946064846138ed565b610f9f906005613901565b6013546001600160a01b03169590945092505050565b6000546001600160a01b03163314610fdf5760405162461bcd60e51b81526004016109ff90613822565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600d602052604090205481906001600160a01b03166110675760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a20546f6b656e206973206e6f74207374616b65640060448201526064016109ff565b6000828152600d60205260409020546001600160a01b0316336001600160a01b0316146110e55760405162461bcd60e51b815260206004820152602660248201527f546f6b656e5374616b653a20546f6b656e206e6f74207374616b65206279206160448201526518d8dbdd5b9d60d21b60648201526084016109ff565b336111465760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e5374616b653a2063616e277420756e7374616b652066726f6d207a60448201526a65726f206164647265737360a81b60648201526084016109ff565b6000828152600d6020526040902080546001600160a01b0319169055336001600160a01b03167ff0dbb2abe50e936f0d3720a39c0debe7706007b2c50286a913f24298e9be36ba8360405161119d91815260200190565b60405180910390a25050565b6000546001600160a01b031633146111d35760405162461bcd60e51b81526004016109ff90613822565b6002600a5414156112265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ff565b6002600a55611234816120b7565b506001600a55565b6000546001600160a01b031633146112665760405162461bcd60e51b81526004016109ff90613822565b6013805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000546001600160a01b031633146112b15760405162461bcd60e51b81526004016109ff90613822565b6112bc600b82612023565b156113095760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a20416c726561647920546f6b656e5374616b65720060448201526064016109ff565b611314600b826122a0565b506040516001600160a01b038216907fb0d0a630f2db36143e1613d24b818312e1b0f13888e8dae939d016cc81c1c91490600090a250565b6000546001600160a01b031633146113765760405162461bcd60e51b81526004016109ff90613822565b47600061138f60646113898460326122b5565b906122c1565b905060006113a360646113898560326122b5565b60405190915073592d4ae36db7d196e0cad2c3083431b392f95e789083156108fc029084906000818181858888f193505050501580156113e7573d6000803e3d6000fd5b5060405173c0c464514d6397b7b529a3650697fd5967b5a8929082156108fc029083906000818181858888f19350505050158015611429573d6000803e3d6000fd5b506040518381527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a1505050565b610c6983838360405180602001604052806000815250611919565b6000546001600160a01b031633146114a75760405162461bcd60e51b81526004016109ff90613822565b601354600160a01b900460ff16156114f65760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b60448201526064016109ff565b610c696014838361323f565b600061150d826122cd565b5192915050565b60006001600160a01b0382166115805760405162461bcd60e51b815260206004820152602b60248201527f455243373231583a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109ff565b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b031633146115cf5760405162461bcd60e51b81526004016109ff90613822565b6115d96000612476565b565b60408051808201909152600080825260208201526109ae826122cd565b606060048054610c7d906139a2565b6000546001600160a01b031633146116315760405162461bcd60e51b81526004016109ff90613822565b601354600160a01b900460ff16156116805760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b60448201526064016109ff565b60006014805461168f906139a2565b9050116116d05760405162461bcd60e51b815260206004820152600f60248201526e10985cd9555c9a481b9bdd081cd95d608a1b60448201526064016109ff565b6013805460ff60a01b1916600160a01b1790556040517f95a231e0e633252fd44273c53079a71e951df22e856f058d0114c54c6430e81c90600090a1565b6000546001600160a01b031633146117385760405162461bcd60e51b81526004016109ff90613822565b6013805460ff60b01b198116600160b01b9182900460ff1615909102179055600a600e5567015181ff25a98000601255565b6001600160a01b0382163314156117c35760405162461bcd60e51b815260206004820152601a60248201527f455243373231583a20617070726f766520746f2063616c6c657200000000000060448201526064016109ff565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146118595760405162461bcd60e51b81526004016109ff90613822565b6000818152600d602052604090205481906001600160a01b03166118bf5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a20546f6b656e206973206e6f74207374616b65640060448201526064016109ff565b6000828152600d60205260409081902080546001600160a01b0319169055517f27862ebdcaf1c94ba2342cdeb5d6c140b8fde6b95a3921802445834577312ef49061190d9084815260200190565b60405180910390a15050565b611924848484612045565b611930848484846124c6565b61194c5760405162461bcd60e51b81526004016109ff90613857565b50505050565b610f6133826125d4565b6060611969826001541190565b6119cd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ff565b60006119d76128bf565b905060008151116119f75760405180602001604052806000815250611a22565b80611a01846128ce565b604051602001611a129291906136a9565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611a535760405162461bcd60e51b81526004016109ff90613822565b611a5e600b82612023565b611aaa5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a204e6f7420546f6b656e5374616b6572000000000060448201526064016109ff565b611ab5600b826129cb565b506040516001600160a01b038216907f1d1e5fd08acb9bc25c0dd45c0561cfb6e086312e6960eb801333c3ae19eda07c90600090a250565b611af8600b33612023565b611b3d5760405162461bcd60e51b81526020600482015260166024820152752a37b5b2b729ba30b5b29d102737ba1039ba30b5b2b960511b60448201526064016109ff565b6000818152600d602052604090205481906001600160a01b031615611ba45760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a20546f6b656e206973207374616b6564000000000060448201526064016109ff565b611baf335b836129e0565b611bfb5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a205374616b6572206e6f7420617070726f7665640060448201526064016109ff565b6000828152600d602090815260409182902080546001600160a01b0319163390811790915591518481527f1fdab8a8457aaf782e4b6217d6ffa6f5006eda7e50922dd092b2e1524275d774910161119d565b60006109ae82612aab565b6060600060148054611c69906139a2565b905011611c83575060408051602081019091526000815290565b6014604051602001611c9591906136e8565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b03163314611d015760405162461bcd60e51b81526004016109ff90613822565b60005b81811015611e74576000600d81858585818110611d2357611d23613a4e565b60209081029290920135835250810191909152604001600020546001600160a01b03161415611d945760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a206e6f742072657374616b6561626c65000000000060448201526064016109ff565b6001600160a01b03841615611e1157611dc584848484818110611db957611db9613a4e565b905060200201356129e0565b611e115760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a205374616b6572206e6f7420617070726f7665640060448201526064016109ff565b83600d6000858585818110611e2857611e28613a4e565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508080611e6c906139dd565b915050611d04565b50826001600160a01b03167f43b05a7e48dc5c22c2f56fa403cb8271d8a4e97f09548d2161cdd7bb3f9c7cbc8383604051611eb09291906137d3565b60405180910390a2505050565b6000546001600160a01b03163314611ee75760405162461bcd60e51b81526004016109ff90613822565b6001600160a01b038116611f4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ff565b610f6181612476565b6000546001600160a01b03163314611f7f5760405162461bcd60e51b81526004016109ff90613822565b6013805463ffffffff909316600160b81b0263ffffffff60b81b1990931692909217909155601055565b611fc3828260405180602001604052806000815250612b49565b5050565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001600160a01b03811660009081526001830160205260408120541515611a22565b6000818152600d602052604090205481906001600160a01b0316156120ac5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a20546f6b656e206973207374616b6564000000000060448201526064016109ff565b61194c848484612dc2565b600954816121075760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f000000000000000060448201526064016109ff565b6000600161211584846138aa565b61211f9190613920565b905061214c60017f0000000000000000000000000000000000000000000000000000000000000000613920565b8111156121815761217e60017f0000000000000000000000000000000000000000000000000000000000000000613920565b90505b61218c816001541190565b6121e75760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b60648201526084016109ff565b815b81811161228c576000818152600560205260409020546001600160a01b031661227a576000612217826122cd565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600590965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612284816139dd565b9150506121e9565b506122988160016138aa565b600955505050565b6000611a22836001600160a01b0384166130fd565b6000611a228284613901565b6000611a2282846138ed565b60408051808201909152600080825260208201526122ec826001541190565b61234b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231583a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109ff565b60007f000000000000000000000000000000000000000000000000000000000000000083106123ac5761239e7f000000000000000000000000000000000000000000000000000000000000000084613920565b6123a99060016138aa565b90505b825b818110612415576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561240257949350505050565b508061240d8161398b565b9150506123ae565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231583a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109ff565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156125c857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061250a903390899088908890600401613796565b602060405180830381600087803b15801561252457600080fd5b505af1925050508015612554575060408051601f3d908101601f1916820190925261255191810190613561565b60015b6125ae573d808015612582576040519150601f19603f3d011682016040523d82523d6000602084013e612587565b606091505b5080516125a65760405162461bcd60e51b81526004016109ff90613857565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506125cc565b5060015b949350505050565b61dead60006125e2836122cd565b90506125ee33846129e0565b6126515760405162461bcd60e51b815260206004820152602e60248201527f455243373231583a206275726e2063616c6c6572206973206e6f74206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016109ff565b836001600160a01b031681600001516001600160a01b0316146126c15760405162461bcd60e51b815260206004820152602260248201527f455243373231583a206275726e2066726f6d20696e636f7272656374206f776e60448201526132b960f11b60648201526084016109ff565b6126d16000848360000151611fc7565b6001600160a01b03841660009081526006602052604081208054600192906127039084906001600160401b0316613937565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b0384166000908152600660205260408120805460019450909261274f918591166138c2565b82546101009290920a6001600160401b038181021990931691831602179091556040805180820182526001600160a01b038681168252428416602080840191825260008a8152600590915293842092518354915192166001600160e01b031990911617600160a01b91909416029290921790915590506127d08460016138aa565b6000818152600560205260409020549091506001600160a01b0316612861576127fa816001541190565b156128615760408051808201825283516001600160a01b0390811682526020808601516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83836001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600280549060006128b2836139dd565b91905055505b5050505050565b606060148054610c7d906139a2565b6060816128f25750506040805180820190915260018152600360fc1b602082015290565b8160005b811561291c5780612906816139dd565b91506129159050600a836138ed565b91506128f6565b6000816001600160401b0381111561293657612936613a64565b6040519080825280601f01601f191660200182016040528015612960576020820181803683370190505b5090505b84156125cc57612975600183613920565b9150612982600a866139f8565b61298d9060306138aa565b60f81b8183815181106129a2576129a2613a4e565b60200101906001600160f81b031916908160001a9053506129c4600a866138ed565b9450612964565b6000611a22836001600160a01b03841661314c565b60006129ed826001541190565b612a4f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231583a206f70657261746f7220717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109ff565b6000612a5a836122cd565b905080600001516001600160a01b0316846001600160a01b03161480612a995750836001600160a01b0316612a8e84610d00565b6001600160a01b0316145b806125cc575080516125cc9085611ca9565b60006001600160a01b038216612b1d5760405162461bcd60e51b815260206004820152603160248201527f455243373231583a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016109ff565b506001600160a01b0316600090815260066020526040902054600160401b90046001600160401b031690565b6001546001600160a01b038416612bac5760405162461bcd60e51b815260206004820152602160248201527f455243373231583a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109ff565b612bb7816001541190565b15612c045760405162461bcd60e51b815260206004820152601d60248201527f455243373231583a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109ff565b7f0000000000000000000000000000000000000000000000000000000000000000831115612c8f5760405162461bcd60e51b815260206004820152603260248201527f455243373231583a207175616e7469747920746f206d696e74206f766572207460448201527168616e206d61782062617463682073697a6560701b60648201526084016109ff565b6001600160a01b0380851660008181526006602090815260408083208054600160401b6001600160401b038083168c01811667ffffffffffffffff198416811783900482168d0182169092026fffffffffffffffffffffffffffffffff1990931690911791909117909155815180830183529485524281168584019081528785526005909352908320935184549251909116600160a01b026001600160e01b031990921694169390931792909217905581905b84811015612db75760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d8f60008784876124c6565b612dab5760405162461bcd60e51b81526004016109ff90613857565b60019182019101612d42565b5060018190556128b8565b6000612dcd826122cd565b9050612dd833611ba9565b612e3f5760405162461bcd60e51b815260206004820152603260248201527f455243373231583a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109ff565b836001600160a01b031681600001516001600160a01b031614612eb35760405162461bcd60e51b815260206004820152602660248201527f455243373231583a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109ff565b6001600160a01b038316612f175760405162461bcd60e51b815260206004820152602560248201527f455243373231583a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109ff565b612f276000838360000151611fc7565b6001600160a01b0384166000908152600660205260408120805460019290612f599084906001600160401b0316613937565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b03851660009081526006602052604081208054600194509092612fa5918591166138c2565b82546101009290920a6001600160401b038181021990931691831602179091556040805180820182526001600160a01b03878116825242841660208084019182526000898152600590915293842092518354915192166001600160e01b031990911617600160a01b91909416029290921790915590506130268360016138aa565b6000818152600560205260409020549091506001600160a01b03166130b757613050816001541190565b156130b75760408051808201825283516001600160a01b0390811682526020808601516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128b8565b6000818152600183016020526040812054613144575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109ae565b5060006109ae565b60008181526001830160205260408120548015613235576000613170600183613920565b855490915060009061318490600190613920565b90508181146131e95760008660000182815481106131a4576131a4613a4e565b90600052602060002001549050808760000184815481106131c7576131c7613a4e565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806131fa576131fa613a38565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109ae565b60009150506109ae565b82805461324b906139a2565b90600052602060002090601f01602090048101928261326d57600085556132b3565b82601f106132865782800160ff198235161785556132b3565b828001600101855582156132b3579182015b828111156132b3578235825591602001919060010190613298565b506132bf9291506132c3565b5090565b5b808211156132bf57600081556001016132c4565b80356001600160a01b03811681146132ef57600080fd5b919050565b60006020828403121561330657600080fd5b611a22826132d8565b6000806040838503121561332257600080fd5b61332b836132d8565b9150613339602084016132d8565b90509250929050565b60008060006060848603121561335757600080fd5b613360846132d8565b925061336e602085016132d8565b9150604084013590509250925092565b6000806000806080858703121561339457600080fd5b61339d856132d8565b93506133ab602086016132d8565b92506040850135915060608501356001600160401b03808211156133ce57600080fd5b818701915087601f8301126133e257600080fd5b8135818111156133f4576133f4613a64565b604051601f8201601f19908116603f0116810190838211818310171561341c5761341c613a64565b816040528281528a602084870101111561343557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006040848603121561346e57600080fd5b613477846132d8565b925060208401356001600160401b038082111561349357600080fd5b818601915086601f8301126134a757600080fd5b8135818111156134b657600080fd5b8760208260051b85010111156134cb57600080fd5b6020830194508093505050509250925092565b600080604083850312156134f157600080fd5b6134fa836132d8565b91506020830135801515811461350f57600080fd5b809150509250929050565b6000806040838503121561352d57600080fd5b613536836132d8565b946020939093013593505050565b60006020828403121561355657600080fd5b8135611a2281613a7a565b60006020828403121561357357600080fd5b8151611a2281613a7a565b6000806020838503121561359157600080fd5b82356001600160401b03808211156135a857600080fd5b818501915085601f8301126135bc57600080fd5b8135818111156135cb57600080fd5b8660208285010111156135dd57600080fd5b60209290920196919550909350505050565b60006020828403121561360157600080fd5b5035919050565b6000806040838503121561361b57600080fd5b50508035926020909101359150565b60008060006060848603121561363f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561366957600080fd5b823563ffffffff8116811461353657600080fd5b6000815180845261369581602086016020860161395f565b601f01601f19169290920160200192915050565b600083516136bb81846020880161395f565b8351908301906136cf81836020880161395f565b64173539b7b760d91b9101908152600501949350505050565b600080835481600182811c91508083168061370457607f831692505b602080841082141561372457634e487b7160e01b86526022600452602486fd5b818015613738576001811461374957613776565b60ff19861689528489019650613776565b60008a81526020902060005b8681101561376e5781548b820152908501908301613755565b505084890196505b5050505050506125cc81692c2127a923973539b7b760b11b8152600a0190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137c99083018461367d565b9695505050505050565b6020808252810182905260006001600160fb1b038311156137f357600080fd5b8260051b80856040850137600092016040019182525092915050565b602081526000611a22602083018461367d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231583a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082198211156138bd576138bd613a0c565b500190565b60006001600160401b038083168185168083038211156138e4576138e4613a0c565b01949350505050565b6000826138fc576138fc613a22565b500490565b600081600019048311821515161561391b5761391b613a0c565b500290565b60008282101561393257613932613a0c565b500390565b60006001600160401b038381169083168181101561395757613957613a0c565b039392505050565b60005b8381101561397a578181015183820152602001613962565b8381111561194c5750506000910152565b60008161399a5761399a613a0c565b506000190190565b600181811c908216806139b657607f821691505b602082108114156139d757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139f1576139f1613a0c565b5060010190565b600082613a0757613a07613a22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f6157600080fdfea264697066735822122090ed6ea2023c61e3e491ed6d499a8cc288d8efd6fec6bec282f025aed597587964736f6c634300080700330000000000000000000000000000000000000000000000000000000003e7d4390000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a7c99c679d9f5666df45cc2350c119586da0091f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d536b39717a4d48426d56337479724c67454575365a503676616f63745a4647397472647a4d4d3371356836562f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e45760003560e01c80638da5cb5b11610190578063cb4644ff116100dc578063e985e9c511610095578063f0a524241161006f578063f0a52424146108ca578063f2b916c314610902578063f2fde38b14610922578063f7fcd13b1461094257600080fd5b8063e985e9c514610869578063eb8d244414610889578063f053dc5c146108aa57600080fd5b8063cb4644ff146107bd578063cda6b847146107dd578063d7224ba0146107fd578063d7e45cd714610813578063dc33e68114610834578063e8a3d4851461085457600080fd5b8063a9cd4cc511610149578063b36c128411610123578063b36c128414610747578063b88d4fde1461075d578063b90306ad1461077d578063c87b56dd1461079d57600080fd5b8063a9cd4cc5146106f0578063b0916f0314610711578063b2412af11461073157600080fd5b80638da5cb5b146106265780639231ab2a1461064457806395d89b4114610691578063989bdbb6146106a6578063a10866ef146106bb578063a22cb465146106d057600080fd5b80632d20fb601161024f57806355f804b31161020857806370a08231116101e257806370a08231146105c5578063715018a6146105e55780637ce6edb8146105fa57806389544cf51461061057600080fd5b806355f804b31461056f5780636352211e1461058f578063676dd563146105af57600080fd5b80632d20fb60146104af57806334918dfd146104cf578063396f650d146104e45780633ccfd60b146105045780634125062c1461051957806342842e0e1461054f57600080fd5b80631618c8df116102a15780631618c8df146103cd57806318160ddd146103ed57806323b872dd146104105780632a55205a146104305780632a9e63c61461046f5780632cfb66881461048f57600080fd5b806301ffc9a7146102e957806302acc94b1461031e57806306fdde0314610333578063081812fc14610355578063095ea7b31461038d5780630cd9c899146103ad575b600080fd5b3480156102f557600080fd5b50610309610304366004613544565b610962565b60405190151581526020015b60405180910390f35b61033161032c36600461362a565b6109b4565b005b34801561033f57600080fd5b50610348610c6e565b604051610315919061380f565b34801561036157600080fd5b506103756103703660046135ef565b610d00565b6040516001600160a01b039091168152602001610315565b34801561039957600080fd5b506103316103a836600461351a565b610d8b565b3480156103b957600080fd5b506103096103c83660046132f4565b610e9e565b3480156103d957600080fd5b506103316103e83660046135ef565b610eab565b3480156103f957600080fd5b50610402610f64565b604051908152602001610315565b34801561041c57600080fd5b5061033161042b366004613342565b610f7b565b34801561043c57600080fd5b5061045061044b366004613608565b610f86565b604080516001600160a01b039093168352602083019190915201610315565b34801561047b57600080fd5b5061033161048a3660046132f4565b610fb5565b34801561049b57600080fd5b506103316104aa3660046135ef565b611001565b3480156104bb57600080fd5b506103316104ca3660046135ef565b6111a9565b3480156104db57600080fd5b5061033161123c565b3480156104f057600080fd5b506103316104ff3660046132f4565b611287565b34801561051057600080fd5b5061033161134c565b34801561052557600080fd5b506103756105343660046135ef565b6000908152600d60205260409020546001600160a01b031690565b34801561055b57600080fd5b5061033161056a366004613342565b611462565b34801561057b57600080fd5b5061033161058a36600461357e565b61147d565b34801561059b57600080fd5b506103756105aa3660046135ef565b611502565b3480156105bb57600080fd5b5061040260125481565b3480156105d157600080fd5b506104026105e03660046132f4565b611514565b3480156105f157600080fd5b506103316115a5565b34801561060657600080fd5b50610402600e5481565b34801561061c57600080fd5b5061040260115481565b34801561063257600080fd5b506000546001600160a01b0316610375565b34801561065057600080fd5b5061066461065f3660046135ef565b6115db565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610315565b34801561069d57600080fd5b506103486115f8565b3480156106b257600080fd5b50610331611607565b3480156106c757600080fd5b5061033161170e565b3480156106dc57600080fd5b506103316106eb3660046134de565b61176a565b3480156106fc57600080fd5b5060135461030990600160b01b900460ff1681565b34801561071d57600080fd5b5061033161072c3660046135ef565b61182f565b34801561073d57600080fd5b5061040260105481565b34801561075357600080fd5b50610402600f5481565b34801561076957600080fd5b5061033161077836600461337e565b611919565b34801561078957600080fd5b506103316107983660046135ef565b611952565b3480156107a957600080fd5b506103486107b83660046135ef565b61195c565b3480156107c957600080fd5b506103316107d83660046132f4565b611a29565b3480156107e957600080fd5b506103316107f83660046135ef565b611aed565b34801561080957600080fd5b5061040260095481565b34801561081f57600080fd5b5060135461030990600160a01b900460ff1681565b34801561084057600080fd5b5061040261084f3660046132f4565b611c4d565b34801561086057600080fd5b50610348611c58565b34801561087557600080fd5b5061030961088436600461330f565b611ca9565b34801561089557600080fd5b5060135461030990600160a81b900460ff1681565b3480156108b657600080fd5b50601354610375906001600160a01b031681565b3480156108d657600080fd5b506103096108e53660046135ef565b6000908152600d60205260409020546001600160a01b0316151590565b34801561090e57600080fd5b5061033161091d366004613459565b611cd7565b34801561092e57600080fd5b5061033161093d3660046132f4565b611ebd565b34801561094e57600080fd5b5061033161095d366004613656565b611f55565b60006001600160e01b031982166380ac58cd60e01b148061099357506001600160e01b03198216635b5e139f60e01b145b806109ae57506301ffc9a760e01b6001600160e01b03198316145b92915050565b323314610a085760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e7472616374000060448201526064015b60405180910390fd5b601354600160a81b900460ff16610a615760405162461bcd60e51b815260206004820181905260248201527f53616c65206973206e6f742061637469766520617420746865206d6f6d656e7460448201526064016109ff565b601354600160b01b900460ff16610ac3576015548214610ac35760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f7420696e2057686974654c69737400000000000000000060448201526064016109ff565b601354600160b81b900463ffffffff168114610b2f5760405162461bcd60e51b815260206004820152602560248201527f43616c6c6564207769746820696e636f7272656374207075626c69632073616c60448201526465206b657960d81b60648201526084016109ff565b60105483610b3b610f64565b610b4591906138aa565b1115610b9d5760405162461bcd60e51b815260206004820152602160248201527f537570706c79206f76657220746865206d696e7420737570706c79206c696d696044820152601d60fa1b60648201526084016109ff565b600e5483610baa33611c4d565b610bb491906138aa565b1115610c025760405162461bcd60e51b815260206004820181905260248201527f4d696e742065786365656420746865206c696d6974207065722077616c6c657460448201526064016109ff565b3483601254610c119190613901565b1115610c5f5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f72726563740060448201526064016109ff565b610c693384611fa9565b505050565b606060038054610c7d906139a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca9906139a2565b8015610cf65780601f10610ccb57610100808354040283529160200191610cf6565b820191906000526020600020905b815481529060010190602001808311610cd957829003601f168201915b5050505050905090565b6000610d0d826001541190565b610d6f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231583a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109ff565b506000908152600760205260409020546001600160a01b031690565b6000610d9682611502565b9050806001600160a01b0316836001600160a01b03161415610e055760405162461bcd60e51b815260206004820152602260248201527f455243373231583a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016109ff565b336001600160a01b0382161480610e215750610e218133611ca9565b610e935760405162461bcd60e51b815260206004820152603960248201527f455243373231583a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016109ff565b610c69838383611fc7565b60006109ae600b83612023565b6000546001600160a01b03163314610ed55760405162461bcd60e51b81526004016109ff90613822565b7f000000000000000000000000000000000000000000000000000000000000177081610eff610f64565b610f0991906138aa565b1115610f575760405162461bcd60e51b815260206004820152601c60248201527f537570706c79206f7665722074686520737570706c79206c696d69740000000060448201526064016109ff565b610f613382611fa9565b50565b6000600254600154610f769190613920565b905090565b610c69838383612045565b600080610f946064846138ed565b610f9f906005613901565b6013546001600160a01b03169590945092505050565b6000546001600160a01b03163314610fdf5760405162461bcd60e51b81526004016109ff90613822565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600d602052604090205481906001600160a01b03166110675760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a20546f6b656e206973206e6f74207374616b65640060448201526064016109ff565b6000828152600d60205260409020546001600160a01b0316336001600160a01b0316146110e55760405162461bcd60e51b815260206004820152602660248201527f546f6b656e5374616b653a20546f6b656e206e6f74207374616b65206279206160448201526518d8dbdd5b9d60d21b60648201526084016109ff565b336111465760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e5374616b653a2063616e277420756e7374616b652066726f6d207a60448201526a65726f206164647265737360a81b60648201526084016109ff565b6000828152600d6020526040902080546001600160a01b0319169055336001600160a01b03167ff0dbb2abe50e936f0d3720a39c0debe7706007b2c50286a913f24298e9be36ba8360405161119d91815260200190565b60405180910390a25050565b6000546001600160a01b031633146111d35760405162461bcd60e51b81526004016109ff90613822565b6002600a5414156112265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109ff565b6002600a55611234816120b7565b506001600a55565b6000546001600160a01b031633146112665760405162461bcd60e51b81526004016109ff90613822565b6013805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6000546001600160a01b031633146112b15760405162461bcd60e51b81526004016109ff90613822565b6112bc600b82612023565b156113095760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a20416c726561647920546f6b656e5374616b65720060448201526064016109ff565b611314600b826122a0565b506040516001600160a01b038216907fb0d0a630f2db36143e1613d24b818312e1b0f13888e8dae939d016cc81c1c91490600090a250565b6000546001600160a01b031633146113765760405162461bcd60e51b81526004016109ff90613822565b47600061138f60646113898460326122b5565b906122c1565b905060006113a360646113898560326122b5565b60405190915073592d4ae36db7d196e0cad2c3083431b392f95e789083156108fc029084906000818181858888f193505050501580156113e7573d6000803e3d6000fd5b5060405173c0c464514d6397b7b529a3650697fd5967b5a8929082156108fc029083906000818181858888f19350505050158015611429573d6000803e3d6000fd5b506040518381527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a1505050565b610c6983838360405180602001604052806000815250611919565b6000546001600160a01b031633146114a75760405162461bcd60e51b81526004016109ff90613822565b601354600160a01b900460ff16156114f65760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b60448201526064016109ff565b610c696014838361323f565b600061150d826122cd565b5192915050565b60006001600160a01b0382166115805760405162461bcd60e51b815260206004820152602b60248201527f455243373231583a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016109ff565b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b031633146115cf5760405162461bcd60e51b81526004016109ff90613822565b6115d96000612476565b565b60408051808201909152600080825260208201526109ae826122cd565b606060048054610c7d906139a2565b6000546001600160a01b031633146116315760405162461bcd60e51b81526004016109ff90613822565b601354600160a01b900460ff16156116805760405162461bcd60e51b815260206004820152601260248201527110dbdb9d1c9858dd081a5cc81b1bd8dad95960721b60448201526064016109ff565b60006014805461168f906139a2565b9050116116d05760405162461bcd60e51b815260206004820152600f60248201526e10985cd9555c9a481b9bdd081cd95d608a1b60448201526064016109ff565b6013805460ff60a01b1916600160a01b1790556040517f95a231e0e633252fd44273c53079a71e951df22e856f058d0114c54c6430e81c90600090a1565b6000546001600160a01b031633146117385760405162461bcd60e51b81526004016109ff90613822565b6013805460ff60b01b198116600160b01b9182900460ff1615909102179055600a600e5567015181ff25a98000601255565b6001600160a01b0382163314156117c35760405162461bcd60e51b815260206004820152601a60248201527f455243373231583a20617070726f766520746f2063616c6c657200000000000060448201526064016109ff565b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146118595760405162461bcd60e51b81526004016109ff90613822565b6000818152600d602052604090205481906001600160a01b03166118bf5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a20546f6b656e206973206e6f74207374616b65640060448201526064016109ff565b6000828152600d60205260409081902080546001600160a01b0319169055517f27862ebdcaf1c94ba2342cdeb5d6c140b8fde6b95a3921802445834577312ef49061190d9084815260200190565b60405180910390a15050565b611924848484612045565b611930848484846124c6565b61194c5760405162461bcd60e51b81526004016109ff90613857565b50505050565b610f6133826125d4565b6060611969826001541190565b6119cd5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109ff565b60006119d76128bf565b905060008151116119f75760405180602001604052806000815250611a22565b80611a01846128ce565b604051602001611a129291906136a9565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314611a535760405162461bcd60e51b81526004016109ff90613822565b611a5e600b82612023565b611aaa5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a204e6f7420546f6b656e5374616b6572000000000060448201526064016109ff565b611ab5600b826129cb565b506040516001600160a01b038216907f1d1e5fd08acb9bc25c0dd45c0561cfb6e086312e6960eb801333c3ae19eda07c90600090a250565b611af8600b33612023565b611b3d5760405162461bcd60e51b81526020600482015260166024820152752a37b5b2b729ba30b5b29d102737ba1039ba30b5b2b960511b60448201526064016109ff565b6000818152600d602052604090205481906001600160a01b031615611ba45760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a20546f6b656e206973207374616b6564000000000060448201526064016109ff565b611baf335b836129e0565b611bfb5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a205374616b6572206e6f7420617070726f7665640060448201526064016109ff565b6000828152600d602090815260409182902080546001600160a01b0319163390811790915591518481527f1fdab8a8457aaf782e4b6217d6ffa6f5006eda7e50922dd092b2e1524275d774910161119d565b60006109ae82612aab565b6060600060148054611c69906139a2565b905011611c83575060408051602081019091526000815290565b6014604051602001611c9591906136e8565b604051602081830303815290604052905090565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b03163314611d015760405162461bcd60e51b81526004016109ff90613822565b60005b81811015611e74576000600d81858585818110611d2357611d23613a4e565b60209081029290920135835250810191909152604001600020546001600160a01b03161415611d945760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a206e6f742072657374616b6561626c65000000000060448201526064016109ff565b6001600160a01b03841615611e1157611dc584848484818110611db957611db9613a4e565b905060200201356129e0565b611e115760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e5374616b653a205374616b6572206e6f7420617070726f7665640060448201526064016109ff565b83600d6000858585818110611e2857611e28613a4e565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055508080611e6c906139dd565b915050611d04565b50826001600160a01b03167f43b05a7e48dc5c22c2f56fa403cb8271d8a4e97f09548d2161cdd7bb3f9c7cbc8383604051611eb09291906137d3565b60405180910390a2505050565b6000546001600160a01b03163314611ee75760405162461bcd60e51b81526004016109ff90613822565b6001600160a01b038116611f4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109ff565b610f6181612476565b6000546001600160a01b03163314611f7f5760405162461bcd60e51b81526004016109ff90613822565b6013805463ffffffff909316600160b81b0263ffffffff60b81b1990931692909217909155601055565b611fc3828260405180602001604052806000815250612b49565b5050565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001600160a01b03811660009081526001830160205260408120541515611a22565b6000818152600d602052604090205481906001600160a01b0316156120ac5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e5374616b653a20546f6b656e206973207374616b6564000000000060448201526064016109ff565b61194c848484612dc2565b600954816121075760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f000000000000000060448201526064016109ff565b6000600161211584846138aa565b61211f9190613920565b905061214c60017f0000000000000000000000000000000000000000000000000000000000001770613920565b8111156121815761217e60017f0000000000000000000000000000000000000000000000000000000000001770613920565b90505b61218c816001541190565b6121e75760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b60648201526084016109ff565b815b81811161228c576000818152600560205260409020546001600160a01b031661227a576000612217826122cd565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600590965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612284816139dd565b9150506121e9565b506122988160016138aa565b600955505050565b6000611a22836001600160a01b0384166130fd565b6000611a228284613901565b6000611a2282846138ed565b60408051808201909152600080825260208201526122ec826001541190565b61234b5760405162461bcd60e51b815260206004820152602a60248201527f455243373231583a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016109ff565b60007f000000000000000000000000000000000000000000000000000000000000006483106123ac5761239e7f000000000000000000000000000000000000000000000000000000000000006484613920565b6123a99060016138aa565b90505b825b818110612415576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561240257949350505050565b508061240d8161398b565b9150506123ae565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231583a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b60648201526084016109ff565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156125c857604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061250a903390899088908890600401613796565b602060405180830381600087803b15801561252457600080fd5b505af1925050508015612554575060408051601f3d908101601f1916820190925261255191810190613561565b60015b6125ae573d808015612582576040519150601f19603f3d011682016040523d82523d6000602084013e612587565b606091505b5080516125a65760405162461bcd60e51b81526004016109ff90613857565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506125cc565b5060015b949350505050565b61dead60006125e2836122cd565b90506125ee33846129e0565b6126515760405162461bcd60e51b815260206004820152602e60248201527f455243373231583a206275726e2063616c6c6572206973206e6f74206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b60648201526084016109ff565b836001600160a01b031681600001516001600160a01b0316146126c15760405162461bcd60e51b815260206004820152602260248201527f455243373231583a206275726e2066726f6d20696e636f7272656374206f776e60448201526132b960f11b60648201526084016109ff565b6126d16000848360000151611fc7565b6001600160a01b03841660009081526006602052604081208054600192906127039084906001600160401b0316613937565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b0384166000908152600660205260408120805460019450909261274f918591166138c2565b82546101009290920a6001600160401b038181021990931691831602179091556040805180820182526001600160a01b038681168252428416602080840191825260008a8152600590915293842092518354915192166001600160e01b031990911617600160a01b91909416029290921790915590506127d08460016138aa565b6000818152600560205260409020549091506001600160a01b0316612861576127fa816001541190565b156128615760408051808201825283516001600160a01b0390811682526020808601516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83836001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600280549060006128b2836139dd565b91905055505b5050505050565b606060148054610c7d906139a2565b6060816128f25750506040805180820190915260018152600360fc1b602082015290565b8160005b811561291c5780612906816139dd565b91506129159050600a836138ed565b91506128f6565b6000816001600160401b0381111561293657612936613a64565b6040519080825280601f01601f191660200182016040528015612960576020820181803683370190505b5090505b84156125cc57612975600183613920565b9150612982600a866139f8565b61298d9060306138aa565b60f81b8183815181106129a2576129a2613a4e565b60200101906001600160f81b031916908160001a9053506129c4600a866138ed565b9450612964565b6000611a22836001600160a01b03841661314c565b60006129ed826001541190565b612a4f5760405162461bcd60e51b815260206004820152602d60248201527f455243373231583a206f70657261746f7220717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084016109ff565b6000612a5a836122cd565b905080600001516001600160a01b0316846001600160a01b03161480612a995750836001600160a01b0316612a8e84610d00565b6001600160a01b0316145b806125cc575080516125cc9085611ca9565b60006001600160a01b038216612b1d5760405162461bcd60e51b815260206004820152603160248201527f455243373231583a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b60648201526084016109ff565b506001600160a01b0316600090815260066020526040902054600160401b90046001600160401b031690565b6001546001600160a01b038416612bac5760405162461bcd60e51b815260206004820152602160248201527f455243373231583a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016109ff565b612bb7816001541190565b15612c045760405162461bcd60e51b815260206004820152601d60248201527f455243373231583a20746f6b656e20616c7265616479206d696e74656400000060448201526064016109ff565b7f0000000000000000000000000000000000000000000000000000000000000064831115612c8f5760405162461bcd60e51b815260206004820152603260248201527f455243373231583a207175616e7469747920746f206d696e74206f766572207460448201527168616e206d61782062617463682073697a6560701b60648201526084016109ff565b6001600160a01b0380851660008181526006602090815260408083208054600160401b6001600160401b038083168c01811667ffffffffffffffff198416811783900482168d0182169092026fffffffffffffffffffffffffffffffff1990931690911791909117909155815180830183529485524281168584019081528785526005909352908320935184549251909116600160a01b026001600160e01b031990921694169390931792909217905581905b84811015612db75760405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d8f60008784876124c6565b612dab5760405162461bcd60e51b81526004016109ff90613857565b60019182019101612d42565b5060018190556128b8565b6000612dcd826122cd565b9050612dd833611ba9565b612e3f5760405162461bcd60e51b815260206004820152603260248201527f455243373231583a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016109ff565b836001600160a01b031681600001516001600160a01b031614612eb35760405162461bcd60e51b815260206004820152602660248201527f455243373231583a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016109ff565b6001600160a01b038316612f175760405162461bcd60e51b815260206004820152602560248201527f455243373231583a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016109ff565b612f276000838360000151611fc7565b6001600160a01b0384166000908152600660205260408120805460019290612f599084906001600160401b0316613937565b82546101009290920a6001600160401b038181021990931691831602179091556001600160a01b03851660009081526006602052604081208054600194509092612fa5918591166138c2565b82546101009290920a6001600160401b038181021990931691831602179091556040805180820182526001600160a01b03878116825242841660208084019182526000898152600590915293842092518354915192166001600160e01b031990911617600160a01b91909416029290921790915590506130268360016138aa565b6000818152600560205260409020549091506001600160a01b03166130b757613050816001541190565b156130b75760408051808201825283516001600160a01b0390811682526020808601516001600160401b039081168285019081526000878152600590935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128b8565b6000818152600183016020526040812054613144575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109ae565b5060006109ae565b60008181526001830160205260408120548015613235576000613170600183613920565b855490915060009061318490600190613920565b90508181146131e95760008660000182815481106131a4576131a4613a4e565b90600052602060002001549050808760000184815481106131c7576131c7613a4e565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806131fa576131fa613a38565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109ae565b60009150506109ae565b82805461324b906139a2565b90600052602060002090601f01602090048101928261326d57600085556132b3565b82601f106132865782800160ff198235161785556132b3565b828001600101855582156132b3579182015b828111156132b3578235825591602001919060010190613298565b506132bf9291506132c3565b5090565b5b808211156132bf57600081556001016132c4565b80356001600160a01b03811681146132ef57600080fd5b919050565b60006020828403121561330657600080fd5b611a22826132d8565b6000806040838503121561332257600080fd5b61332b836132d8565b9150613339602084016132d8565b90509250929050565b60008060006060848603121561335757600080fd5b613360846132d8565b925061336e602085016132d8565b9150604084013590509250925092565b6000806000806080858703121561339457600080fd5b61339d856132d8565b93506133ab602086016132d8565b92506040850135915060608501356001600160401b03808211156133ce57600080fd5b818701915087601f8301126133e257600080fd5b8135818111156133f4576133f4613a64565b604051601f8201601f19908116603f0116810190838211818310171561341c5761341c613a64565b816040528281528a602084870101111561343557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006040848603121561346e57600080fd5b613477846132d8565b925060208401356001600160401b038082111561349357600080fd5b818601915086601f8301126134a757600080fd5b8135818111156134b657600080fd5b8760208260051b85010111156134cb57600080fd5b6020830194508093505050509250925092565b600080604083850312156134f157600080fd5b6134fa836132d8565b91506020830135801515811461350f57600080fd5b809150509250929050565b6000806040838503121561352d57600080fd5b613536836132d8565b946020939093013593505050565b60006020828403121561355657600080fd5b8135611a2281613a7a565b60006020828403121561357357600080fd5b8151611a2281613a7a565b6000806020838503121561359157600080fd5b82356001600160401b03808211156135a857600080fd5b818501915085601f8301126135bc57600080fd5b8135818111156135cb57600080fd5b8660208285010111156135dd57600080fd5b60209290920196919550909350505050565b60006020828403121561360157600080fd5b5035919050565b6000806040838503121561361b57600080fd5b50508035926020909101359150565b60008060006060848603121561363f57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561366957600080fd5b823563ffffffff8116811461353657600080fd5b6000815180845261369581602086016020860161395f565b601f01601f19169290920160200192915050565b600083516136bb81846020880161395f565b8351908301906136cf81836020880161395f565b64173539b7b760d91b9101908152600501949350505050565b600080835481600182811c91508083168061370457607f831692505b602080841082141561372457634e487b7160e01b86526022600452602486fd5b818015613738576001811461374957613776565b60ff19861689528489019650613776565b60008a81526020902060005b8681101561376e5781548b820152908501908301613755565b505084890196505b5050505050506125cc81692c2127a923973539b7b760b11b8152600a0190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906137c99083018461367d565b9695505050505050565b6020808252810182905260006001600160fb1b038311156137f357600080fd5b8260051b80856040850137600092016040019182525092915050565b602081526000611a22602083018461367d565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231583a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b600082198211156138bd576138bd613a0c565b500190565b60006001600160401b038083168185168083038211156138e4576138e4613a0c565b01949350505050565b6000826138fc576138fc613a22565b500490565b600081600019048311821515161561391b5761391b613a0c565b500290565b60008282101561393257613932613a0c565b500390565b60006001600160401b038381169083168181101561395757613957613a0c565b039392505050565b60005b8381101561397a578181015183820152602001613962565b8381111561194c5750506000910152565b60008161399a5761399a613a0c565b506000190190565b600181811c908216806139b657607f821691505b602082108114156139d757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139f1576139f1613a0c565b5060010190565b600082613a0757613a07613a22565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610f6157600080fdfea264697066735822122090ed6ea2023c61e3e491ed6d499a8cc288d8efd6fec6bec282f025aed597587964736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000003e7d4390000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a7c99c679d9f5666df45cc2350c119586da0091f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d536b39717a4d48426d56337479724c67454575365a503676616f63745a4647397472647a4d4d3371356836562f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : SetpublicSaleKey (uint32): 65524793
Arg [1] : SetWL_Class (uint32): 1
Arg [2] : _royalty (address): 0xa7c99c679D9f5666Df45cc2350c119586dA0091F
Arg [3] : baseURI (string): https://ipfs.io/ipfs/QmSk9qzMHBmV3tyrLgEEu6ZP6vaoctZFG9trdzMM3q5h6V/

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000003e7d439
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000a7c99c679d9f5666df45cc2350c119586da0091f
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [5] : 68747470733a2f2f697066732e696f2f697066732f516d536b39717a4d48426d
Arg [6] : 56337479724c67454575365a503676616f63745a4647397472647a4d4d337135
Arg [7] : 6836562f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

69561:4819:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36524:305;;;;;;;;;;-1:-1:-1;36524:305:0;;;;;:::i;:::-;;:::i;:::-;;;9543:14:1;;9536:22;9518:41;;9506:2;9491:18;36524:305:0;;;;;;;;71105:747;;;;;;:::i;:::-;;:::i;:::-;;38252:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;39765:214::-;;;;;;;;;;-1:-1:-1;39765:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8071:32:1;;;8053:51;;8041:2;8026:18;39765:214:0;7907:203:1;39330:371:0;;;;;;;;;;-1:-1:-1;39330:371:0;;;;;:::i;:::-;;:::i;68258:124::-;;;;;;;;;;-1:-1:-1;68258:124:0;;;;;:::i;:::-;;:::i;71860:208::-;;;;;;;;;;-1:-1:-1;71860:208:0;;;;;:::i;:::-;;:::i;36349:105::-;;;;;;;;;;;;;:::i;:::-;;;26896:25:1;;;26884:2;26869:18;36349:105:0;26750:177:1;40634:162:0;;;;;;;;;;-1:-1:-1;40634:162:0;;;;;:::i;:::-;;:::i;74110:267::-;;;;;;;;;;-1:-1:-1;74110:267:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8800:32:1;;;8782:51;;8864:2;8849:18;;8842:34;;;;8755:18;74110:267:0;8608:274:1;74002:100:0;;;;;;;;;;-1:-1:-1;74002:100:0;;;;;:::i;:::-;;:::i;66711:372::-;;;;;;;;;;-1:-1:-1;66711:372:0;;;;;:::i;:::-;;:::i;73421:124::-;;;;;;;;;;-1:-1:-1;73421:124:0;;;;;:::i;:::-;;:::i;70827:89::-;;;;;;;;;;;;;:::i;68505:249::-;;;;;;;;;;-1:-1:-1;68505:249:0;;;;;:::i;:::-;;:::i;73047:366::-;;;;;;;;;;;;;:::i;65978:119::-;;;;;;;;;;-1:-1:-1;65978:119:0;;;;;:::i;:::-;66040:7;66067:22;;;:13;:22;;;;;;-1:-1:-1;;;;;66067:22:0;;65978:119;40865:177;;;;;;;;;;-1:-1:-1;40865:177:0;;;;;:::i;:::-;;:::i;72874:165::-;;;;;;;;;;-1:-1:-1;72874:165:0;;;;;:::i;:::-;;:::i;38063:124::-;;;;;;;;;;-1:-1:-1;38063:124:0;;;;;:::i;:::-;;:::i;69839:37::-;;;;;;;;;;;;;;;;36891:221;;;;;;;;;;-1:-1:-1;36891:221:0;;;;;:::i;:::-;;:::i;21649:94::-;;;;;;;;;;;;;:::i;69677:35::-;;;;;;;;;;;;;;;;69799:33;;;;;;;;;;;;;;;;20998:87;;;;;;;;;;-1:-1:-1;21044:7:0;21071:6;-1:-1:-1;;;;;21071:6:0;20998:87;;73674:135;;;;;;;;;;-1:-1:-1;73674:135:0;;;;;:::i;:::-;;:::i;:::-;;;;26615:13:1;;-1:-1:-1;;;;;26611:39:1;26593:58;;26711:4;26699:17;;;26693:24;-1:-1:-1;;;;;26689:49:1;26667:20;;;26660:79;;;;26566:18;73674:135:0;26383:362:1;38419:104:0;;;;;;;;;;;;;:::i;72622:244::-;;;;;;;;;;;;;:::i;70924:173::-;;;;;;;;;;;;;:::i;40049:288::-;;;;;;;;;;-1:-1:-1;40049:288:0;;;;;:::i;:::-;;:::i;69988:38::-;;;;;;;;;;-1:-1:-1;69988:38:0;;;;-1:-1:-1;;;69988:38:0;;;;;;67183:187;;;;;;;;;;-1:-1:-1;67183:187:0;;;;;:::i;:::-;;:::i;69757:35::-;;;;;;;;;;;;;;;;69719:31;;;;;;;;;;;;;;;;41111:318;;;;;;;;;;-1:-1:-1;41111:318:0;;;;;:::i;:::-;;:::i;72245:96::-;;;;;;;;;;-1:-1:-1;72245:96:0;;;;;:::i;:::-;;:::i;38592:340::-;;;;;;;;;;-1:-1:-1;38592:340:0;;;;;:::i;:::-;;:::i;68882:252::-;;;;;;;;;;-1:-1:-1;68882:252:0;;;;;:::i;:::-;;:::i;66315:293::-;;;;;;;;;;-1:-1:-1;66315:293:0;;;;;:::i;:::-;;:::i;48287:43::-;;;;;;;;;;;;;;;;69914:28;;;;;;;;;;-1:-1:-1;69914:28:0;;;;-1:-1:-1;;;69914:28:0;;;;;;73553:113;;;;;;;;;;-1:-1:-1;73553:113:0;;;;;:::i;:::-;;:::i;73817:177::-;;;;;;;;;;;;;:::i;40406:163::-;;;;;;;;;;-1:-1:-1;40406:163:0;;;;;:::i;:::-;;:::i;69949:32::-;;;;;;;;;;-1:-1:-1;69949:32:0;;;;-1:-1:-1;;;69949:32:0;;;;;;69883:24;;;;;;;;;;-1:-1:-1;69883:24:0;;;;-1:-1:-1;;;;;69883:24:0;;;65704:129;;;;;;;;;;-1:-1:-1;65704:129:0;;;;;:::i;:::-;65765:4;65789:22;;;:13;:22;;;;;;-1:-1:-1;;;;;65789:22:0;:36;;;65704:129;67616:545;;;;;;;;;;-1:-1:-1;67616:545:0;;;;;:::i;:::-;;:::i;21898:192::-;;;;;;;;;;-1:-1:-1;21898:192:0;;;;;:::i;:::-;;:::i;72349:143::-;;;;;;;;;;-1:-1:-1;72349:143:0;;;;;:::i;:::-;;:::i;36524:305::-;36626:4;-1:-1:-1;;;;;;36663:40:0;;-1:-1:-1;;;36663:40:0;;:105;;-1:-1:-1;;;;;;;36720:48:0;;-1:-1:-1;;;36720:48:0;36663:105;:158;;;-1:-1:-1;;;;;;;;;;26649:40:0;;;36785:36;36643:178;36524:305;-1:-1:-1;;36524:305:0:o;71105:747::-;70741:9;70754:10;70741:23;70733:66;;;;-1:-1:-1;;;70733:66:0;;15411:2:1;70733:66:0;;;15393:21:1;15450:2;15430:18;;;15423:30;15489:32;15469:18;;;15462:60;15539:18;;70733:66:0;;;;;;;;;71230:12:::1;::::0;-1:-1:-1;;;71230:12:0;::::1;;;71222:57;;;::::0;-1:-1:-1;;;71222:57:0;;25805:2:1;71222:57:0::1;::::0;::::1;25787:21:1::0;;;25824:18;;;25817:30;25883:34;25863:18;;;25856:62;25935:18;;71222:57:0::1;25603:356:1::0;71222:57:0::1;71293:18;::::0;-1:-1:-1;;;71293:18:0;::::1;;;71290:110;;71352:8;;71345:3;:15;71337:51;;;::::0;-1:-1:-1;;;71337:51:0;;12746:2:1;71337:51:0::1;::::0;::::1;12728:21:1::0;12785:2;12765:18;;;12758:30;12824:25;12804:18;;;12797:53;12867:18;;71337:51:0::1;12544:347:1::0;71337:51:0::1;71423:13;::::0;-1:-1:-1;;;71423:13:0;::::1;;;:37:::0;::::1;71415:87;;;::::0;-1:-1:-1;;;71415:87:0;;18074:2:1;71415:87:0::1;::::0;::::1;18056:21:1::0;18113:2;18093:18;;;18086:30;18152:34;18132:18;;;18125:62;-1:-1:-1;;;18203:18:1;;;18196:35;18248:19;;71415:87:0::1;17872:401:1::0;71415:87:0::1;71550:13;;71537:9;71521:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:42;;71513:88;;;::::0;-1:-1:-1;;;71513:88:0;;11984:2:1;71513:88:0::1;::::0;::::1;11966:21:1::0;12023:2;12003:18;;;11996:30;12062:34;12042:18;;;12035:62;-1:-1:-1;;;12113:18:1;;;12106:31;12154:19;;71513:88:0::1;11782:397:1::0;71513:88:0::1;71660:16;;71647:9;71620:24;71633:10;71620:12;:24::i;:::-;:36;;;;:::i;:::-;:56;;71612:100;;;::::0;-1:-1:-1;;;71612:100:0;;16603:2:1;71612:100:0::1;::::0;::::1;16585:21:1::0;;;16622:18;;;16615:30;16681:34;16661:18;;;16654:62;16733:18;;71612:100:0::1;16401:356:1::0;71612:100:0::1;71756:9;71743;71731;;:21;;;;:::i;:::-;:34;;71723:78;;;::::0;-1:-1:-1;;;71723:78:0;;14232:2:1;71723:78:0::1;::::0;::::1;14214:21:1::0;14271:2;14251:18;;;14244:30;14310:33;14290:18;;;14283:61;14361:18;;71723:78:0::1;14030:355:1::0;71723:78:0::1;71812:32;71822:10;71834:9;71812;:32::i;:::-;71105:747:::0;;;:::o;38252:100::-;38306:13;38339:5;38332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38252:100;:::o;39765:214::-;39833:7;39861:16;39869:7;41769:12;;-1:-1:-1;41759:22:0;41678:111;39861:16;39853:74;;;;-1:-1:-1;;;39853:74:0;;21154:2:1;39853:74:0;;;21136:21:1;21193:2;21173:18;;;21166:30;21232:34;21212:18;;;21205:62;-1:-1:-1;;;21283:18:1;;;21276:43;21336:19;;39853:74:0;20952:409:1;39853:74:0;-1:-1:-1;39947:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39947:24:0;;39765:214::o;39330:371::-;39403:13;39419:24;39435:7;39419:15;:24::i;:::-;39403:40;;39468:5;-1:-1:-1;;;;;39462:11:0;:2;-1:-1:-1;;;;;39462:11:0;;;39454:58;;;;-1:-1:-1;;;39454:58:0;;10356:2:1;39454:58:0;;;10338:21:1;10395:2;10375:18;;;10368:30;10434:34;10414:18;;;10407:62;-1:-1:-1;;;10485:18:1;;;10478:32;10527:19;;39454:58:0;10154:398:1;39454:58:0;2437:10;-1:-1:-1;;;;;39531:21:0;;;;:62;;-1:-1:-1;39556:37:0;39573:5;2437:10;40406:163;:::i;39556:37::-;39523:131;;;;-1:-1:-1;;;39523:131:0;;21568:2:1;39523:131:0;;;21550:21:1;21607:2;21587:18;;;21580:30;21646:34;21626:18;;;21619:62;21717:27;21697:18;;;21690:55;21762:19;;39523:131:0;21366:421:1;39523:131:0;39665:28;39674:2;39678:7;39687:5;39665:8;:28::i;68258:124::-;68319:4;68343:31;:13;68366:7;68343:22;:31::i;71860:208::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;71970:14:::1;71957:9;71941:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;71933:84;;;::::0;-1:-1:-1;;;71933:84:0;;20797:2:1;71933:84:0::1;::::0;::::1;20779:21:1::0;20836:2;20816:18;;;20809:30;20875;20855:18;;;20848:58;20923:18;;71933:84:0::1;20595:352:1::0;71933:84:0::1;72028:32;72038:10;72050:9;72028;:32::i;:::-;71860:208:::0;:::o;36349:105::-;36393:7;36435:11;;36420:12;;:26;;;;:::i;:::-;36413:33;;36349:105;:::o;40634:162::-;40760:28;40770:4;40776:2;40780:7;40760:9;:28::i;74110:267::-;74201:7;;74304:16;74317:3;74304:10;:16;:::i;:::-;74303:22;;74324:1;74303:22;:::i;:::-;74344:9;;-1:-1:-1;;;;;74344:9:0;;74287:38;;-1:-1:-1;74110:267:0;-1:-1:-1;;;74110:267:0:o;74002:100::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;74072:9:::1;:22:::0;;-1:-1:-1;;;;;;74072:22:0::1;-1:-1:-1::0;;;;;74072:22:0;;;::::1;::::0;;;::::1;::::0;;74002:100::o;66711:372::-;65546:1;65512:22;;;:13;:22;;;;;;66775:7;;-1:-1:-1;;;;;65512:22:0;65504:80;;;;-1:-1:-1;;;65504:80:0;;9996:2:1;65504:80:0;;;9978:21:1;10035:2;10015:18;;;10008:30;10074:33;10054:18;;;10047:61;10125:18;;65504:80:0;9794:355:1;65504:80:0;66819:22:::1;::::0;;;:13:::1;:22;::::0;;;;;-1:-1:-1;;;;;66819:22:0::1;2437:10:::0;-1:-1:-1;;;;;66803:38:0::1;;66795:89;;;::::0;-1:-1:-1;;;66795:89:0;;14592:2:1;66795:89:0::1;::::0;::::1;14574:21:1::0;14631:2;14611:18;;;14604:30;14670:34;14650:18;;;14643:62;-1:-1:-1;;;14721:18:1;;;14714:36;14767:19;;66795:89:0::1;14390:402:1::0;66795:89:0::1;2437:10:::0;66895:82:::1;;;::::0;-1:-1:-1;;;66895:82:0;;25393:2:1;66895:82:0::1;::::0;::::1;25375:21:1::0;25432:2;25412:18;;;25405:30;25471:34;25451:18;;;25444:62;-1:-1:-1;;;25522:18:1;;;25515:41;25573:19;;66895:82:0::1;25191:407:1::0;66895:82:0::1;67021:1;66988:22:::0;;;:13:::1;:22;::::0;;;;:35;;-1:-1:-1;;;;;;66988:35:0::1;::::0;;2437:10;-1:-1:-1;;;;;67039:36:0::1;;67067:7;67039:36;;;;26896:25:1::0;;26884:2;26869:18;;26750:177;67039:36:0::1;;;;;;;;66711:372:::0;;:::o;73421:124::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;23958:1:::1;24554:7;;:19;;24546:63;;;::::0;-1:-1:-1;;;24546:63:0;;24689:2:1;24546:63:0::1;::::0;::::1;24671:21:1::0;24728:2;24708:18;;;24701:30;24767:33;24747:18;;;24740:61;24818:18;;24546:63:0::1;24487:355:1::0;24546:63:0::1;23958:1;24687:7;:18:::0;73509:28:::2;73528:8:::0;73509:18:::2;:28::i;:::-;-1:-1:-1::0;23914:1:0::1;24866:7;:22:::0;73421:124::o;70827:89::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;70896:12:::1;::::0;;-1:-1:-1;;;;70880:28:0;::::1;-1:-1:-1::0;;;70896:12:0;;;::::1;;;70895:13;70880:28:::0;;::::1;;::::0;;70827:89::o;68505:249::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;68589:35:::1;:13;68612:11:::0;68589:22:::1;:35::i;:::-;68588:36;68580:80;;;::::0;-1:-1:-1;;;68580:80:0;;13514:2:1;68580:80:0::1;::::0;::::1;13496:21:1::0;13553:2;13533:18;;;13526:30;13592:33;13572:18;;;13565:61;13643:18;;68580:80:0::1;13312:355:1::0;68580:80:0::1;68671:30;:13;68689:11:::0;68671:17:::1;:30::i;:::-;-1:-1:-1::0;68717:29:0::1;::::0;-1:-1:-1;;;;;68717:29:0;::::1;::::0;::::1;::::0;;;::::1;68505:249:::0;:::o;73047:366::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;73120:21:::1;73097:20;73170:29;73195:3;73170:20;73120:21:::0;73187:2:::1;73170:16;:20::i;:::-;:24:::0;::::1;:29::i;:::-;73152:47:::0;-1:-1:-1;73210:15:0::1;73228:29;73253:3;73228:20;:12:::0;73245:2:::1;73228:16;:20::i;:29::-;73270:42;::::0;73210:47;;-1:-1:-1;70177:42:0::1;::::0;73270;::::1;;;::::0;73304:7;;73270:42:::1;::::0;;;73304:7;70177:42;73270;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;73323:42:0::1;::::0;70269::::1;::::0;73323;::::1;;;::::0;73357:7;;73323:42:::1;::::0;;;73357:7;70269:42;73323;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;73383:22:0::1;::::0;26896:25:1;;;73383:22:0::1;::::0;26884:2:1;26869:18;73383:22:0::1;;;;;;;73086:327;;;73047:366::o:0;40865:177::-;40995:39;41012:4;41018:2;41022:7;40995:39;;;;;;;;;;;;:16;:39::i;72874:165::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;72958:16:::1;::::0;-1:-1:-1;;;72958:16:0;::::1;;;72957:17;72949:48;;;::::0;-1:-1:-1;;;72949:48:0;;24342:2:1;72949:48:0::1;::::0;::::1;24324:21:1::0;24381:2;24361:18;;;24354:30;-1:-1:-1;;;24400:18:1;;;24393:48;24458:18;;72949:48:0::1;24140:342:1::0;72949:48:0::1;73008:23;:13;73024:7:::0;;73008:23:::1;:::i;38063:124::-:0;38127:7;38154:20;38166:7;38154:11;:20::i;:::-;:25;;38063:124;-1:-1:-1;;38063:124:0:o;36891:221::-;36955:7;-1:-1:-1;;;;;36983:19:0;;36975:75;;;;-1:-1:-1;;;36975:75:0;;14999:2:1;36975:75:0;;;14981:21:1;15038:2;15018:18;;;15011:30;15077:34;15057:18;;;15050:62;-1:-1:-1;;;15128:18:1;;;15121:41;15179:19;;36975:75:0;14797:407:1;36975:75:0;-1:-1:-1;;;;;;37076:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;37076:27:0;;36891:221::o;21649:94::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;21714:21:::1;21732:1;21714:9;:21::i;:::-;21649:94::o:0;73674:135::-;-1:-1:-1;;;;;;;;;;;;;;;;;73781:20:0;73793:7;73781:11;:20::i;38419:104::-;38475:13;38508:7;38501:14;;;;;:::i;72622:244::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;72685:16:::1;::::0;-1:-1:-1;;;72685:16:0;::::1;;;72684:17;72676:48;;;::::0;-1:-1:-1;;;72676:48:0;;24342:2:1;72676:48:0::1;::::0;::::1;24324:21:1::0;24381:2;24361:18;;;24354:30;-1:-1:-1;;;24400:18:1;;;24393:48;24458:18;;72676:48:0::1;24140:342:1::0;72676:48:0::1;72773:1;72749:13;72743:27;;;;;:::i;:::-;;;:31;72735:59;;;::::0;-1:-1:-1;;;72735:59:0;;25049:2:1;72735:59:0::1;::::0;::::1;25031:21:1::0;25088:2;25068:18;;;25061:30;-1:-1:-1;;;25107:18:1;;;25100:45;25162:18;;72735:59:0::1;24847:339:1::0;72735:59:0::1;72805:16;:23:::0;;-1:-1:-1;;;;72805:23:0::1;-1:-1:-1::0;;;72805:23:0::1;::::0;;72844:14:::1;::::0;::::1;::::0;72805:23;;72844:14:::1;72622:244::o:0;70924:173::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;71005:18:::1;::::0;;-1:-1:-1;;;;70983:40:0;::::1;-1:-1:-1::0;;;71005:18:0;;;::::1;;;71004:19;70983:40:::0;;::::1;;::::0;;71053:2:::1;71034:16;:21:::0;71078:11:::1;71066:9;:23:::0;70924:173::o;40049:288::-;-1:-1:-1;;;;;40144:24:0;;2437:10;40144:24;;40136:63;;;;-1:-1:-1;;;40136:63:0;;17317:2:1;40136:63:0;;;17299:21:1;17356:2;17336:18;;;17329:30;17395:28;17375:18;;;17368:56;17441:18;;40136:63:0;17115:350:1;40136:63:0;2437:10;40212:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40212:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40212:53:0;;;;;;;;;;40281:48;;9518:41:1;;;40212:42:0;;2437:10;40281:48;;9491:18:1;40281:48:0;;;;;;;40049:288;;:::o;67183:187::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;65546:1:::1;65512:22:::0;;;:13:::1;:22;::::0;;;;;67262:7;;-1:-1:-1;;;;;65512:22:0::1;65504:80;;;::::0;-1:-1:-1;;;65504:80:0;;9996:2:1;65504:80:0::1;::::0;::::1;9978:21:1::0;10035:2;10015:18;;;10008:30;10074:33;10054:18;;;10047:61;10125:18;;65504:80:0::1;9794:355:1::0;65504:80:0::1;67315:1:::2;67282:22:::0;;;:13:::2;:22;::::0;;;;;;:35;;-1:-1:-1;;;;;;67282:35:0::2;::::0;;67333:29;::::2;::::0;::::2;::::0;67296:7;26896:25:1;;26884:2;26869:18;;26750:177;67333:29:0::2;;;;;;;;21289:1:::1;67183:187:::0;:::o;41111:318::-;41270:28;41280:4;41286:2;41290:7;41270:9;:28::i;:::-;41317:48;41340:4;41346:2;41350:7;41359:5;41317:22;:48::i;:::-;41309:112;;;;-1:-1:-1;;;41309:112:0;;;;;;;:::i;:::-;41111:318;;;;:::o;72245:96::-;72307:26;72313:10;72325:7;72307:5;:26::i;38592:340::-;38665:13;38699:16;38707:7;41769:12;;-1:-1:-1;41759:22:0;41678:111;38699:16;38691:76;;;;-1:-1:-1;;;38691:76:0;;20381:2:1;38691:76:0;;;20363:21:1;20420:2;20400:18;;;20393:30;20459:34;20439:18;;;20432:62;-1:-1:-1;;;20510:18:1;;;20503:45;20565:19;;38691:76:0;20179:411:1;38691:76:0;38778:21;38802:10;:8;:10::i;:::-;38778:34;;38854:1;38836:7;38830:21;:25;:94;;;;;;;;;;;;;;;;;38882:7;38891:18;:7;:16;:18::i;:::-;38865:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38830:94;38823:101;38592:340;-1:-1:-1;;;38592:340:0:o;68882:252::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;68968:35:::1;:13;68991:11:::0;68968:22:::1;:35::i;:::-;68960:75;;;::::0;-1:-1:-1;;;68960:75:0;;22350:2:1;68960:75:0::1;::::0;::::1;22332:21:1::0;22389:2;22369:18;;;22362:30;22428:29;22408:18;;;22401:57;22475:18;;68960:75:0::1;22148:351:1::0;68960:75:0::1;69046:33;:13;69067:11:::0;69046:20:::1;:33::i;:::-;-1:-1:-1::0;69095:31:0::1;::::0;-1:-1:-1;;;;;69095:31:0;::::1;::::0;::::1;::::0;;;::::1;68882:252:::0;:::o;66315:293::-;65200:36;:13;2437:10;65200:22;:36::i;:::-;65192:71;;;;-1:-1:-1;;;65192:71:0;;18898:2:1;65192:71:0;;;18880:21:1;18937:2;18917:18;;;18910:30;-1:-1:-1;;;18956:18:1;;;18949:52;19018:18;;65192:71:0;18696:346:1;65192:71:0;65389:1:::1;65355:22:::0;;;:13:::1;:22;::::0;;;;;66397:7;;-1:-1:-1;;;;;65355:22:0::1;:36:::0;65347:76:::1;;;::::0;-1:-1:-1;;;65347:76:0;;21994:2:1;65347:76:0::1;::::0;::::1;21976:21:1::0;22033:2;22013:18;;;22006:30;22072:29;22052:18;;;22045:57;22119:18;;65347:76:0::1;21792:351:1::0;65347:76:0::1;66425:41:::2;2437:10:::0;66444:12:::2;66458:7;66425:18;:41::i;:::-;66417:85;;;::::0;-1:-1:-1;;;66417:85:0;;12386:2:1;66417:85:0::2;::::0;::::2;12368:21:1::0;12425:2;12405:18;;;12398:30;12464:33;12444:18;;;12437:61;12515:18;;66417:85:0::2;12184:355:1::0;66417:85:0::2;66513:22;::::0;;;:13:::2;:22;::::0;;;;;;;;:37;;-1:-1:-1;;;;;;66513:37:0::2;2437:10:::0;66513:37;;::::2;::::0;;;66566:34;;26896:25:1;;;66566:34:0::2;::::0;26869:18:1;66566:34:0::2;26750:177:1::0;73553:113:0;73611:7;73638:20;73652:5;73638:13;:20::i;73817:177::-;73861:13;73924:1;73900:13;73894:27;;;;;:::i;:::-;;;:31;:92;;-1:-1:-1;73894:92:0;;;;;;;;;-1:-1:-1;73894:92:0;;;36349:105::o;73894:92::-;73952:13;73935:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;73887:99;;73817:177;:::o;40406:163::-;-1:-1:-1;;;;;40526:25:0;;;40503:4;40526:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40406:163::o;67616:545::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;67730:9:::1;67725:370;67745:19:::0;;::::1;67725:370;;;67832:1;67794:13;67832:1:::0;67808:8;;67817:1;67808:11;;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;67794:26:::0;;-1:-1:-1;67794:26:0;::::1;::::0;;;;;;-1:-1:-1;67794:26:0;;-1:-1:-1;;;;;67794:26:0::1;:40;;67786:80;;;::::0;-1:-1:-1;;;67786:80:0;;20025:2:1;67786:80:0::1;::::0;::::1;20007:21:1::0;20064:2;20044:18;;;20037:30;20103:29;20083:18;;;20076:57;20150:18;;67786:80:0::1;19823:351:1::0;67786:80:0::1;-1:-1:-1::0;;;;;67885:23:0;::::1;::::0;67881:150:::1;;67937:42;67956:9;67967:8;;67976:1;67967:11;;;;;;;:::i;:::-;;;;;;;67937:18;:42::i;:::-;67929:86;;;::::0;-1:-1:-1;;;67929:86:0;;12386:2:1;67929:86:0::1;::::0;::::1;12368:21:1::0;12425:2;12405:18;;;12398:30;12464:33;12444:18;;;12437:61;12515:18;;67929:86:0::1;12184:355:1::0;67929:86:0::1;68074:9;68045:13;:26;68059:8;;68068:1;68059:11;;;;;;;:::i;:::-;;;;;;;68045:26;;;;;;;;;;;;:38;;;;;-1:-1:-1::0;;;;;68045:38:0::1;;;;;-1:-1:-1::0;;;;;68045:38:0::1;;;;;;67766:3;;;;;:::i;:::-;;;;67725:370;;;;68133:9;-1:-1:-1::0;;;;;68110:43:0::1;;68144:8;;68110:43;;;;;;;:::i;:::-;;;;;;;;67616:545:::0;;;:::o;21898:192::-;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21987:22:0;::::1;21979:73;;;::::0;-1:-1:-1;;;21979:73:0;;11170:2:1;21979:73:0::1;::::0;::::1;11152:21:1::0;11209:2;11189:18;;;11182:30;11248:34;11228:18;;;11221:62;-1:-1:-1;;;11299:18:1;;;11292:36;11345:19;;21979:73:0::1;10968:402:1::0;21979:73:0::1;22063:19;22073:8;22063:9;:19::i;72349:143::-:0;21044:7;21071:6;-1:-1:-1;;;;;21071:6:0;2437:10;21218:23;21210:68;;;;-1:-1:-1;;;21210:68:0;;;;;;;:::i;:::-;72431:13:::1;:19:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;72431:19:0::1;-1:-1:-1::0;;;;72431:19:0;;::::1;::::0;;;::::1;::::0;;;72461:13:::1;:23:::0;72349:143::o;42466:104::-;42535:27;42545:2;42549:8;42535:27;;;;;;;;;;;;:9;:27::i;:::-;42466:104;;:::o;48083:196::-;48198:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;48198:29:0;-1:-1:-1;;;;;48198:29:0;;;;;;;;;48243:28;;48198:24;;48243:28;;;;;;;48083:196;;;:::o;60347:167::-;-1:-1:-1;;;;;60481:23:0;;60427:4;55883:19;;;:12;;;:19;;;;;;:24;;60451:55;55786:129;72076:161;65389:1;65355:22;;;:13;:22;;;;;;72175:7;;-1:-1:-1;;;;;65355:22:0;:36;65347:76;;;;-1:-1:-1;;;65347:76:0;;21994:2:1;65347:76:0;;;21976:21:1;22033:2;22013:18;;;22006:30;22072:29;22052:18;;;22045:57;22119:18;;65347:76:0;21792:351:1;65347:76:0;72195:34:::1;72211:4;72217:2;72221:7;72195:15;:34::i;48441:942::-:0;48535:24;;48578:12;48570:49;;;;-1:-1:-1;;;48570:49:0;;16964:2:1;48570:49:0;;;16946:21:1;17003:2;16983:18;;;16976:30;17042:26;17022:18;;;17015:54;17086:18;;48570:49:0;16762:348:1;48570:49:0;48630:16;48680:1;48649:28;48669:8;48649:17;:28;:::i;:::-;:32;;;;:::i;:::-;48630:51;-1:-1:-1;48707:18:0;48724:1;48707:14;:18;:::i;:::-;48696:8;:29;48692:91;;;48753:18;48770:1;48753:14;:18;:::i;:::-;48742:29;;48692:91;48906:17;48914:8;41769:12;;-1:-1:-1;41759:22:0;41678:111;48906:17;48898:68;;;;-1:-1:-1;;;48898:68:0;;23529:2:1;48898:68:0;;;23511:21:1;23568:2;23548:18;;;23541:30;23607:34;23587:18;;;23580:62;-1:-1:-1;;;23658:18:1;;;23651:36;23704:19;;48898:68:0;23327:402:1;48898:68:0;48994:17;48977:349;49018:8;49013:1;:13;48977:349;;49083:1;49052:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;49052:19:0;49048:267;;49106:31;49140:14;49152:1;49140:11;:14::i;:::-;49190:109;;;;;;;;49223:14;;-1:-1:-1;;;;;49190:109:0;;;;;;49256:24;;;;-1:-1:-1;;;;;49190:109:0;;;;;;;;;-1:-1:-1;49173:14:0;;;:11;:14;;;;;;;:126;;;;;;;;;-1:-1:-1;;;49173:126:0;-1:-1:-1;;;;;;49173:126:0;;;;;;;;;;;;-1:-1:-1;49048:267:0;49028:3;;;;:::i;:::-;;;;48977:349;;;-1:-1:-1;49363:12:0;:8;49374:1;49363:12;:::i;:::-;49336:24;:39;-1:-1:-1;;;48441:942:0:o;59775:152::-;59845:4;59869:50;59874:3;-1:-1:-1;;;;;59894:23:0;;59869:4;:50::i;14566:98::-;14624:7;14651:5;14655:1;14651;:5;:::i;14965:98::-;15023:7;15050:5;15054:1;15050;:5;:::i;37357:646::-;-1:-1:-1;;;;;;;;;;;;;;;;;37460:16:0;37468:7;41769:12;;-1:-1:-1;41759:22:0;41678:111;37460:16;37452:71;;;;-1:-1:-1;;;37452:71:0;;10759:2:1;37452:71:0;;;10741:21:1;10798:2;10778:18;;;10771:30;10837:34;10817:18;;;10810:62;-1:-1:-1;;;10888:18:1;;;10881:40;10938:19;;37452:71:0;10557:406:1;37452:71:0;37534:26;37586:12;37575:7;:23;37571:103;;37636:22;37646:12;37636:7;:22;:::i;:::-;:26;;37661:1;37636:26;:::i;:::-;37615:47;;37571:103;37706:7;37686:242;37723:18;37715:4;:26;37686:242;;37766:31;37800:17;;;:11;:17;;;;;;;;;37766:51;;;;;;;;;-1:-1:-1;;;;;37766:51:0;;;;;-1:-1:-1;;;37766:51:0;;;-1:-1:-1;;;;;37766:51:0;;;;;;;;37836:28;37832:85;;37892:9;37357:646;-1:-1:-1;;;;37357:646:0:o;37832:85::-;-1:-1:-1;37743:6:0;;;;:::i;:::-;;;;37686:242;;;-1:-1:-1;37938:57:0;;-1:-1:-1;;;37938:57:0;;13098:2:1;37938:57:0;;;13080:21:1;13137:2;13117:18;;;13110:30;13176:34;13156:18;;;13149:62;-1:-1:-1;;;13227:18:1;;;13220:45;13282:19;;37938:57:0;12896:411:1;22098:173:0;22154:16;22173:6;;-1:-1:-1;;;;;22190:17:0;;;-1:-1:-1;;;;;;22190:17:0;;;;;;22223:40;;22173:6;;;;;;;22223:40;;22154:16;22223:40;22143:128;22098:173;:::o;49939:834::-;50094:4;-1:-1:-1;;;;;50115:13:0;;4041:19;:23;50111:655;;50168:72;;-1:-1:-1;;;50168:72:0;;-1:-1:-1;;;;;50168:36:0;;;;;:72;;2437:10;;50219:4;;50225:7;;50234:5;;50168:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50168:72:0;;;;;;;;-1:-1:-1;;50168:72:0;;;;;;;;;;;;:::i;:::-;;;50147:564;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50427:13:0;;50423:273;;50470:61;;-1:-1:-1;;;50470:61:0;;;;;;;:::i;50423:273::-;50646:6;50640:13;50631:6;50627:2;50623:15;50616:38;50147:564;-1:-1:-1;;;;;;50304:55:0;-1:-1:-1;;;50304:55:0;;-1:-1:-1;50297:62:0;;50111:655;-1:-1:-1;50750:4:0;50111:655;49939:834;;;;;;:::o;44430:1638::-;44546:42;44533:10;44637:20;44649:7;44637:11;:20::i;:::-;44599:58;-1:-1:-1;44870:41:0;2437:10;44903:7;44870:18;:41::i;:::-;44862:100;;;;-1:-1:-1;;;44862:100:0;;19249:2:1;44862:100:0;;;19231:21:1;19288:2;19268:18;;;19261:30;19327:34;19307:18;;;19300:62;-1:-1:-1;;;19378:18:1;;;19371:44;19432:19;;44862:100:0;19047:410:1;44862:100:0;45003:4;-1:-1:-1;;;;;44981:26:0;:13;:18;;;-1:-1:-1;;;;;44981:26:0;;44973:73;;;;-1:-1:-1;;;44973:73:0;;22706:2:1;44973:73:0;;;22688:21:1;22745:2;22725:18;;;22718:30;22784:34;22764:18;;;22757:62;-1:-1:-1;;;22835:18:1;;;22828:32;22877:19;;44973:73:0;22504:398:1;44973:73:0;45167:49;45184:1;45188:7;45197:13;:18;;;45167:8;:49::i;:::-;-1:-1:-1;;;;;45229:18:0;;;;;;:12;:18;;;;;:31;;45259:1;;45229:18;:31;;45259:1;;-1:-1:-1;;;;;45229:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;45229:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;45271:16:0;;-1:-1:-1;45271:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;45271:16:0;;:29;;-1:-1:-1;;45271:29:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;45271:29:0;;;;;;;;;;;;;;;45334:43;;;;;;;;-1:-1:-1;;;;;45334:43:0;;;;;45360:15;45334:43;;;;;;;;;-1:-1:-1;45311:20:0;;;:11;:20;;;;;;:66;;;;;;;;-1:-1:-1;;;;;;45311:66:0;;;;-1:-1:-1;;;45311:66:0;;;;;;;;;;;;-1:-1:-1;;45639:11:0;45311:20;-1:-1:-1;45639:11:0;:::i;:::-;45706:1;45665:24;;;:11;:24;;;;;:29;45617:33;;-1:-1:-1;;;;;;45665:29:0;45661:280;;45729:20;45737:11;41769:12;;-1:-1:-1;41759:22:0;41678:111;45729:20;45725:205;;;45797:117;;;;;;;;45830:18;;-1:-1:-1;;;;;45797:117:0;;;;;;45867:28;;;;-1:-1:-1;;;;;45797:117:0;;;;;;;;;-1:-1:-1;45770:24:0;;;:11;:24;;;;;;;:144;;;;;;;;;-1:-1:-1;;;45770:144:0;-1:-1:-1;;;;;;45770:144:0;;;;;;;;;;;;45725:205;45975:7;45971:2;-1:-1:-1;;;;;45956:27:0;45965:4;-1:-1:-1;;;;;45956:27:0;;;;;;;;;;;45994:11;:13;;;:11;:13;;;:::i;:::-;;;;;;46018:42;44522:1546;;;44430:1638;;:::o;72500:114::-;72560:13;72593;72586:20;;;;;:::i;18300:723::-;18356:13;18577:10;18573:53;;-1:-1:-1;;18604:10:0;;;;;;;;;;;;-1:-1:-1;;;18604:10:0;;;;;18300:723::o;18573:53::-;18651:5;18636:12;18692:78;18699:9;;18692:78;;18725:8;;;;:::i;:::-;;-1:-1:-1;18748:10:0;;-1:-1:-1;18756:2:0;18748:10;;:::i;:::-;;;18692:78;;;18780:19;18812:6;-1:-1:-1;;;;;18802:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18802:17:0;;18780:39;;18830:154;18837:10;;18830:154;;18864:11;18874:1;18864:11;;:::i;:::-;;-1:-1:-1;18933:10:0;18941:2;18933:5;:10;:::i;:::-;18920:24;;:2;:24;:::i;:::-;18907:39;;18890:6;18897;18890:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;18890:56:0;;;;;;;;-1:-1:-1;18961:11:0;18970:2;18961:11;;:::i;:::-;;;18830:154;;60103:158;60176:4;60200:53;60208:3;-1:-1:-1;;;;;60228:23:0;;60200:7;:53::i;41956:502::-;42049:4;42074:16;42082:7;41769:12;;-1:-1:-1;41759:22:0;41678:111;42074:16;42066:74;;;;-1:-1:-1;;;42066:74:0;;15770:2:1;42066:74:0;;;15752:21:1;15809:2;15789:18;;;15782:30;15848:34;15828:18;;;15821:62;-1:-1:-1;;;15899:18:1;;;15892:43;15952:19;;42066:74:0;15568:409:1;42066:74:0;42151:35;42189:20;42201:7;42189:11;:20::i;:::-;42151:58;;42238:13;:18;;;-1:-1:-1;;;;;42227:29:0;:7;-1:-1:-1;;;;;42227:29:0;;:64;;;;42284:7;-1:-1:-1;;;;;42260:31:0;:20;42272:7;42260:11;:20::i;:::-;-1:-1:-1;;;;;42260:31:0;;42227:64;:113;;;-1:-1:-1;42312:18:0;;42295:45;;42332:7;42295:16;:45::i;37120:229::-;37181:7;-1:-1:-1;;;;;37209:19:0;;37201:81;;;;-1:-1:-1;;;37201:81:0;;18480:2:1;37201:81:0;;;18462:21:1;18519:2;18499:18;;;18492:30;18558:34;18538:18;;;18531:62;-1:-1:-1;;;18609:18:1;;;18602:47;18666:19;;37201:81:0;18278:413:1;37201:81:0;-1:-1:-1;;;;;;37308:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;37308:32:0;;-1:-1:-1;;;;;37308:32:0;;37120:229::o;42923:1208::-;43069:12;;-1:-1:-1;;;;;43100:16:0;;43092:62;;;;-1:-1:-1;;;43092:62:0;;17672:2:1;43092:62:0;;;17654:21:1;17711:2;17691:18;;;17684:30;17750:34;17730:18;;;17723:62;-1:-1:-1;;;17801:18:1;;;17794:31;17842:19;;43092:62:0;17470:397:1;43092:62:0;43174:21;43182:12;41769;;-1:-1:-1;41759:22:0;41678:111;43174:21;43173:22;43165:64;;;;-1:-1:-1;;;43165:64:0;;13874:2:1;43165:64:0;;;13856:21:1;13913:2;13893:18;;;13886:30;13952:31;13932:18;;;13925:59;14001:18;;43165:64:0;13672:353:1;43165:64:0;43260:12;43248:8;:24;;43240:87;;;;-1:-1:-1;;;43240:87:0;;26166:2:1;43240:87:0;;;26148:21:1;26205:2;26185:18;;;26178:30;26244:34;26224:18;;;26217:62;-1:-1:-1;;;26295:18:1;;;26288:48;26353:19;;43240:87:0;25964:414:1;43240:87:0;-1:-1:-1;;;;;43439:16:0;;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;;;43439:44:0;;;;;;;-1:-1:-1;;43439:44:0;;;;43498:49;;;;;;;;;;;;-1:-1:-1;;43498:49:0;;;;;;;;;;;;;43592:43;;;;;;;;;;43618:15;43592:43;;;;;;;;43564:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;43564:71:0;-1:-1:-1;;;;;;43564:71:0;;;;;;;;;;;;;;;43576:12;;43704:292;43728:8;43724:1;:12;43704:292;;;43767:38;;43792:12;;-1:-1:-1;;;;;43767:38:0;;;43784:1;;43767:38;;43784:1;;43767:38;43832:59;43863:1;43867:2;43871:12;43885:5;43832:22;:59::i;:::-;43824:123;;;;-1:-1:-1;;;43824:123:0;;;;;;;:::i;:::-;43966:14;;;;;43738:3;43704:292;;;-1:-1:-1;44010:12:0;:27;;;44052:60;41111:318;46313:1656;46437:35;46475:20;46487:7;46475:11;:20::i;:::-;46437:58;-1:-1:-1;46708:41:0;2437:10;46727:12;2357:98;46708:41;46700:104;;;;-1:-1:-1;;;46700:104:0;;16184:2:1;46700:104:0;;;16166:21:1;16223:2;16203:18;;;16196:30;16262:34;16242:18;;;16235:62;-1:-1:-1;;;16313:18:1;;;16306:48;16371:19;;46700:104:0;15982:414:1;46700:104:0;46845:4;-1:-1:-1;;;;;46823:26:0;:13;:18;;;-1:-1:-1;;;;;46823:26:0;;46815:77;;;;-1:-1:-1;;;46815:77:0;;11577:2:1;46815:77:0;;;11559:21:1;11616:2;11596:18;;;11589:30;11655:34;11635:18;;;11628:62;-1:-1:-1;;;11706:18:1;;;11699:36;11752:19;;46815:77:0;11375:402:1;46815:77:0;-1:-1:-1;;;;;46911:16:0;;46903:66;;;;-1:-1:-1;;;46903:66:0;;23936:2:1;46903:66:0;;;23918:21:1;23975:2;23955:18;;;23948:30;24014:34;23994:18;;;23987:62;-1:-1:-1;;;24065:18:1;;;24058:35;24110:19;;46903:66:0;23734:401:1;46903:66:0;47090:49;47107:1;47111:7;47120:13;:18;;;47090:8;:49::i;:::-;-1:-1:-1;;;;;47152:18:0;;;;;;:12;:18;;;;;:31;;47182:1;;47152:18;:31;;47182:1;;-1:-1:-1;;;;;47152:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47152:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47194:16:0;;-1:-1:-1;47194:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;47194:16:0;;:29;;-1:-1:-1;;47194:29:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;47194:29:0;;;;;;;;;;;;;;;47257:43;;;;;;;;-1:-1:-1;;;;;47257:43:0;;;;;47283:15;47257:43;;;;;;;;;-1:-1:-1;47234:20:0;;;:11;:20;;;;;;:66;;;;;;;;-1:-1:-1;;;;;;47234:66:0;;;;-1:-1:-1;;;47234:66:0;;;;;;;;;;;;-1:-1:-1;;47562:11:0;47234:20;-1:-1:-1;47562:11:0;:::i;:::-;47629:1;47588:24;;;:11;:24;;;;;:29;47540:33;;-1:-1:-1;;;;;;47588:29:0;47584:280;;47652:20;47660:11;41769:12;;-1:-1:-1;41759:22:0;41678:111;47652:20;47648:205;;;47720:117;;;;;;;;47753:18;;-1:-1:-1;;;;;47720:117:0;;;;;;47790:28;;;;-1:-1:-1;;;;;47720:117:0;;;;;;;;;-1:-1:-1;47693:24:0;;;:11;:24;;;;;;;:144;;;;;;;;;-1:-1:-1;;;47693:144:0;-1:-1:-1;;;;;;47693:144:0;;;;;;;;;;;;47648:205;47900:7;47896:2;-1:-1:-1;;;;;47881:27:0;47890:4;-1:-1:-1;;;;;47881:27:0;;;;;;;;;;;47919:42;41111:318;53690:414;53753:4;55883:19;;;:12;;;:19;;;;;;53770:327;;-1:-1:-1;53813:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;53996:18;;53974:19;;;:12;;;:19;;;;;;:40;;;;54029:11;;53770:327;-1:-1:-1;54080:5:0;54073:12;;54280:1420;54346:4;54485:19;;;:12;;;:19;;;;;;54521:15;;54517:1176;;54896:21;54920:14;54933:1;54920:10;:14;:::i;:::-;54969:18;;54896:38;;-1:-1:-1;54949:17:0;;54969:22;;54990:1;;54969:22;:::i;:::-;54949:42;;55025:13;55012:9;:26;55008:405;;55059:17;55079:3;:11;;55091:9;55079:22;;;;;;;;:::i;:::-;;;;;;;;;55059:42;;55233:9;55204:3;:11;;55216:13;55204:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;55318:23;;;:12;;;:23;;;;;:36;;;55008:405;55494:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;55589:3;:12;;:19;55602:5;55589:19;;;;;;;;;;;55582:26;;;55632:4;55625:11;;;;;;;54517:1176;55676:5;55669:12;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;-1:-1:-1;;;;;1445:2:1;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:689::-;2219:6;2227;2235;2288:2;2276:9;2267:7;2263:23;2259:32;2256:52;;;2304:1;2301;2294:12;2256:52;2327:29;2346:9;2327:29;:::i;:::-;2317:39;;2407:2;2396:9;2392:18;2379:32;-1:-1:-1;;;;;2471:2:1;2463:6;2460:14;2457:34;;;2487:1;2484;2477:12;2457:34;2525:6;2514:9;2510:22;2500:32;;2570:7;2563:4;2559:2;2555:13;2551:27;2541:55;;2592:1;2589;2582:12;2541:55;2632:2;2619:16;2658:2;2650:6;2647:14;2644:34;;;2674:1;2671;2664:12;2644:34;2727:7;2722:2;2712:6;2709:1;2705:14;2701:2;2697:23;2693:32;2690:45;2687:65;;;2748:1;2745;2738:12;2687:65;2779:2;2775;2771:11;2761:21;;2801:6;2791:16;;;;;2124:689;;;;;:::o;2818:347::-;2883:6;2891;2944:2;2932:9;2923:7;2919:23;2915:32;2912:52;;;2960:1;2957;2950:12;2912:52;2983:29;3002:9;2983:29;:::i;:::-;2973:39;;3062:2;3051:9;3047:18;3034:32;3109:5;3102:13;3095:21;3088:5;3085:32;3075:60;;3131:1;3128;3121:12;3075:60;3154:5;3144:15;;;2818:347;;;;;:::o;3170:254::-;3238:6;3246;3299:2;3287:9;3278:7;3274:23;3270:32;3267:52;;;3315:1;3312;3305:12;3267:52;3338:29;3357:9;3338:29;:::i;:::-;3328:39;3414:2;3399:18;;;;3386:32;;-1:-1:-1;;;3170:254:1:o;3429:245::-;3487:6;3540:2;3528:9;3519:7;3515:23;3511:32;3508:52;;;3556:1;3553;3546:12;3508:52;3595:9;3582:23;3614:30;3638:5;3614:30;:::i;3679:249::-;3748:6;3801:2;3789:9;3780:7;3776:23;3772:32;3769:52;;;3817:1;3814;3807:12;3769:52;3849:9;3843:16;3868:30;3892:5;3868:30;:::i;3933:592::-;4004:6;4012;4065:2;4053:9;4044:7;4040:23;4036:32;4033:52;;;4081:1;4078;4071:12;4033:52;4121:9;4108:23;-1:-1:-1;;;;;4191:2:1;4183:6;4180:14;4177:34;;;4207:1;4204;4197:12;4177:34;4245:6;4234:9;4230:22;4220:32;;4290:7;4283:4;4279:2;4275:13;4271:27;4261:55;;4312:1;4309;4302:12;4261:55;4352:2;4339:16;4378:2;4370:6;4367:14;4364:34;;;4394:1;4391;4384:12;4364:34;4439:7;4434:2;4425:6;4421:2;4417:15;4413:24;4410:37;4407:57;;;4460:1;4457;4450:12;4407:57;4491:2;4483:11;;;;;4513:6;;-1:-1:-1;3933:592:1;;-1:-1:-1;;;;3933:592:1:o;4530:180::-;4589:6;4642:2;4630:9;4621:7;4617:23;4613:32;4610:52;;;4658:1;4655;4648:12;4610:52;-1:-1:-1;4681:23:1;;4530:180;-1:-1:-1;4530:180:1:o;4715:248::-;4783:6;4791;4844:2;4832:9;4823:7;4819:23;4815:32;4812:52;;;4860:1;4857;4850:12;4812:52;-1:-1:-1;;4883:23:1;;;4953:2;4938:18;;;4925:32;;-1:-1:-1;4715:248:1:o;4968:316::-;5045:6;5053;5061;5114:2;5102:9;5093:7;5089:23;5085:32;5082:52;;;5130:1;5127;5120:12;5082:52;-1:-1:-1;;5153:23:1;;;5223:2;5208:18;;5195:32;;-1:-1:-1;5274:2:1;5259:18;;;5246:32;;4968:316;-1:-1:-1;4968:316:1:o;5289:344::-;5356:6;5364;5417:2;5405:9;5396:7;5392:23;5388:32;5385:52;;;5433:1;5430;5423:12;5385:52;5472:9;5459:23;5522:10;5515:5;5511:22;5504:5;5501:33;5491:61;;5548:1;5545;5538:12;5638:257;5679:3;5717:5;5711:12;5744:6;5739:3;5732:19;5760:63;5816:6;5809:4;5804:3;5800:14;5793:4;5786:5;5782:16;5760:63;:::i;:::-;5877:2;5856:15;-1:-1:-1;;5852:29:1;5843:39;;;;5884:4;5839:50;;5638:257;-1:-1:-1;;5638:257:1:o;6029:637::-;6309:3;6347:6;6341:13;6363:53;6409:6;6404:3;6397:4;6389:6;6385:17;6363:53;:::i;:::-;6479:13;;6438:16;;;;6501:57;6479:13;6438:16;6535:4;6523:17;;6501:57;:::i;:::-;-1:-1:-1;;;6580:20:1;;6609:22;;;6658:1;6647:13;;6029:637;-1:-1:-1;;;;6029:637:1:o;6671:1231::-;6900:3;6929:1;6962:6;6956:13;6992:3;7014:1;7042:9;7038:2;7034:18;7024:28;;7102:2;7091:9;7087:18;7124;7114:61;;7168:4;7160:6;7156:17;7146:27;;7114:61;7194:2;7242;7234:6;7231:14;7211:18;7208:38;7205:165;;;-1:-1:-1;;;7269:33:1;;7325:4;7322:1;7315:15;7355:4;7276:3;7343:17;7205:165;7386:18;7413:104;;;;7531:1;7526:320;;;;7379:467;;7413:104;-1:-1:-1;;7446:24:1;;7434:37;;7491:16;;;;-1:-1:-1;7413:104:1;;7526:320;27005:1;26998:14;;;27042:4;27029:18;;7621:1;7635:165;7649:6;7646:1;7643:13;7635:165;;;7727:14;;7714:11;;;7707:35;7770:16;;;;7664:10;;7635:165;;;7639:3;;7829:6;7824:3;7820:16;7813:23;;7379:467;;;;;;;7862:34;7892:3;-1:-1:-1;;;5965:25:1;;6015:2;6006:12;;5900:124;8115:488;-1:-1:-1;;;;;8384:15:1;;;8366:34;;8436:15;;8431:2;8416:18;;8409:43;8483:2;8468:18;;8461:34;;;8531:3;8526:2;8511:18;;8504:31;;;8309:4;;8552:45;;8577:19;;8569:6;8552:45;:::i;:::-;8544:53;8115:488;-1:-1:-1;;;;;;8115:488:1:o;8887:486::-;9076:2;9058:21;;;9095:18;;9088:34;;;-1:-1:-1;;;;;;9134:31:1;;9131:51;;;9178:1;9175;9168:12;9131:51;9212:6;9209:1;9205:14;9269:6;9261;9256:2;9245:9;9241:18;9228:48;9346:1;9299:22;;9323:2;9295:31;9335:13;;;-1:-1:-1;9295:31:1;8887:486;-1:-1:-1;;8887:486:1:o;9570:219::-;9719:2;9708:9;9701:21;9682:4;9739:44;9779:2;9768:9;9764:18;9756:6;9739:44;:::i;19462:356::-;19664:2;19646:21;;;19683:18;;;19676:30;19742:34;19737:2;19722:18;;19715:62;19809:2;19794:18;;19462:356::o;22907:415::-;23109:2;23091:21;;;23148:2;23128:18;;;23121:30;23187:34;23182:2;23167:18;;23160:62;-1:-1:-1;;;23253:2:1;23238:18;;23231:49;23312:3;23297:19;;22907:415::o;27058:128::-;27098:3;27129:1;27125:6;27122:1;27119:13;27116:39;;;27135:18;;:::i;:::-;-1:-1:-1;27171:9:1;;27058:128::o;27191:236::-;27230:3;-1:-1:-1;;;;;27303:2:1;27300:1;27296:10;27333:2;27330:1;27326:10;27364:3;27360:2;27356:12;27351:3;27348:21;27345:47;;;27372:18;;:::i;:::-;27408:13;;27191:236;-1:-1:-1;;;;27191:236:1:o;27432:120::-;27472:1;27498;27488:35;;27503:18;;:::i;:::-;-1:-1:-1;27537:9:1;;27432:120::o;27557:168::-;27597:7;27663:1;27659;27655:6;27651:14;27648:1;27645:21;27640:1;27633:9;27626:17;27622:45;27619:71;;;27670:18;;:::i;:::-;-1:-1:-1;27710:9:1;;27557:168::o;27730:125::-;27770:4;27798:1;27795;27792:8;27789:34;;;27803:18;;:::i;:::-;-1:-1:-1;27840:9:1;;27730:125::o;27860:229::-;27899:4;-1:-1:-1;;;;;27996:10:1;;;;27966;;28018:12;;;28015:38;;;28033:18;;:::i;:::-;28070:13;;27860:229;-1:-1:-1;;;27860:229:1:o;28094:258::-;28166:1;28176:113;28190:6;28187:1;28184:13;28176:113;;;28266:11;;;28260:18;28247:11;;;28240:39;28212:2;28205:10;28176:113;;;28307:6;28304:1;28301:13;28298:48;;;-1:-1:-1;;28342:1:1;28324:16;;28317:27;28094:258::o;28357:136::-;28396:3;28424:5;28414:39;;28433:18;;:::i;:::-;-1:-1:-1;;;28469:18:1;;28357:136::o;28498:380::-;28577:1;28573:12;;;;28620;;;28641:61;;28695:4;28687:6;28683:17;28673:27;;28641:61;28748:2;28740:6;28737:14;28717:18;28714:38;28711:161;;;28794:10;28789:3;28785:20;28782:1;28775:31;28829:4;28826:1;28819:15;28857:4;28854:1;28847:15;28711:161;;28498:380;;;:::o;28883:135::-;28922:3;-1:-1:-1;;28943:17:1;;28940:43;;;28963:18;;:::i;:::-;-1:-1:-1;29010:1:1;28999:13;;28883:135::o;29023:112::-;29055:1;29081;29071:35;;29086:18;;:::i;:::-;-1:-1:-1;29120:9:1;;29023:112::o;29140:127::-;29201:10;29196:3;29192:20;29189:1;29182:31;29232:4;29229:1;29222:15;29256:4;29253:1;29246:15;29272:127;29333:10;29328:3;29324:20;29321:1;29314:31;29364:4;29361:1;29354:15;29388:4;29385:1;29378:15;29404:127;29465:10;29460:3;29456:20;29453:1;29446:31;29496:4;29493:1;29486:15;29520:4;29517:1;29510:15;29536:127;29597:10;29592:3;29588:20;29585:1;29578:31;29628:4;29625:1;29618:15;29652:4;29649:1;29642:15;29668:127;29729:10;29724:3;29720:20;29717:1;29710:31;29760:4;29757:1;29750:15;29784:4;29781:1;29774:15;29800:131;-1:-1:-1;;;;;;29874:32:1;;29864:43;;29854:71;;29921:1;29918;29911:12

Swarm Source

ipfs://90ed6ea2023c61e3e491ed6d499a8cc288d8efd6fec6bec282f025aed5975879
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.