ETH Price: $2,469.41 (+0.39%)

Token

 

Overview

Max Total Supply

333

Holders

60

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
techbubble.eth
0x14977b0dbe7e155f9907effecbb70c9b7a05e737
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
JAZ

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-11
*/

//SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


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

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/escrow/Escrow.sol


// OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol)

pragma solidity ^0.8.0;



/**
 * @title Escrow
 * @dev Base escrow contract, holds funds designated for a payee until they
 * withdraw them.
 *
 * Intended usage: This contract (and derived escrow contracts) should be a
 * standalone contract, that only interacts with the contract that instantiated
 * it. That way, it is guaranteed that all Ether will be handled according to
 * the `Escrow` rules, and there is no need to check for payable functions or
 * transfers in the inheritance tree. The contract that uses the escrow as its
 * payment method should be its owner, and provide public methods redirecting
 * to the escrow's deposit and withdraw.
 */
contract Escrow is Ownable {
    using Address for address payable;

    event Deposited(address indexed payee, uint256 weiAmount);
    event Withdrawn(address indexed payee, uint256 weiAmount);

    mapping(address => uint256) private _deposits;

    function depositsOf(address payee) public view returns (uint256) {
        return _deposits[payee];
    }

    /**
     * @dev Stores the sent amount as credit to be withdrawn.
     * @param payee The destination address of the funds.
     */
    function deposit(address payee) public payable virtual onlyOwner {
        uint256 amount = msg.value;
        _deposits[payee] += amount;
        emit Deposited(payee, amount);
    }

    /**
     * @dev Withdraw accumulated balance for a payee, forwarding all gas to the
     * recipient.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee The address whose funds will be withdrawn and transferred to.
     */
    function withdraw(address payable payee) public virtual onlyOwner {
        uint256 payment = _deposits[payee];

        _deposits[payee] = 0;

        payee.sendValue(payment);

        emit Withdrawn(payee, payment);
    }
}

// File: @openzeppelin/contracts/security/PullPayment.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Simple implementation of a
 * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment]
 * strategy, where the paying contract doesn't interact directly with the
 * receiver account, which must withdraw its payments itself.
 *
 * Pull-payments are often considered the best practice when it comes to sending
 * Ether, security-wise. It prevents recipients from blocking execution, and
 * eliminates reentrancy concerns.
 *
 * 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].
 *
 * To use, derive from the `PullPayment` contract, and use {_asyncTransfer}
 * instead of Solidity's `transfer` function. Payees can query their due
 * payments with {payments}, and retrieve them with {withdrawPayments}.
 */
abstract contract PullPayment {
    Escrow private immutable _escrow;

    constructor() {
        _escrow = new Escrow();
    }

    /**
     * @dev Withdraw accumulated payments, forwarding all gas to the recipient.
     *
     * Note that _any_ account can call this function, not just the `payee`.
     * This means that contracts unaware of the `PullPayment` protocol can still
     * receive funds this way, by having a separate account call
     * {withdrawPayments}.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee Whose payments will be withdrawn.
     */
    function withdrawPayments(address payable payee) public virtual {
        _escrow.withdraw(payee);
    }

    /**
     * @dev Returns the payments owed to an address.
     * @param dest The creditor's address.
     */
    function payments(address dest) public view returns (uint256) {
        return _escrow.depositsOf(dest);
    }

    /**
     * @dev Called by the payer to store the sent amount as credit to be pulled.
     * Funds sent in this way are stored in an intermediate {Escrow} contract, so
     * there is no danger of them being spent before withdrawal.
     *
     * @param dest The destination address of the funds.
     * @param amount The amount to transfer.
     */
    function _asyncTransfer(address dest, uint256 amount) internal virtual {
        _escrow.deposit{value: amount}(dest);
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

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 paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: contracts/JAZ.sol



pragma solidity ^0.8.0;









contract JAZ is ERC1155, Ownable, Pausable, PullPayment, IERC2981 {
    using Counters for Counters.Counter;
    Counters.Counter _tokenIdTracker;



    struct TokenDetails{
        
        uint16 totalSupply_;
        uint whitelistPrice_;
        uint publicPrice_;
        uint16 royaltyPercentage_;
        uint16 available_;
        bytes32 whitelistMerkleRoot_;
        bytes32 luckyMerkleRoot_;
        mapping(address => uint16) whitelistClaims_;
        mapping(address => bool) luckyClaims_;

    }


   
    address private treasury_;
    string private baseUri_;
    string private contractUri_;

    mapping(uint => TokenDetails) public tokenDetails;

    constructor(string memory _baseUri, string memory _contractUri) ERC1155("") {
        baseUri_ = _baseUri;
        contractUri_ = _contractUri;
        treasury_ = msg.sender;
        
    }

    function setTokenDetails(
        uint16 _totalSupply,
        uint _whitelistPrice,
        uint _publicPrice,
        uint16 _royaltyPercentage,
        bytes32 _whitelistMerkleRoot,
        bytes32 _luckyMerkleRoot
    ) public onlyOwner {
            uint _id = _tokenIdTracker.current();
            TokenDetails storage newToken = tokenDetails[_id];
            newToken.totalSupply_ = _totalSupply;
            newToken.whitelistPrice_ = _whitelistPrice;
            newToken.publicPrice_ = _publicPrice;
            newToken.royaltyPercentage_ = _royaltyPercentage; 
            newToken.whitelistMerkleRoot_ = _whitelistMerkleRoot;
            newToken.luckyMerkleRoot_ = _luckyMerkleRoot;
            newToken.available_ = _totalSupply;
            _tokenIdTracker.increment();
            
        }

    function setWhitelistMerkleRoot(uint16 _id, bytes32 _root) public onlyOwner{
        require(_root != bytes32(0), "Invalid root hash.");
        tokenDetails[_id].whitelistMerkleRoot_ = _root;
    }

    function setLuckyMerkleRoot(uint16 _id, bytes32 _root) public onlyOwner{
        require(_root != bytes32(0), "Invalid root hash.");
        tokenDetails[_id].luckyMerkleRoot_ = _root;
    }

    function setBaseUri(string calldata _uri) public onlyOwner{
        baseUri_ = _uri;
    }

    function setContractUri(string calldata _uri) public onlyOwner{
        contractUri_ = _uri;
    }

    function setTreasury(address _treasury) public onlyOwner{
        treasury_ = _treasury;
    }

    function setRoyaltyPercentage(uint16 _id, uint16 _percentage) public onlyOwner{
        tokenDetails[_id].royaltyPercentage_ = _percentage;
    }


    function setPublicPrice(uint16 _id, uint _price) public onlyOwner{
        tokenDetails[_id].publicPrice_ = _price; 
    }

    function setWhitelistPrice(uint16 _id, uint _price) public onlyOwner{
        tokenDetails[_id].whitelistPrice_ = _price; 
    }

    function increaseSupply(uint16 _id, uint16 _supply) public onlyOwner{
        tokenDetails[_id].totalSupply_+= _supply;
        tokenDetails[_id].available_ += _supply;
    }

    function mint(uint16 _id, uint16 _qty, bytes32[] calldata _whitelistProof, bytes32[] calldata _luckyProof) public payable whenNotPaused{
        require(_id < _tokenIdTracker.current(), "invalid Token Id.");
        require(_qty > 0 && _qty <= tokenDetails[_id].available_, "Not enough tokens.");
        if(msg.sender == owner()){
            
        }else{
            uint value;
            uint16 tempQty = _qty;
            if(checkIfLucky(msg.sender, _id, _luckyProof) && !tokenDetails[_id].luckyClaims_[msg.sender]){
                tempQty--;
                tokenDetails[_id].luckyClaims_[msg.sender] = true;
            }
            uint16 claims = 2 - tokenDetails[_id].whitelistClaims_[msg.sender];
            if(checkWhitelist(msg.sender, _id, _whitelistProof) && claims > 0){
                if(tempQty > claims){
                    tempQty -= claims;
                    value = claims*tokenDetails[_id].whitelistPrice_;
                    tokenDetails[_id].whitelistClaims_[msg.sender] = 2;
                }else{
                    value = tempQty*tokenDetails[_id].whitelistPrice_;
                    
                    tokenDetails[_id].whitelistClaims_[msg.sender] += tempQty;
                    tempQty = 0;
                }
                
            }
            value += tempQty*tokenDetails[_id].publicPrice_;
            require(msg.value == value, "Invalid value sent.");
            
        }

        _mint( msg.sender, _id, _qty, "");
        tokenDetails[_id].available_ -= _qty;
        if(msg.value > 0){
            _asyncTransfer(owner(), msg.value);
        }
        
       
    }

    function contractURI() public view returns(string memory) {
        return contractUri_;
    } 

    function checkWhitelist(address _addr, uint16 _id, bytes32[] calldata _proof) public view returns(bool){
        bytes32 leaf = keccak256(abi.encodePacked(_addr));
        return MerkleProof.verify(_proof, tokenDetails[_id].whitelistMerkleRoot_, leaf);
    }

    function checkIfLucky(address _addr, uint16 _id, bytes32[] calldata _proof) public view returns(bool){
        bytes32 leaf = keccak256(abi.encodePacked(_addr));
        return MerkleProof.verify(_proof, tokenDetails[_id].luckyMerkleRoot_, leaf);
    }

    function returnWhitelistClaims(uint16 _id, address _claimingAddress) external view returns(uint16 claims){
        claims = tokenDetails[_id].whitelistClaims_[_claimingAddress];
    }

    function hasClaimedFree(uint16 _id, address _claimingAddress) external view returns(bool hasClaimed){
        hasClaimed = tokenDetails[_id].luckyClaims_[_claimingAddress];
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC1155, IERC165)
        returns (bool)
    {
        return (
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId)
        );
    }



    function royaltyInfo(uint256 tokenId, uint256 salePrice)
    external
    view
    override
    returns (address receiver, uint256 royaltyAmount)
    {
        require(tokenId < _tokenIdTracker.current(), "Nonexistent token");
        
    
        uint256 amount = salePrice*tokenDetails[tokenId].royaltyPercentage_/uint256(100);
        return (treasury_, amount);
    } 



    function uri(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(tokenId < _tokenIdTracker.current(), "ERC1155Metadata: URI query for nonexistent token");
        
        string memory _tokenURI = string(abi.encodePacked(baseUri_, Strings.toString(tokenId), ".json"));

        return _tokenURI;
    }

    

    function pause() public onlyOwner{
        _pause();
    }

    function unpause() public onlyOwner{
        _unpause();
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"},{"internalType":"string","name":"_contractUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkIfLucky","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_claimingAddress","type":"address"}],"name":"hasClaimedFree","outputs":[{"internalType":"bool","name":"hasClaimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint16","name":"_supply","type":"uint16"}],"name":"increaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint16","name":"_qty","type":"uint16"},{"internalType":"bytes32[]","name":"_whitelistProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_luckyProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"address","name":"_claimingAddress","type":"address"}],"name":"returnWhitelistClaims","outputs":[{"internalType":"uint16","name":"claims","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setLuckyMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint16","name":"_percentage","type":"uint16"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_totalSupply","type":"uint16"},{"internalType":"uint256","name":"_whitelistPrice","type":"uint256"},{"internalType":"uint256","name":"_publicPrice","type":"uint256"},{"internalType":"uint16","name":"_royaltyPercentage","type":"uint16"},{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"},{"internalType":"bytes32","name":"_luckyMerkleRoot","type":"bytes32"}],"name":"setTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_id","type":"uint16"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setWhitelistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenDetails","outputs":[{"internalType":"uint16","name":"totalSupply_","type":"uint16"},{"internalType":"uint256","name":"whitelistPrice_","type":"uint256"},{"internalType":"uint256","name":"publicPrice_","type":"uint256"},{"internalType":"uint16","name":"royaltyPercentage_","type":"uint16"},{"internalType":"uint16","name":"available_","type":"uint16"},{"internalType":"bytes32","name":"whitelistMerkleRoot_","type":"bytes32"},{"internalType":"bytes32","name":"luckyMerkleRoot_","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162003e4438038062003e448339810160408190526200003491620002d1565b6040805160208101909152600081526200004e81620000e5565b506200005a33620000fe565b6003805460ff60a01b19169055604051620000759062000150565b604051809103906000f08015801562000092573d6000803e3d6000fd5b506001600160a01b03166080528151620000b49060069060208501906200015e565b508051620000ca9060079060208401906200015e565b5050600580546001600160a01b031916331790555062000378565b8051620000fa9060029060208401906200015e565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6106b8806200378c83390190565b8280546200016c906200033b565b90600052602060002090601f016020900481019282620001905760008555620001db565b82601f10620001ab57805160ff1916838001178555620001db565b82800160010185558215620001db579182015b82811115620001db578251825591602001919060010190620001be565b50620001e9929150620001ed565b5090565b5b80821115620001e95760008155600101620001ee565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200022c57600080fd5b81516001600160401b038082111562000249576200024962000204565b604051601f8301601f19908116603f0116810190828211818310171562000274576200027462000204565b816040528381526020925086838588010111156200029157600080fd5b600091505b83821015620002b5578582018301518183018401529082019062000296565b83821115620002c75760008385830101525b9695505050505050565b60008060408385031215620002e557600080fd5b82516001600160401b0380821115620002fd57600080fd5b6200030b868387016200021a565b935060208501519150808211156200032257600080fd5b5062000331858286016200021a565b9150509250929050565b600181811c908216806200035057607f821691505b602082108114156200037257634e487b7160e01b600052602260045260246000fd5b50919050565b6080516133ea620003a260003960008181610aef0152818161163c0152611ff501526133ea6000f3fe6080604052600436106102185760003560e01c806378ea93291161011d578063e2982c21116100b0578063f242432a1161007f578063f4aab57511610064578063f4aab575146106bf578063fc314e31146106df578063fc480fa51461078457600080fd5b8063f242432a1461067f578063f2fde38b1461069f57600080fd5b8063e2982c21146105e1578063e8a3d48514610601578063e985e9c514610616578063f0f442601461065f57600080fd5b8063a22cb465116100ec578063a22cb46514610561578063b14c1b6314610581578063b14ebf8f146105a1578063ccb4807b146105c157600080fd5b806378ea9329146104e45780638456cb59146105045780638da5cb5b14610519578063a0bcfc7f1461054157600080fd5b80633bc04565116101b0578063574aa6d01161017f57806365e29eff1161016457806365e29eff1461048f5780636c79b7d9146104af578063715018a6146104cf57600080fd5b8063574aa6d01461045d5780635c975abb1461047057600080fd5b80633bc04565146103ad5780633f4ba83a146103cd5780634bf8dba9146103e25780634e1273f41461043057600080fd5b806325bb379b116101ec57806325bb379b146102cf5780632a55205a1461032e5780632eb2c2d61461036d57806331b3eb941461038d57600080fd5b8062fdd58e1461021d57806301ffc9a7146102505780630e89341c146102805780631b7af704146102ad575b600080fd5b34801561022957600080fd5b5061023d6102383660046127f2565b6107a4565b6040519081526020015b60405180910390f35b34801561025c57600080fd5b5061027061026b366004612834565b61084d565b6040519015158152602001610247565b34801561028c57600080fd5b506102a061029b366004612858565b610878565b60405161024791906128cd565b3480156102b957600080fd5b506102cd6102c83660046128f7565b61092c565b005b3480156102db57600080fd5b5061031b6102ea366004612913565b61ffff91821660009081526008602090815260408083206001600160a01b0390941683526006909301905220541690565b60405161ffff9091168152602001610247565b34801561033a57600080fd5b5061034e61034936600461294a565b61098e565b604080516001600160a01b039093168352602083019190915201610247565b34801561037957600080fd5b506102cd610388366004612ab8565b610a2e565b34801561039957600080fd5b506102cd6103a8366004612b66565b610ad0565b3480156103b957600080fd5b506102cd6103c83660046128f7565b610b47565b3480156103d957600080fd5b506102cd610bf6565b3480156103ee57600080fd5b506102706103fd366004612913565b61ffff90911660009081526008602090815260408083206001600160a01b03909416835260079093019052205460ff1690565b34801561043c57600080fd5b5061045061044b366004612b83565b610c48565b6040516102479190612c8b565b6102cd61046b366004612ce3565b610d86565b34801561047c57600080fd5b50600354600160a01b900460ff16610270565b34801561049b57600080fd5b506102cd6104aa3660046128f7565b61119a565b3480156104bb57600080fd5b506102cd6104ca366004612d74565b611249565b3480156104db57600080fd5b506102cd611327565b3480156104f057600080fd5b506102cd6104ff366004612d74565b611379565b34801561051057600080fd5b506102cd6113e8565b34801561052557600080fd5b506003546040516001600160a01b039091168152602001610247565b34801561054d57600080fd5b506102cd61055c366004612da7565b611438565b34801561056d57600080fd5b506102cd61057c366004612e19565b611491565b34801561058d57600080fd5b5061027061059c366004612e4c565b6114a0565b3480156105ad57600080fd5b506102706105bc366004612e4c565b611538565b3480156105cd57600080fd5b506102cd6105dc366004612da7565b6115c6565b3480156105ed57600080fd5b5061023d6105fc366004612b66565b61161a565b34801561060d57600080fd5b506102a06116a9565b34801561062257600080fd5b50610270610631366004612eaf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561066b57600080fd5b506102cd61067a366004612b66565b61173b565b34801561068b57600080fd5b506102cd61069a366004612ecd565b6117b2565b3480156106ab57600080fd5b506102cd6106ba366004612b66565b61184d565b3480156106cb57600080fd5b506102cd6106da366004612f36565b61191d565b3480156106eb57600080fd5b506107426106fa366004612858565b60086020526000908152604090208054600182015460028301546003840154600485015460059095015461ffff94851695939492938284169362010000909304909216919087565b6040805161ffff988916815260208101979097528601949094529185166060850152909316608083015260a082019290925260c081019190915260e001610247565b34801561079057600080fd5b506102cd61079f3660046128f7565b6119e1565b60006001600160a01b0383166108275760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b1480610872575061087282611a43565b92915050565b606061088360045490565b82106108f75760405162461bcd60e51b815260206004820152603060248201527f455243313135354d657461646174613a2055524920717565727920666f72206e60448201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000606482015260840161081e565b6000600661090484611a93565b604051602001610915929190612fe5565b60408051601f198184030181529190529392505050565b6003546001600160a01b031633146109745760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff909116600090815260086020526040902060020155565b60008061099a60045490565b84106109e85760405162461bcd60e51b815260206004820152601160248201527f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000604482015260640161081e565b600084815260086020526040812060030154606490610a0b9061ffff16866130ce565b610a159190613103565b6005546001600160a01b031693509150505b9250929050565b6001600160a01b038516331480610a4a5750610a4a8533610631565b610abc5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161081e565b610ac98585858585611bb1565b5050505050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d990602401600060405180830381600087803b158015610b3357600080fd5b505af1158015610ac9573d6000803e3d6000fd5b6003546001600160a01b03163314610b8f5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b80610bdc5760405162461bcd60e51b815260206004820152601260248201527f496e76616c696420726f6f7420686173682e0000000000000000000000000000604482015260640161081e565b61ffff909116600090815260086020526040902060040155565b6003546001600160a01b03163314610c3e5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b610c46611e1c565b565b60608151835114610cc15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161081e565b6000835167ffffffffffffffff811115610cdd57610cdd61296c565b604051908082528060200260200182016040528015610d06578160200160208202803683370190505b50905060005b8451811015610d7e57610d51858281518110610d2a57610d2a613117565b6020026020010151858381518110610d4457610d44613117565b60200260200101516107a4565b828281518110610d6357610d63613117565b6020908102919091010152610d778161312d565b9050610d0c565b509392505050565b600354600160a01b900460ff1615610dd35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161081e565b6004548661ffff1610610e285760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420546f6b656e2049642e000000000000000000000000000000604482015260640161081e565b60008561ffff16118015610e5d575061ffff808716600090815260086020526040902060030154620100009004811690861611155b610ea95760405162461bcd60e51b815260206004820152601260248201527f4e6f7420656e6f75676820746f6b656e732e0000000000000000000000000000604482015260640161081e565b6003546001600160a01b0316331415610ec157611101565b600085610ed0338986866114a0565b8015610efe575061ffff8816600090815260086020908152604080832033845260070190915290205460ff16155b15610f3d5780610f0d81613148565b61ffff8a1660009081526008602090815260408083203384526007019091529020805460ff191660011790559150505b61ffff80891660009081526008602090815260408083203384526006019091528120549091610f6e91166002613166565b9050610f7c338a8989611538565b8015610f8c575060008161ffff16115b1561107f578061ffff168261ffff16111561100657610fab8183613166565b61ffff808b16600090815260086020526040902060010154919350610fd2919083166130ce565b61ffff8a1660009081526008602090815260408083203384526006019091529020805461ffff19166002179055925061107f565b61ffff808a166000908152600860205260409020600101546110299184166130ce565b61ffff808b166000908152600860209081526040808320338452600601909152812080549396508593909261106091859116613189565b92506101000a81548161ffff021916908361ffff160217905550600091505b61ffff808a166000908152600860205260409020600201546110a29184166130ce565b6110ac90846131af565b92508234146110fd5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642076616c75652073656e742e00000000000000000000000000604482015260640161081e565b5050505b611124338761ffff168761ffff1660405180602001604052806000815250611ec2565b61ffff80871660009081526008602052604090206003018054879260029161115491859162010000900416613166565b92506101000a81548161ffff021916908361ffff16021790555060003411156111925761119261118c6003546001600160a01b031690565b34611fd6565b505050505050565b6003546001600160a01b031633146111e25760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b8061122f5760405162461bcd60e51b815260206004820152601260248201527f496e76616c696420726f6f7420686173682e0000000000000000000000000000604482015260640161081e565b61ffff909116600090815260086020526040902060050155565b6003546001600160a01b031633146112915760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff8083166000908152600860205260408120805484939192916112b891859116613189565b92506101000a81548161ffff021916908361ffff16021790555080600860008461ffff16815260200190815260200160002060030160028282829054906101000a900461ffff166113099190613189565b92506101000a81548161ffff021916908361ffff1602179055505050565b6003546001600160a01b0316331461136f5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b610c46600061204e565b6003546001600160a01b031633146113c15760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff9182166000908152600860205260409020600301805461ffff191691909216179055565b6003546001600160a01b031633146114305760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b610c466120ad565b6003546001600160a01b031633146114805760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61148c60068383612744565b505050565b61149c338383612135565b5050565b6040516bffffffffffffffffffffffff19606086901b166020820152600090819060340160405160208183030381529060405280519060200120905061152e848480806020026020016040519081016040528093929190818152602001838360200280828437600092018290525061ffff8b16815260086020526040902060050154925085915061222a9050565b9695505050505050565b6040516bffffffffffffffffffffffff19606086901b166020820152600090819060340160405160208183030381529060405280519060200120905061152e848480806020026020016040519081016040528093929190818152602001838360200280828437600092018290525061ffff8b16815260086020526040902060040154925085915061222a9050565b6003546001600160a01b0316331461160e5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61148c60078383612744565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a90602401602060405180830381865afa158015611685573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087291906131c7565b6060600780546116b890612f8e565b80601f01602080910402602001604051908101604052809291908181526020018280546116e490612f8e565b80156117315780601f1061170657610100808354040283529160200191611731565b820191906000526020600020905b81548152906001019060200180831161171457829003601f168201915b5050505050905090565b6003546001600160a01b031633146117835760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0385163314806117ce57506117ce8533610631565b6118405760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161081e565b610ac98585858585612240565b6003546001600160a01b031633146118955760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b6001600160a01b0381166119115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161081e565b61191a8161204e565b50565b6003546001600160a01b031633146119655760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b600061197060045490565b6000908152600860205260409020805461ffff191661ffff988916908117825560018083019890985560028201969096556003810180546004808401969096556005909201939093559390961663ffffffff1990931692909217620100009093029290921790558054909101905550565b6003546001600160a01b03163314611a295760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff909116600090815260086020526040902060010155565b60006001600160e01b03198216636cdb3d1360e11b1480611a7457506001600160e01b031982166303a24d0760e21b145b8061087257506301ffc9a760e01b6001600160e01b0319831614610872565b606081611ab75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ae15780611acb8161312d565b9150611ada9050600a83613103565b9150611abb565b60008167ffffffffffffffff811115611afc57611afc61296c565b6040519080825280601f01601f191660200182016040528015611b26576020820181803683370190505b5090505b8415611ba957611b3b6001836131e0565b9150611b48600a866131f7565b611b539060306131af565b60f81b818381518110611b6857611b68613117565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ba2600a86613103565b9450611b2a565b949350505050565b8151835114611c285760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161081e565b6001600160a01b038416611c8c5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161081e565b3360005b8451811015611db6576000858281518110611cad57611cad613117565b602002602001015190506000858381518110611ccb57611ccb613117565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611d5e5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161081e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611d9b9084906131af565b9250508190555050505080611daf9061312d565b9050611c90565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e0692919061320b565b60405180910390a46111928187878787876123eb565b600354600160a01b900460ff16611e755760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161081e565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038416611f225760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161081e565b336000611f2e85612591565b90506000611f3b85612591565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611f6d9084906131af565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611fcd836000898989896125dc565b50505050505050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024016000604051808303818588803b15801561203a57600080fd5b505af1158015611fcd573d6000803e3d6000fd5b600380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600354600160a01b900460ff16156120fa5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161081e565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ea53390565b816001600160a01b0316836001600160a01b031614156121bd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161081e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008261223785846126d8565b14949350505050565b6001600160a01b0384166122a45760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161081e565b3360006122b085612591565b905060006122bd85612591565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156123435760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161081e565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906123809084906131af565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46123e0848a8a8a8a8a6125dc565b505050505050505050565b6001600160a01b0384163b156111925760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061242f9089908990889088908890600401613230565b6020604051808303816000875af192505050801561246a575060408051601f3d908101601f191682019092526124679181019061328e565b60015b612520576124766132ab565b806308c379a014156124b0575061248b6132c7565b8061249657506124b2565b8060405162461bcd60e51b815260040161081e91906128cd565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161081e565b6001600160e01b0319811663bc197c8160e01b14611fcd5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161081e565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106125cb576125cb613117565b602090810291909101015292915050565b6001600160a01b0384163b156111925760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906126209089908990889088908890600401613351565b6020604051808303816000875af192505050801561265b575060408051601f3d908101601f191682019092526126589181019061328e565b60015b612667576124766132ab565b6001600160e01b0319811663f23a6e6160e01b14611fcd5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161081e565b600081815b8451811015610d7e5760008582815181106126fa576126fa613117565b602002602001015190508083116127205760008381526020829052604090209250612731565b600081815260208490526040902092505b508061273c8161312d565b9150506126dd565b82805461275090612f8e565b90600052602060002090601f01602090048101928261277257600085556127b8565b82601f1061278b5782800160ff198235161785556127b8565b828001600101855582156127b8579182015b828111156127b857823582559160200191906001019061279d565b506127c49291506127c8565b5090565b5b808211156127c457600081556001016127c9565b6001600160a01b038116811461191a57600080fd5b6000806040838503121561280557600080fd5b8235612810816127dd565b946020939093013593505050565b6001600160e01b03198116811461191a57600080fd5b60006020828403121561284657600080fd5b81356128518161281e565b9392505050565b60006020828403121561286a57600080fd5b5035919050565b60005b8381101561288c578181015183820152602001612874565b8381111561289b576000848401525b50505050565b600081518084526128b9816020860160208601612871565b601f01601f19169290920160200192915050565b60208152600061285160208301846128a1565b803561ffff811681146128f257600080fd5b919050565b6000806040838503121561290a57600080fd5b612810836128e0565b6000806040838503121561292657600080fd5b61292f836128e0565b9150602083013561293f816127dd565b809150509250929050565b6000806040838503121561295d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156129a8576129a861296c565b6040525050565b600067ffffffffffffffff8211156129c9576129c961296c565b5060051b60200190565b600082601f8301126129e457600080fd5b813560206129f1826129af565b6040516129fe8282612982565b83815260059390931b8501820192828101915086841115612a1e57600080fd5b8286015b84811015612a395780358352918301918301612a22565b509695505050505050565b600082601f830112612a5557600080fd5b813567ffffffffffffffff811115612a6f57612a6f61296c565b604051612a86601f8301601f191660200182612982565b818152846020838601011115612a9b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215612ad057600080fd5b8535612adb816127dd565b94506020860135612aeb816127dd565b9350604086013567ffffffffffffffff80821115612b0857600080fd5b612b1489838a016129d3565b94506060880135915080821115612b2a57600080fd5b612b3689838a016129d3565b93506080880135915080821115612b4c57600080fd5b50612b5988828901612a44565b9150509295509295909350565b600060208284031215612b7857600080fd5b8135612851816127dd565b60008060408385031215612b9657600080fd5b823567ffffffffffffffff80821115612bae57600080fd5b818501915085601f830112612bc257600080fd5b81356020612bcf826129af565b604051612bdc8282612982565b83815260059390931b8501820192828101915089841115612bfc57600080fd5b948201945b83861015612c23578535612c14816127dd565b82529482019490820190612c01565b96505086013592505080821115612c3957600080fd5b50612c46858286016129d3565b9150509250929050565b600081518084526020808501945080840160005b83811015612c8057815187529582019590820190600101612c64565b509495945050505050565b6020815260006128516020830184612c50565b60008083601f840112612cb057600080fd5b50813567ffffffffffffffff811115612cc857600080fd5b6020830191508360208260051b8501011115610a2757600080fd5b60008060008060008060808789031215612cfc57600080fd5b612d05876128e0565b9550612d13602088016128e0565b9450604087013567ffffffffffffffff80821115612d3057600080fd5b612d3c8a838b01612c9e565b90965094506060890135915080821115612d5557600080fd5b50612d6289828a01612c9e565b979a9699509497509295939492505050565b60008060408385031215612d8757600080fd5b612d90836128e0565b9150612d9e602084016128e0565b90509250929050565b60008060208385031215612dba57600080fd5b823567ffffffffffffffff80821115612dd257600080fd5b818501915085601f830112612de657600080fd5b813581811115612df557600080fd5b866020828501011115612e0757600080fd5b60209290920196919550909350505050565b60008060408385031215612e2c57600080fd5b8235612e37816127dd565b91506020830135801515811461293f57600080fd5b60008060008060608587031215612e6257600080fd5b8435612e6d816127dd565b9350612e7b602086016128e0565b9250604085013567ffffffffffffffff811115612e9757600080fd5b612ea387828801612c9e565b95989497509550505050565b60008060408385031215612ec257600080fd5b823561292f816127dd565b600080600080600060a08688031215612ee557600080fd5b8535612ef0816127dd565b94506020860135612f00816127dd565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f2a57600080fd5b612b5988828901612a44565b60008060008060008060c08789031215612f4f57600080fd5b612f58876128e0565b95506020870135945060408701359350612f74606088016128e0565b92506080870135915060a087013590509295509295509295565b600181811c90821680612fa257607f821691505b60208210811415612fc357634e487b7160e01b600052602260045260246000fd5b50919050565b60008151612fdb818560208601612871565b9290920192915050565b600080845481600182811c91508083168061300157607f831692505b602080841082141561302157634e487b7160e01b86526022600452602486fd5b818015613035576001811461304657613073565b60ff19861689528489019650613073565b60008b81526020902060005b8681101561306b5781548b820152908501908301613052565b505084890196505b5050505050506130af6130868286612fc9565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156130e8576130e86130b8565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613112576131126130ed565b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613141576131416130b8565b5060010190565b600061ffff82168061315c5761315c6130b8565b6000190192915050565b600061ffff83811690831681811015613181576131816130b8565b039392505050565b600061ffff8083168185168083038211156131a6576131a66130b8565b01949350505050565b600082198211156131c2576131c26130b8565b500190565b6000602082840312156131d957600080fd5b5051919050565b6000828210156131f2576131f26130b8565b500390565b600082613206576132066130ed565b500690565b60408152600061321e6040830185612c50565b82810360208401526130af8185612c50565b60006001600160a01b03808816835280871660208401525060a0604083015261325c60a0830186612c50565b828103606084015261326e8186612c50565b9050828103608084015261328281856128a1565b98975050505050505050565b6000602082840312156132a057600080fd5b81516128518161281e565b600060033d11156132c45760046000803e5060005160e01c5b90565b600060443d10156132d55790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561330557505050505090565b828501915081518181111561331d5750505050505090565b843d87010160208285010111156133375750505050505090565b61334660208286010187612982565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261338960a08301846128a1565b97965050505050505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209b730bd27fb52b8614636b08409482d0652371c765130515be1ceb310114db6f64736f6c634300080b0033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61063a8061007e6000396000f3fe6080604052600436106100655760003560e01c8063e3a9db1a11610043578063e3a9db1a146100ce578063f2fde38b14610112578063f340fa011461013257600080fd5b806351cff8d91461006a578063715018a61461008c5780638da5cb5b146100a1575b600080fd5b34801561007657600080fd5b5061008a6100853660046105ba565b610145565b005b34801561009857600080fd5b5061008a610213565b3480156100ad57600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b3480156100da57600080fd5b506101046100e93660046105ba565b6001600160a01b031660009081526001602052604090205490565b6040519081526020016100c5565b34801561011e57600080fd5b5061008a61012d3660046105ba565b610279565b61008a6101403660046105ba565b61035b565b6000546001600160a01b031633146101a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b03811660008181526001602052604081208054919055906101cc908261041f565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58260405161020791815260200190565b60405180910390a25050565b6000546001600160a01b0316331461026d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161019b565b610277600061053d565b565b6000546001600160a01b031633146102d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161019b565b6001600160a01b03811661034f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161019b565b6103588161053d565b50565b6000546001600160a01b031633146103b55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161019b565b6001600160a01b0381166000908152600160205260408120805434928392916103df9084906105de565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c490602001610207565b8047101561046f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161019b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146104bc576040519150601f19603f3d011682016040523d82523d6000602084013e6104c1565b606091505b50509050806105385760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161019b565b505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461035857600080fd5b6000602082840312156105cc57600080fd5b81356105d7816105a5565b9392505050565b600082198211156105ff57634e487b7160e01b600052601160045260246000fd5b50019056fea2646970667358221220c7f40c066580606bbd0c924aca6a1b6855321ea64e062b34c35d35ce66566ace64736f6c634300080b0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f73746f726167656170692e666c65656b2e636f2f33376139306335372d306163632d343965622d386133372d3231343235323035363430662d6275636b65742f546f6b656e732f6a736f6e2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000006268747470733a2f2f73746f726167656170692e666c65656b2e636f2f33376139306335372d306163632d343965622d386133372d3231343235323035363430662d6275636b65742f636f6c6c656374696f6e2f636f6c6c656374696f6e2e6a736f6e000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102185760003560e01c806378ea93291161011d578063e2982c21116100b0578063f242432a1161007f578063f4aab57511610064578063f4aab575146106bf578063fc314e31146106df578063fc480fa51461078457600080fd5b8063f242432a1461067f578063f2fde38b1461069f57600080fd5b8063e2982c21146105e1578063e8a3d48514610601578063e985e9c514610616578063f0f442601461065f57600080fd5b8063a22cb465116100ec578063a22cb46514610561578063b14c1b6314610581578063b14ebf8f146105a1578063ccb4807b146105c157600080fd5b806378ea9329146104e45780638456cb59146105045780638da5cb5b14610519578063a0bcfc7f1461054157600080fd5b80633bc04565116101b0578063574aa6d01161017f57806365e29eff1161016457806365e29eff1461048f5780636c79b7d9146104af578063715018a6146104cf57600080fd5b8063574aa6d01461045d5780635c975abb1461047057600080fd5b80633bc04565146103ad5780633f4ba83a146103cd5780634bf8dba9146103e25780634e1273f41461043057600080fd5b806325bb379b116101ec57806325bb379b146102cf5780632a55205a1461032e5780632eb2c2d61461036d57806331b3eb941461038d57600080fd5b8062fdd58e1461021d57806301ffc9a7146102505780630e89341c146102805780631b7af704146102ad575b600080fd5b34801561022957600080fd5b5061023d6102383660046127f2565b6107a4565b6040519081526020015b60405180910390f35b34801561025c57600080fd5b5061027061026b366004612834565b61084d565b6040519015158152602001610247565b34801561028c57600080fd5b506102a061029b366004612858565b610878565b60405161024791906128cd565b3480156102b957600080fd5b506102cd6102c83660046128f7565b61092c565b005b3480156102db57600080fd5b5061031b6102ea366004612913565b61ffff91821660009081526008602090815260408083206001600160a01b0390941683526006909301905220541690565b60405161ffff9091168152602001610247565b34801561033a57600080fd5b5061034e61034936600461294a565b61098e565b604080516001600160a01b039093168352602083019190915201610247565b34801561037957600080fd5b506102cd610388366004612ab8565b610a2e565b34801561039957600080fd5b506102cd6103a8366004612b66565b610ad0565b3480156103b957600080fd5b506102cd6103c83660046128f7565b610b47565b3480156103d957600080fd5b506102cd610bf6565b3480156103ee57600080fd5b506102706103fd366004612913565b61ffff90911660009081526008602090815260408083206001600160a01b03909416835260079093019052205460ff1690565b34801561043c57600080fd5b5061045061044b366004612b83565b610c48565b6040516102479190612c8b565b6102cd61046b366004612ce3565b610d86565b34801561047c57600080fd5b50600354600160a01b900460ff16610270565b34801561049b57600080fd5b506102cd6104aa3660046128f7565b61119a565b3480156104bb57600080fd5b506102cd6104ca366004612d74565b611249565b3480156104db57600080fd5b506102cd611327565b3480156104f057600080fd5b506102cd6104ff366004612d74565b611379565b34801561051057600080fd5b506102cd6113e8565b34801561052557600080fd5b506003546040516001600160a01b039091168152602001610247565b34801561054d57600080fd5b506102cd61055c366004612da7565b611438565b34801561056d57600080fd5b506102cd61057c366004612e19565b611491565b34801561058d57600080fd5b5061027061059c366004612e4c565b6114a0565b3480156105ad57600080fd5b506102706105bc366004612e4c565b611538565b3480156105cd57600080fd5b506102cd6105dc366004612da7565b6115c6565b3480156105ed57600080fd5b5061023d6105fc366004612b66565b61161a565b34801561060d57600080fd5b506102a06116a9565b34801561062257600080fd5b50610270610631366004612eaf565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561066b57600080fd5b506102cd61067a366004612b66565b61173b565b34801561068b57600080fd5b506102cd61069a366004612ecd565b6117b2565b3480156106ab57600080fd5b506102cd6106ba366004612b66565b61184d565b3480156106cb57600080fd5b506102cd6106da366004612f36565b61191d565b3480156106eb57600080fd5b506107426106fa366004612858565b60086020526000908152604090208054600182015460028301546003840154600485015460059095015461ffff94851695939492938284169362010000909304909216919087565b6040805161ffff988916815260208101979097528601949094529185166060850152909316608083015260a082019290925260c081019190915260e001610247565b34801561079057600080fd5b506102cd61079f3660046128f7565b6119e1565b60006001600160a01b0383166108275760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b0319821663152a902d60e11b1480610872575061087282611a43565b92915050565b606061088360045490565b82106108f75760405162461bcd60e51b815260206004820152603060248201527f455243313135354d657461646174613a2055524920717565727920666f72206e60448201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000606482015260840161081e565b6000600661090484611a93565b604051602001610915929190612fe5565b60408051601f198184030181529190529392505050565b6003546001600160a01b031633146109745760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff909116600090815260086020526040902060020155565b60008061099a60045490565b84106109e85760405162461bcd60e51b815260206004820152601160248201527f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000604482015260640161081e565b600084815260086020526040812060030154606490610a0b9061ffff16866130ce565b610a159190613103565b6005546001600160a01b031693509150505b9250929050565b6001600160a01b038516331480610a4a5750610a4a8533610631565b610abc5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161081e565b610ac98585858585611bb1565b5050505050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000e8df164574ce04386f975dd32a9f1b3616d730dd16906351cff8d990602401600060405180830381600087803b158015610b3357600080fd5b505af1158015610ac9573d6000803e3d6000fd5b6003546001600160a01b03163314610b8f5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b80610bdc5760405162461bcd60e51b815260206004820152601260248201527f496e76616c696420726f6f7420686173682e0000000000000000000000000000604482015260640161081e565b61ffff909116600090815260086020526040902060040155565b6003546001600160a01b03163314610c3e5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b610c46611e1c565b565b60608151835114610cc15760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161081e565b6000835167ffffffffffffffff811115610cdd57610cdd61296c565b604051908082528060200260200182016040528015610d06578160200160208202803683370190505b50905060005b8451811015610d7e57610d51858281518110610d2a57610d2a613117565b6020026020010151858381518110610d4457610d44613117565b60200260200101516107a4565b828281518110610d6357610d63613117565b6020908102919091010152610d778161312d565b9050610d0c565b509392505050565b600354600160a01b900460ff1615610dd35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161081e565b6004548661ffff1610610e285760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420546f6b656e2049642e000000000000000000000000000000604482015260640161081e565b60008561ffff16118015610e5d575061ffff808716600090815260086020526040902060030154620100009004811690861611155b610ea95760405162461bcd60e51b815260206004820152601260248201527f4e6f7420656e6f75676820746f6b656e732e0000000000000000000000000000604482015260640161081e565b6003546001600160a01b0316331415610ec157611101565b600085610ed0338986866114a0565b8015610efe575061ffff8816600090815260086020908152604080832033845260070190915290205460ff16155b15610f3d5780610f0d81613148565b61ffff8a1660009081526008602090815260408083203384526007019091529020805460ff191660011790559150505b61ffff80891660009081526008602090815260408083203384526006019091528120549091610f6e91166002613166565b9050610f7c338a8989611538565b8015610f8c575060008161ffff16115b1561107f578061ffff168261ffff16111561100657610fab8183613166565b61ffff808b16600090815260086020526040902060010154919350610fd2919083166130ce565b61ffff8a1660009081526008602090815260408083203384526006019091529020805461ffff19166002179055925061107f565b61ffff808a166000908152600860205260409020600101546110299184166130ce565b61ffff808b166000908152600860209081526040808320338452600601909152812080549396508593909261106091859116613189565b92506101000a81548161ffff021916908361ffff160217905550600091505b61ffff808a166000908152600860205260409020600201546110a29184166130ce565b6110ac90846131af565b92508234146110fd5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642076616c75652073656e742e00000000000000000000000000604482015260640161081e565b5050505b611124338761ffff168761ffff1660405180602001604052806000815250611ec2565b61ffff80871660009081526008602052604090206003018054879260029161115491859162010000900416613166565b92506101000a81548161ffff021916908361ffff16021790555060003411156111925761119261118c6003546001600160a01b031690565b34611fd6565b505050505050565b6003546001600160a01b031633146111e25760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b8061122f5760405162461bcd60e51b815260206004820152601260248201527f496e76616c696420726f6f7420686173682e0000000000000000000000000000604482015260640161081e565b61ffff909116600090815260086020526040902060050155565b6003546001600160a01b031633146112915760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff8083166000908152600860205260408120805484939192916112b891859116613189565b92506101000a81548161ffff021916908361ffff16021790555080600860008461ffff16815260200190815260200160002060030160028282829054906101000a900461ffff166113099190613189565b92506101000a81548161ffff021916908361ffff1602179055505050565b6003546001600160a01b0316331461136f5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b610c46600061204e565b6003546001600160a01b031633146113c15760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff9182166000908152600860205260409020600301805461ffff191691909216179055565b6003546001600160a01b031633146114305760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b610c466120ad565b6003546001600160a01b031633146114805760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61148c60068383612744565b505050565b61149c338383612135565b5050565b6040516bffffffffffffffffffffffff19606086901b166020820152600090819060340160405160208183030381529060405280519060200120905061152e848480806020026020016040519081016040528093929190818152602001838360200280828437600092018290525061ffff8b16815260086020526040902060050154925085915061222a9050565b9695505050505050565b6040516bffffffffffffffffffffffff19606086901b166020820152600090819060340160405160208183030381529060405280519060200120905061152e848480806020026020016040519081016040528093929190818152602001838360200280828437600092018290525061ffff8b16815260086020526040902060040154925085915061222a9050565b6003546001600160a01b0316331461160e5760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61148c60078383612744565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f000000000000000000000000e8df164574ce04386f975dd32a9f1b3616d730dd9091169063e3a9db1a90602401602060405180830381865afa158015611685573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087291906131c7565b6060600780546116b890612f8e565b80601f01602080910402602001604051908101604052809291908181526020018280546116e490612f8e565b80156117315780601f1061170657610100808354040283529160200191611731565b820191906000526020600020905b81548152906001019060200180831161171457829003601f168201915b5050505050905090565b6003546001600160a01b031633146117835760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0385163314806117ce57506117ce8533610631565b6118405760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f7665640000000000000000000000000000000000000000000000606482015260840161081e565b610ac98585858585612240565b6003546001600160a01b031633146118955760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b6001600160a01b0381166119115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161081e565b61191a8161204e565b50565b6003546001600160a01b031633146119655760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b600061197060045490565b6000908152600860205260409020805461ffff191661ffff988916908117825560018083019890985560028201969096556003810180546004808401969096556005909201939093559390961663ffffffff1990931692909217620100009093029290921790558054909101905550565b6003546001600160a01b03163314611a295760405162461bcd60e51b81526020600482018190526024820152600080516020613395833981519152604482015260640161081e565b61ffff909116600090815260086020526040902060010155565b60006001600160e01b03198216636cdb3d1360e11b1480611a7457506001600160e01b031982166303a24d0760e21b145b8061087257506301ffc9a760e01b6001600160e01b0319831614610872565b606081611ab75750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ae15780611acb8161312d565b9150611ada9050600a83613103565b9150611abb565b60008167ffffffffffffffff811115611afc57611afc61296c565b6040519080825280601f01601f191660200182016040528015611b26576020820181803683370190505b5090505b8415611ba957611b3b6001836131e0565b9150611b48600a866131f7565b611b539060306131af565b60f81b818381518110611b6857611b68613117565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611ba2600a86613103565b9450611b2a565b949350505050565b8151835114611c285760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161081e565b6001600160a01b038416611c8c5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161081e565b3360005b8451811015611db6576000858281518110611cad57611cad613117565b602002602001015190506000858381518110611ccb57611ccb613117565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015611d5e5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161081e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611d9b9084906131af565b9250508190555050505080611daf9061312d565b9050611c90565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611e0692919061320b565b60405180910390a46111928187878787876123eb565b600354600160a01b900460ff16611e755760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161081e565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038416611f225760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161081e565b336000611f2e85612591565b90506000611f3b85612591565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611f6d9084906131af565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611fcd836000898989896125dc565b50505050505050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f000000000000000000000000e8df164574ce04386f975dd32a9f1b3616d730dd169063f340fa019083906024016000604051808303818588803b15801561203a57600080fd5b505af1158015611fcd573d6000803e3d6000fd5b600380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600354600160a01b900460ff16156120fa5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161081e565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ea53390565b816001600160a01b0316836001600160a01b031614156121bd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161081e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60008261223785846126d8565b14949350505050565b6001600160a01b0384166122a45760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b606482015260840161081e565b3360006122b085612591565b905060006122bd85612591565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156123435760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b606482015260840161081e565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906123809084906131af565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46123e0848a8a8a8a8a6125dc565b505050505050505050565b6001600160a01b0384163b156111925760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061242f9089908990889088908890600401613230565b6020604051808303816000875af192505050801561246a575060408051601f3d908101601f191682019092526124679181019061328e565b60015b612520576124766132ab565b806308c379a014156124b0575061248b6132c7565b8061249657506124b2565b8060405162461bcd60e51b815260040161081e91906128cd565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161081e565b6001600160e01b0319811663bc197c8160e01b14611fcd5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161081e565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106125cb576125cb613117565b602090810291909101015292915050565b6001600160a01b0384163b156111925760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906126209089908990889088908890600401613351565b6020604051808303816000875af192505050801561265b575060408051601f3d908101601f191682019092526126589181019061328e565b60015b612667576124766132ab565b6001600160e01b0319811663f23a6e6160e01b14611fcd5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840161081e565b600081815b8451811015610d7e5760008582815181106126fa576126fa613117565b602002602001015190508083116127205760008381526020829052604090209250612731565b600081815260208490526040902092505b508061273c8161312d565b9150506126dd565b82805461275090612f8e565b90600052602060002090601f01602090048101928261277257600085556127b8565b82601f1061278b5782800160ff198235161785556127b8565b828001600101855582156127b8579182015b828111156127b857823582559160200191906001019061279d565b506127c49291506127c8565b5090565b5b808211156127c457600081556001016127c9565b6001600160a01b038116811461191a57600080fd5b6000806040838503121561280557600080fd5b8235612810816127dd565b946020939093013593505050565b6001600160e01b03198116811461191a57600080fd5b60006020828403121561284657600080fd5b81356128518161281e565b9392505050565b60006020828403121561286a57600080fd5b5035919050565b60005b8381101561288c578181015183820152602001612874565b8381111561289b576000848401525b50505050565b600081518084526128b9816020860160208601612871565b601f01601f19169290920160200192915050565b60208152600061285160208301846128a1565b803561ffff811681146128f257600080fd5b919050565b6000806040838503121561290a57600080fd5b612810836128e0565b6000806040838503121561292657600080fd5b61292f836128e0565b9150602083013561293f816127dd565b809150509250929050565b6000806040838503121561295d57600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156129a8576129a861296c565b6040525050565b600067ffffffffffffffff8211156129c9576129c961296c565b5060051b60200190565b600082601f8301126129e457600080fd5b813560206129f1826129af565b6040516129fe8282612982565b83815260059390931b8501820192828101915086841115612a1e57600080fd5b8286015b84811015612a395780358352918301918301612a22565b509695505050505050565b600082601f830112612a5557600080fd5b813567ffffffffffffffff811115612a6f57612a6f61296c565b604051612a86601f8301601f191660200182612982565b818152846020838601011115612a9b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215612ad057600080fd5b8535612adb816127dd565b94506020860135612aeb816127dd565b9350604086013567ffffffffffffffff80821115612b0857600080fd5b612b1489838a016129d3565b94506060880135915080821115612b2a57600080fd5b612b3689838a016129d3565b93506080880135915080821115612b4c57600080fd5b50612b5988828901612a44565b9150509295509295909350565b600060208284031215612b7857600080fd5b8135612851816127dd565b60008060408385031215612b9657600080fd5b823567ffffffffffffffff80821115612bae57600080fd5b818501915085601f830112612bc257600080fd5b81356020612bcf826129af565b604051612bdc8282612982565b83815260059390931b8501820192828101915089841115612bfc57600080fd5b948201945b83861015612c23578535612c14816127dd565b82529482019490820190612c01565b96505086013592505080821115612c3957600080fd5b50612c46858286016129d3565b9150509250929050565b600081518084526020808501945080840160005b83811015612c8057815187529582019590820190600101612c64565b509495945050505050565b6020815260006128516020830184612c50565b60008083601f840112612cb057600080fd5b50813567ffffffffffffffff811115612cc857600080fd5b6020830191508360208260051b8501011115610a2757600080fd5b60008060008060008060808789031215612cfc57600080fd5b612d05876128e0565b9550612d13602088016128e0565b9450604087013567ffffffffffffffff80821115612d3057600080fd5b612d3c8a838b01612c9e565b90965094506060890135915080821115612d5557600080fd5b50612d6289828a01612c9e565b979a9699509497509295939492505050565b60008060408385031215612d8757600080fd5b612d90836128e0565b9150612d9e602084016128e0565b90509250929050565b60008060208385031215612dba57600080fd5b823567ffffffffffffffff80821115612dd257600080fd5b818501915085601f830112612de657600080fd5b813581811115612df557600080fd5b866020828501011115612e0757600080fd5b60209290920196919550909350505050565b60008060408385031215612e2c57600080fd5b8235612e37816127dd565b91506020830135801515811461293f57600080fd5b60008060008060608587031215612e6257600080fd5b8435612e6d816127dd565b9350612e7b602086016128e0565b9250604085013567ffffffffffffffff811115612e9757600080fd5b612ea387828801612c9e565b95989497509550505050565b60008060408385031215612ec257600080fd5b823561292f816127dd565b600080600080600060a08688031215612ee557600080fd5b8535612ef0816127dd565b94506020860135612f00816127dd565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f2a57600080fd5b612b5988828901612a44565b60008060008060008060c08789031215612f4f57600080fd5b612f58876128e0565b95506020870135945060408701359350612f74606088016128e0565b92506080870135915060a087013590509295509295509295565b600181811c90821680612fa257607f821691505b60208210811415612fc357634e487b7160e01b600052602260045260246000fd5b50919050565b60008151612fdb818560208601612871565b9290920192915050565b600080845481600182811c91508083168061300157607f831692505b602080841082141561302157634e487b7160e01b86526022600452602486fd5b818015613035576001811461304657613073565b60ff19861689528489019650613073565b60008b81526020902060005b8681101561306b5781548b820152908501908301613052565b505084890196505b5050505050506130af6130868286612fc9565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156130e8576130e86130b8565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613112576131126130ed565b500490565b634e487b7160e01b600052603260045260246000fd5b6000600019821415613141576131416130b8565b5060010190565b600061ffff82168061315c5761315c6130b8565b6000190192915050565b600061ffff83811690831681811015613181576131816130b8565b039392505050565b600061ffff8083168185168083038211156131a6576131a66130b8565b01949350505050565b600082198211156131c2576131c26130b8565b500190565b6000602082840312156131d957600080fd5b5051919050565b6000828210156131f2576131f26130b8565b500390565b600082613206576132066130ed565b500690565b60408152600061321e6040830185612c50565b82810360208401526130af8185612c50565b60006001600160a01b03808816835280871660208401525060a0604083015261325c60a0830186612c50565b828103606084015261326e8186612c50565b9050828103608084015261328281856128a1565b98975050505050505050565b6000602082840312156132a057600080fd5b81516128518161281e565b600060033d11156132c45760046000803e5060005160e01c5b90565b600060443d10156132d55790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561330557505050505090565b828501915081518181111561331d5750505050505090565b843d87010160208285010111156133375750505050505090565b61334660208286010187612982565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261338960a08301846128a1565b97965050505050505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209b730bd27fb52b8614636b08409482d0652371c765130515be1ceb310114db6f64736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005468747470733a2f2f73746f726167656170692e666c65656b2e636f2f33376139306335372d306163632d343965622d386133372d3231343235323035363430662d6275636b65742f546f6b656e732f6a736f6e2f000000000000000000000000000000000000000000000000000000000000000000000000000000000000006268747470733a2f2f73746f726167656170692e666c65656b2e636f2f33376139306335372d306163632d343965622d386133372d3231343235323035363430662d6275636b65742f636f6c6c656374696f6e2f636f6c6c656374696f6e2e6a736f6e000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): https://storageapi.fleek.co/37a90c57-0acc-49eb-8a37-21425205640f-bucket/Tokens/json/
Arg [1] : _contractUri (string): https://storageapi.fleek.co/37a90c57-0acc-49eb-8a37-21425205640f-bucket/collection/collection.json

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000054
Arg [3] : 68747470733a2f2f73746f726167656170692e666c65656b2e636f2f33376139
Arg [4] : 306335372d306163632d343965622d386133372d323134323532303536343066
Arg [5] : 2d6275636b65742f546f6b656e732f6a736f6e2f000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000062
Arg [7] : 68747470733a2f2f73746f726167656170692e666c65656b2e636f2f33376139
Arg [8] : 306335372d306163632d343965622d386133372d323134323532303536343066
Arg [9] : 2d6275636b65742f636f6c6c656374696f6e2f636f6c6c656374696f6e2e6a73
Arg [10] : 6f6e000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

53327:7018:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37870:231;;;;;;;;;;-1:-1:-1;37870:231:0;;;;;:::i;:::-;;:::i;:::-;;;639:25:1;;;627:2;612:18;37870:231:0;;;;;;;;59102:305;;;;;;;;;;-1:-1:-1;59102:305:0;;;;;:::i;:::-;;:::i;:::-;;;1226:14:1;;1219:22;1201:41;;1189:2;1174:18;59102:305:0;1061:187:1;59815:377:0;;;;;;;;;;-1:-1:-1;59815:377:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55945:124::-;;;;;;;;;;-1:-1:-1;55945:124:0;;;;;:::i;:::-;;:::i;:::-;;58717:185;;;;;;;;;;-1:-1:-1;58717:185:0;;;;;:::i;:::-;58842:17;;;;58808:13;58842:17;;;:12;:17;;;;;;;;-1:-1:-1;;;;;58842:52:0;;;;;:34;;;;:52;;;;;;58717:185;;;;3130:6:1;3118:19;;;3100:38;;3088:2;3073:18;58717:185:0;2956:188:1;59419:383:0;;;;;;;;;;-1:-1:-1;59419:383:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3594:55:1;;;3576:74;;3681:2;3666:18;;3659:34;;;;3549:18;59419:383:0;3402:297:1;39809:442:0;;;;;;;;;;-1:-1:-1;39809:442:0;;;;;:::i;:::-;;:::i;24662:106::-;;;;;;;;;;-1:-1:-1;24662:106:0;;;;;:::i;:::-;;:::i;55066:201::-;;;;;;;;;;-1:-1:-1;55066:201:0;;;;;:::i;:::-;;:::i;60276:64::-;;;;;;;;;;;;;:::i;58910:180::-;;;;;;;;;;-1:-1:-1;58910:180:0;;;;;:::i;:::-;59034:17;;;;58994:15;59034:17;;;:12;:17;;;;;;;;-1:-1:-1;;;;;59034:48:0;;;;;:30;;;;:48;;;;;;;58910:180;38267:524;;;;;;;;;;-1:-1:-1;38267:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;56400:1672::-;;;;;;:::i;:::-;;:::i;8331:86::-;;;;;;;;;;-1:-1:-1;8402:7:0;;-1:-1:-1;;;8402:7:0;;;;8331:86;;55275:193;;;;;;;;;;-1:-1:-1;55275:193:0;;;;;:::i;:::-;;:::i;56215:177::-;;;;;;;;;;-1:-1:-1;56215:177:0;;;;;:::i;:::-;;:::i;11230:103::-;;;;;;;;;;;;;:::i;55788:147::-;;;;;;;;;;-1:-1:-1;55788:147:0;;;;;:::i;:::-;;:::i;60208:60::-;;;;;;;;;;;;;:::i;10579:87::-;;;;;;;;;;-1:-1:-1;10652:6:0;;10579:87;;-1:-1:-1;;;;;10652:6:0;;;10850:74:1;;10838:2;10823:18;10579:87:0;10704:226:1;55476:92:0;;;;;;;;;;-1:-1:-1;55476:92:0;;;;;:::i;:::-;;:::i;38864:155::-;;;;;;;;;;-1:-1:-1;38864:155:0;;;;;:::i;:::-;;:::i;58454:255::-;;;;;;;;;;-1:-1:-1;58454:255:0;;;;;:::i;:::-;;:::i;58185:261::-;;;;;;;;;;-1:-1:-1;58185:261:0;;;;;:::i;:::-;;:::i;55576:100::-;;;;;;;;;;-1:-1:-1;55576:100:0;;;;;:::i;:::-;;:::i;24892:112::-;;;;;;;;;;-1:-1:-1;24892:112:0;;;;;:::i;:::-;;:::i;58080:96::-;;;;;;;;;;;;;:::i;39091:168::-;;;;;;;;;;-1:-1:-1;39091:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;39214:27:0;;;39190:4;39214:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;39091:168;55684:96;;;;;;;;;;-1:-1:-1;55684:96:0;;;;;:::i;:::-;;:::i;39331:401::-;;;;;;;;;;-1:-1:-1;39331:401:0;;;;;:::i;:::-;;:::i;11488:201::-;;;;;;;;;;-1:-1:-1;11488:201:0;;;;;:::i;:::-;;:::i;54229:829::-;;;;;;;;;;-1:-1:-1;54229:829:0;;;;;:::i;:::-;;:::i;53968:49::-;;;;;;;;;;-1:-1:-1;53968:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14841:6:1;14874:15;;;14856:34;;14921:2;14906:18;;14899:34;;;;14949:18;;14942:34;;;;15012:15;;;15007:2;14992:18;;14985:43;15065:15;;;15059:3;15044:19;;15037:44;15112:3;15097:19;;15090:35;;;;15156:3;15141:19;;15134:35;;;;14818:3;14803:19;53968:49:0;14522:653:1;56077:130:0;;;;;;;;;;-1:-1:-1;56077:130:0;;;;;:::i;:::-;;:::i;37870:231::-;37956:7;-1:-1:-1;;;;;37984:21:0;;37976:77;;;;-1:-1:-1;;;37976:77:0;;15382:2:1;37976:77:0;;;15364:21:1;15421:2;15401:18;;;15394:30;15460:34;15440:18;;;15433:62;15531:13;15511:18;;;15504:41;15562:19;;37976:77:0;;;;;;;;;-1:-1:-1;38071:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;38071:22:0;;;;;;;;;;;;37870:231::o;59102:305::-;59250:4;-1:-1:-1;;;;;;59294:41:0;;-1:-1:-1;;;59294:41:0;;:94;;;59352:36;59376:11;59352:23;:36::i;:::-;59272:127;59102:305;-1:-1:-1;;59102:305:0:o;59815:377::-;59911:13;59960:25;:15;3120:14;;3028:114;59960:25;59950:7;:35;59942:96;;;;-1:-1:-1;;;59942:96:0;;15794:2:1;59942:96:0;;;15776:21:1;15833:2;15813:18;;;15806:30;15872:34;15852:18;;;15845:62;15943:18;15923;;;15916:46;15979:19;;59942:96:0;15592:412:1;59942:96:0;60059:23;60109:8;60119:25;60136:7;60119:16;:25::i;:::-;60092:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60092:62:0;;;;;;;;;;59815:377;-1:-1:-1;;;59815:377:0:o;55945:124::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;56021:17:::1;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:30:::1;;:39:::0;55945:124::o;59419:383::-;59528:16;59546:21;59603:25;:15;3120:14;;3028:114;59603:25;59593:7;:35;59585:65;;;;-1:-1:-1;;;59585:65:0;;18697:2:1;59585:65:0;;;18679:21:1;18736:2;18716:18;;;18709:30;18775:19;18755:18;;;18748:47;18812:18;;59585:65:0;18495:341:1;59585:65:0;59677:14;59704:21;;;:12;:21;;;;;:40;;;59753:3;;59694:50;;59704:40;;59694:9;:50;:::i;:::-;:63;;;;:::i;:::-;59776:9;;-1:-1:-1;;;;;59776:9:0;;-1:-1:-1;59677:80:0;-1:-1:-1;;59419:383:0;;;;;;:::o;39809:442::-;-1:-1:-1;;;;;40042:20:0;;7065:10;40042:20;;:60;;-1:-1:-1;40066:36:0;40083:4;7065:10;39091:168;:::i;40066:36::-;40020:160;;;;-1:-1:-1;;;40020:160:0;;19605:2:1;40020:160:0;;;19587:21:1;19644:2;19624:18;;;19617:30;19683:34;19663:18;;;19656:62;19754:20;19734:18;;;19727:48;19792:19;;40020:160:0;19403:414:1;40020:160:0;40191:52;40214:4;40220:2;40224:3;40229:7;40238:4;40191:22;:52::i;:::-;39809:442;;;;;:::o;24662:106::-;24737:23;;-1:-1:-1;;;24737:23:0;;-1:-1:-1;;;;;10868:55:1;;;24737:23:0;;;10850:74:1;24737:7:0;:16;;;;10823:18:1;;24737:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55066:201;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;55160:19;55152:50:::1;;;::::0;-1:-1:-1;;;55152:50:0;;20271:2:1;55152:50:0::1;::::0;::::1;20253:21:1::0;20310:2;20290:18;;;20283:30;20349:20;20329:18;;;20322:48;20387:18;;55152:50:0::1;20069:342:1::0;55152:50:0::1;55213:17;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:38:::1;;:46:::0;55066:201::o;60276:64::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;60322:10:::1;:8;:10::i;:::-;60276:64::o:0;38267:524::-;38423:16;38484:3;:10;38465:8;:15;:29;38457:83;;;;-1:-1:-1;;;38457:83:0;;20618:2:1;38457:83:0;;;20600:21:1;20657:2;20637:18;;;20630:30;20696:34;20676:18;;;20669:62;20767:11;20747:18;;;20740:39;20796:19;;38457:83:0;20416:405:1;38457:83:0;38553:30;38600:8;:15;38586:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38586:30:0;;38553:63;;38634:9;38629:122;38653:8;:15;38649:1;:19;38629:122;;;38709:30;38719:8;38728:1;38719:11;;;;;;;;:::i;:::-;;;;;;;38732:3;38736:1;38732:6;;;;;;;;:::i;:::-;;;;;;;38709:9;:30::i;:::-;38690:13;38704:1;38690:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;38670:3;;;:::i;:::-;;;38629:122;;;-1:-1:-1;38770:13:0;38267:524;-1:-1:-1;;;38267:524:0:o;56400:1672::-;8402:7;;-1:-1:-1;;;8402:7:0;;;;8656:9;8648:38;;;;-1:-1:-1;;;8648:38:0;;21300:2:1;8648:38:0;;;21282:21:1;21339:2;21319:18;;;21312:30;-1:-1:-1;;;21358:18:1;;;21351:46;21414:18;;8648:38:0;21098:340:1;8648:38:0;56560:15:::1;3120:14:::0;56554:3:::1;:31;;;56546:61;;;::::0;-1:-1:-1;;;56546:61:0;;21645:2:1;56546:61:0::1;::::0;::::1;21627:21:1::0;21684:2;21664:18;;;21657:30;21723:19;21703:18;;;21696:47;21760:18;;56546:61:0::1;21443:341:1::0;56546:61:0::1;56633:1;56626:4;:8;;;:48;;;;-1:-1:-1::0;56646:17:0::1;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:28:::1;;::::0;;;::::1;::::0;::::1;56638:36:::0;;::::1;;;56626:48;56618:79;;;::::0;-1:-1:-1;;;56618:79:0;;21991:2:1;56618:79:0::1;::::0;::::1;21973:21:1::0;22030:2;22010:18;;;22003:30;22069:20;22049:18;;;22042:48;22107:18;;56618:79:0::1;21789:342:1::0;56618:79:0::1;10652:6:::0;;-1:-1:-1;;;;;10652:6:0;56711:10:::1;:21;56708:1157;;;;;;56778:10;56820:4:::0;56842:42:::1;56855:10;56867:3:::0;56872:11;;56842:12:::1;:42::i;:::-;:89;;;;-1:-1:-1::0;56889:17:0::1;::::0;::::1;;::::0;;;:12:::1;:17;::::0;;;;;;;56920:10:::1;56889:42:::0;;:30:::1;;:42:::0;;;;;;::::1;;56888:43;56842:89;56839:205;;;56951:9:::0;::::1;::::0;::::1;:::i;:::-;56979:17;::::0;::::1;;::::0;;;:12:::1;:17;::::0;;;;;;;57010:10:::1;56979:42:::0;;:30:::1;;:42:::0;;;;;:49;;-1:-1:-1;;56979:49:0::1;57024:4;56979:49;::::0;;56951:9;-1:-1:-1;;56839:205:0::1;57078:17;::::0;;::::1;57058:13;57078:17:::0;;;:12:::1;:17;::::0;;;;;;;57113:10:::1;57078:46:::0;;:34:::1;;:46:::0;;;;;;57058:13;;57074:50:::1;::::0;57078:46:::1;57074:1;:50;:::i;:::-;57058:66;;57142:48;57157:10;57169:3;57174:15;;57142:14;:48::i;:::-;:62;;;;;57203:1;57194:6;:10;;;57142:62;57139:574;;;57237:6;57227:16;;:7;:16;;;57224:456;;;57267:17;57278:6:::0;57267:17;::::1;:::i;:::-;57322;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:33:::1;;::::0;57267:17;;-1:-1:-1;57315:40:0::1;::::0;57322:33;57315:40;::::1;;:::i;:::-;57378:17;::::0;::::1;;::::0;;;:12:::1;:17;::::0;;;;;;;57413:10:::1;57378:46:::0;;:34:::1;;:46:::0;;;;;:50;;-1:-1:-1;;57378:50:0::1;57427:1;57378:50;::::0;;57307:48;-1:-1:-1;57224:456:0::1;;;57491:17;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:33:::1;;::::0;57483:41:::1;::::0;;::::1;;:::i;:::-;57569:17;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;;;;57604:10:::1;57569:46:::0;;:34:::1;;:46:::0;;;;;:57;;57475:49;;-1:-1:-1;57619:7:0;;57569:46;;:57:::1;::::0;57619:7;;57569:57:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57659:1;57649:11;;57224:456;57744:17;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:30:::1;;::::0;57736:38:::1;::::0;;::::1;;:::i;:::-;57727:47;::::0;;::::1;:::i;:::-;;;57810:5;57797:9;:18;57789:50;;;::::0;-1:-1:-1;;;57789:50:0;;23108:2:1;57789:50:0::1;::::0;::::1;23090:21:1::0;23147:2;23127:18;;;23120:30;23186:21;23166:18;;;23159:49;23225:18;;57789:50:0::1;22906:343:1::0;57789:50:0::1;56763:1102;;;56708:1157;57877:33;57884:10;57896:3;57877:33;;57901:4;57877:33;;;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;57921:17;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:28:::1;;:36:::0;;57953:4;;57921:28:::1;::::0;:36:::1;::::0;57953:4;;57921:36;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57983:1;57971:9;:13;57968:78;;;58000:34;58015:7;10652:6:::0;;-1:-1:-1;;;;;10652:6:0;;10579:87;58015:7:::1;58024:9;58000:14;:34::i;:::-;56400:1672:::0;;;;;;:::o;55275:193::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;55365:19;55357:50:::1;;;::::0;-1:-1:-1;;;55357:50:0;;20271:2:1;55357:50:0::1;::::0;::::1;20253:21:1::0;20310:2;20290:18;;;20283:30;20349:20;20329:18;;;20322:48;20387:18;;55357:50:0::1;20069:342:1::0;55357:50:0::1;55418:17;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:34:::1;;:42:::0;55275:193::o;56215:177::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;56294:17:::1;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:40;;56327:7;;56294:17;;;:40:::1;::::0;56327:7;;56294:40:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56377:7;56345:12;:17;56358:3;56345:17;;;;;;;;;;;;;:28;;;:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56215:177:::0;;:::o;11230:103::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;11295:30:::1;11322:1;11295:18;:30::i;55788:147::-:0;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;55877:17:::1;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:36:::1;;:50:::0;;-1:-1:-1;;55877:50:0::1;::::0;;;::::1;;::::0;;55788:147::o;60208:60::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;60252:8:::1;:6;:8::i;55476:92::-:0;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;55545:15:::1;:8;55556:4:::0;;55545:15:::1;:::i;:::-;;55476:92:::0;;:::o;38864:155::-;38959:52;7065:10;38992:8;39002;38959:18;:52::i;:::-;38864:155;;:::o;58454:255::-;58591:23;;-1:-1:-1;;23403:2:1;23399:15;;;23395:53;58591:23:0;;;23383:66:1;58550:4:0;;;;23465:12:1;;58591:23:0;;;;;;;;;;;;58581:34;;;;;;58566:49;;58633:68;58652:6;;58633:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58660:17:0;;;;;:12;:17;;;;;:34;;;;-1:-1:-1;58696:4:0;;-1:-1:-1;58633:18:0;;-1:-1:-1;58633:68:0:i;:::-;58626:75;58454:255;-1:-1:-1;;;;;;58454:255:0:o;58185:261::-;58324:23;;-1:-1:-1;;23403:2:1;23399:15;;;23395:53;58324:23:0;;;23383:66:1;58283:4:0;;;;23465:12:1;;58324:23:0;;;;;;;;;;;;58314:34;;;;;;58299:49;;58366:72;58385:6;;58366:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58393:17:0;;;;;:12;:17;;;;;:38;;;;-1:-1:-1;58433:4:0;;-1:-1:-1;58366:18:0;;-1:-1:-1;58366:72:0:i;55576:100::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;55649:19:::1;:12;55664:4:::0;;55649:19:::1;:::i;24892:112::-:0;24972:24;;-1:-1:-1;;;24972:24:0;;-1:-1:-1;;;;;10868:55:1;;;24972:24:0;;;10850:74:1;24945:7:0;;24972;:18;;;;;;10823::1;;24972:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;58080:96::-;58123:13;58156:12;58149:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58080:96;:::o;55684:::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;55751:9:::1;:21:::0;;-1:-1:-1;;55751:21:0::1;-1:-1:-1::0;;;;;55751:21:0;;;::::1;::::0;;;::::1;::::0;;55684:96::o;39331:401::-;-1:-1:-1;;;;;39539:20:0;;7065:10;39539:20;;:60;;-1:-1:-1;39563:36:0;39580:4;7065:10;39091:168;:::i;39563:36::-;39517:151;;;;-1:-1:-1;;;39517:151:0;;23879:2:1;39517:151:0;;;23861:21:1;23918:2;23898:18;;;23891:30;23957:34;23937:18;;;23930:62;24028:11;24008:18;;;24001:39;24057:19;;39517:151:0;23677:405:1;39517:151:0;39679:45;39697:4;39703:2;39707;39711:6;39719:4;39679:17;:45::i;11488:201::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;-1:-1:-1;;;;;11577:22:0;::::1;11569:73;;;::::0;-1:-1:-1;;;11569:73:0;;24289:2:1;11569:73:0::1;::::0;::::1;24271:21:1::0;24328:2;24308:18;;;24301:30;24367:34;24347:18;;;24340:62;24438:8;24418:18;;;24411:36;24464:19;;11569:73:0::1;24087:402:1::0;11569:73:0::1;11653:28;11672:8;11653:18;:28::i;:::-;11488:201:::0;:::o;54229:829::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;54492:8:::1;54503:25;:15;3120:14:::0;;3028:114;54503:25:::1;54543:29;54575:17:::0;;;:12:::1;:17;::::0;;;;54607:36;;-1:-1:-1;;54607:36:0::1;;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;54658:24:0;;::::1;:42:::0;;;;54715:21:::1;::::0;::::1;:36:::0;;;;54766:27:::1;::::0;::::1;:48:::0;;54830:29:::1;::::0;;::::1;:52:::0;;;;54897:25:::1;::::0;;::::1;:44:::0;;;;54766:48;;;::::1;-1:-1:-1::0;;54956:34:0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;3239:19;;;;;;;-1:-1:-1;54229:829:0:o;56077:130::-;10652:6;;-1:-1:-1;;;;;10652:6:0;7065:10;10799:23;10791:68;;;;-1:-1:-1;;;10791:68:0;;18336:2:1;10791:68:0;;;18318:21:1;;;18355:18;;;18348:30;-1:-1:-1;;;;;;;;;;;18394:18:1;;;18387:62;18466:18;;10791:68:0;18134:356:1;10791:68:0;56156:17:::1;::::0;;::::1;;::::0;;;:12:::1;:17;::::0;;;;:33:::1;;:42:::0;56077:130::o;36893:310::-;36995:4;-1:-1:-1;;;;;;37032:41:0;;-1:-1:-1;;;37032:41:0;;:110;;-1:-1:-1;;;;;;;37090:52:0;;-1:-1:-1;;;37090:52:0;37032:110;:163;;;-1:-1:-1;;;;;;;;;;28295:40:0;;;37159:36;28186:157;397:723;453:13;674:10;670:53;;-1:-1:-1;;701:10:0;;;;;;;;;;;;-1:-1:-1;;;701:10:0;;;;;397:723::o;670:53::-;748:5;733:12;789:78;796:9;;789:78;;822:8;;;;:::i;:::-;;-1:-1:-1;845:10:0;;-1:-1:-1;853:2:0;845:10;;:::i;:::-;;;789:78;;;877:19;909:6;899:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;899:17:0;;877:39;;927:154;934:10;;927:154;;961:11;971:1;961:11;;:::i;:::-;;-1:-1:-1;1030:10:0;1038:2;1030:5;:10;:::i;:::-;1017:24;;:2;:24;:::i;:::-;1004:39;;987:6;994;987:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1058:11:0;1067:2;1058:11;;:::i;:::-;;;927:154;;;1105:6;397:723;-1:-1:-1;;;;397:723:0:o;42047:1146::-;42274:7;:14;42260:3;:10;:28;42252:81;;;;-1:-1:-1;;;42252:81:0;;24943:2:1;42252:81:0;;;24925:21:1;24982:2;24962:18;;;24955:30;25021:34;25001:18;;;24994:62;25092:10;25072:18;;;25065:38;25120:19;;42252:81:0;24741:404:1;42252:81:0;-1:-1:-1;;;;;42352:16:0;;42344:66;;;;-1:-1:-1;;;42344:66:0;;25352:2:1;42344:66:0;;;25334:21:1;25391:2;25371:18;;;25364:30;25430:34;25410:18;;;25403:62;-1:-1:-1;;;25481:18:1;;;25474:35;25526:19;;42344:66:0;25150:401:1;42344:66:0;7065:10;42423:16;42540:421;42564:3;:10;42560:1;:14;42540:421;;;42596:10;42609:3;42613:1;42609:6;;;;;;;;:::i;:::-;;;;;;;42596:19;;42630:14;42647:7;42655:1;42647:10;;;;;;;;:::i;:::-;;;;;;;;;;;;42674:19;42696:13;;;;;;;;;;-1:-1:-1;;;;;42696:19:0;;;;;;;;;;;;42647:10;;-1:-1:-1;42738:21:0;;;;42730:76;;;;-1:-1:-1;;;42730:76:0;;25758:2:1;42730:76:0;;;25740:21:1;25797:2;25777:18;;;25770:30;25836:34;25816:18;;;25809:62;-1:-1:-1;;;25887:18:1;;;25880:40;25937:19;;42730:76:0;25556:406:1;42730:76:0;42850:9;:13;;;;;;;;;;;-1:-1:-1;;;;;42850:19:0;;;;;;;;;;42872:20;;;42850:42;;42922:17;;;;;;;:27;;42872:20;;42850:9;42922:27;;42872:20;;42922:27;:::i;:::-;;;;;;;;42581:380;;;42576:3;;;;:::i;:::-;;;42540:421;;;;43008:2;-1:-1:-1;;;;;42978:47:0;43002:4;-1:-1:-1;;;;;42978:47:0;42992:8;-1:-1:-1;;;;;42978:47:0;;43012:3;43017:7;42978:47;;;;;;;:::i;:::-;;;;;;;;43110:75;43146:8;43156:4;43162:2;43166:3;43171:7;43180:4;43110:35;:75::i;9390:120::-;8402:7;;-1:-1:-1;;;8402:7:0;;;;8926:41;;;;-1:-1:-1;;;8926:41:0;;26639:2:1;8926:41:0;;;26621:21:1;26678:2;26658:18;;;26651:30;26717:22;26697:18;;;26690:50;26757:18;;8926:41:0;26437:344:1;8926:41:0;9449:7:::1;:15:::0;;-1:-1:-1;;;;9449:15:0::1;::::0;;9480:22:::1;7065:10:::0;9489:12:::1;9480:22;::::0;-1:-1:-1;;;;;10868:55:1;;;10850:74;;10838:2;10823:18;9480:22:0::1;;;;;;;9390:120::o:0;44511:729::-;-1:-1:-1;;;;;44664:16:0;;44656:62;;;;-1:-1:-1;;;44656:62:0;;26988:2:1;44656:62:0;;;26970:21:1;27027:2;27007:18;;;27000:30;27066:34;27046:18;;;27039:62;-1:-1:-1;;;27117:18:1;;;27110:31;27158:19;;44656:62:0;26786:397:1;44656:62:0;7065:10;44731:16;44796:21;44814:2;44796:17;:21::i;:::-;44773:44;;44828:24;44855:25;44873:6;44855:17;:25::i;:::-;44828:52;;44972:9;:13;;;;;;;;;;;-1:-1:-1;;;;;44972:17:0;;;;;;;;;:27;;44993:6;;44972:9;:27;;44993:6;;44972:27;:::i;:::-;;;;-1:-1:-1;;45015:52:0;;;27362:25:1;;;27418:2;27403:18;;27396:34;;;-1:-1:-1;;;;;45015:52:0;;;;45048:1;;45015:52;;;;;;27335:18:1;45015:52:0;;;;;;;45158:74;45189:8;45207:1;45211:2;45215;45219:6;45227:4;45158:30;:74::i;:::-;44645:595;;;44511:729;;;;:::o;25373:126::-;25455:36;;-1:-1:-1;;;25455:36:0;;-1:-1:-1;;;;;10868:55:1;;;25455:36:0;;;10850:74:1;25455:7:0;:15;;;;25478:6;;10823:18:1;;25455:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11849:191;11942:6;;;-1:-1:-1;;;;;11959:17:0;;;-1:-1:-1;;11959:17:0;;;;;;;11992:40;;11942:6;;;11959:17;11942:6;;11992:40;;11923:16;;11992:40;11912:128;11849:191;:::o;9131:118::-;8402:7;;-1:-1:-1;;;8402:7:0;;;;8656:9;8648:38;;;;-1:-1:-1;;;8648:38:0;;21300:2:1;8648:38:0;;;21282:21:1;21339:2;21319:18;;;21312:30;-1:-1:-1;;;21358:18:1;;;21351:46;21414:18;;8648:38:0;21098:340:1;8648:38:0;9191:7:::1;:14:::0;;-1:-1:-1;;;;9191:14:0::1;-1:-1:-1::0;;;9191:14:0::1;::::0;;9221:20:::1;9228:12;7065:10:::0;;6985:98;48781:331;48936:8;-1:-1:-1;;;;;48927:17:0;:5;-1:-1:-1;;;;;48927:17:0;;;48919:71;;;;-1:-1:-1;;;48919:71:0;;27643:2:1;48919:71:0;;;27625:21:1;27682:2;27662:18;;;27655:30;27721:34;27701:18;;;27694:62;27792:11;27772:18;;;27765:39;27821:19;;48919:71:0;27441:405:1;48919:71:0;-1:-1:-1;;;;;49001:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;49001:46:0;;;;;;;;;;49063:41;;1201::1;;;49063::0;;1174:18:1;49063:41:0;;;;;;;48781:331;;;:::o;4841:190::-;4966:4;5019;4990:25;5003:5;5010:4;4990:12;:25::i;:::-;:33;;4841:190;-1:-1:-1;;;;4841:190:0:o;40715:974::-;-1:-1:-1;;;;;40903:16:0;;40895:66;;;;-1:-1:-1;;;40895:66:0;;25352:2:1;40895:66:0;;;25334:21:1;25391:2;25371:18;;;25364:30;25430:34;25410:18;;;25403:62;-1:-1:-1;;;25481:18:1;;;25474:35;25526:19;;40895:66:0;25150:401:1;40895:66:0;7065:10;40974:16;41039:21;41057:2;41039:17;:21::i;:::-;41016:44;;41071:24;41098:25;41116:6;41098:17;:25::i;:::-;41071:52;;41209:19;41231:13;;;;;;;;;;;-1:-1:-1;;;;;41231:19:0;;;;;;;;;;41269:21;;;;41261:76;;;;-1:-1:-1;;;41261:76:0;;25758:2:1;41261:76:0;;;25740:21:1;25797:2;25777:18;;;25770:30;25836:34;25816:18;;;25809:62;-1:-1:-1;;;25887:18:1;;;25880:40;25937:19;;41261:76:0;25556:406:1;41261:76:0;41373:9;:13;;;;;;;;;;;-1:-1:-1;;;;;41373:19:0;;;;;;;;;;41395:20;;;41373:42;;41437:17;;;;;;;:27;;41395:20;;41373:9;41437:27;;41395:20;;41437:27;:::i;:::-;;;;-1:-1:-1;;41482:46:0;;;27362:25:1;;;27418:2;27403:18;;27396:34;;;-1:-1:-1;;;;;41482:46:0;;;;;;;;;;;;;;27335:18:1;41482:46:0;;;;;;;41613:68;41644:8;41654:4;41660:2;41664;41668:6;41676:4;41613:30;:68::i;:::-;40884:805;;;;40715:974;;;;;:::o;52224:813::-;-1:-1:-1;;;;;52464:13:0;;13575:19;:23;52460:570;;52500:79;;-1:-1:-1;;;52500:79:0;;-1:-1:-1;;;;;52500:43:0;;;;;:79;;52544:8;;52554:4;;52560:3;;52565:7;;52574:4;;52500:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52500:79:0;;;;;;;;-1:-1:-1;;52500:79:0;;;;;;;;;;;;:::i;:::-;;;52496:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;52892:6;52885:14;;-1:-1:-1;;;52885:14:0;;;;;;;;:::i;52496:523::-;;;52941:62;;-1:-1:-1;;;52941:62:0;;30033:2:1;52941:62:0;;;30015:21:1;30072:2;30052:18;;;30045:30;30111:34;30091:18;;;30084:62;30182:22;30162:18;;;30155:50;30222:19;;52941:62:0;29831:416:1;52496:523:0;-1:-1:-1;;;;;;52661:60:0;;-1:-1:-1;;;52661:60:0;52657:159;;52746:50;;-1:-1:-1;;;52746:50:0;;30454:2:1;52746:50:0;;;30436:21:1;30493:2;30473:18;;;30466:30;30532:34;30512:18;;;30505:62;-1:-1:-1;;;30583:18:1;;;30576:38;30631:19;;52746:50:0;30252:404:1;53045:198:0;53165:16;;;53179:1;53165:16;;;;;;;;;53111;;53140:22;;53165:16;;;;;;;;;;;;-1:-1:-1;53165:16:0;53140:41;;53203:7;53192:5;53198:1;53192:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;53230:5;53045:198;-1:-1:-1;;53045:198:0:o;51472:744::-;-1:-1:-1;;;;;51687:13:0;;13575:19;:23;51683:526;;51723:72;;-1:-1:-1;;;51723:72:0;;-1:-1:-1;;;;;51723:38:0;;;;;:72;;51762:8;;51772:4;;51778:2;;51782:6;;51790:4;;51723:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51723:72:0;;;;;;;;-1:-1:-1;;51723:72:0;;;;;;;;;;;;:::i;:::-;;;51719:479;;;;:::i;:::-;-1:-1:-1;;;;;;51845:55:0;;-1:-1:-1;;;51845:55:0;51841:154;;51925:50;;-1:-1:-1;;;51925:50:0;;30454:2:1;51925:50:0;;;30436:21:1;30493:2;30473:18;;;30466:30;30532:34;30512:18;;;30505:62;-1:-1:-1;;;30583:18:1;;;30576:38;30631:19;;51925:50:0;30252:404:1;5392:675:0;5475:7;5518:4;5475:7;5533:497;5557:5;:12;5553:1;:16;5533:497;;;5591:20;5614:5;5620:1;5614:8;;;;;;;;:::i;:::-;;;;;;;5591:31;;5657:12;5641;:28;5637:382;;6143:13;6193:15;;;6229:4;6222:15;;;6276:4;6260:21;;5769:57;;5637:382;;;6143:13;6193:15;;;6229:4;6222:15;;;6276:4;6260:21;;5946:57;;5637:382;-1:-1:-1;5571:3:0;;;;:::i;:::-;;;;5533:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:154:1;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:1:o;675:131::-;-1:-1:-1;;;;;;749:32:1;;739:43;;729:71;;796:1;793;786:12;811:245;869:6;922:2;910:9;901:7;897:23;893:32;890:52;;;938:1;935;928:12;890:52;977:9;964:23;996:30;1020:5;996:30;:::i;:::-;1045:5;811:245;-1:-1:-1;;;811:245:1:o;1253:180::-;1312:6;1365:2;1353:9;1344:7;1340:23;1336:32;1333:52;;;1381:1;1378;1371:12;1333:52;-1:-1:-1;1404:23:1;;1253:180;-1:-1:-1;1253:180:1:o;1438:258::-;1510:1;1520:113;1534:6;1531:1;1528:13;1520:113;;;1610:11;;;1604:18;1591:11;;;1584:39;1556:2;1549:10;1520:113;;;1651:6;1648:1;1645:13;1642:48;;;1686:1;1677:6;1672:3;1668:16;1661:27;1642:48;;1438:258;;;:::o;1701:269::-;1754:3;1792:5;1786:12;1819:6;1814:3;1807:19;1835:63;1891:6;1884:4;1879:3;1875:14;1868:4;1861:5;1857:16;1835:63;:::i;:::-;1952:2;1931:15;-1:-1:-1;;1927:29:1;1918:39;;;;1959:4;1914:50;;1701:269;-1:-1:-1;;1701:269:1:o;1975:231::-;2124:2;2113:9;2106:21;2087:4;2144:56;2196:2;2185:9;2181:18;2173:6;2144:56;:::i;2211:159::-;2278:20;;2338:6;2327:18;;2317:29;;2307:57;;2360:1;2357;2350:12;2307:57;2211:159;;;:::o;2375:252::-;2442:6;2450;2503:2;2491:9;2482:7;2478:23;2474:32;2471:52;;;2519:1;2516;2509:12;2471:52;2542:28;2560:9;2542:28;:::i;2632:319::-;2699:6;2707;2760:2;2748:9;2739:7;2735:23;2731:32;2728:52;;;2776:1;2773;2766:12;2728:52;2799:28;2817:9;2799:28;:::i;:::-;2789:38;;2877:2;2866:9;2862:18;2849:32;2890:31;2915:5;2890:31;:::i;:::-;2940:5;2930:15;;;2632:319;;;;;:::o;3149:248::-;3217:6;3225;3278:2;3266:9;3257:7;3253:23;3249:32;3246:52;;;3294:1;3291;3284:12;3246:52;-1:-1:-1;;3317:23:1;;;3387:2;3372:18;;;3359:32;;-1:-1:-1;3149:248:1:o;3704:127::-;3765:10;3760:3;3756:20;3753:1;3746:31;3796:4;3793:1;3786:15;3820:4;3817:1;3810:15;3836:249;3946:2;3927:13;;-1:-1:-1;;3923:27:1;3911:40;;3981:18;3966:34;;4002:22;;;3963:62;3960:88;;;4028:18;;:::i;:::-;4064:2;4057:22;-1:-1:-1;;3836:249:1:o;4090:183::-;4150:4;4183:18;4175:6;4172:30;4169:56;;;4205:18;;:::i;:::-;-1:-1:-1;4250:1:1;4246:14;4262:4;4242:25;;4090:183::o;4278:724::-;4332:5;4385:3;4378:4;4370:6;4366:17;4362:27;4352:55;;4403:1;4400;4393:12;4352:55;4439:6;4426:20;4465:4;4488:43;4528:2;4488:43;:::i;:::-;4560:2;4554:9;4572:31;4600:2;4592:6;4572:31;:::i;:::-;4638:18;;;4730:1;4726:10;;;;4714:23;;4710:32;;;4672:15;;;;-1:-1:-1;4754:15:1;;;4751:35;;;4782:1;4779;4772:12;4751:35;4818:2;4810:6;4806:15;4830:142;4846:6;4841:3;4838:15;4830:142;;;4912:17;;4900:30;;4950:12;;;;4863;;4830:142;;;-1:-1:-1;4990:6:1;4278:724;-1:-1:-1;;;;;;4278:724:1:o;5007:555::-;5049:5;5102:3;5095:4;5087:6;5083:17;5079:27;5069:55;;5120:1;5117;5110:12;5069:55;5156:6;5143:20;5182:18;5178:2;5175:26;5172:52;;;5204:18;;:::i;:::-;5253:2;5247:9;5265:67;5320:2;5301:13;;-1:-1:-1;;5297:27:1;5326:4;5293:38;5247:9;5265:67;:::i;:::-;5356:2;5348:6;5341:18;5402:3;5395:4;5390:2;5382:6;5378:15;5374:26;5371:35;5368:55;;;5419:1;5416;5409:12;5368:55;5483:2;5476:4;5468:6;5464:17;5457:4;5449:6;5445:17;5432:54;5530:1;5506:15;;;5523:4;5502:26;5495:37;;;;5510:6;5007:555;-1:-1:-1;;;5007:555:1:o;5567:1071::-;5721:6;5729;5737;5745;5753;5806:3;5794:9;5785:7;5781:23;5777:33;5774:53;;;5823:1;5820;5813:12;5774:53;5862:9;5849:23;5881:31;5906:5;5881:31;:::i;:::-;5931:5;-1:-1:-1;5988:2:1;5973:18;;5960:32;6001:33;5960:32;6001:33;:::i;:::-;6053:7;-1:-1:-1;6111:2:1;6096:18;;6083:32;6134:18;6164:14;;;6161:34;;;6191:1;6188;6181:12;6161:34;6214:61;6267:7;6258:6;6247:9;6243:22;6214:61;:::i;:::-;6204:71;;6328:2;6317:9;6313:18;6300:32;6284:48;;6357:2;6347:8;6344:16;6341:36;;;6373:1;6370;6363:12;6341:36;6396:63;6451:7;6440:8;6429:9;6425:24;6396:63;:::i;:::-;6386:73;;6512:3;6501:9;6497:19;6484:33;6468:49;;6542:2;6532:8;6529:16;6526:36;;;6558:1;6555;6548:12;6526:36;;6581:51;6624:7;6613:8;6602:9;6598:24;6581:51;:::i;:::-;6571:61;;;5567:1071;;;;;;;;:::o;6643:255::-;6710:6;6763:2;6751:9;6742:7;6738:23;6734:32;6731:52;;;6779:1;6776;6769:12;6731:52;6818:9;6805:23;6837:31;6862:5;6837:31;:::i;7160:1277::-;7278:6;7286;7339:2;7327:9;7318:7;7314:23;7310:32;7307:52;;;7355:1;7352;7345:12;7307:52;7395:9;7382:23;7424:18;7465:2;7457:6;7454:14;7451:34;;;7481:1;7478;7471:12;7451:34;7519:6;7508:9;7504:22;7494:32;;7564:7;7557:4;7553:2;7549:13;7545:27;7535:55;;7586:1;7583;7576:12;7535:55;7622:2;7609:16;7644:4;7667:43;7707:2;7667:43;:::i;:::-;7739:2;7733:9;7751:31;7779:2;7771:6;7751:31;:::i;:::-;7817:18;;;7905:1;7901:10;;;;7893:19;;7889:28;;;7851:15;;;;-1:-1:-1;7929:19:1;;;7926:39;;;7961:1;7958;7951:12;7926:39;7985:11;;;;8005:217;8021:6;8016:3;8013:15;8005:217;;;8101:3;8088:17;8118:31;8143:5;8118:31;:::i;:::-;8162:18;;8038:12;;;;8200;;;;8005:217;;;8241:6;-1:-1:-1;;8285:18:1;;8272:32;;-1:-1:-1;;8316:16:1;;;8313:36;;;8345:1;8342;8335:12;8313:36;;8368:63;8423:7;8412:8;8401:9;8397:24;8368:63;:::i;:::-;8358:73;;;7160:1277;;;;;:::o;8442:435::-;8495:3;8533:5;8527:12;8560:6;8555:3;8548:19;8586:4;8615:2;8610:3;8606:12;8599:19;;8652:2;8645:5;8641:14;8673:1;8683:169;8697:6;8694:1;8691:13;8683:169;;;8758:13;;8746:26;;8792:12;;;;8827:15;;;;8719:1;8712:9;8683:169;;;-1:-1:-1;8868:3:1;;8442:435;-1:-1:-1;;;;;8442:435:1:o;8882:261::-;9061:2;9050:9;9043:21;9024:4;9081:56;9133:2;9122:9;9118:18;9110:6;9081:56;:::i;9148:367::-;9211:8;9221:6;9275:3;9268:4;9260:6;9256:17;9252:27;9242:55;;9293:1;9290;9283:12;9242:55;-1:-1:-1;9316:20:1;;9359:18;9348:30;;9345:50;;;9391:1;9388;9381:12;9345:50;9428:4;9420:6;9416:17;9404:29;;9488:3;9481:4;9471:6;9468:1;9464:14;9456:6;9452:27;9448:38;9445:47;9442:67;;;9505:1;9502;9495:12;9520:918;9658:6;9666;9674;9682;9690;9698;9751:3;9739:9;9730:7;9726:23;9722:33;9719:53;;;9768:1;9765;9758:12;9719:53;9791:28;9809:9;9791:28;:::i;:::-;9781:38;;9838:37;9871:2;9860:9;9856:18;9838:37;:::i;:::-;9828:47;;9926:2;9915:9;9911:18;9898:32;9949:18;9990:2;9982:6;9979:14;9976:34;;;10006:1;10003;9996:12;9976:34;10045:70;10107:7;10098:6;10087:9;10083:22;10045:70;:::i;:::-;10134:8;;-1:-1:-1;10019:96:1;-1:-1:-1;10222:2:1;10207:18;;10194:32;;-1:-1:-1;10238:16:1;;;10235:36;;;10267:1;10264;10257:12;10235:36;;10306:72;10370:7;10359:8;10348:9;10344:24;10306:72;:::i;:::-;9520:918;;;;-1:-1:-1;9520:918:1;;-1:-1:-1;9520:918:1;;10397:8;;9520:918;-1:-1:-1;;;9520:918:1:o;10443:256::-;10509:6;10517;10570:2;10558:9;10549:7;10545:23;10541:32;10538:52;;;10586:1;10583;10576:12;10538:52;10609:28;10627:9;10609:28;:::i;:::-;10599:38;;10656:37;10689:2;10678:9;10674:18;10656:37;:::i;:::-;10646:47;;10443:256;;;;;:::o;10935:592::-;11006:6;11014;11067:2;11055:9;11046:7;11042:23;11038:32;11035:52;;;11083:1;11080;11073:12;11035:52;11123:9;11110:23;11152:18;11193:2;11185:6;11182:14;11179:34;;;11209:1;11206;11199:12;11179:34;11247:6;11236:9;11232:22;11222:32;;11292:7;11285:4;11281:2;11277:13;11273:27;11263:55;;11314:1;11311;11304:12;11263:55;11354:2;11341:16;11380:2;11372:6;11369:14;11366:34;;;11396:1;11393;11386:12;11366:34;11441:7;11436:2;11427:6;11423:2;11419:15;11415:24;11412:37;11409:57;;;11462:1;11459;11452:12;11409:57;11493:2;11485:11;;;;;11515:6;;-1:-1:-1;10935:592:1;;-1:-1:-1;;;;10935:592:1:o;11532:416::-;11597:6;11605;11658:2;11646:9;11637:7;11633:23;11629:32;11626:52;;;11674:1;11671;11664:12;11626:52;11713:9;11700:23;11732:31;11757:5;11732:31;:::i;:::-;11782:5;-1:-1:-1;11839:2:1;11824:18;;11811:32;11881:15;;11874:23;11862:36;;11852:64;;11912:1;11909;11902:12;11953:644;12056:6;12064;12072;12080;12133:2;12121:9;12112:7;12108:23;12104:32;12101:52;;;12149:1;12146;12139:12;12101:52;12188:9;12175:23;12207:31;12232:5;12207:31;:::i;:::-;12257:5;-1:-1:-1;12281:37:1;12314:2;12299:18;;12281:37;:::i;:::-;12271:47;;12369:2;12358:9;12354:18;12341:32;12396:18;12388:6;12385:30;12382:50;;;12428:1;12425;12418:12;12382:50;12467:70;12529:7;12520:6;12509:9;12505:22;12467:70;:::i;:::-;11953:644;;;;-1:-1:-1;12556:8:1;-1:-1:-1;;;;11953:644:1:o;12854:388::-;12922:6;12930;12983:2;12971:9;12962:7;12958:23;12954:32;12951:52;;;12999:1;12996;12989:12;12951:52;13038:9;13025:23;13057:31;13082:5;13057:31;:::i;13247:734::-;13351:6;13359;13367;13375;13383;13436:3;13424:9;13415:7;13411:23;13407:33;13404:53;;;13453:1;13450;13443:12;13404:53;13492:9;13479:23;13511:31;13536:5;13511:31;:::i;:::-;13561:5;-1:-1:-1;13618:2:1;13603:18;;13590:32;13631:33;13590:32;13631:33;:::i;:::-;13683:7;-1:-1:-1;13737:2:1;13722:18;;13709:32;;-1:-1:-1;13788:2:1;13773:18;;13760:32;;-1:-1:-1;13843:3:1;13828:19;;13815:33;13871:18;13860:30;;13857:50;;;13903:1;13900;13893:12;13857:50;13926:49;13967:7;13958:6;13947:9;13943:22;13926:49;:::i;13986:531::-;14088:6;14096;14104;14112;14120;14128;14181:3;14169:9;14160:7;14156:23;14152:33;14149:53;;;14198:1;14195;14188:12;14149:53;14221:28;14239:9;14221:28;:::i;:::-;14211:38;;14296:2;14285:9;14281:18;14268:32;14258:42;;14347:2;14336:9;14332:18;14319:32;14309:42;;14370:37;14403:2;14392:9;14388:18;14370:37;:::i;:::-;14360:47;;14454:3;14443:9;14439:19;14426:33;14416:43;;14506:3;14495:9;14491:19;14478:33;14468:43;;13986:531;;;;;;;;:::o;16009:380::-;16088:1;16084:12;;;;16131;;;16152:61;;16206:4;16198:6;16194:17;16184:27;;16152:61;16259:2;16251:6;16248:14;16228:18;16225:38;16222:161;;;16305:10;16300:3;16296:20;16293:1;16286:31;16340:4;16337:1;16330:15;16368:4;16365:1;16358:15;16222:161;;16009:380;;;:::o;16520:185::-;16562:3;16600:5;16594:12;16615:52;16660:6;16655:3;16648:4;16641:5;16637:16;16615:52;:::i;:::-;16683:16;;;;;16520:185;-1:-1:-1;;16520:185:1:o;16828:1301::-;17105:3;17134:1;17167:6;17161:13;17197:3;17219:1;17247:9;17243:2;17239:18;17229:28;;17307:2;17296:9;17292:18;17329;17319:61;;17373:4;17365:6;17361:17;17351:27;;17319:61;17399:2;17447;17439:6;17436:14;17416:18;17413:38;17410:165;;;-1:-1:-1;;;17474:33:1;;17530:4;17527:1;17520:15;17560:4;17481:3;17548:17;17410:165;17591:18;17618:104;;;;17736:1;17731:320;;;;17584:467;;17618:104;-1:-1:-1;;17651:24:1;;17639:37;;17696:16;;;;-1:-1:-1;17618:104:1;;17731:320;16467:1;16460:14;;;16504:4;16491:18;;17826:1;17840:165;17854:6;17851:1;17848:13;17840:165;;;17932:14;;17919:11;;;17912:35;17975:16;;;;17869:10;;17840:165;;;17844:3;;18034:6;18029:3;18025:16;18018:23;;17584:467;;;;;;;18067:56;18092:30;18118:3;18110:6;18092:30;:::i;:::-;16782:7;16770:20;;16815:1;16806:11;;16710:113;18067:56;18060:63;16828:1301;-1:-1:-1;;;;;16828:1301:1:o;18841:127::-;18902:10;18897:3;18893:20;18890:1;18883:31;18933:4;18930:1;18923:15;18957:4;18954:1;18947:15;18973:168;19013:7;19079:1;19075;19071:6;19067:14;19064:1;19061:21;19056:1;19049:9;19042:17;19038:45;19035:71;;;19086:18;;:::i;:::-;-1:-1:-1;19126:9:1;;18973:168::o;19146:127::-;19207:10;19202:3;19198:20;19195:1;19188:31;19238:4;19235:1;19228:15;19262:4;19259:1;19252:15;19278:120;19318:1;19344;19334:35;;19349:18;;:::i;:::-;-1:-1:-1;19383:9:1;;19278:120::o;20826:127::-;20887:10;20882:3;20878:20;20875:1;20868:31;20918:4;20915:1;20908:15;20942:4;20939:1;20932:15;20958:135;20997:3;-1:-1:-1;;21018:17:1;;21015:43;;;21038:18;;:::i;:::-;-1:-1:-1;21085:1:1;21074:13;;20958:135::o;22136:181::-;22174:3;22218:6;22211:5;22207:18;22244:7;22234:41;;22255:18;;:::i;:::-;-1:-1:-1;;22291:20:1;;22136:181;-1:-1:-1;;22136:181:1:o;22322:217::-;22361:4;22390:6;22446:10;;;;22416;;22468:12;;;22465:38;;;22483:18;;:::i;:::-;22520:13;;22322:217;-1:-1:-1;;;22322:217:1:o;22544:224::-;22583:3;22611:6;22644:2;22641:1;22637:10;22674:2;22671:1;22667:10;22705:3;22701:2;22697:12;22692:3;22689:21;22686:47;;;22713:18;;:::i;:::-;22749:13;;22544:224;-1:-1:-1;;;;22544:224:1:o;22773:128::-;22813:3;22844:1;22840:6;22837:1;22834:13;22831:39;;;22850:18;;:::i;:::-;-1:-1:-1;22886:9:1;;22773:128::o;23488:184::-;23558:6;23611:2;23599:9;23590:7;23586:23;23582:32;23579:52;;;23627:1;23624;23617:12;23579:52;-1:-1:-1;23650:16:1;;23488:184;-1:-1:-1;23488:184:1:o;24494:125::-;24534:4;24562:1;24559;24556:8;24553:34;;;24567:18;;:::i;:::-;-1:-1:-1;24604:9:1;;24494:125::o;24624:112::-;24656:1;24682;24672:35;;24687:18;;:::i;:::-;-1:-1:-1;24721:9:1;;24624:112::o;25967:465::-;26224:2;26213:9;26206:21;26187:4;26250:56;26302:2;26291:9;26287:18;26279:6;26250:56;:::i;:::-;26354:9;26346:6;26342:22;26337:2;26326:9;26322:18;26315:50;26382:44;26419:6;26411;26382:44;:::i;27851:861::-;28173:4;-1:-1:-1;;;;;28283:2:1;28275:6;28271:15;28260:9;28253:34;28335:2;28327:6;28323:15;28318:2;28307:9;28303:18;28296:43;;28375:3;28370:2;28359:9;28355:18;28348:31;28402:57;28454:3;28443:9;28439:19;28431:6;28402:57;:::i;:::-;28507:9;28499:6;28495:22;28490:2;28479:9;28475:18;28468:50;28541:44;28578:6;28570;28541:44;:::i;:::-;28527:58;;28634:9;28626:6;28622:22;28616:3;28605:9;28601:19;28594:51;28662:44;28699:6;28691;28662:44;:::i;:::-;28654:52;27851:861;-1:-1:-1;;;;;;;;27851:861:1:o;28717:249::-;28786:6;28839:2;28827:9;28818:7;28814:23;28810:32;28807:52;;;28855:1;28852;28845:12;28807:52;28887:9;28881:16;28906:30;28930:5;28906:30;:::i;28971:179::-;29006:3;29048:1;29030:16;29027:23;29024:120;;;29094:1;29091;29088;29073:23;-1:-1:-1;29131:1:1;29125:8;29120:3;29116:18;29024:120;28971:179;:::o;29155:671::-;29194:3;29236:4;29218:16;29215:26;29212:39;;;29155:671;:::o;29212:39::-;29278:2;29272:9;-1:-1:-1;;29343:16:1;29339:25;;29336:1;29272:9;29315:50;29394:4;29388:11;29418:16;29453:18;29524:2;29517:4;29509:6;29505:17;29502:25;29497:2;29489:6;29486:14;29483:45;29480:58;;;29531:5;;;;;29155:671;:::o;29480:58::-;29568:6;29562:4;29558:17;29547:28;;29604:3;29598:10;29631:2;29623:6;29620:14;29617:27;;;29637:5;;;;;;29155:671;:::o;29617:27::-;29721:2;29702:16;29696:4;29692:27;29688:36;29681:4;29672:6;29667:3;29663:16;29659:27;29656:69;29653:82;;;29728:5;;;;;;29155:671;:::o;29653:82::-;29744:57;29795:4;29786:6;29778;29774:19;29770:30;29764:4;29744:57;:::i;:::-;-1:-1:-1;29817:3:1;;29155:671;-1:-1:-1;;;;;29155:671:1:o;30661:595::-;30883:4;-1:-1:-1;;;;;30993:2:1;30985:6;30981:15;30970:9;30963:34;31045:2;31037:6;31033:15;31028:2;31017:9;31013:18;31006:43;;31085:6;31080:2;31069:9;31065:18;31058:34;31128:6;31123:2;31112:9;31108:18;31101:34;31172:3;31166;31155:9;31151:19;31144:32;31193:57;31245:3;31234:9;31230:19;31222:6;31193:57;:::i;:::-;31185:65;30661:595;-1:-1:-1;;;;;;;30661:595:1:o

Swarm Source

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