ETH Price: $2,507.22 (+1.56%)

Token

Kickz Pass Genesis (KPG)
 

Overview

Max Total Supply

250 KPG

Holders

198

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x9e635293c11f5f30a5c581d334449c024099ae35
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:
KickzPassGenesis

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-28
*/

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

/**  

  _  ___      _           ____               
 | |/ (_) ___| | __ ____ |  _ \ __ _ ___ ___ 
 | ' /| |/ __| |/ /|_  / | |_) / _` / __/ __|
 | . \| | (__|   <  / /  |  __/ (_| \__ \__ \
 |_|\_\_|\___|_|\_\/___| |_|   \__,_|___/___/
                                             

**/

/// @author NFTprest (https://twitter.com/NFTprest)


// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: address zero is not a valid owner");
        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/KickzPassGenesis.sol

pragma solidity ^0.8.13;

contract KickzPassGenesis is ERC1155, Ownable, ReentrancyGuard {
    
  string public constant name = "Kickz Pass Genesis";
  string public constant symbol = "KPG";

  uint private constant MAX_SUPPLY = 250;
  uint private constant PASS_ID = 1;

  uint public passCount = 0;
  
  bool public isMintOpen = false;

  //TODO: Update for production 
  bytes32 public merkleRoot = 0xab1c094c9ebd4c5e3b64166d167b0387321c5a976d4812b7c6e3ba6a3e07c962;

  mapping(address => uint) public mintCount;

  constructor() ERC1155("ipfs://QmSvvYeC9rg9eb8iLV2gSuJX5T6YpYAyGnjrS8A4xmufJE/metadata.json") {}


  function whiteListMint(bytes32[] calldata merkleProof) external nonReentrant{
    require(passCount < MAX_SUPPLY, "Sold out");
    require(mintCount[msg.sender] < 1, "At mint limit");
    require(MerkleProof.verify(merkleProof, merkleRoot,keccak256(abi.encodePacked(msg.sender))), "Proof invalid");
    require(isMintOpen, "Mint not open");

    mintCount[msg.sender]++;
    passCount++;
    _mint(msg.sender, PASS_ID, 1, "");
  }
  
  function setMintOpen() external onlyOwner{
    isMintOpen = !isMintOpen;
  }

  function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{
    merkleRoot = _merkleRoot;
  }

  function ownerMint(address to, uint amount) external onlyOwner {
    require(passCount + amount <= MAX_SUPPLY, "Sold out");
    passCount += amount;
    _mint(to, PASS_ID, amount, "");
  }

  function setURI(string memory uri) external onlyOwner {
    _setURI(uri);
  }

  function totalSupply() external view returns (uint256) {
    return passCount;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":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"},{"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":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"passCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260006005556006805460ff191690557fab1c094c9ebd4c5e3b64166d167b0387321c5a976d4812b7c6e3ba6a3e07c9626007553480156200004457600080fd5b5060405180608001604052806043815260200162002546604391396200006a8162000081565b5062000076336200009a565b6001600455620001ce565b805162000096906002906020840190620000ec565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fa9062000192565b90600052602060002090601f0160209004810192826200011e576000855562000169565b82601f106200013957805160ff191683800117855562000169565b8280016001018555821562000169579182015b82811115620001695782518255916020019190600101906200014c565b50620001779291506200017b565b5090565b5b808211156200017757600081556001016200017c565b600181811c90821680620001a757607f821691505b602082108103620001c857634e487b7160e01b600052602260045260246000fd5b50919050565b61236880620001de6000396000f3fe608060405234801561001057600080fd5b506004361061018c5760003560e01c80634e1273f4116100e357806397254e551161008c578063ed9ec88811610066578063ed9ec88814610394578063f242432a146103b4578063f2fde38b146103c757600080fd5b806397254e5514610332578063a22cb46514610345578063e985e9c51461035857600080fd5b80638377dfd4116100bd5780638377dfd4146102d25780638da5cb5b146102db57806395d89b41146102f657600080fd5b80634e1273f414610297578063715018a6146102b75780637cb64759146102bf57600080fd5b806318160ddd116101455780632eb4a7ab1161011f5780632eb4a7ab146102735780632f85423a1461027c578063484b973c1461028457600080fd5b806318160ddd1461024b57806319908016146102535780632eb2c2d61461026057600080fd5b806302fe53051161017657806302fe5305146101da57806306fdde03146101ef5780630e89341c1461023857600080fd5b8062fdd58e1461019157806301ffc9a7146101b7575b600080fd5b6101a461019f366004611aa5565b6103da565b6040519081526020015b60405180910390f35b6101ca6101c5366004611afd565b610483565b60405190151581526020016101ae565b6101ed6101e8366004611bdb565b610568565b005b61022b6040518060400160405280601281526020017f4b69636b7a20506173732047656e65736973000000000000000000000000000081525081565b6040516101ae9190611c79565b61022b610246366004611c8c565b6105ce565b6005546101a4565b6006546101ca9060ff1681565b6101ed61026e366004611d5a565b610662565b6101a460075481565b6101ed610704565b6101ed610292366004611aa5565b610790565b6102aa6102a5366004611e04565b610881565b6040516101ae9190611f0a565b6101ed6109bf565b6101ed6102cd366004611c8c565b610a25565b6101a460055481565b6003546040516001600160a01b0390911681526020016101ae565b61022b6040518060400160405280600381526020017f4b5047000000000000000000000000000000000000000000000000000000000081525081565b6101ed610340366004611f1d565b610a84565b6101ed610353366004611f92565b610d0c565b6101ca610366366004611fce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a46103a2366004612001565b60086020526000908152604090205481565b6101ed6103c236600461201c565b610d17565b6101ed6103d5366004612001565b610db2565b60006001600160a01b03831661045d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061051657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061056257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6003546001600160a01b031633146105c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6105cb81610e91565b50565b6060600280546105dd90612081565b80601f016020809104026020016040519081016040528092919081815260200182805461060990612081565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b50505050509050919050565b6001600160a01b03851633148061067e575061067e8533610366565b6106f05760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610454565b6106fd8585858585610ea4565b5050505050565b6003546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6003546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b60fa816005546107fa9190612103565b11156108485760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b806005600082825461085a9190612103565b9250508190555061087d8260018360405180602001604052806000815250611142565b5050565b606081518351146108fa5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610454565b6000835167ffffffffffffffff81111561091657610916611b21565b60405190808252806020026020018201604052801561093f578160200160208202803683370190505b50905060005b84518110156109b75761098a8582815181106109635761096361211b565b602002602001015185838151811061097d5761097d61211b565b60200260200101516103da565b82828151811061099c5761099c61211b565b60209081029190910101526109b08161214a565b9050610945565b509392505050565b6003546001600160a01b03163314610a195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b610a236000611272565b565b6003546001600160a01b03163314610a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600755565b600260045403610ad65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b600260045560055460fa11610b2d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b33600090815260086020526040902054600111610b8c5760405162461bcd60e51b815260206004820152600d60248201527f4174206d696e74206c696d6974000000000000000000000000000000000000006044820152606401610454565b610c14828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201529092506034019050604051602081830303815290604052805190602001206112dc565b610c605760405162461bcd60e51b815260206004820152600d60248201527f50726f6f6620696e76616c6964000000000000000000000000000000000000006044820152606401610454565b60065460ff16610cb25760405162461bcd60e51b815260206004820152600d60248201527f4d696e74206e6f74206f70656e000000000000000000000000000000000000006044820152606401610454565b336000908152600860205260408120805491610ccd8361214a565b909155505060058054906000610ce28361214a565b9190505550610d033360018060405180602001604052806000815250611142565b50506001600455565b61087d3383836112f2565b6001600160a01b038516331480610d335750610d338533610366565b610da55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610454565b6106fd8585858585611404565b6003546001600160a01b03163314610e0c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6001600160a01b038116610e885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610454565b6105cb81611272565b805161087d9060029060208401906119f0565b8151835114610f1b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b038416610f975760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b3360005b84518110156110d4576000858281518110610fb857610fb861211b565b602002602001015190506000858381518110610fd657610fd661211b565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561107c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110b9908490612103565b92505081905550505050806110cd9061214a565b9050610f9b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611124929190612182565b60405180910390a461113a8187878787876115da565b505050505050565b6001600160a01b0384166111be5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610454565b3360006111ca856117de565b905060006111d7856117de565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611209908490612103565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461126983600089898989611829565b50505050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826112e98584611984565b14949350505050565b816001600160a01b0316836001600160a01b0316036113795760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166114805760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b33600061148c856117de565b90506000611499856117de565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156115325760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061156f908490612103565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cf848a8a8a8a8a611829565b505050505050505050565b6001600160a01b0384163b1561113a576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c819061163790899089908890889088906004016121b0565b6020604051808303816000875af1925050508015611672575060408051601f3d908101601f1916820190925261166f9181019061220e565b60015b6117275761167e61222b565b806308c379a0036116b75750611692612247565b8061169d57506116b9565b8060405162461bcd60e51b81526004016104549190611c79565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610454565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106118185761181861211b565b602090810291909101015292915050565b6001600160a01b0384163b1561113a576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e619061188690899089908890889088906004016122ef565b6020604051808303816000875af19250505080156118c1575060408051601f3d908101601f191682019092526118be9181019061220e565b60015b6118cd5761167e61222b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b600081815b84518110156109b75760008582815181106119a6576119a661211b565b602002602001015190508083116119cc57600083815260208290526040902092506119dd565b600081815260208490526040902092505b50806119e88161214a565b915050611989565b8280546119fc90612081565b90600052602060002090601f016020900481019282611a1e5760008555611a64565b82601f10611a3757805160ff1916838001178555611a64565b82800160010185558215611a64579182015b82811115611a64578251825591602001919060010190611a49565b50611a70929150611a74565b5090565b5b80821115611a705760008155600101611a75565b80356001600160a01b0381168114611aa057600080fd5b919050565b60008060408385031215611ab857600080fd5b611ac183611a89565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146105cb57600080fd5b600060208284031215611b0f57600080fd5b8135611b1a81611acf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b7657611b76611b21565b6040525050565b600067ffffffffffffffff831115611b9757611b97611b21565b604051611bae6020601f19601f8701160182611b50565b809150838152848484011115611bc357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611bed57600080fd5b813567ffffffffffffffff811115611c0457600080fd5b8201601f81018413611c1557600080fd5b611c2484823560208401611b7d565b949350505050565b6000815180845260005b81811015611c5257602081850181015186830182015201611c36565b81811115611c64576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611b1a6020830184611c2c565b600060208284031215611c9e57600080fd5b5035919050565b600067ffffffffffffffff821115611cbf57611cbf611b21565b5060051b60200190565b600082601f830112611cda57600080fd5b81356020611ce782611ca5565b604051611cf48282611b50565b83815260059390931b8501820192828101915086841115611d1457600080fd5b8286015b84811015611d2f5780358352918301918301611d18565b509695505050505050565b600082601f830112611d4b57600080fd5b611b1a83833560208501611b7d565b600080600080600060a08688031215611d7257600080fd5b611d7b86611a89565b9450611d8960208701611a89565b9350604086013567ffffffffffffffff80821115611da657600080fd5b611db289838a01611cc9565b94506060880135915080821115611dc857600080fd5b611dd489838a01611cc9565b93506080880135915080821115611dea57600080fd5b50611df788828901611d3a565b9150509295509295909350565b60008060408385031215611e1757600080fd5b823567ffffffffffffffff80821115611e2f57600080fd5b818501915085601f830112611e4357600080fd5b81356020611e5082611ca5565b604051611e5d8282611b50565b83815260059390931b8501820192828101915089841115611e7d57600080fd5b948201945b83861015611ea257611e9386611a89565b82529482019490820190611e82565b96505086013592505080821115611eb857600080fd5b50611ec585828601611cc9565b9150509250929050565b600081518084526020808501945080840160005b83811015611eff57815187529582019590820190600101611ee3565b509495945050505050565b602081526000611b1a6020830184611ecf565b60008060208385031215611f3057600080fd5b823567ffffffffffffffff80821115611f4857600080fd5b818501915085601f830112611f5c57600080fd5b813581811115611f6b57600080fd5b8660208260051b8501011115611f8057600080fd5b60209290920196919550909350505050565b60008060408385031215611fa557600080fd5b611fae83611a89565b915060208301358015158114611fc357600080fd5b809150509250929050565b60008060408385031215611fe157600080fd5b611fea83611a89565b9150611ff860208401611a89565b90509250929050565b60006020828403121561201357600080fd5b611b1a82611a89565b600080600080600060a0868803121561203457600080fd5b61203d86611a89565b945061204b60208701611a89565b93506040860135925060608601359150608086013567ffffffffffffffff81111561207557600080fd5b611df788828901611d3a565b600181811c9082168061209557607f821691505b6020821081036120ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612116576121166120d4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361217b5761217b6120d4565b5060010190565b6040815260006121956040830185611ecf565b82810360208401526121a78185611ecf565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526121dc60a0830186611ecf565b82810360608401526121ee8186611ecf565b905082810360808401526122028185611c2c565b98975050505050505050565b60006020828403121561222057600080fd5b8151611b1a81611acf565b600060033d11156122445760046000803e5060005160e01c5b90565b600060443d10156122555790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156122a357505050505090565b82850191508151818111156122bb5750505050505090565b843d87010160208285010111156122d55750505050505090565b6122e460208286010187611b50565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261232760a0830184611c2c565b97965050505050505056fea2646970667358221220dd9d940505adbb8150024463f9b71d00ebb224979e12fef50cb013b5ce6ce9b364736f6c634300080d0033697066733a2f2f516d53767659654339726739656238694c56326753754a583554365970594179476e6a7253384134786d75664a452f6d657461646174612e6a736f6e

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018c5760003560e01c80634e1273f4116100e357806397254e551161008c578063ed9ec88811610066578063ed9ec88814610394578063f242432a146103b4578063f2fde38b146103c757600080fd5b806397254e5514610332578063a22cb46514610345578063e985e9c51461035857600080fd5b80638377dfd4116100bd5780638377dfd4146102d25780638da5cb5b146102db57806395d89b41146102f657600080fd5b80634e1273f414610297578063715018a6146102b75780637cb64759146102bf57600080fd5b806318160ddd116101455780632eb4a7ab1161011f5780632eb4a7ab146102735780632f85423a1461027c578063484b973c1461028457600080fd5b806318160ddd1461024b57806319908016146102535780632eb2c2d61461026057600080fd5b806302fe53051161017657806302fe5305146101da57806306fdde03146101ef5780630e89341c1461023857600080fd5b8062fdd58e1461019157806301ffc9a7146101b7575b600080fd5b6101a461019f366004611aa5565b6103da565b6040519081526020015b60405180910390f35b6101ca6101c5366004611afd565b610483565b60405190151581526020016101ae565b6101ed6101e8366004611bdb565b610568565b005b61022b6040518060400160405280601281526020017f4b69636b7a20506173732047656e65736973000000000000000000000000000081525081565b6040516101ae9190611c79565b61022b610246366004611c8c565b6105ce565b6005546101a4565b6006546101ca9060ff1681565b6101ed61026e366004611d5a565b610662565b6101a460075481565b6101ed610704565b6101ed610292366004611aa5565b610790565b6102aa6102a5366004611e04565b610881565b6040516101ae9190611f0a565b6101ed6109bf565b6101ed6102cd366004611c8c565b610a25565b6101a460055481565b6003546040516001600160a01b0390911681526020016101ae565b61022b6040518060400160405280600381526020017f4b5047000000000000000000000000000000000000000000000000000000000081525081565b6101ed610340366004611f1d565b610a84565b6101ed610353366004611f92565b610d0c565b6101ca610366366004611fce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a46103a2366004612001565b60086020526000908152604090205481565b6101ed6103c236600461201c565b610d17565b6101ed6103d5366004612001565b610db2565b60006001600160a01b03831661045d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061051657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061056257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6003546001600160a01b031633146105c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6105cb81610e91565b50565b6060600280546105dd90612081565b80601f016020809104026020016040519081016040528092919081815260200182805461060990612081565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b50505050509050919050565b6001600160a01b03851633148061067e575061067e8533610366565b6106f05760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610454565b6106fd8585858585610ea4565b5050505050565b6003546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6003546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b60fa816005546107fa9190612103565b11156108485760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b806005600082825461085a9190612103565b9250508190555061087d8260018360405180602001604052806000815250611142565b5050565b606081518351146108fa5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610454565b6000835167ffffffffffffffff81111561091657610916611b21565b60405190808252806020026020018201604052801561093f578160200160208202803683370190505b50905060005b84518110156109b75761098a8582815181106109635761096361211b565b602002602001015185838151811061097d5761097d61211b565b60200260200101516103da565b82828151811061099c5761099c61211b565b60209081029190910101526109b08161214a565b9050610945565b509392505050565b6003546001600160a01b03163314610a195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b610a236000611272565b565b6003546001600160a01b03163314610a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600755565b600260045403610ad65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b600260045560055460fa11610b2d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b33600090815260086020526040902054600111610b8c5760405162461bcd60e51b815260206004820152600d60248201527f4174206d696e74206c696d6974000000000000000000000000000000000000006044820152606401610454565b610c14828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201529092506034019050604051602081830303815290604052805190602001206112dc565b610c605760405162461bcd60e51b815260206004820152600d60248201527f50726f6f6620696e76616c6964000000000000000000000000000000000000006044820152606401610454565b60065460ff16610cb25760405162461bcd60e51b815260206004820152600d60248201527f4d696e74206e6f74206f70656e000000000000000000000000000000000000006044820152606401610454565b336000908152600860205260408120805491610ccd8361214a565b909155505060058054906000610ce28361214a565b9190505550610d033360018060405180602001604052806000815250611142565b50506001600455565b61087d3383836112f2565b6001600160a01b038516331480610d335750610d338533610366565b610da55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610454565b6106fd8585858585611404565b6003546001600160a01b03163314610e0c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6001600160a01b038116610e885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610454565b6105cb81611272565b805161087d9060029060208401906119f0565b8151835114610f1b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b038416610f975760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b3360005b84518110156110d4576000858281518110610fb857610fb861211b565b602002602001015190506000858381518110610fd657610fd661211b565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561107c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110b9908490612103565b92505081905550505050806110cd9061214a565b9050610f9b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611124929190612182565b60405180910390a461113a8187878787876115da565b505050505050565b6001600160a01b0384166111be5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610454565b3360006111ca856117de565b905060006111d7856117de565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611209908490612103565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461126983600089898989611829565b50505050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826112e98584611984565b14949350505050565b816001600160a01b0316836001600160a01b0316036113795760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166114805760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b33600061148c856117de565b90506000611499856117de565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156115325760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061156f908490612103565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cf848a8a8a8a8a611829565b505050505050505050565b6001600160a01b0384163b1561113a576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c819061163790899089908890889088906004016121b0565b6020604051808303816000875af1925050508015611672575060408051601f3d908101601f1916820190925261166f9181019061220e565b60015b6117275761167e61222b565b806308c379a0036116b75750611692612247565b8061169d57506116b9565b8060405162461bcd60e51b81526004016104549190611c79565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610454565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106118185761181861211b565b602090810291909101015292915050565b6001600160a01b0384163b1561113a576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e619061188690899089908890889088906004016122ef565b6020604051808303816000875af19250505080156118c1575060408051601f3d908101601f191682019092526118be9181019061220e565b60015b6118cd5761167e61222b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b600081815b84518110156109b75760008582815181106119a6576119a661211b565b602002602001015190508083116119cc57600083815260208290526040902092506119dd565b600081815260208490526040902092505b50806119e88161214a565b915050611989565b8280546119fc90612081565b90600052602060002090601f016020900481019282611a1e5760008555611a64565b82601f10611a3757805160ff1916838001178555611a64565b82800160010185558215611a64579182015b82811115611a64578251825591602001919060010190611a49565b50611a70929150611a74565b5090565b5b80821115611a705760008155600101611a75565b80356001600160a01b0381168114611aa057600080fd5b919050565b60008060408385031215611ab857600080fd5b611ac183611a89565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146105cb57600080fd5b600060208284031215611b0f57600080fd5b8135611b1a81611acf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b7657611b76611b21565b6040525050565b600067ffffffffffffffff831115611b9757611b97611b21565b604051611bae6020601f19601f8701160182611b50565b809150838152848484011115611bc357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611bed57600080fd5b813567ffffffffffffffff811115611c0457600080fd5b8201601f81018413611c1557600080fd5b611c2484823560208401611b7d565b949350505050565b6000815180845260005b81811015611c5257602081850181015186830182015201611c36565b81811115611c64576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611b1a6020830184611c2c565b600060208284031215611c9e57600080fd5b5035919050565b600067ffffffffffffffff821115611cbf57611cbf611b21565b5060051b60200190565b600082601f830112611cda57600080fd5b81356020611ce782611ca5565b604051611cf48282611b50565b83815260059390931b8501820192828101915086841115611d1457600080fd5b8286015b84811015611d2f5780358352918301918301611d18565b509695505050505050565b600082601f830112611d4b57600080fd5b611b1a83833560208501611b7d565b600080600080600060a08688031215611d7257600080fd5b611d7b86611a89565b9450611d8960208701611a89565b9350604086013567ffffffffffffffff80821115611da657600080fd5b611db289838a01611cc9565b94506060880135915080821115611dc857600080fd5b611dd489838a01611cc9565b93506080880135915080821115611dea57600080fd5b50611df788828901611d3a565b9150509295509295909350565b60008060408385031215611e1757600080fd5b823567ffffffffffffffff80821115611e2f57600080fd5b818501915085601f830112611e4357600080fd5b81356020611e5082611ca5565b604051611e5d8282611b50565b83815260059390931b8501820192828101915089841115611e7d57600080fd5b948201945b83861015611ea257611e9386611a89565b82529482019490820190611e82565b96505086013592505080821115611eb857600080fd5b50611ec585828601611cc9565b9150509250929050565b600081518084526020808501945080840160005b83811015611eff57815187529582019590820190600101611ee3565b509495945050505050565b602081526000611b1a6020830184611ecf565b60008060208385031215611f3057600080fd5b823567ffffffffffffffff80821115611f4857600080fd5b818501915085601f830112611f5c57600080fd5b813581811115611f6b57600080fd5b8660208260051b8501011115611f8057600080fd5b60209290920196919550909350505050565b60008060408385031215611fa557600080fd5b611fae83611a89565b915060208301358015158114611fc357600080fd5b809150509250929050565b60008060408385031215611fe157600080fd5b611fea83611a89565b9150611ff860208401611a89565b90509250929050565b60006020828403121561201357600080fd5b611b1a82611a89565b600080600080600060a0868803121561203457600080fd5b61203d86611a89565b945061204b60208701611a89565b93506040860135925060608601359150608086013567ffffffffffffffff81111561207557600080fd5b611df788828901611d3a565b600181811c9082168061209557607f821691505b6020821081036120ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612116576121166120d4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361217b5761217b6120d4565b5060010190565b6040815260006121956040830185611ecf565b82810360208401526121a78185611ecf565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526121dc60a0830186611ecf565b82810360608401526121ee8186611ecf565b905082810360808401526122028185611c2c565b98975050505050505050565b60006020828403121561222057600080fd5b8151611b1a81611acf565b600060033d11156122445760046000803e5060005160e01c5b90565b600060443d10156122555790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156122a357505050505090565b82850191508151818111156122bb5750505050505090565b843d87010160208285010111156122d55750505050505090565b6122e460208286010187611b50565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261232760a0830184611c2c565b97965050505050505056fea2646970667358221220dd9d940505adbb8150024463f9b71d00ebb224979e12fef50cb013b5ce6ce9b364736f6c634300080d0033

Deployed Bytecode Sourcemap

45288:1619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29836:230;;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;29836:230:0;;;;;;;;28859:310;;;;;;:::i;:::-;;:::i;:::-;;;1253:14:1;;1246:22;1228:41;;1216:2;1201:18;28859:310:0;1088:187:1;46735:79:0;;;;;;:::i;:::-;;:::i;:::-;;45362:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29580:105::-;;;;;;:::i;:::-;;:::i;46820:84::-;46889:9;;46820:84;;45578:30;;;;;;;;;31774:442;;;;;;:::i;:::-;;:::i;45649:94::-;;;;;;46348:78;;;:::i;46537:192::-;;;;;;:::i;:::-;;:::i;30232:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8679:103::-;;;:::i;46432:99::-;;;;;;:::i;:::-;;:::i;45544:25::-;;;;;;8028:87;8101:6;;8028:87;;-1:-1:-1;;;;;8101:6:0;;;8240:74:1;;8228:2;8213:18;8028:87:0;8094:226:1;45417:37:0;;;;;;;;;;;;;;;;;;;;;45901:439;;;;;;:::i;:::-;;:::i;30829:155::-;;;;;;:::i;:::-;;:::i;31056:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31179:27:0;;;31155:4;31179:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;31056:168;45750:41;;;;;;:::i;:::-;;;;;;;;;;;;;;31296:401;;;;;;:::i;:::-;;:::i;8937:201::-;;;;;;:::i;:::-;;:::i;29836:230::-;29922:7;-1:-1:-1;;;;;29950:21:0;;29942:76;;;;-1:-1:-1;;;29942:76:0;;10566:2:1;29942:76:0;;;10548:21:1;10605:2;10585:18;;;10578:30;10644:34;10624:18;;;10617:62;10715:12;10695:18;;;10688:40;10745:19;;29942:76:0;;;;;;;;;-1:-1:-1;30036:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;30036:22:0;;;;;;;;;;;;29836:230::o;28859:310::-;28961:4;28998:41;;;29013:26;28998:41;;:110;;-1:-1:-1;29056:52:0;;;29071:37;29056:52;28998:110;:163;;;-1:-1:-1;20064:25:0;20049:40;;;;29125:36;28978:183;28859:310;-1:-1:-1;;28859:310:0:o;46735:79::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;46796:12:::1;46804:3;46796:7;:12::i;:::-;46735:79:::0;:::o;29580:105::-;29640:13;29673:4;29666:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29580:105;;;:::o;31774:442::-;-1:-1:-1;;;;;32007:20:0;;6779:10;32007:20;;:60;;-1:-1:-1;32031:36:0;32048:4;6779:10;31056:168;:::i;32031:36::-;31985:160;;;;-1:-1:-1;;;31985:160:0;;11780:2:1;31985:160:0;;;11762:21:1;11819:2;11799:18;;;11792:30;11858:34;11838:18;;;11831:62;11929:20;11909:18;;;11902:48;11967:19;;31985:160:0;11578:414:1;31985:160:0;32156:52;32179:4;32185:2;32189:3;32194:7;32203:4;32156:22;:52::i;:::-;31774:442;;;;;:::o;46348:78::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;46410:10:::1;::::0;;46396:24;;::::1;46410:10;::::0;;::::1;46409:11;46396:24;::::0;;46348:78::o;46537:192::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;45496:3:::1;46627:6;46615:9;;:18;;;;:::i;:::-;:32;;46607:53;;;::::0;-1:-1:-1;;;46607:53:0;;12521:2:1;46607:53:0::1;::::0;::::1;12503:21:1::0;12560:1;12540:18;;;12533:29;12598:10;12578:18;;;12571:38;12626:18;;46607:53:0::1;12319:331:1::0;46607:53:0::1;46680:6;46667:9;;:19;;;;;;;:::i;:::-;;;;;;;;46693:30;46699:2;45536:1;46712:6;46693:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;46537:192:::0;;:::o;30232:524::-;30388:16;30449:3;:10;30430:8;:15;:29;30422:83;;;;-1:-1:-1;;;30422:83:0;;12857:2:1;30422:83:0;;;12839:21:1;12896:2;12876:18;;;12869:30;12935:34;12915:18;;;12908:62;13006:11;12986:18;;;12979:39;13035:19;;30422:83:0;12655:405:1;30422:83:0;30518:30;30565:8;:15;30551:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30551:30:0;;30518:63;;30599:9;30594:122;30618:8;:15;30614:1;:19;30594:122;;;30674:30;30684:8;30693:1;30684:11;;;;;;;;:::i;:::-;;;;;;;30697:3;30701:1;30697:6;;;;;;;;:::i;:::-;;;;;;;30674:9;:30::i;:::-;30655:13;30669:1;30655:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;30635:3;;;:::i;:::-;;;30594:122;;;-1:-1:-1;30735:13:0;30232:524;-1:-1:-1;;;30232:524:0:o;8679:103::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;8744:30:::1;8771:1;8744:18;:30::i;:::-;8679:103::o:0;46432:99::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;46501:10:::1;:24:::0;46432:99::o;45901:439::-;5020:1;5618:7;;:19;5610:63;;;;-1:-1:-1;;;5610:63:0;;13656:2:1;5610:63:0;;;13638:21:1;13695:2;13675:18;;;13668:30;13734:33;13714:18;;;13707:61;13785:18;;5610:63:0;13454:355:1;5610:63:0;5020:1;5751:7;:18;45992:9:::1;::::0;45496:3:::1;-1:-1:-1::0;45984:43:0::1;;;::::0;-1:-1:-1;;;45984:43:0;;12521:2:1;45984:43:0::1;::::0;::::1;12503:21:1::0;12560:1;12540:18;;;12533:29;12598:10;12578:18;;;12571:38;12626:18;;45984:43:0::1;12319:331:1::0;45984:43:0::1;46052:10;46042:21;::::0;;;:9:::1;:21;::::0;;;;;46066:1:::1;-1:-1:-1::0;46034:51:0::1;;;::::0;-1:-1:-1;;;46034:51:0;;14016:2:1;46034:51:0::1;::::0;::::1;13998:21:1::0;14055:2;14035:18;;;14028:30;14094:15;14074:18;;;14067:43;14127:18;;46034:51:0::1;13814:337:1::0;46034:51:0::1;46100:83;46119:11;;46100:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;46132:10:0::1;::::0;46153:28:::1;::::0;14318:66:1;46170:10:0::1;14305:2:1::0;14301:15;14297:88;46153:28:0::1;::::0;::::1;14285:101:1::0;46132:10:0;;-1:-1:-1;14402:12:1;;;-1:-1:-1;46153:28:0::1;;;;;;;;;;;;46143:39;;;;;;46100:18;:83::i;:::-;46092:109;;;::::0;-1:-1:-1;;;46092:109:0;;14627:2:1;46092:109:0::1;::::0;::::1;14609:21:1::0;14666:2;14646:18;;;14639:30;14705:15;14685:18;;;14678:43;14738:18;;46092:109:0::1;14425:337:1::0;46092:109:0::1;46216:10;::::0;::::1;;46208:36;;;::::0;-1:-1:-1;;;46208:36:0;;14969:2:1;46208:36:0::1;::::0;::::1;14951:21:1::0;15008:2;14988:18;;;14981:30;15047:15;15027:18;;;15020:43;15080:18;;46208:36:0::1;14767:337:1::0;46208:36:0::1;46263:10;46253:21;::::0;;;:9:::1;:21;::::0;;;;:23;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;46283:9:0::1;:11:::0;;;:9:::1;:11;::::0;::::1;:::i;:::-;;;;;;46301:33;46307:10;45536:1;46328::::0;46301:33:::1;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;-1:-1:-1::0;;4976:1:0;5930:7;:22;45901:439::o;30829:155::-;30924:52;6779:10;30957:8;30967;30924:18;:52::i;31296:401::-;-1:-1:-1;;;;;31504:20:0;;6779:10;31504:20;;:60;;-1:-1:-1;31528:36:0;31545:4;6779:10;31056:168;:::i;31528:36::-;31482:151;;;;-1:-1:-1;;;31482:151:0;;15311:2:1;31482:151:0;;;15293:21:1;15350:2;15330:18;;;15323:30;15389:34;15369:18;;;15362:62;15460:11;15440:18;;;15433:39;15489:19;;31482:151:0;15109:405:1;31482:151:0;31644:45;31662:4;31668:2;31672;31676:6;31684:4;31644:17;:45::i;8937:201::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;-1:-1:-1;;;;;9026:22:0;::::1;9018:73;;;::::0;-1:-1:-1;;;9018:73:0;;15721:2:1;9018:73:0::1;::::0;::::1;15703:21:1::0;15760:2;15740:18;;;15733:30;15799:34;15779:18;;;15772:62;15870:8;15850:18;;;15843:36;15896:19;;9018:73:0::1;15519:402:1::0;9018:73:0::1;9102:28;9121:8;9102:18;:28::i;36002:88::-:0;36069:13;;;;:4;;:13;;;;;:::i;34012:1146::-;34239:7;:14;34225:3;:10;:28;34217:81;;;;-1:-1:-1;;;34217:81:0;;16128:2:1;34217:81:0;;;16110:21:1;16167:2;16147:18;;;16140:30;16206:34;16186:18;;;16179:62;16277:10;16257:18;;;16250:38;16305:19;;34217:81:0;15926:404:1;34217:81:0;-1:-1:-1;;;;;34317:16:0;;34309:66;;;;-1:-1:-1;;;34309:66:0;;16537:2:1;34309:66:0;;;16519:21:1;16576:2;16556:18;;;16549:30;16615:34;16595:18;;;16588:62;16686:7;16666:18;;;16659:35;16711:19;;34309:66:0;16335:401:1;34309:66:0;6779:10;34388:16;34505:421;34529:3;:10;34525:1;:14;34505:421;;;34561:10;34574:3;34578:1;34574:6;;;;;;;;:::i;:::-;;;;;;;34561:19;;34595:14;34612:7;34620:1;34612:10;;;;;;;;:::i;:::-;;;;;;;;;;;;34639:19;34661:13;;;;;;;;;;-1:-1:-1;;;;;34661:19:0;;;;;;;;;;;;34612:10;;-1:-1:-1;34703:21:0;;;;34695:76;;;;-1:-1:-1;;;34695:76:0;;16943:2:1;34695:76:0;;;16925:21:1;16982:2;16962:18;;;16955:30;17021:34;17001:18;;;16994:62;17092:12;17072:18;;;17065:40;17122:19;;34695:76:0;16741:406:1;34695:76:0;34815:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34815:19:0;;;;;;;;;;34837:20;;;34815:42;;34887:17;;;;;;;:27;;34837:20;;34815:9;34887:27;;34837:20;;34887:27;:::i;:::-;;;;;;;;34546:380;;;34541:3;;;;:::i;:::-;;;34505:421;;;;34973:2;-1:-1:-1;;;;;34943:47:0;34967:4;-1:-1:-1;;;;;34943:47:0;34957:8;-1:-1:-1;;;;;34943:47:0;;34977:3;34982:7;34943:47;;;;;;;:::i;:::-;;;;;;;;35075:75;35111:8;35121:4;35127:2;35131:3;35136:7;35145:4;35075:35;:75::i;:::-;34206:952;34012:1146;;;;;:::o;36476:729::-;-1:-1:-1;;;;;36629:16:0;;36621:62;;;;-1:-1:-1;;;36621:62:0;;17824:2:1;36621:62:0;;;17806:21:1;17863:2;17843:18;;;17836:30;17902:34;17882:18;;;17875:62;17973:3;17953:18;;;17946:31;17994:19;;36621:62:0;17622:397:1;36621:62:0;6779:10;36696:16;36761:21;36779:2;36761:17;:21::i;:::-;36738:44;;36793:24;36820:25;36838:6;36820:17;:25::i;:::-;36793:52;;36937:9;:13;;;;;;;;;;;-1:-1:-1;;;;;36937:17:0;;;;;;;;;:27;;36958:6;;36937:9;:27;;36958:6;;36937:27;:::i;:::-;;;;-1:-1:-1;;36980:52:0;;;18198:25:1;;;18254:2;18239:18;;18232:34;;;-1:-1:-1;;;;;36980:52:0;;;;37013:1;;36980:52;;;;;;18171:18:1;36980:52:0;;;;;;;37123:74;37154:8;37172:1;37176:2;37180;37184:6;37192:4;37123:30;:74::i;:::-;36610:595;;;36476:729;;;;:::o;9298:191::-;9391:6;;;-1:-1:-1;;;;;9408:17:0;;;;;;;;;;;9441:40;;9391:6;;;9408:17;9391:6;;9441:40;;9372:16;;9441:40;9361:128;9298:191;:::o;1690:190::-;1815:4;1868;1839:25;1852:5;1859:4;1839:12;:25::i;:::-;:33;;1690:190;-1:-1:-1;;;;1690:190:0:o;40746:331::-;40901:8;-1:-1:-1;;;;;40892:17:0;:5;-1:-1:-1;;;;;40892:17:0;;40884:71;;;;-1:-1:-1;;;40884:71:0;;18479:2:1;40884:71:0;;;18461:21:1;18518:2;18498:18;;;18491:30;18557:34;18537:18;;;18530:62;18628:11;18608:18;;;18601:39;18657:19;;40884:71:0;18277:405:1;40884:71:0;-1:-1:-1;;;;;40966:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;41028:41;;1228::1;;;41028::0;;1201:18:1;41028:41:0;;;;;;;40746:331;;;:::o;32680:974::-;-1:-1:-1;;;;;32868:16:0;;32860:66;;;;-1:-1:-1;;;32860:66:0;;16537:2:1;32860:66:0;;;16519:21:1;16576:2;16556:18;;;16549:30;16615:34;16595:18;;;16588:62;16686:7;16666:18;;;16659:35;16711:19;;32860:66:0;16335:401:1;32860:66:0;6779:10;32939:16;33004:21;33022:2;33004:17;:21::i;:::-;32981:44;;33036:24;33063:25;33081:6;33063:17;:25::i;:::-;33036:52;;33174:19;33196:13;;;;;;;;;;;-1:-1:-1;;;;;33196:19:0;;;;;;;;;;33234:21;;;;33226:76;;;;-1:-1:-1;;;33226:76:0;;16943:2:1;33226:76:0;;;16925:21:1;16982:2;16962:18;;;16955:30;17021:34;17001:18;;;16994:62;17092:12;17072:18;;;17065:40;17122:19;;33226:76:0;16741:406:1;33226:76:0;33338:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33338:19:0;;;;;;;;;;33360:20;;;33338:42;;33402:17;;;;;;;:27;;33360:20;;33338:9;33402:27;;33360:20;;33402:27;:::i;:::-;;;;-1:-1:-1;;33447:46:0;;;18198:25:1;;;18254:2;18239:18;;18232:34;;;-1:-1:-1;;;;;33447:46:0;;;;;;;;;;;;;;18171:18:1;33447:46:0;;;;;;;33578:68;33609:8;33619:4;33625:2;33629;33633:6;33641:4;33578:30;:68::i;:::-;32849:805;;;;32680:974;;;;;:::o;44189:813::-;-1:-1:-1;;;;;44429:13:0;;11077:19;:23;44425:570;;44465:79;;;;;-1:-1:-1;;;;;44465:43:0;;;;;:79;;44509:8;;44519:4;;44525:3;;44530:7;;44539:4;;44465:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44465:79:0;;;;;;;;-1:-1:-1;;44465:79:0;;;;;;;;;;;;:::i;:::-;;;44461:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;44857:6;44850:14;;-1:-1:-1;;;44850:14:0;;;;;;;;:::i;44461:523::-;;;44906:62;;-1:-1:-1;;;44906:62:0;;20918:2:1;44906:62:0;;;20900:21:1;20957:2;20937:18;;;20930:30;20996:34;20976:18;;;20969:62;21067:22;21047:18;;;21040:50;21107:19;;44906:62:0;20716:416:1;44461:523:0;44626:60;;;44638:48;44626:60;44622:159;;44711:50;;-1:-1:-1;;;44711:50:0;;21339:2:1;44711:50:0;;;21321:21:1;21378:2;21358:18;;;21351:30;21417:34;21397:18;;;21390:62;21488:10;21468:18;;;21461:38;21516:19;;44711:50:0;21137:404:1;45010:198:0;45130:16;;;45144:1;45130:16;;;;;;;;;45076;;45105:22;;45130:16;;;;;;;;;;;;-1:-1:-1;45130:16:0;45105:41;;45168:7;45157:5;45163:1;45157:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;45195:5;45010:198;-1:-1:-1;;45010:198:0:o;43437:744::-;-1:-1:-1;;;;;43652:13:0;;11077:19;:23;43648:526;;43688:72;;;;;-1:-1:-1;;;;;43688:38:0;;;;;:72;;43727:8;;43737:4;;43743:2;;43747:6;;43755:4;;43688:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43688:72:0;;;;;;;;-1:-1:-1;;43688:72:0;;;;;;;;;;;;:::i;:::-;;;43684:479;;;;:::i;:::-;43810:55;;;43822:43;43810:55;43806:154;;43890:50;;-1:-1:-1;;;43890:50:0;;21339:2:1;43890:50:0;;;21321:21:1;21378:2;21358:18;;;21351:30;21417:34;21397:18;;;21390:62;21488:10;21468:18;;;21461:38;21516:19;;43890:50:0;21137:404:1;2241:675:0;2324:7;2367:4;2324:7;2382:497;2406:5;:12;2402:1;:16;2382:497;;;2440:20;2463:5;2469:1;2463:8;;;;;;;;:::i;:::-;;;;;;;2440:31;;2506:12;2490;:28;2486:382;;2992:13;3042:15;;;3078:4;3071:15;;;3125:4;3109:21;;2618:57;;2486:382;;;2992:13;3042:15;;;3078:4;3071:15;;;3125:4;3109:21;;2795:57;;2486:382;-1:-1:-1;2420:3:0;;;;:::i;:::-;;;;2382:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:177::-;741:66;734:5;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;:::-;1072:5;838:245;-1:-1:-1;;;838:245:1:o;1280:184::-;1332:77;1329:1;1322:88;1429:4;1426:1;1419:15;1453:4;1450:1;1443:15;1469:308;-1:-1:-1;;1570:2:1;1564:4;1560:13;1556:86;1548:6;1544:99;1709:6;1697:10;1694:22;1673:18;1661:10;1658:34;1655:62;1652:88;;;1720:18;;:::i;:::-;1756:2;1749:22;-1:-1:-1;;1469:308:1:o;1782:528::-;1847:5;1881:18;1873:6;1870:30;1867:56;;;1903:18;;:::i;:::-;1952:2;1946:9;1964:128;2086:4;-1:-1:-1;;2012:2:1;2004:6;2000:15;1996:88;1992:99;1984:6;1964:128;:::i;:::-;2110:6;2101:15;;2140:6;2132;2125:22;2180:3;2171:6;2166:3;2162:16;2159:25;2156:45;;;2197:1;2194;2187:12;2156:45;2247:6;2242:3;2235:4;2227:6;2223:17;2210:44;2302:1;2295:4;2286:6;2278;2274:19;2270:30;2263:41;;1782:528;;;;;:::o;2315:451::-;2384:6;2437:2;2425:9;2416:7;2412:23;2408:32;2405:52;;;2453:1;2450;2443:12;2405:52;2493:9;2480:23;2526:18;2518:6;2515:30;2512:50;;;2558:1;2555;2548:12;2512:50;2581:22;;2634:4;2626:13;;2622:27;-1:-1:-1;2612:55:1;;2663:1;2660;2653:12;2612:55;2686:74;2752:7;2747:2;2734:16;2729:2;2725;2721:11;2686:74;:::i;:::-;2676:84;2315:451;-1:-1:-1;;;;2315:451:1:o;2771:531::-;2813:3;2851:5;2845:12;2878:6;2873:3;2866:19;2903:1;2913:162;2927:6;2924:1;2921:13;2913:162;;;2989:4;3045:13;;;3041:22;;3035:29;3017:11;;;3013:20;;3006:59;2942:12;2913:162;;;3093:6;3090:1;3087:13;3084:87;;;3159:1;3152:4;3143:6;3138:3;3134:16;3130:27;3123:38;3084:87;-1:-1:-1;3216:2:1;3204:15;-1:-1:-1;;3200:88:1;3191:98;;;;3291:4;3187:109;;2771:531;-1:-1:-1;;2771:531:1:o;3307:220::-;3456:2;3445:9;3438:21;3419:4;3476:45;3517:2;3506:9;3502:18;3494:6;3476:45;:::i;3532:180::-;3591:6;3644:2;3632:9;3623:7;3619:23;3615:32;3612:52;;;3660:1;3657;3650:12;3612:52;-1:-1:-1;3683:23:1;;3532:180;-1:-1:-1;3532:180:1:o;3717:183::-;3777:4;3810:18;3802:6;3799:30;3796:56;;;3832:18;;:::i;:::-;-1:-1:-1;3877:1:1;3873:14;3889:4;3869:25;;3717:183::o;3905:724::-;3959:5;4012:3;4005:4;3997:6;3993:17;3989:27;3979:55;;4030:1;4027;4020:12;3979:55;4066:6;4053:20;4092:4;4115:43;4155:2;4115:43;:::i;:::-;4187:2;4181:9;4199:31;4227:2;4219:6;4199:31;:::i;:::-;4265:18;;;4357:1;4353:10;;;;4341:23;;4337:32;;;4299:15;;;;-1:-1:-1;4381:15:1;;;4378:35;;;4409:1;4406;4399:12;4378:35;4445:2;4437:6;4433:15;4457:142;4473:6;4468:3;4465:15;4457:142;;;4539:17;;4527:30;;4577:12;;;;4490;;4457:142;;;-1:-1:-1;4617:6:1;3905:724;-1:-1:-1;;;;;;3905:724:1:o;4634:221::-;4676:5;4729:3;4722:4;4714:6;4710:17;4706:27;4696:55;;4747:1;4744;4737:12;4696:55;4769:80;4845:3;4836:6;4823:20;4816:4;4808:6;4804:17;4769:80;:::i;4860:943::-;5014:6;5022;5030;5038;5046;5099:3;5087:9;5078:7;5074:23;5070:33;5067:53;;;5116:1;5113;5106:12;5067:53;5139:29;5158:9;5139:29;:::i;:::-;5129:39;;5187:38;5221:2;5210:9;5206:18;5187:38;:::i;:::-;5177:48;;5276:2;5265:9;5261:18;5248:32;5299:18;5340:2;5332:6;5329:14;5326:34;;;5356:1;5353;5346:12;5326:34;5379:61;5432:7;5423:6;5412:9;5408:22;5379:61;:::i;:::-;5369:71;;5493:2;5482:9;5478:18;5465:32;5449:48;;5522:2;5512:8;5509:16;5506:36;;;5538:1;5535;5528:12;5506:36;5561:63;5616:7;5605:8;5594:9;5590:24;5561:63;:::i;:::-;5551:73;;5677:3;5666:9;5662:19;5649:33;5633:49;;5707:2;5697:8;5694:16;5691:36;;;5723:1;5720;5713:12;5691:36;;5746:51;5789:7;5778:8;5767:9;5763:24;5746:51;:::i;:::-;5736:61;;;4860:943;;;;;;;;:::o;5990:1208::-;6108:6;6116;6169:2;6157:9;6148:7;6144:23;6140:32;6137:52;;;6185:1;6182;6175:12;6137:52;6225:9;6212:23;6254:18;6295:2;6287:6;6284:14;6281:34;;;6311:1;6308;6301:12;6281:34;6349:6;6338:9;6334:22;6324:32;;6394:7;6387:4;6383:2;6379:13;6375:27;6365:55;;6416:1;6413;6406:12;6365:55;6452:2;6439:16;6474:4;6497:43;6537:2;6497:43;:::i;:::-;6569:2;6563:9;6581:31;6609:2;6601:6;6581:31;:::i;:::-;6647:18;;;6735:1;6731:10;;;;6723:19;;6719:28;;;6681:15;;;;-1:-1:-1;6759:19:1;;;6756:39;;;6791:1;6788;6781:12;6756:39;6815:11;;;;6835:148;6851:6;6846:3;6843:15;6835:148;;;6917:23;6936:3;6917:23;:::i;:::-;6905:36;;6868:12;;;;6961;;;;6835:148;;;7002:6;-1:-1:-1;;7046:18:1;;7033:32;;-1:-1:-1;;7077:16:1;;;7074:36;;;7106:1;7103;7096:12;7074:36;;7129:63;7184:7;7173:8;7162:9;7158:24;7129:63;:::i;:::-;7119:73;;;5990:1208;;;;;:::o;7203:435::-;7256:3;7294:5;7288:12;7321:6;7316:3;7309:19;7347:4;7376:2;7371:3;7367:12;7360:19;;7413:2;7406:5;7402:14;7434:1;7444:169;7458:6;7455:1;7452:13;7444:169;;;7519:13;;7507:26;;7553:12;;;;7588:15;;;;7480:1;7473:9;7444:169;;;-1:-1:-1;7629:3:1;;7203:435;-1:-1:-1;;;;;7203:435:1:o;7643:261::-;7822:2;7811:9;7804:21;7785:4;7842:56;7894:2;7883:9;7879:18;7871:6;7842:56;:::i;8325:615::-;8411:6;8419;8472:2;8460:9;8451:7;8447:23;8443:32;8440:52;;;8488:1;8485;8478:12;8440:52;8528:9;8515:23;8557:18;8598:2;8590:6;8587:14;8584:34;;;8614:1;8611;8604:12;8584:34;8652:6;8641:9;8637:22;8627:32;;8697:7;8690:4;8686:2;8682:13;8678:27;8668:55;;8719:1;8716;8709:12;8668:55;8759:2;8746:16;8785:2;8777:6;8774:14;8771:34;;;8801:1;8798;8791:12;8771:34;8854:7;8849:2;8839:6;8836:1;8832:14;8828:2;8824:23;8820:32;8817:45;8814:65;;;8875:1;8872;8865:12;8814:65;8906:2;8898:11;;;;;8928:6;;-1:-1:-1;8325:615:1;;-1:-1:-1;;;;8325:615:1:o;8945:347::-;9010:6;9018;9071:2;9059:9;9050:7;9046:23;9042:32;9039:52;;;9087:1;9084;9077:12;9039:52;9110:29;9129:9;9110:29;:::i;:::-;9100:39;;9189:2;9178:9;9174:18;9161:32;9236:5;9229:13;9222:21;9215:5;9212:32;9202:60;;9258:1;9255;9248:12;9202:60;9281:5;9271:15;;;8945:347;;;;;:::o;9297:260::-;9365:6;9373;9426:2;9414:9;9405:7;9401:23;9397:32;9394:52;;;9442:1;9439;9432:12;9394:52;9465:29;9484:9;9465:29;:::i;:::-;9455:39;;9513:38;9547:2;9536:9;9532:18;9513:38;:::i;:::-;9503:48;;9297:260;;;;;:::o;9562:186::-;9621:6;9674:2;9662:9;9653:7;9649:23;9645:32;9642:52;;;9690:1;9687;9680:12;9642:52;9713:29;9732:9;9713:29;:::i;9753:606::-;9857:6;9865;9873;9881;9889;9942:3;9930:9;9921:7;9917:23;9913:33;9910:53;;;9959:1;9956;9949:12;9910:53;9982:29;10001:9;9982:29;:::i;:::-;9972:39;;10030:38;10064:2;10053:9;10049:18;10030:38;:::i;:::-;10020:48;;10115:2;10104:9;10100:18;10087:32;10077:42;;10166:2;10155:9;10151:18;10138:32;10128:42;;10221:3;10210:9;10206:19;10193:33;10249:18;10241:6;10238:30;10235:50;;;10281:1;10278;10271:12;10235:50;10304:49;10345:7;10336:6;10325:9;10321:22;10304:49;:::i;11136:437::-;11215:1;11211:12;;;;11258;;;11279:61;;11333:4;11325:6;11321:17;11311:27;;11279:61;11386:2;11378:6;11375:14;11355:18;11352:38;11349:218;;11423:77;11420:1;11413:88;11524:4;11521:1;11514:15;11552:4;11549:1;11542:15;11349:218;;11136:437;;;:::o;11997:184::-;12049:77;12046:1;12039:88;12146:4;12143:1;12136:15;12170:4;12167:1;12160:15;12186:128;12226:3;12257:1;12253:6;12250:1;12247:13;12244:39;;;12263:18;;:::i;:::-;-1:-1:-1;12299:9:1;;12186:128::o;13065:184::-;13117:77;13114:1;13107:88;13214:4;13211:1;13204:15;13238:4;13235:1;13228:15;13254:195;13293:3;13324:66;13317:5;13314:77;13311:103;;13394:18;;:::i;:::-;-1:-1:-1;13441:1:1;13430:13;;13254:195::o;17152:465::-;17409:2;17398:9;17391:21;17372:4;17435:56;17487:2;17476:9;17472:18;17464:6;17435:56;:::i;:::-;17539:9;17531:6;17527:22;17522:2;17511:9;17507:18;17500:50;17567:44;17604:6;17596;17567:44;:::i;:::-;17559:52;17152:465;-1:-1:-1;;;;;17152:465:1:o;18687:850::-;19009:4;-1:-1:-1;;;;;19119:2:1;19111:6;19107:15;19096:9;19089:34;19171:2;19163:6;19159:15;19154:2;19143:9;19139:18;19132:43;;19211:3;19206:2;19195:9;19191:18;19184:31;19238:57;19290:3;19279:9;19275:19;19267:6;19238:57;:::i;:::-;19343:9;19335:6;19331:22;19326:2;19315:9;19311:18;19304:50;19377:44;19414:6;19406;19377:44;:::i;:::-;19363:58;;19470:9;19462:6;19458:22;19452:3;19441:9;19437:19;19430:51;19498:33;19524:6;19516;19498:33;:::i;:::-;19490:41;18687:850;-1:-1:-1;;;;;;;;18687:850:1:o;19542:249::-;19611:6;19664:2;19652:9;19643:7;19639:23;19635:32;19632:52;;;19680:1;19677;19670:12;19632:52;19712:9;19706:16;19731:30;19755:5;19731:30;:::i;19796:179::-;19831:3;19873:1;19855:16;19852:23;19849:120;;;19919:1;19916;19913;19898:23;-1:-1:-1;19956:1:1;19950:8;19945:3;19941:18;19849:120;19796:179;:::o;19980:731::-;20019:3;20061:4;20043:16;20040:26;20037:39;;;19980:731;:::o;20037:39::-;20103:2;20097:9;20125:66;20246:2;20228:16;20224:25;20221:1;20215:4;20200:50;20279:4;20273:11;20303:16;20338:18;20409:2;20402:4;20394:6;20390:17;20387:25;20382:2;20374:6;20371:14;20368:45;20365:58;;;20416:5;;;;;19980:731;:::o;20365:58::-;20453:6;20447:4;20443:17;20432:28;;20489:3;20483:10;20516:2;20508:6;20505:14;20502:27;;;20522:5;;;;;;19980:731;:::o;20502:27::-;20606:2;20587:16;20581:4;20577:27;20573:36;20566:4;20557:6;20552:3;20548:16;20544:27;20541:69;20538:82;;;20613:5;;;;;;19980:731;:::o;20538:82::-;20629:57;20680:4;20671:6;20663;20659:19;20655:30;20649:4;20629:57;:::i;:::-;-1:-1:-1;20702:3:1;;19980:731;-1:-1:-1;;;;;19980:731:1:o;21546:584::-;21768:4;-1:-1:-1;;;;;21878:2:1;21870:6;21866:15;21855:9;21848:34;21930:2;21922:6;21918:15;21913:2;21902:9;21898:18;21891:43;;21970:6;21965:2;21954:9;21950:18;21943:34;22013:6;22008:2;21997:9;21993:18;21986:34;22057:3;22051;22040:9;22036:19;22029:32;22078:46;22119:3;22108:9;22104:19;22096:6;22078:46;:::i;:::-;22070:54;21546:584;-1:-1:-1;;;;;;;21546:584:1:o

Swarm Source

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